Sure logo

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.