Self-hosted internal tools platform for GlitchTip, Plane, and n8n behind Caddy.
docker-compose.ymldefines the stack..envholds shared domains, image tags, and reverse-proxy auth.services/holds app-specific runtime settings.db/init/01-init.shcreates the shared PostgreSQL databases and roles.Caddyfileroutes HTTPS traffic to the apps.scripts/update.shpulls new images and recreates the stack.docs/setup.md,docs/hetzner.md, anddocs/runbook.mdcover bootstrap and operations.
- General setup: docs/setup.md
- Hetzner-specific setup: docs/hetzner.md
- Operations runbook: docs/runbook.md
- Copy .env.example to .env.
- Copy the service templates from
services/glitchtip.env.example,
services/plane.env.example,
and
services/n8n.env.example
to matching
.envfiles. - Point
issues.bobadilla.tech,tasks.bobadilla.tech, andflows.bobadilla.techat the VPS. - Run
./scripts/generate-secrets.sh --applyto populate the generated secrets. - Run
docker compose up -dfrom the repository root.
GlitchTip is exposed on issues.bobadilla.tech, Plane on
tasks.bobadilla.tech, and n8n on flows.bobadilla.tech.
GlitchTip uses consolemail:// by default in this repo so signup emails are
written to the container logs instead of requiring SMTP. Swap EMAIL_URL in
services/glitchtip.env if you want real outbound mail.
Plane also requires SMTP variables in services/plane.env for invite and
password reset email delivery. See docs/setup.md for a Resend SMTP example.
- Caddy handles TLS termination and host-based routing for all apps.
- Plane also needs RabbitMQ and MinIO, so those are included as internal support services.
- Retention is configured in the app env files rather than by an external backup or monitoring layer.
- If services drift into DB auth or startup-order failures, run
./scripts/recover.sh.