Перейти к содержанию

Трафик не считается

Пользователь подключён к 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