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 |
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) | — |
Gancio (Events)¶
| Container | Port | Description | Feature Flag |
|---|---|---|---|
gancio-changemaker |
8092 | Gancio event platform | GANCIO_SYNC_ENABLED=true |
gancio-init |
— | Init container — creates Gancio database | — |
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 | — |
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 |
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 |
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):
To start everything including monitoring:
To see what's running:
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
.envreference - First Steps — create your first campaign and volunteer shift