Docker Deployment
This guide covers deploying Confo using Docker Compose.
Quick Start
Create a docker-compose.yml file:
services:
mariadb:
image: mariadb:latest
restart: unless-stopped
environment:
MARIADB_ROOT_PASSWORD: changeme-root
MARIADB_DATABASE: confo
MARIADB_USER: confo
MARIADB_PASSWORD: changeme-db
volumes:
- mariadb_data:/var/lib/mysql
confo:
image: ghcr.io/vasimi/confo:latest
restart: unless-stopped
ports:
- "80:80"
environment:
NODE_ENV: production
JWT_SECRET: changeme-jwt-secret
DATABASE_TYPE: mariadb
DATABASE_HOST: mariadb
DATABASE_PORT: 3306
DATABASE_USERNAME: confo
DATABASE_PASSWORD: changeme-db
DATABASE_NAME: confo
CORS_ORIGIN: https://your-domain.com
NG_ALLOWED_HOSTS: your-domain.com
SUPERADMIN_USERNAME: admin
SUPERADMIN_PASSWORD: changeme-admin
# YouTube integration (optional)
# YOUTUBE_CLIENT_ID: your-google-client-id
# YOUTUBE_CLIENT_SECRET: your-google-client-secret
depends_on:
- mariadb
volumes:
mariadb_data:
Then start the services:
docker compose up -d
The application will be available at http://localhost (port 80).
Replace all changeme-* values with strong, unique passwords before deploying.
Initial Setup
After the first docker compose up -d, create the superadmin account by running the seed script inside the confo container:
docker compose exec confo node apps/backend/dist/seed.js
This reads SUPERADMIN_USERNAME and SUPERADMIN_PASSWORD from the container environment and inserts the user. It's idempotent — running it again when the user already exists is a no-op. Use these credentials to log in and start configuring events.
Database Migrations
Schema changes are shipped as TypeORM migrations bundled inside the Confo image. When the container starts with NODE_ENV=production, any pending migrations are applied automatically against the configured database before the API begins serving traffic. You do not need to run any commands by hand — docker compose pull && docker compose up -d is enough to apply new migrations on upgrade.
If a migration fails, the backend process exits and the container restarts, with the failure visible in docker compose logs confo. Always take a database backup before upgrading production.
Migrations only run when NODE_ENV=production. Without it, TypeORM's auto-sync mode is enabled instead, which is only appropriate for local development.
Adding the OBS Bridge
If you want to control OBS Studio instances remotely, add the OBS Bridge service. You need one OBS Bridge container per OBS instance (per room):
services:
# ... mariadb and confo services from above ...
obs-bridge:
image: ghcr.io/vasimi/confo/obs-bridge:latest
restart: unless-stopped
environment:
OBS_HOST: 192.168.1.100 # IP of the machine running OBS
OBS_PORT: 4455
OBS_PASSWORD: your-obs-password
BACKEND_URL: http://confo:3000
ROOM_ID: "1" # Room ID from Confo
depends_on:
- confo
Make sure OBS Studio has the WebSocket server enabled (Tools > WebSocket Server Settings) and that the OBS Bridge can reach both the OBS machine and the Confo backend.
Reverse Proxy (HTTPS)
The Confo container exposes port 80 with HTTP. For production, place it behind a reverse proxy like Caddy, Traefik, or Nginx with TLS termination:
Client → Reverse Proxy (HTTPS :443) → Confo (:80)
Update CORS_ORIGIN to match your public domain.
Updating
To update to the latest version:
docker compose pull
docker compose up -d
All Environment Variables
See the Environment Variables reference for a complete list of configuration options.