Бэкап: образ restic-сайдкара и скрипт fs-backup
deploy/backup: образ на restic/restic:0.19.1 (+ sqlite, supercronic, tini), работает от uid 10001, как appuser. Скрипт fs-backup: - run: консистентная копия БД (VACUUM INTO + integrity_check), снимок в локальный репозиторий и на VPS (SFTP), теги players/matches, GFS-очистка (дни/недели/месяцы; именованные keep и pre-restore не удаляются), restic check; - list / status / verify / export (tar без сжатия; сжатие — только restic, репозиторий v2); - restore / import через промежуточную директорию: разворачивание в .restore-new внутри каждого тома, проверка (integrity_check, таблицы, число файлов, целостность tar), страховочный снимок pre-restore, двухфазная замена rename с файлом фазы и откатом; recover разбирает прерванное восстановление. Отказ при работающем app. Точка входа: без BACKUP_PASSWORD простой без рестарт-петли, первый снимок при пустом репозитории, расписание supercronic, healthcheck по возрасту последнего успеха. #64 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013jBxs9nBCk5nBdTLzcGz91
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
# Контейнер бэкапов: restic (дедупликация, шифрование, сжатие zstd) + расписание supercronic.
|
||||
# Снимает консистентную копию SQLite и файлы томов приложения, хранит снимки локально (том
|
||||
# backup-data) и на VPS (SFTP). Управление — команда fs-backup (см. deploy/backup/README.md).
|
||||
FROM restic/restic:0.19.1
|
||||
|
||||
# sqlite — консистентная копия и проверка БД; supercronic — cron для контейнера без root;
|
||||
# tini — корректные сигналы. jq, openssh-client, busybox (wget, flock, tar) уже есть в базе.
|
||||
RUN apk add --no-cache sqlite supercronic tini
|
||||
|
||||
# Тот же uid, что у appuser в образе приложения (10001): файлы после restore получают
|
||||
# правильного владельца, а -wal/-shm SQLite никогда не достаются root.
|
||||
RUN addgroup -g 10001 fsbackup \
|
||||
&& adduser -D -u 10001 -G fsbackup -h /home/fsbackup fsbackup \
|
||||
&& mkdir -p /fs/uploads /fs/achievements /fs-db /backup/repo /backup/state /backup/cache /import \
|
||||
&& chown -R 10001:10001 /fs /fs-db /backup /import /home/fsbackup
|
||||
|
||||
COPY fs-backup.sh /usr/local/bin/fs-backup
|
||||
COPY entrypoint.sh /usr/local/bin/fs-backup-entrypoint
|
||||
RUN sed -i 's/\r$//' /usr/local/bin/fs-backup /usr/local/bin/fs-backup-entrypoint \
|
||||
&& chmod 755 /usr/local/bin/fs-backup /usr/local/bin/fs-backup-entrypoint
|
||||
|
||||
ENV HOME=/home/fsbackup \
|
||||
RESTIC_CACHE_DIR=/backup/cache \
|
||||
TZ=Europe/Moscow
|
||||
|
||||
USER 10001:10001
|
||||
WORKDIR /home/fsbackup
|
||||
|
||||
# Здоров = последний успешный бэкап свежее BACKUP_MAX_AGE_HOURS (в каждом репозитории).
|
||||
HEALTHCHECK --interval=10m --timeout=60s --start-period=2h --retries=1 \
|
||||
CMD ["fs-backup", "health"]
|
||||
|
||||
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/fs-backup-entrypoint"]
|
||||
Reference in New Issue
Block a user