# AvanzaCast - Production Deployment (Docker Compose) This file shows how to build and run the production stack locally (or on a server) with Docker Compose. It sets up: - `backend-api` (token server) on port 4000 - `studio-panel` served by nginx on port 80 inside container - `broadcast-panel` on port 5175 - `reverse-proxy` (nginx) mapping the three domains to containers Prerequisites - Docker and docker-compose installed on the host - DNS or hosts entries mapping the following hostnames to the server IP: - `avanzacast-broadcastpanel.bfzqqk.easypanel.host` - `avanzacast-studio.bfzqqk.easypanel.host` - `avanzacast-servertokens.bfzqqk.easypanel.host` - TLS/SSL: this example doesn't include certificates. Use a separate step with Certbot / Let's Encrypt or your load balancer to provide SSL. Do NOT expose token server over plain HTTP in production without TLS. Files created - `docker-compose.prod.yml` - compose file to build and run the stack - `docker/nginx/default.conf` - nginx config for reverse proxy - `packages/backend-api/.env.production` - production environment variables for backend-api (placeholder) Build & Run 1. Build and start the stack ```bash # from repo root docker compose -f docker-compose.prod.yml up --build -d # check status docker compose -f docker-compose.prod.yml ps ``` 2. Verify backend health and CORS ```bash # verify backend health curl -i http://localhost:4000/health # simulate the broadcast requesting token curl -i -H "Origin: https://avanzacast-broadcastpanel.bfzqqk.easypanel.host" \ "http://localhost:4000/api/token?room=studio-demo&username=simulator" ``` You should see an `Access-Control-Allow-Origin` header in the response. If it returns 500 with `LiveKit credentials not configured`, add real `LIVEKIT_API_KEY` and `LIVEKIT_API_SECRET` to `packages/backend-api/.env.production` and restart. 3. Verify the UIs Open in browser (or use Playwright): - https://avanzacast-broadcastpanel.bfzqqk.easypanel.host - https://avanzacast-studio.bfzqqk.easypanel.host 4. Run E2E test locally (Playwright) ```bash cd packages/studio-panel chmod +x run_playwright_test.sh ./run_playwright_test.sh # artifacts will be in /tmp: ls -lh /tmp/playwright_debug.log /tmp/playwright_run_output.log /tmp/sim_postmessage_simulator.png /tmp/sim_postmessage_studio.png ``` Troubleshooting - If CORS is blocked: edit `packages/backend-api/src/index.ts` and ensure allowed origins include your domains, then rebuild/restart. - If the backend dies with EBADF or IO errors: run `npx tsx src/index.ts` in foreground to get full stack trace, paste here. - For TLS termination: configure nginx with certificates or put the stack behind a TLS-enabled LB. Security - Do not commit real secrets to the repo. Use environment variables or a secret manager. The `.env.production` file created contains placeholders; replace with real values on the server.