v2 line: root takeover (compose-first) + release plumbing - #54
Conversation
Move everything v1 (compose.yml, compose.local.yml, .env.example, .env.local.example, configmap/podman examples, .docker/, charts/, install.sh, scripts/, versions.env) into legacy-v1/ unchanged. Author the v2 root compose.yml (backend/frontend/postgres:18-alpine/redis:7-alpine, no build: sections, named volumes, healthchecks), .env.example (PLATFORM_VERSION=v2.0.0 first line per the release workflow's sed contract), and README.md (v2 quick start + bootstrap + upgrade story + legacy-v1 pointer). Add .github/workflows/publish-release.yml, which tags and creates the GitHub Release once the monorepo's release PR (bumping latest.json) is merged to main. Update ci.yml/release.yml's chart paths so v1's own Helm lint/release pipeline keeps working from its new location. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FUFtr3m8zC2mVNKVTQvaNz
|
Field test report: this branch was deployed today on demo.getplumber.tech (v1 stopped and moved aside, images built from monorepo main
Everything else held up: 🤖 Generated with Claude Code |
|
One more field finding (Thomas, 2026-09-08): the frontend needs custom CA support too. It makes server-side queries (Next.js server components call the backend via API_INTERNAL_URL today, and any future server-side fetch to a privately-signed origin has the same problem), so an on-prem install behind an internal CA needs the frontend's Node runtime to trust it - Node does not read the OS trust store. The v1 compose already did this by mounting .docker/ca-certificates into BOTH containers. Suggested v2 shape, mirroring the backend's PLUMBER_PROVIDER_CA_BUNDLE pattern in compose.yml: a commented 🤖 Generated with Claude Code |
Summary
Layout ruling: v2 takes over the repository root; v1 (Helm chart, Docker Compose with bundled
Traefik, podman,
install.sh) moves intolegacy-v1/unchanged (seelegacy-v1/README.md).v2 is compose-first: a minimal root
compose.yml(backend, frontend,postgres:18-alpine,redis:7-alpine, nobuild:sections, named volumes, healthchecks) plus.env.exampleand a newquick-start
README.md. A v2 Helm chart is follow-up work, not in this PR - the README points atlegacy-v1/chartsas the closest reference in the meantime.What moved into
legacy-v1/(git-mv, byte-identical content):compose.yml,compose.local.yml,.env.example,.env.local.example,configmap.yml.example,configmap.local.yml.example,podman.yml.example,podman.local.yml.example,.docker/,charts/,install.sh,scripts/,versions.env..github/workflows/ci.ymland.github/workflows/release.yml(v1's own Helm lint/chart-release pipeline) had their paths toscripts//charts/updated to the newlegacy-v1/location - no other change to either workflow,v1's own CI/release behavior is otherwise untouched.
New at root:
compose.yml,.env.example(PLATFORM_VERSION=v2.0.0as the first line - thisis the exact contract the monorepo's
release.ymlsed step targets, do not rename that variable oneither side without updating the other),
README.md(quick start: configure,docker compose up -d,plumber-bootstrap, then log in; the upgrade story; the legacy-v1 pointer).New:
.github/workflows/publish-release.yml- on a push tomainwherelatest.jsonchanged, it reads the version, tags it, and runs
gh release createwithreleases/<version>.mdas the notes file. This reacts to Thomas merging the monorepo's own release PR (which is the one
that bumps
.env.example/latest.json/releases/<version>.md) - it never opens or approvesanything itself.
releases/.gitkeepadded so the directory exists ahead of the first release PR.One deliberate deviation from the brief's literal wording: hardening comments in
compose.yml/.env.exampleare written self-contained rather than pointing atdocs/ops-notes.md- that file lives in the privategetplumber/monorepo, unreachable from thispublic repo, so a literal path reference would be broken/confusing for an external operator.
One thing this PR does NOT solve, flagged for review:
compose.ymlexposes backend andfrontend on two separate host ports; the frontend's browser-side code calls the API at the same
origin under
/apiwith no client config (platform/frontend's ownenv.ts), which needs areverse proxy in front routing
/api/*to backend and everything else to frontend on one publichostname. This compose file deliberately does not bundle one (kept minimal, no Traefik) - both the
compose.ymlcomment on thefrontendservice and the README call this out explicitly so it isn'tsilently missed at install time.
This PR is the prerequisite for the first v2.0.0 release run: the monorepo's on-demand
release.ymlworkflow opens its own release PR against this repo's.env.example/latest.jsonusing the exact paths this PR establishes.
Test plan
docker compose --env-file <filled .env> -f compose.yml configresolves cleanly (verifiedlocally with placeholder secrets - all four services, healthchecks, and env interpolation
resolve as expected).
compose.yml,.github/workflows/publish-release.yml, and the editedci.yml/release.ymlall parse.docker compose up -dagainst real images oncev2.0.0is published, confirmplumber-bootstrapflags matchcmd/bootstrap's current flag set (verified against source,not run against a live image in this PR).
legacy-v1/'s CI (ci.ymlchart lint/unit tests,release.ymlchart-releaser) stillpasses from its new
legacy-v1/chartspath.