Skip to content

# Services

Changemaker Lite orchestrates 30+ services via Docker Compose. This page is your map to every service: what it does, how to reach it, and where to find its upstream documentation.

## Core Platform

The essential services that power the application.

- Express API

  Main V2 API server. Handles authentication, campaigns, map, shifts, pages, email, and all business logic. Prisma ORM with PostgreSQL.

  Port: `4000` · Container: `changemaker-v2-api`

  API Reference

- Fastify Media API

  Video library server. Upload, metadata extraction (FFprobe), analytics, scheduled publishing, and public gallery. Shares the same PostgreSQL database.

  Port: `4100` · Container: `changemaker-media-api`

  Media Guide

- Admin GUI

  React single-page application (Vite + Ant Design + Zustand). Serves the admin dashboard, public campaign pages, volunteer portal, and media gallery — all from one build.

  Port: `3000` · Container: `changemaker-v2-admin`

  Feature Guides

- PostgreSQL 16

  Primary database shared by both APIs. Managed by Prisma migrations. Contains 190+ tables covering users, campaigns, locations, shifts, media, and more.

  Port: `5433` (host) / `5432` (container) · Container: `changemaker-v2-postgres`

  PostgreSQL Docs

- Redis

  In-memory store for rate limiting, BullMQ job queues (email, video scheduling), geocoding cache, and session data. Requires authentication.

  Port: `6379` · Container: `redis-changemaker`

  Redis Docs

- Nginx

  Reverse proxy handling all subdomain routing (`app.`, `api.`, `media.`, `docs.`, etc.). Includes security headers (HSTS, CSP, Permissions-Policy) and WebSocket support.

  Port: `80` / `443` · Container: `changemaker-v2-nginx`

  Nginx Docs

## Communication & Email

- Listmonk

  Self-hosted newsletter and mailing list manager. Drop-in replacement for Mailchimp. Opt-in sync with the main platform imports participants, locations, and users as subscriber lists.

  Port: `9001` · Container: `listmonk-app` · Subdomain: `listmonk.DOMAIN`

  Listmonk Docs

- MailHog

  Email capture for development. All outgoing email is intercepted and displayed in a web UI when `EMAIL_TEST_MODE=true`. No real emails are sent.

  Port: `8025` (web) / `1025` (SMTP) · Container: `mailhog-changemaker` · Subdomain: `mail.DOMAIN`

  MailHog GitHub

## Content & Editing

- MkDocs

  Material-themed documentation site with full-text search, blog, social cards, and Jinja2 template overrides. Two containers: live preview (dev) and static site (production).

  Port: `4003` (dev) / `4004` (static) · Container: `mkdocs-changemaker` · Subdomain: `docs.DOMAIN`

  MkDocs Material

- Code Server

  Full VS Code in the browser. Edit configuration files, templates, and documentation from anywhere without SSH. Supports extensions.

  Port: `8888` · Container: `code-server-changemaker` · Subdomain: `code.DOMAIN`

  Code Server Docs

## Data & Automation

- NocoDB

  Airtable-alternative database browser. Provides a spreadsheet-like interface to browse, filter, sort, and export campaign data. Read-only access to the main database.

  Port: `8091` · Container: `changemaker-v2-nocodb` · Subdomain: `db.DOMAIN`

  NocoDB Docs

- n8n

  Visual workflow automation platform. Connect APIs, trigger actions on events, schedule tasks, and build custom integrations — all without code. 400+ built-in integrations.

  Port: `5678` · Container: `n8n-changemaker` · Subdomain: `n8n.DOMAIN`

  n8n Docs

- Gitea

  Self-hosted Git repository hosting. Version control for campaign code, configuration, templates, and documentation. Includes issues, pull requests, and CI/CD.

  Port: `3030` (web) / `2222` (SSH) · Container: `gitea-changemaker` · Subdomain: `git.DOMAIN`

  Gitea Docs

## Utilities

- Mini QR

  Lightweight QR code generator. Produces PNG images for walk sheets, campaign materials, and event signage. Embedded in the admin dashboard via iframe.

  Port: `8089` · Container: `mini-qr` · Subdomain: `qr.DOMAIN`

- Homepage

  Service dashboard showing the status of all containers at a glance. Auto-generated `services.yaml` from `config.sh` provides both production and local links.

  Port: `3010` · Container: `homepage-changemaker` · Subdomain: `home.DOMAIN`

  Homepage Docs

- Excalidraw

  Collaborative whiteboard for brainstorming, diagramming, and visual planning. Real-time collaboration via WebSocket.

  Port: `8090` · Container: `excalidraw-changemaker` · Subdomain: `draw.DOMAIN`

  Excalidraw

- Vaultwarden

  Self-hosted Bitwarden-compatible password manager. Secure credential sharing for campaign teams. Requires HTTPS for account creation; local browsing works on HTTP.

  Port: `8445` · Container: `vaultwarden-changemaker` · Subdomain: `vault.DOMAIN`

  Vaultwarden Wiki

## Team Communication

