Назначение: Network Traffic Analytics + UI + agent-API + интеграции (BGBilling/DPI/LoSIP/AI). Главный «мозг» поверх ISP-инфраструктуры.
| Хост | 10.0.0.13 (Debian 13) |
| AWG IP | 10.9.0.196 |
| Каталог | /opt/LoNGFW/ |
| UI | http://10.0.0.13:8080 (через Flask-Login) |
| Agent API | http://10.9.0.196:8080/api/agent/* (Bearer-token) |
| Запуск | cd /opt/LoNGFW && docker compose up -d |
| Логи | docker logs longfw-<service> -f |
| container | роль | порты наружу |
|---|---|---|
longfw-mysql |
MySQL 8.4 (subscribers/users/alerts/call_log/...) | — |
longfw-clickhouse |
ClickHouse 24.3 (flows TTL 30д, clickstream TTL 7д) | — |
longfw-redis |
Redis 7 (cache + pub/sub + lock + poller-snapshots) | — |
longfw-web |
Flask + gunicorn UI/API | 8080 |
longfw-billing-sync |
rsync SORM + sync subscribers из BGBilling каждые 60с | — |
longfw-poller |
единый опросчик железа SNMP+SSH+telnet | — |
longfw-analyzer |
анализ трафика + alerts | — |
longfw-alerter |
уведомления Telegram/email | — |
longfw-dpi-state |
синк привязок DPI-шейпера каждую минуту | — |
longfw-ipfix-dpi |
парсер Full IPFIX от FastDPI | 1500/udp |
longfw-clickstream-dpi |
парсер Clickstream IPFIX | 1501/udp |
goflow2 |
NAT-events ESR ingester | 9995/udp, 9996/udp |
loshaper-api |
LoShaper REST API | 8090 |
losip-asterisk + losip-awg |
мини-АТС (см. losip) | 5060/udp, 10000-10200/udp, 8088 |
10.0.0.13:9996/udp → goflow2 → CH. Без bytes/packets (ESR не отдаёт).netflow=8) → 10.0.0.13:9995/udp (legacy goflow2) и :1500/udp (новый ipfix-dpi) → CH longfw.flows. С bytes/packets/drops/l7_proto/sni/mac/vlan/tos.ipfix_udp_collectors=10.0.0.13:1501) → clickstream-dpi → CH longfw.clickstream. HTTP Host / TLS SNI / DNS QNAME + поле locked (нижний бит = РКН-блок, не эвристика).10.9.0.197:3306 → billing-sync upsert каждые 60с → subscribers таблица.longfw-poller → Redis. Подробно: poller.| URL | Что |
|---|---|
/dashboard |
bandwidth chart + top hosts + 6 кликабельных карточек (РКН блоки/drops/binds/rogue IPs/alerts/должники) + pipeline status |
/hosts |
таблица абонентов с up/down/flows/last_seen + бейдж rogue (в клиентской CIDR без записи в биллинге) |
/host/<ip> |
карточка абонента: ФИО/тариф/баланс/адрес (BG+SORM merge), bandwidth chart с лимитом шейпера, hour-of-day + day-of-week, top dst/ports/protos, alerts, 📡 Сетевая локация (свитч+порт из poller) |
/dst/<ip> |
аналитика по dst IP |
/blocks |
блокировки (РКН + drops) с режимами block/policing/all |
/clickstream |
посещения доменов с режимами all/blocked/clean |
/alerts |
настройка правил + каналов |
/calls |
call log Asterisk + audio плеер |
/topology |
дерево ESR→CSW→OLT→ONT→абонент с live-статусом устройств |
/shaper/ |
LoShaper UI (apply, log, freshness) |
/users, /profile |
админка пользователей и профиль |
/settings/phones |
contract↔phone mapping для CRM-попапов |
/clickstream |
clickstream данные с локед-блоками |
/tickets |
helpdesk (manual create) |
/api/agent/*, Bearer-auth через LONGFW_AGENT_TOKEN)| endpoint | что |
|---|---|
lookup?q= |
поиск абонента (ФИО/IP/contract/phone, BG+SORM, по корням слов) |
subscribers?status=&tariff=&debt= |
списки с фильтрами |
subscriber/<id> |
карточка |
subscriber/<id>/diagnose |
full diag (subscriber+ping+shaper+alerts+blocks+traffic_24h+ONT) |
subscriber/<id>/ping |
TCP-probe |
subscriber/<id>/dhcp |
последние DHCP-сессии |
tariffs |
все тарифы + count + долги |
top_traffic?hours=&limit= |
топ потребителей по NetFlow |
capacity |
свободные порты + IP-пулы |
issues?since_hours= |
агрегат проблем |
device/<host>/ports |
кто на каком порту коммутатора |
olt/status, olt/health |
live OLT (cached) |
ont/<id>/state |
детальный state ONT (id = '2/1' / serial / IP) |
devices/snapshot |
агрегат всех устройств из poller |
topology/realtime |
для каждого устройства список портов с classification |
macs/find?mac= |
где сейчас виден MAC |
host/<ip>/location |
IP→MAC→switch+port (см. ниже) |
Полная спецификация: applications/LoNGFW/docs/AGENT-API.md.
| таблица | содержание |
|---|---|
users |
UI-юзеры (Flask-Login) + tg_id + notify_email + notify_enabled + is_admin |
subscribers |
PK (contract, ip). ФИО/тариф/баланс/адрес из BG (primary) + SORM (fallback) |
subscribers_sorm |
параллельная таблица из SORM CSV (зеркало схемы + sorm_dump_ts) |
networks |
классификация подсетей (10.1.4.0/24=GPON gray, 94.25.50.64/27=white, ...) |
dpi_shaper_bindings |
cache привязок DPI-шейпера (синкается dpi-state раз/мин) |
alerts, alert_channels, alert_rules |
алерт-система |
call_log |
журнал звонков Asterisk |
contract_phones |
contract↔phone mapping для notify-popup |
host_macs |
(planned) историческая IP↔MAC для rogue-tracking |
topology_runs |
журнал run'ов topology.run_full_sync() |
Миграции в /opt/LoNGFW/sql/mysql_migrations/NNN_*.sql.
| таблица | содержание | TTL |
|---|---|---|
longfw.flows |
NetFlow v9 + Full IPFIX (bytes/packets/drops/sni/l7_proto/mac/vlan/tos) | 30д |
longfw.clickstream |
HTTP Host + TLS SNI + DNS QNAME + locked флаг | 7д |
Миграции: /opt/LoNGFW/sql/clickhouse_init.sql.
/opt/LoNGFW/.env — НЕ в git. Ключевые:
MYSQL_PASSWORD=<...>
MYSQL_ROOT_PASSWORD=<...>
CH_PASSWORD=<...>
SECRET_KEY=<flask-session-key>
ALERT_ENCRYPTION_KEY=<Fernet-key>
# BGBilling
BGBILLING_DSN=mysql+pymysql://longfw_ro:aed8fe96448d7ac4809607b28db5df3a@10.9.0.197/bgbilling
BGBILLING_SYNC_INTERVAL=60
# Tokens
LONGFW_AGENT_TOKEN=<32-hex>
LOSHAPER_API_TOKEN=<32-hex>
NOTIFY_API_TOKEN=<32-hex>
# Network device discovery (для quick-actions)
DISCOVERY_DEFAULT_USER=maxonnet
DISCOVERY_DEFAULT_PASS=Go@Wood#1989!
DISCOVERY_DEFAULT_ENABLE=Drive@Hell#1989!
OLT_HOST=192.168.100.3
OLT_USER=maxonnet
OLT_PASS=8c61210b2b037821
# ESR (для poller poll_esr_fdb)
ESR_USER=maxonnet
ESR_PASSWORD=Go@Wood#1989!
ESR_BRIDGES=11,500
# Poller
POLL_BASE_SEC=60
POLL_HEALTH_SEC=120
POLL_MACS_SEC=120
POLL_OLT_SEC=120
# Auto-apply LoShaper
AUTO_APPLY_INTERVAL_SEC=300
# Excluded из аналитики (SNAT gateway)
ANALYTICS_EXCLUDE_IPS=94.25.50.66
DPI_SENSOR_IP=10.0.0.6
applications/LoNGFW/web/ — Flask app (blueprints/, templates/, static/, models.py, app.py)applications/LoNGFW/poller/poller.py — APScheduler job'ыapplications/LoNGFW/billing_sync/main.py — BGBilling rsync + syncapplications/LoNGFW/sql/mysql_migrations/*.sql — DDLapplications/LoNGFW/sql/clickhouse_init.sql — CH DDL# Локально (Mac)
cd ~/Projects/LoPlus/applications/LoNGFW
rsync -az ./ root@10.0.0.13:/opt/LoNGFW/
# Или конкретный файл
rsync -az web/blueprints/api.py root@10.0.0.13:/opt/LoNGFW/web/blueprints/api.py
# На сервере
ssh root@10.0.0.13 'cd /opt/LoNGFW && docker compose up -d --build --force-recreate web'
⚠️ COPY в Dockerfile = код запекается в image. Для изменений нужно up -d --build --force-recreate, не просто restart.
docker logs longfw-poller, docker exec longfw-redis redis-cli KEYS "device:*"docker logs longfw-billing-sync, проверить AWG ping 10.9.0.197docker logs loshaper-api, проверить SSH к DPI ssh root@10.9.0.198docker logs longfw-webdocker logs longfw-alerterChangelog