Les parametres sont relativement standard
Un volume doit être créer pour la persitance des données
docker volume create nexus_data
Le premier bloc de labels est lié a Nexus lui même
Le block de label suivant une route sur traefik pour accéder au proxy vers github qui sera bindé sur le container sur le port 5000
# Registry Endpoint Github
- "traefik.http.routers.github.rule=Host(`github.zen6.info`)"
- "traefik.http.services.github.loadbalancer.server.port=5000"
- "traefik.http.routers.github.service=github"
- "traefik.http.routers.github.entrypoints=websecure"
- "traefik.http.routers.github.tls=true"
- "traefik.http.routers.github.tls.certresolver=le"
Le block de label creer une route sur traefik pour acceder au registry local Nexus qui sera bindé sur le container sur le port 5001
# Registry Endpoint local registry
- "traefik.http.routers.registry.rule=Host(`registry.zen6.info`)"
- "traefik.http.services.registry.loadbalancer.server.port=5001"
- "traefik.http.routers.registry.service=registry"
- "traefik.http.routers.registry.entrypoints=websecure"
- "traefik.http.routers.registry.tls=true"
- "traefik.http.routers.registry.tls.certresolver=le"
Fichier docker-compose:
version: "3"
services:
nexus:
image: sonatype/nexus3
container_name: nexus
hostname: nexus
environment:
INSTALL4J_ADD_VM_PARAMS: "-Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m -Djava.util.prefs.userRoot=/nexus-data/javaprefs"
restart: unless-stopped
volumes:
- nexus_data:/nexus-data
networks:
- traefik
labels:
- "traefik.enable=true"
- "traefik.docker.network=traefik"
- "traefik.http.routers.nexus.rule=Host(`nexus.zen6.info`)"
- "traefik.http.services.nexus.loadbalancer.server.port=8081"
- "traefik.http.routers.nexus.service=nexus"
- "traefik.http.routers.nexus.tls=true"
- "traefik.http.routers.nexus.tls.certresolver=le"
- "traefik.http.routers.nexus.entrypoints=websecure"
# Registry Endpoint Github
- "traefik.http.routers.github.rule=Host(`github.zen6.info`)"
- "traefik.http.services.github.loadbalancer.server.port=5000"
- "traefik.http.routers.github.service=github"
- "traefik.http.routers.github.entrypoints=websecure"
- "traefik.http.routers.github.tls=true"
- "traefik.http.routers.github.tls.certresolver=le"
# Registry Endpoint local registry
- "traefik.http.routers.registry.rule=Host(`registry.zen6.info`)"
- "traefik.http.services.registry.loadbalancer.server.port=5001"
- "traefik.http.routers.registry.service=registry"
- "traefik.http.routers.registry.entrypoints=websecure"
- "traefik.http.routers.registry.tls=true"
- "traefik.http.routers.registry.tls.certresolver=le"
volumes:
nexus_data:
external: true
networks:
traefik:
name: traefik
external: true
Les urls d'acces additionels github|registry.zen6.info et les ports associés ont été ajoutés afin de pouvoir push le images docker sur leurs repository respectifs, le push sur un group de repo n'étant pas possible avec la version community
Demarrer le docker-compose
Si vous avez installé le plugin docker compose :docker compose up -d
sinon : docker-compose up -d
Récupérer le mot de passe le l'utilisateur admin généré au premier démarrage de Nexus
sudo cat /var/lib/docker/volumes/nexus_data/_data/admin.password
Vous connecter a l'url indiqué (nexus.zen6.info dans mon cas ), il vous sera demandé de modifier ce mot de passe.
Dans la vue admin
Sélectionner Blob Stores
Puis Create Blob Store
Type; File
Name: Comme bon vous semble, il sera nommé Docker dans la suite de la doc
Ce repository fonctionne en mode proxy/cache si l'image est deja présente elle est fournie sinon Nexus vas le récupérer sur githut le stocker puis l'envoyer.
Dans la vue admin
Sélectionner Repositories
Puis Create Repository
Selectionner: Docker (proxy)
Champs à renseigner :
Name: Ce que vous voulez l'url généré n'étant pas utilisé
Remote Storage: https://registry-1.docker.io
Docker Index: Selectionner Use Docker Hub
Storage: Selectionner le storage dedié à Docker créer précedement
Ne pas activé http ou https sur ce repository ceci sera fait plus tard via un docker-group
Ce repository est destiné a vos images local
Dans la vue admin
Sélectionner Repositories
Puis Create Repository
Selectionner: Docker (hosted)
Champs à renseigner :
L'accés sera bien fait en HTTPS mais ces
Traefikqui s'occupera de la TLS.
La version sans licence ne permet pas de faire de push sur un Docker Group mais il est quand mème pratique d'en créer un car les pull quand a eux sont possiblent.
Ceci vous permet d'interroger les deux repository precedement creer via la meme URL
Dans la vue admin
Sélectionner Repositories
Puis Create Repository
Selectionner: Docker (Group)
Storage: Selectionner le Blob Store dedié à Docker créer précedemen
Champs à renseigner :
L'accés sera bien fait en HTTPS mais ces
Traefikqui s'occupera de la TLS.
Dans la vue admin
Sélectionner Realms
Ajouter Docker Bearer Token Realm dans le panel Active ( il suffit de clicker dessus )
Afin de sécuriser l'acceès aux repos
1 - Creer un role utilisateur docker
Dans la vue admin
Sélectionner Sécurity->Roles->Create Role
Créer un role ayant les privileges:
nx-repository-admin-docker-dockers-readnx-repository-view-docker-*-*
Creer un utilisateur en lui assigant le role que vous venez de créer
Dans la vue admin
Sélectionner Sécurity->Users->Create local user
Exemple:

