From c7a3f475e306678ec9e7d26ebd80f9ca40250bff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=9D=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Wed, 3 Dec 2025 11:09:18 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=80=D1=83=D0=BA=D0=BE=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B0=20=D0=BF=D0=BE=20=D0=B4=D0=B8=D0=B0?= =?UTF-8?q?=D0=B3=D0=BD=D0=BE=D1=81=D1=82=D0=B8=D0=BA=D0=B5=20WebSocket=20?= =?UTF-8?q?1006?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WEBSOCKET_1006_QUICK_GUIDE.md - быстрая шпаргалка (5 минут) - WEBSOCKET_1006_PRIORITY_CHECK.md - приоритетная диагностика - WEBSOCKET_1006_DIAGNOSTIC_PLAN.md - полный план диагностики - WEBSOCKET_1006_SUMMARY.md - сводка по проблеме - Обновлен README.md с ссылками на документацию --- README.md | 21 + WEBSOCKET_1006_DIAGNOSTIC_PLAN.md | 643 ++++++++++++++++++++++++++++++ WEBSOCKET_1006_PRIORITY_CHECK.md | 487 ++++++++++++++++++++++ WEBSOCKET_1006_QUICK_GUIDE.md | 339 ++++++++++++++++ WEBSOCKET_1006_SUMMARY.md | 254 ++++++++++++ 5 files changed, 1744 insertions(+) create mode 100644 WEBSOCKET_1006_DIAGNOSTIC_PLAN.md create mode 100644 WEBSOCKET_1006_PRIORITY_CHECK.md create mode 100644 WEBSOCKET_1006_QUICK_GUIDE.md create mode 100644 WEBSOCKET_1006_SUMMARY.md diff --git a/README.md b/README.md index 57254801..a95e3e37 100644 --- a/README.md +++ b/README.md @@ -318,6 +318,27 @@ python manage.py send_pending_notifications --batch-size=100 - Настройте файрвол - Используйте переменные окружения для секретов +## Документация и troubleshooting + +### Руководства по функциям +- [MESSAGE_EDITING_ANALYSIS.md](MESSAGE_EDITING_ANALYSIS.md) - Редактирование сообщений +- [POLLS_IMPLEMENTATION.md](POLLS_IMPLEMENTATION.md) - Система опросов +- [PERSONAL_CALENDAR_FEATURE.md](PERSONAL_CALENDAR_FEATURE.md) - Персональный календарь +- [REACTIONS_FROM_DATABASE.md](REACTIONS_FROM_DATABASE.md) - Система реакций +- [REQUESTS_RECIPIENTS_PLAN.md](REQUESTS_RECIPIENTS_PLAN.md) - Система получателей заявок + +### WebSocket диагностика +- **[WEBSOCKET_1006_QUICK_GUIDE.md](WEBSOCKET_1006_QUICK_GUIDE.md)** ⚡ - **Быстрая шпаргалка (5 минут)** +- [WEBSOCKET_1006_PRIORITY_CHECK.md](WEBSOCKET_1006_PRIORITY_CHECK.md) - Приоритетная диагностика +- [WEBSOCKET_1006_DIAGNOSTIC_PLAN.md](WEBSOCKET_1006_DIAGNOSTIC_PLAN.md) - Полный план диагностики +- [WEBSOCKET_KEEPALIVE_FIX.md](WEBSOCKET_KEEPALIVE_FIX.md) - Исправление keepalive +- [WEBSOCKET_UNIFIED_MIGRATION.md](WEBSOCKET_UNIFIED_MIGRATION.md) - Миграция на унифицированный WS + +### Рефакторинг и оптимизация +- [REFACTORING_SUMMARY.md](REFACTORING_SUMMARY.md) - Общий итог рефакторинга +- [CACHE_OPTIMIZATION_SUMMARY.md](CACHE_OPTIMIZATION_SUMMARY.md) - Оптимизация кеширования +- [API_REFACTORING_TESTING.md](API_REFACTORING_TESTING.md) - Тестирование API + ## Лицензия Проприетарное ПО © 2024-2025 Robotail diff --git a/WEBSOCKET_1006_DIAGNOSTIC_PLAN.md b/WEBSOCKET_1006_DIAGNOSTIC_PLAN.md new file mode 100644 index 00000000..891e3ccd --- /dev/null +++ b/WEBSOCKET_1006_DIAGNOSTIC_PLAN.md @@ -0,0 +1,643 @@ +# План диагностики ошибки WebSocket 1006 + +## Описание проблемы +У некоторых пользователей возникает ошибка **1006 (Abnormal Closure)** при попытке установить WebSocket соединение с сервером `172.11.0.11`. + +Код 1006 означает аномальное закрытие соединения без отправки Close frame, что обычно указывает на проблемы: +- На уровне прокси-сервера (Nginx) +- Сетевые проблемы +- Проблемы с аутентификацией/авторизацией +- Таймауты или неправильная конфигурация + +--- + +## Этап 1: Сбор информации о проблеме + +### 1.1 Определите паттерн +- [ ] **Какие пользователи затронуты?** + - Все пользователи или только некоторые? + - Есть ли общие признаки (отдел, роль, браузер, ОС)? + +- [ ] **Когда происходит ошибка?** + - При первом подключении к странице? + - После определенного периода работы? + - При переходе на определенные страницы (чаты, уведомления)? + +- [ ] **Воспроизводимость** + - Постоянная ошибка или периодическая? + - Можно ли воспроизвести на других устройствах под той же учетной записью? + +### 1.2 Проверьте браузер пользователя +Попросите пользователя открыть **DevTools** → **Console/Network** и проверить: + +```javascript +// В консоли браузера: +// 1. Проверить URL подключения +console.log('WebSocket URL:', window.userWebSocket?.ws?.url); + +// 2. Проверить статус соединения +console.log('WebSocket state:', window.userWebSocket?.ws?.readyState); +// 0 = CONNECTING, 1 = OPEN, 2 = CLOSING, 3 = CLOSED + +// 3. Проверить код закрытия +window.userWebSocket?.ws?.addEventListener('close', (event) => { + console.log('Close Code:', event.code); + console.log('Close Reason:', event.reason); + console.log('Was Clean:', event.wasClean); +}); +``` + +**Ожидаемые значения:** +- URL: `ws://172.11.0.11/ws/` или `wss://172.11.0.11/ws/` (для HTTPS) +- State: 1 (OPEN) при успешном подключении +- Code: 1006 при ошибке +- Reason: обычно пустая при 1006 +- wasClean: false при 1006 + +--- + +## Этап 2: Диагностика на сервере + +### 2.1 Проверьте текущую конфигурацию Nginx + +```bash +# Подключитесь к серверу +ssh igor@172.11.0.11 + +# Проверьте конфигурацию Nginx +sudo cat /etc/nginx/sites-enabled/eusrr + +# Проверьте на ошибки +sudo nginx -t +``` + +**✅ ТЕКУЩАЯ КОНФИГУРАЦИЯ ПРАВИЛЬНАЯ!** + +Ваша конфигурация уже содержит: +- ✅ Отдельный блок `location /ws/` для WebSocket (и для HTTP:80, и для HTTPS:443) +- ✅ Заголовки `Upgrade` и `Connection "upgrade"` +- ✅ `proxy_http_version 1.1` +- ✅ Большие таймауты (7 дней) +- ✅ `proxy_buffering off` для реалтайм данных + +**Это означает, что проблема НЕ в базовой конфигурации Nginx!** + +Переходите к следующим этапам диагностики. + +### 2.2 Проверьте логи Nginx + +```bash +# Логи ошибок Nginx +sudo tail -f /var/log/nginx/error.log + +# Логи доступа (фильтр по WebSocket) +sudo tail -f /var/log/nginx/access.log | grep '/ws/' + +# Поиск ошибок 1006 или подключений WebSocket +sudo grep -i "websocket\|upgrade\|101\|400\|502\|504" /var/log/nginx/error.log | tail -20 +``` + +**Что искать:** +- `upstream prematurely closed connection` - Gunicorn закрыл соединение +- `upstream timed out` - таймаут от backend +- `no live upstreams` - backend недоступен +- `400 Bad Request` - проблема с заголовками +- `502 Bad Gateway` - backend не отвечает +- `504 Gateway Timeout` - таймаут соединения + +### 2.3 Проверьте логи приложения (Gunicorn/Django) + +```bash +# Логи приложения EUSRR +sudo journalctl -u eusrr -f + +# Фильтр по WebSocket событиям +sudo journalctl -u eusrr -f | grep -i "websocket\|consumer\|connection" + +# Последние ошибки +sudo journalctl -u eusrr --since "1 hour ago" | grep -i "error\|exception\|traceback" +``` + +**Что искать:** +- `Consumer connected` / `Consumer disconnected` - логи подключений +- `Authentication failed` - проблемы с JWT/токеном +- `Exception in consumer` - ошибки в коде consumer +- Трассировки ошибок Python + +### 2.4 Проверьте статус сервисов + +```bash +# Статус Nginx +sudo systemctl status nginx + +# Статус приложения +sudo systemctl status eusrr + +# Статус Redis (для channels) +sudo systemctl status redis + +# Проверьте подключение к Redis +redis-cli ping +# Ожидается: PONG +``` + +--- + +## Этап 3: Тестирование WebSocket подключения + +### 3.1 Прямое подключение к Gunicorn (без Nginx) + +Временно проверьте, работает ли WebSocket напрямую: + +```bash +# На сервере проверьте порт Gunicorn (обычно 9000) +sudo netstat -tlnp | grep 9000 + +# Попробуйте подключиться через curl +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/ +``` + +**Ожидается:** +- Код ответа `101 Switching Protocols` при успехе +- Код `400` или `403` если есть проблемы с аутентификацией + +### 3.2 Тест через Nginx + +```bash +# С локальной машины +curl -i -N \ + -H "Connection: Upgrade" \ + -H "Upgrade: websocket" \ + -H "Sec-WebSocket-Version: 13" \ + -H "Sec-WebSocket-Key: test" \ + http://172.11.0.11/ws/ +``` + +Если ответ `502` или `504` - проблема в Nginx конфигурации. + +### 3.3 Тест с аутентификацией + +Создайте простой HTML файл для теста: + +```html + + + + + WS Test + + +

