---
title: Services Overview
description: Complete catalog of all Docker services, ports, and startup commands.
icon: material/docker
tags:
  - reference
  - getting-started
  - operator
  - docker
---

# Services Overview

!!! tip "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](https://bnkops.com) | `admin@bnkops.ca`

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

!!! tip "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 |

```bash
# 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` |

```bash
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) | — |

```bash
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 | — |

```bash
docker compose up -d gancio
```

!!! info "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 | — |

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

!!! warning "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` |

```bash
# 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 |

```bash
# 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 |

```bash
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 |

```bash
# 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](../admin/services/monitoring.md) for details.

---

## Infrastructure

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

```bash
# 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](../admin/services/tunnel.md) 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):

```bash
docker compose up -d
```

To start everything including monitoring:

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

To see what's running:

```bash
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](installation.md) — setup walkthrough and configuration wizard details
- [Environment Variables](environment-variables.md) — complete `.env` reference
- [First Steps](first-steps.md) — create your first campaign and volunteer shift
