Firefly III
Personal finance manager for tracking what comes in and goes out, with budgets, subscriptions, recurring transactions, rules and reports. This one runs on Postgres.
Finance
Personal finance app for logging what you spend and earn across accounts and currencies, with receipt photos, scheduled transactions and charts. Imports bank statement files, GnuCash and Firefly III, and installs on a phone like an app.
It isn't in the main Portainer Templates list yet, so use this one. Portainer takes one URL at a time, so it swaps out whatever list you had before.
In Portainer, head to Settings --> App Templates, paste this in as the URL and save.
https://raw.githubusercontent.com/NotAFlightRisk/portainer-templates-extras/main/templates.json http://<your-server>:8100 in a browser.The same file Portainer deploys. It reads its settings from a .env next to it.
services:
ezbookkeeping:
image: mayswind/ezbookkeeping:latest
restart: unless-stopped
ports:
- "${EZBOOKKEEPING_PORT:-8100}:8080"
environment:
EBK_SECURITY_SECRET_KEY: ${EZBOOKKEEPING_SECRET_KEY:?Set a secret key}
EBK_SERVER_ROOT_URL: ${EZBOOKKEEPING_URL:-http://localhost:8100/}
EBK_USER_ENABLE_REGISTER: ${EZBOOKKEEPING_SIGNUPS:-true}
EBK_DATABASE_TYPE: postgres
EBK_DATABASE_HOST: postgres:5432
EBK_DATABASE_NAME: ezbookkeeping
EBK_DATABASE_USER: ezbookkeeping
EBK_DATABASE_PASSWD: ${EZBOOKKEEPING_DB_PASSWORD:?Set a database password}
volumes:
- ezbookkeeping-storage:/ezbookkeeping/storage
depends_on:
postgres:
condition: service_healthy
postgres:
image: postgres:17-alpine
restart: unless-stopped
environment:
POSTGRES_DB: ezbookkeeping
POSTGRES_USER: ezbookkeeping
POSTGRES_PASSWORD: ${EZBOOKKEEPING_DB_PASSWORD:?Set a database password}
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ezbookkeeping -d ezbookkeeping"]
interval: 10s
timeout: 5s
retries: 5
volumes:
ezbookkeeping-storage:
postgres-data:
Fill in the blanks, as ezBookkeeping won't start without them.
# Secret key (required) - Generate one with: openssl rand -hex 32. Keep it the same when you redeploy, or two-factor logins stop working.
EZBOOKKEEPING_SECRET_KEY=
# Database password (required) - Generate one with: openssl rand -hex 32. Keep it the same when you redeploy, or ezBookkeeping can't reach its database.
EZBOOKKEEPING_DB_PASSWORD=
# Host port for the web UI
EZBOOKKEEPING_PORT=8100
# Address you'll open it on - Like http://192.168.1.10:8100/. Receipt photos, profile pictures and the phone QR code all point here, so they break on any other address.
EZBOOKKEEPING_URL=http://localhost:8100/ Grab the file and start it.
mkdir ezbookkeeping && cd ezbookkeeping
curl -fsSL -o compose.yml https://raw.githubusercontent.com/NotAFlightRisk/portainer-templates-extras/main/apps/ezbookkeeping/compose.yml
# save the .env tab here as .env first
docker compose up -d Set both secrets before you deploy (openssl rand -hex 32 makes good ones), since the stack won't start without them, and keep them the same when you redeploy. Put the address you'll actually type in the browser in the address field too, or receipt photos won't load. Then open http://<your-host>:8100 (or whichever port you picked) and create an account. Tick Use Preset Transaction Categories on the second step, or you start with none. Every account gets its own separate books, but sign-ups stay open, so once you've made yours add EZBOOKKEEPING_SIGNUPS = false to the stack's environment variables and update the stack. Exchange rates come from the European Central Bank, and maps load from OpenStreetMap. Everything lives in Postgres, in the postgres-data volume, with receipt photos and avatars in ezbookkeeping-storage. Docs: ezbookkeeping.mayswind.net
What the Portainer form asks for. With compose they go in the .env file instead.
| Variable | What it's for | Default |
|---|---|---|
EZBOOKKEEPING_SECRET_KEY | Secret key (required) Generate one with: openssl rand -hex 32. Keep it the same when you redeploy, or two-factor logins stop working. | Needs filling in |
EZBOOKKEEPING_DB_PASSWORD | Database password (required) Generate one with: openssl rand -hex 32. Keep it the same when you redeploy, or ezBookkeeping can't reach its database. | Needs filling in |
EZBOOKKEEPING_PORT | Host port for the web UI | 8100 |
EZBOOKKEEPING_URL | Address you'll open it on Like http://192.168.1.10:8100/. Receipt photos, profile pictures and the phone QR code all point here, so they break on any other address. | http://localhost:8100/ |
The containers this stack runs, with ports as they come out of the box.
| Service | Image | Ports |
|---|---|---|
ezbookkeeping | mayswind/ezbookkeeping:latest | 8100:8080 |
postgres | postgres:17-alpine | Internal only |