Installation & deployment

One Docker image, one MariaDB container, one command. There's no source checkout and no separate database setup step - ZenBooks imports its own schema the first time it starts.

What you need

  • Docker Engine + Compose plugin. Any Linux distribution's official Docker install includes both - see docs.docker.com/engine/install. Docker Desktop (Mac/Windows) also works for local testing.
  • A license key or a free trial. Subscribe first (see pricing) and generate a license key on your account page, or skip that and start a 14-day free trial directly from the app's own sign-in screen once it's running - either way works, you never have to register twice. See First-time setup for what that screen looks like.

Deploy: two files, one command

Put both files in an empty folder on your server.

1. Download

2. Configure

Set a database password and this install's license server.

# in that folder
cp env.example .env
# edit .env: DB_PASSWORD, DB_ROOT_PASSWORD, LICENSE_SERVER_URL

3. Run it

Pulls the published image automatically and starts both containers.

docker compose up -d

4. Sign in

Open http://your-server:8080 (or whatever PORT you set in .env). A clean install offers signing in with a license key or starting a free trial - see First-time setup for exactly what that screen looks like and what happens next.

Security

ZenBooks never phones home with your books. The two things worth getting right yourself:

Everything stays on your server

The ledger, invoices, and attachments live only in the MariaDB container above - nothing accounting-related is ever sent to this site or anywhere else. This site only ever sees a license key (Admin → Users → License) and, if you enable it, an admin's email/name during first sign-in - never company data.

Put HTTPS in front of it before exposing it

docker compose up above serves plain HTTP - fine for testing on localhost, but if you (or your team) need to reach it from outside your own network, put a reverse proxy with a real TLS certificate in front of it first, so login credentials and session tokens are never sent in the clear.

# Caddyfile - Caddy issues and renews a Let's Encrypt certificate automatically
zenbooks.yourdomain.com {
  reverse_proxy localhost:8080
}

Only need it on your own network? Skip public HTTPS entirely - don't publish PORT beyond your LAN/VPN (bind it to a private interface, or firewall it off from the public internet). MariaDB's own port is never published outside the two containers' own network to begin with - only the app's PORT needs this thought.

Updating

Database migrations run automatically on startup - just pull the new image.

docker compose pull zenbooks
docker compose up -d

A failed migration doesn't take the app down - it still starts and serves whatever isn't affected, with a clear banner explaining what's wrong and a Retry button once you've fixed it (see Interface overview for what that banner looks like).