Services

Hosting Inventory 2026 06 16


Hosting and deployment inventory — 2026-06-16

Scope: Assistance monorepo app/backend deployment model, Cloudflare configuration, runtime constraints, and operator commands. This inventory is documentation-only and is based on repo-local files and read-only commands.

Evidence inspected#

  • README.md, AGENTS.md, CLAUDE.md compatibility note, .docs/developer.md
  • .mise.toml
  • package.json
  • podman-compose.dev.yml, podman-compose.yml
  • apps/{www,docs,blog,academy,design-system,ui-library,manager}/package.json
  • apps/www/wrangler.toml, apps/manager/wrangler.toml
  • apps/{docs,blog,academy,design-system,ui-library}/wrangler.jsonc
  • apps/{docs,blog,academy,design-system,ui-library}/open-next.config.ts
  • Commands: find apps ..., rg ..., mise tasks | grep ..., find backend/cmd ..., test -f docs/runtime/S02-RUNTIME-PROOF.md

Current deployment model#

  • Root docs define mise run ... as the unified operator entrypoint, with pnpm, backend/Makefile, podman-compose.dev.yml, and podman-compose.yml as lower-level surfaces (README.md, AGENTS.md, .docs/developer.md).
  • Frontends deploy to Cloudflare Workers/Pages; production compose is for backends and infrastructure only (README.md, podman-compose.yml).
  • Cloudflare deployment is split between:
    • Cloudflare Pages: apps/www, apps/manager.
    • Cloudflare Workers via OpenNext: apps/docs, apps/blog, apps/academy, apps/design-system, apps/ui-library.
  • Backend production compose exposes auth-api, billing-api, academy-api, Postgres, and Meilisearch. The compose file comments identify these as exposed via Caddy on proxy.srv.chavkov.com (podman-compose.yml).

App inventory#

AppLocal/dev portBuild/deploy targetKey filesNotes
apps/www3040Cloudflare Pages project assistance-wwwapps/www/package.json, apps/www/wrangler.toml, .mise.tomlcf:build:www sets NEXT_DIST_DIR=.next-build and runs pnpm --filter www build; deploys .next-build with wrangler pages deploy --project-name assistance-www --branch main. Wrangler config includes service bindings BLOG_WORKER=assistance-blog and DOCS_WORKER=assistance-docs, plus Pages secrets notes for form email.
apps/docs3041Cloudflare Worker assistance-docs via OpenNextapps/docs/package.json, apps/docs/wrangler.jsonc, apps/docs/open-next.config.tsbuild:cf uses OPEN_NEXT=1, NEXT_PUBLIC_VERCEL_ENV=production, next build, then opennextjs-cloudflare build --skipNextBuild. Worker has nodejs_compat, .open-next/assets, KV binding NEXT_INC_CACHE_KV, D1 binding SEARCH_DB, and routes for www.assistance.bg/docs* and assistance.bg/docs*.
apps/blog3063Cloudflare Worker assistance-blog via OpenNextapps/blog/package.json, apps/blog/wrangler.jsonc, apps/blog/open-next.config.tsUses KV incremental cache. open-next.config.ts sets cloudflare.useWorkerdCondition=false; .docs/developer.md says this avoids spurious copyWorkerdPackages errors from invalid NFT nodePackages traces.
apps/academy3044Cloudflare Worker assistance-academy via OpenNextapps/academy/package.json, apps/academy/wrangler.jsonc, apps/academy/open-next.config.tsContentLayer build before Next/OpenNext. Wrangler has nodejs_compat and .open-next/assets; no KV namespace was present in the inspected config.
apps/design-system3042Cloudflare Worker assistance-design-system via OpenNextapps/design-system/package.json, apps/design-system/wrangler.jsonc, apps/design-system/open-next.config.tsContent/registry build before Next/OpenNext. Uses KV incremental cache.
apps/ui-library3043Cloudflare Worker assistance-ui-library via OpenNextapps/ui-library/package.json, apps/ui-library/wrangler.jsonc, apps/ui-library/open-next.config.tsContent/registry/LLMS build before Next/OpenNext. Uses KV incremental cache.
apps/manager3045Cloudflare Pages project assistance-managerapps/manager/package.json, apps/manager/wrangler.toml, .mise.tomlVite SPA. Build command is vite build; deploy command is wrangler pages deploy build --project-name assistance-manager. Root runtime docs note a known manager preview/runtime mismatch and say not to describe it as green.

Backend and compose inventory#

Dev compose: podman-compose.dev.yml#

Dev infrastructure exposes:

  • Postgres ${POSTGRES_PORT:-3048}:5432
  • Meilisearch ${MEILI_PORT:-3049}:7700
  • GoTrue auth ${AUTH_PORT:-3060}:9999
  • Mailpit SMTP/UI ${MAILPIT_SMTP_PORT:-3061}:1025, ${MAILPIT_UI_PORT:-3062}:8025
  • saas-api ${SAAS_API_PORT:-3068}:3070
  • Prometheus ${PROMETHEUS_PORT:-3069}:9090
  • Grafana ${GRAFANA_PORT:-3070}:3000