- Rocket.Chat

  Self-hosted team chat for volunteer coordination. Supports channels, direct messaging, threads, and file sharing. Embeddable in the admin dashboard via iframe. Enable with `ENABLE_CHAT=true`.

  Port: `3000` (internal) · Container: `rocketchat-changemaker` · Subdomain: `chat.DOMAIN`

  Rocket.Chat Docs

- Jitsi Meet

  Self-hosted video conferencing with JWT authentication. Four containers (web, Prosody, Jicofo, JVB) provide the full video call stack. Integrated with Rocket.Chat for one-click calls from channels and DMs. Enable with `ENABLE_MEET=true`.

  Containers: `jitsi-web`, `jitsi-prosody`, `jitsi-jicofo`, `jitsi-jvb` · Subdomain: `meet.DOMAIN`

  Setup Guide ·
  Jitsi Docs

- Gancio

  Self-hosted event management platform. Automatic shift-to-event sync (when `GANCIO_SYNC_ENABLED=true`) publishes shifts as public events. Uses the shared PostgreSQL database. Embeddable calendar widget available for MkDocs pages.

  Port: `8092` · Container: `gancio-changemaker` · Subdomain: `events.DOMAIN`

  Gancio Docs

## Networking & Tunneling

- Pangolin + Newt

  Self-hosted tunnel server with the Newt client container. Exposes your services to the internet without port forwarding. Handles SSL/TLS, works behind CGNAT and double NAT.

  Container: `newt-changemaker` · Managed from Admin → Settings → Tunnel

  Deployment Guide ·
  Pangolin GitHub

## Monitoring Stack

These services run behind the `monitoring` Docker Compose profile. Start them with:

    docker compose --profile monitoring up -d

- Prometheus

  Metrics collection and time-series database. Scrapes 12 custom `cm_*` application metrics plus container, host, and Redis metrics. Pre-configured alert rules.

  Port: `9090` · Container: `prometheus-changemaker`

  Prometheus Docs

- Grafana

  Metrics visualization with 3 auto-provisioned dashboards: API Overview, Infrastructure, and Campaign Activity. Supports custom dashboards and alerting.

  Port: `3005` · Container: `grafana-changemaker` · Subdomain: `grafana.DOMAIN`

  Grafana Docs

- Alertmanager

  Alert routing and notification delivery. Receives alerts from Prometheus and dispatches to Gotify, email, or webhooks based on configurable rules.

  Port: `9093` · Container: `alertmanager-changemaker`

  Alertmanager Docs

- cAdvisor

  Container resource metrics. Exposes CPU, memory, network, and filesystem usage per container for Prometheus to scrape.

  Port: `8086` · Container: `cadvisor-changemaker`

  cAdvisor GitHub

- Node Exporter

  Host system metrics. Reports CPU, memory, disk, and network stats for the underlying server.

  Port: `9100` · Container: `node-exporter-changemaker`

  Node Exporter

- Redis Exporter

  Redis metrics for Prometheus. Exposes connection counts, memory usage, command stats, and keyspace info.

  Port: `9121` · Container: `redis-exporter-changemaker`

  Redis Exporter GitHub

- Gotify

  Self-hosted push notification server. Receives alerts from Alertmanager and delivers them to mobile/desktop clients.

  Port: `8889` · Container: `gotify-changemaker`

  Gotify Docs

## Quick Reference

All services at a glance with their default ports and subdomains.

Service | Port | Subdomain | Docker Profile
--- | --- | --- | ---
Express API | 4000 | `api.` | default
Media API | 4100 | `media.` | default
Admin GUI | 3000 | `app.` | default
PostgreSQL | 5433 | — | default
Redis | 6379 | — | default
Nginx | 80/443 | (all) | default
Listmonk | 9001 | `listmonk.` | default
MailHog | 8025 | `mail.` | default
MkDocs (dev) | 4003 | `docs.` | default
MkDocs (static) | 4004 | (root) | default
Code Server | 8888 | `code.` | default
NocoDB | 8091 | `db.` | default
n8n | 5678 | `n8n.` | default
Gitea | 3030 | `git.` | default
Mini QR | 8089 | `qr.` | default
Homepage | 3010 | `home.` | default
Excalidraw | 8090 | `draw.` | default
Vaultwarden | 8445 | `vault.` | default
Rocket.Chat | — | `chat.` | default
Jitsi Meet | — | `meet.` | default
Gancio | 8092 | `events.` | default
Newt (tunnel) | — | — | default
Prometheus | 9090 | — | `monitoring`
Grafana | 3005 | `grafana.` | `monitoring`
Alertmanager | 9093 | — | `monitoring`
cAdvisor | 8086 | — | `monitoring`
Node Exporter | 9100 | — | `monitoring`
Redis Exporter | 9121 | — | `monitoring`
Gotify | 8889 | — | `monitoring`

Starting services selectively

You don't need to run everything. Start only what you need:

    # Core only
    docker compose up -d v2-postgres redis api admin

    # Add nginx for subdomain routing
    docker compose up -d nginx

    # Add monitoring
    docker compose --profile monitoring up -d

See Getting Started for the recommended startup order.