Files
netrunner-data/scripts/backup.sh
T
nineap 9ca6df3dfc Postgres переезжает сюда физически — backend теперь на отдельном VPS
Раньше предполагалось, что backend и БД живут на одном хосте и делят
Docker-сеть — на деле backend будет на отдельном, ещё не арендованном
VPS, а Postgres стоит здесь же, рядом с Vaultwarden. Возвращает свой
контейнер `db` (общий для обеих баз — vaultwarden создаётся через
POSTGRES_USER/POSTGRES_DB, вторая, для backend, через новый
postgres/init-backend-db.sh), публикует 5432 наружу с hostssl+TLS
(postgres/pg_hba.conf, самоподписанный сертификат генерируется один раз
прямо в deploy.yml). Backup-джоба (pg_dump обеих баз) тоже переехала
сюда из netrunner-backend — дампить логичнее там, где физически лежат
данные.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 17:17:05 +07:00

71 lines
3.3 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/sh
# Периодический pg_dump обеих баз (Vaultwarden + netrunner-backend, обе на
# одном общем Postgres, см. docker-compose.yml) с опциональной офсайт-копией.
# Запускается как отдельный долгоживущий контейнер — сам себе крон через
# бесконечный цикл + sleep, без внешнего cron-демона в образе postgres:16-alpine.
#
# Обязательные переменные окружения: DATABASE_URL (Vaultwarden), BACKUP_DIR
# (примонтированный volume). Опциональные: EXTRA_DATABASE_URL (вторая база —
# netrunner-backend, если не задана — дампится только первая),
# BACKUP_INTERVAL_SEC (по умолчанию 21600 = 6ч), BACKUP_RETENTION_DAYS
# (по умолчанию 14), RCLONE_REMOTE (например "b2:netrunner-backups" — если не
# задан, офсайт-копия просто пропускается) и RCLONE_CONFIG_CONTENT (содержимое
# rclone.conf целиком, одной переменной окружения — без bind-mount'а файла).
set -eu
BACKUP_DIR="${BACKUP_DIR:-/backups}"
INTERVAL="${BACKUP_INTERVAL_SEC:-21600}"
RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-14}"
mkdir -p "$BACKUP_DIR"
if [ -n "${RCLONE_REMOTE:-}" ] && ! command -v rclone >/dev/null 2>&1; then
echo "[backup] Устанавливаю rclone для офсайт-копий..."
apk add --no-cache rclone >/dev/null
fi
if [ -n "${RCLONE_CONFIG_CONTENT:-}" ]; then
mkdir -p /root/.config/rclone
printf '%s\n' "$RCLONE_CONFIG_CONTENT" > /root/.config/rclone/rclone.conf
fi
echo "[backup] Запущен. Интервал: ${INTERVAL}с, хранение: ${RETENTION_DAYS}д, офсайт: ${RCLONE_REMOTE:-<не настроен>}"
dump_one() {
label="$1"
url="$2"
timestamp=$(date -u +%Y%m%dT%H%M%SZ)
dump_file="$BACKUP_DIR/${label}_${timestamp}.sql.gz"
echo "[backup] $(date -u +%FT%TZ) Снимаю дамп ($label) -> $dump_file"
if pg_dump "$url" | gzip > "$dump_file.tmp"; then
mv "$dump_file.tmp" "$dump_file"
echo "[backup] Готово: $(du -h "$dump_file" | cut -f1)"
else
echo "[backup] ОШИБКА: pg_dump ($label) упал, файл не сохранён" >&2
rm -f "$dump_file.tmp"
return 1
fi
if [ -n "${RCLONE_REMOTE:-}" ]; then
if rclone copy "$dump_file" "$RCLONE_REMOTE" 2>&1; then
echo "[backup] Скопировано на $RCLONE_REMOTE"
else
echo "[backup] ОШИБКА: не удалось скопировать на $RCLONE_REMOTE (локальная копия сохранена)" >&2
fi
fi
}
while true; do
dump_one vaultwarden "$DATABASE_URL" || true
if [ -n "${EXTRA_DATABASE_URL:-}" ]; then
dump_one netrunner-backend "$EXTRA_DATABASE_URL" || true
fi
# Локальная ротация — офсайт-копия (если настроена) хранится по правилам
# самого remote, это не отменяет отдельную политику хранения там.
find "$BACKUP_DIR" -name '*_*.sql.gz' -mtime "+${RETENTION_DAYS}" -delete
sleep "$INTERVAL"
done