91 lines
4.1 KiB
Markdown
91 lines
4.1 KiB
Markdown
# Server Infrastructure
|
|
|
|
## 2.2 Local state retention
|
|
|
|
Коммит `cc9e4a0` добавил отдельный server-side maintenance path для контроля роста локального state на AW server.
|
|
|
|
## `aw-prune-local-state.sh`
|
|
|
|
Команда `aw-server/aw-prune-local-state.sh` устанавливается в:
|
|
|
|
```text
|
|
/usr/local/bin/aw-prune-local-state.sh
|
|
```
|
|
|
|
Сейчас это Rust-first wrapper. Если доступен
|
|
`/usr/local/bin/aw-prune-local-state-rust`, wrapper использует его; иначе
|
|
fallback идет на legacy shell script из
|
|
`/opt/activitywatch/aw-rus-ops/aw-prune-local-state.sh`.
|
|
|
|
Назначение:
|
|
|
|
- чистит старые backup-файлы в `{{ aw_server_data_dir }}/backups`;
|
|
- отдельно удерживает последние DB backups и JSON backups;
|
|
- удаляет временные архивы из `/tmp`: `activitywatch-*.zip`, `hayabusa-*.zip`, `aw-hayabusa-profiles.txt`;
|
|
- удаляет временные WebUI/worktime artifacts старше одного дня: `aw-worktime-ui-bridge.py`, `views-default.json`, `apply_webui_ru_patch.out`.
|
|
- чистит старые `browser-smoke` run-директории в
|
|
`{{ aw_server_data_dir }}/browser-smoke`, удерживая последние запуски.
|
|
|
|
Rust binary по умолчанию работает в dry-run режиме. Production wrapper без
|
|
аргументов запускает его с `--apply`, чтобы сохранить поведение systemd timer.
|
|
|
|
Safety policy:
|
|
|
|
- не удалять основную ActivityWatch SQLite DB;
|
|
- не удалять rollback-critical backups: `switch-backups`, `before-rust`,
|
|
`rollback`;
|
|
- не удалять корневые state-каталоги;
|
|
- удалять только пути из явного allowlist: `backups`, `backups/db`,
|
|
`browser-smoke`, ограниченный набор временных файлов в `/tmp`.
|
|
|
|
## systemd unit и timer
|
|
|
|
Ansible создает:
|
|
|
|
```text
|
|
/etc/systemd/system/aw-prune-local-state.service
|
|
/etc/systemd/system/aw-prune-local-state.timer
|
|
```
|
|
|
|
Timer:
|
|
|
|
```ini
|
|
[Timer]
|
|
OnCalendar=*-*-* 04:40:00
|
|
Persistent=true
|
|
```
|
|
|
|
То есть очистка запускается ежедневно в `04:40`; если хост был выключен, `Persistent=true` догонит пропущенный запуск.
|
|
|
|
## Retention-параметры
|
|
|
|
Параметры задаются в `ansible/group_vars/aw_server.yml`:
|
|
|
|
| Переменная | Значение по умолчанию | Назначение |
|
|
| --- | ---: | --- |
|
|
| `aw_server_backup_retention_days` | `7` | Возраст backup-файлов, после которого они могут быть удалены. |
|
|
| `aw_server_backup_keep_last_db` | `2` | Минимум последних DB backup'ов, которые всегда сохраняются. |
|
|
| `aw_server_backup_keep_last_json` | `2` | Минимум последних JSON backup'ов, которые всегда сохраняются. |
|
|
| `aw_server_journal_system_max_use` | `100M` | Лимит persistent journald storage. |
|
|
| `aw_server_journal_runtime_max_use` | `50M` | Лимит runtime journald storage. |
|
|
| `aw_server_journal_system_keep_free` | `500M` | Минимально свободное место, которое journald должен оставить на FS. |
|
|
|
|
## journald retention
|
|
|
|
`deploy_aw_server.yml` устанавливает drop-in:
|
|
|
|
```text
|
|
/etc/systemd/journald.conf.d/aw-rus-retention.conf
|
|
```
|
|
|
|
Содержимое управляется Ansible:
|
|
|
|
```ini
|
|
[Journal]
|
|
SystemMaxUse={{ aw_server_journal_system_max_use }}
|
|
RuntimeMaxUse={{ aw_server_journal_runtime_max_use }}
|
|
SystemKeepFree={{ aw_server_journal_system_keep_free }}
|
|
```
|
|
|
|
После изменения drop-in playbook перезапускает `systemd-journald` и выполняет `journalctl --vacuum-size={{ aw_server_journal_system_max_use }}`. Это ограничивает рост логов без ручной очистки и снижает риск заполнения rootfs на AW server.
|