Files
AWatch-rus/docs/1C_FILE_ANALYTICS_STACK_RU.md
T

17 KiB
Raw Blame History

Файловая 1С AWatch-rus: промышленное развёртывание ClickHouse/Grafana контура

Документ фиксирует production-схему для файловой 1С без вмешательства в содержимое базы.

Контур предназначен для среды, где:

  • 1С работает как файловая база на Windows/RDP host;
  • на хост 1С нельзя ставить тяжёлые сервисы;
  • нужен audit/detection/investigation слой, а не только KPI;
  • Grafana уже поднята отдельно от ноутбука.

Документ описывает реально проверенную схему, а не только scaffold.

1. Границы и гарантии

Этот контур:

  • не открывает 1С через COM, Configurator, Designer;
  • не меняет 1Cv8.1CD;
  • работает только как read-only export/telemetry вокруг файловой базы;
  • читает:
    • ibases.v8i,
    • наличие и размеры 1Cv8.1CD,
    • 1Cv8Log,
    • файловые маркеры занятости,
    • host telemetry Windows.

Это принципиально. Любые действия, которые пишут обратно в 1С, в этот контур не входят.

2. Production topology

2.1 Узлы

  • <WINDOWS_HOST>
    • Windows / RDP host с файловой 1С
    • источник read-only telemetry/export
  • <GATEWAY_HOST>
    • backend узел file-1C analytics
    • ClickHouse
    • ETL/ingest
    • detections
    • cases
    • proof-check
  • <GRAFANA_HOST>
    • production Grafana
    • готовые dashboards
  • <AW_SERVER_HOST>
    • основной AW-rus сервер
    • в file-1C pipeline не является обязательным runtime-компонентом

2.2 Поток данных

Windows file 1C host (<WINDOWS_HOST>)
  ├─ ibases.v8i inventory
  ├─ 1Cv8.1CD file metadata
  ├─ 1Cv8Log metadata
  ├─ file-base busy markers
  └─ host telemetry
          ↓
aw-windows-telemetry.exe file1c-upload
          ↓  scp
