Deployment guide

Firefly III

Overview

Firefly III is a free, open source, self-hosted personal finance manager. It uses double-entry bookkeeping to give you a precise, honest picture of your money. Record expenses and income, organise them into budgets, categories and tags, set savings goals with piggy banks, and let automatic rules tidy everything up.

Firefly III connects to banks through Spectre and GoCardless, and it imports CSV, camt.xml and OFX files with the Firefly III Data Importer. It also exposes a documented REST API.

The SecureAnyCloud image delivers Firefly III fully installed and configured on Ubuntu 24.04 as a PHP 8.5 Laravel application. A complete personal finance service is running within minutes of launch, and all of your financial data stays private on infrastructure you control.

Firefly III is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). All product and company names are trademarks or registered trademarks of their respective holders. This image repackages the upstream open source release with SecureAnyCloud's provisioning and support.

What you get:

  • Firefly III 6.6.3 (AGPL-3.0), served from /var/www/firefly-iii.
  • PHP 8.5 (php8.5-fpm) from the ondrej/php PPA and nginx, with the web UI on port 80.
  • Self-contained SQLite storage, so there is no separate database server to run or secure.
  • The whole application, the configuration and the SQLite database on a dedicated, independently resizable data disk mounted at /var/www/firefly-iii.
  • A per-VM administrator password, a fresh application encryption key and a fresh cron token, all generated on first boot and written to a root-only file, so no default or shared login ships in the image.
  • nginx.service and php8.5-fpm.service as systemd units, enabled and active.
  • 24/7 SecureAnyCloud support.

Prerequisites

  • An active Azure subscription, an SSH key pair, and a VNet plus subnet in the target region.
  • A VM size to start with. Standard_B2s (2 vCPU / 4 GiB RAM) is a good starting point. Scale up for larger households or heavy imports.
  • NSG inbound rules that allow 22/tcp from your management network and 80/tcp (HTTP) from your users. Add 443/tcp if you enable HTTPS.

Step 1 - Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, and search the Marketplace for Firefly III by SecureAnyCloud. Select Create.

On the Basics tab, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) and HTTP (80). Then select Review + create and Create.

Step 2 - Deploy from the Azure CLI

# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:firefly-iii-ubuntu-24-04:default:latest
az vm create \
  --resource-group <your-rg> \
  --name firefly-iii \
  --image sac1647283583153:firefly-iii-ubuntu-24-04:default:latest \
  --size Standard_B2s \
  --admin-username azureuser \
  --generate-ssh-keys \
  --public-ip-sku Standard

Open HTTP to reach the web UI:

az vm open-port --resource-group <your-rg> --name firefly-iii --port 80 --priority 900

Step 3 - Connect to your VM

Connect over SSH:

ssh azureuser@<vm-public-ip>

Step 4 - Confirm the services are running

The two services that back Firefly III should both report active. The sign-in page (GET /login) should answer HTTP 200 on port 80:

systemctl is-active nginx php8.5-fpm curl -s -o /dev/null -w 'GET /login -> %{http_code}\n' http://127.0.0.1/login

Expected output: two lines of active, then GET /login -> 200. Only nginx on port 80 is exposed. PHP runs behind it under php-fpm, and the SQLite database is a local file, so there is no database port to open.

Step 5 - Retrieve your administrator password

On the first boot of every VM, a one-shot service (firefly-iii-firstboot.service) generates credentials that are unique to that VM. These are a fresh administrator password, a fresh Laravel application encryption key and a fresh cron token. The service also pins the application to your VM's own address. No shared or default credentials ship in the image.

Read the credentials file:

sudo cat /root/firefly-iii-credentials.txt

The file (mode 0600, root only) contains the administrator email (firefly.admin.user, which is admin@example.com), the administrator password (firefly.admin.pass) and the sign-in URL.

You can prove the login round trip from the VM's own shell. Firefly III signs in through a form that carries a Laravel CSRF token. The script below reads the per-VM credentials, fetches the token and posts a real sign-in. A correct password answers HTTP 200 and reaches the dashboard:

