How to Install Actual Budget (Private Envelope Budgeting on Your Own Server)

Budgeting, privately: Envelopes, bank imports, every device in sync — and nobody else sees the numbers.

Budgeting apps want a monthly fee and, worse, your bank login. Actual Budget is the open-source envelope-budgeting app (the YNAB method: give every pound a job) that runs on your server. Your laptop and phone work on a local copy and sync through the server, encrypted so the server never sees the figures. Import bank CSVs, set category budgets, see the month at a glance. One container, no accounts anywhere.

Quick reference

TaskWhat
Folder~/docker/actual/compose.yaml
Webhttp://server-ip:5006
First visitset the server password
Phonethe same web address — it's a full web app
Bank dataImport → CSV / OFX / QFX from your bank's export
EncryptSettings → Encryption — the server stores ciphertext

1. The compose file

mkdir -p ~/docker/actual && cd ~/docker/actual
nano compose.yaml

services:
actual:
image: actualbudget/actual-server:latest
container_name: actual
ports:
- "5006:5006"
volumes:
- ./data:/data
restart: unless-stopped

docker compose up -d
sudo ufw allow from 192.168.1.0/24 to any port 5006

Open http://192.168.1.50:5006. It asks you to set a server password — this protects the server; the budget itself gets its own encryption key later.

2. Create a budget

Create new file. Add your accounts (current, savings, credit card) with their current balances. Then the budget screen: a row per category group (Bills, Everyday, Savings) with categories under each, and a column for this month. The money in your accounts sits in To Budget at the top; assign it to categories until it's zero. That's the whole method — spend from envelopes, not from the account balance.

3. Import transactions

Download a CSV (or OFX/QFX) from your bank's online banking, then in Actual: the account → Import. Map the columns once (date, payee, amount); Actual remembers. Categorise the transactions; it learns payee → category and does it for you after a few. Rules (Rules in the sidebar) handle the rest: payee contains "TESCO" → Groceries.

Repeat weekly. Five minutes.

4. Sync and encrypt

Open the same address on your phone (add it to the home screen) and log in with the server password; pick the budget file. Changes merge both ways. Then Settings → Encryption → Enable: choose a key password. From now on the server stores an encrypted blob; a new device needs that password to open the file. Write the key password down — losing it loses the budget.

5. Reports and useful bits

6. Back it up

The budget is a SQLite file in ./data/user-files/ plus ./data/server-files/. Include ~/docker/actual in the nightly backup (tutorial 23). Also Settings → Export occasionally for a plain ZIP you can open anywhere.

Behind the proxy

budget.example.com → 127.0.0.1:5006 with HTTPS (tutorial 28). Keep it behind the VPN or Authelia (95) — even encrypted, it's your finances.

Troubleshooting

Phone and laptop show different numbers. One hasn't synced; the sync icon at the top. Both must use the same server address.

Forgot the server password. Stop the container, delete ./data/server-files/account.sqlite, start — it asks for a new one. Budget files are untouched.

Forgot the encryption password. Unrecoverable. Restore from an export made before encryption, or start again.

CSV import maps amounts wrongly. Some banks use separate debit/credit columns or a sign convention; the import dialog has a flip-amount toggle.

Wrapping up

One container, a server password, a budget file, a weekly CSV. The YNAB method with no subscription, no aggregator holding your bank login, and the numbers encrypted before they even reach the server. Back up the folder and write the key password down.

Call us