Трафик не считается¶
Пользователь подключён к VPN-серверу, но в панели видно 0 трафика, или трафик не растёт несмотря на активное соединение.
Симптомы¶
- Пользователь жалуется: «VPN работает, но трафик не сгорает» или «трафик 0»
- В XUI панели сервера клиент есть, но поле
traffic(upload/download) равно 0 - В MySQL таблице
vpn_user_server_accountтрафик не обновляется - В Grafana: active sessions есть, но traffic_hourly не растёт
Диагностика¶
1. Найти аккаунт в MySQL¶
./scripts/ssh-internal.sh 10.99.87.62 \
"docker exec vpn-db mysql -uvpn -p'$(см. Vaultwarden → Databases)' vpn \
-e 'SELECT id, account, valid_to FROM account WHERE account = \"ACCOUNT_NUMBER\";'"
Здесь id — внутренний ID аккаунта (не 16-значный номер).
2. Найти клиентов в vpn_user_server_account¶
./scripts/ssh-internal.sh 10.99.87.62 \
"docker exec vpn-db mysql -uvpn -p'$(см. Vaultwarden → Databases)' vpn \
-e 'SELECT vusa.server_id, s.name, vusa.xray_uuid, vusa.traffic_bytes \
FROM vpn_user_server_account vusa \
JOIN server s ON s.id = vusa.server_id \
WHERE vusa.account_id = ACCOUNT_ID \
ORDER BY vusa.traffic_bytes DESC LIMIT 10;'"
Если traffic_bytes = 0 на всех серверах — трафик не поступает совсем.
3. Проверить UUID клиента в XUI панели¶
Зайти в XUI панель нужного сервера (порт 1443, user: shadmin):
curl -sk -X POST "https://SERVER_IP:1443/login" \
-d "username=shadmin&password=$(см. Vaultwarden → VPN Servers → xui-password)" \
-c /tmp/xui_cookie
curl -sk "https://SERVER_IP:1443/panel/api/inbounds/list" \
-b /tmp/xui_cookie | python3 -c "
import sys, json
data = json.load(sys.stdin)
for ib in data.get('obj', []):
for c in json.loads(ib.get('settings', '{}')).get('clients', []):
print(c['id'], c.get('email', ''), c.get('up', 0), c.get('down', 0))
" | grep -i "UUID_OR_EMAIL"
UUID клиента в XUI должен совпадать с xray_uuid из MySQL.
4. Проверить Traffic Pipeline в VCS worker¶
./scripts/ssh-internal.sh 10.99.87.249 \
"docker logs vpn-config-worker --tail 200 | grep -i traffic"
В норме должны быть строки Traffic flush: N records written каждые 30 секунд.
5. Проверить данные трафика в PostgreSQL VCS¶
./scripts/ssh-internal.sh 10.99.87.249 \
"docker exec vpn-config-postgres psql -U vpnconfig vpnconfig \
-c \"SELECT server_id, client_id, upload_bytes, download_bytes, recorded_at \
FROM traffic_hourly \
ORDER BY recorded_at DESC LIMIT 10;\""
Если данные есть в PostgreSQL, но не в MySQL — проблема в синхронизации между VCS и backend.
Причины и решения¶
| Симптом | Причина | Решение |
|---|---|---|
| UUID в XUI не совпадает с MySQL | Email-маппинг сломан | Пересоздать клиента через fill_configs |
| UUID совпадает, трафик 0 в XUI | Пользователь не использует этот сервер | Норма — проверить другие серверы |
| Трафик в XUI есть, в MySQL нет | Traffic Pipeline не работает | Перезапустить VCS worker |
| Трафик в PostgreSQL VCS есть, в MySQL нет | Проблема в mysql_sync или backend | Проверить mysql_sync логи |
| Email формат неверный | Ручная правка / баг | Email должен быть UUID@vpn (inbound 1) или UUID@iN (inbound N>1) |
Исправление¶
Принудительный flush трафика через VCS¶
./scripts/ssh-internal.sh 10.99.87.249 \
"curl -sX POST http://localhost:8000/api/v1/sync/full \
-H 'X-API-Key: VazVBGPEBLTG7qNVOQQu4xR21DWTBi4_fodUjuEojnE'"
Запустить fill_configs для исправления UUID/email¶
./scripts/ssh-internal.sh 10.99.87.249 \
"curl -sX POST 'http://localhost:8000/api/v1/sync/fill-missing-configs?dry_run=false' \
-H 'X-API-Key: VazVBGPEBLTG7qNVOQQu4xR21DWTBi4_fodUjuEojnE'"
Проверить email-формат в конкретной XUI-панели¶
# Email должен совпадать с паттерном: <uuid>@vpn для inbound_id=1
# или <uuid>@i<N> для inbound_id=N
curl -sk "https://SERVER_IP:1443/panel/api/inbounds/list" \
-b /tmp/xui_cookie | python3 -c "
import sys, json
data = json.load(sys.stdin)
for ib in data.get('obj', []):
for c in json.loads(ib.get('settings', '{}')).get('clients', []):
email = c.get('email', '')
ok = email.endswith('@vpn') or '@i' in email
print('OK' if ok else 'BAD', email, c['id'])
"
Эскалация¶
- Если UUID-маппинг массово сломан на сервере — проверить последние изменения в fill_configs (git log)
- Если трафик не считается для всех пользователей — P1, Traffic Pipeline завис, нужен перезапуск worker
- Задокументировать инцидент (monorepo:
incidents/TRAFFIC-NOT-COUNTING-YYYY-MM-DD.md)
См. также: Маппинг аккаунтов · VPN Config Service · DevOps скрипты → audit_account