bunker-admin abb4034e4b feat(upgrade): Approach C - CCP-driven release upgrade (template re-render)
Adds the third upgrade path alongside Approach A (full upgrade.sh) and B
(image-only). For releases that change orchestration (new services, new
nginx routes, new compose env vars) in addition to image versions, CCP
re-renders templates server-side, sends the rendered files to the tenant
via the existing mTLS agent, then composePull + composeUp. Tenant content
(mkdocs/, custom configs/) is never touched.

Pieces:

PHASE 1 — Schema + per-instance imageTag

- prisma/schema.prisma: new Instance.imageTag column (NULL = fall back
  to env.IMAGE_TAG default).
- prisma/migrations/20260522093400_add_instance_image_tag/: SQL.
- services/template-engine.ts:
  - buildTemplateContext now uses instance.imageTag || env.IMAGE_TAG.
  - InstanceForTemplate interface gains imageTag: string | null.

PHASE 2 — Pre-flight diff (read-only "what would change?")

- agent/services/file.service.ts: new diffFiles() helper with a small
  inline LCS-based unified-diff (no new deps). Returns per-file status
  ('unchanged' | 'modified' | 'created') + truncated unified diff.
- agent/routes/files.routes.ts: POST /instance/:slug/files/diff.
- api/services/execution-driver.ts: diffFiles added to interface.
- api/services/local-driver.ts + remote-driver.ts: diffFiles methods
  (local mirrors agent helper inline; remote POSTs to the agent endpoint).
