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
44 lines
1.4 KiB
Bash
44 lines
1.4 KiB
Bash
#!/bin/bash
|
|
# restore.sh — восстановление из бэкапа
|
|
# Использование: docker compose run --rm backup /opt/restore.sh [дата]
|
|
set -euo pipefail
|
|
|
|
BACKUP_DATE="${1:-latest}"
|
|
BACKUP_DIR="/backups/$BACKUP_DATE"
|
|
|
|
if [ ! -d "$BACKUP_DIR" ]; then
|
|
echo "Ошибка: бэкап $BACKUP_DIR не найден"
|
|
echo "Доступные бэкапы:"
|
|
ls -d /backups/2* 2>/dev/null || echo " (нет бэкапов)"
|
|
exit 1
|
|
fi
|
|
|
|
echo "=== Restore from $BACKUP_DIR ==="
|
|
|
|
# Восстановить БД
|
|
if [ -d "$BACKUP_DIR/db" ]; then
|
|
for dump in "$BACKUP_DIR/db"/*.dump; do
|
|
[ -f "$dump" ] || continue
|
|
db=$(basename "$dump" | sed 's/-.*//')
|
|
echo "→ Restoring database: $db"
|
|
PGPASSWORD="$DB_PASSWORD" pg_restore -h "$DB_HOST" -p "${DB_PORT:-5432}" \
|
|
-U "$DB_USER" -d "$db" --clean --if-exists "$dump" || \
|
|
echo " ⚠ Restore of $db had warnings (non-fatal)"
|
|
done
|
|
fi
|
|
|
|
# Распаковать файлы
|
|
if [ -d "$BACKUP_DIR/files" ]; then
|
|
for archive in "$BACKUP_DIR/files"/*.tar.gz; do
|
|
[ -f "$archive" ] || continue
|
|
name=$(basename "$archive" | sed 's/-.*//')
|
|
target="/data/$name"
|
|
echo "→ Extracting $name to $target"
|
|
mkdir -p "$target"
|
|
tar -xzf "$archive" -C "$target" || true
|
|
done
|
|
fi
|
|
|
|
echo "=== Restore completed ==="
|
|
echo "При необходимости перезапусти сервисы: docker compose restart"
|