[{"data":1,"prerenderedAt":217},["ShallowReactive",2],{"seo-verification":3,"blog-how-to-host-maybe-on-a-vps-en":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-how-to-host-maybe-on-a-vps-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":30,"intro":33,"sections":34,"ctaTitle":150,"ctaBody":151,"ctaButton":152,"ctaUrl":153,"relatedPosts":154},430,"how-to-host-maybe-on-a-vps",{"fr":12,"en":10,"ar":13,"es":14},"heberger-maybe-vps","كيفية-استضافة-maybe-على-خادم-vps","como-alojar-maybe-en-un-vps","Self-hosting Maybe on a VPS: take control of your finances","Install Maybe, the open source personal finance app, on your VPS with Docker. Keep your financial data under your control, without a SaaS subscription.",8,0,false,"2026-10-10T00:00:00+00:00","2026-10-10T21:55:40+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-maybe-vps-poster.svg","In January 2024, Maybe released its source code under the AGPLv3 license after operating as a commercial SaaS. This decision came at a time when several personal finance apps had raised their prices or discontinued free tiers. Maybe lets you track transactions, investments, and net worth from a clean interface, hosted on infrastructure you control. This guide covers installing Maybe on a ServOrbit VPS with Docker Compose.",[35,39,42,53,56,59,83,86,89,92,95,102,105,147],{"type":36,"title":37,"body":38},"h2","Why host your finances on your own server","Entrusting financial data to a third-party service means accepting their storage conditions, data-sharing practices, and commercial longevity. Several popular services raised prices by 30 to 60 percent between 2023 and 2025, or simply shut down. Self-hosting addresses a legitimate concern: \"my financial data is too sensitive for a server I manage myself.\" In practice, a properly configured VPS provides encryption in transit (TLS), PostgreSQL volume encryption at the disk level, automated backups, and access restricted to your IP address or private network. That is a smaller attack surface than a SaaS that aggregates data from tens of thousands of users.",{"type":36,"title":40,"body":41},"What Maybe offers","Maybe combines budget management, investment tracking, and net worth calculation in a single self-hostable interface.",{"type":43,"items":44},"ul",[45,46,47,48,49,50,51,52],"Net worth dashboard (assets, liabilities, evolution over time)","Transaction tracking with automatic categorization and customizable rules","Bank account connections via Plaid (US and Canada) or manual entry","Investment and stock portfolio tracking with real-time prices via Synth Finance","Budgets and savings goals by category","Exportable monthly and annual reports","Optional AI assistant (requires an OpenAI key) for spending analysis","Multi-account interface: partner, household members, or clients",{"type":36,"title":54,"body":55},"System requirements","Maybe is a Ruby on Rails application running four Docker services: the web server, a Sidekiq worker for async tasks, PostgreSQL 16, and Redis. For personal use or a small team, a VPS with 2 vCPU and 2 GB RAM is sufficient. For professional use with multiple users and active bank syncing, 4 GB RAM is recommended. Port 3000 must be reachable (or proxied from port 443 via a reverse proxy). Allocate 5 GB of storage for application data and the database, plus space for backups.",{"type":36,"title":57,"body":58},"Installing Maybe on a VPS with Docker Compose","Installation relies on Docker Compose and a `.env` file. The steps below start from a fresh Debian 12 VPS.",{"type":60,"steps":61},"steps",[62,65,68,71,74,77,80],{"title":63,"body":64},"Install Docker Engine","On Debian\u002FUbuntu: `curl -fsSL https:\u002F\u002Fget.docker.com | sh`. Verify the installation with `docker run hello-world`. Docker Compose v2 is included from Docker Engine 23 onward.",{"title":66,"body":67},"Create the working directory","Run `mkdir -p \u002Fopt\u002Fmaybe && cd \u002Fopt\u002Fmaybe`. This directory will hold your `compose.yml` and `.env` files.",{"title":69,"body":70},"Download the official Compose file","Retrieve the example provided by the project: `curl -o compose.yml https:\u002F\u002Fraw.githubusercontent.com\u002Fmaybe-finance\u002Fmaybe\u002Fmain\u002Fcompose.example.yml`. This file defines the four services (web, worker, db, redis) and the named volumes.",{"title":72,"body":73},"Create the .env file","Create `\u002Fopt\u002Fmaybe\u002F.env` with the following content: `SECRET_KEY_BASE=$(openssl rand -hex 64)`, `POSTGRES_PASSWORD=a_strong_password`, `SELF_HOSTED=true`, `APP_DOMAIN=finance.your-domain.com`. Generate a strong secret key with `openssl rand -hex 64`.",{"title":75,"body":76},"Start the services","From `\u002Fopt\u002Fmaybe`, run `docker compose up -d`. Docker pulls the `ghcr.io\u002Fmaybe-finance\u002Fmaybe:stable` images along with PostgreSQL 16 and Redis, then starts the containers. Database initialization takes one to two minutes.",{"title":78,"body":79},"Configure a reverse proxy","Place Nginx or Caddy in front of port 3000 to serve Maybe over HTTPS. With Caddy: add `finance.your-domain.com { reverse_proxy localhost:3000 }` to your `Caddyfile`. Caddy handles the Let's Encrypt certificate automatically.",{"title":81,"body":82},"Create the first account","Visit `https:\u002F\u002Ffinance.your-domain.com`. Maybe displays a sign-up form on the first launch. In `SELF_HOSTED=true` mode, the first account created becomes the administrator. Disable public registrations in settings if the instance is personal.",{"type":36,"title":84,"body":85},"Connecting bank accounts","Maybe supports two methods for linking accounts. Automatic connection via Plaid covers US and Canadian banks: add your Plaid API credentials (`PLAID_CLIENT_ID` and `PLAID_SECRET`) to `.env`, then link accounts from the interface. For European or other banks, manual transaction entry remains the main method. Maybe accepts CSV file imports in a standard format, allowing migration from a spreadsheet or a bank export. Investment tracking relies on the Synth Finance API for stock prices: add a `SYNTH_API_KEY` to enable automatic portfolio valuation.",{"type":36,"title":87,"body":88},"PostgreSQL backup and encryption","The PostgreSQL database is stored in the `maybe_postgres-data` Docker volume. To back up regularly: create a script that runs `docker exec maybe-db-1 pg_dump -U maybe_user maybe_production | gzip > \u002Fbackups\u002Fmaybe-$(date +%Y%m%d).sql.gz`, then schedule it with a systemd timer or cron. For a complete 3-2-1 strategy, send these encrypted dumps to S3-compatible object storage using Restic or rclone. Maybe also supports storing application files on Amazon S3 or Cloudflare R2 via the `ACTIVE_STORAGE_SERVICE`, `S3_ACCESS_KEY_ID`, and related variables. Encryption of sensitive data in the database (API keys, tokens) relies on `ACTIVE_RECORD_ENCRYPTION_*` keys — if you do not set them explicitly, they are derived from your `SECRET_KEY_BASE`.",{"type":90,"body":91},"tip","Restrict access to your Maybe instance by placing it behind a VPN (Tailscale, Headscale) or by filtering access by IP in Nginx with `allow 203.0.113.10; deny all;`. A personal financial instance does not need to be publicly accessible: private access dramatically reduces the attack surface without compromising usability.",{"type":36,"title":93,"body":94},"Troubleshooting: common errors","The most common errors after installing Maybe on a VPS, and how to fix them.",{"type":43,"items":96},[97,98,99,100,101],"`web exited with code 1` on startup: the database is not ready yet. Check with `docker compose logs db` that PostgreSQL has started, then run `docker compose restart web worker`.","Blank page or 500 error after sign-up: verify that `SECRET_KEY_BASE` is set and non-empty in `.env`. A missing key prevents Rails from decrypting the session.","`PG::ConnectionBad` in web logs: the `DB_HOST` variable must be `db` (the Docker service name), not `localhost`. Check your `.env`.","Async tasks (bank sync, reports) do not run: the `worker` service is not running. Check with `docker compose ps` that all four services are in `running` state.","Regression after update: after `docker compose pull`, run `docker compose up --no-deps -d web worker` rather than `docker compose up -d` to avoid unnecessarily recreating database containers.",{"type":36,"title":103,"body":104},"Comparison: self-hosted Maybe, YNAB, and Monarch Money","This table compares self-hosted Maybe with the main personal finance SaaS applications.",{"type":106,"headers":107,"rows":112},"comparison",[108,109,110,111],"Criteria","Maybe (self-hosted)","YNAB","Monarch Money",[113,118,123,128,133,136,140,143],[114,115,116,117],"Annual cost","VPS cost (~$5-10\u002Fmonth)","$109\u002Fyear","$99.99\u002Fyear",[119,120,121,122],"Data control","Full — data on your server","None — data at YNAB","None — data at Monarch",[124,125,126,127],"Bank connection","Plaid (US\u002FCA) or manual","Plaid (US\u002FCA\u002FEU partial)","Plaid (US\u002FCA)",[129,130,131,132],"Investment tracking","Yes (via Synth Finance)","Not native","Yes",[134,132,135,132],"Net worth dashboard","No",[137,138,135,139],"AI assistant","Optional (OpenAI key required)","Yes (included)",[141,142,135,135],"Maintenance required","Yes — manual updates",[144,145,146,146],"License","AGPLv3 (open source)","Proprietary",{"type":36,"title":148,"body":149},"Further reading","The article on hosting PostgreSQL on a VPS covers fine-tuning the database engine for production workloads. The 3-2-1 backup strategy with Restic and S3 explains setting up encrypted, versioned retention. To secure access to your Maybe instance without a full VPN, the Nextcloud article provides an example Nginx configuration with basic authentication.","A VPS to host your finances with Maybe","ServOrbit offers VPS instances running Debian or Ubuntu, ready for Docker. Deploy Maybe in minutes on infrastructure you fully control.","Create a ServOrbit VPS","\u002Fvps-cloud",[155,179,199],{"id":156,"slug":157,"slugs":158,"title":162,"excerpt":163,"readTime":164,"views":18,"isPinned":19,"publishedAt":165,"updatedAt":166,"category":167,"categories":173,"featuredImage":30,"bgImage":31,"posterImage":175,"relatedSolution":176},56,"postgresql-on-a-vps-a-reliable-and-controlled-database",{"fr":159,"en":157,"ar":160,"es":161},"heberger-postgresql-vps","postgresql-على-خادم-vps-قاعدة-بيانات-موثوقة-ومتحكم-بها","alojar-postgresql-en-un-vps","PostgreSQL on a VPS: a reliable and controlled database","Host PostgreSQL on a VPS: volumes, backups, restricted network access and sound configuration for your applications.",4,"2026-04-25T00:00:00+00:00","2026-09-08T22:00:02+00:00",{"id":168,"name":169,"slug":170,"color":171,"icon":172},6,"Databases","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[174],{"id":168,"name":169,"slug":170,"color":171,"icon":172},"\u002Fblog\u002Fcovers\u002Fheberger-postgresql-vps-poster.svg",{"categorySlug":177,"appSlug":178},"databases","postgresql-stack",{"id":180,"slug":181,"slugs":182,"title":186,"excerpt":187,"readTime":188,"views":18,"isPinned":19,"publishedAt":189,"updatedAt":190,"category":191,"categories":196,"featuredImage":30,"bgImage":31,"posterImage":198,"relatedSolution":30},347,"restic-s3-3-2-1-backup-strategy-vps",{"fr":183,"en":181,"ar":184,"es":185},"backup-vps-restic-s3-3-2-1","restic-s3-3-2-1-backup-strategy-vps-ar","estrategia-3-2-1-backup-vps-restic-s3","3-2-1 Backup Strategy for Your VPS with Restic and S3","Build a complete 3-2-1 strategy on your VPS: Restic to Backblaze B2 or Cloudflare R2, systemd timer, retention policy and automated restore test.",11,"2026-09-10T00:00:00+00:00","2026-09-10T13:10:45+00:00",{"id":17,"name":192,"slug":193,"color":194,"icon":195},"Security & Monitoring","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[197],{"id":17,"name":192,"slug":193,"color":194,"icon":195},"\u002Fblog\u002Fcovers\u002Fbackup-vps-restic-s3-3-2-1-poster.svg",{"id":200,"slug":201,"slugs":202,"title":206,"excerpt":207,"readTime":208,"views":18,"isPinned":19,"publishedAt":209,"updatedAt":210,"category":211,"categories":212,"featuredImage":30,"bgImage":31,"posterImage":214,"relatedSolution":215},71,"hosting-nextcloud-on-your-own-vps",{"fr":203,"en":201,"ar":204,"es":205},"heberger-nextcloud","استضافة-nextcloud-على-خادمك-الـvps-الخاص","alojar-nextcloud-en-su-propio-vps","Self-Host Nextcloud on VPS: NC 35, PHP 8.3 and MariaDB 11 Guide","Deploy Nextcloud 35 on VPS: PHP 8.3 required, mariadb-dump for MariaDB 11+, Recognize v7 debugging, NC34→NC35 upgrade path and 2FA CVEs fixed.",19,"2026-04-10T00:00:00+00:00","2026-10-08T23:30:52+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[213],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-nextcloud-poster.svg",{"categorySlug":25,"appSlug":216},"nextcloud",1791669689829]