Skip to content

Self-host Firefly III

updated Jul 2026prices checked · Jul 2026Install verified on Ubuntu 26.04 · Sep 2026 · how we test
We earn commissions when you shop through the links below. Full disclosure →

A powerful self-hosted personal finance manager built on double-entry accounting — budgets, rules, reports, and bank import. Serious money management, privately.

Key facts

CategoryPersonal finance
LicenseAGPL-3.0
StackPHP, Laravel
Min RAM512 MB
Official imageyes
Measured idle RAM159 MB
Difficulty
Our recommendation

Pick Firefly III when you want real double-entry bookkeeping — withdrawals, deposits and transfers across asset, expense and liability accounts, with budgets, categories, tags, piggy banks, bills, rules and a REST API that "covers almost every part" of the app — and you accept a PHP + database stack to get it. It is AGPL-3.0, at v6.7.3 as of September 2026, and "will never contact external servers until you explicitly tell it to". Bank import lives in a separate Data Importer container, and several headline features do nothing until a cron job runs.

Follow the Firefly III deploy guide →

What you need

  • Any VPS with at least 512 MB of RAM
  • A domain you control — most self-hosted setups need HTTPS in front of them
  • About an afternoon — budget time for troubleshooting
Where to host itaffiliate disclosure
Hetzner Cloudrun it on
From $23.59/mo · 2 vCPU / 4 GB / 80 GB · EU + US
Get Hetzner Cloud (opens in new tab)
Kamaterafree trial
From $4/mo · 1 vCPU / 1 GB / 20 GB · US + EU + Asia
Start free on Kamatera → (opens in new tab)
DigitalOceanalso works on
From $6/mo · 1 vCPU / 1 GB / 25 GB · US + EU + Asia
Deploy on DigitalOcean → (opens in new tab)

Paid link — we earn a commission if you shop through it.

Install with Docker Compose

Save this as compose.yml and run docker compose up -d:

# Firefly III + MariaDB — replace APP_KEY (exactly 32 chars) and both copies of the DB password before real use
services:
  app:
    image: fireflyiii/core:latest
    ports: ["8080:8080"]
    environment: { DB_CONNECTION: mysql, DB_HOST: db, DB_DATABASE: firefly, DB_USERNAME: firefly, DB_PASSWORD: secret, APP_KEY: SomeRandomStringOf32CharsExactly }
  db: { image: mariadb:11, environment: { MARIADB_RANDOM_ROOT_PASSWORD: "yes", MARIADB_DATABASE: firefly, MARIADB_USER: firefly, MARIADB_PASSWORD: secret } }
# docker compose up -d  →  http://SERVER_IP:8080

What you take on

Firefly III's docs are written by one maintainer who has seen every support ticket; follow them literally:

non-negotiableRecurring transactions, auto-budgets, subscription warnings and exchange rates "will only work when the cron job is running". Upstream's compose adds a cron container that calls /api/v1/cron/<STATIC_CRON_TOKEN> daily; our snippet has no cron, so add that service (or a host cron) and set STATIC_CRON_TOKEN to exactly 32 characters.
non-negotiableAPP_KEY "should be a random string of exactly 32 characters" with no = or #; it encrypts stored data, so it belongs in your backups. Change DB_PASSWORD before the first start — "If you change the password after you run Firefly III, it will complain about having no access". Behind a proxy set TRUSTED_PROXIES=** and APP_URL.
non-negotiableImporting from banks or CSV is a separate application: the Data Importer is "a separate tool" by design, installed as its own container next to Firefly III.
non-negotiableUpgrades are automatic but "In some cases the upgrade process is destructive. It will remove transactions, delete accounts or clean up data." Back up the database and volumes first, and if you re-download the compose file, check the database image tag — a MariaDB major bump is not compatible with your existing volume.
non-negotiableThere is no built-in backup and "The export function of Firefly III is not a backup mechanism": back up the launch variables (especially APP_KEY), any secrets and the upload and db volumes, then restore once to prove it. Self-managed installs need PHP 8.5 with BCMath, intl, curl, zip and libsodium; MySQL/MariaDB, PostgreSQL and SQLite are all supported. The 512 MB floor is our estimate.

An alternative to

Head-to-head

More self-hosted tools

Common questions

Firefly III hangs on "wait-for-it.sh: waiting 60 seconds for db:3306". Why?

The database container has already exited. Its log shows "[ERROR] [Entrypoint]: Database is uninitialized and password option is not specified": the MariaDB service was started without any environment, so it refuses to create a database and the app waits for a server that never comes up. Give the db service MARIADB_DATABASE, MARIADB_USER and MARIADB_PASSWORD (matching the app's DB_DATABASE, DB_USERNAME and DB_PASSWORD) plus a root-password option such as MARIADB_RANDOM_ROOT_PASSWORD=yes, as the compose above does, then run docker compose up -d again.

We use analytics cookies (Google Analytics, PostHog) to see which guides are useful. No ad networks, no cross-site tracking. See our privacy policy.