Mealie : installation, recettes, menus et sauvegarde.
Note d’anonymisation Tous les domaines, comptes, montants, noms de serveurs, adresses et secrets sont fictifs. Les captures doivent être réalisées avec des données de démonstration et leurs métadonnées EXIF supprimées.
1. Utilité et positionnement
Mealie centralise les recettes, ajuste les portions, planifie les repas et transforme les ingrédients en liste de courses.
2. Architecture cible
Internet → Traefik → Mealie:9000 → /app/data
3. Préparer le déploiement
Créez un dossier dédié sous /opt/stacks, générez les secrets avec openssl rand -hex 32, protégez .env en mode 600 et validez toujours le Compose avec docker compose config --quiet. Seul le service Web rejoint le réseau externe proxy-public ; bases et caches restent sur un réseau interne.
Avant le premier démarrage Consultez les notes de version et figez une version testée. Les exemples de tags sont des repères : une mise à jour majeure peut modifier les variables ou le schéma de base.
SQLite suffit généralement à 1–20 utilisateurs et simplifie la sauvegarde. PostgreSQL améliore les écritures concurrentes et active notamment la recherche approximative.
7. Structurer la bibliothèque
Utilisez peu de catégories pour le type de plat et des étiquettes transversales comme rapide, végétarien, hiver ou congélable. Normalisez les unités afin que la liste de courses fusionne correctement.
8. Importer une recette
Contrôlez titre, portions, ingrédients, unités, étapes et image. Un extracteur ne peut pas inventer une structure absente du site source.
9. Planifier et faire les courses
Ajoutez les recettes au calendrier, envoyez leurs ingrédients vers une liste et contrôlez les quantités agrégées avant de partir.
10. Sauvegarde intégrée
Settings → Admin Settings → Backups permet créer, télécharger, téléverser et restaurer. La restauration est destructive.
11. Migrer vers PostgreSQL
Créez un backup intégré, restaurez sur une stack PostgreSQL temporaire ; la documentation indique qu’un rôle superutilisateur peut être temporairement nécessaire, à retirer immédiatement.
Capture 1 à ajouter — Bibliothèque À capturer : recettes fictives Intérêt : présenter le produit À masquer : noms privés
Capture 2 à ajouter — Recette À capturer : ingrédients et étapes Intérêt : montrer la structure À masquer : photo familiale
Capture 3 à ajouter — Planificateur À capturer : semaine artificielle Intérêt : montrer l’usage À masquer : habitudes réelles
Capture 4 à ajouter — Sauvegardes À capturer : liste de backups Intérêt : documenter la maintenance À masquer : noms sensibles
Plan de sauvegarde et restauration
Conservez la configuration, les secrets et un export cohérent des données hors de l’hôte. Une sauvegarde n’est validée qu’après restauration sur une seconde stack isolée. Documentez la version de l’image utilisée pour la restauration.
Cette installation est prête à être adaptée et relue avant publication. Les captures proposées apportent une preuve visuelle aux étapes complexes sans exposer de données personnelles ou d’infrastructure.
Quand on détient un PEA dans une banque, un compte-titres chez un courtier en ligne, de l’épargne salariale et quelques cryptomonnaies, plus personne ne sait répondre simplement à la question : « combien ai-je, où, et est-ce bien réparti ? ». Ghostfolio est un tableau de bord patrimonial open source qui consolide ces actifs, calcule la performance réelle, détecte les déséquilibres et suit les dividendes. Ce guide présente ses fonctionnalités en détail, puis l’installation auto-hébergée complète, la saisie des données, les imports, la maintenance et la restauration.
Note d’anonymisation Les captures d’écran de cet article proviennent du compte de démonstration officiel de Ghostfolio, qui contient un portefeuille fictif : aucune donnée personnelle n’y apparaît. Les domaines (finance.exemple.net), comptes, établissements et montants utilisés dans les exemples sont également fictifs.
1. Ghostfolio en bref
Ghostfolio est un logiciel de gestion de patrimoine développé en TypeScript (Angular pour l’interface, NestJS pour l’API, PostgreSQL pour les données et Redis pour le cache). Il est publié sous licence AGPL-3.0. Deux modes d’utilisation existent :
Mode
Principe
Pour qui
Ghostfol.io (cloud)
Compte hébergé par l’éditeur, gratuit ou Premium
Tester rapidement, ne rien administrer
Auto-hébergé
Image Docker officielle sur votre serveur
Garder la maîtrise totale de données financières sensibles
Ce guide traite de l’auto-hébergement. Les données financières font partie des plus sensibles qui soient : les garder chez soi, derrière un reverse proxy maîtrisé, est précisément l’intérêt de la démarche.
Capture à ajouter Vue d’ensemble : valeur nette, performance et évolution du portefeuille de démonstration. Source : démo officielle ghostfol.io.
2. Ce que Ghostfolio fait… et ne fait pas
Avant d’installer quoi que ce soit, il faut comprendre le positionnement de l’outil, sinon on finit par lui demander ce qu’il ne sait pas faire.
Besoin
Ghostfolio
Commentaire
Consolider plusieurs courtiers et enveloppes
Oui
Cœur du produit
Performance réelle depuis l’origine, par année, sur 1 an
Oui
Calculée à partir des transactions
Allocation par classe d’actifs, pays, secteur, devise
Oui
Pour les ETF, décomposition selon les données disponibles
Suivi des dividendes
Oui
Historique et projection
Liquidités et soldes de comptes
Oui
Saisie manuelle ou import
Budget mensuel, dépenses courantes
Non
Rôle d’un outil comme Actual Budget
Synchronisation automatique avec la banque
Non
Saisie ou import des transactions
Calcul fiscal français (PFU, abattements PEA)
Non
Ghostfolio n’est pas un logiciel fiscal
Immobilier, véhicules, objets
Partiellement
Saisie manuelle de valeurs pour suivre le patrimoine global
Complémentarité Ghostfolio et un outil de budget sont complémentaires : le budget répond à « puis-je dépenser ? », Ghostfolio à « comment évolue ce que j’ai épargné ? ». Évitez de saisir deux fois la même information dans les deux outils.
3. Tour d’horizon des fonctionnalités
3.1 Vue d’ensemble
L’écran d’accueil affiche la valeur nette, la performance du jour, le graphique d’évolution et plusieurs plages de temps : aujourd’hui, depuis le début de l’année, 1 an, 5 ans et depuis l’origine. Le mode Zen masque les montants et ne conserve que les pourcentages, pratique pour consulter son portefeuille en public ou pour s’empêcher de réagir aux variations quotidiennes.
3.2 Positions (holdings)
Chaque actif détenu apparaît avec sa quantité, sa valeur, son poids dans le portefeuille et sa performance. Un clic ouvre la fiche détaillée : historique des transactions, prix moyen d’achat, dividendes perçus et graphique de cours.
Capture à ajouter Les positions : poids, valeur et performance de chaque actif. Source : démo officielle ghostfol.io.
3.3 Allocations
C’est la fonctionnalité qui justifie souvent à elle seule l’adoption de l’outil. Ghostfolio ventile le portefeuille selon plusieurs axes :
Compte et plateforme : exposition par établissement, utile pour mesurer le risque de contrepartie ;
Devise : part du patrimoine exposée au dollar, à la livre ou au franc suisse ;
Pays, régions et marchés : marchés développés, émergents, États-Unis ;
Secteurs : technologie, santé, finance, etc. ;
Symboles : poids individuel de chaque ligne.
Capture à ajouter Les allocations par classe d’actifs, devise, compte et région. Source : démo officielle ghostfol.io.
3.4 Analyse et performance
La page d’analyse compare l’évolution du portefeuille à un indice de référence, détaille les meilleures et les pires positions et présente les investissements par période. On visualise immédiatement si les apports réguliers ont été tenus et comment la valeur a évolué indépendamment de ces apports.
Capture à ajouter Analyse : performance comparée à un indice de référence et investissements par période. Source : démo officielle ghostfol.io.
3.5 X-ray : l’analyse statique des risques
X-ray passe le portefeuille au crible de règles simples : concentration excessive sur un compte, une devise ou une classe d’actifs, frais trop élevés par rapport aux montants investis, liquidités en excès ou insuffisantes. Chaque règle est notée et peut être ajustée. C’est un excellent garde-fou contre la dérive progressive d’une allocation.
Capture à ajouter X-ray : règles de diversification et de frais appliquées au portefeuille. Source : démo officielle ghostfol.io.
3.6 FIRE : projection vers l’indépendance financière
Le calculateur FIRE projette le capital dans le temps selon un taux d’épargne et un rendement annuel hypothétiques, et estime le revenu qu’une règle de retrait de 4 % permettrait de tirer du portefeuille. C’est un outil de réflexion, pas une promesse : les hypothèses de rendement doivent rester prudentes.
Capture à ajouter Projection FIRE : évolution estimée du capital et revenu de retrait. Source : démo officielle ghostfol.io.
3.7 Activités
Toutes les transactions sont listées dans la page Activités : achats, ventes, dividendes, intérêts, frais, passifs et biens de valeur. C’est ici que l’on saisit, importe, exporte et corrige les données. La qualité de tout le reste dépend de cette page.
Capture à ajouter Les activités : la source de vérité de tous les calculs. Source : démo officielle ghostfol.io.
3.8 Fonctions complémentaires
Watchlist pour suivre des actifs non détenus ;
Multi-utilisateurs : chaque membre du foyer a son propre portefeuille ;
Accès partagé en lecture seule ou en mode public, par exemple pour un conseiller ;
Mode sombre et interface disponible en français ;
Export JSON complet des activités ;
API pour automatiser l’import depuis des scripts.
4. Architecture de l’installation
Internet
│ HTTPS
▼
Cloudflare Tunnel / Traefik ── réseau Docker « proxy-public »
│
▼
ghostfolio:3333 ──────────── réseau interne « ghostfolio-internal »
├── postgres:5432 données : comptes, activités, utilisateurs
└── redis:6379 cache et files de tâches (collecte des cours)
Composant
Rôle
À sauvegarder
Ghostfolio
Interface Web, API, calculs, collecte des cours
Non, l’image suffit
PostgreSQL
Toutes les données métier
Oui, impérativement
Redis
Cache et file des tâches de collecte
Non
Fichier .env
Mots de passe et clés de signature
Oui, de manière chiffrée
Ressources observées pour un usage familial : environ 500 Mo à 1 Go de RAM pour l’ensemble, très peu de CPU hors collecte des cours, et quelques centaines de Mo de disque pour PostgreSQL.
5. Prérequis
Un hôte Docker avec Docker Engine et le plugin Compose à jour ;
Un reverse proxy fonctionnel (Traefik dans cet article) et un réseau externe partagé, ici proxy-public ;
Un nom de domaine dédié, par exemple finance.exemple.net, avec certificat valide ;
Un emplacement de sauvegarde situé hors de l’hôte.
6. Préparer les secrets
Le fichier d’exemple officiel .env.example définit les variables nécessaires. Toutes les valeurs sensibles doivent être générées aléatoirement.
mkdir -p /opt/stacks/ghostfolio
cd /opt/stacks/ghostfolio
cat > .env <<EOF
COMPOSE_PROJECT_NAME=ghostfolio
# CACHE
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=$(openssl rand -hex 32)
# POSTGRES
POSTGRES_DB=ghostfolio-db
POSTGRES_USER=ghostfolio
POSTGRES_PASSWORD=$(openssl rand -hex 32)
# VARIOUS
ACCESS_TOKEN_SALT=$(openssl rand -hex 32)
JWT_SECRET_KEY=$(openssl rand -hex 32)
EOF
# DATABASE_URL est ajoutée ensuite pour que le shell ne remplace pas les variables
echo 'DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?connect_timeout=300' >> .env
chmod 600 .env
Variable
Rôle
POSTGRES_*
Création de la base au premier démarrage
DATABASE_URL
Chaîne de connexion utilisée par Ghostfolio
REDIS_*
Connexion au cache, protégée par mot de passe
ACCESS_TOKEN_SALT
Sel utilisé pour les jetons d’accès des utilisateurs
JWT_SECRET_KEY
Clé de signature des sessions
Ne perdez jamais ces deux clés Le jeton de sécurité de chaque utilisateur dépend de ACCESS_TOKEN_SALT. Si vous perdez ou modifiez cette valeur après la création des comptes, les jetons existants deviennent invalides. Sauvegardez le fichier .env avec la base, dans un emplacement chiffré.
Ne publiez pas la sortie de docker compose config docker compose config affiche toutes les variables remplacées, donc les mots de passe en clair. Pour valider le fichier, utilisez docker compose config --quiet.
7. Le fichier Compose
Le fichier ci-dessous s’appuie sur le Compose officiel du dépôt Ghostfolio, avec trois adaptations : aucun port publié sur l’hôte, deux réseaux séparés et des données stockées dans le dossier de la stack pour simplifier les sauvegardes.
cap_drop: ALL et no-new-privileges : les conteneurs démarrent sans aucune capacité Linux superflue. PostgreSQL récupère uniquement celles dont il a besoin pour gérer ses fichiers.
$${...} : le double dollar empêche Compose de remplacer la variable ; c’est le shell du conteneur qui la lit au démarrage.
condition: service_healthy : Ghostfolio attend que PostgreSQL et Redis répondent réellement avant de démarrer, ce qui évite les erreurs de migration au premier lancement.
Réseau internal : PostgreSQL et Redis ne sont joignables ni depuis Traefik ni depuis l’extérieur.
stop_grace_period: 1m : laisse le temps à l’application de terminer proprement ses tâches.
Figer la version après validation Le tag latest suit la dernière version stable. Une fois l’installation validée, relevez la version réellement déployée avec docker image inspect ghostfolio/ghostfolio:latest --format '{{index .Config.Labels "org.opencontainers.image.version"}}' ou dans À propos, puis figez-la dans le Compose pour maîtriser les mises à jour.
Au premier lancement, Ghostfolio applique ses migrations Prisma puis démarre l’API. Dans les journaux, on doit voir l’application écouter sur le port 3333. Attendez que les trois conteneurs soient healthy :
NAME STATUS
ghostfolio Up 2 minutes (healthy)
gf-postgres Up 2 minutes (healthy)
gf-redis Up 2 minutes (healthy)
Message ou symptôme
Cause probable
Correction
REDIS_PASSWORD variable is not set
Variable absente du .env
Vérifier le fichier et sa lecture par Compose
Can't reach database server
DATABASE_URL incorrecte ou base pas prête
Vérifier le nom du service postgres et les identifiants
password authentication failed
Mot de passe modifié après initialisation de la base
Les variables POSTGRES_* ne s’appliquent qu’à la création ; restaurer l’ancien mot de passe
Exposition sur Internet Ghostfolio contient l’intégralité de votre patrimoine financier. Si l’instance n’est utilisée que par le foyer, envisagez de ne pas la publier sur Internet du tout et de n’y accéder qu’en local ou via VPN. À défaut, ajoutez une protection en amont (authentification du reverse proxy, filtrage d’IP, CrowdSec).
10. Créer le compte administrateur
Ghostfolio n’utilise pas de couple identifiant / mot de passe classique. À l’inscription, l’application génère un jeton de sécurité qui sert ensuite à se connecter. Le premier compte créé sur une instance auto-hébergée devient administrateur.
Ouvrir https://finance.exemple.net et choisir Démarrer.
Copier immédiatement le jeton de sécurité affiché et l’enregistrer dans un gestionnaire de mots de passe.
Accepter les conditions et accéder au tableau de bord vide.
Ouvrir Mon Ghostfolio → Paramètres et choisir la langue française, la devise de référence EUR et le format de date.
Dans Admin Control → Paramètres, désactiver l’inscription des nouveaux utilisateurs une fois les comptes du foyer créés.
Jeton de sécurité Le jeton de sécurité n’est affiché qu’une fois. Sans lui, il faut qu’un administrateur en régénère un nouveau. Ne le stockez jamais dans un fichier texte non chiffré.
Plusieurs personnes Pour chaque membre du foyer, créez un compte séparé : les portefeuilles restent indépendants. L’accès partagé permet ensuite de consulter un autre portefeuille en lecture seule sans partager son jeton.
11. Modéliser plateformes et comptes
C’est l’étape la plus importante, et celle que l’on regrette le plus d’avoir bâclée. Ghostfolio distingue deux notions :
La plateforme : l’établissement qui détient vos avoirs (banque, courtier, teneur de compte d’épargne salariale, plateforme crypto) ;
Le compte : une enveloppe précise ouverte dans cet établissement (PEA, CTO, PEE, livret, portefeuille crypto).
Plateforme fictive
Compte
Devise
Remarque
Banque Alpha
PEA
EUR
Enveloppe fiscale distincte du CTO
Banque Alpha
PEA-PME
EUR
Compte séparé, même plateforme
Courtier Bêta
CTO
EUR
Peut contenir des titres en USD
Épargne Entreprise
PEE
EUR
Fonds souvent non cotés
Épargne Entreprise
PERCO / PER collectif
EUR
Avoirs bloqués jusqu’à la retraite
Crypto Gamma
Portefeuille spot
EUR
Cryptomonnaies
Banque Alpha
Livret
EUR
Liquidités de précaution
Cette organisation permet d’obtenir à la fois une vue par enveloppe fiscale et une vue par établissement. La seconde est souvent négligée : elle révèle par exemple que 80 % du patrimoine dépend d’un seul courtier.
Capture à ajouter Les comptes et leur solde de liquidités, rattachés à leurs plateformes. Source : démo officielle ghostfol.io.
Bon réflexe Renseignez le solde de liquidités de chaque compte. Sans lui, la valeur d’un compte-titres après une vente paraît chuter, alors que l’argent est simplement redevenu des espèces.
12. Comprendre les types d’activités
Type
Usage
Effet sur le portefeuille
BUY
Achat d’un titre
Augmente la quantité détenue
SELL
Vente
Diminue la quantité, réalise une plus ou moins-value
DIVIDEND
Dividende perçu
Ajoute un revenu, sans changer la quantité
INTEREST
Intérêts (livret, obligations)
Ajoute un revenu
FEE
Frais isolés (droits de garde)
Diminue la performance
LIABILITY
Dette (crédit)
Diminue la valeur nette
ITEM
Bien de valeur (véhicule, objet)
Suivi manuel de la valeur
Les frais de courtage d’un achat se saisissent dans le champ frais de l’activité BUY, pas comme une activité FEE séparée : sinon ils seraient comptés deux fois.
13. Sources de données et symboles
Chaque actif est associé à une source de données qui fournit son cours :
Source
Usage typique
YAHOO
Actions et ETF cotés ; symboles du type CW8.PA, AAPL
COINGECKO
Cryptomonnaies, identifiées par l’identifiant CoinGecko (bitcoin, ethereum)
MANUAL
Actifs sans cotation publique : fonds d’épargne salariale, parts non cotées
GHOSTFOLIO
Source fournie par l’éditeur avec un abonnement Premium
Vérifiez la place de cotation Un même ticker peut désigner des titres différents selon la place de cotation. Recherchez toujours l’actif par son nom ou son ISIN dans le formulaire d’ajout, puis vérifiez la devise et la place affichées. Un mauvais choix produit une courbe crédible mais totalement fausse.
Cas de l’épargne salariale
Les fonds de PEE et PERCO n’ont généralement pas de cours public exploitable. Créez l’actif en source MANUAL, saisissez les achats avec la valeur liquidative de la date d’investissement, puis renseignez régulièrement la valeur liquidative dans Admin Control → Données de marché. Pour l’abondement employeur, une convention simple consiste à le saisir comme un achat dont le prix est réel mais dont l’apport ne provient pas de vous ; notez votre convention et appliquez-la toujours de la même façon.
14. Saisir ou importer les activités
14.1 Saisie manuelle
Pour quelques lignes, le bouton + de la page Activités suffit : choisir le type, rechercher l’actif, puis saisir date, quantité, prix unitaire, frais et compte.
14.2 Import CSV
Pour un historique important, l’import CSV est bien plus rapide. Le format reconnu est celui du fichier d’exemple officiel test/import/ok.csv du dépôt Ghostfolio :
Date,Code,DataSource,Currency,Price,Quantity,Action,Fee,Note
2024-01-15,CW8.PA,YAHOO,EUR,480.25,4,buy,1.99,Achat mensuel PEA
2024-02-15,CW8.PA,YAHOO,EUR,495.10,4,buy,1.99,Achat mensuel PEA
2024-03-20,AAPL,YAHOO,USD,172.30,5,buy,2.50,CTO
2024-05-16,AAPL,YAHOO,USD,0.25,5,dividend,0,Dividende trimestriel
2024-06-10,bitcoin,COINGECKO,EUR,62000,0.01,buy,1.20,Achat crypto
Colonne
Contenu
Piège à éviter
Date
Format ISO AAAA-MM-JJ
Format français JJ/MM/AAAA mal interprété
Code
Symbole de la source
Symbole Yahoo sans suffixe de place
DataSource
YAHOO, COINGECKO, MANUAL
Mélanger les sources pour un même actif
Currency
Devise de cotation de l’actif
Indiquer EUR pour un titre coté en USD
Price
Prix unitaire hors frais
Mettre le montant total
Quantity
Nombre de titres
Quantité négative pour une vente
Action
buy, sell, dividend, fee, interest
Libellés français du courtier
Fee
Frais de l’opération
Frais déjà inclus dans le prix
Le séparateur décimal doit être un point et le fichier encodé en UTF-8. L’export d’un courtier français utilise souvent le point-virgule, la virgule décimale et des dates françaises : un petit script de conversion est presque toujours nécessaire.
14.3 Convertir un export de courtier
#!/usr/bin/env python3
# Conversion d'un export CSV de courtier (format français) vers le format Ghostfolio.
# Adaptez le dictionnaire COLONNES et TYPES aux libellés de votre courtier.
import csv, sys
from datetime import datetime
COLONNES = {"date": "Date opération", "isin": "ISIN", "type": "Sens",
"quantite": "Quantité", "prix": "Cours", "frais": "Frais"}
TYPES = {"Achat": "buy", "Vente": "sell", "Dividende": "dividend"}
SYMBOLES = {"FR0010315770": "CW8.PA"} # ISIN -> symbole Yahoo
def nombre(texte):
return float(texte.replace("\u00a0", "").replace(" ", "").replace(",", ".") or 0)
source, cible = sys.argv[1], sys.argv[2]
with open(source, encoding="utf-8-sig") as f, open(cible, "w", newline="", encoding="utf-8") as g:
lecteur = csv.DictReader(f, delimiter=";")
ecrivain = csv.writer(g)
ecrivain.writerow(["Date", "Code", "DataSource", "Currency", "Price", "Quantity", "Action", "Fee", "Note"])
for ligne in lecteur:
isin = ligne[COLONNES["isin"]].strip()
if isin not in SYMBOLES or ligne[COLONNES["type"]] not in TYPES:
print(f"Ignoré : {ligne}", file=sys.stderr)
continue
date = datetime.strptime(ligne[COLONNES["date"]], "%d/%m/%Y").strftime("%Y-%m-%d")
ecrivain.writerow([date, SYMBOLES[isin], "YAHOO", "EUR",
nombre(ligne[COLONNES["prix"]]), abs(nombre(ligne[COLONNES["quantite"]])),
TYPES[ligne[COLONNES["type"]]], nombre(ligne[COLONNES["frais"]]), isin])
Le script affiche toutes les lignes ignorées : aucune ligne ne doit disparaître silencieusement entre l’export du courtier et l’import Ghostfolio.
14.4 Méthode d’import sans regret
Faire une sauvegarde PostgreSQL juste avant l’import (section 18).
Importer un premier fichier de cinq lignes seulement.
Vérifier dans la boîte de dialogue d’import l’aperçu proposé : actifs reconnus, devises, comptes.
Après validation, contrôler les positions concernées.
Importer ensuite le reste, compte par compte, en commençant par le plus simple.
Après chaque compte, comparer les quantités avec le dernier relevé du courtier.
Pas de réimport par-dessus un import Ghostfolio ne sait pas qu’une ligne réimportée après correction remplace une ligne déjà présente. Réimporter un fichier corrigé par-dessus le précédent crée des doublons. Supprimez d’abord les activités du lot fautif, ou restaurez la sauvegarde prise avant l’import.
15. Cryptomonnaies
Utilisez la source COINGECKO et l’identifiant CoinGecko, pas le ticker : plusieurs jetons partagent le même ticker.
Un transfert entre deux portefeuilles qui vous appartiennent ne doit pas créer un nouvel achat : la quantité totale ne change pas, seul le compte change.
Les récompenses de staking peuvent être saisies comme un achat à prix nul ou comme des intérêts, selon la façon dont vous voulez mesurer la performance : choisissez une convention et notez-la.
Les frais réseau payés en crypto diminuent la quantité détenue ; contrôlez la quantité finale par actif.
16. Devises et taux de change
La devise de référence (EUR) sert à l’affichage global ; chaque actif conserve sa devise de cotation. Ghostfolio convertit en utilisant les taux de change historiques. Si une erreur indique qu’aucun taux de change n’a été trouvé pour une date, les cours de la paire concernée n’ont pas encore été collectés.
Ouvrir Admin Control → Données de marché.
Filtrer sur les devises.
Sélectionner la paire concernée, par exemple EURUSD.
Lancer la collecte des données historiques.
Patienter quelques minutes, puis recharger le portefeuille.
Le cas GBp Pour un titre coté à Londres en pence (GBp), collectez aussi la paire de la devise parente GBP. Les montants en pence valent un centième de livre : une erreur de devise sur ces titres multiplie la valeur par cent.
17. Contrôler la qualité des données
La performance affichée n’est pas un bon indicateur de qualité : elle dépend de trop de paramètres. Les contrôles fiables sont ailleurs :
Contrôle
Comment
Ce qu’il révèle
Quantité finale par actif
Comparer avec le relevé du courtier
Activité manquante ou en double
Liquidités par compte
Comparer avec le solde espèces
Dividende ou vente non saisi
Valeur totale d’un compte
Comparer avec la valorisation du courtier
Mauvais actif ou mauvaise devise
Écran X-ray
Lire les alertes
Concentration inattendue, frais anormaux
Données de marché
Rechercher les actifs sans cours
Symbole non reconnu par la source
18. Sauvegarder
La donnée critique est la base PostgreSQL. Redis n’est qu’un cache et se reconstruit seul. Le fichier .env doit accompagner chaque sauvegarde : sans lui, impossible de reconnecter les utilisateurs.
#!/usr/bin/env bash
# /opt/stacks/ghostfolio/backup-ghostfolio.sh
set -Eeuo pipefail
STACK=/opt/stacks/ghostfolio
DEST=/srv/backups/ghostfolio
STAMP=$(date +%Y%m%d-%H%M%S)
RETENTION_DAYS=30
cd "$STACK"
set -a; . ./.env; set +a
mkdir -p "$DEST"
docker compose exec -T postgres \
pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" --format=custom \
> "$DEST/ghostfolio-db-$STAMP.dump"
tar -czf "$DEST/ghostfolio-config-$STAMP.tar.gz" compose.yaml .env
chmod 600 "$DEST"/ghostfolio-*-"$STAMP".*
# Vérification minimale : le dump doit être lisible
docker compose exec -T postgres pg_restore --list < "$DEST/ghostfolio-db-$STAMP.dump" > /dev/null \
&& echo "Sauvegarde valide : ghostfolio-db-$STAMP.dump"
find "$DEST" -type f -mtime +"$RETENTION_DAYS" -delete
Double sécurité En complément, exportez régulièrement vos activités en JSON depuis la page Activités. Ce fichier est indépendant de la version de la base et permet de reconstruire un portefeuille sur n’importe quelle instance Ghostfolio.
Restaurer le .env d’origine avant de démarrer la stack.
Démarrer PostgreSQL et Redis, puis restaurer le dump.
Démarrer Ghostfolio : les migrations éventuelles s’appliquent.
Se connecter avec le jeton de sécurité habituel.
Comparer quelques quantités et la valeur totale avec l’état connu.
Attention Testez la restauration au moins une fois sur une stack temporaire, avec un autre nom de projet Compose et sans publication Traefik. Une sauvegarde jamais restaurée n’est qu’une hypothèse.
20. Mettre à jour
Lire le CHANGELOG.md du dépôt pour repérer les changements importants.
Lancer le script de sauvegarde.
Modifier le tag de l’image si la version est figée.
Exécuter docker compose pull && docker compose up -d.
Les mises à jour appliquent parfois des migrations du schéma PostgreSQL. Revenir à l’ancienne image sans restaurer la base peut alors échouer : c’est pourquoi la sauvegarde précède toujours la mise à jour. Pour PostgreSQL lui-même, un changement de version majeure (15 vers 16, par exemple) nécessite un export et une réimportation, pas un simple changement de tag.
21. Pièges fréquemment rencontrés
Perdre ACCESS_TOKEN_SALT ou le jeton de sécurité administrateur.
Modifier POSTGRES_PASSWORD après l’initialisation de la base.
Confondre plateforme et compte, puis devoir tout réorganiser.
Choisir un actif uniquement par son ticker, sur la mauvaise place de cotation.
Saisir les frais à la fois dans l’achat et dans une activité FEE.
Créer un achat pour un simple transfert de crypto entre ses propres portefeuilles.
Réimporter un fichier corrigé sans supprimer le premier import.
Sauvegarder Redis et oublier PostgreSQL.
Monter PostgreSQL d’une version majeure en changeant simplement le tag.
22. Checklist de validation
Les trois conteneurs sont healthy.
Aucun port n’est publié sur l’hôte ; PostgreSQL et Redis sont sur un réseau interne.
Le jeton administrateur et le fichier .env sont sauvegardés de manière chiffrée.
L’inscription publique est désactivée.
Chaque enveloppe est un compte distinct, rattaché à la bonne plateforme.
Les quantités finales correspondent aux relevés.
Aucun actif n’apparaît sans cours dans les données de marché.
La sauvegarde quotidienne fonctionne et une restauration a été testée.
Ghostfolio apporte une vision consolidée que ni les banques ni les courtiers ne fournissent, parce que chacun ne voit que sa propre partie du patrimoine. Sa valeur dépend toutefois entièrement de la qualité des données : une modélisation claire des plateformes et des comptes, des imports réalisés par petits lots, des quantités vérifiées et une sauvegarde testée transforment un tableau de bord séduisant en véritable outil de décision.
Mettre en place un modèle de tiering Active Directory ne consiste pas seulement à créer trois unités d’organisation. L’objectif est de séparer les identités, les postes d’administration, les droits et les flux afin qu’un incident sur un poste utilisateur ou un serveur applicatif ne permette pas d’atteindre le plan d’identité.
Note d’anonymisation Tous les noms de domaine, serveurs, comptes, groupes, sites et réseaux de cet article sont fictifs. Les exemples utilisent corp.example, SITEA, SITEB et les plages documentaires 192.0.2.0/24 et 198.51.100.0/24.
1. Le problème que le tiering cherche à résoudre
Dans une administration traditionnelle, un même compte privilégié peut être utilisé pour gérer les contrôleurs de domaine, les serveurs membres et parfois même les postes utilisateurs. Cette pratique est confortable, mais elle crée un chemin d’escalade direct : si un poste de travail est compromis, les secrets d’un administrateur qui s’y connecte peuvent être récupérés en mémoire, dans le cache d’authentification ou par interception.
Un incident sur un poste bureautique peut exposer un compte d’administration.
Un compte réutilisé sur plusieurs niveaux transporte la compromission vers les systèmes les plus sensibles.
Un compte membre d’un groupe très privilégié peut permettre de modifier les GPO, les ACL, les contrôleurs de domaine et les mécanismes d’authentification.
La segmentation réseau seule ne suffit pas si les mêmes identifiants circulent sur tous les niveaux.
Le tiering crée donc des frontières de confiance. Les comptes d’un niveau élevé ne doivent jamais s’authentifier sur un niveau inférieur.
2. Définir les niveaux de confiance
Tier 0 : le plan d’identité
Contrôleurs de domaine et services Active Directory.
PKI d’entreprise et autorités de certification capables d’émettre des certificats d’authentification.
Serveurs de fédération, synchronisation d’identités et outils disposant d’un contrôle équivalent sur l’annuaire.
Comptes, groupes, GPO, stations d’administration et équipements capables de modifier le Tier 0.
Systèmes de sauvegarde ou d’administration détenant un accès de restauration ou de contrôle sur les DC.
Tier 1 : serveurs et applications
Serveurs membres Windows et Linux.
Hyperviseurs et clusters de virtualisation qui n’hébergent pas ou ne contrôlent pas le Tier 0.
Applications, bases de données, sauvegarde applicative, stockage et supervision.
Comptes d’administration des serveurs.
Tier 2 : postes et support utilisateur
Postes utilisateurs.
Comptes de support de proximité.
Outils de télédistribution et de gestion du parc.
Terminaux exposés à la messagerie, au Web et aux documents externes.
Règle structurante : un administrateur Tier 0 ne doit pas ouvrir une session sur un serveur Tier 1 ou un poste Tier 2. Un administrateur Tier 1 ne doit pas ouvrir une session sur un poste Tier 2.
3. Séparer les comptes d’administration
Chaque administrateur conserve un compte bureautique sans privilège et reçoit un compte par niveau réellement administré.
Compte fictif
Usage
Connexion autorisée
prenom.nom
Messagerie, Web, bureautique
Poste utilisateur
adm-t1-prenom
Serveurs membres et applications
PAW Tier 1 et serveurs autorisés
adm-t0-prenom
Active Directory et dépendances Tier 0
Uniquement PAW Tier 0
Le compte Tier 0 ne doit pas disposer d’une boîte aux lettres utilisée au quotidien. Il ne doit pas naviguer sur Internet et ne doit pas être ajouté à des groupes Tier 1 ou Tier 2 par commodité.
GG-T0-PAW-Users : droit d’ouverture de session sur les PAW Tier 0.
GG-T0-PAW-Local-Admins : administration locale des PAW, à limiter strictement.
GG-T0-AD-Admins : délégations d’administration de l’annuaire.
GG-T1-Server-Admins : administration des serveurs membres.
GG-Deny-Logon-T0-On-Lower-Tiers : groupe exploité par les stratégies de refus de connexion.
5. Déployer des PAW Tier 0
Un PAW est une station d’administration privilégiée dédiée. Dans un environnement multisite, un déploiement réaliste consiste à prévoir au moins un PAW Tier 0 par site critique, par exemple SITEA-PAW-T0-01 et SITEB-PAW-T0-01.
Machine physique ou VM fortement isolée selon le modèle de menace.
Pas de client de messagerie, de suite bureautique générale ou d’outils personnels.
Navigation Internet bloquée ou limitée à une liste d’administration explicite.
Secure Boot, TPM, BitLocker, antivirus/EDR, VBS, Credential Guard et HVCI.
Administration uniquement avec les comptes du niveau correspondant.
Accès entrant limité aux réseaux d’administration connus.
6. Installer seulement les outils Tier 0 nécessaires
Le PAW doit permettre l’administration distante sans imposer une session RDP permanente sur les contrôleurs de domaine. Installez uniquement les composants utiles : Active Directory Users and Computers, Active Directory Administrative Center, Group Policy Management, DNS Manager, Sites and Services, outils PKI et modules PowerShell.
Sur le profil Domaine, une cible cohérente est : pare-feu activé, trafic entrant bloqué par défaut, trafic sortant autorisé et fusion des règles locales désactivée. Les règles d’accès doivent venir de la GPO.
Pour RDP, conservez seulement des règles GPO ciblant les réseaux d’administration. Désactivez les règles locales générales telles que Remote Desktop – User Mode (TCP-In) si elles autorisent Any.
9. Activer Credential Guard et HVCI
Dans la stratégie Turn On Virtualization Based Security, activez Secure Boot, la protection de l’intégrité du code et Credential Guard. Le mode Enabled without lock permet un retour arrière par GPO, ce qui est adapté à une phase pilote.
Attention à l’interprétation : la valeur 1 représente Credential Guard et la valeur 2 HVCI/Memory Integrity. La seule présence de 2 ne prouve pas que Credential Guard fonctionne.
10. Ajouter les groupes locaux sans écraser l’existant
Avec les préférences de stratégie de groupe, utilisez l’action Update sur le groupe local Administrateurs et ajoutez le groupe Tier 0. Ne cochez pas les options supprimant tous les utilisateurs ou groupes existants sans avoir établi une liste complète des membres attendus.
Testez au minimum DNS, Kerberos, RPC, LDAP, SMB, LDAPS et Global Catalog. Si un site distant ne répond que sur DNS 53, ne concluez pas immédiatement à une panne AD : cela peut révéler une matrice de flux incomplète.
12. Définir les refus de connexion
Refuser aux comptes Tier 0 l’ouverture de session locale et RDP sur Tier 1 et Tier 2.
Refuser aux comptes Tier 1 l’ouverture de session sur Tier 2.
Autoriser les comptes Tier 0 uniquement sur les PAW et actifs Tier 0 prévus.
Tester les stratégies de refus sur un petit périmètre avant généralisation.
Prévoir un compte de secours gouverné et surveillé pour éviter un verrouillage opérationnel total.
13. Plan de déploiement réaliste
Inventorier les actifs, groupes, comptes de service et outils ayant un contrôle Tier 0.
Créer les comptes d’administration séparés.
Créer les OU et groupes, sans déplacer immédiatement tous les actifs.
Déployer un PAW pilote sur un site.
Installer les outils RSAT et valider les flux.
Durcir le pare-feu, Credential Guard, HVCI et les règles de connexion.
Tester l’administration quotidienne sans RDP permanent vers les DC.
Déployer le second PAW et vérifier le fonctionnement intersite.
Appliquer les refus de connexion aux niveaux inférieurs.
Auditer les journaux de connexion et corriger les usages résiduels.
Étendre ensuite le modèle aux comptes et PAW Tier 1.
14. Pièges fréquemment rencontrés
Considérer que tous les systèmes de sécurité ou de supervision sont automatiquement Tier 0.
Autoriser RDP vers tous les DC sans besoin identifié.
Utiliser le compte Tier 0 pour administrer un hyperviseur ou un serveur applicatif Tier 1.
Créer des comptes séparés sans mettre en place les refus de connexion correspondants.
Désactiver le pare-feu Windows sur les PAW ou sur une large OU de serveurs.
Confondre HVCI actif avec Credential Guard actif.
Déployer les GPO sur tout le domaine avant d’avoir validé un groupe pilote.
Oublier les comptes de service, outils de sauvegarde et solutions de management qui peuvent contrôler les DC.
15. Checklist de validation
Les comptes T0, T1 et bureautiques sont distincts.
Le compte T0 ne possède aucun usage bureautique.
Les PAW sont dans une OU dédiée avec une GPO dédiée.
Le pare-feu Domaine bloque l’entrant par défaut.
Les règles RDP générales ne sont plus effectives.
La fusion des règles locales est désactivée sur le profil Domaine.
Credential Guard et HVCI sont tous deux configurés et actifs.
Les outils RSAT fonctionnent depuis le PAW.
Les DC distants sont joignables sur les ports nécessaires.
RDP vers les DC est une exception documentée.
Les refus de connexion empêchent les comptes élevés d’accéder aux niveaux inférieurs.
Une procédure de secours et de retour arrière existe.
Conclusion
Un tiering réussi ne se mesure pas au nombre d’OU créées, mais à l’absence de chemins d’authentification dangereux entre les niveaux. Commencez petit, validez un PAW, observez les dépendances réelles et durcissez progressivement. La séparation des comptes, le contrôle des flux, les refus de connexion et la validation de Credential Guard forment un ensemble : retirer l’un de ces éléments affaiblit fortement le modèle.