Deploy ezBookkeeping

Personal finance app for tracking accounts, spending and budgets

Deploy ezBookkeeping

Just deployed

/data

Just deployed

/var/lib/postgresql/data

ezbookkeeping-storage

Bucket

Just deployed

Deploy and Host ezBookkeeping on Railway

ezBookkeeping is a lightweight, open-source personal finance app that records daily transactions, imports bank statements, and shows where the money actually goes. It keeps two-level accounts and categories, attaches receipt photos, runs scheduled transactions, and ships a statistics module with pie, bar and trend charts. It is a single Go binary with a Vue front end serving tailored desktop and mobile layouts from one URL.

Deploy ezBookkeeping on Railway and you get the production shape in one click, not one container with a SQLite file. The ezbookkeeping service serves the UI and JSON API on port 8080 behind a generated HTTPS domain. Postgres holds every account, transaction, category and tag. A Railway object-storage bucket holds receipt images and avatars, keeping the app stateless so uploads survive redeploys without a volume. mailpit is a private SMTP server with a password-protected inbox on a second domain, so "Forgot password" works from the first minute instead of failing silently. The first account is created at startup from credentials you supply at deploy time, and self-registration is off, so the instance is never briefly open to whoever finds the URL first.

Railway diagram linking ezBookkeeping, Postgres and Mailpit

Getting Started with ezBookkeeping on Railway

Set EZBK_ADMIN_USERNAME and EZBK_ADMIN_PASSWORD when you deploy — they become your login, and the container creates that account before it accepts traffic. Open the public URL and sign in; there is no setup wizard. Start in Accounts and add what you actually track — a current account, a card, a cash wallet — each with its opening balance and the date that balance was true. Then open Transaction Categories and create your income and expense categories; they nest two levels deep, so "Food & Drink → Groceries" works. Add a transaction from Transaction Details → Add, pick a category and account, and attach a receipt photo — if it shows up in the Transaction Gallery, object storage is wired up correctly. After a handful of entries Overview fills in with monthly totals and an asset summary, and Statistics & Analysis draws category breakdowns and trends. To check the mail tier, use "Forgot password" and read the message in the mailpit inbox with the MP_UI_AUTH credentials.

ezBookkeeping overview with asset summary and monthly totals

Dated ezBookkeeping transaction list with categories and accounts

Stacked monthly expense trend chart by spending category

About Hosting ezBookkeeping

ezBookkeeping solves the problem every budgeting app runs into: you want years of searchable history in one place, not in someone else's analytics warehouse. It suits households tracking several currencies, freelancers separating business from personal spending, and anyone who has outgrown a spreadsheet.

Key features:

  • Two-level accounts and categories, multi-currency with automatic exchange-rate updates
  • Receipt image attachments and a monthly gallery view
  • Scheduled transactions from a built-in job runner
  • Pie, bar, column and trend charts, plus a custom Insights Explorer
  • Import/export: CSV, OFX, QFX, QIF, IIF, Camt, MT940, GnuCash, Firefly III, Beancount
  • 2FA, OIDC login, login rate limiting, PIN/WebAuthn app lock
  • Optional receipt recognition and MCP access for AI assistants

Postgres is the only database the app needs. The bucket keeps image uploads off the container filesystem, and mailpit is capture-only: it accepts mail on the private network and shows it in a browser.

Why Deploy ezBookkeeping on Railway

Railway removes the parts of self-hosting that cost an evening:

  • Postgres, object storage and a mail inbox provisioned and wired together for you
  • HTTPS and a public domain issued automatically
  • The first account seeded at startup, so nothing is left open to the internet
  • Scaling from the dashboard, no config file to edit
  • Usage-based billing, so a personal ledger costs personal-ledger money

Common Use Cases for Self-Hosted ezBookkeeping

  • A household ledger across current accounts, cards and cash in several currencies
  • A freelancer separating business receipts from personal spending, with exports for an accountant
  • Replacing a spreadsheet with searchable history, recurring entries and quarterly charts
  • Feeding a private financial dataset to an AI assistant over MCP, not a third-party service

Dependencies for ezBookkeeping on Railway

  • ezbookkeepinggridalpha/ezbookkeeping-railway, built on the official mayswind/ezbookkeeping:latest image; UI and API on port 8080.
  • Postgresghcr.io/railwayapp-templates/postgres-ssl:latest on a volume; every record lives here.
  • Object storage bucket — transaction pictures and avatars, read back through the app's authenticated route, so nothing is publicly readable.
  • mailpitaxllent/mailpit:latest on a volume; SMTP on 1025, inbox on 8025 behind basic auth.

