Ospitare Firefly III su un VPS gestito: le vostre finanze sul vostro server

Ospitare Firefly III su un VPS gestito significa tenere i vostri conti, i vostri budget e le vostre spese su una macchina tutta vostra, che i nostri team tengono aggiornata e supervisionano giorno e notte. Firefly III è un gestore di finanze personali libero e open source, con licenza AGPL. Questa guida segue la sua documentazione ufficiale: l'installazione con Docker Compose, l'APP_KEY, HTTPS, il primo account, il cron, il database, l'importatore di dati, le e-mail, i backup e gli aggiornamenti.

Simon Vasconcelos Lee Di Pubblicato il 10 novembre 2026Lettura: 13 minuti

Tutte le guide

In breve

  1. La licenza AGPL-3.0-or-later consente di far girare Firefly III liberamente; se lo modificate, mettete il codice sorgente della vostra versione a disposizione di chi la utilizza.
  2. Installatelo a partire dai tre file ufficiali: docker-compose.yml, .env e .db.env. Scegliete la password del database prima del primo avvio.
  3. APP_KEY è lunga esattamente 32 caratteri, resta segreta e si salva insieme ai dati.
  4. Dietro un reverse proxy in HTTPS, impostate TRUSTED_PROXIES=* e il vostro indirizzo in APP_URL, poi create subito il vostro account: il primo utente che si registra diventa il proprietario, e le registrazioni si chiudono subito dopo.
  5. Il servizio cron del file ufficiale esegue ogni notte i budget automatici e le transazioni ricorrenti. Salvate il database, il volume degli allegati e .env prima di ogni aggiornamento.

Che cosa fa Firefly III

Firefly III è un gestore di finanze personali pensato per il self-hosting. Tiene traccia delle vostre spese e delle vostre entrate, con budget, categorie ed etichette, per vedere dove vanno i vostri soldi. Il suo README lo descrive come interamente self-hosted e isolato: non contatta alcun server esterno finché non glielo chiedete esplicitamente.

Un'istanza ospita tutti gli utenti che desiderate, ognuno con un'amministrazione finanziaria completamente separata da quella degli altri. La documentazione descrive un modello per condividere una stessa amministrazione, attualmente in fase di sviluppo.

Che cosa consente la licenza AGPL

Firefly III è pubblicato con la GNU Affero General Public License, versione 3 o, a vostra scelta, qualsiasi versione successiva: è l'identificatore SPDX AGPL-3.0-or-later del suo file composer.json. Il testo afferma un'autorizzazione illimitata a eseguire il programma non modificato. Potete quindi usare l'immagine pubblicata dal progetto per voi stessi, per la vostra famiglia o per la vostra azienda, senza alcuna licenza da acquistare.

L'articolo 13 aggiunge una condizione propria dell'AGPL: se modificate il programma, la vostra versione deve offrire a tutti coloro che la usano a distanza, tramite la rete, il modo di ottenerne gratuitamente il codice sorgente. Il Data Importer ha la stessa licenza.

L'installazione con Docker Compose

La documentazione indica Docker Compose come il modo più semplice di installare Firefly III. Su un server in cui Docker è installato, create una cartella e scaricatevi i tre file ufficiali, in formato grezzo: la loro spaziatura conta, e la documentazione chiede di non copiarli dal browser.

Terminale
mkdir firefly-iii && cd firefly-iii
curl -o docker-compose.yml https://raw.githubusercontent.com/firefly-iii/docker/main/docker-compose.yml
curl -o .env https://raw.githubusercontent.com/firefly-iii/firefly-iii/main/.env.example
curl -o .db.env https://raw.githubusercontent.com/firefly-iii/docker/main/database.env

Le impostazioni da cambiare prima del primo avvio

Generate due stringhe di 32 caratteri con il comando indicato nel file .env: una per la chiave, una per la password del database.

Terminale
head /dev/urandom | LC_ALL=C tr -dc 'A-Za-z0-9' | head -c 32 && echo
.env, le righe da cambiare
SITE_OWNER=you@example.com
APP_KEY=
DB_PASSWORD=
APP_URL=https://finances.example.com
.db.env
MYSQL_PASSWORD=

Scegliete la password del database prima del primo avvio. Il database la registra nel suo volume fin dalla creazione: se la cambiate in seguito non corrisponde più, e la FAQ Docker offre una sola via d'uscita, cioè eliminare i container e i volumi e ricominciare da capo.

