- prod-backup.sh (tier hourly 48ч / daily 30д + uploads), prod-backup-offsite-pull.sh (DR на dev-vm) - prod-restore-verify.sh: restore во временную БД + сверка числа строк, дроп - prod-monitor.sh: api/web/public/БД/диск/5xx → Telegram владельцу (+ --test) - deploy-prod.sh: guard'ы (prod-postgres, .env chmod600, не dev-пароль, quick-login off, SEED_DEMO_DATA=false, issuer), бэкап ДО миграций, только --yes, НЕ в ночных - systemd таймеры (backup-hourly/daily, monitor, offsite-pull); docs/prod-runbook.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
19 lines
1.2 KiB
Bash
Executable file
19 lines
1.2 KiB
Bash
Executable file
#!/usr/bin/env bash
|
||
# Офсайт-копия прод-бэкапов на ДРУГОЙ хост (dev-vm 192.168.1.193). Запускается
|
||
# НА dev-vm по таймеру: тянет последний daily-дамп прода (prod-vm) сюда, хранит 30 дн.
|
||
# Направление dev→prod (рабочий SSH). Это «другая VM» для DR.
|
||
set -uo pipefail
|
||
PROD_HOST="${PROD_HOST:-nns@192.168.1.190}"
|
||
PROD_BACKUP_DIR="${PROD_BACKUP_DIR:-/opt/food-market-data/backups/daily}"
|
||
DEST="${FM_OFFSITE_LOCAL:-$HOME/fm-prod-backups}"
|
||
RET_DAYS="${FM_OFFSITE_RETENTION_DAYS:-30}"
|
||
mkdir -p "$DEST"
|
||
latest=$(ssh -o StrictHostKeyChecking=no "$PROD_HOST" "ls -t $PROD_BACKUP_DIR/db-*.dump 2>/dev/null | head -1" 2>/dev/null)
|
||
[ -n "$latest" ] || { echo "[offsite] нет daily-дампов на проде"; exit 1; }
|
||
base=$(basename "$latest")
|
||
if [ -f "$DEST/$base" ]; then echo "[offsite] уже есть: $base"; else
|
||
scp -o StrictHostKeyChecking=no "$PROD_HOST:$latest" "$DEST/" && echo "[offsite] скопирован $base → $DEST"
|
||
fi
|
||
find "$DEST" -maxdepth 1 -name 'db-*.dump' -mtime +"$RET_DAYS" -print -delete
|
||
echo "[offsite] готово ($(ls "$DEST"/db-*.dump 2>/dev/null | wc -l) копий)"
|