- api/services/upgrade.service.ts: previewReleaseUpgrade() — renders
  templates in-memory with the proposed imageTag, filters out .env for
  isRegistered=true tenants, calls driver.diffFiles, computes envCoverage
  (which env vars the new compose needs vs which the tenant's .env has).

PHASE 3 — Apply path (the actual upgrade)

- api/services/upgrade.service.ts: startReleaseUpgrade() and the inner
  runReleaseUpgrade() runner. Distinct from runRemoteUpgrade because CCP
  does the work directly via the mTLS driver (no agent-side script).
  Flow: persist imageTag in DB → render → writeFiles → composePull →
  composeUp → composePs verify. Status reported via InstanceUpgrade
  rows (same shape the existing CCP polling UI already uses).
- Failure handling: instance.imageTag stays at the new value on failure
  so operator can retry. Manual rollback only.

PHASE 4 — Routes + schemas

- instances.schemas.ts: startReleaseUpgradeSchema (imageTag regex).
- instances.routes.ts:
  - POST /:id/upgrade-release       (apply)
  - POST /:id/upgrade-release/preview (read-only diff)

PHASE 5 — CCP admin UI

- admin/pages/InstanceDetailPage.tsx: third "Upgrade to Release" button
  next to Quick Upgrade + Upgrade Now. Opens a modal with imageTag input,
  Preview button (calls /preview), and Apply button. Preview modal shows:
  - Red alert if envCoverage.missingInTenantEnv is non-empty (compose
    needs vars the tenant's .env doesn't define).
  - Per-file status tags (unchanged / modified / created) + truncated
    unified diff for modified files.
- admin/types/api.ts: Instance.imageTag added.

Constraints applied:
- Remote-only initial scope: throws "currently supported only for remote
  instances" if instance.isRemote === false.
- isRegistered=true tenants (install.sh fleet): .env is filtered out
  of the render set (CCP can't render env without secrets in DB), the
  tenant's existing .env stays as-is. envCoverage warns the operator
  if the new compose references env vars their .env doesn't define.
- Shared in-progress guard with Approach A/B (one upgrade at a time).

Per the plan: see ~/.claude/plans/insight-temporal-bachman.md.

All three projects type-check cleanly (api, agent, admin).

Bunker Admin
2026-05-22 09:45:37 -06:00
2026-04-30 19:07:17 -06:00
2026-04-02 15:14:27 -06:00
2026-03-09 16:05:25 -06:00
2026-03-22 21:47:09 -06:00

Changemaker Lite

Changemaker Lite

A self-hosted campaign platform for community organizers who want to own their data.

Documentation · Website · Apache 2.0 License


Changemaker Lite consolidates advocacy campaigns, geographic mapping, volunteer canvassing, media management, newsletters, and administration into a single Docker Compose stack. One .env file, one command to start, everything under your control.

Admin Dashboard

Why Changemaker Lite?

Most campaign tools are SaaS platforms that lock you into monthly subscriptions, hold your data hostage, and disappear when funding dries up. Changemaker Lite is different:

  • Self-hosted -- runs on any machine with Docker. Your server, your data.
  • All-in-one -- replaces 5-10 separate tools with a single integrated platform.
  • Free and open source -- Apache 2.0 licensed. Fork it, modify it, make it yours.
  • Privacy-first -- no telemetry, no third-party analytics, no data leaving your server.

What's Inside

Advocacy Campaigns

Let supporters look up their elected representatives by postal code and send advocacy emails in a few clicks. Track responses, moderate a public response wall, and monitor email delivery.

Public Campaign Page

Campaign Management

Interactive Map & Canvassing

Import thousands of addresses, draw canvassing areas, schedule volunteer shifts, and track door-to-door visits with GPS. Volunteers get a full-screen mobile map with real-time location tracking and visit recording.

Public Map

Canvass Dashboard

Volunteer Portal

Volunteers get their own portal with shift sign-ups, canvassing assignments, activity tracking, a social calendar, and a friends system to stay connected with their team.

Volunteer Map

Volunteer Calendar

Upload campaign videos, manage metadata, schedule publishing, and share them through a public gallery. Includes GDPR-compliant analytics.

Media Library

Public Gallery

Landing Pages & Email Templates

Build campaign microsites with a drag-and-drop GrapesJS editor. Design email templates for consistent campaign communications.

Landing Page Builder

SMS Campaigns, Newsletters & More

Send SMS campaigns via an Android bridge, sync subscribers to Listmonk for newsletters, recognize volunteers on a Wall of Fame leaderboard, and monitor everything with built-in Prometheus + Grafana observability.

SMS Dashboard

Wall of Fame

Quick Start

Production (pre-built images)

# 1. One-command install: checks host ports, downloads tarball, runs config wizard
curl -fsSL https://gitea.bnkops.com/admin/changemaker.lite/raw/branch/main/scripts/install.sh | bash

# 2. Start services (first pull ~3 min + ~90s stabilization)
cd ~/changemaker.lite && docker compose up -d

# 3. Verify the install
bash scripts/test-deployment.sh --wait 60

The installer checks your host's port availability before extracting — no more half-started stacks from cockpit on :9090 or other surprises. The generated admin password is printed to stdout and saved to data/admin-credentials.txt (mode 0600). See Prerequisites for what you need lined up first.

Development (source)

git clone <repo-url> changemaker.lite
cd changemaker.lite

cp .env.example .env
# Edit .env -- set passwords, JWT secrets, admin credentials

docker compose up -d v2-postgres redis api admin
docker compose exec api npx prisma migrate deploy
docker compose exec api npx prisma db seed

Then open http://localhost:3000 and log in with the admin credentials from your .env.

Useful tools

bash scripts/validate-env.sh          # re-check .env + host ports
bash scripts/test-deployment.sh       # full deployment health sweep
bash scripts/pangolin-teardown.sh     # wipe tunnel org before reinstall (dry-run by default)
bash scripts/ccp-deregister.sh        # deregister from Changemaker Control Panel (dry-run by default)

Documentation

Full documentation is available at cmlite.org/docs/getting-started.

The docs site covers installation, configuration, all features, architecture details, production deployment with Pangolin tunnels, and troubleshooting. It is the authoritative and up-to-date reference for Changemaker Lite.

Architecture at a Glance

Layer Technology
API Express.js + Prisma + PostgreSQL 16
Media API Fastify + Prisma (shared DB)
Frontend React + Vite + Ant Design + Zustand
Reverse Proxy Nginx (subdomain routing)
Cache & Queue Redis + BullMQ
Newsletter Listmonk
Monitoring Prometheus + Grafana + Alertmanager
Tunneling Pangolin (self-hosted Cloudflare alternative)

The entire stack runs on Docker Compose. Enable optional modules (media, newsletters, SMS, monitoring) with feature flags in .env.

License

Apache License 2.0

AI Disclaimer

AI tools were used to assist in the creation of this project. All generated code has been reviewed. Users should test all functionality to ensure it meets their requirements.

Description
Changemaker-lite is the current active development branch of Changemaker, focused on streamlining core services. These improvements will be merged into the master branch once ready.
https://cmlite.org
Readme 121 MiB
2026-05-21 10:36:40 -06:00
Languages
HTML 48.3%
TypeScript 46.1%
Shell 2.5%
JavaScript 1.5%
CSS 0.6%
Other 0.9%