
Backup Retention Policy
- 62 installs
- Updated January 1, 1970
- dengineproblem/agents-monorepo
Defines and enforces a backup retention policy so a solo builder can schedule backups, set how long they are kept, and prune old ones automatically to control storage and meet recovery needs.
About
A skill for setting up a backup retention policy that governs how often backups run, how long each is retained, and when old ones are pruned. A solo builder reaches for it to keep a production system recoverable while controlling storage costs, encoding retention rules instead of managing backups ad hoc.
- Backup scheduling and retention
- Automated pruning of old backups
- Recovery and storage policy
Backup Retention Policy by the numbers
- 62 all-time installs (skills.sh)
- Ranked #646 of 1,435 DevOps & CI/CD skills by installs in the Skillselion catalog
- Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/dengineproblem/agents-monorepo --skill backup-retention-policyAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 62 |
|---|---|
| Last updated | January 1, 1970 |
| Repository | dengineproblem/agents-monorepo ↗ |
What it does
Defines and enforces a backup retention policy so a solo builder can schedule backups, set how long they are kept, and prune old ones automatically to control storage and meet recovery needs.
Who is it for?
Operators keeping production systems recoverable
When should I use this skill?
You need to define backup retention and pruning rules
Files
Backup Retention Policy Expert
Эксперт по управлению жизненным циклом данных и восстановления после сбоев.
Правило 3-2-1-1-0
- 3 копии важных данных (1 основная + 2 резервные)
- 2 различных типа носителей
- 1 внешняя/облачная резервная копия
- 1 автономная/неизменяемая резервная копия
- 0 ошибок после тестирования
Уровни хранения
| Уровень | Доступ | Период | Стоимость |
|---|---|---|---|
| Горячий | Частый | 0-30 дней | $$$ |
| Теплый | Периодический | 30-90 дней | $$ |
| Холодный | Редкий | 90 дней-7 лет | $ |
| Архив | Долгосрочный | 7+ лет | ¢ |
AWS S3 Lifecycle Policy
{
"Rules": [
{
"ID": "BackupLifecycle",
"Status": "Enabled",
"Filter": {
"Prefix": "backups/"
},
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER"
},
{
"Days": 365,
"StorageClass": "DEEP_ARCHIVE"
}
],
"Expiration": {
"Days": 2555
},
"NoncurrentVersionTransitions": [
{
"NoncurrentDays": 30,
"StorageClass": "GLACIER"
}
],
"NoncurrentVersionExpiration": {
"NoncurrentDays": 365
}
}
]
}Azure Blob Lifecycle
{
"rules": [
{
"name": "backupRetention",
"type": "Lifecycle",
"definition": {
"actions": {
"baseBlob": {
"tierToCool": {"daysAfterModificationGreaterThan": 30},
"tierToArchive": {"daysAfterModificationGreaterThan": 90},
"delete": {"daysAfterModificationGreaterThan": 2555}
},
"snapshot": {
"delete": {"daysAfterCreationGreaterThan": 90}
}
},
"filters": {
"blobTypes": ["blockBlob"],
"prefixMatch": ["backups/"]
}
}
}
]
}Скрипт ротации бэкапов
#!/bin/bash
BACKUP_DIR="/var/backups"
DAILY_RETENTION=7
WEEKLY_RETENTION=4
MONTHLY_RETENTION=12
# Удаление ежедневных старше 7 дней
find "$BACKUP_DIR/daily" -type f -mtime +$DAILY_RETENTION -delete
# Удаление еженедельных старше 4 недель
find "$BACKUP_DIR/weekly" -type f -mtime +$((WEEKLY_RETENTION * 7)) -delete
# Удаление ежемесячных старше 12 месяцев
find "$BACKUP_DIR/monthly" -type f -mtime +$((MONTHLY_RETENTION * 30)) -delete
# Логирование
echo "$(date): Rotation completed" >> /var/log/backup_rotation.logPostgreSQL Backup
#!/bin/bash
DB_NAME="production"
BACKUP_DIR="/var/backups/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
# Полный бэкап
pg_dump -Fc -f "$BACKUP_DIR/full_$DATE.dump" $DB_NAME
# Инкрементальный с WAL
pg_basebackup -D "$BACKUP_DIR/base_$DATE" -Ft -z -P
# Архивация WAL логов
archive_command = 'cp %p /var/backups/wal/%f'MySQL Backup
#!/bin/bash
MYSQL_USER="backup_user"
MYSQL_PASS="secure_password"
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
# Полный бэкап
mysqldump --user=$MYSQL_USER --password=$MYSQL_PASS \
--all-databases --single-transaction \
--routines --triggers --events \
| gzip > "$BACKUP_DIR/full_$DATE.sql.gz"
# Инкрементальный с binlog
mysqlbinlog --read-from-remote-server \
--host=localhost --user=$MYSQL_USER \
--raw --stop-never mysql-bin.000001Compliance Requirements
| Стандарт | Требование |
|---|---|
| GDPR | Право на удаление, минимизация данных |
| SOX | 7 лет для финансовых записей |
| HIPAA | 6 лет для медицинских данных |
| PCI DSS | 1 год минимум для аудита |
RTO/RPO Planning
Критические системы:
RPO: 1 час
RTO: 4 часа
Стратегия: Синхронная репликация + горячий standby
Бизнес-системы:
RPO: 4 часа
RTO: 24 часа
Стратегия: Асинхронная репликация + теплый standby
Архивные системы:
RPO: 24 часа
RTO: 72 часа
Стратегия: Ежедневные бэкапы + холодное хранениеВалидация политик на Python
from datetime import datetime, timedelta
from typing import List, Dict
class BackupRetentionValidator:
def __init__(self, retention_policy: Dict):
self.policy = retention_policy
def validate_backup(self, backup_date: datetime, backup_type: str) -> bool:
"""Проверка соответствия бэкапа политике хранения"""
retention_days = self.policy.get(backup_type, {}).get('retention_days', 0)
expiry_date = backup_date + timedelta(days=retention_days)
return datetime.now() < expiry_date
def get_expired_backups(self, backups: List[Dict]) -> List[Dict]:
"""Получить список просроченных бэкапов"""
expired = []
for backup in backups:
if not self.validate_backup(backup['date'], backup['type']):
expired.append(backup)
return expired
def calculate_storage_forecast(self, daily_backup_size_gb: float) -> Dict:
"""Прогноз использования хранилища"""
total_storage = 0
for backup_type, config in self.policy.items():
retention = config.get('retention_days', 0)
frequency = config.get('frequency_days', 1)
copies = retention // frequency
total_storage += copies * daily_backup_size_gb
return {
'total_gb': total_storage,
'monthly_cost_estimate': total_storage * 0.023 # S3 Standard pricing
}График тестирования
| Тип теста | Частота | Охват |
|---|---|---|
| Выборочное восстановление | Ежемесячно | 10% данных |
| Полное восстановление | Ежеквартально | Критические системы |
| DR учения | Ежегодно | Полный сценарий |
| Аудит политик | Ежегодно | Все политики |
Мониторинг и алерты
Алерты:
backup_failed:
severity: critical
notification: [pagerduty, slack]
backup_size_anomaly:
threshold: 20%
severity: warning
retention_violation:
severity: high
action: auto_remediate
storage_threshold:
threshold: 80%
severity: warningЛучшие практики
1. Тестируйте восстановление — бэкап без теста = нет бэкапа 2. Шифруйте данные — AES-256 для данных в покое 3. Версионирование — храните несколько версий 4. Географическое распределение — минимум 2 региона 5. Immutable storage — защита от ransomware 6. Документируйте процедуры — runbooks для DR