#!/usr/bin/env bash # Консистентный онлайн-бэкап SQLite из работающего контейнера. # Запуск по cron на хосте Pi, например ежедневно в 04:00: # 0 4 * * * /home/pi/ForbidenStarsApp/scripts/backup.sh >> /var/log/fs-backup.log 2>&1 set -euo pipefail PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" BACKUP_DIR="${BACKUP_DIR:-$PROJECT_DIR/backups}" KEEP="${KEEP:-14}" SERVICE="app" TS="$(date +%Y%m%d_%H%M%S)" mkdir -p "$BACKUP_DIR" # .backup внутри контейнера (sqlite3 модуль Python) → консистентная копия в /data. docker compose -f "$PROJECT_DIR/docker-compose.yml" exec -T "$SERVICE" \ python -c "import sqlite3; s=sqlite3.connect('/data/forbidden_stars.db'); d=sqlite3.connect('/data/backup_tmp.db'); s.backup(d); d.close(); s.close()" # Копируем во вне контейнера и сжимаем. CID="$(docker compose -f "$PROJECT_DIR/docker-compose.yml" ps -q "$SERVICE")" docker cp "$CID:/data/backup_tmp.db" "$BACKUP_DIR/fs_$TS.db" docker compose -f "$PROJECT_DIR/docker-compose.yml" exec -T "$SERVICE" rm -f /data/backup_tmp.db gzip -f "$BACKUP_DIR/fs_$TS.db" # Ротация: оставить последние $KEEP. ls -1t "$BACKUP_DIR"/fs_*.db.gz 2>/dev/null | tail -n +"$((KEEP + 1))" | xargs -r rm -f echo "[backup] Готово: $BACKUP_DIR/fs_$TS.db.gz"