feat: automate production maintenance

This commit is contained in:
ik
2026-09-07 07:44:11 +07:00
parent 6e60988ac9
commit 2fa6b68279
9 changed files with 84 additions and 3 deletions
+12
View File
@@ -109,6 +109,18 @@ docker compose --env-file .env.production -f compose.production.yaml exec -T api
Сроки и состав данных описаны в [`docs/data-retention.md`](../docs/data-retention.md). Автоматизацию включайте только после проверки dry-run на рабочем наборе.
После ручной проверки установите ежедневный timer. `maintenance.sh` использует lock от параллельного запуска и применяет retention только после успешного backup:
```bash
sudo cp deploy/systemd/rf4spotter-maintenance.service /etc/systemd/system/
sudo cp deploy/systemd/rf4spotter-maintenance.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now rf4spotter-maintenance.timer
systemctl list-timers rf4spotter-maintenance.timer
```
Шаблон рассчитан на пользователя `rf4spotter`, каталог `/opt/rf4-spotter` и наличие `flock` из `util-linux`. Пользователь должен иметь доступ к Docker socket и каталогу `BACKUP_ROOT`. Результат каждого запуска хранится в systemd journal. Docker JSON-логи production-сервисов ограничены пятью файлами по 10 МБ на контейнер.
## 8. Мониторинг
После настройки DNS, TLS и первого backup выполните:
+29
View File
@@ -0,0 +1,29 @@
#!/bin/sh
set -eu
repo=$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)
cd "$repo"
env_file=${COMPOSE_ENV_FILE:-.env.production}
if [ ! -r "$env_file" ]; then
echo "Production env file is not readable: $env_file" >&2
exit 2
fi
backup_root=${BACKUP_ROOT:-$(sed -n 's/^BACKUP_ROOT=//p' "$env_file" | tail -n 1)}
case "$backup_root" in
/*) ;;
*) echo "BACKUP_ROOT must be an absolute path" >&2; exit 2 ;;
esac
exec 9>"$repo/.maintenance.lock"
if ! flock -n 9; then
echo "Another RF4 Spotter maintenance run is active" >&2
exit 1
fi
export COMPOSE_ENV_FILE="$env_file"
./deploy/backup.sh "$backup_root"
compose="docker compose --env-file $env_file -f compose.production.yaml"
$compose exec -T api python -m app.cli cleanup-retention
$compose exec -T api python -m app.cli cleanup-retention --apply
echo "Daily maintenance completed"
@@ -0,0 +1,13 @@
[Unit]
Description=RF4 Spotter backup and retention maintenance
After=docker.service network-online.target
Requires=docker.service
[Service]
Type=oneshot
User=rf4spotter
WorkingDirectory=/opt/rf4-spotter
ExecStart=/opt/rf4-spotter/deploy/maintenance.sh
# Backups can take longer on a growing database and object store.
TimeoutStartSec=2h
@@ -0,0 +1,10 @@
[Unit]
Description=Run RF4 Spotter backup and retention daily
[Timer]
OnCalendar=*-*-* 03:10:00
RandomizedDelaySec=10min
Persistent=true
[Install]
WantedBy=timers.target