Files
netrunner-backend/scripts/backup.sh
T
nineap 875f679fc3 Добавляет периодический backup Postgres + фиксирует имя сети netrunner_grid
pg_dump + gzip по расписанию (BACKUP_INTERVAL_SEC) с ротацией
(BACKUP_RETENTION_DAYS) и опциональной офсайт-копией через rclone.
Явное имя сети netrunner_grid нужно для внешнего подключения Vaultwarden
(netrunner-data) к этому же Postgres-контейнеру.

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

63 lines
3.1 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 с опциональной офсайт-копией. Запускается как отдельный
# долгоживущий контейнер (см. docker-compose.prod.yml/docker-compose.dev-remote.yml,
# сервис `backup`) — сам себе крон через бесконечный цикл + sleep, без внешнего
# cron-демона в образе postgres:16-alpine.
#
# Обязательные переменные окружения: DATABASE_URL, BACKUP_DIR (примонтированный volume).
# Опциональные: BACKUP_INTERVAL_SEC (по умолчанию 21600 = 6ч), BACKUP_RETENTION_DAYS
# (по умолчанию 14), RCLONE_REMOTE (например "b2:netrunner-backups" — если не задан,
# офсайт-копия просто пропускается, бэкапы остаются только локально на VPS) и
# 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:-<не настроен>}"
while true; do
timestamp=$(date -u +%Y%m%dT%H%M%SZ)
dump_file="$BACKUP_DIR/netrunner_${timestamp}.sql.gz"
echo "[backup] $(date -u +%FT%TZ) Снимаю дамп -> $dump_file"
if pg_dump "$DATABASE_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 упал, файл не сохранён" >&2
rm -f "$dump_file.tmp"
sleep "$INTERVAL"
continue
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
# Локальная ротация — офсайт-копия (если настроена) хранится по правилам
# самого remote, это не отменяет отдельную политику хранения там.
find "$BACKUP_DIR" -name 'netrunner_*.sql.gz' -mtime "+${RETENTION_DAYS}" -delete
sleep "$INTERVAL"
done