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