[{"data":1,"prerenderedAt":205},["ShallowReactive",2],{"seo-verification":3,"blog-self-host-harbor-registry-vps-fr":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-self-host-harbor-registry-vps-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":29,"intro":32,"sections":33,"ctaTitle":150,"ctaBody":151,"ctaButton":152,"ctaUrl":153,"relatedPosts":154},439,"self-host-harbor-registry-vps",{"fr":10,"en":12,"ar":13,"es":14},"self-host-harbor-registry-on-a-vps-complete-guide","استضافة-harbor-على-vps-سجل-حاويات-docker-خاص","harbor-registry-self-hosted-en-vps-guia-completa","Harbor Registry self-hosted sur VPS : guide complet","Déployez Harbor v2.15 sur votre VPS : registre Docker privé avec scan Trivy, signature Cosign, RBAC et conformité NIS2\u002FGDPR. Guide pas-à-pas.",8,0,false,"2026-10-13T00:00:00+00:00","2026-10-13T14:10:28+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},3,"Déploiement","deploiement","bg-success\u002F10 text-success",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-harbor-registry-vps-poster.svg","Depuis la CVE-2026-21589 qui a secoué la supply chain Atlassian, les équipes DevOps cherchent à reprendre le contrôle de chaque artefact qui circule dans leur pipeline. Docker Hub impose un rate-limit à 100 pulls\u002F6 h sur les comptes gratuits, GHCR lie vos images à la politique de rétention de GitHub, et aucun des deux ne signe ni ne scanne vos images par défaut. Harbor, le registre open source de la CNCF, règle ces trois problèmes d'un seul déploiement : scan de vulnérabilités Trivy intégré, signature Cosign, RBAC granulaire et audit logs complets. Ce guide vous accompagne de l'installation Docker Compose jusqu'à la politique d'admission en production, sur un VPS de 4 vCPU \u002F 8 Go RAM.",[34,38,49,52,77,80,83,87,90],{"type":35,"title":36,"body":37},"h2","Pourquoi un registre Docker privé avec Harbor","Docker Hub et GHCR sont des services publics pratiques, mais ils posent trois problèmes concrets dès que votre organisation grandit ou doit répondre à une exigence NIS2 (art. 21 § 2 f – sécurité de la chaîne d'approvisionnement) ou GDPR (données d'infrastructure hébergées hors UE). Harbor répond point par point.",{"type":39,"title":40,"items":41},"ul","Bénéfices clés de Harbor",[42,43,44,45,46,47,48],"**Scan Trivy intégré** — chaque push déclenche une analyse CVE ; les politiques d'admission bloquent le déploiement d'une image dont la criticité dépasse le seuil configuré.","**Signature Cosign \u002F Notary** — la chaîne de confiance va du build CI jusqu'au cluster Kubernetes ; seules les images signées par votre clé passent.","**RBAC multi-projet** — isolation par équipe, par environnement (dev\u002Fstaging\u002Fprod) ou par client, avec des rôles Guest, Developer, Maintainer et ProjectAdmin.","**Réplication inter-registres** — synchronisez vers un second VPS, vers AWS ECR ou vers Docker Hub pour la distribution CDN.","**Audit logs immuables** — chaque pull, push, suppression et connexion est tracé avec l'IP source ; conformité NIS2 article 21 § 2 d.","**Pas de rate limit** — vos runners CI tirent autant d'images que nécessaire sans délai ni quota.","**OIDC natif** — connectez Harbor à ZITADEL ou tout fournisseur OpenID Connect ; zéro compte local à gérer.",{"type":35,"title":50,"body":51},"Prérequis chiffrés","Harbor tourne confortablement sur un VPS à partir de la configuration suivante :\n\n- **CPU** : 4 vCPU (minimum 2 vCPU, mais Trivy consomme 1–2 cœurs au scan)\n- **RAM** : 8 Go (4 Go minimum ; prévoir 2 Go pour la base PostgreSQL, 1 Go pour Redis, 2 Go pour le core Harbor, 1 Go de marge)\n- **Disque** : 100 Go SSD (les layers Docker s'accumulent vite ; prévoir 40 Go pour le registre, 20 Go pour les logs Trivy, 20 Go pour le système)\n- **OS** : Debian 12 ou Ubuntu 22.04 LTS\n- **Docker** : ≥ 24.0, **Docker Compose** : ≥ 2.20\n- **DNS** : un sous-domaine pointant vers votre VPS (`registry.exemple.com`), déjà résolu\n- **TLS** : certificat valide — Let's Encrypt via Certbot ou Traefik ACME",{"type":53,"title":54,"steps":55},"steps","Installation Harbor v2.15 avec Docker Compose",[56,59,62,65,68,71,74],{"title":57,"body":58},"Télécharger le programme d'installation offline","Connectez-vous en SSH sur votre VPS. Récupérez le package offline Harbor v2.15.4 (le plus stable au 2026-10-13) depuis GitHub :\n\n```bash\nexport HARBOR_VERSION=v2.15.4\nwget https:\u002F\u002Fgithub.com\u002Fgoharbor\u002Fharbor\u002Freleases\u002Fdownload\u002F${HARBOR_VERSION}\u002Fharbor-offline-installer-${HARBOR_VERSION}.tgz\nwget https:\u002F\u002Fgithub.com\u002Fgoharbor\u002Fharbor\u002Freleases\u002Fdownload\u002F${HARBOR_VERSION}\u002Fharbor-offline-installer-${HARBOR_VERSION}.tgz.asc\n# Vérifier la signature GPG\ngpg --keyserver keyserver.ubuntu.com --recv-keys 7722D168DAEC457894C2988818B80B4B2D318C8A\ngpg --verify harbor-offline-installer-${HARBOR_VERSION}.tgz.asc\ntar xvf harbor-offline-installer-${HARBOR_VERSION}.tgz\ncd harbor\n```",{"title":60,"body":61},"Préparer les certificats TLS","Harbor exige TLS. Si vous utilisez Certbot :\n\n```bash\napt install -y certbot\ncertbot certonly --standalone -d registry.exemple.com\n# Les certificats sont dans \u002Fetc\u002Fletsencrypt\u002Flive\u002Fregistry.exemple.com\u002F\nmkdir -p \u002Fdata\u002Fcert\ncp \u002Fetc\u002Fletsencrypt\u002Flive\u002Fregistry.exemple.com\u002Ffullchain.pem \u002Fdata\u002Fcert\u002Fregistry.exemple.com.crt\ncp \u002Fetc\u002Fletsencrypt\u002Flive\u002Fregistry.exemple.com\u002Fprivkey.pem  \u002Fdata\u002Fcert\u002Fregistry.exemple.com.key\n```\n\nSi vous utilisez Traefik comme reverse proxy (voir l'article sur Traefik v3), déléguez la terminaison TLS à Traefik et configurez Harbor en HTTP interne sur le port 8080.",{"title":63,"body":64},"Configurer harbor.yml","Copiez le template et adaptez les valeurs essentielles :\n\n```bash\ncp harbor.yml.tmpl harbor.yml\n```\n\nÉditez `harbor.yml` :\n\n```yaml\nhostname: registry.exemple.com\n\nhttps:\n  port: 443\n  certificate: \u002Fdata\u002Fcert\u002Fregistry.exemple.com.crt\n  private_key: \u002Fdata\u002Fcert\u002Fregistry.exemple.com.key\n\nharbor_admin_password: ChangezCeMotDePasse!\n\ndatabase:\n  password: ChangezAussiCeci!\n\ndata_volume: \u002Fdata\n\ntrivy:\n  ignore_unfixed: false\n  skip_update: false\n  offline_scan: false\n  security_check: vuln\n  insecure: false\n```",{"title":66,"body":67},"Lancer l'installateur","Harbor propose plusieurs composants optionnels. Activez Trivy (scanner) et Notary (signatures) :\n\n```bash\n.\u002Finstall.sh --with-trivy --with-notary\n```\n\nL'installateur génère un `docker-compose.yml` et démarre tous les conteneurs. Vérifiez qu'ils sont tous `healthy` :\n\n```bash\ndocker compose ps\n# STATUS attendu pour chaque service : healthy\n```",{"title":69,"body":70},"Première connexion et changement du mot de passe","Ouvrez `https:\u002F\u002Fregistry.exemple.com` dans votre navigateur. Connectez-vous avec `admin` \u002F le mot de passe de `harbor.yml`. Rendez-vous dans **Administration → Users → admin** et changez immédiatement le mot de passe.\n\nDepuis votre poste de travail ou votre runner CI :\n\n```bash\ndocker login registry.exemple.com\n# Entrez votre identifiant admin ou un compte de service\n```",{"title":72,"body":73},"Créer un projet et pousser une première image","Dans l'interface Harbor, créez un projet `mon-projet` (privé). Puis depuis votre machine de build :\n\n```bash\ndocker pull nginx:alpine\ndocker tag nginx:alpine registry.exemple.com\u002Fmon-projet\u002Fnginx:1.27-alpine\ndocker push registry.exemple.com\u002Fmon-projet\u002Fnginx:1.27-alpine\n# Dans Harbor → mon-projet → Repositories : l'image apparaît avec son statut Trivy\n```",{"title":75,"body":76},"Activer le renouvellement TLS automatique","Créez un hook post-renouvellement Certbot pour recharger Harbor :\n\n```bash\ncat > \u002Fetc\u002Fletsencrypt\u002Frenewal-hooks\u002Fpost\u002Fharbor-reload.sh \u003C\u003C 'EOF'\n#!\u002Fbin\u002Fbash\ncp \u002Fetc\u002Fletsencrypt\u002Flive\u002Fregistry.exemple.com\u002Ffullchain.pem \u002Fdata\u002Fcert\u002Fregistry.exemple.com.crt\ncp \u002Fetc\u002Fletsencrypt\u002Flive\u002Fregistry.exemple.com\u002Fprivkey.pem  \u002Fdata\u002Fcert\u002Fregistry.exemple.com.key\ncd \u002Fopt\u002Fharbor && docker compose restart proxy\nEOF\nchmod +x \u002Fetc\u002Fletsencrypt\u002Frenewal-hooks\u002Fpost\u002Fharbor-reload.sh\n```",{"type":35,"title":78,"body":79},"Configuration : projets, utilisateurs et OIDC (ZITADEL)","**Projets et RBAC**\n\nHarbor organise les images par projets. Chaque projet peut être public ou privé, avec une politique de rétention indépendante. Créez un projet par équipe ou par environnement : `frontend`, `backend`, `infra`. Assignez des membres avec des rôles granulaires :\n\n- **Guest** : pull uniquement\n- **Developer** : push + pull\n- **Maintainer** : gestion des tags, des webhooks et des politiques de rétention\n- **ProjectAdmin** : gestion des membres\n\n**Intégration OIDC avec ZITADEL**\n\nSi vous avez déjà déployé ZITADEL (voir l'article dédié), connectez Harbor en quelques clics. Dans ZITADEL, créez une application `harbor` de type *Web*, notez le `Client ID` et le `Client Secret`. Dans Harbor → **Administration → Configuration → Authentication** :\n\n- Auth Mode : `OIDC`\n- OIDC Provider Name : `ZITADEL`\n- OIDC Endpoint : `https:\u002F\u002Fsso.exemple.com`\n- OIDC Client ID \u002F Secret : ceux de ZITADEL\n- OIDC Scope : `openid profile email groups`\n- Cochez **Verify Certificate**\n\nAu premier login OIDC, Harbor crée automatiquement le compte utilisateur. Désactivez ensuite la création de comptes locaux (**Administration → Configuration → Allow Self-Registration → Off**).",{"type":35,"title":81,"body":82},"Scanner les images avec Trivy","Harbor embarque Trivy directement dans le pipeline push. Dès qu'une image est poussée, Harbor déclenche un scan asynchrone qui interroge la base CVE de Trivy (mise à jour quotidienne). Le résultat apparaît dans l'interface : nombre de vulnérabilités par criticité (CRITICAL, HIGH, MEDIUM, LOW, UNKNOWN).\n\n**Activer le scan automatique au push** : dans Harbor → **Administration → Configuration → Vulnerability** → cochez *Automatically scan images on push*.\n\n**Consulter un rapport** : ouvrez un dépôt, cliquez sur un tag → onglet *Vulnerabilities*. Chaque CVE liste le package affecté, la version fixée et un lien vers la NVD.\n\n**Version de Trivy dans Harbor v2.15** : Harbor v2.15.4 embarque `trivy-adapter` aligné sur Trivy v0.55.x, avec support des bases OS (Alpine, Debian, RHEL, Ubuntu), des gestionnaires de paquets applicatifs (npm, pip, cargo, go.mod) et des fichiers de lock.\n\n**Politiques de conformité par projet** : dans Harbor → *Votre projet* → **Policy** → *Deployment Security* → choisissez le niveau de criticité qui bloque le pull. Par exemple, bloquer tout pull d'une image ayant au moins une CVE CRITICAL non corrigée.",{"type":84,"title":85,"body":86},"tip","Conseil sécurité : politiques d'admission Kubernetes","Combinez Harbor avec le contrôleur d'admission **Cosign** (via Kyverno ou Connaisseur) pour qu'aucune image non signée ou ayant une CVE CRITICAL ne puisse entrer dans votre cluster. Dans votre pipeline CI :\n\n```bash\n# Signer l'image avec Cosign après le build\ncosign sign --key cosign.key registry.exemple.com\u002Fmon-projet\u002Fnginx:1.27-alpine\n# Vérifier en CI avant le déploiement\ncosign verify --key cosign.pub registry.exemple.com\u002Fmon-projet\u002Fnginx:1.27-alpine\n```\n\nConfigurer une politique Kyverno qui exige la signature Harbor : chaque pod dont l'image n'est pas signée par votre clé est rejeté à l'admission. Cela ferme la brèche la plus exploitée dans les supply chain attacks post-CVE-2026-21589.",{"type":35,"title":88,"body":89},"Dépannage : 5 erreurs réelles avec leurs causes","**1. `Error response from daemon: Get https:\u002F\u002Fregistry.exemple.com\u002Fv2\u002F: x509: certificate signed by unknown authority`**\nCause : le certificat Let's Encrypt n'est pas encore propagé ou vous utilisez un certificat auto-signé.\nCorrection : sur chaque nœud Docker client, copiez `fullchain.pem` dans `\u002Fetc\u002Fdocker\u002Fcerts.d\u002Fregistry.exemple.com\u002Fca.crt` puis `systemctl restart docker`.\n\n**2. `harbor-core` redémarre en boucle avec `Error 1045 (28000): Access denied for user 'root'@'localhost'`**\nCause : le volume PostgreSQL contient des données d'une installation précédente avec un autre mot de passe.\nCorrection : `docker compose down -v` (⚠️ supprime les données), modifiez le mot de passe dans `harbor.yml`, relancez `.\u002Fprepare && docker compose up -d`.\n\n**3. Scan Trivy bloqué sur `Fetching vulnerability DB` depuis 10 minutes**\nCause : le VPS n'a pas accès à `ghcr.io` (pare-feu sortant restrictif) pour télécharger la base Trivy.\nCorrection : autorisez les sorties HTTPS vers `ghcr.io` et `pkg.dev`, ou activez le mode `offline_scan: true` après avoir pré-chargé la base avec `trivy image --download-db-only`.\n\n**4. `unauthorized: unauthorized to access repository` en CI malgré un `docker login` réussi**\nCause : le compte de service n'a pas le rôle Developer sur le projet ciblé.\nCorrection : dans Harbor → *Votre projet* → **Members** → ajoutez le compte robot ou utilisateur avec le rôle Developer ou supérieur.\n\n**5. Interface Harbor inaccessible après renouvellement du certificat Let's Encrypt**\nCause : le conteneur `proxy` (nginx) continue à servir l'ancien certificat chargé en mémoire.\nCorrection : `docker compose restart proxy` depuis le dossier d'installation Harbor. Idéalement, automatisez-le via le hook post-renouvellement décrit à l'étape 7.",{"type":91,"title":92,"headers":93,"rows":99},"comparison","Harbor vs Docker Hub vs GHCR vs Gitea Registry",[94,95,96,97,98],"Critère","Harbor self-hosted","Docker Hub","GHCR","Gitea Registry",[100,106,111,116,122,127,133,138,144],[101,102,103,104,105],"Hébergement","Votre VPS (données UE)","Serveurs Docker Inc. (USA)","Serveurs GitHub\u002FMicrosoft (USA\u002FUE opt.)","Votre VPS",[107,108,109,110,110],"Scan de vulnérabilités","Trivy intégré, auto au push","Docker Scout (payant)","Aucun natif",[112,113,114,115,110],"Signature d'images","Cosign + Notary v2","DCT (deprecated)","Cosign externe",[117,118,119,120,121],"RBAC granulaire","5 rôles par projet","Rôles d'organisation limités","Rôles GitHub (coarse)","Rôles Gitea basiques",[123,124,125,126,124],"Rate limit (pulls)","Aucun","100\u002F6h (gratuit), 5000\u002Fjour (Pro)","Lié aux limites GitHub",[128,129,130,131,132],"OIDC\u002FSSO natif","Oui (LDAP, OIDC, SAML)","Non (SSO entreprise payant)","SSO GitHub uniquement","OIDC partiel",[134,135,136,137,136],"Audit logs complets","Oui (IP, user, action, tag)","Limité","Partiel via GitHub audit",[139,140,141,142,143],"Conformité NIS2\u002FGDPR","Totale (données on-premise)","Contractuelle seulement","DPA Microsoft disponible","Totale (on-premise)",[145,146,147,148,149],"Coût","VPS (~15-30 €\u002Fmois)","Gratuit \u002F Pro ~5$\u002Fmois","Inclus GitHub Free\u002FPro","VPS partagé avec Gitea","Déployez votre registre Harbor sur un VPS ServOrbit","Un VPS 4 vCPU \u002F 8 Go RAM suffit pour faire tourner Harbor en production pour une équipe de 10 développeurs. ServOrbit livre la VM en moins de 90 secondes, avec accès root SSH et snapshots automatiques inclus.","Voir les offres agences","\u002Fsolutions\u002Fagences",[155,170,191],{"id":156,"slug":157,"slugs":158,"title":162,"excerpt":163,"readTime":164,"views":18,"isPinned":19,"publishedAt":165,"updatedAt":21,"category":166,"categories":167,"featuredImage":29,"bgImage":30,"posterImage":169,"relatedSolution":29},434,"traefik-v3-vps-reverse-proxy",{"fr":157,"en":159,"ar":160,"es":161},"traefik-v3-vps-docker-reverse-proxy-https","traefik-v3-على-vps-ريفرس-بروكسي-docker","traefik-v3-vps-reverse-proxy-docker-https","Traefik v3 sur VPS : reverse proxy Docker HTTPS automatique","Déployez Traefik v3 sur votre VPS : HTTPS automatique Let's Encrypt, routing par labels Docker, dashboard sécurisé.",9,"2026-10-12T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[168],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Ftraefik-v3-vps-reverse-proxy-poster.svg",{"id":171,"slug":172,"slugs":173,"title":177,"excerpt":178,"readTime":179,"views":18,"isPinned":19,"publishedAt":165,"updatedAt":21,"category":180,"categories":185,"featuredImage":29,"bgImage":30,"posterImage":187,"relatedSolution":188},435,"zitadel-sso-self-hosted-vps",{"fr":172,"en":174,"ar":175,"es":176},"self-hosting-zitadel-vps-multi-tenant-sso","استضافة-zitadel-على-vps-sso-متعدد-المستأجرين","zitadel-vps-sso-multi-tenant-sin-keycloak","Héberger ZITADEL sur un VPS : SSO multi-tenant sans Keycloak","Déployez ZITADEL sur votre VPS avec Docker Compose : IAM cloud-native en Go, multi-tenant natif, OIDC, OAuth2, SAML et Passkeys — sans la lourdeur de Keycloak.",14,{"id":17,"name":181,"slug":182,"color":183,"icon":184},"Sécurité & Monitoring","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[186],{"id":17,"name":181,"slug":182,"color":183,"icon":184},"\u002Fblog\u002Fcovers\u002Fzitadel-sso-self-hosted-vps-poster.svg",{"categorySlug":189,"appSlug":190},"cybersecurity","zitadel",{"id":192,"slug":193,"slugs":194,"title":198,"excerpt":199,"readTime":164,"views":18,"isPinned":19,"publishedAt":200,"updatedAt":21,"category":201,"categories":202,"featuredImage":29,"bgImage":30,"posterImage":204,"relatedSolution":29},431,"atlassian-cve-2026-21589-patch-jira-confluence-self-hosted",{"fr":193,"en":195,"ar":196,"es":197},"cve-2026-21589-patch-atlassian-jira-confluence-self-hosted","cve-2026-21589-patch-atlassian-jira-confluence","cve-2026-21589-parche-atlassian-jira-confluence","CVE-2026-21589 : patcher Atlassian sans attendre","CVE-2026-21589 path traversal non authentifié (CVSS 9.3) sur Atlassian Data Center. Versions touchées, correctifs et contournement temporaire.","2026-10-11T00:00:00+00:00",{"id":17,"name":181,"slug":182,"color":183,"icon":184},[203],{"id":17,"name":181,"slug":182,"color":183,"icon":184},"\u002Fblog\u002Fcovers\u002Fatlassian-cve-2026-21589-patch-jira-confluence-self-hosted-poster.svg",1791900988215]