Environment Variables Reference

VariableServiceWhat it does
EZBK_ADMIN_USERNAMEezbookkeepingLogin for the account created at startup
EZBK_ADMIN_PASSWORDezbookkeepingIts password — change it after the first sign-in
EZBK_ADMIN_DEFAULT_CURRENCYezbookkeepingISO 4217 code for that account
EBK_USER_ENABLE_REGISTERezbookkeepingfalse by default; true opens self-registration
EBK_SECURITY_SECRET_KEYezbookkeepingSigns sessions, encrypts 2FA secrets — never rotate on a live instance
EBK_MAIL_ENABLE_SMTPezbookkeepingOutbound mail switch; point the host at a real relay to send externally
MP_UI_AUTHmailpituser:password guarding the inbox

Deployment Dependencies

  • Source:
  • Image:
  • Docs:
  • Demo:

Hardware Requirements for Self-Hosting ezBookkeeping

ResourceMinimumRecommended
CPU1 shared vCPU2 vCPU
RAM256 MB app, 256 MB Postgres512 MB each
Storage1 GB Postgres volume5 GB plus bucket space for receipts
RuntimeGo binary, Linux amd64/arm64

Self-Hosting ezBookkeeping with Docker

The quickest local run uses SQLite in one container:

docker run -d --name ezbookkeeping -p 8080:8080 \
  -v ezbookkeeping-data:/ezbookkeeping/data \
  -v ezbookkeeping-storage:/ezbookkeeping/storage \
  mayswind/ezbookkeeping:latest

Every setting in conf/ezbookkeeping.ini has an EBK_<section>_ environment variable, which is how this template configures Postgres and object storage with no config file:

docker run -d --name ezbookkeeping -p 8080:8080 \
  -e EBK_DATABASE_TYPE=postgres \
  -e EBK_DATABASE_HOST=db:5432 \
  -e EBK_DATABASE_NAME=ezbookkeeping \
  -e EBK_DATABASE_USER=ezbookkeeping \
  -e EBK_SECURITY_SECRET_KEY=replace-with-a-long-random-string \
  mayswind/ezbookkeeping:latest

To create the first user without a registration form, run ezbookkeeping userdata user-add in the container with --username, --email, --nickname, --password and --default-currency.

How Much Does ezBookkeeping Cost to Self-Host?

ezBookkeeping is free and MIT licensed — no paid edition, no per-seat pricing, no licence key, no vendor account. On Railway you pay only for the compute, the Postgres volume and the object storage the deployment uses, a small footprint for a personal ledger. The optional receipt-recognition feature calls an external AI provider, and stays off unless you configure a model.

FAQ

What is ezBookkeeping? An open-source, self-hosted personal finance app written in Go. It records transactions across multiple accounts and currencies, attaches receipt images, and charts your spending.

What does this Railway template deploy? Four pieces: the ezbookkeeping app on a public HTTPS domain, Postgres on a volume, an object-storage bucket for receipt images and avatars, and a mailpit inbox that captures outgoing mail behind its own password.

Why does the template include Postgres instead of SQLite? SQLite would put the whole ledger in one file on the container's disk. Postgres gives you real backups, room to grow and a clean separation between app and data, which makes redeploys safe.

Why is an object-storage bucket included? Receipt photos and avatars are uploaded by users, not baked into the image. A bucket keeps the app stateless, so last year's upload survives the next redeploy.

How do I log in for the first time, and can other people sign up? Use the username and password you set as EZBK_ADMIN_USERNAME and EZBK_ADMIN_PASSWORD. Self-registration is disabled by default; set EBK_USER_ENABLE_REGISTER=true to let someone else create an account.

How do I send real email instead of capturing it? Point EBK_MAIL_SMTP_HOST, EBK_MAIL_SMTP_USER and EBK_MAIL_SMTP_PASSWD at your own provider, or set mailpit's relay settings to forward what it receives.

Can I import data from another budgeting app? Yes. Import reads CSV, OFX, QFX, QIF, IIF, Camt.052/053, MT940, GnuCash, Firefly III and Beancount files, and a matching export takes it elsewhere.


Template Content

More templates in this category

View Template
Rocky Linux
Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀

codestorm
47
View Template
Foundry Virtual Tabletop
A Self-Hosted & Modern Roleplaying Platform

Lucas
71
View Template
Letta Code Remote
Run a Letta Code agent 24/7. No inbound ports, just deploy.

Letta
51