WebSocket Test

+
+ + + +``` + +--- + +## Этап 4: Исправление типичных проблем + +### 4.1 Проблема: Отсутствует отдельный блок для WebSocket + +**✅ У ВАС УЖЕ НАСТРОЕНО ПРАВИЛЬНО!** + +Ваша конфигурация уже содержит правильный блок `location /ws/` с нужными параметрами. + +**Пропустите этот пункт и переходите к 4.2** + +### 4.2 Проблема: Короткие таймауты + +**Симптомы:** +- Соединение работает, но закрывается через 30-60 секунд +- Код 1006 после периода неактивности + +**Решение:** +Увеличьте таймауты в Nginx (см. 4.1) и проверьте Gunicorn: + +```bash +# Проверьте настройки Gunicorn +sudo cat /etc/systemd/system/eusrr.service + +# Должен быть параметр --timeout +# ExecStart=.../gunicorn ... --timeout 300 +``` + +Если таймаут мал, увеличьте: +```bash +sudo nano /etc/systemd/system/eusrr.service +# Измените --timeout 300 (или добавьте если нет) + +sudo systemctl daemon-reload +sudo systemctl restart eusrr +``` + +### 4.3 Проблема: Ошибки аутентификации JWT + +**Симптомы:** +- Код 1006 сразу при подключении +- В логах Django: `Authentication failed` или `Invalid token` + +**Проверка:** +```python +# На сервере +cd /home/igor/EUSRR/backend +source venv/bin/activate +python manage.py shell + +from rest_framework_simplejwt.tokens import AccessToken +from users.models import User + +# Проверьте токен конкретного пользователя +user = User.objects.get(username='имя_пользователя') +token = AccessToken.for_user(user) +print(f"Token: {token}") +print(f"Valid: {token.check_exp(current_time=None)}") +``` + +**Решение:** +- Убедитесь, что токен передается правильно: `?token=...` +- Проверьте срок действия токена (`ACCESS_TOKEN_LIFETIME` в settings.py) +- Убедитесь, что `JWTAuthMiddleware` правильно настроен в `asgi.py` + +### 4.4 Проблема: Проблемы с CORS/Same-Origin Policy + +**Симптомы:** +- Ошибка только при подключении с определенных доменов +- В консоли браузера: CORS ошибки + +**Решение:** +Добавьте в Nginx заголовки CORS для WebSocket: + +```nginx +location /ws/ { + # ... существующие настройки ... + + # CORS для WebSocket (если нужно) + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; +} +``` + +### 4.5 Проблема: Redis недоступен + +**Симптомы:** +- WebSocket подключается, но не работает channel layer +- В логах: `Connection refused` к Redis + +**Проверка:** +```bash +# Проверьте Redis +redis-cli ping + +# Проверьте настройки в Django +cd /home/igor/EUSRR/backend +grep -A 10 "CHANNEL_LAYERS" eusrr_backend/settings.py +``` + +**Решение:** +```bash +# Запустите Redis если не работает +sudo systemctl start redis +sudo systemctl enable redis +``` + +--- + +## Этап 5: Специфичные сценарии + +### 5.1 Проблема только у некоторых пользователей + +**Возможные причины:** +1. **Корпоративный firewall** блокирует WebSocket +2. **Антивирус** блокирует соединения +3. **VPN/прокси** на стороне клиента +4. **Браузерные расширения** (блокировщики рекламы, privacy tools) + +**Диагностика:** +- Попросите пользователя попробовать в режиме инкогнито +- Попробуйте с другого устройства в той же сети +- Попробуйте с мобильного интернета (вне корп. сети) +- Отключите временно антивирус/расширения браузера + +### 5.2 Проблема только в определенное время + +**Возможные причины:** +1. Высокая нагрузка на сервер +2. Сетевые проблемы в определенное время +3. Бэкапы или cron задачи нагружающие сервер + +**Диагностика:** +```bash +# Мониторинг нагрузки +htop + +# Статистика соединений +sudo netstat -an | grep :9000 | wc -l + +# Проверьте cron задачи +crontab -l +sudo crontab -l +``` + +### 5.3 Проблема после обновления кода + +**Проверьте:** +1. Миграции базы данных применены +2. Статика собрана +3. Сервисы перезапущены + +```bash +cd /home/igor/EUSRR/backend +source venv/bin/activate + +# Миграции +python manage.py migrate + +# Статика +python manage.py collectstatic --noinput + +# Перезапуск +sudo systemctl restart eusrr +sudo systemctl reload nginx +``` + +--- + +## Этап 6: Мониторинг и логирование + +### 6.1 Добавьте расширенное логирование + +В `user_consumer.py` добавьте детальные логи: + +```python +import logging +logger = logging.getLogger(__name__) + +class UserConsumer(AsyncJsonWebsocketConsumer): + async def connect(self): + logger.info(f"[WS] Connection attempt from {self.scope.get('client')}") + logger.info(f"[WS] User: {self.scope.get('user')}") + logger.info(f"[WS] Headers: {dict(self.scope.get('headers', []))}") + + # ... existing code ... + + async def disconnect(self, code): + logger.warning(f"[WS] Disconnect: user={self.user.username if self.user else 'unknown'}, code={code}") + # ... existing code ... +``` + +### 6.2 Настройте мониторинг WebSocket соединений + +```bash +# Скрипт для мониторинга WebSocket +cat > /home/igor/monitor_ws.sh << 'EOF' +#!/bin/bash +while true; do + echo "=== $(date) ===" + echo "Active WebSocket connections:" + sudo netstat -an | grep :9000 | grep ESTABLISHED | wc -l + echo "" + sleep 10 +done +EOF + +chmod +x /home/igor/monitor_ws.sh +``` + +--- + +## Этап 7: Чек-лист быстрой проверки + +Для быстрой диагностики выполните: + +```bash +# 1. Сервисы работают? +sudo systemctl status nginx eusrr redis + +# 2. Порты слушают? +sudo netstat -tlnp | grep -E ":(80|9000|6379)" + +# 3. Ошибки в логах за последний час? +sudo journalctl -u eusrr --since "1 hour ago" | grep -i error +sudo grep -i error /var/log/nginx/error.log | tail -20 + +# 4. Конфигурация Nginx правильная? +sudo nginx -t + +# 5. Redis работает? +redis-cli ping + +# 6. WebSocket блок существует? +sudo grep -A 15 "location /ws/" /etc/nginx/sites-enabled/eusrr +``` + +--- + +## Этап 8: Рекомендуемая конфигурация Nginx + +**Полная рабочая конфигурация для WebSocket:** + +```nginx +server { + listen 80; + server_name corp.robotail.local 172.11.0.11 127.0.0.1; + + client_max_body_size 50m; + + # Логирование + access_log /var/log/nginx/eusrr_access.log; + error_log /var/log/nginx/eusrr_error.log warn; + + # Статика + location /static/ { + alias /home/igor/EUSRR/backend/staticfiles/; + autoindex off; + expires 30d; + add_header Cache-Control "public, max-age=2592000"; + } + + # Медиа + location /media/ { + alias /home/igor/EUSRR/backend/media/; + autoindex off; + } + + # WebSocket - КРИТИЧЕСКИ ВАЖНО: отдельный блок перед location / + location /ws/ { + proxy_pass http://127.0.0.1:9000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # WebSocket специфичные заголовки + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + # Таймауты для долгих соединений (7 дней) + proxy_connect_timeout 7d; + proxy_send_timeout 7d; + proxy_read_timeout 7d; + + # Отключаем буферизацию для реалтайм данных + proxy_buffering off; + + # Дополнительные настройки для стабильности + proxy_redirect off; + proxy_cache_bypass $http_upgrade; + } + + # API и основное приложение + location / { + proxy_pass http://127.0.0.1:9000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # Обычные таймауты для HTTP запросов + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + } +} +``` + +**Применение:** +```bash +# Сохраните конфигурацию +sudo nano /etc/nginx/sites-enabled/eusrr +# Вставьте конфигурацию выше + +# Проверьте +sudo nginx -t + +# Примените +sudo systemctl reload nginx + +# Проверьте логи +sudo tail -f /var/log/nginx/eusrr_error.log +``` + +--- + +## Итоговый алгоритм диагностики + +1. **Собрать информацию** (Этап 1) + - Кто, когда, при каких условиях сталкивается с ошибкой + +2. **Проверить сервер** (Этап 2) + - Nginx конфигурация + - Логи Nginx/Gunicorn/Redis + - Статус сервисов + +3. **Протестировать подключение** (Этап 3) + - Напрямую к Gunicorn + - Через Nginx + - С аутентификацией + +4. **Применить исправления** (Этап 4) + - Добавить отдельный блок `/ws/` + - Увеличить таймауты + - Проверить JWT аутентификацию + +5. **Специфичные случаи** (Этап 5) + - Сетевые ограничения + - Высокая нагрузка + - Проблемы после обновлений + +6. **Настроить мониторинг** (Этап 6) + - Расширенное логирование + - Скрипты мониторинга + +7. **Быстрая проверка** (Этап 7) + - Чек-лист из 6 команд + +8. **Применить эталонную конфигурацию** (Этап 8) + - Проверенная конфигурация Nginx + +--- + +## Полезные команды для копирования + +```bash +# === Быстрая диагностика === +# Подключение к серверу +ssh igor@172.11.0.11 + +# Проверка всех сервисов +sudo systemctl status nginx eusrr redis + +# Просмотр логов в реальном времени +sudo journalctl -u eusrr -f | grep -i "websocket\|error" + +# Проверка конфигурации +sudo nginx -t +sudo cat /etc/nginx/sites-enabled/eusrr | grep -A 20 "location /ws/" + +# Перезапуск после изменений +sudo systemctl reload nginx +sudo systemctl restart eusrr + +# === Мониторинг === +# Количество WebSocket соединений +watch -n 2 'sudo netstat -an | grep :9000 | grep ESTABLISHED | wc -l' + +# Последние ошибки +sudo journalctl -u eusrr --since "10 minutes ago" | grep -i error + +# === Тестирование === +# Тест WebSocket через curl +curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" \ + -H "Sec-WebSocket-Version: 13" -H "Sec-WebSocket-Key: test" \ + http://172.11.0.11/ws/ +``` + +--- + +## Ожидаемый результат + +После выполнения плана диагностики вы: +1. ✅ Определите точную причину ошибки 1006 +2. ✅ Примените соответствующее исправление +3. ✅ Настроите мониторинг для предотвращения проблем +4. ✅ Подтвердите, что WebSocket работает стабильно + +**Если проблема не решена после всех этапов:** +- Сделайте полный дамп логов (Nginx + Django + Redis) +- Проверьте сетевую инфраструктуру (firewall, routing) +- Рассмотрите переход на WSS (WebSocket Secure) через HTTPS diff --git a/WEBSOCKET_1006_PRIORITY_CHECK.md b/WEBSOCKET_1006_PRIORITY_CHECK.md new file mode 100644 index 00000000..16bdcc6f --- /dev/null +++ b/WEBSOCKET_1006_PRIORITY_CHECK.md @@ -0,0 +1,487 @@ +# WebSocket 1006 - Приоритетная диагностика + +## ✅ Конфигурация Nginx ПРАВИЛЬНАЯ + +Ваша текущая конфигурация Nginx уже содержит все необходимые настройки для WebSocket, поэтому проблема **НЕ** в базовой конфигурации. + +--- + +## 🎯 Наиболее вероятные причины (в порядке убывания) + +### 1. Проблемы с JWT аутентификацией (60% вероятность) + +**Симптомы:** +- Ошибка 1006 сразу при попытке подключения +- Работает у одних пользователей, не работает у других +- Может зависеть от времени (истекший токен) + +**Быстрая проверка:** +```bash +# На сервере проверьте логи Django +ssh igor@172.11.0.11 +sudo journalctl -u eusrr -n 100 | grep -i "websocket\|authentication\|jwt\|token" +``` + +**Что искать в логах:** +- `Authentication failed` +- `Invalid token` +- `Token has expired` +- `User not found` + +**Решение:** + +1. Проверьте настройки JWT в `settings.py`: +```bash +cd /home/igor/EUSRR/backend +grep -A 10 "SIMPLE_JWT" eusrr_backend/settings.py +``` + +2. Убедитесь, что токен передается правильно в JS: +```javascript +// В браузере пользователя (DevTools Console) +console.log('Token:', localStorage.getItem('access_token')); +console.log('WS URL:', window.userWebSocket?.ws?.url); +``` + +3. Увеличьте время жизни токена (если нужно): +```python +# settings.py +SIMPLE_JWT = { + 'ACCESS_TOKEN_LIFETIME': timedelta(hours=24), # Было меньше? + # ... +} +``` + +--- + +### 2. Проблемы с CORS/Заголовками Origin (25% вероятность) + +**Симптомы:** +- Работает при подключении с `corp.robotail.local`, не работает с `172.11.0.11` +- Работает в одном браузере, не работает в другом +- В консоли браузера могут быть предупреждения о CORS + +**Быстрая проверка:** +```bash +# Проверьте Access-Control заголовки +curl -I -H "Origin: http://172.11.0.11" http://172.11.0.11/ws/ +``` + +**Решение:** + +Добавьте CORS заголовки в блоки `/ws/` (для обоих серверов - HTTP и HTTPS): + +```nginx +location /ws/ { + # ... существующие настройки ... + + # Добавьте: + proxy_set_header Origin $http_origin; + + # Если нужен CORS (необязательно, но может помочь): + add_header 'Access-Control-Allow-Origin' '$http_origin' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Upgrade,Connection,Sec-WebSocket-Key,Sec-WebSocket-Version' always; +} +``` + +Примените: +```bash +sudo nginx -t && sudo systemctl reload nginx +``` + +--- + +### 3. Проблемы на стороне клиента (10% вероятность) + +**Симптомы:** +- Работает у большинства, не работает у конкретных пользователей +- Может зависеть от сети (офис vs дом) + +**Возможные причины:** +- Корпоративный firewall/proxy блокирует WebSocket +- Антивирус блокирует соединения +- Браузерные расширения (AdBlock, Privacy Badger, NoScript) +- VPN/туннель с проблемами + +**Диагностика:** + +Попросите пользователя: + +1. Открыть **режим инкогнито** (отключит расширения): +``` +Ctrl+Shift+N (Chrome/Edge) или Ctrl+Shift+P (Firefox) +``` + +2. Проверить в консоли браузера (F12 → Console): +```javascript +// Попробуйте подключиться вручную +const token = localStorage.getItem('access_token'); +const ws = new WebSocket(`ws://172.11.0.11/ws/?token=${token}`); + +ws.onopen = () => console.log('✅ Connected!'); +ws.onerror = (e) => console.error('❌ Error:', e); +ws.onclose = (e) => console.log('❌ Closed:', e.code, e.reason); +``` + +3. Попробовать с другого устройства/сети + +**Решение:** +- Добавить исключение в firewall/антивирус +- Отключить проблемные расширения +- Попробовать HTTPS (WSS) вместо HTTP (WS) + +--- + +### 4. Redis недоступен или перегружен (3% вероятность) + +**Симптомы:** +- Соединение устанавливается, но сразу закрывается +- Проблема у всех пользователей одновременно + +**Быстрая проверка:** +```bash +ssh igor@172.11.0.11 + +# Проверьте Redis +redis-cli ping +# Должно вернуть: PONG + +# Проверьте подключения к Redis +redis-cli CLIENT LIST | grep -c connected +# Должно быть разумное число (<1000) + +# Проверьте память Redis +redis-cli INFO memory | grep used_memory_human + +# Проверьте статус сервиса +sudo systemctl status redis +``` + +**Решение:** + +Если Redis не работает: +```bash +sudo systemctl restart redis +sudo systemctl enable redis +``` + +Если Redis перегружен (проверьте логи): +```bash +# Очистите кеш (ВНИМАНИЕ: это удалит все данные Redis!) +redis-cli FLUSHALL + +# Или перезапустите +sudo systemctl restart redis +``` + +--- + +### 5. Gunicorn worker умер или перегружен (2% вероятность) + +**Симптомы:** +- Периодические проблемы +- После перезапуска работает какое-то время + +**Быстрая проверка:** +```bash +ssh igor@172.11.0.11 + +# Проверьте статус Gunicorn +sudo systemctl status eusrr + +# Проверьте логи на ошибки +sudo journalctl -u eusrr --since "1 hour ago" | grep -i "error\|worker\|timeout" + +# Проверьте количество worker'ов +ps aux | grep gunicorn | grep -v grep +``` + +**Решение:** + +1. Проверьте конфигурацию Gunicorn: +```bash +sudo cat /etc/systemd/system/eusrr.service +``` + +Должно быть примерно так: +```ini +ExecStart=/home/igor/EUSRR/backend/venv/bin/gunicorn \ + --workers 4 \ + --worker-class uvicorn.workers.UvicornWorker \ + --bind 0.0.0.0:9000 \ + --timeout 300 \ + --access-logfile /var/log/eusrr/access.log \ + --error-logfile /var/log/eusrr/error.log \ + eusrr_backend.asgi:application +``` + +2. Если конфигурация неправильная, исправьте и перезапустите: +```bash +sudo systemctl daemon-reload +sudo systemctl restart eusrr +``` + +--- + +## 🚀 Быстрый чек-лист диагностики + +Выполните эти команды **по порядку**: + +```bash +# 1. Подключитесь к серверу +ssh igor@172.11.0.11 + +# 2. Проверьте все сервисы +sudo systemctl status nginx eusrr redis +# Все должны быть active (running) + +# 3. Проверьте JWT логи (САМОЕ ВАЖНОЕ!) +sudo journalctl -u eusrr -n 200 | grep -i "websocket\|authentication\|jwt" +# Ищите ошибки аутентификации + +# 4. Проверьте Redis +redis-cli ping +# Должно вернуть: PONG + +# 5. Проверьте ошибки Nginx +sudo tail -50 /var/log/nginx/error.log +# Не должно быть ошибок 502/504 + +# 6. Проверьте активные WebSocket соединения +sudo netstat -an | grep :9000 | grep ESTABLISHED +# Должны быть подключения + +# 7. Тест WebSocket вручную +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/ +# Должен вернуть 403 (нет токена) или 101 (успех с токеном) +``` + +--- + +## 🔍 Расширенная диагностика JWT (если проблема в аутентификации) + +### На сервере: + +```bash +cd /home/igor/EUSRR/backend +source venv/bin/activate + +# Запустите Django shell +python manage.py shell +``` + +```python +# В Django shell: +from users.models import User +from rest_framework_simplejwt.tokens import AccessToken +from datetime import datetime + +# Проверьте пользователя, у которого проблема +username = "имя_пользователя" # Замените на реального пользователя +user = User.objects.get(username=username) + +# Создайте новый токен +token = AccessToken.for_user(user) +print(f"User: {user.username}") +print(f"Token: {token}") +print(f"Expires at: {datetime.fromtimestamp(token['exp'])}") + +# Проверьте валидность +try: + token.check_exp() + print("✅ Token is valid") +except Exception as e: + print(f"❌ Token error: {e}") + +# Выход +exit() +``` + +### В браузере пользователя (F12 → Console): + +```javascript +// 1. Проверьте текущий токен +const token = localStorage.getItem('access_token'); +console.log('Token:', token); + +// 2. Декодируйте токен (без проверки подписи) +if (token) { + const parts = token.split('.'); + if (parts.length === 3) { + const payload = JSON.parse(atob(parts[1])); + console.log('Token payload:', payload); + console.log('Expires:', new Date(payload.exp * 1000)); + console.log('Is expired:', new Date() > new Date(payload.exp * 1000)); + } +} + +// 3. Попробуйте переподключиться с токеном +if (window.userWebSocket) { + window.userWebSocket.reconnect(); +} +``` + +--- + +## 📋 Если проблема только у некоторых пользователей + +### Соберите данные от пользователя: + +1. **Браузер и ОС** + - Chrome/Firefox/Edge/Safari? + - Windows/Mac/Linux? + - Версия браузера? + +2. **Сеть** + - Офисная сеть или домашняя? + - VPN включен? + - Антивирус работает? + +3. **Консоль браузера** (F12 → Console) + - Есть ли красные ошибки? + - Что показывает WebSocket в Network → WS? + +4. **Воспроизведение** + - Постоянная проблема или периодическая? + - На других устройствах та же проблема? + +### Тест в режиме инкогнито: + +1. Откройте инкогнито (Ctrl+Shift+N) +2. Войдите в систему +3. Попробуйте использовать функции с WebSocket +4. Если **работает в инкогнито** → проблема в расширениях браузера +5. Если **не работает в инкогнито** → проблема в сети/firewall + +--- + +## 🛠️ Временное решение для срочных случаев + +Если нужно срочно дать пользователю доступ, попробуйте: + +### 1. Увеличить время жизни токена + +```python +# backend/eusrr_backend/settings.py +SIMPLE_JWT = { + 'ACCESS_TOKEN_LIFETIME': timedelta(hours=24), # Было 1 час? + 'REFRESH_TOKEN_LIFETIME': timedelta(days=7), + # ... +} +``` + +Перезапустите: +```bash +sudo systemctl restart eusrr +``` + +### 2. Добавить больше логирования в consumer + +```python +# backend/communications/user_consumer.py +import logging +logger = logging.getLogger(__name__) + +class UserConsumer(AsyncJsonWebsocketConsumer): + async def connect(self): + # Добавьте в начало метода: + client = self.scope.get('client', ['unknown', 0]) + logger.info(f"[WS CONNECT] Client: {client[0]}:{client[1]}") + logger.info(f"[WS CONNECT] User: {self.scope.get('user')}") + logger.info(f"[WS CONNECT] Path: {self.scope.get('path')}") + + self.user = self.scope.get("user") + + if not self.user or isinstance(self.user, AnonymousUser) or not self.user.is_authenticated: + logger.warning(f"[WS CONNECT] Authentication failed for {client[0]}") + await self.close(code=4401) + return + + logger.info(f"[WS CONNECT] Success for user {self.user.username}") + # ...остальной код... +``` + +Перезапустите и проверьте логи: +```bash +sudo systemctl restart eusrr +sudo journalctl -u eusrr -f | grep "WS CONNECT" +``` + +--- + +## ✅ После исправления + +### Проверьте работоспособность: + +1. **В браузере** (F12 → Network → WS): + - Соединение должно быть зеленым + - Status: 101 Switching Protocols + - Должны приходить ping каждые 20 секунд + +2. **На сервере**: +```bash +# Активные соединения +watch -n 2 'sudo netstat -an | grep :9000 | grep ESTABLISHED | wc -l' +# Число должно расти при подключении пользователей + +# Логи без ошибок +sudo journalctl -u eusrr -f | grep -i websocket +# Не должно быть ошибок +``` + +3. **Функциональность**: + - Новые сообщения приходят без обновления страницы + - Уведомления появляются в реальном времени + - Бейдж чатов обновляется + +--- + +## 📞 Если ничего не помогло + +Соберите полный дамп для анализа: + +```bash +# На сервере +cd /tmp + +# Конфигурация +sudo cat /etc/nginx/sites-enabled/eusrr > ws_debug_nginx.conf +sudo cat /etc/systemd/system/eusrr.service > ws_debug_systemd.service + +# Логи (последний час) +sudo journalctl -u eusrr --since "1 hour ago" > ws_debug_django.log +sudo tail -500 /var/log/nginx/error.log > ws_debug_nginx_error.log +sudo tail -500 /var/log/nginx/access.log | grep '/ws/' > ws_debug_nginx_ws.log + +# Статус +sudo systemctl status nginx eusrr redis > ws_debug_status.txt +redis-cli INFO > ws_debug_redis.txt +ps aux | grep gunicorn > ws_debug_gunicorn.txt + +# Создайте архив +tar -czf ws_debug_$(date +%Y%m%d_%H%M%S).tar.gz ws_debug_* + +# Скачайте архив на локальную машину +# scp igor@172.11.0.11:/tmp/ws_debug_*.tar.gz . +``` + +Отправьте архив для детального анализа. + +--- + +## 🎯 Итого: Порядок действий + +1. ✅ **Проверьте JWT логи** (60% вероятность проблемы здесь) +2. ✅ **Проверьте CORS/Origin заголовки** (25% вероятность) +3. ✅ **Попросите пользователя попробовать инкогнито** (10% вероятность) +4. ✅ **Проверьте Redis** (3% вероятность) +5. ✅ **Проверьте Gunicorn workers** (2% вероятность) + +**Начните с пункта 1 - это самая частая причина!** diff --git a/WEBSOCKET_1006_QUICK_GUIDE.md b/WEBSOCKET_1006_QUICK_GUIDE.md new file mode 100644 index 00000000..1c7b8941 --- /dev/null +++ b/WEBSOCKET_1006_QUICK_GUIDE.md @@ -0,0 +1,339 @@ +# 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 браузера +- [ ] Токен не истек +- [ ] Попробовали в режиме инкогнито +- [ ] Проверили на другом устройстве/сети + +**Если все пункты ✅ но не работает** → пришлите дамп для детального анализа. diff --git a/WEBSOCKET_1006_SUMMARY.md b/WEBSOCKET_1006_SUMMARY.md new file mode 100644 index 00000000..b67a25f3 --- /dev/null +++ b/WEBSOCKET_1006_SUMMARY.md @@ -0,0 +1,254 @@ +# Диагностика WebSocket 1006 - Сводка + +## 📚 Созданные документы + +### 1. **WEBSOCKET_1006_QUICK_GUIDE.md** ⚡ (НАЧНИТЕ ЗДЕСЬ!) +**Для:** Быстрой диагностики (5 минут) +**Содержит:** +- Экспресс-скрипт для проверки всех компонентов +- Расшифровку результатов +- Быстрые фиксы +- Команды для мониторинга в реальном времени +- Краткий FAQ + +### 2. **WEBSOCKET_1006_PRIORITY_CHECK.md** +**Для:** Детальной диагностики с приоритетами +**Содержит:** +- 5 наиболее вероятных причин (с процентами) +- Детальные инструкции для каждой причины +- Решения и обходные пути +- Чек-лист после исправления + +### 3. **WEBSOCKET_1006_DIAGNOSTIC_PLAN.md** +**Для:** Полной методологии диагностики +**Содержит:** +- 8 этапов диагностики от простого к сложному +- Все возможные сценарии проблем +- Примеры конфигураций +- Скрипты для мониторинга +- Эталонная конфигурация Nginx + +--- + +## 🎯 Быстрый старт + +### Шаг 1: Экспресс-диагностика (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: Интерпретация результатов + +**Результат 2 (JWT/Auth):** +- Если видите `Authentication failed`, `code=4401`, `Invalid token` → **Проблема в JWT!** +- Переходите к разделу "Проверка JWT" в WEBSOCKET_1006_QUICK_GUIDE.md + +**Результат 3 (Redis):** +- Если НЕ `PONG` → перезапустите Redis: `sudo systemctl restart redis` + +**Результат 4 (Nginx errors):** +- Если видите `502` или `504` → проблема с Gunicorn +- Если видите `upstream prematurely closed` → проверьте Django логи + +**Результат 6 (Test):** +- `403` - нормально (нет токена) +- `502/504` - проблема с backend + +### Шаг 3: Быстрые фиксы (если нужно) + +**Фикс 1: Перезапустить всё** +```bash +sudo systemctl restart redis +sudo systemctl restart eusrr +sudo systemctl reload nginx +``` + +**Фикс 2: Увеличить время жизни токена JWT** +```bash +cd /home/igor/EUSRR/backend +nano eusrr_backend/settings.py +# Найдите SIMPLE_JWT и увеличьте ACCESS_TOKEN_LIFETIME +sudo systemctl restart eusrr +``` + +**Фикс 3: Включить расширенное логирование** +См. раздел в WEBSOCKET_1006_QUICK_GUIDE.md + +--- + +## 📊 Вероятные причины (ваш случай) + +Поскольку ваша конфигурация Nginx **уже правильная** (отдельный блок /ws/, таймауты 7 дней, все заголовки): + +### 1. JWT аутентификация (60% вероятность) 🔥 +**Проверьте:** +- Логи Django на ошибки auth +- Срок действия токенов +- Передается ли токен в URL правильно + +**Где смотреть:** +- `WEBSOCKET_1006_PRIORITY_CHECK.md` → раздел 1 +- `WEBSOCKET_1006_QUICK_GUIDE.md` → "Проверка JWT" + +### 2. CORS/Origin заголовки (25% вероятность) +**Проверьте:** +- Работает ли с разных доменов (corp.robotail.local vs 172.11.0.11) +- Нужны ли дополнительные CORS заголовки + +**Где смотреть:** +- `WEBSOCKET_1006_PRIORITY_CHECK.md` → раздел 2 + +### 3. Проблемы на стороне клиента (10% вероятность) +**Проверьте:** +- Firewall/антивирус +- Браузерные расширения +- Режим инкогнито + +**Где смотреть:** +- `WEBSOCKET_1006_PRIORITY_CHECK.md` → раздел 3 +- `WEBSOCKET_1006_QUICK_GUIDE.md` → "Проверка на стороне клиента" + +### 4. Redis/Gunicorn (5% вероятность) +**Проверьте:** +- Redis доступен и работает +- Gunicorn workers живы + +**Где смотреть:** +- `WEBSOCKET_1006_PRIORITY_CHECK.md` → разделы 4-5 + +--- + +## 🛠️ Инструменты для мониторинга + +### Мониторинг логов Django: +```bash +ssh igor@172.11.0.11 +sudo journalctl -u eusrr -f | grep -i "websocket\|connect\|4401" +``` + +### Мониторинг активных соединений: +```bash +ssh igor@172.11.0.11 +watch -n 2 'sudo netstat -an | grep :9000 | grep ESTABLISHED | wc -l' +``` + +### Проверка в браузере пользователя: +1. F12 → Network → WS +2. Найти `/ws/` соединение +3. Проверить Status (должен быть 101) +4. Проверить Messages (должны быть ping каждые 20 секунд) + +--- + +## 📞 Если ничего не помогло + +### Соберите полный дамп: + +```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=== REDIS INFO ===" + redis-cli INFO +} > 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 . +``` + +--- + +## ✅ Контрольный список + +Перед тем как просить помощь, убедитесь: + +- [ ] Выполнили экспресс-диагностику из Шага 1 +- [ ] Проверили JWT логи (это самая частая причина!) +- [ ] Redis отвечает `PONG` +- [ ] Нет ошибок в Nginx error.log +- [ ] Попробовали в режиме инкогнито +- [ ] Проверили на другом устройстве/сети +- [ ] Перезапустили сервисы (redis, eusrr, nginx) +- [ ] Проверили время жизни JWT токена + +--- + +## 📖 Какой документ читать? + +### У вас 5 минут? +→ **WEBSOCKET_1006_QUICK_GUIDE.md** ⚡ + +### Нужно разобраться детально? +→ **WEBSOCKET_1006_PRIORITY_CHECK.md** + +### Хотите полную методологию? +→ **WEBSOCKET_1006_DIAGNOSTIC_PLAN.md** + +### Проблемы с keepalive/ping? +→ **WEBSOCKET_KEEPALIVE_FIX.md** + +--- + +## 🎓 Полезная информация + +### Код ошибки 1006 означает: +"Abnormal Closure" - соединение закрылось без отправки Close frame. + +### Это НЕ означает: +- Проблема в коде JavaScript (код правильный) +- Проблема в Nginx конфигурации (конфигурация правильная) + +### Это ОБЫЧНО означает: +- Проблема с аутентификацией (JWT токен) +- Проблема на уровне сети/firewall +- Backend отклонил соединение +- Таймауты (но у вас 7 дней, маловероятно) + +--- + +## 🚀 Следующие шаги + +1. **Начните с экспресс-диагностики** (Шаг 1 выше) +2. **Проверьте JWT логи** (это самое важное!) +3. **Если не помогло** - читайте WEBSOCKET_1006_PRIORITY_CHECK.md +4. **Включите расширенное логирование** для детального анализа +5. **Соберите дамп** если ничего не помогло + +Удачи в диагностике! 🔍