- Published on
Comment configurer un portainer sur un VPS ?
- Authors
- Name
- Léo Delpon
Qu'est-ce que portainer et à quoi ça sert ?
Portainer est une interface graphique open-source pour la gestion de conteneurs Docker. Il vous permet de gérer et de surveiller vos conteneurs, images, réseaux et volumes Docker depuis une interface web conviviale. Avec Portainer, vous pouvez facilement déployer, gérer et surveiller vos applications dans des conteneurs sans avoir à utiliser la ligne de commande.
Il est très facile à installer et à utiliser, ce qui en fait un choix populaire pour les développeurs et les administrateurs système qui souhaitent gérer leur infrastructure Docker de manière simple et efficace. Portainer vous permet de faire beaucoup de choses, telles que :
- Déployer des conteneurs à partir d'images Docker
- Surveiller l'état et les ressources utilisées par vos conteneurs
- Gérer les réseaux et les volumes Docker
- Créer et gérer des stacks Docker
- Surveiller les logs de vos conteneurs
- Gérer les images Docker et les enregistrer pour une utilisation ultérieure
En résumé, Portainer est un outil pratique pour les développeurs et les administrateurs système qui souhaitent gérer leur infrastructure Docker de manière simple et efficace.
Préparation et configuration de base de portainer
Nous allons commencer par créer un un volume
pour l'associer plus tard à portainer en utilisant la commande suivante :
// docker create volume [OPTIONS] [NOM_DU_VOLUME]
debian@vps-e0a96a5e:~$ docker volume create portainer_volume
Nous pouvons vérifier si le volume a bien été crée en utilisant la commande suivante :
debian@vps-e0a96a5e:~$ docker volume list
DRIVER VOLUME NAME
local 0c8ed9094a71272116748b15344147ac6845f07a2f12064343fe2d60659b07db
local 0c49a93d8dff1adce6bc68335cf5f9b13af462488f9a0163516c0c630e3a7f29
local fb0ba058624296180e8f7f5bb28d178fe3fbf4496afe3a7e824c883090a21a9f
local fc5ec115cdc0f8ead6a21253c731dd1951740fbdc0ff40cab0f7938740104123
local fce7bc0c0fc913843e339d16c6202116b10824f9bec108eaecda794c5a0db187
local portainer_data_volume
Il est même possible de vérifier si le volume a été crée en vérifiant les métas-données de ce dernier :
debian@vps-e0a96a5e:~$ docker volume inspect portainer_data_quantor
[
{
"CreatedAt": "2023-02-16T08:55:27Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/portainer_data_volume/_data",
"Name": "portainer_data_volume",
"Options": null,
"Scope": "local"
}
]
Installation de portainer
A présent que le volume a été crée, nous allons récupérer l'image docker de portainer et l'éxécuter via la commande :
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data_volume:/data portainer/portainer-ce:latest
- Notez que le serveur Portainer écoute sur le port TCP
9443
pour l'interface utilisateur et l'API et sur un port optionnel TCP8000
, qui n'est requis que si vous utilisez les fonctionsEdge
Compute avec les agentsEdge
. - Les agents Portainer écoutent sur le port TCP
9001
.
Démystifier les options de la ligne de commande Docker utilisées ci-dessus :
-d/--detach
permet l’exécution du conteneur en arrière-plan et l’impression de l’ID du conteneur.-p/--publish
va exposer le port du conteneur à l’hôte- Par exemple, 9443:9443 signifie que le port 9443 du conteneur du serveur Portainer est accessible sur l'hôte principal de Docker sur le port 9443.
--name
permet d’attributer un nom au conteneur--restart
permet de configurer la politique de redémarrage du conteneur, dans notre cas, nous demandons à ce que le conteneur se redémarre automatiquement à chaque “shutdown”-v/--volume
permet de lier le montage d’un volume de conteneur Docker-v /var/run/docker.sock:/var/run/docker.sock
Cela permet au processus du conteneur du serveur Portainer de communiquer avec le processus Docker de l’hôte principal-v portainer_data_volume:/data
permet de monter les données du conteneur sur un volume physique.
portainer/portainer-ce:latest
c’est l’image que nous utilisons
On a bien accès au conteneur si on vérifie la liste des conteneurs docker qui sont en cours d'exécution :
debian@vps-e0a96a5e:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d7aca2ebca4 portainer/portainer-ce:latest "/portainer" 2 hours ago Up About an hour 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp, 9000/tcp portainer
On peut vérifier également via l'écoute des ports avec la commande ss -altnp | grep 9443
pour vérifier que le port est bien utilisé :
debian@vps-e0a96a5e:~$ ss -altnp | grep 9443
LISTEN 0 128 0.0.0.0:9443 0.0.0.0:*
LISTEN 0 128 [::]:9443 [::
On ainsi accéder au service Portainer via l’adresse url suivante : https://[TON_ADRESSE_IP_V4]:9443
Configuration du HTTPS en utilisant un reverse proxy simple: Nginx
Lorsque nous accédons au portail portainer, il suffit de créer un conteneur nginx depuis : Containers > + Add Container
. On peut ensuite créer ce dernier comme ceci:
On ajoute le nom (nginx par exemple) du contenur, l'image (nginx:lastest) du contenur.
Configuration de ports du conteneur
On va ensuite pouvoir configurer les ports ouverts du conteneur afin d'avoir accès à des services spécifiques comme le HTTP ou le HTTPS
Dans cette image, on configure les ports externes et internes à 80 et 443 en TCP.
On va par la suite configurer la politique de redémarrage à always
:
On va enfin pouvoir le déployer :
Vérification
Normalement si nous allons dans : Containers > [LE_NOM_DU_CONTENEUR] > Console, nous pouvons aller sur le terminal du contenur.
Configuration du reverse-proxy Nginx
Nous allons dans le fichier de configuration du service et allons créer un fichier de configuration :
debian@vps-e0a96a5e:~$ nano /etc/nginx/conf.d/portainer.conf
Voici le fichier de configuratiion :
server {
listen 80;
server_name opc2portainer.51sec.org; // VOTRE NOM DE DOMAINE
location / {
proxy_pass https://172.17.0.2:9443; // L'ADRESSE IP DE VOTRE CONTENEUR PORTAINER AVEC LE PORT ASSOCIE
proxy_http_version 1.1;
proxy_read_timeout 300;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
}
}
On redémarre ensuite le conteneur nginx .
Configuration du HTTPS via CERTBOT
Toujours dans la console du conteneur nginx, on configure l’environnement pour certbot
debian@vps-e0a96a5e:~$ apt install python3 python3-venv libaugeas0
debian@vps-e0a96a5e:~$ apt-get remove certbot
debian@vps-e0a96a5e:~$ python3 -m venv /opt/certbot/
debian@vps-e0a96a5e:~$ /opt/certbot/bin/pip install --upgrade pip
debian@vps-e0a96a5e:~$ /opt/certbot/bin/pip install certbot certbot-nginx
debian@vps-e0a96a5e:~$ ln -s /opt/certbot/bin/certbot /usr/bin/certbot
debian@vps-e0a96a5e:~$ certbot --nginx
debian@vps-e0a96a5e:~$ echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | tee -a /etc/crontab > /dev/null
Si vous souhaitez configurer HTTPS sur un autre service comme Apache ou encore Plesk, il est possible de le faire. Pour plus d'informations, allez sur le lien de Cerbot.
On redémarre le conteneur est on peut désormais accéder à notre portainer en HTTPS !
Si vous souhaitez simuler la demande d'un nouveau certificat, il est possible de le faire via la commande suivante :
sudo certbot renew --dry-run
Et voici la réponse. A noter que j'ai dans mon serveur nginx deux noms de domaines différents
root@2c71c46d9537:/etc/nginx/conf.d# certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/[MON_NOM_DE_DOMAINE_UNO]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for [MON_NOM_DE_DOMAINE_UNO]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/[MON_NOM_DE_DOMAINE_DOS]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for [MON_NOM_DE_DOMAINE_DOS]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/[MON_NOM_DE_DOMAINE_UNO]/fullchain.pem (success)
/etc/letsencrypt/live/[MON_NOM_DE_DOMAINE_DOS]/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Configurer de façon automatique la demande de certificat
On va pouvoir faire ceci via l'utilisation de cron
.
root@2c71c46d9537:/etc/nginx/conf.d# crontab -e
Dans le fichier, on va ajouter le contenu suivant :
0 */12 * * * root certbot -q renew --nginx
Ce qui correspond globalement à ceci :
sudo certbot renew --nginx
Cela vous permettra de suivre les étapes du renouvellement. LetsEncrypt n'autorise le renouvellement que si le certificat est à moins de 30 jours de son expiration. Une fois renouvelé, le nouveau certificat sera valable pendant 90 jours à compter de la date de renouvellement.
Le renouvellement du certificat de cette manière ne vous obligera pas à arrêter et à démarrer Nginx et la configuration de Nginx sera rechargée lors d'un renouvellement réussi de sorte que les visiteurs du site reçoivent automatiquement le nouveau certificat.