Introduction
Harbor vous donne :
- Registry Docker/OCI prive (vs Docker Hub public)
- Scanning automatique des vulnerabilites (Trivy integre)
- Image signing avec Cosign / Notary
- Replication multi-sites
- RBAC : utilisateurs, groupes, projets
- Retention policies (auto-cleanup vieilles images)
- Webhooks pour CI/CD
- Helm charts hosting
- Garbage collection
Alternative a : Docker Hub (cher), GitLab Registry, AWS ECR, Azure ACR.
Prerequis
- VPS Linux Debian/Ubuntu (4 vCPU, 8 Go RAM, 200+ Go SSD)
- Docker + Docker Compose
- Nom de domaine
- Certificat TLS (Let's Encrypt)
Etape 1 : Telecharger Harbor
cd /opt
sudo wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-online-installer-v2.10.0.tgz
sudo tar xzf harbor-online-installer-v2.10.0.tgz
cd harbor
Etape 2 : Generer le certificat TLS
Via Let's Encrypt avec certbot DNS-01 :
sudo certbot certonly --manual --preferred-challenges=dns -d registry.votre-domaine.fr
Copiez les certs :
sudo mkdir -p /etc/harbor/certs
sudo cp /etc/letsencrypt/live/registry.votre-domaine.fr/fullchain.pem /etc/harbor/certs/
sudo cp /etc/letsencrypt/live/registry.votre-domaine.fr/privkey.pem /etc/harbor/certs/
Etape 3 : Configurer harbor.yml
sudo cp harbor.yml.tmpl harbor.yml
sudo nano harbor.yml
hostname: registry.votre-domaine.fr
http:
port: 80
https:
port: 443
certificate: /etc/harbor/certs/fullchain.pem
private_key: /etc/harbor/certs/privkey.pem
harbor_admin_password: pass-tres-fort
database:
password: pass-db-fort
max_idle_conns: 100
max_open_conns: 900
data_volume: /data/harbor
trivy:
ignore_unfixed: false
skip_update: false
insecure: false
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /var/log/harbor
Etape 4 : Installer
sudo ./install.sh --with-trivy
Compte 5-10 min. Le script telecharge les images, configure docker-compose et demarre la stack.
A la fin :
✔ ----Harbor has been installed and started successfully.----
Etape 5 : Premier acces
Visitez https://registry.votre-domaine.fr. Login : admin + le mot de passe configure.
Etape 6 : Creer un projet
Projects > New project.
Nom : monequipe. Access level : Private (necessite auth pour pull).
Clic sur le projet pour l'explorer.
Etape 7 : Push une image
Sur votre machine :
docker login registry.votre-domaine.fr
Username admin, password votre password.
Tag et push :
docker pull alpine:latest
docker tag alpine:latest registry.votre-domaine.fr/monequipe/alpine:latest
docker push registry.votre-domaine.fr/monequipe/alpine:latest
Verifiez dans Harbor UI : votre image apparait sous monequipe.
Etape 8 : Scan de vulnerabilites
Cliquez sur l'image dans Harbor > Scan. Trivy scanne et liste les CVE :
| Severity | CVE | Package | Fixed Version |
| HIGH | CVE-2023-...| openssl | 3.1.4-r1 |
| MEDIUM | CVE-2023-...| musl | 1.2.4_git-r2 |
Pour scanner automatiquement chaque push :
Project > Configuration > Vulnerability scanning > Automatically scan images on push.
Etape 9 : Retention policies
Project > Policy > Tag Retention. Exemple :
- Garder les 10 dernieres versions par tag
- Sauf les tags
latest,stable,release-*
Run le scheduler tous les jours a 2h :
Project > Policy > Tag Retention > Schedule > Custom : 0 2 * * *.
Etape 10 : Replication
Pour repliquer vers un autre Harbor / Docker Hub / ECR :
Administration > Registries > New endpoint. Configurez la cible.
Administration > Replications > New rule. Choisissez source > destination.
Par exemple : replique tous les release-* vers AWS ECR pour disaster recovery.
Etape 11 : Robot accounts pour CI/CD
Pour eviter d'utiliser admin dans vos pipelines :
Project > Robot Accounts > New robot account.
Nom : ci-bot. Permissions : push + pull. Token genere, copiez-le.
Dans votre CI :
echo "$TOKEN" | docker login registry.votre-domaine.fr -u 'robot$monequipe+ci-bot' --password-stdin
docker build -t registry.votre-domaine.fr/monequipe/monapp:$VERSION .
docker push registry.votre-domaine.fr/monequipe/monapp:$VERSION
Etape 12 : Garbage collection
Harbor garde des layers orphelins quand vous deletez des images. GC nettoie :
Administration > Garbage Collection > Schedule. Exemple : tous les dimanches a 3h.
Lancez manuellement la premiere fois :
Administration > Garbage Collection > GC NOW.
⚠️ GC bloque les pushes pendant son execution.
Depannage
"x509: certificate signed by unknown authority"
Le client Docker ne fait pas confiance au cert. Pour Let's Encrypt c'est OK. Pour cert auto-signe :
Sur le client :
sudo mkdir -p /etc/docker/certs.d/registry.votre-domaine.fr
sudo cp ca.crt /etc/docker/certs.d/registry.votre-domaine.fr/
sudo systemctl restart docker
"denied: requested access to the resource is denied"
Verifiez :
- Project visibility (Public vs Private)
- Utilisateur dans le project members
- Robot token toujours valide
Disque qui se remplit
Trop d'images. Configurez retention policies + GC. Verifiez :
sudo du -sh /data/harbor/registry
Harbor down / lent
cd /opt/harbor
sudo docker compose ps
sudo docker compose logs -f core
sudo docker compose logs -f registry
Souvent : Postgres ou Redis a court de ressources. Augmentez RAM ou tunez.
Trivy scan timeout
Augmentez le timeout dans harbor.yml :
trivy:
timeout: 30m
Reinstallez :
sudo docker compose down
sudo ./install.sh --with-trivy
Commandes utiles
# Status stack
cd /opt/harbor
sudo docker compose ps
# Logs
sudo docker compose logs -f
sudo docker compose logs -f core
sudo docker compose logs -f registry
# Restart
sudo docker compose restart
# Stop / Start
sudo docker compose down
sudo docker compose up -d
# Update Harbor (sauvegardez avant !)
sudo docker compose down
sudo cp -r /opt/harbor /opt/harbor.bak
# Telecharger nouvelle version, copier harbor.yml, ./install.sh
# Backup base + config
sudo docker compose exec postgresql pg_dump -U postgres registry | gzip > harbor-db-$(date +%F).sql.gz
sudo tar czf harbor-data-$(date +%F).tar.gz /data/harbor
# Tester un pull/push
docker login registry.votre-domaine.fr
docker pull registry.votre-domaine.fr/library/alpine:latest
Conclusion
Harbor est la solution serieuse pour heberger vos images en interne :
- Securite : scan + signing + RBAC
- Productivite : webhooks, retention, replication
- Compatibilite : Docker, OCI, Helm charts
Pour aller plus loin :
- Activez Cosign signing pour la supply chain security
- Combinez avec Falco pour la runtime security
- Pour les gros clusters K8s, configurez la replication vers une registry edge proche des nodes
Ressources
- Documentation officielle : https://goharbor.io/docs/
- Site officiel : https://goharbor.io
- Github : https://github.com/goharbor/harbor
- Trivy : https://aquasecurity.github.io/trivy/


















