Skip to content
All guides

ship

Shipping vs Docker

Ship is the one obvious way to deploy a Buraaq service. A ship is a hashed native bundle (.bur). A dock is a live accept loop on :7422 that receives ships and runs them as processes.

You still write the same Keel program:

fn main() {
    page("/", "public/index.html")
    api("items", "title, body")
    run()
}

Locally:

buraaq up

On a server:

buraaq land user@HOST --cloud hetzner
buraaq ship HOST

Beginner: what you are replacing

Docker's unit of deploy is an image: a guest userspace, layers, a registry, a daemon. You describe a machine, then hope the app inside it is healthy.

Buraaq's unit of deploy is a binary plus its files, hashed. The OS is the host OS. There is no second Linux inside Linux.

DockerBuraaq Ship
ArtifactImage layers + guest FSOne .bur (exe + public/ + optional certs)
Runtimecontainerd / dockerdA child process under Dock
Isolationnamespaces, cgroupsDedicated directory + pid + SHA-256 pin + token
Start costPull, extract, overlayCopy, verify hash, exec
ConfigDockerfile, compose, K8sburaaq pack / ship / dock / land
App portswhatever you mapKeel 8080 / TLS 8443
Control planeDocker API / K8sDock 7422 (HTTP + bearer)

Use Docker when you need a foreign OS or a distro you do not want on the host. Use Ship when the app is Buraaq: compiled for that host, same ISA, same Keel TLS API.

Intermediate: why it is faster to think

  1. Same OS as you packed. Windows .bur → Windows dock. Linux → Linux. No "works in Alpine."
  2. Integrity is the file. Tamper the bytes, launch refuses. You do not rebuild 40 layers to get a checksum.
  3. Secrets stay on the host. BURAAQ_DATABASE_URL is environment, like a well-run VM: not baked into an image unless you packed it on purpose.
  4. Two ports, two jobs. Users never talk to 7422. Browsers talk to Keel.

Advanced: what this is not

Dock is not a sandbox for untrusted tenants. It is not gVisor, not a VM, not Kubernetes. Isolation is process + directory. Share a dock only with code you would run as a service account on that box.

Rollback is "ship the previous .bur hash," not a Deployment object. See advanced shipping.

The user-facing ports

  • App: http://SERVER:8080 and https://SERVER:8443
  • Dock: control only, port 7422

Next: pack | dock | land | advanced | security