<GATEWAY_HOST> /opt/activitywatch/clickhouse-1c/landing/*
          ↓
aw-1c-ingest-rust
  ├─ raw tables
  ├─ core tables
  ├─ entity_timeline
  ├─ detections
  └─ cases
          ↓
Grafana <GRAFANA_HOST>

3. Что считается готовым контуром

Контур считается рабочим, если одновременно выполняется всё:

  1. Windows scheduled task ActivityWatch File1C Upload запускается раз в 15 минут.
  2. На <GATEWAY_HOST> работает aw-1c-ingest.timer; цикл сбора и записи в ClickHouse выполняется раз в 15 минут.
  3. На <GATEWAY_HOST> работает aw-1c-proofcheck.timer.
  4. ClickHouse содержит живые строки в:
    • documents
    • reglog_events
    • audit_events
    • host_events
    • entity_timeline
    • detections
    • cases
  5. В Grafana на <GRAFANA_HOST> dashboards открываются и смотрят в datasource clickhouse-1c.

Скриншоты не входят в file-1C контур. ActivityWatch File1C Upload передает только метаданные файловых баз, журналов, audit/host JSONL и registry workbook. PNG/скриншоты при работе с 1C не копируются в ClickHouse landing и не должны синхронизироваться как DLP evidence.

4. Каталоги и артефакты

4.1 На Windows <WINDOWS_HOST>

  • C:\ProgramData\AWatch-rus\deployment-config.json
  • C:\Program Files\AWatch-rus\windows\aw-windows-telemetry.exe
  • C:\ProgramData\AWatch-rus\export-upload-file-1c-telemetry.ps1
  • C:\ProgramData\AWatch-rus\logs\file1c-telemetry.log
  • C:\ProgramData\AWatch-rus\ssh\awops_ed25519

4.2 На backend <GATEWAY_HOST>

  • root:
    • /opt/activitywatch/clickhouse-1c
  • landing:
    • /opt/activitywatch/clickhouse-1c/landing/documents
    • /opt/activitywatch/clickhouse-1c/landing/reglog
    • /opt/activitywatch/clickhouse-1c/landing/audit
    • /opt/activitywatch/clickhouse-1c/landing/host
  • archive:
    • /opt/activitywatch/clickhouse-1c/archive
  • runtime:
    • /opt/activitywatch/clickhouse-1c/.env
    • /opt/activitywatch/clickhouse-1c/etl/config.yml
    • /usr/local/bin/aw-1c-ingest-rust
    • /opt/activitywatch/clickhouse-1c/.venv

4.3 systemd units на <GATEWAY_HOST>

  • aw-1c-ingest.service
  • aw-1c-ingest.timer
  • aw-1c-proofcheck.service
  • aw-1c-proofcheck.timer

5. Развёртывание с нуля

5.1 Backend на <GATEWAY_HOST>

Playbook:

  • [ansible/deploy_file_1c_analytics.yml](<PROJECT_ROOT>/ansible/deploy_file_1c_analytics.yml)

Команда:

ansible-playbook -i <PROJECT_ROOT>/ansible/inventory.ini \
  <PROJECT_ROOT>/ansible/deploy_file_1c_analytics.yml

Что делает:

  • ставит docker.io, docker-compose, python3-venv, python3-pip;
  • раскладывает clickhouse-1c в /opt/activitywatch/clickhouse-1c;
  • поднимает ClickHouse;
  • создаёт .env и etl/config.yml;
  • устанавливает Rust-бинарник aw-1c-ingest-rust;
  • включает aw-1c-ingest.timer с периодом 15 минут;
  • включает aw-1c-proofcheck.timer.

5.2 Windows uploader на <WINDOWS_HOST>

Playbook:

  • [ansible/deploy_file_1c_windows_telemetry.yml](<PROJECT_ROOT>/ansible/deploy_file_1c_windows_telemetry.yml)

Команда:

ansible-playbook -i <PROJECT_ROOT>/ansible/inventory.ini \
  <PROJECT_ROOT>/ansible/deploy_file_1c_windows_telemetry.yml

Что делает:

  • копирует Rust-бинарник aw-windows-telemetry.exe;
  • оставляет export-upload-file-1c-telemetry.ps1 как legacy fallback;
  • обновляет deployment-config.json;
  • создаёт/обновляет scheduled task ActivityWatch File1C Upload на запуск aw-windows-telemetry.exe file1c-upload.

5.3 Production Grafana на <GRAFANA_HOST>

Grafana уже должна содержать:

  • datasource clickhouse-1c
  • folder 1C File Analytics
  • dashboards:
    • 1c-file-exec
    • 1c-file-ops
    • 1c-file-audit
    • 1c-file-detections
    • 1c-file-investigation
    • 1c-file-data-quality

См.:

  • [docs/1C_GRAFANA_DEPLOYMENT_RU.md](<PROJECT_ROOT>/docs/1C_GRAFANA_DEPLOYMENT_RU.md)

6. Обязательный post-step на Windows

6.1 Почему он нужен

Для этой конкретной задачи production-схема должна использовать рабочий interactive principal, а не SYSTEM, потому что на текущем Windows-хосте SYSTEM-запуск внешних процессов нестабилен.

Проверенная рабочая учётка:

  • HOST-EXAMPLE\Администратор

6.2 Проверка scheduled task

На <WINDOWS_HOST>:

$task = Get-ScheduledTask -TaskName "ActivityWatch File1C Upload"
$task.Actions[0].Execute
$task.Actions[0].Arguments
$task.Principal.UserId

Ожидаемо:

  • Execute: C:\Program Files\AWatch-rus\windows\aw-windows-telemetry.exe
  • Arguments: file1c-upload --config-path "C:\ProgramData\AWatch-rus\deployment-config.json"
  • Principal: Администратор / HOST-EXAMPLE\Администратор

6.3 Проверка

schtasks /Query /TN "\ActivityWatch File1C Upload" /V /FO LIST

Ожидается:

  • Run As User: Администратор
  • Last Result: 0

6.4 Важный нюанс

Код rollout уже пропатчен так, чтобы не откатывать существующий principal обратно на SYSTEM при следующих targeted deploy.

Это защита от регрессии, но не хранение пароля в репозитории.

7. Ручная верификация после deploy

7.1 Windows task

schtasks /Run /TN "\ActivityWatch File1C Upload"
schtasks /Query /TN "\ActivityWatch File1C Upload" /V /FO LIST

Локальный лог:

Get-Content -Tail 80 C:\ProgramData\AWatch-rus\logs\file1c-telemetry.log

7.2 Backend ingestion

AW_1C_ROOT=/opt/activitywatch/clickhouse-1c /usr/local/bin/aw-1c-ingest-rust --root /opt/activitywatch/clickhouse-1c

7.3 Freshness proof

AW_1C_ROOT=/opt/activitywatch/clickhouse-1c /opt/activitywatch/clickhouse-1c/ops/check_ingest_freshness.sh

Ожидается строка вида:

freshness documents=0h reglog=0h audit=0h host=0h threshold=8h

7.4 Счётчики ClickHouse

docker exec aw-rus-1c-clickhouse clickhouse-client \
  --user default --password change-me --database analytics_1c \
  -q "SELECT count() FROM documents"

Аналогично:

  • reglog_events
  • audit_events
  • host_events
  • entity_timeline
  • detections
  • cases

8. Production state, подтверждённое в этой среде

Подтверждённые живые значения:

  • documents = 46
  • reglog_events = 94
  • audit_events = 46
  • host_events = 1
  • entity_timeline = 186
  • detections = 12
  • cases = 12

Подтверждённые состояния:

  • aw-1c-proofcheck.timer = active/enabled
  • scheduled task \ActivityWatch File1C Upload:
    • Run As User: Администратор
    • Last Result: 0

9. Что именно собирается

9.1 documents

Не документы изнутри 1С, а inventory snapshot по файловым базам:

  • имя infobase;
  • owner;
  • статус online/busy;
  • стабильно вычисляемый doc_id по baseId или path.

9.2 reglog_events

Не парсинг бинарного reglog, а metadata/operational signals:

  • наличие и активность 1Cv8Log;
  • размер .lgp;
  • busy markers;
  • 1Cv8JobScheduler.

9.3 audit_events

Snapshot-события по infobase:

  • inventory_snapshot
  • risk_tag=busy, если база занята.

9.4 host_events

Минимальный безопасный host telemetry слой:

  • CPU
  • RAM
  • free disk
  • RDP sessions
  • backup flag

10. Hardening, уже внесённый в контур

В production-контуре уже реализовано:

  • scp retries на Windows;
  • абсолютный путь до scp.exe;
  • runtime logging exporter-а;
  • BOM-safe loader;
  • flock-lock на ingest cycle;
  • min_file_age_seconds=180 против чтения недокачанных файлов;
  • proofcheck.timer каждые 6 часов;
  • auto-case по detections;
  • защита от отката task principal при targeted deploy.

11. Известные failure modes

11.1 Last Result != 0 у scheduled task

Проверить:

Get-Content -Tail 100 C:\ProgramData\AWatch-rus\logs\file1c-telemetry.log

Типовые причины:

  • wrong principal;
  • нет доступа к awops_ed25519;
  • runtime ошибка PowerShell;
  • не найден scp.exe.

11.2 proofcheck красный

Проверить:

systemctl status aw-1c-proofcheck.timer
systemctl status aw-1c-ingest.timer
AW_1C_ROOT=/opt/activitywatch/clickhouse-1c /opt/activitywatch/clickhouse-1c/ops/check_ingest_freshness.sh

Типовые причины:

  • Windows task не сработал;
  • файлы не попали в landing;
  • ingest не сработал;
  • ClickHouse не поднят.

11.3 ClickHouse пустой

Проверить:

ls -la /opt/activitywatch/clickhouse-1c/landing/documents
ls -la /opt/activitywatch/clickhouse-1c/archive/documents
docker ps --format '{{.Names}}' | rg aw-rus-1c-clickhouse

12. Recovery-порядок

12.1 Windows сторона

  1. Проверить scheduled task.
  2. Проверить лог file1c-telemetry.log.
  3. Запустить exporter вручную:
& "C:\Program Files\AWatch-rus\windows\aw-windows-telemetry.exe" file1c-upload --config-path "C:\ProgramData\AWatch-rus\deployment-config.json"

12.2 Backend сторона

  1. Проверить ClickHouse.
  2. Проверить landing.
  3. Запустить ingest вручную:
AW_1C_ROOT=/opt/activitywatch/clickhouse-1c /usr/local/bin/aw-1c-ingest-rust --root /opt/activitywatch/clickhouse-1c
  1. Проверить freshness.

13. Ручное изменение параметров

Использовать этот раздел, если нужно временно изменить production-параметры без полного redeploy. После ручного изменения желательно синхронизировать те же значения в Ansible vars, иначе следующий полный deploy может вернуть прежние настройки.

13.1 Изменить период Windows file-1C upload

На Windows/RDP host в elevated PowerShell:

$taskName = "ActivityWatch File1C Upload"
$minutes = 15

$configPath = "C:\ProgramData\AWatch-rus\deployment-config.json"
$config = Get-Content -Raw -LiteralPath $configPath | ConvertFrom-Json
$config.analytics.file1cAutomation.intervalMinutes = $minutes
$config | ConvertTo-Json -Depth 12 | Set-Content -LiteralPath $configPath -Encoding UTF8

$task = Get-ScheduledTask -TaskName $taskName
$trigger = New-ScheduledTaskTrigger -Once -At ((Get-Date).Date) `
  -RepetitionInterval (New-TimeSpan -Minutes $minutes) `
  -RepetitionDuration (New-TimeSpan -Days 3650)

Set-ScheduledTask -TaskName $taskName `
  -Action $task.Actions `
  -Trigger $trigger `
  -Principal $task.Principal `
  -Settings $task.Settings

Проверить:

Get-ScheduledTaskInfo -TaskName "ActivityWatch File1C Upload"
(Get-ScheduledTask -TaskName "ActivityWatch File1C Upload").Actions

13.2 Изменить параметры file-1C upload

Основной файл:

C:\ProgramData\AWatch-rus\deployment-config.json

Ключевые поля:

{
  "analytics": {
    "file1cAutomation": {
      "intervalMinutes": 15,
      "targetHost": "<GATEWAY_HOST>",
      "targetUser": "igor",
      "remoteRoot": "/opt/activitywatch/clickhouse-1c/landing",
      "remoteKeyPath": "C:\\ProgramData\\AWatch-rus\\ssh\\awops_ed25519",
      "registryWorkbookPath": "E:\\USER1\\СПИСОК ПРЕДПРИЯТИЙ И ИХ РАСПРЕДЕЛЕНИЕ.xlsx"
    }
  }
}

Smoke-run после изменения:

& "C:\Program Files\AWatch-rus\windows\aw-windows-telemetry.exe" file1c-upload --config-path "C:\ProgramData\AWatch-rus\deployment-config.json"
Get-Content -LiteralPath "C:\ProgramData\AWatch-rus\logs\file1c-telemetry.log" -Tail 40 -Encoding UTF8

13.3 Изменить период server-side ingest

На <GATEWAY_HOST>:

sudo mkdir -p /etc/systemd/system/aw-1c-ingest.timer.d

sudo tee /etc/systemd/system/aw-1c-ingest.timer.d/override.conf >/dev/null <<'EOF'
[Timer]
OnUnitActiveSec=
OnUnitActiveSec=15min
EOF

sudo systemctl daemon-reload
sudo systemctl restart aw-1c-ingest.timer
systemctl list-timers aw-1c-ingest.timer

13.4 Изменить защитную задержку ingest

Файл на <GATEWAY_HOST>:

sudo nano /opt/activitywatch/clickhouse-1c/etl/config.yml

Параметр:

min_file_age_seconds: 180

Нормальный диапазон: 60-180 секунд. Не ставить слишком низко: ingest может прочитать файл во время SCP-загрузки.

Проверить:

sudo systemctl start aw-1c-ingest.service
sudo journalctl -u aw-1c-ingest.service -n 50 --no-pager

14. Безопасность

  • Не хранить пароль администратора Windows в git.
  • Не хранить секреты в docs.
  • Не переводить этот контур в COM/Designer без отдельного решения.
  • Не давать AI write-back в 1С.
  • Не менять 1Cv8.1CD.

15. Связанные файлы

  • [clickhouse-1c/README.md](<PROJECT_ROOT>/clickhouse-1c/README.md)
  • [adk-rust/crates/aw-1c-ingest](<PROJECT_ROOT>/adk-rust/crates/aw-1c-ingest)
  • [clickhouse-1c/ops/run_ingest_cycle.sh](<PROJECT_ROOT>/clickhouse-1c/ops/run_ingest_cycle.sh) - legacy rollback path
  • [clickhouse-1c/ops/check_ingest_freshness.sh](<PROJECT_ROOT>/clickhouse-1c/ops/check_ingest_freshness.sh)
  • [ansible/deploy_file_1c_analytics.yml](<PROJECT_ROOT>/ansible/deploy_file_1c_analytics.yml)
  • [ansible/deploy_file_1c_windows_telemetry.yml](<PROJECT_ROOT>/ansible/deploy_file_1c_windows_telemetry.yml)
  • [windows/export-upload-file-1c-telemetry.ps1](<PROJECT_ROOT>/windows/export-upload-file-1c-telemetry.ps1)
  • [docs/wiki/File-1C-Analytics.md](<PROJECT_ROOT>/docs/wiki/File-1C-Analytics.md)