Héberger Firefly III sur un VPS géré : vos finances sur votre serveur

Héberger Firefly III sur un VPS géré, c'est tenir vos comptes, vos budgets et vos dépenses sur une machine à vous, que nos équipes tiennent à jour et supervisent jour et nuit. Firefly III est un gestionnaire de finances personnelles libre, sous licence AGPL. Ce guide suit sa documentation officielle : l'installation avec Docker Compose, la clé APP_KEY, HTTPS, le premier compte, la tâche planifiée, la base de données, l'importateur, les e-mails, les sauvegardes et les mises à jour.

Simon Vasconcelos Lee Par Publié le 10 novembre 2026Lecture : 13 minutes

Tous les guides

L'essentiel

  1. La licence AGPL-3.0-or-later permet de faire tourner Firefly III librement ; si vous le modifiez, vous proposez le code de votre version à ceux qui l'utilisent.
  2. Installez-le avec les trois fichiers officiels : docker-compose.yml, .env et .db.env. Choisissez le mot de passe de la base avant le premier démarrage.
  3. APP_KEY fait exactement 32 caractères, se garde secrète et se sauvegarde avec les données.
  4. Derrière un mandataire inverse en HTTPS, définissez TRUSTED_PROXIES=* et votre adresse dans APP_URL, puis créez tout de suite votre compte : le premier inscrit devient propriétaire et les inscriptions se ferment ensuite.
  5. Le service cron du fichier officiel lance chaque nuit les budgets automatiques et les opérations récurrentes. Sauvegardez la base, le volume des pièces jointes et .env avant chaque mise à jour.

Ce que fait Firefly III

Firefly III est un gestionnaire de finances personnelles conçu pour l'auto-hébergement. Il suit vos dépenses et vos revenus, avec des budgets, des catégories et des étiquettes, pour voir où va votre argent. Son README le décrit entièrement auto-hébergé et isolé : il ne contacte aucun serveur extérieur tant que vous ne le lui demandez pas.

Une instance accueille autant d'utilisateurs que vous voulez, chacun avec une administration financière entièrement séparée des autres. La documentation annonce un modèle de partage d'une même administration, en cours de développement.

Ce que permet la licence AGPL

Firefly III est publié sous GNU Affero General Public License, version 3 ou, à votre choix, toute version ultérieure : c'est l'identifiant SPDX AGPL-3.0-or-later de son fichier composer.json. Le texte affirme une permission illimitée de faire tourner le programme non modifié. Vous pouvez donc utiliser l'image publiée par le projet pour vous, votre famille ou votre entreprise, sans licence à acheter.

L'article 13 ajoute une condition propre à l'AGPL : si vous modifiez le programme, votre version doit offrir à tous ceux qui l'utilisent à distance, par le réseau, le moyen d'obtenir gratuitement son code source. L'importateur de données suit la même licence.

L'installation avec Docker Compose

La documentation présente Docker Compose comme la façon la plus simple d'installer Firefly III. Sur un serveur où Docker est installé, créez un dossier et téléchargez-y les trois fichiers officiels, bruts : leurs espaces comptent, et la documentation demande de ne pas les recopier depuis le navigateur.

Terminal
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

Les réglages à changer avant le premier démarrage

Générez deux chaînes de 32 caractères avec la commande que donne le fichier .env : une pour la clé, une pour le mot de passe de la base.

Terminal
head /dev/urandom | LC_ALL=C tr -dc 'A-Za-z0-9' | head -c 32 && echo
.env, les lignes à changer
SITE_OWNER=vous@example.com
APP_KEY=
DB_PASSWORD=
APP_URL=https://finances.example.com
.db.env
MYSQL_PASSWORD=

Choisissez le mot de passe de la base avant le premier démarrage. La base le garde dans son volume dès sa création : changé ensuite, il ne correspond plus, et la FAQ Docker ne connaît qu'une sortie, supprimer les conteneurs et les volumes pour repartir de zéro.

Un port publié en local

Le fichier officiel publie l'application sur le port 80 de toutes les adresses du serveur. Pour la servir en HTTPS derrière un mandataire inverse posé sur la même machine, changez cette seule ligne du service app :

docker-compose.yml, dans le service app
ports:
  - 127.0.0.1:8080:8080
Terminal
docker compose -f docker-compose.yml up -d --pull=always
docker compose -f docker-compose.yml logs -f

Au premier démarrage, le conteneur crée et migre la base de lui-même. Quand l'installation est terminée, Firefly III vous remercie de l'avoir installé dans le journal : passez alors au mandataire inverse.

