Corp/WEBSOCKET_1006_QUICK_GUIDE.md

10 KiB
Raw Blame History

WebSocket 1006 - Быстрая шпаргалка

🚨 Экспресс-диагностика (5 минут)

# Подключитесь к серверу
ssh igor@172.11.0.11

# Скопируйте и выполните все команды сразу:

echo "=== 1. Статус сервисов ==="
sudo systemctl status nginx eusrr redis --no-pager

echo -e "\n=== 2. JWT/Auth ошибки (САМОЕ ВАЖНОЕ!) ==="
sudo journalctl -u eusrr -n 200 --no-pager | grep -i "websocket\|authentication\|jwt\|token\|4401"

echo -e "\n=== 3. Redis доступен? ==="
redis-cli ping

echo -e "\n=== 4. Ошибки Nginx ==="
sudo tail -20 /var/log/nginx/error.log

echo -e "\n=== 5. Активные WS соединения ==="
sudo netstat -an | grep :9000 | grep ESTABLISHED | wc -l

echo -e "\n=== 6. Тест WS подключения ==="
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" \
  -H "Sec-WebSocket-Version: 13" -H "Sec-WebSocket-Key: test" \
  http://127.0.0.1:9000/ws/ 2>&1 | head -20

🎯 Что проверить по результатам

Результат 2 (JWT/Auth ошибки):

Если видите:

  • Authentication failed → Проблема с токеном
  • code=4401 → Пользователь не аутентифицирован
  • Invalid token → Токен истек или неправильный
  • AnonymousUser → Токен не передается

➡️ Действие: Проверьте JWT (см. раздел JWT ниже)

Результат 3 (Redis):

Если НЕ вернул PONG:

sudo systemctl restart redis
redis-cli ping

Результат 4 (Nginx):

Если видите ошибки:

  • upstream prematurely closed → Backend закрыл соединение (проверьте Django логи)
  • upstream timed out → Таймаут (но у вас уже 7 дней, странно)
  • 502/504 → Backend недоступен (проверьте Gunicorn)

Результат 5 (Соединения):

Если 0: Никто не подключен (нормально, если нет пользователей онлайн) Если >0: Есть активные соединения → значит у кого-то работает!

Результат 6 (Тест):

Ожидается:

  • HTTP/1.1 403 (нет токена) или
  • HTTP/1.1 101 (успех, если токен не требуется на этом уровне)

Если 502 или 504: Проблема с Gunicorn


🔑 Проверка JWT (если проблема в auth)

На сервере:

cd /home/igor/EUSRR/backend
source venv/bin/activate
python manage.py shell
from users.models import User
from rest_framework_simplejwt.tokens import AccessToken
from datetime import datetime

# Замените на проблемного пользователя
user = User.objects.get(username="USERNAME")
token = AccessToken.for_user(user)
print(f"✅ Token: {token}")
print(f"📅 Expires: {datetime.fromtimestamp(token['exp'])}")
exit()

В браузере пользователя (F12 → Console):

// Проверьте токен
const token = localStorage.getItem('access_token');
console.log('Token:', token ? 'Exists' : 'Missing!');

// Декодируйте и проверьте срок
if (token) {
    const payload = JSON.parse(atob(token.split('.')[1]));
    console.log('Expires:', new Date(payload.exp * 1000));
    console.log('Expired?', new Date() > new Date(payload.exp * 1000));
}

// Переподключите WS
window.userWebSocket?.reconnect();

🌐 Проверка на стороне клиента

Пользователь в браузере (F12):

1. Network → WS:

  • Ищите /ws/ соединение
  • Status должен быть 101 Switching Protocols
  • Если (pending) → не подключается
  • Если красное → смотрите код ошибки

2. Console:

// Ручное подключение для теста
const token = localStorage.getItem('access_token');
const ws = new WebSocket(`ws://172.11.0.11/ws/?token=${token}`);

ws.onopen = () => console.log('✅ OPEN');
ws.onerror = (e) => console.error('❌ ERROR:', e);
ws.onclose = (e) => console.log('❌ CLOSE:', e.code, e.reason);

// Подождите 5 секунд...
// Если не открылось - проблема!

3. Режим инкогнито:

  • Ctrl+Shift+N (Chrome/Edge)
  • Войдите в систему
  • Если работает → проблема в расширениях браузера
  • Если не работает → проблема на сервере/сети

🔧 Быстрые фиксы

Фикс 1: Увеличить время жизни токена

ssh igor@172.11.0.11
cd /home/igor/EUSRR/backend
nano eusrr_backend/settings.py

