29 lines
1.4 KiB
Bash
29 lines
1.4 KiB
Bash
#!/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"
|