EMAIL=$(sudo grep '^firefly.admin.user=' /root/firefly-iii-credentials.txt | cut -d= -f2-)
PASS=$(sudo grep '^firefly.admin.pass=' /root/firefly-iii-credentials.txt | cut -d= -f2-)
J=$(mktemp)
T=$(curl -s -c "$J" http://127.0.0.1/login | grep -oE 'name="_token"[^>]*value="[^"]+"' | head -1 | sed -E 's/.*value="([^"]+)".*/\1/')
echo -n 'sign-in HTTP status -> ' curl -s -o /dev/null -w '%{http_code}\n' -b "$J" -c "$J" -L \
  --data-urlencode "_token=$T" --data-urlencode "email=$EMAIL" --data-urlencode "password=$PASS" \
  http://127.0.0.1/login rm -f "$J"

Expected output: sign-in HTTP status -> 200. This confirms that the credentials in the file sign in.

Step 6 - Sign in and set up your first account

Browse to http://<vm-public-ip>/ and sign in with the administrator email and password from the credentials file.

On first sign-in, Firefly III asks for your bank's name and the balance of your main checking account, so it has something to start with. You can add more accounts later. You can also register your own first user instead, which becomes the owner of the installation.

The dashboard shows your net worth, an account balance chart and your accounts. Add your asset accounts (checking, savings, credit cards) with their opening balances from Accounts.

Step 7 - Create budgets and record transactions

Open Budgets to create budgets and give them a soft cap. You can then see how much you have left to spend in each category during the period.

Record income and expenses as transactions, and organise them into categories and tags. Set up bills and piggy bank savings goals, and let automatic rules categorise transactions for you.

To pull transactions in automatically, connect your banks through Spectre or GoCardless, or import CSV, camt.xml and OFX files, using the Firefly III Data Importer.

Step 8 - Confirm the version, the stack and the data disk

Check the PHP and nginx versions and the data disk mount:

php -v | head -1 nginx -v findmnt /var/www/firefly-iii

Expected output: PHP 8.5, nginx, and /var/www/firefly-iii mounted from the dedicated data disk (/dev/sdc). The entire Firefly III application, the configuration and the SQLite database live on that disk. The disk is independently resizable and survives instance replacement. Resize it from the Azure portal if you need more room.

First-boot service and security model

A one-shot firefly-iii-firstboot.service runs after the network is up. It does the following:

  • Regenerates a fresh Laravel APP_KEY and STATIC_CRON_TOKEN.
  • Pins the application URL to the VM's own address, resolved from the Azure instance metadata service.
  • Rotates the administrator password to a fresh per-VM value.
  • Runs the Firefly III database upgrade, so the app is immediately usable.
  • Writes the credentials file at mode 0600 (root only).
  • Drops a sentinel so that it runs exactly once.

The image ships with an empty database and no usable login. The per-VM administrator is created on first boot. Verify the service and the file permissions:

systemctl is-active firefly-iii-firstboot.service
sudo stat -c '%a %U:%G %n' /root/firefly-iii-credentials.txt

Expected output: active, then 600 root:root /root/firefly-iii-credentials.txt.

Enabling HTTPS with your own domain

The image serves the web UI over plain HTTP on port 80. For a browser-trusted certificate, point a DNS record at the VM and open port 443 in the NSG. Then install a certificate from your CA, for example Let's Encrypt:

sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.example.com

Certbot updates the nginx site to serve your domain certificate. Then set APP_URL=https://your-domain.example.com in /var/www/firefly-iii/.env. Run sudo -u www-data php /var/www/firefly-iii/artisan config:cache so that generated links use your domain.

Backup and maintenance

Firefly III stores everything, including the SQLite database, under /var/www/firefly-iii on the dedicated data disk, so a backup is a single directory. For a full point-in-time copy, snapshot the data disk and OS disk from the Azure portal. Alternatively, archive the tree:

sudo tar -C /var/www -czf /var/backups/firefly-iii-$(date +%F).tar.gz firefly-iii

Keep the OS current with sudo apt-get update && sudo apt-get upgrade. The image ships with unattended security updates enabled.

Review the Firefly III documentation before moving between major versions, and always back up before an upgrade.

Support

This image is backed by 24/7 SecureAnyCloud support. Support covers deployment and initial configuration, retrieving first-boot administrator credentials, and data import setup (Spectre, GoCardless, CSV, OFX). It also covers budgeting rules and automation, application upgrades and patch management, HTTPS and custom domain setup, performance tuning, and storage administration.

Email sales@secureanycloud.com or use the live chat in the support portal. Critical issues receive a one-hour average response.

Deploy on Azure

Launch Firefly III on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.

View this image

Need Help?

Our support team is available 24/7.

sales@secureanycloud.com

Deploy on Azure