La documentation ne chiffre pas la mémoire nécessaire ; sa FAQ Docker conseille PHP_MEMORY_LIMIT=512M ou plus si PHP manque de mémoire. La taille dépend du nombre d'utilisateurs, du volume d'opérations et de l'importateur. Sur un VPS géré, décrivez-nous votre usage et nous vous recommandons la taille qui convient.

HTTPS et le mandataire inverse

Firefly III sert l'application en HTTP sur le port 8080 du conteneur, et HTTPS s'installe sur le mandataire inverse placé devant. L'application lit l'en-tête X-Forwarded-Proto pour savoir que le visiteur arrive en HTTPS, à condition de faire confiance au mandataire :

.env
TRUSTED_PROXIES=*

La FAQ Docker est claire sur ce point : sans TRUSTED_PROXIES=*, les liens restent en http, les formulaires et les graphiques cessent de fonctionner, et les en-têtes de sécurité CSP échouent. Avec le port publié sur 127.0.0.1, seul le mandataire du serveur atteint l'application. Recréez le conteneur après chaque changement du fichier .env :

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

Avec Caddy

Caddy obtient lui-même le certificat Let's Encrypt, et sa directive reverse_proxy ajoute par défaut les en-têtes X-Forwarded-For, X-Forwarded-Proto et X-Forwarded-Host :

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

Avec Nginx et Certbot

Ce bloc reprend les en-têtes de la FAQ d'installation, et les tampons qu'elle conseille contre les erreurs 502 quand l'application renvoie un jeton dans un long en-tête. Il écoute sur le port 80 pour laisser Certbot installer HTTPS :

Bloc 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 installe ensuite le certificat et se charge de le renouveler :

Terminal
sudo certbot --nginx

Le premier compte et les inscriptions

Le premier utilisateur qui s'inscrit devient le propriétaire de l'instance. Par mesure de sécurité, les inscriptions se ferment ensuite d'elles-mêmes : la plupart des gens installent Firefly III pour eux seuls.

  1. Ouvrez votre adresse HTTPS dès que le mandataire répond, et créez votre compte : c'est lui qui prend le rôle de propriétaire.
  2. Activez la double authentification dans votre profil, et gardez les huit codes de secours qu'elle affiche.
  3. Pour ouvrir l'instance à d'autres personnes, allez dans /settings, ouvrez les options de configuration de Firefly III, décochez la fermeture des inscriptions et enregistrez.

La tâche planifiée

Plusieurs fonctions ne marchent qu'avec une tâche planifiée : les budgets automatiques, les opérations récurrentes, les alertes d'abonnements et la mise à jour des taux de change. L'image Docker ne lance pas de cron elle-même ; le fichier officiel ajoute pour cela un petit service cron, qui appelle l'application chaque jour à 3 h.

Il s'authentifie avec un jeton fixe. Générez une troisième chaîne avec la même commande, et placez-la dans .env :

.env
STATIC_CRON_TOKEN=

Ce jeton fait exactement 32 caractères : le code de la version 6.7.9 n'accepte pas une autre longueur. Voici le service, tel que le fichier officiel le déclare ; le double $$ est voulu, il renvoie aux lignes TZ et STATIC_CRON_TOKEN du fichier .env :

docker-compose.yml, le service 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

Une seule tâche suffit pour tous les utilisateurs de l'instance. Pour vérifier qu'elle a tourné, lisez le journal du conteneur : chaque tâche y rend un compte rendu en JSON, avec job_fired et job_succeeded.

Terminal
docker logs firefly_iii_cron

Pour la lancer à la main, la FAQ Docker demande de passer par l'utilisateur www-data, et non par root : la FAQ relie à ce piège les erreurs de droits sur les fichiers de journal :

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

MariaDB, PostgreSQL ou SQLite

Le fichier officiel fournit MariaDB, avec l'image mariadb:lts. Firefly III prend aussi en charge PostgreSQL et SQLite, que l'on choisit par DB_CONNECTION dans .env :

BaseMise en placeSauvegarde
MariaDB ou MySQLLe service db du fichier officiel ; DB_CONNECTION=mysql, port 3306Un export avec mariadb-dump, ou le volume de la base, service arrêté
PostgreSQLDB_CONNECTION=pgsql, port 5432, l'image postgres et des variables POSTGRES_* dans .db.envUn export avec pg_dump, ou le volume de la base, service arrêté
SQLiteDB_CONNECTION=sqlite, sans service db, et un volume monté sur /var/www/html/storage/databaseLe volume de la base, service arrêté
.env (PostgreSQL)
DB_CONNECTION=pgsql
DB_HOST=db
DB_PORT=5432

Pour PostgreSQL, la documentation fait aussi pointer le service db vers l'image postgres, qui installe PostgreSQL 18, et monter son volume sur /var/lib/postgresql. Dans .db.env, les variables MYSQL_* deviennent POSTGRES_USER, POSTGRES_DB et POSTGRES_PASSWORD.

