21 KiB
Executable File
Полная инструкция по развёртыванию и поддержке AWatch-rus
Статус документа
Этот документ описывает актуальный **Rust-fiWindows/PowerShell deployment flow больше не считается основным способом развёртывания, патчинга или эксплуатации. Если в репозитории остаются старые ".ps1"-файлы, они рассматриваются как legacy/history или как будущий provider-слой, но не как production runtime.
- Назначение
AWatch-rus — программный комплекс операционного контроля, технического аудита, оценки трудоотдачи сотрудников и мониторинга корпоративной ИТ-инфраструктуры на базе:
- Rust backend/runtime;
- Rust Agent;
- Rust server-rendered HTML + HTMX-compatible JSON API;
- Grafana/Prometheus-витрин;
- модулей Workforce, Security и Forensics;
- evidence/reporting tooling;
- ActivityWatch-compatible источников данных, где это применимо.
Проект не позиционируется как сертифицированная DLP/SIEM/EDR/XDR/СЗИ. DLP, evidence, UEBA и расследовательские функции используются как внутренние аналитические и операционные модули.
- Актуальная архитектура
1.1 Основной runtime
Основной production runtime AWatch-rus — Rust-first:
- backend/runtime — Rust;
- agent — Rust;
- portal — Rust server-rendered HTML + HTMX-compatible JSON API;
- operational status/check — Rust;
- DLP server-side helpers — Rust;
- worktime helpers/exporters/prewarm — Rust;
- SLO/health/readiness helpers — Rust;
- evidence/install-kit tooling — Rust;
- auto-heal helpers — Rust, только в безопасном режиме.
1.2 Что не является основным runtime
Не считать основным production deployment flow:
- PowerShell deployment;
- старые Windows ".ps1" rollout scripts;
- ручное исправление production-файлов без release/backup;
- прямое редактирование Web UI в "/opt" без воспроизводимого патча;
- Python/shell как основной operational runtime, если для компонента уже есть Rust-аналог.
Python, shell, Ansible или PowerShell могут оставаться в проекте только как:
- legacy compatibility;
- вспомогательные dev/test tools;
- миграционные сценарии;
- будущие provider-слои;
- Telegram/OCR/AI/ETL/MCP helpers, если они явно не входят в Rust-first core.
- Типовые роли узлов
2.1 Server node
Серверный узел содержит:
- AWatch-rus backend/runtime;
- portal;
- API;
- exporters;
- health/readiness/status tooling;
- systemd units/timers;
- Grafana/Prometheus integration;
- evidence/reporting storage.
2.2 Agent node
Agent node содержит:
- Rust Agent;
- локальную конфигурацию агента;
- systemd service или другой штатный supervisor;
- локальные логи;
- буфер/очередь, если предусмотрено конфигурацией;
- сетевой доступ до backend/API.
2.3 Monitoring node
Monitoring node может содержать:
- Prometheus;
- Grafana;
- dashboards;
- alerting rules;
- external logs/metrics storage.
Monitoring node может совпадать с server node в пилотной установке.
- Требования
3.1 Базовые требования
- Linux-сервер или LXC/VM.
- Доступ администратора к systemd.
- Rust toolchain для сборочного узла.
- Сетевой доступ между agent node и server node.
- Закрытый доступ к API и порталу через VPN, reverse proxy или внутренний контур.
- Backup/snapshot перед любым production patch.
3.2 Рекомендуемый production-подход
Для production не собирать проект прямо на боевом сервере, если есть отдельный build host.
Рекомендуемый поток:
git checkout нужного commit/tag → cargo fmt / clippy / test / build → упаковка release artifacts → перенос artifacts на сервер → backup/snapshot → остановка/перезапуск нужных services → smoke tests → фиксация версии
- Основные пути
Рекомендуемая структура на сервере:
/opt/awatch-rus/ bin/ etc/ portal/ releases/ evidence/ reports/ logs/
/etc/awatch-rus/ awatch-rus.env agent.env portal.env
/var/lib/awatch-rus/ data/ state/ cache/ evidence/ reports/
/var/log/awatch-rus/ backend.log agent.log portal.log exporter.log
Рекомендуемые runtime binaries:
/usr/local/bin/detmir-status /usr/local/bin/detmir-check /usr/local/bin/detmir-dlp /usr/local/bin/detmir-auto /usr/local/bin/detmir-heal-safe /usr/local/bin/aw-rus-healthd
Имена конкретных бинарников должны соответствовать текущему "Cargo.toml" и фактически собранным artifacts. Если имя binary изменено, документация и systemd unit должны обновляться в том же commit.
- Конфигурация
5.1 Общие правила
- Не хранить production secrets в публичном репозитории.
- Не коммитить реальные hostnames, IP, логины, ФИО, токены, пароли.
- Для production использовать "/etc/awatch-rus/*.env".
- Для demo использовать только обезличенные fixtures.
- Все параметры, влияющие на runtime, должны быть описаны в документации.
5.2 Пример server env
AWATCH_ENV=production AWATCH_BIND_ADDR=127.0.0.1 AWATCH_PORT=5600 AWATCH_DATA_DIR=/var/lib/awatch-rus/data AWATCH_LOG_DIR=/var/log/awatch-rus AWATCH_EVIDENCE_DIR=/var/lib/awatch-rus/evidence AWATCH_REPORTS_DIR=/var/lib/awatch-rus/reports RUST_LOG=info
5.3 Пример agent env
AWATCH_AGENT_ENV=production AWATCH_SERVER_URL=https://awatch.example.local AWATCH_AGENT_HOST_ID=HOSTNAME_OR_NODE_ID AWATCH_AGENT_DATA_DIR=/var/lib/awatch-rus/agent AWATCH_AGENT_LOG_DIR=/var/log/awatch-rus RUST_LOG=info
- Сборка
6.1 Проверки перед сборкой
На build host:
cd /path/to/AWatch-rus
git status --short cargo fmt --all -- --check cargo clippy --workspace --all-targets -- -D warnings cargo test --workspace
Если в репозитории есть проектные quality gates, выполнить их обязательно:
bash scripts/check_private_config_guard.sh bash scripts/quality-gate.sh
Если какой-то скрипт отсутствует в текущей ветке, не создавать фиктивную замену. Зафиксировать это в release notes.
6.2 Release build
cargo build --release --workspace
Проверить artifacts:
find target/release -maxdepth 1 -type f -executable -print
6.3 Упаковка artifacts
Рекомендуемый вариант:
mkdir -p dist/awatch-rus-release/bin cp target/release/detmir-status dist/awatch-rus-release/bin/ 2>/dev/null || true cp target/release/detmir-check dist/awatch-rus-release/bin/ 2>/dev/null || true cp target/release/detmir-dlp dist/awatch-rus-release/bin/ 2>/dev/null || true cp target/release/detmir-auto dist/awatch-rus-release/bin/ 2>/dev/null || true cp target/release/detmir-heal-safe dist/awatch-rus-release/bin/ 2>/dev/null || true cp target/release/aw-rus-healthd dist/awatch-rus-release/bin/ 2>/dev/null || true
tar -C dist -czf awatch-rus-release.tar.gz awatch-rus-release sha256sum awatch-rus-release.tar.gz > awatch-rus-release.tar.gz.sha256
Не использовать "cp ... || true" в CI без последующей проверки обязательных binaries. Для ручного production release список обязательных binaries должен быть проверен явно.
- Первичное развёртывание server node
7.1 Создание каталогов
sudo mkdir -p /opt/awatch-rus/bin sudo mkdir -p /opt/awatch-rus/releases sudo mkdir -p /etc/awatch-rus sudo mkdir -p /var/lib/awatch-rus/data sudo mkdir -p /var/lib/awatch-rus/state sudo mkdir -p /var/lib/awatch-rus/evidence sudo mkdir -p /var/lib/awatch-rus/reports sudo mkdir -p /var/log/awatch-rus
7.2 Установка binaries
sudo install -m 0755 dist/awatch-rus-release/bin/* /opt/awatch-rus/bin/
Создать symlink для удобства:
sudo ln -sf /opt/awatch-rus/bin/detmir-status /usr/local/bin/detmir-status sudo ln -sf /opt/awatch-rus/bin/detmir-check /usr/local/bin/detmir-check sudo ln -sf /opt/awatch-rus/bin/detmir-dlp /usr/local/bin/detmir-dlp
Если binary отсутствует, не создавать пустой symlink. Сначала проверить фактический состав release artifact.
7.3 Конфигурация
sudo install -m 0640 awatch-rus.env /etc/awatch-rus/awatch-rus.env
Проверить права:
sudo chown root:root /etc/awatch-rus/awatch-rus.env sudo chmod 0640 /etc/awatch-rus/awatch-rus.env
- systemd units
8.1 Пример backend service
[Unit] Description=AWatch-rus backend/runtime After=network-online.target Wants=network-online.target
[Service] Type=simple EnvironmentFile=/etc/awatch-rus/awatch-rus.env ExecStart=/opt/awatch-rus/bin/awatch-rus-backend Restart=on-failure RestartSec=5 WorkingDirectory=/opt/awatch-rus NoNewPrivileges=true PrivateTmp=true ProtectSystem=full ProtectHome=true ReadWritePaths=/var/lib/awatch-rus /var/log/awatch-rus
[Install] WantedBy=multi-user.target
Если фактическое имя backend binary отличается, заменить "awatch-rus-backend" на актуальное имя из release artifact.
8.2 Пример health service
[Unit] Description=AWatch-rus health daemon After=network-online.target Wants=network-online.target
[Service] Type=simple EnvironmentFile=/etc/awatch-rus/awatch-rus.env ExecStart=/opt/awatch-rus/bin/aw-rus-healthd Restart=on-failure RestartSec=5 WorkingDirectory=/opt/awatch-rus NoNewPrivileges=true PrivateTmp=true ProtectSystem=full ProtectHome=true ReadWritePaths=/var/lib/awatch-rus /var/log/awatch-rus
[Install] WantedBy=multi-user.target
8.3 Применение unit files
sudo systemctl daemon-reload sudo systemctl enable --now awatch-rus-backend.service sudo systemctl enable --now aw-rus-healthd.service
Если конкретный unit не используется в текущей инсталляции, не создавать фиктивный сервис. Документировать фактический набор services.
- Развёртывание Rust Agent
9.1 Установка agent binary
sudo mkdir -p /opt/awatch-rus/bin sudo mkdir -p /etc/awatch-rus sudo mkdir -p /var/lib/awatch-rus/agent sudo mkdir -p /var/log/awatch-rus
sudo install -m 0755 awatch-rus-agent /opt/awatch-rus/bin/awatch-rus-agent sudo install -m 0640 agent.env /etc/awatch-rus/agent.env
9.2 Пример agent service
[Unit] Description=AWatch-rus Rust Agent After=network-online.target Wants=network-online.target
[Service] Type=simple EnvironmentFile=/etc/awatch-rus/agent.env ExecStart=/opt/awatch-rus/bin/awatch-rus-agent Restart=on-failure RestartSec=5 WorkingDirectory=/opt/awatch-rus NoNewPrivileges=true PrivateTmp=true ProtectSystem=full ProtectHome=true ReadWritePaths=/var/lib/awatch-rus /var/log/awatch-rus
[Install] WantedBy=multi-user.target
9.3 Запуск agent
sudo systemctl daemon-reload sudo systemctl enable --now awatch-rus-agent.service sudo systemctl status awatch-rus-agent.service --no-pager
- Развёртывание портала
Портальный слой AWatch-rus зафиксирован как Rust server-rendered HTML + HTMX-compatible JSON API.
10.1 Общий порядок
build portal/backend binary → install binary → install templates/static assets, если они выделены отдельно → update portal env → restart portal service → smoke check HTTP/API routes
10.2 Проверка портала
curl -fsS http://127.0.0.1:5600/healthz curl -fsS http://127.0.0.1:5600/readyz curl -fsS http://127.0.0.1:5600/version
Если конкретные endpoints в текущей версии отличаются, использовать фактически реализованные health/readiness/version endpoints и обновить этот документ в том же commit.
- Патчи в развернутой среде
11.1 Правило
Любой production patch применяется только через контролируемый цикл:
определить commit/tag → собрать release artifact → выполнить локальные проверки → сделать backup/snapshot → установить новые binaries/configs → restart/reload services → smoke tests → зафиксировать результат → сохранить rollback path
11.2 Перед патчем
git rev-parse HEAD git status --short
Сохранить:
дата/время commit/tag кто применяет какие services затрагиваются какой rollback path
11.3 Backup перед патчем
Если используется Proxmox/LXC:
vzdump <CT_ID> --mode snapshot --compress zstd --storage <BACKUP_STORAGE>
Внутри сервера:
sudo tar -C / -czf /root/awatch-rus-backup-$(date +%Y%m%d-%H%M%S).tgz
etc/awatch-rus
opt/awatch-rus
var/lib/awatch-rus
var/log/awatch-rus
Если данные большие, backup "/var/lib/awatch-rus" выполнять отдельной процедурой согласно backup policy.
11.4 Установка нового binary
Сохранить предыдущую версию:
sudo mkdir -p /opt/awatch-rus/releases/previous sudo cp -a /opt/awatch-rus/bin /opt/awatch-rus/releases/previous/bin-$(date +%Y%m%d-%H%M%S)
Установить новый artifact:
sudo install -m 0755 dist/awatch-rus-release/bin/* /opt/awatch-rus/bin/
11.5 Restart services
sudo systemctl daemon-reload sudo systemctl restart awatch-rus-backend.service sudo systemctl restart aw-rus-healthd.service
Если патч касается только agent:
sudo systemctl restart awatch-rus-agent.service
Если сервис в текущем контуре называется иначе, использовать фактическое имя systemd unit.
- Smoke-тесты после патча
12.1 Systemd
systemctl --failed --no-pager systemctl status awatch-rus-backend.service --no-pager systemctl status aw-rus-healthd.service --no-pager
12.2 Rust operational checks
detmir-status --json detmir-check --json detmir-dlp --json
Если отдельная команда не установлена в данном контуре, это не считается ошибкой только при наличии документированного исключения.
12.3 HTTP/API
curl -fsS http://127.0.0.1:5600/healthz curl -fsS http://127.0.0.1:5600/readyz curl -fsS http://127.0.0.1:5600/version
12.4 Portal smoke
Проверить в браузере:
/portal /portal/reports /portal/architecture
Для Pilot v1 проверить роли:
executive manager security forensics admin
12.5 Data freshness
Проверить, что витрины и отчёты не пустые из-за сбоя сбора:
последние события поступают worktime reports обновляются DLP/security events отображаются, если включены evidence/reporting не падает Grafana dashboards открываются
- Rollback
13.1 Быстрый rollback binary
Найти предыдущий backup:
ls -lah /opt/awatch-rus/releases/previous/
Восстановить:
sudo rsync -a --delete /opt/awatch-rus/releases/previous/bin-YYYYMMDD-HHMMSS/ /opt/awatch-rus/bin/ sudo systemctl restart awatch-rus-backend.service sudo systemctl restart aw-rus-healthd.service
13.2 Rollback конфигурации
sudo cp /etc/awatch-rus/awatch-rus.env.bak /etc/awatch-rus/awatch-rus.env sudo systemctl restart awatch-rus-backend.service
13.3 Rollback CT/VM
Если повреждение затрагивает runtime, данные или systemd-конфигурацию:
остановить сервисы восстановить snapshot/backup проверить health/readiness/version проверить портал проверить поступление данных зафиксировать incident note
- Monitoring
14.1 Что должно контролироваться
- service status;
- process uptime;
- API health/readiness;
- latency;
- error rate;
- freshness данных;
- заполненность диска;
- размер логов;
- успешность exporters;
- SLO status;
- agent coverage;
- отсутствие failed systemd units.
14.2 Grafana
В Grafana должны быть разделены витрины:
- executive dashboard;
- security dashboard;
- operations dashboard;
- RDP/user activity dashboard;
- data quality/freshness dashboard;
- DLP/evidence dashboard, если модуль включён.
14.3 Prometheus
Prometheus scrape должен быть доступен только из внутреннего контура мониторинга. Не открывать metrics endpoints наружу.
- Security hardening
Обязательные правила:
- не публиковать API напрямую в интернет;
- использовать VPN/reverse proxy/access control;
- закрыть лишние порты;
- хранить secrets вне git;
- ограничить права systemd services;
- использовать отдельного service user, если это поддерживается текущей установкой;
- включить backup;
- проверять логи после каждого патча;
- не использовать demo fixtures как production data;
- не смешивать реальные ФИО/IP/hostname с публичными demo screenshots.
- Проверка перед вводом в эксплуатацию
Минимальный checklist:
[ ] выбран commit/tag release [ ] cargo fmt прошёл [ ] cargo clippy прошёл [ ] cargo test прошёл [ ] cargo build --release прошёл [ ] private config guard прошёл [ ] backup/snapshot создан [ ] binaries установлены [ ] systemd services запущены [ ] health/readiness/version отвечают [ ] detmir-status/check/dlp работают [ ] portal открывается [ ] роли Pilot v1 проверены [ ] Grafana dashboards открываются [ ] данные поступают [ ] rollback path известен [ ] дата/commit/оператор зафиксированы
- Что больше не использовать как основной путь
Не использовать как основной production flow:
windows/deploy-single-user.ps1 windows/deploy-domain-users.ps1 windows/deploy-ensemble.ps1 windows/validate-deployment.ps1 windows/hardening-recovery.ps1 windows/browser-domains-native-collector.ps1 windows/dlp-endpoint-signals-collector.ps1
Если эти файлы физически остаются в репозитории, они должны быть явно помечены как:
legacy planned provider migration-only dev/test helper
Они не должны описываться в основном deployment manual как обязательный production-путь.
- Короткий production runbook
18.1 Развернуть
cargo fmt --all -- --check cargo clippy --workspace --all-targets -- -D warnings cargo test --workspace cargo build --release --workspace
sudo install -m 0755 target/release/ /opt/awatch-rus/bin/ sudo systemctl daemon-reload sudo systemctl restart .service
18.2 Проверить
systemctl --failed --no-pager detmir-status --json detmir-check --json curl -fsS http://127.0.0.1:5600/healthz curl -fsS http://127.0.0.1:5600/readyz curl -fsS http://127.0.0.1:5600/version
18.3 Откатить
sudo rsync -a --delete /opt/awatch-rus/releases/previous/bin-YYYYMMDD-HHMMSS/ /opt/awatch-rus/bin/ sudo systemctl restart .service
- Правило актуализации этого документа
Если меняется:
- имя binary;
- имя systemd unit;
- порт;
- endpoint;
- путь хранения данных;
- способ сборки;
- способ доставки artifacts;
- smoke-test;
- rollback procedure;
то этот файл должен обновляться в том же commit, что и изменение кода или deployment-конфигурации.