Skip to content

SplitPro

Last Updated: 2026-05-31 Status: ✅ Active

Purpose

Shared expense splitting for the household. Tracks who owes what across shared purchases and trips.

Location

Hosted on Lotus (Primary NAS)
Container names splitpro, splitpro-postgresql17
Local URL http://192.168.1.80:30123
External URL https://splitpro.djchome.uk

Access

Always access via https://splitpro.djchome.uk — Tailscale must be active.

Authentication is via Google OAuth (sign in with Google). Both Dan and Gabriela use their Google accounts.

Configuration

Containers

Two containers — start database first, stop app first:

Container Image Notes
splitpro-postgresql17 ossapps/postgres:17.7-trixie Custom image with pg_cron built in — do not substitute vanilla postgres:17
splitpro ossapps/splitpro:latest App container

Database container — Post Arguments

postgres -c shared_preload_libraries=pg_cron -c cron.database_name=splitprodb -c cron.timezone=UTC

pg_cron is required by splitpro for recurring expense functionality. It is configured via Post Arguments — there are no mounted config files needed.

Key Environment Variables (splitpro container)

Variable Value
NEXTAUTH_URL https://splitpro.djchome.uk
NEXTAUTH_URL_INTERNAL http://splitpro:3000
GOOGLE_CLIENT_ID See Bitwarden: SplitPro Google OAuth
GOOGLE_CLIENT_SECRET See Bitwarden: SplitPro Google OAuth

Google OAuth credentials are in the existing homelab Google Cloud project. Redirect URI: https://splitpro.djchome.uk/api/auth/callback/google

Data

Path Contents
/mnt/user/appdata/postgresql17 PostgreSQL data directory
/mnt/cache/appdata/splitpro/uploads Receipt images and file uploads

Backup

Two-stage process:

  1. Appdata Backup plugin runs nightly on Lotus — stops each container before copying, ensuring a consistent backup
  2. Daily rsync cron job copies the backup from Lotus to Cooper

Stop/start order for the backup plugin: - Stop: splitprosplitpro-postgresql17 - Start: splitpro-postgresql17splitpro

Recovery

Restore via the Appdata Backup plugin — works on either Lotus or Cooper.

  1. Restore appdata from backup using the Appdata Backup plugin on the target server
  2. Recreate both containers using the same template settings if not already present
  3. Start splitpro-postgresql17 first, then splitpro
  4. App runs database migrations automatically on startup
  5. Update DNS if restoring to Cooper

Known Issues

Issue Status Notes
postgres:17 vanilla image missing pg_cron Resolved Must use ossapps/postgres:17.7-trixie — see below

Why not vanilla postgres:17

SplitPro requires the pg_cron PostgreSQL extension, which is not included in the official postgres:17 Docker image. The ossapps/postgres:17.7-trixie image is the project's own image with pg_cron pre-installed. When updating the database container, always check the splitpro releases for the current recommended image tag rather than pulling vanilla postgres.