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
- docker-compose.yml
- env.example - copy to
.env
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).