Faites ce choix avant de saisir vos premières opérations. La FAQ indique qu'un passage d'une base à l'autre reste possible, sans être pris en charge par Firefly III lui-même, et que l'export de l'application ne reprend pas toutes les données.

L'importateur de données

Le Firefly III Data Importer est un outil à part, avec sa propre installation et ses propres mises à jour ; sa version 2.3.5 est sortie le 23 septembre 2026. Il importe des fichiers CSV et CAMT.053, et sait aussi récupérer les opérations de vos banques par des fournisseurs de données tiers, chacun avec ses conditions.

Le dépôt Docker officiel le fournit dans un second fichier, docker-compose-importer.yml, qui reprend les mêmes services et ajoute importer. Ses réglages vont dans un fichier .importer.env, tiré du .env.example de l'importateur. Servez-le sous son propre nom de domaine, avec un port publié en local et un second bloc de mandataire : la FAQ demande de ne pas le placer dans un sous-dossier.

.importer.env, les lignes à changer
FIREFLY_III_URL=http://app:8080
VANITY_URL=https://finances.example.com
TRUSTED_PROXIES=*

Les e-mails : la configuration SMTP

Par défaut, MAIL_MAILER=log écrit les messages dans les journaux au lieu de les envoyer. Pour recevoir les notifications, comme les alertes d'abonnements, réglez l'envoi dans .env. La documentation demande de toujours changer MAIL_FROM et SITE_OWNER, sans quoi aucun e-mail ne part.

Sur un VPS Simafri, l'envoi passe par un relais SMTP authentifié, sur le port 587 : l'adresse d'un compte de messagerie que vous avez déjà, ou 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=mot_de_passe_du_compte
MAIL_ENCRYPTION=tls

Les sauvegardes

Firefly III n'a pas de routine de sauvegarde intégrée : la documentation conseille les outils du système, et précise que la fonction d'export de l'application n'est pas une sauvegarde. Avec Docker, voici ce qu'il faut garder :

ÉlémentCe qu'il gardeÀ sauvegarder
La base (firefly_iii_db)Les comptes, les opérations, les budgets, les règles et les utilisateursObligatoire
Les pièces jointes (firefly_iii_upload)Les fichiers joints aux opérationsObligatoire
.envLes réglages, et surtout APP_KEYObligatoire, chiffré
.db.envLes accès à la baseObligatoire, chiffré
docker-compose.yml et .importer.envVotre version des fichiers officielsRecommandé

La base, service en marche

Avec MariaDB, mariadb-dump exporte la base sans arrêter le service ; son option --single-transaction donne une copie cohérente des tables InnoDB sans les verrouiller. Lancée depuis le dossier du fichier Compose, la commande lit les accès dans l'environnement du conteneur :

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

Avec PostgreSQL, la même idée passe par pg_dump :

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

Planifiez cet export sur le serveur au moins une fois par jour, et faites le tri parmi les fichiers, qui s'accumulent.

Les volumes, service arrêté

La documentation archive chaque volume avec un conteneur jetable. Docker Compose préfixe le nom des volumes par celui du projet, le nom du dossier par défaut : relevez les noms exacts avant de lancer l'archive.

Terminal, dans le dossier 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 nom de volume mal écrit ne produit pas d'erreur : Docker crée un volume vide sous ce nom et l'archive, ce qui écrase la sauvegarde précédente. La documentation demande de vérifier que le volume existe avant chaque archive.

Gardez une copie de .env et de ces archives hors du serveur, chiffrée, puisqu'elle porte la clé et les accès à la base. Posés sur le disque du serveur, ces fichiers entrent aussi dans ses sauvegardes de nuit.

Restaurer

La documentation restaure un volume avec la commande inverse, service arrêté ; le volume des pièces jointes se restaure de la même façon :

Terminal
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 export SQL se recharge dans la base en marche :

Terminal
docker exec -i firefly_iii_db sh -c 'mariadb -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' < firefly-AAAA-MM-JJ.sql

Restaurez aussi .env avec sa clé APP_KEY, puis relancez et ouvrez vos comptes. La documentation le répète après chaque méthode : la première chose à faire d'une sauvegarde est de la restaurer, pour vérifier qu'elle fonctionne.

Les mises à jour et les migrations

Firefly III se met à jour de lui-même, depuis des versions aussi anciennes que la 4.7, et migre sa base au démarrage du conteneur. La documentation prévient que certaines mises à jour retirent ou nettoient des données, et demande une sauvegarde de la base et des volumes avant chacune, surtout entre deux versions majeures. Depuis le dossier du fichier Compose :

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

L'importateur se met à jour de la même façon, avec docker compose rm -f entre l'arrêt et le téléchargement des images, selon sa documentation.