stef@infra:~$ docker login github.zen6.info
Username: stef
Password:
WARNING! Your password will be stored unencrypted in /home/stef/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
Pour récuperer une image via le proxy juste ajouter votre url configuré dans traefik pour l'acces au port 5001 avant le nom de votre image
Exemple:
stef@infra:~$ docker pull github.zen6.info/hello-world
Using default tag: latest
latest: Pulling from hello-world
719385e32844: Pull complete
Digest: sha256:926fac19d22aa2d60f1a276b66a20eb765fbeea2db5dbdaafeb456ad8ce81598
Status: Downloaded newer image for github.zen6.info/hello-world:latest
github.zen6.info/hello-world:latest
Vous pouvez vérifier que l'image a été ajouté dans l'arborescence associée à votre repo de type Docker Proxy

Elle est aussi présente dans votre arborescence associé a votre repo de type Docker Group
Si on essai de stocker cette image dans notre repo perso:
stef@infra:~$ docker tag github.zen6.info/hello-world github.zen6.info/stef/hello-world:v1
stef@infra:~$ docker push github.zen6.info/stef/hello-world:v1
The push refers to repository [github.zen6.info/stef/hello-world]
01bb4fce3eb1: Layer already exists
denied: Deploying to groups is a PRO-licensed feature. See https://links.sonatype.com/product-nexus-repository
Il faut une licence Pro pour pouvoir push dans un Docker group
Ces pour cela que j'ai créer un autre URL: registry
stef@infra:~$ docker login registry.zen6.info
Username: stef
Password:
WARNING! Your password will be stored unencrypted in /home/stef/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
stef@infra:~$ docker tag github.zen6.info/hello-world registry.zen6.info/stef/hello-world:v1
stef@infra:~$ docker push registry.zen6.info/stef/hello-world:v1
The push refers to repository [registry.zen6.info/stef/hello-world]
01bb4fce3eb1: Pushed
v1: digest: sha256:7e9b6e7ba2842c91cf49f3e214d04a7a496f8214356f41d81a6e6dcad11f11e3 size: 525
stef@infra:~$

Les images sont toujours accessibles via le repo Docker group

