Sure
Personal finance and wealth management app for everyone
Alternative to: mint, monarch money, ynab, empower
Sure is an open-source personal finance and wealth management app, community-maintained as a fork of the archived Maybe Finance project. It tracks bank, investment, and loan accounts, categorizes transactions, monitors net worth over time, and supports multi-user households, with all data stored in a self-hosted PostgreSQL database.
Sure Docker Compose example
Self-host Sure on your own server, homelab, or VPS starting from this Docker Compose example.
It runs Sure in Docker containers using the official ghcr.io/we-promise/sure:stable, ghcr.io/we-promise/sure:stable, postgres:16, redis:latest images, with persistent volumes and automatic restarts preconfigured.
Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.
services:
web:
image: ghcr.io/we-promise/sure:stable
volumes:
- app_storage:/rails/storage
restart: unless-stopped
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
environment:
# Secret used to sign sessions and cookies. Generate a long random value for production.
SECRET_KEY_BASE: "a7523c3d0ae56415046ad8abae168d71074a79534a7062258f8d1d51ac2f76d3c3bc86d86b6b0b307df30d9a6a90a2066a3fa9e67c5e6f374dbd7dd4e0778e13"
# Enables the self-hosted mode of the app.
SELF_HOSTED: "true"
# Whether Rails should force all traffic to HTTPS (handled by the reverse proxy, keep false).
RAILS_FORCE_SSL: "false"
# Whether Rails should assume it is behind an SSL-terminating proxy.
RAILS_ASSUME_SSL: "false"
# Hostname of the Postgres service inside the compose network.
DB_HOST: "db"
# Postgres port.
DB_PORT: "5432"
# Postgres user (internal only).
POSTGRES_USER: "sure_user"
# Postgres password (internal only).
POSTGRES_PASSWORD: "sure_password"
# Postgres database name.
POSTGRES_DB: "sure_production"
# Redis connection string inside the compose network.
REDIS_URL: "redis://redis:6379/1"
# Optional OpenAI API token to enable AI-powered features. Leave empty to disable.
OPENAI_ACCESS_TOKEN: ""
worker:
image: ghcr.io/we-promise/sure:stable
command: bundle exec sidekiq
volumes:
- app_storage:/rails/storage
restart: unless-stopped
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
environment:
# Secret used to sign sessions and cookies. Must match the web service.
SECRET_KEY_BASE: "a7523c3d0ae56415046ad8abae168d71074a79534a7062258f8d1d51ac2f76d3c3bc86d86b6b0b307df30d9a6a90a2066a3fa9e67c5e6f374dbd7dd4e0778e13"
# Enables the self-hosted mode of the app.
SELF_HOSTED: "true"
# Whether Rails should force all traffic to HTTPS.
RAILS_FORCE_SSL: "false"
# Whether Rails should assume it is behind an SSL-terminating proxy.
RAILS_ASSUME_SSL: "false"
# Hostname of the Postgres service inside the compose network.
DB_HOST: "db"
# Postgres port.
DB_PORT: "5432"
# Postgres user (internal only).
POSTGRES_USER: "sure_user"
# Postgres password (internal only).
POSTGRES_PASSWORD: "sure_password"
# Postgres database name.
POSTGRES_DB: "sure_production"
# Redis connection string inside the compose network.
REDIS_URL: "redis://redis:6379/1"
# Optional OpenAI API token to enable AI-powered features. Leave empty to disable.
OPENAI_ACCESS_TOKEN: ""
db:
image: postgres:16
restart: unless-stopped
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
# Postgres user (internal only).
POSTGRES_USER: "sure_user"
# Postgres password (internal only).
POSTGRES_PASSWORD: "sure_password"
# Postgres database name.
POSTGRES_DB: "sure_production"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U sure_user -d sure_production"]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:latest
restart: unless-stopped
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 5
volumes:
app_storage:
postgres_data:
redis_data: Prefer a managed setup? WinterFlow installs, configures, and updates Sure for you using this same Docker Compose configuration.