Найдите и измените:

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(hours=24),  # Было меньше?
    # ...
}
sudo systemctl restart eusrr

Фикс 2: Добавить CORS заголовки (если нужно)

sudo nano /etc/nginx/sites-enabled/eusrr

В оба блока location /ws/ (HTTP и HTTPS) добавьте:

proxy_set_header Origin $http_origin;
sudo nginx -t && sudo systemctl reload nginx

Фикс 3: Перезапустить всё

sudo systemctl restart redis
sudo systemctl restart eusrr
sudo systemctl reload nginx

📊 Мониторинг в реальном времени

Логи Django (в отдельном терминале):

ssh igor@172.11.0.11
sudo journalctl -u eusrr -f | grep -i "websocket\|connect\|disconnect"

Что смотреть:

  • Consumer connected → Кто-то подключился ✅
  • Consumer disconnected → Кто-то отключился
  • code=4401 → Проблема с auth ❌
  • Traceback → Ошибка в коде ❌

Активные соединения (в отдельном терминале):

ssh igor@172.11.0.11
watch -n 2 'sudo netstat -an | grep :9000 | grep ESTABLISHED | wc -l'

Число должно расти/уменьшаться при подключении/отключении пользователей.


🐛 Включить расширенное логирование

Если не понятно что происходит:

ssh igor@172.11.0.11
cd /home/igor/EUSRR/backend
nano communications/user_consumer.py

В начало класса UserConsumer добавьте:

import logging
logger = logging.getLogger(__name__)

В метод connect() в самое начало:

async def connect(self):
    client = self.scope.get('client', ['unknown', 0])
    logger.info(f"🔌 WS: {client[0]} trying to connect")
    logger.info(f"👤 User: {self.scope.get('user')}")
    
    self.user = self.scope.get("user")
    
    if not self.user or isinstance(self.user, AnonymousUser):
        logger.warning(f"❌ WS: {client[0]} - No auth")
        await self.close(code=4401)
        return
    
    logger.info(f"✅ WS: {self.user.username} connected")
    # ...остальной код...

Сохраните и перезапустите:

sudo systemctl restart eusrr
sudo journalctl -u eusrr -f | grep WS

Теперь будете видеть каждую попытку подключения!


❓ FAQ

Работает у одних, не работает у других?

→ Проблема в JWT токене или сети/браузере клиента

Не работает ни у кого?

→ Проблема на сервере (Redis, Gunicorn, Nginx)

Работало, потом перестало?

→ Проверьте что изменилось (обновление кода, конфигурации)

Периодически отваливается?

→ Может быть нормально (пинги каждые 20 сек должны держать)

Ошибка только в определенной сети?

→ Firewall/proxy блокирует WebSocket

Работает в инкогнито, не работает в обычном режиме?

→ Расширения браузера блокируют (AdBlock, Privacy Badger и т.д.)


📞 Экстренная помощь

Если совсем всё плохо, соберите дамп:

ssh igor@172.11.0.11
cd /tmp

# Один файл со всей инфой
{
  echo "=== SERVICES ==="
  sudo systemctl status nginx eusrr redis --no-pager
  echo -e "\n=== DJANGO LOGS ==="
  sudo journalctl -u eusrr --since "1 hour ago" --no-pager
  echo -e "\n=== NGINX ERRORS ==="
  sudo tail -100 /var/log/nginx/error.log
  echo -e "\n=== NGINX CONFIG ==="
  sudo cat /etc/nginx/sites-enabled/eusrr
  echo -e "\n=== GUNICORN PROCESSES ==="
  ps aux | grep gunicorn
  echo -e "\n=== REDIS INFO ==="
  redis-cli INFO
  echo -e "\n=== CONNECTIONS ==="
  sudo netstat -an | grep :9000
} > ws_debug_$(date +%Y%m%d_%H%M%S).txt

# Скачайте файл
ls -lh ws_debug_*.txt

Скопируйте на локальную машину:

scp igor@172.11.0.11:/tmp/ws_debug_*.txt .

✅ Контрольный список

  • Все сервисы running (nginx, eusrr, redis)
  • Redis отвечает на PONG
  • В логах нет ошибок JWT/auth
  • Нет ошибок в Nginx error.log
  • Тест curl возвращает 403 или 101 (не 502/504)
  • Токен существует в localStorage браузера
  • Токен не истек
  • Попробовали в режиме инкогнито
  • Проверили на другом устройстве/сети

Если все пункты ✅ но не работает → пришлите дамп для детального анализа.