Una porta pubblicata in locale

Il file ufficiale pubblica l'applicazione sulla porta 80 di tutti gli indirizzi del server. Per servirla in HTTPS dietro un reverse proxy sulla stessa macchina, cambiate questa sola riga nel servizio app:

docker-compose.yml, nel servizio app
ports:
  - 127.0.0.1:8080:8080
Terminale
docker compose -f docker-compose.yml up -d --pull=always
docker compose -f docker-compose.yml logs -f

Al primo avvio, il container crea e migra da solo il database. A installazione terminata, Firefly III vi ringrazia nel log per averlo installato: passate al reverse proxy.

La documentazione non indica alcun valore di memoria; la sua FAQ Docker suggerisce PHP_MEMORY_LIMIT=512M o più se PHP esaurisce la memoria. La taglia dipende dal numero di utenti, dal volume delle transazioni e dall'importatore di dati. Su un VPS gestito, descrivetici il vostro uso e vi raccomandiamo la taglia adatta.

HTTPS e il reverse proxy

Firefly III serve l'applicazione in HTTP sulla porta 8080 all'interno del container, e HTTPS spetta al reverse proxy posto davanti. L'applicazione legge l'intestazione X-Forwarded-Proto per sapere che il visitatore è arrivato in HTTPS, a condizione che si fidi del proxy:

.env
TRUSTED_PROXIES=*

La FAQ Docker è chiara su questo punto: senza TRUSTED_PROXIES=*, i link restano in http, i moduli e i grafici smettono di funzionare e le intestazioni di sicurezza CSP falliscono. Con la porta pubblicata su 127.0.0.1, solo il proxy del server stesso raggiunge l'applicazione. Ricreate il container dopo ogni modifica del file .env:

Terminale
docker compose up -d --force-recreate app

Con Caddy

Caddy ottiene da solo il certificato Let's Encrypt, e la sua direttiva reverse_proxy imposta per impostazione predefinita le intestazioni X-Forwarded-For, X-Forwarded-Proto e X-Forwarded-Host:

Caddyfile
finances.example.com {
  reverse_proxy 127.0.0.1:8080
}

Con Nginx e Certbot

Questo blocco riprende le intestazioni della FAQ di installazione e i buffer che suggerisce contro gli errori 502, quando l'applicazione restituisce un token in un'intestazione lunga. Ascolta sulla porta 80 per lasciare a Certbot l'attivazione di HTTPS:

Blocco Nginx
server {
    listen 80;
    listen [::]:80;
    server_name finances.example.com;

    client_max_body_size 64M;
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_read_timeout 300s;
    }
}

Certbot installa poi il certificato e si occupa di rinnovarlo:

Terminale
sudo certbot --nginx

Il primo account e le registrazioni

Il primo utente che si registra diventa il proprietario dell'istanza. Per sicurezza, le registrazioni si chiudono poi da sole: la maggior parte delle persone installa Firefly III solo per sé.

  1. Aprite il vostro indirizzo HTTPS non appena il proxy risponde, e create il vostro account: assume il ruolo di proprietario.
  2. Attivate l'autenticazione a due fattori nel vostro profilo, e conservate gli otto codici di emergenza che mostra.
  3. Per aprire l'istanza ad altre persone, andate su /settings, aprite le opzioni di configurazione di Firefly III, togliete la spunta all'opzione che disattiva le registrazioni e salvate.

L'attività cron

Diverse funzioni funzionano solo con un'attività pianificata: i budget automatici, le transazioni ricorrenti, gli avvisi sugli abbonamenti e i tassi di cambio aggiornati. L'immagine Docker non esegue cron da sola; il file ufficiale aggiunge a questo scopo un piccolo servizio cron, che chiama l'applicazione ogni giorno alle 3 del mattino.

Si autentica con un token statico. Generate una terza stringa con lo stesso comando, e inseritela in .env:

.env
STATIC_CRON_TOKEN=

Questo token è lungo esattamente 32 caratteri: il codice della versione 6.7.9 non accetta altre lunghezze. Ecco il servizio come lo dichiara il file ufficiale; il doppio $$ è voluto e rimanda alle righe TZ e STATIC_CRON_TOKEN del file .env:

docker-compose.yml, il servizio cron
cron:
  image: alpine
  restart: always
  container_name: firefly_iii_cron
  env_file: .env
  init: true
  command: ["sh", "-c", "apk add tzdata && \
    (ln -s /usr/share/zoneinfo/$$TZ /etc/localtime || true) && \
    echo \"0 3 * * * wget -qO- http://app:8080/api/v1/cron/$$STATIC_CRON_TOKEN;echo\" \
    | crontab - && \
    exec crond -f -L /dev/stdout"]
  networks:
    - firefly_iii
  depends_on:
    - app

Un'unica attività basta per tutti gli utenti dell'istanza. Per verificare che sia stata eseguita, leggete il log del container: ogni attività rende conto in JSON, con job_fired e job_succeeded.

Terminale
docker logs firefly_iii_cron

Per lanciarla a mano, la FAQ Docker chiede di passare dall'utente www-data anziché da root: la FAQ collega questa trappola a errori di permessi sui file di log:

Terminale
docker exec --user www-data firefly_iii_core /usr/local/bin/php /var/www/html/artisan firefly-iii:cron --force

MariaDB, PostgreSQL o SQLite

Il file ufficiale fornisce MariaDB, con l'immagine mariadb:lts. Firefly III supporta anche PostgreSQL e SQLite, da scegliere con DB_CONNECTION in .env:

DatabaseConfigurazioneBackup
MariaDB o MySQLIl servizio db del file ufficiale; DB_CONNECTION=mysql, porta 3306Un'esportazione con mariadb-dump, oppure il volume del database, a servizio fermo
PostgreSQLDB_CONNECTION=pgsql, porta 5432, l'immagine postgres e le variabili POSTGRES_* in .db.envUn'esportazione con pg_dump, oppure il volume del database, a servizio fermo
SQLiteDB_CONNECTION=sqlite, nessun servizio db, e un volume montato su /var/www/html/storage/databaseIl volume del database, a servizio fermo
.env (PostgreSQL)
DB_CONNECTION=pgsql
DB_HOST=db
DB_PORT=5432

Per PostgreSQL, la documentazione fa anche puntare il servizio db all'immagine postgres, che installa PostgreSQL 18, e monta il suo volume su /var/lib/postgresql. In .db.env, le variabili MYSQL_* diventano POSTGRES_USER, POSTGRES_DB e POSTGRES_PASSWORD.

Fate questa scelta prima di inserire le prime transazioni. La FAQ indica che passare da un database all'altro resta possibile, senza essere supportato da Firefly III stesso, e che l'esportazione dell'applicazione non porta con sé tutti i dati.

Il Data Importer

Il Data Importer di Firefly III è uno strumento separato, con una propria installazione e propri aggiornamenti; la sua versione 2.3.5 è uscita il 23 settembre 2026. Importa file CSV e CAMT.053, e può anche recuperare le transazioni dalle vostre banche tramite fornitori di dati terzi, ognuno con le proprie condizioni.

Il repository Docker ufficiale lo fornisce in un secondo file, docker-compose-importer.yml, che mantiene gli stessi servizi e aggiunge importer. Le sue impostazioni vanno in un file .importer.env, ricavato dal .env.example dell'importatore. Servitelo con un nome di dominio dedicato, con una porta pubblicata in locale e un secondo blocco nel proxy: la FAQ chiede di non collocarlo in una sottocartella.

.importer.env, le righe da cambiare
FIREFLY_III_URL=http://app:8080
VANITY_URL=https://finances.example.com
TRUSTED_PROXIES=*

Le e-mail: la configurazione SMTP

Per impostazione predefinita, MAIL_MAILER=log scrive i messaggi nei log anziché inviarli. Per ricevere le notifiche, come gli avvisi sugli abbonamenti, configurate l'invio in .env. La documentazione chiede di cambiare sempre MAIL_FROM e SITE_OWNER, altrimenti nessuna e-mail partirà mai.

Su un VPS Simafri, l'invio passa da un relay SMTP autenticato, sulla porta 587: l'indirizzo di un account di posta che avete già, oppure Simafri Suite.

.env
MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_FROM=finances@example.com
MAIL_USERNAME=finances@example.com
MAIL_PASSWORD=account_password
MAIL_ENCRYPTION=tls

I backup

Firefly III non ha una procedura di backup integrata: la documentazione raccomanda gli strumenti del sistema, e precisa che la funzione di esportazione dell'applicazione non è un backup. Con Docker, ecco che cosa conservare:

ElementoChe cosa conservaBackup
Il database (firefly_iii_db)Conti, transazioni, budget, regole e utentiObbligatorio
Gli allegati (firefly_iii_upload)I file allegati alle transazioniObbligatorio
.envLe impostazioni, e soprattutto APP_KEYObbligatorio, cifrato
.db.envLe credenziali del databaseObbligatorio, cifrato
docker-compose.yml e .importer.envLa vostra versione dei file ufficialiRaccomandato

Il database, a servizio attivo

Con MariaDB, mariadb-dump esporta il database senza fermare il servizio; la sua opzione --single-transaction fornisce una copia coerente delle tabelle InnoDB senza bloccarle. Lanciato dalla cartella del file Compose, il comando legge le credenziali dall'ambiente del container:

Terminale
docker exec firefly_iii_db sh -c 'mariadb-dump --single-transaction -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' > firefly-$(date +%F).sql

Con PostgreSQL, lo stesso principio passa da pg_dump:

Terminale
docker exec firefly_iii_db sh -c 'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' > firefly-$(date +%F).sql

Pianificate questa esportazione sul server almeno una volta al giorno, e fate pulizia tra i file, che si accumulano.

I volumi, a servizio fermo

La documentazione archivia ogni volume con un container usa e getta. Docker Compose antepone ai nomi dei volumi il nome del progetto, che per impostazione predefinita è quello della cartella: verificate i nomi esatti prima di lanciare l'archiviazione.

Terminale, nella cartella firefly-iii
docker volume ls
docker compose stop
docker run --rm -v "firefly-iii_firefly_iii_db:/tmp" -v "$HOME/backups/firefly:/backup" \
    ubuntu tar -czvf /backup/firefly_db.tar /tmp
docker run --rm -v "firefly-iii_firefly_iii_upload:/tmp" -v "$HOME/backups/firefly:/backup" \
    ubuntu tar -czvf /backup/firefly_upload.tar /tmp
docker compose start

Un nome di volume scritto male non solleva alcun errore: Docker crea un volume vuoto con quel nome e lo archivia, sovrascrivendo il backup precedente. La documentazione chiede di verificare che il volume esista prima di ogni archiviazione.

Conservate una copia di .env e di questi archivi fuori dal server, cifrata, perché contiene la chiave e le credenziali del database. Collocati sul disco del server, questi file rientrano anche nei suoi backup notturni.

Ripristinare

La documentazione ripristina un volume con il comando inverso, a servizio fermo; il volume degli allegati si ripristina allo stesso modo:

Terminale
docker run --rm -v "firefly-iii_firefly_iii_db:/recover" -v "$HOME/backups/firefly:/backup" \
    ubuntu tar -xvf /backup/firefly_db.tar -C /recover --strip 1

Un'esportazione SQL si ricarica nel database in funzione:

Terminale
docker exec -i firefly_iii_db sh -c 'mariadb -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' < firefly-YYYY-MM-DD.sql

Ripristinate anche .env con la sua APP_KEY, poi rilanciate e aprite i vostri conti. La documentazione lo ripete dopo ogni metodo: la prima cosa da fare con un backup è ripristinarlo, per verificare che funzioni.

Aggiornamenti e migrazioni

Firefly III si aggiorna da solo, anche da versioni vecchie come la 4.7, e migra il proprio database all'avvio del container. La documentazione avverte che alcuni aggiornamenti eliminano o ripuliscono dei dati, e chiede un backup del database e dei volumi prima di ciascuno, soprattutto tra versioni principali. Dalla cartella del file Compose:

Terminale
docker compose stop
docker compose pull
docker compose -f docker-compose.yml up -d --remove-orphans

L'importatore si aggiorna allo stesso modo, con docker compose rm -f tra l'arresto e il download delle immagini, secondo la sua documentazione.

Chi fa che cosa su un VPS gestito

Il self-hosting richiede di occuparsi del server oltre che dell'applicazione. Su un VPS gestito, i nostri team prendono in carico il server e seguono la vostra istanza in modo proattivo; Firefly III resta il vostro software, con le sue impostazioni e i vostri dati finanziari.

