BillApe on your own server
Run the web app, the sync server and its database with Docker. Nothing goes to anyone else's servers, and the sync server only ever stores encrypted data.
A. Hetzner VPS (recommended)
You need a domain name, for example billape.yourdomain.nl, with an A record that points to your VPS's IP address. You set this at your domain provider.
- Log in to the VPS:
ssh root@YOUR_VPS_IP - Install Docker, once:
curl -fsSL https://get.docker.com | sh - Get BillApe:
git clone https://github.com/MrBeeAye/BillApp.git && cd BillApp/deploy - Make your settings file:
cp .env.example .env, then open it withnano .envand fill in:BILLAPE_DOMAIN=billape.yourdomain.nlPOSTGRES_PASSWORD=the output ofopenssl rand -hex 24SYNC_TOKEN=the output ofopenssl rand -hex 32. Keep this one: every device needs it.
- Start everything:
docker compose up -d --build. The first time takes a few minutes. - If you use a firewall, open it for the web:
ufw allow 80,443/tcp && ufw allow 443/udp - Open
https://billape.yourdomain.nland set up BillApe. - Go to Sync. The server address is already filled in. Paste the sync token and press Connect.
- On your other devices, open the same address and choose I already use BillApe with a sync server.
On your phone: open the same address in Safari and tap Share → Add to Home Screen.
Mac app: it syncs with this server too. Choose I already use BillApe with a sync server on its welcome screen.
Updating later: cd BillApp && git pull && cd deploy && docker compose up -d --build
Using aaPanel?
If your VPS runs aaPanel with nginx, you don't need Docker. Download the ready-made files from the BillApe server files release, upload them in aaPanel and paste two prepared nginx settings. Step by step: the aaPanel guide.
B. UGREEN NAS (DH2300)
Browsers only allow BillApe's encryption on HTTPS pages, so a plain http://192.168.x.x address on your home network won't work. Choose one of these:
Option 1 (easiest): VPS for sync, NAS for a readable copy
- In UGOS, use Docker → Image → postgres:17-alpine, set a password and map port 5432.
- Create a database called
billape_readable. - Make sure the VPS can reach the NAS, for example with Tailscale or WireGuard on both.
- In the VPS's
.env, setMIRROR_DATABASE_URL=postgres://postgres:NAS_PASSWORD@NAS_TAILSCALE_IP:5432/billape_readable - Run
docker compose up -dagain, then turn on Sync → Keep a readable copy in BillApe.
Option 2: everything on the NAS
- In UGOS, enable Docker and SSH.
- Install Tailscale on the NAS and on your devices, and turn on HTTPS certificates in the Tailscale admin.
- Follow the VPS steps above, with the NAS's Tailscale name (
nas-name.tailnet-name.ts.net) asBILLAPE_DOMAIN.
How your data is protected
- Every record is encrypted on your device with AES-256-GCM before it is sent. The key comes from your password (PBKDF2-SHA-256, 600,000 rounds).
- The sync server and PostgreSQL only ever store the encrypted data. They can't read it.
- PostgreSQL is never open to the internet. Connect from your computer with an SSH tunnel:
ssh -L 5432:127.0.0.1:5432 root@YOUR_VPS_IP - The optional readable PostgreSQL copy is not encrypted. It is off by default.
If you forget your password, your data can't be recovered. Make regular backups in Backup & export (BillApe reminds you every 30 days).
Backing up the server
docker compose exec db pg_dump -U billape billape > billape-server.sql
This file is still encrypted: only your BillApe password can open the data inside.
Need help? Get in touch.