A lightweight, deterministic deploy toolkit for Docker Compose workloads on a VPS.
Designed for small production stacks that need safer, repeatable deployments without adopting a full orchestration platform.
It provides a deterministic deploy engine with safety checks, migration execution, health validation, and cleanup, exposed through a simple CLI plus a thin GitHub Actions adapter.
- Single host, single environment (production)
- CLI engine:
doctor(preflight)deploy(full pipeline)verify(health verification)
- Config contract in one env file:
config/project.env - GitHub Actions template for remote deploy over SSH
- GitHub Actions templates for app repos (build/push/dispatch)
- Copy the config template:
cp config/project.env.example config/project.env-
Edit required values in
config/project.env. -
Run preflight checks on target host:
bash scripts/doctor.sh --config config/project.env- Run deploy:
bash scripts/deploy.sh --config config/project.env- Verify services:
bash scripts/verify.sh --config config/project.envdeploy runs these stages in order:
- preflight checks
- env materialization/update
- registry login
- image pull
- migration run
- compose up/recreate
- health checks
- cleanup/report
Dry-run mode:
bash scripts/deploy.sh --config config/project.env --dry-runscripts/: CLI engine (doctor.sh,deploy.sh,verify.sh)scripts/lib/: shared runtime helpersconfig/: configuration contract (project.env.example)workflows/github/: reusable GitHub Actions templatesexamples/minimal-compose/: generic sample stack and onboarding filesdocs/: architecture/config notes
Use workflows/github/deploy.yml as template in your infrastructure repository.
It is intentionally thin: it only resolves inputs/secrets, opens SSH, and invokes the CLI engine remotely.
For app repositories, use:
workflows/github/backend-build-dispatch.ymlworkflows/github/frontend-build-dispatch.yml
These templates build and push images, then dispatch infra deploy with image tags.
Full integration guide:
docs/github-integration.md
shellcheckfor scriptsshfmt -dfor formatting checks- smoke tests in
scripts/tests/mvp-smoke.sh
MIT