Files
sqlite-backup-s3/README.md
T
vasyansk 3183bf5267
docker-build / Build image (push) Successful in 25s
Add KEEP_LAST retention policy for backups
Add KEEP_LAST environment variable to always preserve the N most recent
backups regardless of age, preventing data loss when backups haven't
been created for extended periods. Defaults to 10 copies.
2026-09-01 12:09:19 +07:00

82 lines
3.2 KiB
Markdown

# бекапирование sqlite в minio
```yaml
services:
sqlite_backup:
image: git.realmanual.ru/pub/sqlite-backup-s3
container_name: sqlite_backup
restart: always
volumes:
- ./var/lib/data/:/data
environment:
- DB_FILE
- CRONTAB
- DELETE_AFTER
- KEEP_LAST
- TZ
- MINIO_PATH
- MINIO_ACCOUNT_ID
- MINIO_APPLICATION_KEY
- MINIO_ENDPOINT
- MINIO_LOCATION
- HEALTHCHECK_URL
- HEALTHCHECK_UUID
```
пример .env
```bash
DB_FILE=/data/db.sqlite
CRONTAB="00 06 * * *"
DELETE_AFTER=10
KEEP_LAST=10
TZ=Asia/Novosibirsk
MINIO_PATH=myminio://sqlite/master/
MINIO_ACCOUNT_ID=account
MINIO_APPLICATION_KEY=key
MINIO_ENDPOINT=https://s3.domain.ru
MINIO_LOCATION=ru-nsk
# необязательно: пинг в healthchecks.io (в т.ч. self-hosted)
HEALTHCHECK_URL=https://hc.domain.ru/ping
HEALTHCHECK_UUID=00000000-0000-0000-0000-000000000000
```
1. myminio - системно! не менять
2. проверьте настройки локации, не должно быть пусто
3. DELETE_AFTER - в днях
4. KEEP_LAST - минимальное число копий, которые сохраняются всегда
## Ротация
Удаление старых бекапов работает по двум условиям одновременно:
1. бекап старше `DELETE_AFTER` дней
2. и при этом не входит в `KEEP_LAST` самых свежих копий
То есть последние `KEEP_LAST` бекапов не удаляются никогда, даже если они старше `DELETE_AFTER` дней. Это защищает от потери всех копий, если контейнер долго стоял и новые бекапы не создавались.
`KEEP_LAST` по умолчанию `10`, если переменная не задана.
## Healthchecks
Если `HEALTHCHECK_URL` пуст — пинги не отправляются, бекап работает как обычно.
Итоговый адрес: `${HEALTHCHECK_URL}/${HEALTHCHECK_UUID}`
| Момент | Запрос |
|---|---|
| старт бекапа | `.../${HEALTHCHECK_UUID}/start` |
| дамп снят, проверен `PRAGMA integrity_check`, запакован, залит в s3, размер в s3 сверен с локальным, старое удалено | `.../${HEALTHCHECK_UUID}` |
| любая ошибка на любом шаге | `.../${HEALTHCHECK_UUID}/fail` |
Для self-hosted инстанса `HEALTHCHECK_URL` — это адрес его ping-эндпоинта, например `https://hc.domain.ru/ping`.
## Как передаётся окружение в cron
`crond` из busybox запускает джобы с пустым окружением, поэтому `entrypoint.sh`
сохраняет env контейнера в `/tmp/container.env` (права 600), а cron-запись
вызывает `/scripts/backup.sh --from-cron`, который его подгружает.
Ручной запуск (`docker exec ... /scripts/backup.sh`) использует то окружение,
с которым его вызвали.