Guides pratiques, scripts complets et retours d’expérience
À proposTous les guides

Blog

  • Mealie : installation, recettes, menus et sauvegarde

    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.

    4. Docker Compose complet

    services:
      mealie:
        image: ghcr.io/mealie-recipes/mealie:v3.30.0
        environment:
          ALLOW_SIGNUP: "false"
          TZ: Europe/Paris
          BASE_URL: https://recettes.exemple.net
        volumes: ["./data:/app/data"]
        networks: [proxy-public]
    networks:
      proxy-public: {external: true}

    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.

    5. Déployer et contrôler

    docker compose config --quiet
    docker compose pull
    docker compose up -d
    docker compose ps
    docker compose logs --tail 100

    6. Choisir SQLite ou PostgreSQL

    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.

    Pièges fréquemment rencontrés

    • Utiliser une ancienne image obsolète.
    • Activer les inscriptions publiques.
    • Copier SQLite à chaud.
    • Restaurer sans sauvegarde préalable.

    Checklist finale

    • Inscriptions désactivées.
    • Import et images fonctionnent.
    • Backup téléchargé et restauré.
    • Captures fictives.

    Sources officielles

    Conclusion

    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.

  • Ghostfolio : fonctionnalités, installation Docker, imports et sauvegarde

    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 :

    ModePrincipePour qui
    Ghostfol.io (cloud)Compte hébergé par l’éditeur, gratuit ou PremiumTester rapidement, ne rien administrer
    Auto-hébergéImage Docker officielle sur votre serveurGarder 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.

    BesoinGhostfolioCommentaire
    Consolider plusieurs courtiers et enveloppesOuiCœur du produit
    Performance réelle depuis l’origine, par année, sur 1 anOuiCalculée à partir des transactions
    Allocation par classe d’actifs, pays, secteur, deviseOuiPour les ETF, décomposition selon les données disponibles
    Suivi des dividendesOuiHistorique et projection
    Liquidités et soldes de comptesOuiSaisie manuelle ou import
    Budget mensuel, dépenses courantesNonRôle d’un outil comme Actual Budget
    Synchronisation automatique avec la banqueNonSaisie ou import des transactions
    Calcul fiscal français (PFU, abattements PEA)NonGhostfolio n’est pas un logiciel fiscal
    Immobilier, véhicules, objetsPartiellementSaisie 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 :

    • Classe d’actifs : actions, obligations, liquidités, matières premières, cryptomonnaies, immobilier ;
    • 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)
    ComposantRôleÀ sauvegarder
    GhostfolioInterface Web, API, calculs, collecte des coursNon, l’image suffit
    PostgreSQLToutes les données métierOui, impérativement
    RedisCache et file des tâches de collecteNon
    Fichier .envMots de passe et clés de signatureOui, 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
    VariableRôle
    POSTGRES_*Création de la base au premier démarrage
    DATABASE_URLChaîne de connexion utilisée par Ghostfolio
    REDIS_*Connexion au cache, protégée par mot de passe
    ACCESS_TOKEN_SALTSel utilisé pour les jetons d’accès des utilisateurs
    JWT_SECRET_KEYClé 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.

    cat > compose.yaml <<'EOF'
    name: ghostfolio
    
    services:
      ghostfolio:
        image: docker.io/ghostfolio/ghostfolio:latest
        container_name: ghostfolio
        restart: unless-stopped
        init: true
        stop_grace_period: 1m
        cap_drop:
          - ALL
        security_opt:
          - no-new-privileges:true
        env_file:
          - .env
        depends_on:
          postgres:
            condition: service_healthy
          redis:
            condition: service_healthy
        networks:
          - proxy-public
          - ghostfolio-internal
        healthcheck:
          test: ["CMD-SHELL", "curl -f http://localhost:3333/api/v1/health"]
          interval: 10s
          timeout: 5s
          retries: 5
    
      postgres:
        image: docker.io/library/postgres:15-alpine
        container_name: gf-postgres
        restart: unless-stopped
        cap_drop:
          - ALL
        cap_add:
          - CHOWN
          - DAC_READ_SEARCH
          - FOWNER
          - SETGID
          - SETUID
        security_opt:
          - no-new-privileges:true
        env_file:
          - .env
        volumes:
          - ./data/postgres:/var/lib/postgresql/data
        networks:
          - ghostfolio-internal
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -d \"$${POSTGRES_DB}\" -U $${POSTGRES_USER}"]
          interval: 10s
          timeout: 5s
          retries: 5
    
      redis:
        image: docker.io/library/redis:8-alpine
        container_name: gf-redis
        restart: unless-stopped
        user: "999:1000"
        cap_drop:
          - ALL
        security_opt:
          - no-new-privileges:true
        env_file:
          - .env
        command:
          - /bin/sh
          - -c
          - redis-server --requirepass "$${REDIS_PASSWORD:?REDIS_PASSWORD variable is not set}"
        networks:
          - ghostfolio-internal
        healthcheck:
          test: ["CMD-SHELL", "redis-cli --pass \"$${REDIS_PASSWORD}\" ping | grep PONG"]
          interval: 10s
          timeout: 5s
          retries: 5
    
    networks:
      proxy-public:
        external: true
      ghostfolio-internal:
        internal: true
    EOF

    Lecture des choix

    • 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.

    8. Premier démarrage

    mkdir -p data/postgres
    docker compose config --quiet && echo "Compose valide"
    docker compose pull
    docker compose up -d
    docker compose ps
    docker compose logs -f ghostfolio

    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ômeCause probableCorrection
    REDIS_PASSWORD variable is not setVariable absente du .envVérifier le fichier et sa lecture par Compose
    Can't reach database serverDATABASE_URL incorrecte ou base pas prêteVérifier le nom du service postgres et les identifiants
    password authentication failedMot de passe modifié après initialisation de la baseLes variables POSTGRES_* ne s’appliquent qu’à la création ; restaurer l’ancien mot de passe
    Conteneur unhealthy en boucleMigration bloquéeLire docker compose logs ghostfolio

    9. Publier derrière Traefik

    # Configuration dynamique Traefik
    http:
      routers:
        ghostfolio:
          rule: "Host(`finance.exemple.net`)"
          entryPoints:
            - websecure
          service: ghostfolio
          tls: {}
      services:
        ghostfolio:
          loadBalancer:
            servers:
              - url: "http://ghostfolio:3333"

    Contrôle depuis Traefik, avant même d’ouvrir un navigateur :

    docker exec traefik wget -qO- http://ghostfolio:3333/api/v1/health
    # Réponse attendue : {"status":"OK"}

    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.

    1. Ouvrir https://finance.exemple.net et choisir Démarrer.
    2. Copier immédiatement le jeton de sécurité affiché et l’enregistrer dans un gestionnaire de mots de passe.
    3. Accepter les conditions et accéder au tableau de bord vide.
    4. Ouvrir Mon Ghostfolio → Paramètres et choisir la langue française, la devise de référence EUR et le format de date.
    5. 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 fictiveCompteDeviseRemarque
    Banque AlphaPEAEUREnveloppe fiscale distincte du CTO
    Banque AlphaPEA-PMEEURCompte séparé, même plateforme
    Courtier BêtaCTOEURPeut contenir des titres en USD
    Épargne EntreprisePEEEURFonds souvent non cotés
    Épargne EntreprisePERCO / PER collectifEURAvoirs bloqués jusqu’à la retraite
    Crypto GammaPortefeuille spotEURCryptomonnaies
    Banque AlphaLivretEURLiquidité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

    TypeUsageEffet sur le portefeuille
    BUYAchat d’un titreAugmente la quantité détenue
    SELLVenteDiminue la quantité, réalise une plus ou moins-value
    DIVIDENDDividende perçuAjoute un revenu, sans changer la quantité
    INTERESTIntérêts (livret, obligations)Ajoute un revenu
    FEEFrais isolés (droits de garde)Diminue la performance
    LIABILITYDette (crédit)Diminue la valeur nette
    ITEMBien 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 :

    SourceUsage typique
    YAHOOActions et ETF cotés ; symboles du type CW8.PA, AAPL
    COINGECKOCryptomonnaies, identifiées par l’identifiant CoinGecko (bitcoin, ethereum)
    MANUALActifs sans cotation publique : fonds d’épargne salariale, parts non cotées
    GHOSTFOLIOSource 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
    ColonneContenuPiège à éviter
    DateFormat ISO AAAA-MM-JJFormat français JJ/MM/AAAA mal interprété
    CodeSymbole de la sourceSymbole Yahoo sans suffixe de place
    DataSourceYAHOO, COINGECKO, MANUALMélanger les sources pour un même actif
    CurrencyDevise de cotation de l’actifIndiquer EUR pour un titre coté en USD
    PricePrix unitaire hors fraisMettre le montant total
    QuantityNombre de titresQuantité négative pour une vente
    Actionbuy, sell, dividend, fee, interestLibellés français du courtier
    FeeFrais de l’opérationFrais 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

    1. Faire une sauvegarde PostgreSQL juste avant l’import (section 18).
    2. Importer un premier fichier de cinq lignes seulement.
    3. Vérifier dans la boîte de dialogue d’import l’aperçu proposé : actifs reconnus, devises, comptes.
    4. Après validation, contrôler les positions concernées.
    5. Importer ensuite le reste, compte par compte, en commençant par le plus simple.
    6. 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.

    1. Ouvrir Admin Control → Données de marché.
    2. Filtrer sur les devises.
    3. Sélectionner la paire concernée, par exemple EURUSD.
    4. Lancer la collecte des données historiques.
    5. 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ôleCommentCe qu’il révèle
    Quantité finale par actifComparer avec le relevé du courtierActivité manquante ou en double
    Liquidités par compteComparer avec le solde espècesDividende ou vente non saisi
    Valeur totale d’un compteComparer avec la valorisation du courtierMauvais actif ou mauvaise devise
    Écran X-rayLire les alertesConcentration inattendue, frais anormaux
    Données de marchéRechercher les actifs sans coursSymbole 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
    chmod 750 /opt/stacks/ghostfolio/backup-ghostfolio.sh
    echo '30 2 * * * root /opt/stacks/ghostfolio/backup-ghostfolio.sh >> /var/log/backup-ghostfolio.log 2>&1' \
      > /etc/cron.d/backup-ghostfolio

    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.

    19. Restaurer

    cd /opt/stacks/ghostfolio
    docker compose stop ghostfolio
    
    # Base vide, puis restauration
    docker compose exec -T postgres dropdb   -U ghostfolio ghostfolio-db
    docker compose exec -T postgres createdb -U ghostfolio ghostfolio-db
    docker compose exec -T postgres pg_restore -U ghostfolio -d ghostfolio-db --no-owner \
      < /srv/backups/ghostfolio/ghostfolio-db-AAAAMMJJ-HHMMSS.dump
    
    docker compose start ghostfolio
    docker compose logs --tail 50 ghostfolio
    1. Restaurer le .env d’origine avant de démarrer la stack.
    2. Démarrer PostgreSQL et Redis, puis restaurer le dump.
    3. Démarrer Ghostfolio : les migrations éventuelles s’appliquent.
    4. Se connecter avec le jeton de sécurité habituel.
    5. 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

    1. Lire le CHANGELOG.md du dépôt pour repérer les changements importants.
    2. Lancer le script de sauvegarde.
    3. Modifier le tag de l’image si la version est figée.
    4. Exécuter docker compose pull && docker compose up -d.
    5. Surveiller docker compose logs -f ghostfolio jusqu’à l’état healthy.
    6. Vérifier la valeur totale et une fiche d’actif.

    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.

    Sources officielles

    Conclusion

    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 tiering Active Directory avec des PAW Tier 0

    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 fictifUsageConnexion autorisée
    prenom.nomMessagerie, Web, bureautiquePoste utilisateur
    adm-t1-prenomServeurs membres et applicationsPAW Tier 1 et serveurs autorisés
    adm-t0-prenomActive Directory et dépendances Tier 0Uniquement 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é.

    4. Construire les OU et les groupes

    OU=Tiering
    ├── OU=Tier0
    │   ├── OU=Accounts
    │   ├── OU=Groups
    │   ├── OU=PAW
    │   └── OU=Service-Accounts
    ├── OU=Tier1
    │   ├── OU=Accounts
    │   ├── OU=Groups
    │   └── OU=PAW
    └── OU=Tier2
        ├── OU=Accounts
        └── OU=Groups

    Exemples de groupes anonymisés :

    • 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.

    Import-Module ServerManager
    
    $Features = @(
        'RSAT-AD-Tools',
        'RSAT-ADDS-Tools',
        'RSAT-DNS-Server',
        'GPMC',
        'RSAT-ADCS-Mgmt'
    )
    
    foreach ($Feature in $Features) {
        Install-WindowsFeature -Name $Feature -IncludeManagementTools
    }

    7. Concevoir les flux réseau

    Tier 0 ne signifie pas « tout ouvrir entre les actifs Tier 0 ». Appliquez le moindre privilège et partez des méthodes d’administration utilisées.

    PortServiceUsage
    53 TCP/UDPDNSRésolution de noms
    88 TCP/UDPKerberosAuthentification
    135 TCPRPC Endpoint MapperConsoles MMC et administration distante
    389 / 636 TCPLDAP / LDAPSAccès à l’annuaire
    445 TCPSMBSYSVOL, NETLOGON et fonctions administratives
    3268 / 3269 TCPGlobal CatalogRecherche dans la forêt
    5985 / 5986 TCPWinRMPowerShell distant
    49152-65535 TCPRPC dynamiqueSelon les consoles et services utilisés
    3389 TCP/UDPRDPException de dépannage, pas un flux permanent par défaut

    Le catalogue global n’est pas un serveur séparé : il s’agit d’un rôle porté par certains DC. Vérifiez les DC concernés avant d’autoriser 3268/3269.

    Get-ADDomainController -Filter * |
        Select-Object HostName,Site,IPv4Address,IsGlobalCatalog

    8. Durcir le pare-feu du PAW

    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.

    Get-NetFirewallProfile -PolicyStore ActiveStore -Name Domain |
        Select-Object Name,Enabled,DefaultInboundAction,
            DefaultOutboundAction,AllowInboundRules,
            AllowLocalFirewallRules

    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.

    $PolicyPath = 'HKLM:SOFTWAREPoliciesMicrosoftWindowsDeviceGuard'
    $Policy = Get-ItemProperty -Path $PolicyPath
    $DeviceGuard = Get-CimInstance `
        -Namespace 'rootMicrosoftWindowsDeviceGuard' `
        -ClassName 'Win32_DeviceGuard'
    
    $Configured = @($DeviceGuard.SecurityServicesConfigured)
    $Running = @($DeviceGuard.SecurityServicesRunning)
    
    [pscustomobject]@{
        EnableVBS                  = $Policy.EnableVirtualizationBasedSecurity
        LsaCfgFlags                = $Policy.LsaCfgFlags
        VBSRunning                 = $DeviceGuard.VirtualizationBasedSecurityStatus -eq 2
        CredentialGuardConfigured = $Configured -contains 1
        CredentialGuardRunning    = $Running -contains 1
        HVCIConfigured            = $Configured -contains 2
        HVCIRunning               = $Running -contains 2
    }

    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.

    $Administrators = Get-LocalGroup -SID 'S-1-5-32-544'
    Get-LocalGroupMember -Group $Administrators.Name |
        Select-Object Name,ObjectClass,PrincipalSource

    11. Vérifier Active Directory depuis le PAW

    Un PAW n’est pas un contrôleur de domaine. Pour dcdiag, utilisez l’option /s: afin de cibler chaque DC. Complétez avec repadmin et des tests de ports.

    $DCs = Get-ADDomainController -Filter * | Sort-Object Site,HostName
    
    foreach ($DC in $DCs) {
        dcdiag.exe /s:$($DC.HostName) /q
    }
    
    repadmin.exe /replsummary
    repadmin.exe /showrepl *

    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

    1. Inventorier les actifs, groupes, comptes de service et outils ayant un contrôle Tier 0.
    2. Créer les comptes d’administration séparés.
    3. Créer les OU et groupes, sans déplacer immédiatement tous les actifs.
    4. Déployer un PAW pilote sur un site.
    5. Installer les outils RSAT et valider les flux.
    6. Durcir le pare-feu, Credential Guard, HVCI et les règles de connexion.
    7. Tester l’administration quotidienne sans RDP permanent vers les DC.
    8. Déployer le second PAW et vérifier le fonctionnement intersite.
    9. Appliquer les refus de connexion aux niveaux inférieurs.
    10. Auditer les journaux de connexion et corriger les usages résiduels.
    11. É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.