Deploy your first app
This walks through deploying a tiny Node.js app end-to-end. The same shape works for Ruby, Python, Go, PHP, anything dokku-compatible — which is essentially anything that runs on Heroku.
Before you start
- The CLI installed and authenticated against the control plane.
- At least one provisioned stack in your account. Create one in the dashboard (Stacks → New) for AWS, GCP, or OpenStack, or add an SSH stack pointing at a server you already own.
- A repo to deploy. If you don't have one handy, scaffold this in a fresh directory:
$ mkdir hello && cd hello
$ cat > package.json <<'JSON'
{ "name": "hello", "private": true, "engines": { "node": ">=20" }, "scripts": { "start": "node index.js" } }
JSON
$ cat > index.js <<'JS'
require('http').createServer((_, r) => r.end('hello from ownstack')).listen(process.env.PORT)
JS
$ echo "web: npm start" > Procfile
$ git init -b main && git add . && git commit -m initial
1. Generate the app
From inside the repo, scaffold an app and link your checkout to it:
$ ownstack generate --no-interview hello buildpack
$ ownstack remote -a hello
generate scaffolds the app and writes a minimal .ownstack-config in your repo. remote -a embeds the app token so subsequent commands know which app to talk to.
2. Pick a stack
Apps deploy to one or more stacks. If you only have one provisioned stack, the deploy will use it automatically. If you have several, attach the one you want explicitly:
$ ownstack stacks
ID NAME IP STATUS PROVIDER
jJCsl6B9... prod-cluster-1 54.x.x.x provisioned aws
$ ownstack app stacks:add hello prod-cluster-1
3. Deploy
$ ownstack deploy
Triggering deploy for app 47…
✓ Deploy started
The control plane enqueues a deployment job, SSHes to the stack, pushes your repo to dokku, runs the buildpack and the release task, and rotates traffic to the new container. Build logs stream live with --wait:
$ ownstack deploy --wait
Or fetch them after with ownstack remote deploy-log.
4. View it
$ ownstack app info
hello
Status: deployed
Domain: hello.<stack-domain>
Stack: prod-cluster-1 — deployed abc1234
Hit the URL in a browser. If something looks wrong, ownstack remote logs --tail 100 --follow tails the running container.
What's next
- Custom domain — see Add a custom domain.
- Add a database — Postgres walks through provisioning and linking.
- Scale processes — Scale processes.
- Tail logs —
ownstack remote logs --follow.