Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b74d78750a |
+542
-297
@@ -1,422 +1,667 @@
|
|||||||
# Полная инструкция по развёртыванию и поддержке ActivityWatch-Russian
|
Полная инструкция по развёртыванию и поддержке AWatch-rus
|
||||||
|
|
||||||
Документ описывает полный цикл: Proxmox/LXC сервер, установка ActivityWatch Server, RU Web UI patch, развёртывание Windows-клиентов в другом AD-домене, валидация, сопровождение и rollback.
|
Статус документа
|
||||||
|
|
||||||
---
|
Этот документ описывает актуальный **Rust-fiWindows/PowerShell deployment flow больше не считается основным способом развёртывания, патчинга или эксплуатации. Если в репозитории остаются старые ".ps1"-файлы, они рассматриваются как legacy/history или как будущий provider-слой, но не как production runtime.
|
||||||
|
|
||||||
## 0) Структура проекта (полные пути)
|
0. Назначение
|
||||||
|
|
||||||
- `<PROJECT_ROOT>/private-config/deploy.env`
|
AWatch-rus — программный комплекс операционного контроля, технического аудита, оценки трудоотдачи сотрудников и мониторинга корпоративной ИТ-инфраструктуры на базе:
|
||||||
- `<PROJECT_ROOT>/proxmox/create-ct.sh`
|
|
||||||
- `<PROJECT_ROOT>/proxmox/push-aw-artifacts.sh`
|
|
||||||
- `<PROJECT_ROOT>/aw-server/install_aw_server.sh`
|
|
||||||
- `<PROJECT_ROOT>/aw-server/apply_webui_ru_patch.sh`
|
|
||||||
- `<PROJECT_ROOT>/windows/deploy-single-user.ps1`
|
|
||||||
- `<PROJECT_ROOT>/windows/deploy-domain-users.ps1`
|
|
||||||
- `<PROJECT_ROOT>/windows/deploy-ensemble.ps1`
|
|
||||||
- `<PROJECT_ROOT>/windows/hardening-recovery.ps1`
|
|
||||||
- `<PROJECT_ROOT>/windows/validate-deployment.ps1`
|
|
||||||
- `<PROJECT_ROOT>/windows/browser-domains-native-collector.ps1`
|
|
||||||
- `<PROJECT_ROOT>/windows/dlp-endpoint-signals-collector.ps1`
|
|
||||||
- `<PROJECT_ROOT>/ansible/deploy_aw_server.yml`
|
|
||||||
- `<PROJECT_ROOT>/ansible/provision_proxmox_ct_and_deploy_aw.yml`
|
|
||||||
- `<PROJECT_ROOT>/ansible/provision_proxmox_ct_matrix_and_deploy_aw.yml`
|
|
||||||
- `<PROJECT_ROOT>/ansible/deploy_aw_windows.yml`
|
|
||||||
|
|
||||||
---
|
- Rust backend/runtime;
|
||||||
|
- Rust Agent;
|
||||||
|
- Rust server-rendered HTML + HTMX-compatible JSON API;
|
||||||
|
- Grafana/Prometheus-витрин;
|
||||||
|
- модулей Workforce, Security и Forensics;
|
||||||
|
- evidence/reporting tooling;
|
||||||
|
- ActivityWatch-compatible источников данных, где это применимо.
|
||||||
|
|
||||||
## 1) Подготовка
|
Проект не позиционируется как сертифицированная DLP/SIEM/EDR/XDR/СЗИ. DLP, evidence, UEBA и расследовательские функции используются как внутренние аналитические и операционные модули.
|
||||||
|
|
||||||
### 1.1 Требования
|
1. Актуальная архитектура
|
||||||
|
|
||||||
- Proxmox VE 8/9, доступ root (или sudo с правами на `pct`).
|
1.1 Основной runtime
|
||||||
- Шаблон Debian 12 LXC на хосте Proxmox.
|
|
||||||
- Windows хост(ы) с PowerShell 5.1+ и правами локального администратора.
|
|
||||||
- Сетевой доступ Windows-клиентов до ActivityWatch Server (`5600/tcp`).
|
|
||||||
|
|
||||||
### 1.2 Подготовка единого файла секретов
|
Основной 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, только в безопасном режиме.
|
||||||
|
|
||||||
```bash
|
1.2 Что не является основным runtime
|
||||||
cp <PROJECT_ROOT>/private-config/deploy.env.example \
|
|
||||||
<PROJECT_ROOT>/private-config/deploy.env
|
|
||||||
```
|
|
||||||
|
|
||||||
Заполните в файле `<PROJECT_ROOT>/private-config/deploy.env`:
|
Не считать основным production deployment flow:
|
||||||
|
|
||||||
- все `CT_*` параметры контейнера;
|
- PowerShell deployment;
|
||||||
- все `AW_SERVER_*` параметры сервера;
|
- старые Windows ".ps1" rollout scripts;
|
||||||
- `CT_PASSWORD` (реальный пароль).
|
- ручное исправление production-файлов без release/backup;
|
||||||
|
- прямое редактирование Web UI в "/opt" без воспроизводимого патча;
|
||||||
|
- Python/shell как основной operational runtime, если для компонента уже есть Rust-аналог.
|
||||||
|
|
||||||
Важно: этот файл подхватывается автоматически скриптами Proxmox.
|
Python, shell, Ansible или PowerShell могут оставаться в проекте только как:
|
||||||
|
|
||||||
---
|
- legacy compatibility;
|
||||||
|
- вспомогательные dev/test tools;
|
||||||
|
- миграционные сценарии;
|
||||||
|
- будущие provider-слои;
|
||||||
|
- Telegram/OCR/AI/ETL/MCP helpers, если они явно не входят в Rust-first core.
|
||||||
|
|
||||||
## 2) Развёртывание сервера в Proxmox
|
2. Типовые роли узлов
|
||||||
|
|
||||||
### 2.0 Ansible full-stack (создание CT + установка AW)
|
2.1 Server node
|
||||||
|
|
||||||
Подготовьте:
|
Серверный узел содержит:
|
||||||
|
|
||||||
- `<PROJECT_ROOT>/ansible/inventory.ini`
|
- AWatch-rus backend/runtime;
|
||||||
- `<PROJECT_ROOT>/ansible/group_vars/all.yml`
|
- portal;
|
||||||
- `<PROJECT_ROOT>/ansible/group_vars/proxmox.yml`
|
- API;
|
||||||
|
- exporters;
|
||||||
|
- health/readiness/status tooling;
|
||||||
|
- systemd units/timers;
|
||||||
|
- Grafana/Prometheus integration;
|
||||||
|
- evidence/reporting storage.
|
||||||
|
|
||||||
Запуск:
|
2.2 Agent node
|
||||||
|
|
||||||
```bash
|
Agent node содержит:
|
||||||
cd <PROJECT_ROOT>/ansible
|
|
||||||
ansible-playbook -i inventory.ini provision_proxmox_ct_and_deploy_aw.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
Этот сценарий полностью закрывает:
|
- Rust Agent;
|
||||||
|
- локальную конфигурацию агента;
|
||||||
|
- systemd service или другой штатный supervisor;
|
||||||
|
- локальные логи;
|
||||||
|
- буфер/очередь, если предусмотрено конфигурацией;
|
||||||
|
- сетевой доступ до backend/API.
|
||||||
|
|
||||||
- создание CT в Proxmox;
|
2.3 Monitoring node
|
||||||
- bootstrap пакетов в CT;
|
|
||||||
- установку ActivityWatch Server;
|
|
||||||
- применение RU Web UI patch;
|
|
||||||
- проверку API.
|
|
||||||
|
|
||||||
Для массового режима (несколько CT):
|
Monitoring node может содержать:
|
||||||
|
|
||||||
```bash
|
- Prometheus;
|
||||||
cd <PROJECT_ROOT>/ansible
|
- Grafana;
|
||||||
ansible-playbook -i inventory.ini provision_proxmox_ct_matrix_and_deploy_aw.yml
|
- dashboards;
|
||||||
```
|
- alerting rules;
|
||||||
|
- external logs/metrics storage.
|
||||||
|
|
||||||
### 2.1 Создать LXC контейнер
|
Monitoring node может совпадать с server node в пилотной установке.
|
||||||
|
|
||||||
На узле Proxmox:
|
3. Требования
|
||||||
|
|
||||||
```bash
|
3.1 Базовые требования
|
||||||
cd <PROJECT_ROOT>
|
|
||||||
<PROJECT_ROOT>/proxmox/create-ct.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
По умолчанию читается:
|
- Linux-сервер или LXC/VM.
|
||||||
|
- Доступ администратора к systemd.
|
||||||
|
- Rust toolchain для сборочного узла.
|
||||||
|
- Сетевой доступ между agent node и server node.
|
||||||
|
- Закрытый доступ к API и порталу через VPN, reverse proxy или внутренний контур.
|
||||||
|
- Backup/snapshot перед любым production patch.
|
||||||
|
|
||||||
- `<PROJECT_ROOT>/private-config/deploy.env`
|
3.2 Рекомендуемый production-подход
|
||||||
|
|
||||||
При необходимости можно передать другой путь:
|
Для production не собирать проект прямо на боевом сервере, если есть отдельный build host.
|
||||||
|
|
||||||
```bash
|
Рекомендуемый поток:
|
||||||
<PROJECT_ROOT>/proxmox/create-ct.sh /absolute/path/to/deploy.env
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2.2 Загрузить bootstrap-артефакты и env внутрь CT
|
git checkout нужного commit/tag
|
||||||
|
→ cargo fmt / clippy / test / build
|
||||||
|
→ упаковка release artifacts
|
||||||
|
→ перенос artifacts на сервер
|
||||||
|
→ backup/snapshot
|
||||||
|
→ остановка/перезапуск нужных services
|
||||||
|
→ smoke tests
|
||||||
|
→ фиксация версии
|
||||||
|
|
||||||
```bash
|
4. Основные пути
|
||||||
cd <PROJECT_ROOT>
|
|
||||||
<PROJECT_ROOT>/proxmox/push-aw-artifacts.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Скрипт загружает в CT:
|
Рекомендуемая структура на сервере:
|
||||||
|
|
||||||
- `<CT_BOOTSTRAP_DIR>/install_aw_server.sh`
|
/opt/awatch-rus/
|
||||||
- `<CT_BOOTSTRAP_DIR>/apply_webui_ru_patch.sh`
|
bin/
|
||||||
- `<CT_BOOTSTRAP_DIR>/activitywatch-server.service`
|
etc/
|
||||||
- `<CT_BOOTSTRAP_DIR>/aw-ru-patch.js`
|
portal/
|
||||||
- `<CT_BOOTSTRAP_DIR>/aw-sw-cleanup.js`
|
releases/
|
||||||
- `/etc/activitywatch/aw-server.env` (из `AW_SERVER_*`)
|
evidence/
|
||||||
|
reports/
|
||||||
|
logs/
|
||||||
|
|
||||||
### 2.3 Установить ActivityWatch Server внутри CT
|
/etc/awatch-rus/
|
||||||
|
awatch-rus.env
|
||||||
|
agent.env
|
||||||
|
portal.env
|
||||||
|
|
||||||
```bash
|
/var/lib/awatch-rus/
|
||||||
pct enter <CT_ID>
|
data/
|
||||||
bash <CT_BOOTSTRAP_DIR>/install_aw_server.sh
|
state/
|
||||||
```
|
cache/
|
||||||
|
evidence/
|
||||||
|
reports/
|
||||||
|
|
||||||
### 2.4 Применить RU patch Web UI
|
/var/log/awatch-rus/
|
||||||
|
backend.log
|
||||||
|
agent.log
|
||||||
|
portal.log
|
||||||
|
exporter.log
|
||||||
|
|
||||||
```bash
|
Рекомендуемые runtime binaries:
|
||||||
bash <CT_BOOTSTRAP_DIR>/apply_webui_ru_patch.sh
|
|
||||||
systemctl restart activitywatch-server.service
|
|
||||||
```
|
|
||||||
|
|
||||||
После применения патча доступны:
|
/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
|
||||||
|
|
||||||
- верхнее меню `DLP` в Web UI;
|
Имена конкретных бинарников должны соответствовать текущему "Cargo.toml" и фактически собранным artifacts. Если имя binary изменено, документация и systemd unit должны обновляться в том же commit.
|
||||||
- DLP-страница bucket `aw-dlp-endpoint-signals_<HOST>`;
|
|
||||||
- встроенный центр `DLP review и правила`;
|
|
||||||
- служебные buckets `aw-dlp-review_<HOST>` и `aw-dlp-rules_<HOST>`.
|
|
||||||
|
|
||||||
### 2.5 Проверка сервера
|
5. Конфигурация
|
||||||
|
|
||||||
В CT:
|
5.1 Общие правила
|
||||||
|
|
||||||
```bash
|
- Не хранить production secrets в публичном репозитории.
|
||||||
systemctl status activitywatch-server.service --no-pager
|
- Не коммитить реальные hostnames, IP, логины, ФИО, токены, пароли.
|
||||||
curl -fsS http://127.0.0.1:5600/api/0/info
|
- Для production использовать "/etc/awatch-rus/*.env".
|
||||||
ss -ltnp | grep 5600
|
- Для demo использовать только обезличенные fixtures.
|
||||||
grep -n 'aw-ru-patch\|aw-sw-cleanup' /opt/activitywatch/webui-ru/index.html
|
- Все параметры, влияющие на runtime, должны быть описаны в документации.
|
||||||
```
|
|
||||||
|
|
||||||
Ожидается:
|
5.2 Пример server env
|
||||||
|
|
||||||
- сервис `active (running)`;
|
AWATCH_ENV=production
|
||||||
- API отвечает JSON;
|
AWATCH_BIND_ADDR=127.0.0.1
|
||||||
- порт 5600 слушается;
|
AWATCH_PORT=5600
|
||||||
- в `index.html` присутствуют оба скрипта.
|
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
|
||||||
|
|
||||||
Дополнительно после первого входа в Web UI:
|
5.3 Пример agent env
|
||||||
|
|
||||||
- `#/home` должен показывать один корректный пункт `DLP`;
|
AWATCH_AGENT_ENV=production
|
||||||
- `#/buckets/aw-dlp-endpoint-signals_<HOST>` должен открываться без ошибок;
|
AWATCH_SERVER_URL=https://awatch.example.local
|
||||||
- сохранение review/rule должно создавать buckets `aw-dlp-review_<HOST>` и `aw-dlp-rules_<HOST>`.
|
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. Сборка
|
||||||
|
|
||||||
## 3) Развёртывание Windows-клиентов (другой AD-домен)
|
6.1 Проверки перед сборкой
|
||||||
|
|
||||||
### 3.1 Подготовка на Windows-хосте
|
На build host:
|
||||||
|
|
||||||
Скопируйте каталог:
|
cd /path/to/AWatch-rus
|
||||||
|
|
||||||
- `<PROJECT_ROOT>/windows`
|
git status --short
|
||||||
|
cargo fmt --all -- --check
|
||||||
|
cargo clippy --workspace --all-targets -- -D warnings
|
||||||
|
cargo test --workspace
|
||||||
|
|
||||||
например в:
|
Если в репозитории есть проектные quality gates, выполнить их обязательно:
|
||||||
|
|
||||||
- `C:\Program Files\AWatch-rus\windows`
|
bash scripts/check_private_config_guard.sh
|
||||||
|
bash scripts/quality-gate.sh
|
||||||
|
|
||||||
Откройте **elevated PowerShell**:
|
Если какой-то скрипт отсутствует в текущей ветке, не создавать фиктивную замену. Зафиксировать это в release notes.
|
||||||
|
|
||||||
```powershell
|
6.2 Release build
|
||||||
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3.2 Массовое доменное развёртывание (рекомендуется)
|
cargo build --release --workspace
|
||||||
|
|
||||||
Если текущий production ещё работает в старых каталогах
|
Проверить artifacts:
|
||||||
`C:\Program Files\ActivityWatch-Phase2` и `C:\ProgramData\ActivityWatch-Phase2`,
|
|
||||||
сначала выполните безопасную миграцию:
|
|
||||||
|
|
||||||
```powershell
|
find target/release -maxdepth 1 -type f -executable -print
|
||||||
C:\Program Files\AWatch-rus\windows\migrate-awatch-rus-paths.ps1 -WhatIf
|
|
||||||
C:\Program Files\AWatch-rus\windows\migrate-awatch-rus-paths.ps1
|
|
||||||
```
|
|
||||||
|
|
||||||
Скрипт остановит `ActivityWatch Recovery`/`ActivityWatch Launch *`, создаст backup в
|
6.3 Упаковка artifacts
|
||||||
`C:\ProgramData\AWatch-rus\migration-backups\...`, перенесёт файлы в единые пути,
|
|
||||||
пересоздаст `deployment-config.json`/scheduled tasks и запустит validation.
|
|
||||||
|
|
||||||
Пример со списком пользователей:
|
Рекомендуемый вариант:
|
||||||
|
|
||||||
```powershell
|
mkdir -p dist/awatch-rus-release/bin
|
||||||
C:\Program Files\AWatch-rus\windows\deploy-domain-users.ps1 `
|
cp target/release/detmir-status dist/awatch-rus-release/bin/ 2>/dev/null || true
|
||||||
-ServerHost aw.example.local `
|
cp target/release/detmir-check dist/awatch-rus-release/bin/ 2>/dev/null || true
|
||||||
-ServerPort 5600 `
|
cp target/release/detmir-dlp dist/awatch-rus-release/bin/ 2>/dev/null || true
|
||||||
-Domain CONTOSO `
|
cp target/release/detmir-auto dist/awatch-rus-release/bin/ 2>/dev/null || true
|
||||||
-UserListPath C:\Deploy\aw-users.txt `
|
cp target/release/detmir-heal-safe dist/awatch-rus-release/bin/ 2>/dev/null || true
|
||||||
-CustomRulesPath C:\Program Files\AWatch-rus\windows\web-category-rules.example.json
|
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
|
||||||
|
|
||||||
- `-Users user01,user02`
|
Не использовать "cp ... || true" в CI без последующей проверки обязательных binaries. Для ручного production release список обязательных binaries должен быть проверен явно.
|
||||||
- `-Users 'CONTOSO\user01','CONTOSO\user02'`
|
|
||||||
- `-UserListPath <txt|csv>`
|
|
||||||
|
|
||||||
### 3.2.1 Ensemble orchestration (рекомендуется для production)
|
7. Первичное развёртывание server node
|
||||||
|
|
||||||
```powershell
|
7.1 Создание каталогов
|
||||||
C:\Program Files\AWatch-rus\windows\deploy-ensemble.ps1 `
|
|
||||||
-ServerHost aw.example.local `
|
|
||||||
-ServerPort 5600 `
|
|
||||||
-Domain CONTOSO `
|
|
||||||
-Users user1,user2,user3,user4,user5 `
|
|
||||||
-ValidateAfterDeploy
|
|
||||||
```
|
|
||||||
|
|
||||||
Отчёт сохраняется в:
|
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
|
||||||
|
|
||||||
- `C:\ProgramData\AWatch-rus\ensemble-report-YYYYMMDD-HHMMSS.json`
|
7.2 Установка binaries
|
||||||
|
|
||||||
### 3.3 Single-user развёртывание
|
sudo install -m 0755 dist/awatch-rus-release/bin/* /opt/awatch-rus/bin/
|
||||||
|
|
||||||
```powershell
|
Создать symlink для удобства:
|
||||||
C:\Program Files\AWatch-rus\windows\deploy-single-user.ps1 `
|
|
||||||
-ServerHost aw.example.local `
|
|
||||||
-ServerPort 5600 `
|
|
||||||
-TargetUser 'CONTOSO\user01' `
|
|
||||||
-CustomRulesPath C:\Program Files\AWatch-rus\windows\web-category-rules.example.json
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3.4 Recovery / hardening
|
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
|
||||||
|
|
||||||
```powershell
|
Если binary отсутствует, не создавать пустой symlink. Сначала проверить фактический состав release artifact.
|
||||||
C:\Program Files\AWatch-rus\windows\hardening-recovery.ps1 `
|
|
||||||
-ConfigPath C:\ProgramData\AWatch-rus\deployment-config.json
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3.5 Валидация deployment-а (PowerShell report)
|
7.3 Конфигурация
|
||||||
|
|
||||||
```powershell
|
sudo install -m 0640 awatch-rus.env /etc/awatch-rus/awatch-rus.env
|
||||||
$report = C:\Program Files\AWatch-rus\windows\validate-deployment.ps1 `
|
|
||||||
-ConfigPath C:\ProgramData\AWatch-rus\deployment-config.json
|
|
||||||
$report | ConvertTo-Json -Depth 12
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
Проверить права:
|
||||||
|
|
||||||
## 4) Что должно появиться на Windows после установки
|
sudo chown root:root /etc/awatch-rus/awatch-rus.env
|
||||||
|
sudo chmod 0640 /etc/awatch-rus/awatch-rus.env
|
||||||
|
|
||||||
- `C:\Program Files\AWatch-rus\bin`
|
8. systemd units
|
||||||
- `C:\ProgramData\AWatch-rus\deployment-config.json`
|
|
||||||
- `C:\ProgramData\AWatch-rus\launch-watchers.ps1`
|
|
||||||
- `C:\ProgramData\AWatch-rus\recovery-loop.ps1`
|
|
||||||
- `C:\ProgramData\AWatch-rus\browser-domains-native-collector.ps1`
|
|
||||||
- `C:\ProgramData\AWatch-rus\web-category-rules.json`
|
|
||||||
- `C:\ProgramData\AWatch-rus\logs\`
|
|
||||||
|
|
||||||
Задачи планировщика:
|
8.1 Пример backend service
|
||||||
|
|
||||||
- `ActivityWatch Launch [<user>]` (per-user, при логоне)
|
[Unit]
|
||||||
- `ActivityWatch Recovery` (system-level recovery)
|
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
|
||||||
|
|
||||||
## 5) Полная валидация потока данных
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
|
||||||
### 5.1 На Windows-хосте
|
Если фактическое имя backend binary отличается, заменить "awatch-rus-backend" на актуальное имя из release artifact.
|
||||||
|
|
||||||
Проверить процессы:
|
8.2 Пример health service
|
||||||
|
|
||||||
```powershell
|
[Unit]
|
||||||
Get-Process aw-watcher-afk,aw-watcher-window -ErrorAction SilentlyContinue
|
Description=AWatch-rus health daemon
|
||||||
Get-CimInstance Win32_Process | ? { $_.CommandLine -like '*browser-domains-native-collector.ps1*' } | select ProcessId,SessionId,CommandLine
|
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
|
||||||
|
|
||||||
```powershell
|
[Install]
|
||||||
Get-ScheduledTask | ? { $_.TaskName -like 'ActivityWatch*' } | select TaskName,State
|
WantedBy=multi-user.target
|
||||||
```
|
|
||||||
|
|
||||||
### 5.2 На сервере ActivityWatch API
|
8.3 Применение unit files
|
||||||
|
|
||||||
```bash
|
sudo systemctl daemon-reload
|
||||||
curl -sS http://127.0.0.1:5600/api/0/buckets | jq 'keys'
|
sudo systemctl enable --now awatch-rus-backend.service
|
||||||
```
|
sudo systemctl enable --now aw-rus-healthd.service
|
||||||
|
|
||||||
Ожидаемые bucket'ы:
|
Если конкретный unit не используется в текущей инсталляции, не создавать фиктивный сервис. Документировать фактический набор services.
|
||||||
|
|
||||||
- `aw-watcher-afk_<HOST>`
|
9. Развёртывание Rust Agent
|
||||||
- `aw-watcher-window_<HOST>`
|
|
||||||
- `aw-watcher-web-<browser>_<HOST>`
|
|
||||||
- `aw-detmir-web-category_<HOST>` (категоризованный поток)
|
|
||||||
- `aw-dlp-endpoint-signals_<HOST>` (endpoint сигналы)
|
|
||||||
- `aw-dlp-review_<HOST>` (ручная классификация через UI)
|
|
||||||
- `aw-dlp-rules_<HOST>` (suppress/rule записи через UI)
|
|
||||||
|
|
||||||
Проверка событий браузера:
|
9.1 Установка agent binary
|
||||||
|
|
||||||
```bash
|
sudo mkdir -p /opt/awatch-rus/bin
|
||||||
curl -sS "http://127.0.0.1:5600/api/0/buckets/aw-watcher-web-edge_<HOST>/events?limit=5" | jq
|
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
|
||||||
|
|
||||||
```bash
|
9.2 Пример agent service
|
||||||
curl -sS "http://127.0.0.1:5600/api/0/buckets/aw-detmir-web-category_<HOST>/events?limit=5" | jq
|
|
||||||
```
|
|
||||||
|
|
||||||
Проверка DLP review/rules:
|
[Unit]
|
||||||
|
Description=AWatch-rus Rust Agent
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
```bash
|
[Service]
|
||||||
curl -sS "http://127.0.0.1:5600/api/0/buckets/aw-dlp-review_<HOST>/events?limit=20" | jq
|
Type=simple
|
||||||
curl -sS "http://127.0.0.1:5600/api/0/buckets/aw-dlp-rules_<HOST>/events?limit=20" | jq
|
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
|
||||||
|
|
||||||
Ожидаемые поля review:
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
|
||||||
- `reviewId`
|
9.3 Запуск agent
|
||||||
- `signalType`
|
|
||||||
- `verdict`
|
|
||||||
- `category`
|
|
||||||
- `comment`
|
|
||||||
- `archived`
|
|
||||||
|
|
||||||
Ожидаемые поля rules:
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable --now awatch-rus-agent.service
|
||||||
|
sudo systemctl status awatch-rus-agent.service --no-pager
|
||||||
|
|
||||||
- `ruleId`
|
10. Развёртывание портала
|
||||||
- `signalType`
|
|
||||||
- `match`
|
|
||||||
- `category`
|
|
||||||
- `comment`
|
|
||||||
- `enabled`
|
|
||||||
|
|
||||||
---
|
Портальный слой AWatch-rus зафиксирован как Rust server-rendered HTML + HTMX-compatible JSON API.
|
||||||
|
|
||||||
## 6) Сопровождение (обязательно)
|
10.1 Общий порядок
|
||||||
|
|
||||||
### 6.1 Backup перед любыми изменениями
|
build portal/backend binary
|
||||||
|
→ install binary
|
||||||
|
→ install templates/static assets, если они выделены отдельно
|
||||||
|
→ update portal env
|
||||||
|
→ restart portal service
|
||||||
|
→ smoke check HTTP/API routes
|
||||||
|
|
||||||
На Proxmox:
|
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. Патчи в развернутой среде
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
```bash
|
|
||||||
vzdump <CT_ID> --mode snapshot --compress zstd --storage <BACKUP_STORAGE>
|
vzdump <CT_ID> --mode snapshot --compress zstd --storage <BACKUP_STORAGE>
|
||||||
```
|
|
||||||
|
|
||||||
Конфиги внутри CT:
|
Внутри сервера:
|
||||||
|
|
||||||
```bash
|
sudo tar -C / -czf /root/awatch-rus-backup-$(date +%Y%m%d-%H%M%S).tgz \
|
||||||
pct exec <CT_ID> -- tar -C / -czf <PRIVATE_BACKUP_DIR>/activitywatch-config-backup.tgz \
|
etc/awatch-rus \
|
||||||
etc/activitywatch \
|
opt/awatch-rus \
|
||||||
etc/systemd/system/activitywatch-server.service \
|
var/lib/awatch-rus \
|
||||||
opt/activitywatch/webui-ru \
|
var/log/awatch-rus
|
||||||
opt/activitywatch/releases
|
|
||||||
```
|
|
||||||
|
|
||||||
### 6.2 Обновление сервера
|
Если данные большие, backup "/var/lib/awatch-rus" выполнять отдельной процедурой согласно backup policy.
|
||||||
|
|
||||||
1. Обновить `AW_SERVER_VERSION` и `AW_SERVER_DOWNLOAD_URL` в
|
11.4 Установка нового binary
|
||||||
`<PROJECT_ROOT>/private-config/deploy.env`
|
|
||||||
2. Выполнить:
|
|
||||||
|
|
||||||
```bash
|
Сохранить предыдущую версию:
|
||||||
<PROJECT_ROOT>/proxmox/push-aw-artifacts.sh
|
|
||||||
pct enter <CT_ID>
|
|
||||||
bash <CT_BOOTSTRAP_DIR>/install_aw_server.sh
|
|
||||||
bash <CT_BOOTSTRAP_DIR>/apply_webui_ru_patch.sh
|
|
||||||
systemctl restart activitywatch-server.service
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Повторить валидацию API/UI.
|
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)
|
||||||
|
|
||||||
### 6.3 Rollback
|
Установить новый artifact:
|
||||||
|
|
||||||
RU patch rollback:
|
sudo install -m 0755 dist/awatch-rus-release/bin/* /opt/awatch-rus/bin/
|
||||||
|
|
||||||
```bash
|
11.5 Restart services
|
||||||
cp /opt/activitywatch/webui-ru/index.html.bak.<timestamp> /opt/activitywatch/webui-ru/index.html
|
|
||||||
systemctl restart activitywatch-server.service
|
|
||||||
```
|
|
||||||
|
|
||||||
Полный rollback:
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl restart awatch-rus-backend.service
|
||||||
|
sudo systemctl restart aw-rus-healthd.service
|
||||||
|
|
||||||
- восстановить CT из snapshot/backup;
|
Если патч касается только agent:
|
||||||
- проверить API и Web UI;
|
|
||||||
- проверить доступность для Windows-клиентов.
|
|
||||||
|
|
||||||
---
|
sudo systemctl restart awatch-rus-agent.service
|
||||||
|
|
||||||
## 7) Безопасность
|
Если сервис в текущем контуре называется иначе, использовать фактическое имя systemd unit.
|
||||||
|
|
||||||
- Не хранить реальные приватные параметры вне `<PROJECT_ROOT>/private-config/deploy.env`.
|
12. Smoke-тесты после патча
|
||||||
- Не открывать `5600/tcp` в интернет напрямую.
|
|
||||||
- Публиковать через VPN или reverse proxy с ограничением доступа.
|
|
||||||
- Перед изменениями всегда делать backup.
|
|
||||||
|
|
||||||
---
|
12.1 Systemd
|
||||||
|
|
||||||
## 8) Короткий чек-лист ввода в эксплуатацию
|
systemctl --failed --no-pager
|
||||||
|
systemctl status awatch-rus-backend.service --no-pager
|
||||||
|
systemctl status aw-rus-healthd.service --no-pager
|
||||||
|
|
||||||
1. Заполнен `<PROJECT_ROOT>/private-config/deploy.env`.
|
12.2 Rust operational checks
|
||||||
2. Выполнен `<PROJECT_ROOT>/proxmox/create-ct.sh`.
|
|
||||||
3. Выполнен `<PROJECT_ROOT>/proxmox/push-aw-artifacts.sh`.
|
detmir-status --json
|
||||||
4. В CT выполнены `<CT_BOOTSTRAP_DIR>/install_aw_server.sh` и `<CT_BOOTSTRAP_DIR>/apply_webui_ru_patch.sh`.
|
detmir-check --json
|
||||||
5. Сервер API/порт/UI проверены.
|
detmir-dlp --json
|
||||||
6. На Windows выполнен `deploy-domain-users.ps1`.
|
|
||||||
7. Проверены процессы, задачи и bucket'ы.
|
Если отдельная команда не установлена в данном контуре, это не считается ошибкой только при наличии документированного исключения.
|
||||||
8. Зафиксированы параметры и дата ввода.
|
|
||||||
|
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 открываются
|
||||||
|
|
||||||
|
13. 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
|
||||||
|
|
||||||
|
14. 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 наружу.
|
||||||
|
|
||||||
|
15. Security hardening
|
||||||
|
|
||||||
|
Обязательные правила:
|
||||||
|
|
||||||
|
- не публиковать API напрямую в интернет;
|
||||||
|
- использовать VPN/reverse proxy/access control;
|
||||||
|
- закрыть лишние порты;
|
||||||
|
- хранить secrets вне git;
|
||||||
|
- ограничить права systemd services;
|
||||||
|
- использовать отдельного service user, если это поддерживается текущей установкой;
|
||||||
|
- включить backup;
|
||||||
|
- проверять логи после каждого патча;
|
||||||
|
- не использовать demo fixtures как production data;
|
||||||
|
- не смешивать реальные ФИО/IP/hostname с публичными demo screenshots.
|
||||||
|
|
||||||
|
16. Проверка перед вводом в эксплуатацию
|
||||||
|
|
||||||
|
Минимальный 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/оператор зафиксированы
|
||||||
|
|
||||||
|
17. Что больше не использовать как основной путь
|
||||||
|
|
||||||
|
Не использовать как основной 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-путь.
|
||||||
|
|
||||||
|
18. Короткий 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/<binary> /opt/awatch-rus/bin/<binary>
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl restart <service>.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>.service
|
||||||
|
|
||||||
|
19. Правило актуализации этого документа
|
||||||
|
|
||||||
|
Если меняется:
|
||||||
|
|
||||||
|
- имя binary;
|
||||||
|
- имя systemd unit;
|
||||||
|
- порт;
|
||||||
|
- endpoint;
|
||||||
|
- путь хранения данных;
|
||||||
|
- способ сборки;
|
||||||
|
- способ доставки artifacts;
|
||||||
|
- smoke-test;
|
||||||
|
- rollback procedure;
|
||||||
|
|
||||||
|
то этот файл должен обновляться в том же commit, что и изменение кода или deployment-конфигурации.
|
||||||
|
|||||||
Reference in New Issue
Block a user