266 lines
10 KiB
Markdown
266 lines
10 KiB
Markdown
# Эксплуатационная проверка контура
|
||
|
||
Дата актуализации: 2026-06-23
|
||
|
||
Документ фиксирует минимальный профессиональный контур проверки после
|
||
существенных изменений Rust-кода, сборщиков telemetry, ClickHouse workforce
|
||
аналитики, gateway или Grafana dashboards.
|
||
|
||
## Rust / cargo gate
|
||
|
||
Выполнять из репозитория. `CARGO_TARGET_DIR` должен быть вне рабочей копии, чтобы
|
||
не загрязнять diff.
|
||
|
||
```bash
|
||
cd /mnt/usb_hdd2/Projects/ActivityWatch-Russian/adk-rust
|
||
export CARGO_TARGET_DIR=/home/igor/.cache/detmir-adk-rust-target
|
||
|
||
cargo fmt --all --check
|
||
cargo test --workspace --all-targets --locked
|
||
cargo test --workspace --doc --locked
|
||
cargo clippy --workspace --all-targets --locked -- -D warnings
|
||
cargo audit --deny warnings
|
||
```
|
||
|
||
Проверка политики зависимостей:
|
||
|
||
```bash
|
||
cd /mnt/usb_hdd2/Projects/ActivityWatch-Russian
|
||
cargo deny --manifest-path adk-rust/Cargo.toml check \
|
||
--config deny.toml \
|
||
--hide-inclusion-graph \
|
||
--show-stats
|
||
```
|
||
|
||
Windows/RDP collector дополнительно проверяется под целевой ABI:
|
||
|
||
```bash
|
||
cd /mnt/usb_hdd2/Projects/ActivityWatch-Russian/adk-rust
|
||
export CARGO_TARGET_DIR=/home/igor/.cache/detmir-adk-rust-target
|
||
|
||
cargo check --target x86_64-pc-windows-gnu -p aw-windows-telemetry --locked
|
||
cargo clippy --target x86_64-pc-windows-gnu \
|
||
-p aw-windows-telemetry \
|
||
--all-targets \
|
||
--locked \
|
||
-- -D warnings
|
||
```
|
||
|
||
Repository-specific gate:
|
||
|
||
```bash
|
||
cd /mnt/usb_hdd2/Projects/ActivityWatch-Russian
|
||
python3 scripts/public_secret_pattern_check.py
|
||
node scripts/operational-maturity-check.mjs --json
|
||
|
||
cd /mnt/usb_hdd2/Projects/ActivityWatch-Russian/adk-rust
|
||
export CARGO_TARGET_DIR=/home/igor/.cache/detmir-adk-rust-target
|
||
cargo run -p quality-gate -- --root /mnt/usb_hdd2/Projects/ActivityWatch-Russian
|
||
```
|
||
|
||
Подробности эксплуатационного maturity harness: [эксплуатационная зрелость
|
||
DetMir/AWatch-rus](OPERATIONAL_MATURITY_RU.md).
|
||
|
||
## Browser smoke
|
||
|
||
Browser smoke не заменяет API/CLI проверки. Он подтверждает, что операторский
|
||
контур реально открывается в браузере и dashboards рендерят панели.
|
||
|
||
Минимальный набор страниц:
|
||
|
||
- `http://10.10.10.13:5600/` - ActivityWatch WebUI.
|
||
- `http://10.10.10.13:5610/reports/worktime/today` - дневной RDP отчет.
|
||
- `http://10.10.10.13:5610/reports/worktime/management` - управленческий RDP
|
||
отчет.
|
||
- `http://10.10.10.2:8710/manager/brief` - 1C executive brief.
|
||
- `http://10.10.10.2:8710/manager/actions` - очередь управленческих действий.
|
||
- `http://10.10.10.2:8710/manager/recovery` - recovery brief.
|
||
- `http://10.10.10.2:8710/manager/digest/weekly` - weekly digest.
|
||
- `https://dm.iri1968.dpdns.org/` - gateway index через Basic Auth.
|
||
- `https://dm.iri1968.dpdns.org/d/detmir-rdp-user-activity/detmir3a-rabota-pol-zovatelej-v-rdp?orgId=1&from=now-7d&to=now&timezone=browser&var-host=SHARKON2025&refresh=5m`
|
||
- RDP user activity dashboard.
|
||
- `https://dm.iri1968.dpdns.org/d/detmir-aw-main/detmir3a-activitywatch-overview?orgId=1&from=now-24h&to=now&timezone=browser&refresh=5m`
|
||
- main ActivityWatch dashboard.
|
||
|
||
Правила:
|
||
|
||
- Basic Auth читать с `pve-detmir:/etc/detmir/proxmox-web-gateway.credentials`.
|
||
Пароль нельзя печатать в логах, документации, commit messages или final report.
|
||
- Скриншоты для диагностики хранить в `/tmp/aw-browser-smoke-*`; не коммитить.
|
||
- Ошибки `404` по Grafana endpoint `/api/dashboards/uid/*/public-dashboards`
|
||
не считаются отказом панели: это metadata public dashboard, не datasource.
|
||
Пустые panels, 5xx, ошибки datasource или отсутствие данных в body/screenshot
|
||
считаются регрессией.
|
||
|
||
## Production smoke
|
||
|
||
После deploy или изменения telemetry/workforce выполнить:
|
||
|
||
```bash
|
||
cd /mnt/usb_hdd2/Projects/ActivityWatch-Russian
|
||
NO_PROXY=localhost,127.0.0.1,10.10.10.13,10.10.10.2,192.168.100.19,10.10.10.0/24 \
|
||
no_proxy=localhost,127.0.0.1,10.10.10.13,10.10.10.2,192.168.100.19,10.10.10.0/24 \
|
||
AW_SMOKE_WINDOWS_HOST=192.168.100.19 \
|
||
AW_SMOKE_SOURCE_HOSTNAME=SHARKON2025 \
|
||
./check-aw-full.sh
|
||
```
|
||
|
||
Для DetMir production при проверке после rename RDP-сервера явно фиксируйте
|
||
stable logical host id:
|
||
|
||
```bash
|
||
AW_MONITORED_WINDOWS_HOSTNAME=SHARKON2025 ./check-aw-data.sh
|
||
AW_SMOKE_WINDOWS_HOST=192.168.100.19 \
|
||
AW_SMOKE_SOURCE_HOSTNAME=SHARKON2025 \
|
||
./scripts/aw-contour-smoke-local.sh --skip-winrm
|
||
```
|
||
|
||
`SHARKON2025` в этих командах - исторический ActivityWatch logical id, не
|
||
физическое имя Windows-сервера.
|
||
|
||
Для workforce ClickHouse дополнительно проверить quality views:
|
||
|
||
```sql
|
||
SELECT
|
||
(SELECT count() FROM aw_workforce.v_workforce_unknown_subjects) AS unknown_subjects,
|
||
(SELECT count() FROM aw_workforce.v_workforce_unknown_processes) AS unknown_processes,
|
||
(SELECT count() FROM aw_workforce.v_workforce_unknown_domains) AS unknown_domains,
|
||
(SELECT countIf(user_login = 'unknown'
|
||
OR (process_name = 'unknown' AND lengthUTF8(window_title) = 0))
|
||
FROM aw_workforce.aw_window_events) AS no_user_window_rows;
|
||
```
|
||
|
||
Ожидаемое состояние после cleanup/normalization: все четыре значения равны `0`.
|
||
|
||
## Retention / cleanup validation
|
||
|
||
Политика хранения описана в [Retention and Cleanup Policy](RETENTION_POLICY_RU.md).
|
||
Перед изменением сроков хранения или включением нового cleanup scope сначала
|
||
выполнить dry-run и сохранить вывод в change evidence.
|
||
|
||
Проверить активные timers:
|
||
|
||
```bash
|
||
systemctl list-timers \
|
||
aw-prune-local-state.timer \
|
||
aw-db-maintenance.timer \
|
||
aw-db-vacuum.timer \
|
||
detmir-readiness.timer
|
||
```
|
||
|
||
Dry-run локальной очистки:
|
||
|
||
```bash
|
||
sudo AW_DATA_DIR=/var/lib/activitywatch \
|
||
AW_WORKTIME_REPORT_DISK_CACHE_DIR=/var/lib/activitywatch/worktime-report-cache \
|
||
AW_WORKTIME_REPORT_DISK_STALE_TTL_SECONDS=86400 \
|
||
/usr/local/bin/aw-prune-local-state-rust --json
|
||
```
|
||
|
||
Проверить, что в planned items нет:
|
||
|
||
- production database outside `/var/lib/activitywatch/backups/db`;
|
||
- config/env files;
|
||
- dashboards;
|
||
- Hayabusa forensic archive;
|
||
- DLP evidence/cases/compliance reports;
|
||
- release evidence;
|
||
- Windows queues.
|
||
|
||
Apply разрешен только после dry-run review:
|
||
|
||
```bash
|
||
sudo /usr/local/bin/aw-prune-local-state-rust --apply --json
|
||
```
|
||
|
||
Проверить журналы cleanup и DB maintenance:
|
||
|
||
```bash
|
||
journalctl \
|
||
-u aw-prune-local-state.service \
|
||
-u aw-db-maintenance.service \
|
||
-u aw-db-vacuum.service \
|
||
-u detmir-readiness.service \
|
||
-n 160 --no-pager
|
||
```
|
||
|
||
Оценить disk usage до и после:
|
||
|
||
```bash
|
||
du -sh \
|
||
/var/lib/activitywatch \
|
||
/var/log/activitywatch \
|
||
/opt/hayabusa \
|
||
/opt/activitywatch/clickhouse-1c \
|
||
/opt/activitywatch/clickhouse-workforce 2>/dev/null || true
|
||
|
||
docker system df 2>/dev/null || true
|
||
```
|
||
|
||
Для ClickHouse 1C/workforce проверить размер таблиц без удаления данных:
|
||
|
||
```bash
|
||
docker exec aw-rus-1c-clickhouse clickhouse-client --query \
|
||
"SELECT database, table, formatReadableSize(sum(bytes_on_disk)) AS size FROM system.parts WHERE active GROUP BY database, table ORDER BY sum(bytes_on_disk) DESC" \
|
||
2>/dev/null || true
|
||
|
||
docker exec aw-rus-workforce-clickhouse clickhouse-client --query \
|
||
"SELECT database, table, formatReadableSize(sum(bytes_on_disk)) AS size FROM system.parts WHERE active GROUP BY database, table ORDER BY sum(bytes_on_disk) DESC" \
|
||
2>/dev/null || true
|
||
```
|
||
|
||
Проверить, что cleanup не повлиял на running services:
|
||
|
||
```bash
|
||
systemctl status activitywatch-server aw-worktime-api --no-pager
|
||
curl -fsS http://127.0.0.1:5600/api/0/info >/dev/null
|
||
curl -fsS http://127.0.0.1:5610/healthz >/dev/null
|
||
```
|
||
|
||
Windows EVTX retention проверяется отдельно, потому что выполняется на RDP host:
|
||
|
||
```powershell
|
||
powershell.exe -ExecutionPolicy Bypass `
|
||
-File C:\ProgramData\AWatch-rus\export-evtx-for-hayabusa.ps1 `
|
||
-RetentionDays 14
|
||
```
|
||
|
||
Запрещено вручную удалять Windows collector queues, incident artifacts, DLP
|
||
evidence, Hayabusa archives, Grafana data или ClickHouse tables без отдельного
|
||
operator approval и backup/restore plan.
|
||
|
||
## Проверка отсутствия ClickHouse-пароля в argv
|
||
|
||
Цель проверки - убедиться, что ClickHouse/1C runtime wrappers не передают
|
||
`CLICKHOUSE_PASSWORD` через аргументы процессов. Пароль должен поступать из
|
||
`/opt/activitywatch/clickhouse-1c/.env` в окружение или временный client config,
|
||
а не через `--password`.
|
||
|
||
Статическая проверка wrappers:
|
||
|
||
```bash
|
||
rg -n -- '--password[= ]+"?\$[{]?CLICKHOUSE_PASSWORD' \
|
||
/opt/activitywatch/clickhouse-1c/ops
|
||
```
|
||
|
||
Ожидаемый результат: команда не выводит совпадений.
|
||
|
||
Runtime smoke во время ingest/brief refresh:
|
||
|
||
```bash
|
||
set -a
|
||
. /opt/activitywatch/clickhouse-1c/.env
|
||
set +a
|
||
|
||
ps -eo args= | grep -E 'clickhouse-client|generate_.*brief|refresh_company' |
|
||
while IFS= read -r line; do
|
||
if printf '%s' "${line}" | grep -F -- "${CLICKHOUSE_PASSWORD}" >/dev/null; then
|
||
echo "FAIL: ClickHouse password is visible in process argv" >&2
|
||
exit 1
|
||
fi
|
||
done
|
||
```
|
||
|
||
Ожидаемый результат: команда завершается с кодом `0` и не печатает секрет.
|
||
Если проверка падает, остановить rollout и вернуть предыдущий release artifact.
|