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]);