Self-hosted deployment platform for a single Linux server. One command installs it, one screen deploys your app, and your own domain gets HTTPS automatically.
On a fresh Ubuntu 22.04+ or Debian 12+ server, as root:
curl -fsSL https://raw.githubusercontent.com/rokartur/vexdock/main/installer/install.sh | sudo shIt installs Docker if missing, starts the stack and prints the dashboard address together with a one-time setup token. Open the address, enter the token and create the administrator account.
docs/install.md covers options, updating and uninstalling.
- Deploy from Git or Docker Compose. Push to your branch, the platform clones, validates, builds, starts and health checks the stack. Every step is streamed live.
- Domains with HTTPS. Add
app.example.com, choose the service and port. Nginx is generated, validated and reloaded. Let's Encrypt issues and renews the certificate, or you upload your own and the platform leaves it alone. Add a Cloudflare API token to switch to the DNS-01 challenge and issue*.example.com. - Deploy notifications. One webhook URL, posted to when a deployment succeeds or fails. Discord and Slack are detected automatically.
- Backups. Snapshots of both databases, the proxy config, the certificates and the master key, with application volumes included on request.
- Instant rollback. Every deployment records its commit. Redeploy any previous one from the history.
- Full Docker visibility. Containers, images, volumes and networks on the host, including stacks the platform did not create.
- Logs, metrics and a terminal. Live container logs, CPU/RAM/network stats and an interactive shell, all in the browser.
- Managed databases. PostgreSQL, MySQL, MariaDB, MongoDB and Valkey added to a project with their image, volume and credentials generated, or any other image you name.
- Site analytics. Flip a switch on a domain and Nginx starts counting page views, unique visitors, who is reading what right now, visit length, bounce rate, referrers, regions, devices and your own events. No script tag in your app, no cookie, no third party.
- API tokens. The same REST API the dashboard uses, for CI.
- Audit log. Who changed what, when, and from where.
Kubernetes, multi-server orchestration, autoscaling, a plugin system and a
managed control plane are all out of scope. Everything runs as plain Docker
Compose projects on one host, so nothing is locked in: docker compose up still
works if the platform is removed.
Three containers.
| Component | Role |
|---|---|
vexdock-manager |
Go binary. Owns the Docker socket, SQLite state, the deploy pipeline, Nginx generation and ACME. |
vexdock-auth |
better-auth on Bun. Owns accounts and sessions; the manager only validates them. |
vexdock-nginx |
Reverse proxy for every application plus the static dashboard. |
Applications are ordinary compose projects joined to a shared vexdock-proxy
network under a stable alias, so a recreated container keeps serving without
touching the proxy configuration.
State lives in /opt/vexdock:
/opt/vexdock
├── compose.yml system stack
├── .env version, options, session secret, setup token (0600)
├── data/app.db SQLite: projects, domains, deployments
├── data/auth.db SQLite: accounts and sessions (better-auth)
├── projects/<id>/ one directory per environment (repository, .env,
│ managed.yml and services/ for managed services);
│ a project's default environment uses the project's id
├── nginx/generated/ one .conf per domain, written by the manager
├── certificates/ Let's Encrypt certificates and the account key
├── secrets/master.key AES key protecting secrets in the database (0600)
└── backups/<stamp>/ both databases, master key, proxy config,
certificates, volumes/
More detail in docs/architecture.md.
- Ubuntu 22.04+ or Debian 12+, amd64 (the published images are amd64 only)
- 1 GB RAM (2 GB if you build images on the server)
- Ports 80, 443 and 3000 free
- Docker is installed by the installer if missing
make check # go vet, go test, typecheck
make dev-up # build the three images and run the whole stack locally
make run # manager only, against ./.vexdock
make web # rebuild the dashboard; the running stack serves it at once
make web-dev # dashboard on :5173 with HMR, proxying /api to the stack
./scripts/smoke-test.shmanager/Go manager. Standard library HTTP, SQLite, Docker SDK.apps/auth/authentication. better-auth on Bun, its own SQLite database.apps/web/dashboard. TanStack Start in SPA mode with shadcn/ui, built to static files.docker/image definitions and the Nginx base configuration.installer/install.shinstall, update and uninstall in one script.
- docs/install.md installing, updating, uninstalling
- docs/architecture.md how the pieces fit together
- docs/api.md REST API and API tokens
- docs/security.md the security model
- docs/troubleshooting.md when something breaks
- CONTRIBUTING.md
AGPL-3.0. Running a modified version as a network service obliges you to publish those modifications.