Skip to content

# Services Overview

Need help getting set up?

Bunker Operations provides managed infrastructure and hands-on setup assistance for organizations running Changemaker Lite. We handle domains, tunnels, SMTP, and servers so you can focus on your campaign. Get in touch: bnkops.com | `admin@bnkops.ca`

Changemaker Lite runs as 30+ Docker containers orchestrated by Docker Compose. This page catalogs every service, organized by category.

Quick reference

Use `docker compose ps` to see which services are currently running, or `docker compose ps -a` to include stopped containers.

## Core (Required)

These services form the minimum viable platform. Start them first.

Container | Port | Description
--- | --- | ---
`changemaker-v2-api` | 4000 | Express.js REST API (Prisma ORM)
`changemaker-v2-admin` | 3000 | React admin GUI (Vite + Ant Design)
`changemaker-v2-postgres` | 5433 | PostgreSQL 16 — primary database
`redis-changemaker` | 6379 | Redis 7 — cache, rate limiting, job queues
`changemaker-v2-nginx` | 80 | Nginx reverse proxy — subdomain routing

    # Start core services only (minimal)
    docker compose up -d v2-postgres redis api admin nginx

    # Or start everything at once
    docker compose up -d

The API container automatically runs database migrations and seeding on startup via its entrypoint script.

Note

Nginx is technically optional for local development (you can access services directly by port), but required for production subdomain routing.

## Media

Container | Port | Description | Feature Flag
--- | --- | --- | ---
`changemaker-media-api` | 4100 | Fastify media API — video library, analytics, scheduling | `ENABLE_MEDIA_FEATURES=true`

    docker compose up -d media-api

The media API runs as a separate Fastify server sharing the same PostgreSQL database. It handles video upload (FFprobe metadata extraction), scheduled publishing via BullMQ, and GDPR-compliant view analytics.

## Communication

### Rocket.Chat (Team Chat)

Container | Port | Description | Feature Flag
--- | --- | --- | ---
`rocketchat-changemaker` | 8891 | Rocket.Chat server | `ENABLE_CHAT=true`
`mongodb-changemaker` | — | MongoDB (Rocket.Chat data store) | —
`nats-changemaker` | — | NATS (Rocket.Chat message bus) | —

    docker compose up -d rocketchat mongodb nats

### Gancio (Events)

Container | Port | Description | Feature Flag
--- | --- | --- | ---
`gancio-changemaker` | 8092 | Gancio event platform | `GANCIO_SYNC_ENABLED=true`
`gancio-init` | — | Init container — creates Gancio database | —

    docker compose up -d gancio

Init containers

`gancio-init` runs once on first start to create the Gancio database in PostgreSQL, then exits. This is normal — don't worry about seeing it in a "stopped" state.

### Jitsi Meet (Video Conferencing)

Container | Port | Description | Feature Flag
--- | --- | --- | ---
`jitsi-web-changemaker` | 8893 | Jitsi web interface | `ENABLE_MEET=true`
`jitsi-prosody-changemaker` | — | XMPP server (Prosody) | —
`jitsi-jicofo-changemaker` | — | Jitsi conference focus | —
`jitsi-jvb-changemaker` | 10000/udp | Jitsi video bridge | —

    docker compose up -d jitsi-web jitsi-prosody jitsi-jicofo jitsi-jvb

Firewall requirement

Jitsi requires UDP port 10000 open in your firewall for video/audio media traffic. Set `JVB_ADVERTISE_IP` in `.env` to your server's public IP address.

## Newsletter & Email

