8e766b540e
- sites.yml — единый источник истины для всех сайтов - generate-configs.sh — генератор nginx конфигов, certbot domains.txt, .env - nginx: per-domain HTTPS (вместо all-or-nothing switch-config) - certbot: единый renew-all.sh, динамический init (без 5 дублирующих скриптов) - backup: контейнер с pg_dump + rclone (Яндекс.Диск), ежедневно в 3AM - Gitea + Gitea Runner в docker-compose (self-hosted Git + CI/CD) - .gitea/workflows/deploy.yml — CI/CD pipeline: push → авто-деплой - Makefile: generate-configs, reconfig, deploy, backup, restore, gitea, help
48 lines
1.7 KiB
Bash
48 lines
1.7 KiB
Bash
#!/bin/bash
|
|
# backup.sh — ежедневный бэкап: pg_dump + файлы → локально + Яндекс.Диск
|
|
set -euo pipefail
|
|
|
|
BACKUP_DIR="/backups/$(date +%Y-%m-%d)"
|
|
RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-7}"
|
|
DB_NAMES="${DB_NAMES:-mydb}"
|
|
TIMESTAMP=$(date +%H%M%S)
|
|
|
|
mkdir -p "$BACKUP_DIR/db" "$BACKUP_DIR/files"
|
|
|
|
echo "=== Backup $TIMESTAMP ==="
|
|
|
|
# 1. Дампы всех БД
|
|
IFS=',' read -ra databases <<< "$DB_NAMES"
|
|
for db in "${databases[@]}"; do
|
|
db=$(echo "$db" | xargs) # trim
|
|
echo "→ Dumping database: $db"
|
|
PGPASSWORD="$DB_PASSWORD" pg_dump -h "$DB_HOST" -p "${DB_PORT:-5432}" \
|
|
-U "$DB_USER" -d "$db" --format=custom \
|
|
-f "$BACKUP_DIR/db/${db}-${TIMESTAMP}.dump"
|
|
done
|
|
|
|
# 2. Архив файлов
|
|
echo "→ Archiving files..."
|
|
tar -czf "$BACKUP_DIR/files/certbot-${TIMESTAMP}.tar.gz" -C /data/certbot . 2>/dev/null || true
|
|
tar -czf "$BACKUP_DIR/files/uploads-${TIMESTAMP}.tar.gz" -C /data/uploads . 2>/dev/null || true
|
|
tar -czf "$BACKUP_DIR/files/analytics-${TIMESTAMP}.tar.gz" -C /data/analytics . 2>/dev/null || true
|
|
|
|
# 3. Создаём symlink latest
|
|
rm -f /backups/latest
|
|
ln -sf "$BACKUP_DIR" /backups/latest
|
|
|
|
# 4. Ротация — удаляем старше RETENTION_DAYS
|
|
find /backups -maxdepth 1 -type d -name '2*' -mtime "+$RETENTION_DAYS" -exec rm -rf {} \; 2>/dev/null || true
|
|
|
|
echo "✓ Local backup saved to $BACKUP_DIR"
|
|
|
|
# 5. Синхронизация с Яндекс.Диск
|
|
if command -v rclone > /dev/null 2>&1 && [ -n "${RCLONE_REMOTE:-}" ]; then
|
|
echo "→ Syncing to cloud: $RCLONE_REMOTE"
|
|
rclone sync /backups "$RCLONE_REMOTE" --progress 2>&1 || \
|
|
echo " ⚠ Cloud sync failed (check rclone config)"
|
|
echo "✓ Cloud sync complete"
|
|
fi
|
|
|
|
echo "=== Backup finished ==="
|