Suite de scripts Python pour automatiser et enrichir Firefly III, un gestionnaire de finances personnelles open source.
- Rapport quotidien par email — soldes des comptes, graphiques d'évolution, transactions importées, alertes fraude, catégorisation IA
- Catégorisation IA — utilise Claude (Anthropic) pour identifier automatiquement les marchands et catégories des transactions importées
- Détection de fraude — détecte les transactions inhabituelles (montants anormaux, horaires nocturnes, devises étrangères, nouveaux marchands)
- Analyse hebdomadaire — synthèse en français de vos dépenses par Claude
- Validateur de transactions — mini serveur web Flask permettant de valider d'un clic les marchands assignés par IA, directement depuis l'email
firefly_morning_report.py — Orchestrateur du rapport quotidien
firefly_ai_categorize.py — Catégorisation IA des transactions
firefly_fraud_detection.py — Détection de fraude
firefly_ai_analysis.py — Analyse hebdomadaire par IA
firefly_validator.py — Serveur Flask de validation des marchands
firefly_trigger_import.py — Déclenchement manuel de l'import
config.py — Configuration partagée (non versionnée)
docker-compose.yml — Stack Docker complète
- Firefly III installé et fonctionnel
- Firefly III Data Importer configuré avec Enable Banking
- Python 3.8+ sur le serveur (Synology NAS ou autre)
- Packages Python :
requests,matplotlib,Pillow,flask - Compte Anthropic avec clé API
- Serveur SMTP pour l'envoi des emails
git clone https://github.com/votre-compte/firefly-scripts.git
cd firefly-scriptscp config.py.example config.pyÉditer config.py et remplir toutes les valeurs :
FIREFLY_URLetFIREFLY_TOKEN— URL et Personal Access Token FireflyANTHROPIC_API_KEY— clé API AnthropicSMTP_*— paramètres de votre serveur mailVALIDATOR_SECRET— clé secrète aléatoire (générer avecpython3 -c "import secrets; print(secrets.token_hex(32))")
Copier tous les fichiers .py sur le serveur (ex. /volume1/docker/firefly/).
| Container | Image | Rôle |
|---|---|---|
Firefly-REDIS |
redis:7-alpine |
Cache et sessions |
Firefly-DB |
postgres:16-alpine |
Base de données |
Firefly |
fireflyiii/core:latest |
Application principale |
Firefly-Importer |
fireflyiii/data-importer:latest |
Import interactif OAuth |
Firefly-Importer-Auto |
fireflyiii/data-importer:latest |
Import automatique headless (PAT) |
Firefly-Cron |
alpine:latest |
Tâches planifiées internes |
Firefly-Validator |
python:3.11-slim |
Serveur de validation des marchands |
Rechercher et remplacer toutes les occurrences de :
| Placeholder | Description |
|---|---|
YOUR_PERSONAL_ACCESS_TOKEN |
PAT généré dans Firefly → Options → Personal Access Tokens |
YOUR_AUTO_IMPORT_SECRET |
Chaîne aléatoire ≥ 16 caractères — doit être identique dans importer-auto ET dans le container cron |
YOUR_RANDOM_32CHAR_SECRET |
Clé HMAC pour le validateur — générer avec python3 -c "import secrets; print(secrets.token_hex(32))" |
YOUR_APP_ID |
App ID Enable Banking (fourni par Enable Banking) |
YOUR_CLIENT_ID |
OAuth Client ID créé dans Firefly pour l'importer interactif |
your.smtp.host |
Serveur SMTP pour les notifications de l'importeur |
CHANGE_THIS_TO_A_RANDOM_16CHAR_STRING |
Même valeur que YOUR_AUTO_IMPORT_SECRET dans la commande cron |
Enable Banking requiert une clé privée RSA pour authentifier les appels API. Le container importer attend cette clé dans la variable d'environnement ENABLE_BANKING_PRIVATE_KEY, mais passer une clé multi-lignes directement dans une variable d'environnement Docker est problématique.
La solution utilise eb-entrypoint.sh : la clé est stockée dans un fichier monté en volume, et le script d'entrée la charge dans la variable d'environnement au démarrage du container.
Étapes :
-
Obtenir la clé privée RSA auprès d'Enable Banking (fichier
.keyou.pem) -
La copier sur le serveur :
cp votre_cle_privee.key /volume1/docker/firefly/importer/eb_private.key
chmod 600 /volume1/docker/firefly/importer/eb_private.key- Rendre le script exécutable :
chmod +x /volume1/docker/firefly/eb-entrypoint.sh- Le
docker-compose.ymlmonte automatiquement ces deux fichiers dans les containers importer :
volumes:
- /volume1/docker/firefly/importer/eb_private.key:/secrets/eb_private.key:ro
- /volume1/docker/firefly/eb-entrypoint.sh:/eb-entrypoint.sh:roAu démarrage, eb-entrypoint.sh lit le fichier et exporte son contenu dans ENABLE_BANKING_PRIVATE_KEY avant de lancer l'application PHP.
L'import automatique fonctionne en deux temps :
1. Container Firefly-Importer-Auto
C'est une instance headless du data importer, configurée avec :
FIREFLY_III_ACCESS_TOKEN— un PAT Firefly (pas d'OAuth)AUTO_IMPORT_SECRET— une chaîne secrète qui protège le endpoint HTTP de déclenchementCAN_POST_AUTOIMPORT=true— active le endpoint/autoimportIMPORT_DIR_ALLOWLIST— répertoire contenant les fichiers de configuration d'import (.json)LOG_CHANNEL=single— active l'écriture dans un fichier log (monté en volume pour le rapport du matin)
Le container expose le port 8088 uniquement en localhost (127.0.0.1:8088:8080), pour permettre le déclenchement manuel depuis le NAS sans l'exposer sur internet.
2. Container Firefly-Cron
Un container Alpine minimaliste qui exécute deux tâches cron :
0 5 * * * → déclenche l'import Enable Banking via HTTP POST sur importer-auto
30 5 * * * → déclenche le cron interne de Firefly (règles, tâches récurrentes, etc.)
Le déclenchement de l'import se fait par une simple requête HTTP vers le container importer-auto sur le réseau Docker interne :
http://firefly-importer-auto:8080/autoimport?secret=VOTRE_SECRET&directory=/var/www/html/storage/upload
secret dans l'URL cron doit être identique à AUTO_IMPORT_SECRET dans le container importer-auto.
3. Fichiers de configuration d'import
Les fichiers .json de configuration Enable Banking doivent être placés dans :
/volume1/docker/firefly/importer/
Ce répertoire est monté dans les deux containers importer sous /var/www/html/storage/upload.
docker compose up -dConfigurer le planificateur de tâches du serveur :
| Heure | Commande |
|---|---|
| 05:00 | Déclenchement import Enable Banking (via cron Docker) |
| 05:30 | Cron interne Firefly |
| 06:15 | python3 /volume1/docker/firefly/firefly_morning_report.py |
| Dimanche 08:00 | python3 /volume1/docker/firefly/firefly_ai_analysis.py |
Le validateur est un mini serveur Flask qui permet de cliquer sur un bouton dans l'email pour ajouter le tag VERIFIED à une transaction.
Les liens sont sécurisés par HMAC-SHA256 avec expiration (24h par défaut).
Exposer le service via un reverse proxy :
validator.votre-domaine.com → port 8089
| Variable | Description |
|---|---|
FIREFLY_URL |
URL interne Docker (ex. http://firefly:8080) |
FIREFLY_PUBLIC_URL |
URL publique (ex. https://firefly.votre-domaine.com) |
FIREFLY_TOKEN |
Personal Access Token |
VALIDATOR_SECRET |
Clé secrète HMAC (même valeur que dans config.py) |
VALIDATOR_TOKEN_EXPIRY_HOURS |
Durée de validité des liens (défaut: 24) |
VERIFIED_TAG |
Nom du tag de validation (défaut: VERIFIED) |
config.pyest exclu du versionnement via.gitignore— ne jamais le committer- Les clés privées (
*.key,*.pem) sont également exclues - Les liens de validation expirent après 24h et sont signés cryptographiquement
MIT