Docker Compose example app for Node Hub - Compose type
The Verify gate's legacy-fanout fallback (pytest/npm/cargo) was triggering
because the _extract_verify_commands regex requires the entire bullet payload
to be a single backtick-wrapped command. Lines like
- [ ] `bash -n .githooks/pre-commit` — shell syntax check passes.
fail fullmatch (prose after the closing backtick), so extraction returns []
and the runner falls back to the tool-fanout — which fails on this
bare/config-only repo (no package.json, no Cargo.toml).
Reformat each checklist bullet so the payload IS the command, with no
trailing prose. Same four commands; extraction now yields 4 entries and
run_plan_verify passes.
|
||
|---|---|---|
| .githooks | ||
| .kilo/plans | ||
| .gitignore | ||
| app.yml | ||
| docker-compose.yml | ||
| README.md | ||
Compose Example - Multi-Service App
This is a multi-service app demonstrating the Compose App packaging mode.
Files
app.yml- Launcher manifest withtype: composedocker-compose.yml- Multi-service compose file
Services
- web (nginx:alpine) - Public-facing web server
- db (postgres:16) - Internal database (not exposed to host)
How It Works
The launcher:
- Reads
app.ymland seestype: compose - Uses your
docker-compose.ymlas-is (with security transformations) - Only proxies the service named in
compose.proxyService(the "web" service) - Other services (like "db") run internally but are NOT exposed to the host
Security
The launcher rejects compose files with:
build:instructionsenv_file:- Bind mounts (
./,../, absolute paths) privileged,network_mode: host, etc.${VAR}interpolation
See the main README for full security limits.
Testing Locally
# Start services
docker-compose up -d
# Check they're running
docker-compose ps
# Stop
docker-compose down
Deploying via Forgejo Actions
This app includes a workflow at .forgejo/workflows/deploy.yml that:
- Validates - Checks compose file syntax
- Tests - Starts services and runs tests
- Deploys - On push to main, deploys to the launcher
Setup
-
Configure secrets in your Forgejo repository:
LAUNCHER_URL- Your launcher URLLAUNCHER_TOKEN- API token from the launcher
-
Push to main - The workflow validates, tests, then deploys
Using External Images
You can use images from any registry (Docker Hub, Forgejo registry, etc.):
# docker-compose.yml
services:
web:
image: "nginx:alpine"
db:
image: "postgres:16"
Or build and push to Forgejo's Docker registry:
services:
myapp:
image: "https://git.yourforgejo.com/youruser/yourrepo/myapp:latest"
Zip for Manual Upload
zip -r compose-example.zip app.yml docker-compose.yml
Then upload via the web UI or API.