17 KiB
Файловая 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-onlytelemetry/export
<GATEWAY_HOST>- backend узел file-1C analytics
ClickHouse- ETL/ingest
- detections
- cases
- proof-check
<GRAFANA_HOST>- production
Grafana - готовые dashboards
- production
<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. Что считается готовым контуром
Контур считается рабочим, если одновременно выполняется всё:
- Windows scheduled task
ActivityWatch File1C Uploadзапускается раз в 15 минут. - На
<GATEWAY_HOST>работаетaw-1c-ingest.timer; цикл сбора и записи в ClickHouse выполняется раз в 15 минут. - На
<GATEWAY_HOST>работаетaw-1c-proofcheck.timer. ClickHouseсодержит живые строки в:documentsreglog_eventsaudit_eventshost_eventsentity_timelinedetectionscases
- В
Grafanaна<GRAFANA_HOST>dashboards открываются и смотрят в datasourceclickhouse-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.jsonC:\Program Files\AWatch-rus\windows\aw-windows-telemetry.exeC:\ProgramData\AWatch-rus\export-upload-file-1c-telemetry.ps1C:\ProgramData\AWatch-rus\logs\file1c-telemetry.logC:\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.serviceaw-1c-ingest.timeraw-1c-proofcheck.serviceaw-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-exec1c-file-ops1c-file-audit1c-file-detections1c-file-investigation1c-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.exeArguments: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_eventsaudit_eventshost_eventsentity_timelinedetectionscases
8. Production state, подтверждённое в этой среде
Подтверждённые живые значения:
documents = 46reglog_events = 94audit_events = 46host_events = 1entity_timeline = 186detections = 12cases = 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_snapshotrisk_tag=busy, если база занята.
9.4 host_events
Минимальный безопасный host telemetry слой:
- CPU
- RAM
- free disk
- RDP sessions
- backup flag
10. Hardening, уже внесённый в контур
В production-контуре уже реализовано:
scpretries на 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 сторона
- Проверить scheduled task.
- Проверить лог
file1c-telemetry.log. - Запустить 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 сторона
- Проверить
ClickHouse. - Проверить
landing. - Запустить ingest вручную:
AW_1C_ROOT=/opt/activitywatch/clickhouse-1c /usr/local/bin/aw-1c-ingest-rust --root /opt/activitywatch/clickhouse-1c
- Проверить 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)