Qui fait quoi sur un VPS géré

L'auto-hébergement demande de tenir le serveur en plus de l'application. Sur un VPS géré, nos équipes prennent le serveur en main et suivent votre instance de manière proactive ; Firefly III reste votre logiciel, avec ses réglages et vos données financières.

SujetNos équipesVous
Le serveurMises à jour du système et de la sécurité, interventions sur le serveur comprisesLe moment qui convient à votre activité
La supervisionServeur suivi 24 h/24 et 7 j/7, avec intervention sans attendre votre appelLa lecture des journaux de votre instance
Firefly IIISuivi proactif : erreurs, lenteurs, tâche planifiée et espace disque repérés, correction recommandéeSon installation, ses mises à jour et ses réglages, que vous appliquez, vous ou votre assistant IA
Les comptes et les donnéesLe serveur qui les porte, surveillé et sauvegardéLes utilisateurs, la double authentification, l'importateur et ses fournisseurs de données
Les sauvegardesChaque nuit, chiffrées et gardées hors de la machine ; restauration compriseLes exports propres à Firefly III, et la demande de restauration, quand vous en avez besoin
La migrationVotre serveur actuel migré, offertLe moment de la bascule

Si vous préférez que nos équipes interviennent dans l'application elle-même, cette prestation se facture à l'heure ou au forfait, avec un chiffrage communiqué avant l'intervention.

Firefly III, sur un serveur tenu pour vous

Avec un VPS géré Simafri, nos équipes tiennent à jour le serveur de votre instance Firefly III, le surveillent jour et nuit et interviennent sans attendre votre appel ; elles suivent aussi votre instance de manière proactive et vous recommandent les corrections utiles, que vous appliquez, vous ou votre assistant IA. Les sauvegardes sont chiffrées chaque nuit et gardées hors de la machine, leur restauration est comprise, et la migration de votre serveur actuel est offerte.

Découvrir les VPS gérés

Questions fréquentes

Firefly III est-il gratuit ?

Oui. Firefly III est sous licence AGPL-3.0-or-later : vous pouvez le faire tourner pour vous, votre famille ou votre entreprise sans licence à acheter. Si vous le modifiez, votre version doit offrir son code source à ceux qui l'utilisent par le réseau. Reste le coût du serveur qui le fait tourner.

Comment installer Firefly III avec Docker Compose ?

Téléchargez les trois fichiers officiels, docker-compose.yml, .env et .db.env. Définissez une APP_KEY de 32 caractères et le même mot de passe dans DB_PASSWORD et MYSQL_PASSWORD, avant le premier démarrage, puis lancez docker compose up -d. Placez ensuite un mandataire inverse en HTTPS devant.

À quoi sert APP_KEY dans Firefly III ?

APP_KEY est la clé de chiffrement des sessions. Elle fait exactement 32 caractères, sans caractères spéciaux comme = ou #, et se garde secrète. La documentation demande de la sauvegarder avec les volumes : elle fait partie de ce qu'il faut pour restaurer une instance.

Pourquoi les liens de Firefly III restent-ils en http derrière un mandataire ?

La FAQ Docker répond qu'il manque TRUSTED_PROXIES=* dans le fichier .env : sans lui, Firefly III ignore l'en-tête X-Forwarded-Proto du mandataire, les liens restent en http et les formulaires et graphiques cessent de fonctionner. Renseignez aussi votre adresse publique dans APP_URL.

Comment configurer la tâche cron de Firefly III avec Docker ?

Le fichier Compose officiel contient un service cron qui appelle l'application chaque jour à 3 h. Définissez dans .env un STATIC_CRON_TOKEN d'exactement 32 caractères, puis relancez la pile. Une seule tâche sert tous les utilisateurs de l'instance.

Comment ouvrir Firefly III à plusieurs utilisateurs ?

Le premier inscrit devient propriétaire, et les inscriptions se ferment ensuite. Le propriétaire les rouvre dans /settings, parmi les options de configuration de Firefly III. Chaque utilisateur tient alors une administration financière séparée des autres.

Comment sauvegarder Firefly III ?

Sauvegardez la base, par un export mariadb-dump ou pg_dump, le volume des pièces jointes, et les fichiers .env et .db.env, chiffrés. La fonction d'export de l'application n'est pas une sauvegarde. Testez la restauration aussitôt après la première sauvegarde.

Un VPS géré couvre-t-il Firefly III ?

Un VPS géré couvre le serveur : système, sécurité, supervision et sauvegardes. Nos équipes suivent aussi votre instance de manière proactive et vous recommandent les corrections utiles, que vous appliquez. Une intervention dans l'application se facture à l'heure ou au forfait.

Sources et documentation officielle

Contactez-nous