Pourquoi auto-héberger votre budget plutôt que d’utiliser YNAB
La méthode des enveloppes est simple : affectez chaque somme entrante à une catégorie nommée (loyer, alimentation, épargne, fonds d’urgence) avant de la dépenser. Quand une catégorie est épuisée, soit vous arrêtez de dépenser, soit vous transférez sciemment de l’argent depuis une autre enveloppe. YNAB a popularisé cette approche dans une application soignée — mais elle coûte 99 $/an, stocke vos données financières sur ses serveurs et ne peut pas être auditée. Actual Budget reproduit la méthode (y compris la fameuse souplesse « roll with the punches », qui permet de s’adapter aux imprévus) avec l’intégralité du code source sur GitHub sous licence MIT. L’auto-héberger sur un VPS signifie que vos transactions, vos soldes et l’historique de votre budget ne quittent jamais votre infrastructure — et le coût annuel se résume à celui d’un petit VPS.
Déployer Actual Budget avec Docker en deux minutes
Actual se présente sous la forme d’une seule image Docker — pas de serveur de base de données, pas de message broker, pas de fichiers de configuration. Un conteneur, un volume, un port. Sur votre VPS sous Ubuntu 22.04, lancez : docker run -d --restart=always -p 5006:5006 -v actual-budget:/data --name actual-budget actualbudget/actual-server. Le serveur est prêt en moins de deux secondes, sur le port 5006. Ouvrez http://<ip-de-votre-vps>:5006 dans un navigateur, cliquez sur « Créer un nouveau budget », et vous commencez à gérer votre budget. Toute la base de données SQLite est stockée dans le volume Docker actual-budget — sauvegardez-la avec une seule commande docker run --rm -v actual-budget:/data alpine tar -czf - /data. Le dossier monté sur /data contient deux sous-dossiers, server-files et user-files : c’est là que vit tout l’état du serveur. Pour un déploiement durable, préférez un fichier docker-compose.yml (la documentation officielle renvoie à celui du dépôt, packages/sync-server/docker-compose.yml) et démarrez-le avec docker compose up --detach.
Ce que vous obtenez d’emblée
- Budgétisation à base zéro par enveloppes — affectez chaque somme à une catégorie avant de la dépenser ; Actual signale les dépassements en temps réel.
- Synchronisation multi-appareils — téléphone, tablette et ordinateur partagent tous le même budget en direct via le serveur chiffré.
- Chiffrement de bout en bout, en option — une fois activé dans les paramètres, le serveur ne stocke que du texte chiffré ; vos transactions ne sont lisibles que sur vos appareils.
- Synchronisation bancaire en option : Enable Banking (banques européennes, fonction expérimentale), SimpleFIN Bridge (Amérique du Nord), Akahu (Nouvelle-Zélande) ou Pluggy.ai (Brésil) ; GoCardless n’accepte plus de nouveaux comptes selon la documentation. L’import manuel de fichiers OFX/QFX/CSV reste possible.
- Rapports : courbe de patrimoine net, flux de trésorerie, dépenses par catégorie et rapports entièrement personnalisés.
- Import YNAB 4 et nYNAB — migrez tout votre historique en cinq minutes environ.
Prérequis chiffrés pour Actual Budget
Actual est l’un des services les plus légers à héberger. Côté machine : un VPS de 1 Go de RAM sous Ubuntu 22.04 suffit largement, l’application consommant de l’ordre de 80 Mo au repos (mesure à vérifier sur votre instance avec docker stats). Côté réseau : un nom de domaine, un enregistrement DNS pointant vers le VPS, et les ports 80 et 443 ouverts pour le reverse proxy ; le port 5006 peut rester fermé au public une fois Caddy en place. Côté chiffres du serveur lui-même : le port par défaut est 5006, le dossier de données est /data (variable ACTUAL_DATA_DIR), et les envois de fichiers sont plafonnés par défaut à 20 Mo pour la synchronisation et à 50 Mo pour la synchronisation chiffrée. Un budget très ancien ou volumineux peut dépasser ces seuils ; la réinitialisation de la synchronisation compresse alors l’historique. Pour la synchronisation bancaire, ajoutez un compte chez le fournisseur choisi, ses clés d’API et, pour Enable Banking, une application de type Production dont l’URL de redirection est en HTTPS.
Ajouter HTTPS pour synchroniser depuis n’importe où
Pour accéder à votre budget depuis l’extérieur du VPS — sur mobile ou depuis un autre pays — il vous faut HTTPS. La voie la plus simple, c’est Caddy. Installez-le sur le même VPS et ajoutez un Caddyfile d’une seule ligne : budget.votre-domaine.com { reverse_proxy localhost:5006 }. Caddy gère automatiquement le certificat Let’s Encrypt. Une fois le domaine résolu, ouvrez https://budget.votre-domaine.com sur votre téléphone, appuyez sur le bouton « Ajouter à l’écran d’accueil » du navigateur, et Actual devient une véritable icône PWA sur votre écran d’accueil. Tout le trafic de synchronisation entre vos appareils et le serveur passe par ce canal TLS. Ce n’est pas qu’un confort. Actual a besoin d’un contexte sécurisé pour activer SharedArrayBuffer, que son moteur SQLite utilise : sans HTTPS, l’application refuse de démarrer dans le navigateur. La documentation officielle cite trois causes à ce blocage : l’absence de HTTPS, des en-têtes Cross-Origin-Embedder-Policy et Cross-Origin-Opener-Policy mal posés, ou un navigateur trop ancien. Avec le serveur par défaut actual-server, ces deux en-têtes sont déjà envoyés ; si vous passez par Nginx, ne les doublez pas (voir le dépannage plus bas). La synchronisation bancaire ajoute une seconde raison : l’URL de redirection enregistrée chez le fournisseur doit être en https.
Installation en six étapes
Créer un VPS (1 Go de RAM, Ubuntu 22.04)
Actual consomme moins de 80 Mo de RAM au repos. Même la plus petite formule VPS vous laisse une large marge.
Déployer le conteneur
docker run -d --restart=always -p 5006:5006 -v actual-budget:/data --name actual-budget actualbudget/actual-serverCréer votre budget
Ouvrez le port 5006 dans un navigateur, cliquez sur « Créer un nouveau budget », ajoutez vos comptes bancaires avec leurs soldes d’ouverture.
Configurer les catégories d’enveloppes
Créez des catégories (Logement, Alimentation, Transport, Épargne…) et répartissez entre elles vos revenus mensuels prévus.
Sécuriser avec HTTPS
Installez Caddy, ajoutez
budget.votre-domaine.com { reverse_proxy localhost:5006 }à votre Caddyfile, puis rechargez.Installer sur mobile
Ouvrez l’URL HTTPS sur votre téléphone et utilisez « Ajouter à l’écran d’accueil » — Actual Budget devient une icône PWA.
Synchronisation bancaire : Enable Banking, une fonction expérimentale
La documentation officielle d’Actual liste Enable Banking parmi les fournisseurs de synchronisation, pour les banques européennes, et la qualifie de fonction expérimentale : elle peut comporter des bugs, des manques, une documentation incomplète, et être retirée dans une version future. Elle peut aussi ne pas figurer dans la dernière version stable ; la page conseille d’activer les fonctions expérimentales et d’utiliser les images nightly pour l’implémentation la plus récente. Les retours des utilisateurs sont centralisés dans le ticket GitHub n° 7799 (ouvert en mai 2026, étiqueté « experimental feature », toujours ouvert à la date de notre relecture). Aucune liste de banques garanties n’y figure : à vous de vérifier, dans l’assistant d’Actual, que votre pays et votre banque apparaissent, puis de tester sur un seul compte avant de compter dessus. Retenez aussi que les clés du fournisseur vivent sur votre serveur : un VPS correctement durci et des sauvegardes protégées font partie du dispositif.
Configurer Enable Banking dans Actual en cinq étapes
Créer l’application chez Enable Banking
Connectez-vous à votre compte Enable Banking, créez une nouvelle application et choisissez le type Production.
Déclarer l’URL de redirection en HTTPS
Utilisez votre domaine suivi de
/enablebanking/auth_callback, par exemplehttps://budget.example.com/enablebanking/auth_callback, puis cliquez sur Register. Le schéma doit êtrehttps.Lier vos comptes côté Enable Banking
Liez d’abord les comptes voulus dans l’interface d’Enable Banking ; sinon, avertit la documentation, vous ne verrez ni liste de banques ni liste de comptes dans Actual.
Saisir l’identifiant d’application et la clé
Copiez l’Application ID (au format
12345678-1234-1234-1234-123456789012) sans espace avant ni après. Dans Actual : More → Bank Sync → Set up Enable Banking, collez l’identifiant et fournissez le fichier de clé privée.pem.Lier un compte Actual à votre banque
Dans un compte Actual, choisissez Link account → Enable Banking, sélectionnez votre pays et votre banque, puis suivez l’autorisation côté banque. Vérifiez les premières transactions importées avant de passer à un autre compte.
Comment sauvegarder votre budget
Toutes les données résident dans le volume Docker actual-budget. Une sauvegarde cron quotidienne tient en une commande : docker run --rm -v actual-budget:/data -v /backups:/out alpine tar czf /out/actual-budget-$(date +%Y%m%d).tar.gz /data. Pour restaurer, décompressez l’archive tar dans un nouveau volume avant de démarrer le conteneur. Actual dispose aussi d’un export intégré : depuis les Paramètres, section Données, cliquez sur « Export data ». Cela crée un ZIP portable de l’intégralité de votre budget, que vous pouvez importer sur n’importe quelle autre instance Actual. Deux précisions. D’abord, ce volume contient aussi les identifiants de synchronisation bancaire : la documentation indique qu’ils sont stockés sur le serveur, hors du chiffrement de bout en bout, donc lisibles par quiconque accède à la base. Traitez l’archive comme un secret : droits restreints, copie chiffrée hors du VPS. Ensuite, après une restauration, la documentation recommande une réinitialisation de la synchronisation (Paramètres → Avancé → Reset Sync), faite depuis l’appareil qui porte les changements les plus récents, pour que la sauvegarde ne se resynchronise pas vers son ancien état. Testez une restauration complète sur une instance jetable au moins une fois : une sauvegarde jamais restaurée reste une hypothèse.
Chiffrement de bout en bout : ce qu’il couvre et ce qu’il ne couvre pas
Le chiffrement de bout en bout d’Actual est optionnel. Pour l’activer, ouvrez le budget, allez dans les paramètres, section Chiffrement, cliquez sur « enable encryption » et choisissez un mot de passe : une clé dérivée de ce mot de passe chiffre vos données avant leur départ de l’appareil. Quelques points à connaître avant de cliquer. Il est irréversible : on ne le désactive pas, et revenir à un fichier non chiffré passe par une sauvegarde puis une restauration. Si vous perdez le mot de passe, la documentation est claire : vos données chiffrées sont irrécupérables, sauf si vous gardez une copie locale, avec laquelle vous pouvez réinitialiser la clé. Chaque nouvel appareil doit saisir une fois ce mot de passe, qui doit différer du mot de passe du serveur. L’activation impose une réinitialisation de la synchronisation, et le chiffrement coûte un léger ralentissement à la synchronisation. Enfin, il ne couvre que les données du budget : les clés de synchronisation bancaire restent côté serveur, et les données locales de l’appareil ne sont pas chiffrées, d’où l’intérêt d’un chiffrement de disque.
Mettre à jour Actual sans perdre vos données
La mise à jour consiste à remplacer l’image, pas les données. Avec Docker Compose : docker compose pull && docker compose up -d. Avec la commande docker run de ce guide, la documentation décrit trois gestes : docker stop, puis docker container rm sur le conteneur, puis le même docker run relancé avec --pull=always. Tant que le volume actual-budget est conservé, le budget survit au remplacement du conteneur. Avant chaque mise à jour, faites la sauvegarde de la section précédente ; c’est surtout vrai si vous utilisez une image nightly pour essayer la synchronisation bancaire, la documentation recommandant de sauvegarder avant d’essayer cette branche. Un piège connu : en repassant d’une image nightly à une étiquette stable, vous pouvez rencontrer « This budget cannot be loaded with this version of the app » ; la page de restauration indique alors une migration manuelle de SQLite, qu’il vaut mieux ne pas improviser sur l’unique copie de vos données. Après la mise à jour, ouvrez l’application, vérifiez la dernière transaction synchronisée et le solde d’un compte.
Dépannage : messages réels et causes connues
SharedArrayBufferMissing(erreur fatale au chargement) — pas de HTTPS, en-têtes COOP/COEP absents ou doublés, ou navigateur trop ancien. Avec Nginx, masquez les en-têtes amont (proxy_hide_header Cross-Origin-Embedder-Policy;etproxy_hide_header Cross-Origin-Opener-Policy;) et posez-les une seule fois :require-corpetsame-origin.Enable Banking API error: status=403 body={"code":403,"message":"Application is not active"}— l’application Enable Banking n’est pas encore activée ; la liste des comptes reste vide sans erreur dans l’interface (rapporté dans le ticket n° 7799).- Application introuvable alors que l’identifiant est correct — un espace en tête de l’Application ID suffit à faire échouer la connexion ; retirez-le (un utilisateur a demandé dans le ticket que l’espace soit ignoré et le message clarifié).
URL "app://actual/enablebanking/auth_callback" uses unsupported scheme— le support d’Enable Banking ne prend en charge que les redirectionshttps; il a suggéré une redirection HTTPS qui renvoie ensuite vers le schéma de l’application.Could not validate the credentials. Please check your Application ID and secret key.— signalé uniquement sous Firefox avec des valeurs qui fonctionnaient sous Chromium ; aucun contournement n’est consigné, essayez un autre navigateur pour la saisie initiale.- Bénéficiaires vides ou identiques aux notes, solde de carte erroné — ces comportements sont rapportés dans le ticket n° 7799 (par exemple le premier solde renvoyé, parfois le crédit disponible, affiché à la place de la dette comptabilisée). Ce sont des limites de l’implémentation expérimentale, pas une erreur de votre installation : comparez avec le relevé de la banque.
PostError: network-failure,Wrong transactions period requested, plusieurs applications Enable Banking — rapportés dans le même ticket sans correctif consigné. Si vous avez créé une seconde application, déliez les comptes et regroupez-les tous sous une seule : la synchronisation de ceux liés via la première a échoué après l’ajout de la seconde.- Journaux détaillés — ajoutez
DEBUG=actual-sensitive:enable-banking,actual-sensitive:bank-syncà l’environnement du conteneur, relancez, reproduisez l’erreur, puis retirez la variable.
Ne publiez jamais les journaux « sensitive » tels quels
La documentation prévient que ces journaux peuvent contenir des identifiants, des informations bancaires ou d’autres données privées : ne les collez ni dans un ticket public ni sur Discord. Évitez aussi DEBUG=* ou DEBUG=actual*, qui activent eux aussi la sortie sensible ; pour un débogage ordinaire, DEBUG=actual:* suffit. Relisez et caviardez l’extrait avant de le transmettre au mainteneur qui vous aide, et remettez l’ancienne valeur de DEBUG une fois le diagnostic terminé.