Corp/WEBSOCKET_1006_QUICK_GUIDE.md

340 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# WebSocket 1006 - Быстрая шпаргалка
## 🚨 Экспресс-диагностика (5 минут)
```bash
# Подключитесь к серверу
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`:**
```bash
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)
### На сервере:
```bash
cd /home/igor/EUSRR/backend
source venv/bin/activate
python manage.py shell
```
```python
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):
```javascript
// Проверьте токен
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:**
```javascript
// Ручное подключение для теста
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: Увеличить время жизни токена
```bash
ssh igor@172.11.0.11
cd /home/igor/EUSRR/backend
nano eusrr_backend/settings.py
```
Найдите и измените:
```python
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(hours=24), # Было меньше?
# ...
}
```
```bash
sudo systemctl restart eusrr
```
### Фикс 2: Добавить CORS заголовки (если нужно)
```bash
sudo nano /etc/nginx/sites-enabled/eusrr
```
В оба блока `location /ws/` (HTTP и HTTPS) добавьте:
```nginx
proxy_set_header Origin $http_origin;
```
```bash
sudo nginx -t && sudo systemctl reload nginx
```
### Фикс 3: Перезапустить всё
```bash
sudo systemctl restart redis
sudo systemctl restart eusrr
sudo systemctl reload nginx
```
---
## 📊 Мониторинг в реальном времени
### Логи Django (в отдельном терминале):
```bash
ssh igor@172.11.0.11
sudo journalctl -u eusrr -f | grep -i "websocket\|connect\|disconnect"
```
**Что смотреть:**
- `Consumer connected` → Кто-то подключился ✅
- `Consumer disconnected` → Кто-то отключился
- `code=4401` → Проблема с auth ❌
- Traceback → Ошибка в коде ❌
### Активные соединения (в отдельном терминале):
```bash
ssh igor@172.11.0.11
watch -n 2 'sudo netstat -an | grep :9000 | grep ESTABLISHED | wc -l'
```
Число должно расти/уменьшаться при подключении/отключении пользователей.
---
## 🐛 Включить расширенное логирование
Если не понятно что происходит:
```bash
ssh igor@172.11.0.11
cd /home/igor/EUSRR/backend
nano communications/user_consumer.py
```
В начало класса `UserConsumer` добавьте:
```python
import logging
logger = logging.getLogger(__name__)
```
В метод `connect()` в самое начало:
```python
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")
# ...остальной код...
```
Сохраните и перезапустите:
```bash
sudo systemctl restart eusrr
sudo journalctl -u eusrr -f | grep WS
```
Теперь будете видеть каждую попытку подключения!
---
## ❓ FAQ
### Работает у одних, не работает у других?
→ Проблема в JWT токене или сети/браузере клиента
### Не работает ни у кого?
→ Проблема на сервере (Redis, Gunicorn, Nginx)
### Работало, потом перестало?
→ Проверьте что изменилось (обновление кода, конфигурации)
### Периодически отваливается?
→ Может быть нормально (пинги каждые 20 сек должны держать)
### Ошибка только в определенной сети?
→ Firewall/proxy блокирует WebSocket
### Работает в инкогнито, не работает в обычном режиме?
→ Расширения браузера блокируют (AdBlock, Privacy Badger и т.д.)
---
## 📞 Экстренная помощь
Если совсем всё плохо, соберите дамп:
```bash
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
```
Скопируйте на локальную машину:
```bash
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 браузера
- [ ] Токен не истек
- [ ] Попробовали в режиме инкогнито
- [ ] Проверили на другом устройстве/сети
**Если все пункты ✅ но не работает** → пришлите дамп для детального анализа.