.docs/developer.md maps this to mise run up/down/logs/ps/health, and root package.json has equivalent services:start|stop|clean|logs scripts using sudo podman-compose --project-name assistance-dev -f podman-compose.dev.yml.

Prod compose: podman-compose.yml#

Production/self-hosted backend stack exposes:

  • Postgres 3058:5432
  • Meilisearch 3059:7700
  • auth-api image/build backend/cmd/auth-api/Dockerfile, host 3056, container 8090
  • billing-api image/build backend/cmd/billing-api/Dockerfile, host 3057, container 8080
  • academy-api image/build backend/cmd/academy-api/Dockerfile, host 3066, container 8070

Required production environment variables include ALLOWED_ORIGINS, service-specific *_DATABASE_URL, JWT_SECRET, and MEILI_MASTER_KEY for academy/search. .mise.toml prod tasks use sudo -E podman-compose --project-name assistance-prod -f podman-compose.yml.

find backend/cmd ... output confirmed current backend command surfaces:

1
backend/cmd/academy-api/Dockerfile
2
backend/cmd/academy-api/main.go
3
backend/cmd/academy-seed/main.go
4
backend/cmd/auth-api/Dockerfile
5
backend/cmd/auth-api/main.go
6
backend/cmd/billing-api/Dockerfile
7
backend/cmd/billing-api/main.go
8
backend/cmd/saas-api/main.go

Cloudflare operator commands#

Selected mise tasks | grep ... output inspected:

1
cf:build Build all Cloudflare apps (Pages + Workers)
2
cf:build:academy Build academy for Cloudflare Workers via OpenNext
3
cf:build:blog Build blog for Cloudflare Workers via OpenNext
4
cf:build:docs Build docs for Cloudflare Workers via OpenNext
5
cf:build:ds Build design-system for Cloudflare Workers via OpenNext
6
cf:build:manager Build manager for Cloudflare Pages (Vite SPA)
7
cf:build:ui Build ui-library for Cloudflare Workers via OpenNext
8
cf:build:www Build www for Cloudflare Pages (static export → .next-build)
9
cf:deploy Deploy all apps to Cloudflare (requires CLOUDFLARE_API_TOKEN for OpenNext Worker cache population)
10
cf:deploy:academy Deploy academy to Cloudflare Workers
11
cf:deploy:blog Deploy blog to Cloudflare Workers
12
cf:deploy:docs Deploy docs to Cloudflare Workers
13
cf:deploy:ds Deploy design-system to Cloudflare Workers
14
cf:deploy:manager Deploy manager to Cloudflare Pages
15
cf:deploy:ui Deploy ui-library to Cloudflare Workers
16
cf:deploy:www Deploy www to Cloudflare Pages (www.assistance.bg)
17
cf:health Check Cloudflare-deployed frontend health (www, docs, ds, ui, academy, manager, blog)
18
cf:index:search Index docs content into D1 search database
19
cf:release Full CF release: build all → deploy all → publish backend images through Artifactory

Important runtime constraint from .mise.toml: aggregate cf:deploy runs cf:deploy:preflight, which requires CLOUDFLARE_API_TOKEN. The comments state Wrangler OAuth/login is not sufficient for OpenNext Worker deploys because incremental cache population uses the KV bulk API. The token needs at least Workers Scripts edit, Workers KV Storage edit, and Cloudflare Pages edit.

Runtime-proof constraints#

  • README.md references docs/runtime/S02-RUNTIME-PROOF.md and pnpm verify:root-runtime as the durable runtime-proof contract.
  • In the current checkout, test -f docs/runtime/S02-RUNTIME-PROOF.md; echo $? returned 1, so the referenced runtime-proof artifact is absent.
  • Root docs still state the intended proof scope: guidance consistency, dev infra status/health via mise, backend build viability, and one representative apps/www production-style Playwright path.
  • Root docs explicitly say this does not prove the full multi-app e2e matrix, env-sensitive broad builds, or the known manager preview/runtime path.

Command snippets inspected#

1
find apps -maxdepth 3 \( -name 'wrangler*' -o -name 'open-next.config.*' -o -name 'next.config.*' -o -name 'vite.config.*' -o -name 'package.json' \) | sort

Confirmed Cloudflare-relevant config for all requested apps, including apps/www/wrangler.toml, apps/manager/wrangler.toml, and OpenNext/wrangler configs for docs/blog/academy/design-system/ui-library.

1
rg -n "cf:|wrangler|opennext|open-next|pages|cloudflare|podman-compose|prod:" package.json .mise.toml apps/*/package.json apps/*/wrangler* apps/*/open-next.config.*

Confirmed root wrangler@4.78.0, Pages output directories, OpenNext package usage, and all cf:*/prod:* task definitions in .mise.toml.