Skip to main content

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).

warning

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.

note

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.