feat: automate production maintenance
This commit is contained in:
@@ -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 выполните:
|
||||
|
||||
Executable
+29
@@ -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
|
||||
Reference in New Issue
Block a user