Deploy by hand (CLI)¶
The Claude skill is convenient, but it's only a wrapper around the allocus CLI.
If you'd rather drive the deploy yourself — or you're deploying from a machine
without Claude — here's the whole thing.
Prerequisites¶
- Docker with
buildx(bundled with modern Docker Desktop / Engine). - A launched box and your API key (from your dashboard).
- The CLI installed and logged in:
1. Describe the app¶
From your app's repo, scaffold the two files a deploy needs:
This writes:
allocus.yaml— the app manifest. It's intentionally tiny:Dockerfile— a starter, only if you don't already have one. Replace it with your app's real Dockerfile.
--name defaults to the current directory name; --port defaults to 8080.
2. Make sure your Dockerfile fits¶
There's essentially one rule: your app must listen on the port from
allocus.yaml, and the Dockerfile must EXPOSE it. A minimal example:
FROM python:3.12-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
EXPOSE 8080
CMD ["python", "app.py"] # must bind 0.0.0.0:8080
Bind to 0.0.0.0, not localhost
Inside the container your app must listen on 0.0.0.0:<port>, not
127.0.0.1, or Traefik can't reach it.
3. Deploy¶
That single command:
- builds your
Dockerfilefor linux/amd64 and tags it with your git SHA, - pushes it to your private registry namespace,
- calls the deploy broker, which instructs your box to pull and run it.
A moment later it's live:
Note the word queued — that's all a bare allocus deploy promises. Add --wait and
it blocks until your box reports the app healthy, or names the service that failed:
Use it whenever you care about the answer, and always in CI.
Deploy more apps by repeating this in each repo — they share the box, each at its own subdomain.
Rolling back¶
Every deploy is tagged with an immutable git SHA, so a rollback is just redeploying an earlier one (no rebuild):
Checking on things¶
allocus status # your box + apps at a glance, plus CPU/memory/disk
allocus logs # this repo's app, straight from the container
allocus apps # just the app list
There's no SSH and no exec — the box is firewalled to web traffic, and logs works by
asking its agent to fetch the output for you. That covers most of what you'd have opened a
shell for; troubleshooting covers the rest.
For the full command list, see the CLI reference. To understand what each step is doing under the hood, see How it works.