Container | Port | Description | Feature Flag
--- | --- | --- | ---
`listmonk-app` | 9001 | Listmonk newsletter platform | `LISTMONK_SYNC_ENABLED=true`
`listmonk-db` | 5432 | PostgreSQL (Listmonk's own database) | —
`listmonk-init` | — | Init container — creates API user | —
`mailhog-changemaker` | 8025 | MailHog email capture (development) | `EMAIL_TEST_MODE=true`

    # Newsletter platform
    docker compose up -d listmonk-app

    # Email testing (captures all outgoing emails)
    docker compose up -d mailhog

Listmonk has its own PostgreSQL instance separate from the main database. The `listmonk-init` container auto-creates the API user for platform integration.

## Developer Tools

Container | Port | Description
--- | --- | ---
`code-server-changemaker` | 8888 | VS Code in the browser
`mkdocs-changemaker` | 4003 | MkDocs live preview (hot reload)
`mkdocs-site-server-changemaker` | 4004 | MkDocs static site server
`gitea-changemaker` | 3030 | Gitea — self-hosted Git repository
`gitea-db` | — | PostgreSQL (Gitea's database)
`changemaker-v2-nocodb` | 8091 | NocoDB — read-only database browser
`nocodb-init` | — | Init container — registers database
`n8n-changemaker` | 5678 | n8n — workflow automation

    # Start individual tools
    docker compose up -d code-server
    docker compose up -d mkdocs mkdocs-site-server
    docker compose up -d gitea
    docker compose up -d nocodb
    docker compose up -d n8n

Tip

`mkdocs` (port 4003) provides live editing with hot reload for documentation authors. `mkdocs-site-server` (port 4004) serves the built static site for production visitors.

## Utilities

Container | Port | Description
--- | --- | ---
`mini-qr` | 8089 | QR code PNG generator
`excalidraw-changemaker` | 8090 | Collaborative whiteboard
`vaultwarden-changemaker` | 8445 | Vaultwarden — Bitwarden-compatible password manager
`vaultwarden-init` | — | Init container — configures admin settings
`homepage-changemaker` | 3010 | Homepage — service dashboard

    docker compose up -d mini-qr excalidraw vaultwarden homepage

Mini QR is used internally by walk sheets and cut export pages to generate printable QR codes.

## Monitoring (Docker Profile)

Monitoring services are behind a Docker Compose profile and are not started by default.

Container | Port | Description
--- | --- | ---
`prometheus-changemaker` | 9090 | Prometheus — metrics collection
`grafana-changemaker` | 3005 | Grafana — monitoring dashboards
`alertmanager-changemaker` | 9093 | Alertmanager — alert routing
`cadvisor-changemaker` | 8086 | cAdvisor — container metrics
`node-exporter-changemaker` | 9100 | Node Exporter — host system metrics
`redis-exporter-changemaker` | 9121 | Redis Exporter — Redis metrics
`gotify-changemaker` | 8889 | Gotify — push notifications

    # Start the entire monitoring stack
    docker compose --profile monitoring up -d

The monitoring stack includes 3 pre-configured Grafana dashboards and 12 custom `cm_*` Prometheus metrics. See Monitoring for details.

## Infrastructure

Container | Port | Description
--- | --- | ---
`newt` | — | Pangolin tunnel connector (Newt)
`docker-socket-proxy` | — | Docker socket proxy for secure container access

    # Newt starts automatically if PANGOLIN_NEWT_ID and PANGOLIN_NEWT_SECRET are set
    docker compose up -d newt

The Newt container connects to a Pangolin tunnel server for secure public access without opening inbound ports. See Tunnel for setup.

## Subdomain Routing

When Nginx is running, services are accessible via subdomains. The root domain serves documentation only; all application routes are at `app.DOMAIN`.

Subdomain | Target | Purpose
--- | --- | ---
`app.DOMAIN` | Admin (3000) | All application routes (admin, public pages, campaigns, map, shifts, media gallery)
`api.DOMAIN` | Express API (4000) | REST API
`media.DOMAIN` | Fastify Media API (4100) | Media API
`DOMAIN` | MkDocs Static (4004) | Documentation / marketing site
`db.DOMAIN` | NocoDB (8091) | Database browser
`docs.DOMAIN` | MkDocs Live (4003) | Live documentation preview
`code.DOMAIN` | Code Server (8888) | Web IDE
`n8n.DOMAIN` | n8n (5678) | Workflow automation
`git.DOMAIN` | Gitea (3030) | Git hosting
`home.DOMAIN` | Homepage (3010) | Service dashboard
`grafana.DOMAIN` | Grafana (3005) | Metrics visualization
`listmonk.DOMAIN` | Listmonk (9001) | Newsletter platform
`qr.DOMAIN` | Mini QR (8089) | QR code generator
`draw.DOMAIN` | Excalidraw (8090) | Collaborative whiteboard
`vault.DOMAIN` | Vaultwarden (8445) | Password manager
`events.DOMAIN` | Gancio (8092) | Event platform
`chat.DOMAIN` | Rocket.Chat (8891) | Team chat
`meet.DOMAIN` | Jitsi Meet (8893) | Video conferencing
`mail.DOMAIN` | MailHog (8025) | Email capture (dev)

## Init Containers

Several services use init containers — lightweight containers that run once on first startup to bootstrap databases or configuration, then exit with code 0. This pattern is borrowed from Kubernetes.

Init Container | Purpose
--- | ---
`listmonk-init` | Creates the Listmonk API user for platform integration
`gancio-init` | Creates the Gancio database in the shared PostgreSQL instance
`vaultwarden-init` | Configures Vaultwarden admin settings
`nocodb-init` | Registers the main database with NocoDB for browsing

Seeing these containers in a "stopped" or "exited (0)" state is completely normal.

## Starting Everything

To start all services at once (excluding monitoring):

    docker compose up -d

To start everything including monitoring:

    docker compose up -d && docker compose --profile monitoring up -d

To see what's running:

    docker compose ps

Warning

Starting all services at once requires at least 4 GB RAM. For resource-constrained environments, start only the services you need.

## Next Steps

- Installation — setup walkthrough and configuration wizard details
- Environment Variables — complete `.env` reference
- First Steps — create your first campaign and volunteer shift