ArgomentoI nostri teamVoi
Il serverAggiornamenti del sistema e della sicurezza, interventi sul server compresiIl momento più adatto alla vostra attività
La supervisioneServer seguito 24 ore su 24, 7 giorni su 7, con intervento senza attendere la vostra chiamataLa lettura dei log della vostra istanza
Firefly IIIMonitoraggio proattivo: errori, rallentamenti, attività cron e spazio su disco individuati, correzione raccomandataLa sua installazione, i suoi aggiornamenti e le sue impostazioni, che applicate voi o il vostro assistente IA
Gli account e i datiIl server che li ospita, sorvegliato e salvatoGli utenti, l'autenticazione a due fattori, l'importatore di dati e i suoi fornitori di dati
I backupOgni notte, cifrati e conservati fuori dalla macchina; ripristino compresoLe esportazioni proprie di Firefly III e la richiesta di ripristino, quando ne avete bisogno
La migrazioneIl vostro server attuale migrato, in omaggioIl momento del passaggio

Se preferite che i nostri team intervengano nell'applicazione stessa, questa prestazione si fattura a ore o a forfait, con un preventivo comunicato prima dell'intervento.

Firefly III, su un server gestito per voi

Con un VPS gestito Simafri, i nostri team tengono aggiornato il server della vostra istanza Firefly III, lo sorvegliano giorno e notte e intervengono senza attendere la vostra chiamata; seguono anche la vostra istanza in modo proattivo e vi raccomandano le correzioni utili, che applicate voi o il vostro assistente IA. I backup sono cifrati ogni notte e conservati fuori dalla macchina, il loro ripristino è compreso e la migrazione del vostro server attuale è in omaggio.

Scoprire i VPS gestiti

Domande frequenti

Firefly III è gratuito?

Sì. Firefly III ha licenza AGPL-3.0-or-later: potete farlo girare per voi stessi, per la vostra famiglia o per la vostra azienda senza alcuna licenza da acquistare. Se lo modificate, la vostra versione deve offrire il proprio codice sorgente a chi la usa tramite la rete. Resta il costo del server che lo fa girare.

Come installare Firefly III con Docker Compose?

Scaricate i tre file ufficiali, docker-compose.yml, .env e .db.env. Impostate un'APP_KEY di 32 caratteri e la stessa password in DB_PASSWORD e MYSQL_PASSWORD, prima del primo avvio, poi lanciate docker compose up -d. Collocate quindi davanti un reverse proxy in HTTPS.

A che cosa serve APP_KEY in Firefly III?

APP_KEY è la chiave di cifratura delle sessioni. È lunga esattamente 32 caratteri, senza caratteri speciali come = o #, e resta segreta. La documentazione chiede di salvarla insieme ai volumi: fa parte di ciò che serve per ripristinare un'istanza.

Perché i link di Firefly III restano in http dietro un proxy?

Secondo la FAQ Docker, manca TRUSTED_PROXIES=* nel file .env: senza di esso, Firefly III ignora l'intestazione X-Forwarded-Proto del proxy, i link restano in http e i moduli e i grafici smettono di funzionare. Indicate anche il vostro indirizzo pubblico in APP_URL.

Come configurare il cron di Firefly III con Docker?

Il file Compose ufficiale comprende un servizio cron che chiama l'applicazione ogni giorno alle 3 del mattino. Impostate in .env uno STATIC_CRON_TOKEN di esattamente 32 caratteri, poi riavviate lo stack. Un'unica attività serve tutti gli utenti dell'istanza.

Come aprire Firefly III a più utenti?

Il primo utente che si registra diventa il proprietario, e le registrazioni si chiudono subito dopo. Il proprietario le riapre in /settings, nelle opzioni di configurazione di Firefly III. Ogni utente mantiene poi un'amministrazione finanziaria separata da quella degli altri.

Come fare il backup di Firefly III?

Salvate il database, con un'esportazione mariadb-dump o pg_dump, il volume degli allegati e i file .env e .db.env, cifrati. La funzione di esportazione dell'applicazione non è un backup. Provate il ripristino subito dopo il primo backup.

Un VPS gestito copre Firefly III?

Un VPS gestito copre il server: sistema, sicurezza, supervisione e backup. I nostri team seguono anche la vostra istanza in modo proattivo e vi raccomandano le correzioni utili, che applicate voi. Un intervento nell'applicazione si fattura a ore o a forfait.

Fonti e documentazione ufficiale

Contattaci