boxx [v0.3.2]

features

a small contract

An app runs on boxx if it's a Docker image, listens for HTTP on port 80 and answers GET /up with a 2xx. Public or private registry.

https for every hostname

Caddy sits in front and gets a Let's Encrypt certificate per hostname. Give an app several hostnames, redirect www to the primary, or add a wildcard and read the Host header to tell tenants apart.

$ boxx install <image> --host example.com --redirect-host www.example.com

zero-downtime deploys

The new container starts beside the old one. Once GET /up returns 2xx, the proxy switches over and the old container drains before it's removed.

databases on request

Pick none, MySQL or Postgres at install. boxx runs it on a private Docker network, generates the credentials and hands your app DATABASE_URL. boxx db forward opens a local port for your tools.

storage that survives

Each app gets a Docker volume at /storage. It survives redeploys and image changes. boxx remove deletes it unless you pass --keep-data.

groups

Put several apps behind one hostname, routed by path, with one shared database for the group.

updates on your terms

Each app has an update policy: off, notify or auto. A systemd timer checks the registry, and boxx upgrade updates boxx itself.

one operation at a time

Operations take a lock and write to an ops log you can open from the TUI with L, so two deploys never collide. boxx doctor checks the host.