Dans la vue admin
Sélectionner Blob Stores
Puis Create Blob Store
Type; File
Name: Comme bon vous semble, il sera nommé yum dans la suite de la documentation
Dans la vue admin
Sélectionner Repositories
Puis Create Repository
Selectionner: Yum (proxy)
Champs à renseigner :
Name: centos
Remote Storage: http://mirror.centos.org/
Storage: Selectionner le storage dédié à yum créer précedement.

Ceci facilitera la gestion des autres ditribution en affichant un url unique
Dans la vue admin
Sélectionner Repositories
Puis Create Repository
Selectionner: yum (group)
Champs à renseigner :
Name: yum
Storage: Selectionner le storage dédié à yum créer précedement.
Ajouter le repositoey centos dans les Members

Changement a opérer sur vos host
Le fichiers present dans /etc/yum.repos.d/ par défauts doivent ressembler a ceci :
Exemple pour CentOS-Stream-AppStream.repo
# CentOS-Stream-AppStream.repo
#
# The mirrorlist system uses the connecting IP address of the client and the
# update status of each mirror to pick current mirrors that are geographically
# close to the client. You should use this for CentOS updates unless you are
# manually picking other mirrors.
#
# If the mirrorlist does not work for you, you can try the commented out
# baseurl line instead.
[appstream]
name=CentOS Stream $releasever - AppStream
mirrorlist=http://mirrorlist.centos.org/?release=$stream&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=https://nexus.zen6.info/repository/yum/$contentdir/$stream/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Modifier comme suis:
Commenter le mirrorlist
Decommenter et modifier le baseurl en replacant http://mirror.centos.org par l'url de votre repository yum group (https://nexus.zen6.info/repository/yum dans mon cas )
# CentOS-Stream-AppStream.repo
#
# The mirrorlist system uses the connecting IP address of the client and the
# update status of each mirror to pick current mirrors that are geographically
# close to the client. You should use this for CentOS updates unless you are
# manually picking other mirrors.
#
# If the mirrorlist does not work for you, you can try the commented out
# baseurl line instead.
[appstream]
name=CentOS Stream $releasever - AppStream
#mirrorlist=http://mirrorlist.centos.org/?release=$stream&arch=$basearch&repo=AppStream&infra=$infra
baseurl=https://nexus.zen6.info/repository/yum/$contentdir/$stream/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Faire de meme pour l'ensemble de vos fichiers .repo
Lancer un yum update
Le premier lancement peut prendre du temps car Nexus vas alimenter son cache avant de delivrer le client.
Si timeout => relancer le yum update
Exemple :
[root@localhost yum.repos.d]# yum update
CentOS Stream 8 - AppStream 22 kB/s | 1.8 kB 00:00
CentOS Stream 8 - BaseOS 0.0 B/s | 0 B 02:04
Errors during downloading metadata for repository 'baseos':
- Curl error (28): Timeout was reached for https://nexus.zen6.info/repository/yum/centos/8-stream/BaseOS/x86_64/os/repodata/repomd.xml [Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds]
Erreur : Échec du téléchargement des métadonnées pour le dépôt « baseos » : Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried
[root@localhost yum.repos.d]# yum update
CentOS Stream 8 - BaseOS 31 B/s | 1.8 kB 01:00
CentOS Stream 8 - BaseOS 13 MB/s | 41 MB 00:03
CentOS Stream 8 - Extras 2.8 kB/s | 1.4 kB 00:00
CentOS Stream 8 - Extras 111 kB/s | 18 kB 00:00
CentOS Stream 8 - HighAvailability 181 B/s | 1.8 kB 00:10
CentOS Stream 8 - HighAvailability 12 MB/s | 5.3 MB 00:00
Dépendances résolues.
Rien à faire.
Terminé !
Vous pouvez vérifier que le repository Nexus yum contient maintenant les repos yum demandés:

Dans la vue admin
Sélectionner Repositories
Puis Create Repository
Selectionner: Yum (proxy)
Champs à renseigner :
Name: fedora
Remote Storage: https://mirror.in2p3.fr/pub/epel/ ( vous pouvez en choisir un autre )
Storage: Selectionner le storage dédié à yum créer précédement.
Sur l'host ajouter le fichier /etc/yum.repos.d/epel.repo suivant:
[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place it's address here.
baseurl=https://nexus.zen6.info/repository/fedora/epel/$releasever/Everything/$basearch
repo=epel-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=1
gpgcheck=1
countme=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
[epel-debuginfo]
name=Extra Packages for Enterprise Linux $releasever - $basearch - Debug
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place it's address here.
baseurl=https://nexus.zen6.info/repository/fedora/epel/$releasever/Everything/$basearch/debug
debug-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
gpgcheck=1
[epel-source]
name=Extra Packages for Enterprise Linux $releasever - $basearch - Source
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place it's address here.
baseurl=https://nexus.zen6.info/repository/fedora/epel/$releasever/Everything/SRPMS
source-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
gpgcheck=1
Ajouter la cle pgp du repo puis yum update
rpm --import http://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-8
yum update
Test d'installation du paquet
[root@localhost yum.repos.d]# yum install htop
Dernière vérification de l’expiration des métadonnées effectuée il y a 0:04:54 le dim. 30 juil. 2023 13:30:14 EDT.
Dépendances résolues.
=================================================================================================================================================================================
Paquet Architecture Version Dépôt Taille
=================================================================================================================================================================================
Installation:
htop x86_64 3.2.1-1.el8 epel 170 k
Résumé de la transaction
=================================================================================================================================================================================
Installer 1 Paquet
Taille totale : 170 k
Taille des paquets installés : 396 k
Voulez-vous continuer ? [o/N] : o
Téléchargement des paquets :
Test de la transaction
La vérification de la transaction a réussi.
Lancement de la transaction de test
Transaction de test réussie.
Exécution de la transaction
Préparation : 1/1
Installation : htop-3.2.1-1.el8.x86_64 1/1
Exécution du scriptlet: htop-3.2.1-1.el8.x86_64 1/1
Vérification de : htop-3.2.1-1.el8.x86_64 1/1
Installé:
htop-3.2.1-1.el8.x86_64
Terminé !
Sélectionner Repositories
Puis Create Repository
Selectionner: pypi (proxy)
Champs à renseigner :
Name: pypi-proxy
Remote Storage: https://pypi.org/
Sélectionner Repositories
Puis Create Repository
Selectionner: pypi (group)
Champs à renseigner :
Name: pypi-all
Ajouter le repository pypi-proxy au groupe
stef@infra:~$ pip install --index-url https://nexus.zen6.info/repository/pypi-all/simple simplejson
Looking in indexes: https://nexus.zen6.info/repository/pypi-all/simple
Collecting simplejson
User for nexus.zen6.info: <login>
Password: <password>
Using cached https://nexus.zen6.info/repository/pypi-all/packages/simplejson/3.20.1/simplejson-3.20.1-cp27-cp27mu-manylinux1_x86_64.whl
Installing collected packages: simplejson
Successfully installed simplejson-3.20.1
Editer ( en root ) le fichier /etc/pip.conf
[global]
index-url = https://<login>:<password>@nexus.zen6.info/repository/pypi-all/simple
trusted-host = https://nexus.zen6.info/repository/pypi-all/simple
stef@infra:~$ pip install ecdsa
Looking in indexes: https://nexus.zen6.info/repository/pypi-all/simple
Collecting ecdsa
Downloading https://nexus.zen6.info/repository/pypi-all/packages/ecdsa/0.19.1/ecdsa-0.19.1-py2.py3-none-any.whl (150kB)
100% |████████████████████████████████| 153kB 5.1MB/s
Requirement already satisfied: six>=1.9.0 in /usr/lib/python2.7/dist-packages (from ecdsa) (1.12.0)
Installing collected packages: ecdsa
Successfully installed ecdsa-0.19.
Le client pip passe uniquement par proxy nexus.
On peut vérifier que les packages requetés se mettent à jour dans nexus

Nexus, pour chaque repos, signale les paquets ayant des vulnérabilités connues

Le fonctionnalité de scan n'est plus active sur les images dockers voir la page Utilisation du scanner de vulnérabilité Trivy