Cannot connect to websocket

I have app on Django Channels that use Daphne as a termination server and hosted on AWS EC2. So problem is, when i run app locally(or via ngrok) and try to connect everything is working, i have connection with websocket. But if i try to connect not locally, i get this:

17-03-2025  18:57:13 | django.request   | WARNING  | Not Found: /ws/chat/
17-03-2025  18:57:13 | gunicorn.access  | INFO     | "GET /ws/chat/?first_user=19628&second_user=19629 HTTP/1.1" 404 179

routing.py

from django.urls import path

from apps.chat.consumers.consumers import ChatConsumer


websocket_urlpatterns = [
    path('ws/chat/', ChatConsumer.as_asgi()),
]

asgi.py

import os

import django


os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.main')
django.setup()

from channels.auth import AuthMiddlewareStack  # noqa: E402
from channels.routing import ProtocolTypeRouter  # noqa: E402
from channels.routing import URLRouter  # noqa: E402
from django.core.asgi import get_asgi_application  # noqa: E402

from apps.chat.middlwares.queryparams import QueryParamsMiddleware  # noqa: E402
from apps.chat.routing import websocket_urlpatterns  # noqa: E402


application = ProtocolTypeRouter(
    {
        'http': get_asgi_application(),
        'websocket': AuthMiddlewareStack(QueryParamsMiddleware(URLRouter(websocket_urlpatterns))),
    }
)

settings.py

ASGI_APPLICATION = 'apps.asgi.application'

INSTALLED_APPS += [
    # Third-party apps
    'daphne'
    'django.contrib.admin',
    'django.contrib.auth',
     ...
    'channels',
    # Local apps
     ...
    'apps.chat.apps.ChatConfig',
]

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            'hosts': [os.environ.get('REDIS_URL', ('127.0.0.1', 6379))],
        },
    },
}

docker-compose.yml

volumes:
  pg_data:
    driver: local

x-base: &base-backend
  build: .
  volumes:
    - .:/code
  depends_on:
    - db
    - redis

services:
  backend:
    <<: *base-backend
    ports:
      - "8000:8000"
    env_file: .env
    environment:
      - DJANGO_SETTINGS_MODULE=settings.main
    entrypoint: ["/code/entrypoint.sh"]
    depends_on:
      - db
      - redis
    restart: unless-stopped
    volumes:
      - .:/code
      - ./logs:/code/logs

  db:
    image: postgres:13
    volumes:
      - "pg_data:/var/lib/postgresql/data"
    environment:
      POSTGRES_DB: db_name
      POSTGRES_USER: db_user
      POSTGRES_PASSWORD: db_password
    ports:
      - "5432:5432"
    restart: unless-stopped
  
  redis:
    image: redis:alpine
    ports:
      - "6379:6379"
    restart: unless-stopped

  worker:
    <<: *base-backend
    command: celery -A apps.celery worker --loglevel=info
    environment:
      - REDIS_URL=redis://redis:6379
    depends_on:
      - backend
      - redis
    restart: unless-stopped

  daphne:
    <<: *base-backend
    container_name: daphne
    command: bash -c "daphne -v 3 -b 0.0.0.0 -p 8001 apps.asgi:application"
    ports:
      - "8001:8001"
    depends_on:
      - worker
      - backend
      - redis


    volumes:
      - .:/code
      - ./logs:/code/logs

Daphne located on 8001 port

The port on AWS is open

connecting to webcosket

const socket = new WebSocket("wss://<server ip>/ws/chat/?first_user=19628&second_user=19629", ["Bearer", token]);

And i don`t use any proxy

So are you sure you don't need to have port_number in the url?

const socket = new WebSocket("wss://<server ip>:<port_number>/ws/chat/?first_user=19628&second_user=19629", ["Bearer", token]);
Вернуться на верх