Step 21: Instrucciones completas de despliegue a producción¶
Guía para llevar las notificaciones in-app (Step 21) a producción.
Resumen¶
- Sin Sockudo: Las notificaciones funcionan (bandeja, badge, marcar leídas). Se actualizan al abrir el dropdown.
- Con Sockudo: Notificaciones en tiempo real. El frontend usa
pusher-jspara conectarse al WebSocket; al recibirnotification.createdactualiza el badge y la lista sin recargar.
Parte 1: Despliegue básico (sin Sockudo)¶
1.1 Commit y push¶
git add .
git status
git commit -m "feat[step-21]: In-app notifications (bandeja + API + UI)"
git push origin main
1.2 En el servidor de producción¶
El script ya hace:
- git pull
- docker compose build (incluye el nuevo app.js)
- migrate (aplica 0015_add_inapp_notifications)
- collectstatic
- Reinicio de servicios
1.3 Verificación¶
- Iniciar sesión como veterinario.
- Ver la campana en la navbar.
- Admin → Usuarios → seleccionar usuario → Acción "Enviar notificación de prueba" → Ejecutar.
- Abrir el dropdown de la campana y ver la notificación.
Parte 2: Sockudo (realtime opcional)¶
2.1 Variables de entorno en .env¶
Agregar o editar en el servidor:
# In-App Notifications Realtime (Sockudo - Step 21)
SOCKUDO_ENABLED=true
SOCKUDO_APP_ID=adlab-app
SOCKUDO_APP_KEY=adlab-key
SOCKUDO_APP_SECRET=<generar-secreto-fuerte-aqui>
SOCKUDO_HTTP_URL=http://sockudo:6001
SOCKUDO_WS_HOST=adlab.fmoreyra.com.ar
SOCKUDO_WS_PORT=443
SOCKUDO_WS_USE_TLS=true
Importante: Generar un secreto fuerte para SOCKUDO_APP_SECRET:
2.2 Perfil de Compose¶
En .env, agregar sockudo a COMPOSE_PROFILES:
2.3 Nginx (laboratory.conf no está en git)¶
Editar manualmente nginx/conf.d/laboratory.conf en el servidor.
Dentro del bloque server HTTPS (el que tiene listen 443), agregar una línea antes de "Deny access to sensitive files":
Ejemplo del bloque completo:
location /up {
proxy_pass http://django_app/up;
access_log off;
}
include /etc/nginx/conf.d/snippets/sockudo-websocket.conf;
location ~ /\.(?!well-known) {
deny all;
}
2.4 Levantar Sockudo, reiniciar app y recargar Nginx¶
Los contenedores leen .env al iniciar. Tras cambiar variables, hay que recrearlos:
# Levantar el contenedor Sockudo
docker compose -f compose.yaml -f compose.production.yaml up -d sockudo
# Reiniciar web, worker y beat para que tomen las nuevas SOCKUDO_*
docker compose -f compose.yaml -f compose.production.yaml up -d --force-recreate web worker beat
# Recargar Nginx para aplicar el include
docker compose -f compose.yaml -f compose.production.yaml exec nginx nginx -s reload
Por qué: Web usa SOCKUDO_* al crear notificaciones. Worker y beat no las usan, pero se reinician por consistencia cuando cambia .env.
2.5 Verificación de Sockudo¶
# Ver que Sockudo está corriendo
docker compose -f compose.yaml -f compose.production.yaml ps sockudo
# Probar WebSocket (desde el servidor)
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" \
"https://adlab.fmoreyra.com.ar/app/adlab-key?protocol=5&client=js&version=7.0.3"
Debería devolver 101 Switching Protocols si el proxy funciona.
Parte 3: Deploy completo (checklist)¶
Pre-deploy (local)¶
- Tests pasando:
make test-with-sqlite - Commit con mensaje correcto
- Push a
main
En el servidor¶
-
./bin/deploy-production.sh - Verificar campana y dropdown (sin Sockudo)
Si usás Sockudo¶
- Variables en
.env(SOCKUDO_*) -
sockudoen COMPOSE_PROFILES - Línea
includeenlaboratory.conf -
docker compose up -d sockudo -
docker compose up -d --force-recreate web worker beat(para que tomen las nuevas env) -
nginx -s reload
Troubleshooting¶
La campana no aparece¶
- Verificar que el usuario está autenticado.
- Revisar la consola del navegador (errores JS).
- Verificar que
collectstaticse ejecutó y queapp.jsestá en/static/js/.
Las notificaciones no se crean¶
- Revisar logs:
docker compose logs web - Verificar que la migración
0015se aplicó:make manage ARGS="showmigrations protocols"
Sockudo: 502 en /app/¶
- Sockudo no está corriendo:
docker compose up -d sockudo - El include no está en laboratory.conf o la ruta es incorrecta.
- Verificar que el snippet existe:
ls nginx/conf.d/snippets/sockudo-websocket.conf
Sockudo: conexión WebSocket falla¶
- Verificar
SOCKUDO_WS_HOSTySOCKUDO_WS_USE_TLS(debe sertrueen HTTPS). - Verificar que Nginx tiene los headers
UpgradeyConnection.