Apps & deploys
Deploy from a GitHub repo, a Docker image or a one-click template. Every deploy is zero-downtime, and rollback is one click.
Create an app
Apps → New app offers three sources:
| Source | What you give it |
|---|---|
| GitHub repo | Repo URL, branch, and an optional token for private repos (stored encrypted) |
| Docker image | Any image reference, e.g. ghcr.io/acme/api:1.4 |
| Template | Postgres, MySQL, MariaDB, Redis, MongoDB, n8n, Uptime Kuma, Plausible, Umami, MinIO, Ghost, WordPress |
App names are lowercase slugs (a-z, 0-9, -). Everything that takes an app id also accepts its name.
Build types
| Type | Behavior |
|---|---|
auto | Uses your Dockerfile if there is one. Otherwise it generates one for Node (package.json), Python (requirements.txt/pyproject.toml), Go (go.mod) or static sites (index.html). |
dockerfile | docker build -f <dockerfilePath> <buildContext> |
compose | docker compose -p docksy-<name> up -d --build |
image | docker pull, then run |
No Dockerfile, or a complicated one? Ask Claude: "dockerize this repo for Docksy". The docksy-dockerize skill writes a multi-stage, non-root Dockerfile and a .dockerignore.
The deploy pipeline
Every step runs on your server over SSH:
- Clone with
git clone --depth 1 -b <branch>, recording the commit SHA and message. - Build the image and tag it
docksy/<app>:<deploy>. - Start the new container next to the old one, on the
docksynetwork, with your env, volumes and--restart unless-stopped. - Health check: it waits for
healthcheckPathto answer (via wget/curl inside the container), or for the container to stay running for 5 seconds. The timeout is 120 seconds. - Switch: the old container is removed only once the new one is healthy. If anything fails, the new container is removed and the old one keeps serving.
- Clean up: old build directories are pruned, and the last 5 images per app are kept for rollback.
Each app runs one deploy at a time, and up to 3 run in parallel across the instance. Build logs stream live on /deployments/:id.
Domains & HTTPS
- Every routed app gets a free default domain:
<app>.<server-ip>.sslip.io. - For a custom domain, add an
Arecord pointing at the server's IP, then add the domain in the app settings. The first domain is the primary one. - TLS certificates are issued and renewed automatically by the Caddy proxy.
- Set Port to the port your app listens on inside the container.
Environment variables
Env vars are encrypted at rest, masked in the UI and API (reveal on demand), and injected at container start. Changes apply on the next deploy.
Auto-deploy on push
- Open the app → Settings and copy the webhook URL and secret.
- In GitHub: Repo → Settings → Webhooks → Add webhook. Use content type
application/json, paste the secret, and pick "Just the push event". - Docksy verifies
X-Hub-Signature-256and deploys pushes to the app's branch when auto-deploy is on.
Rollback
From Deployments, pick any previous succeeded deployment that still has its image and click Rollback. It goes through the same zero-downtime switch, so no rebuild is needed. From the CLI: docksy rollback <app> [deploymentId]. From Claude: /docksy:rollback <app>.
Restart, stop, start, delete
- Restart / Stop / Start act on the app's running containers.
- Delete removes the app's containers (and its compose project). Volumes are kept unless you choose to delete them too.
Logs
The app's Logs tab streams docker logs -f live. Build logs are kept for each deployment. From a terminal: docksy logs <app> -f.