Published on

Comment configurer un portainer sur un VPS ?

 5 mins
Authors
  • avatar
    Name
    Léo Delpon
    Twitter

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 TCP 8000, qui n'est requis que si vous utilisez les fonctions Edge Compute avec les agents Edge.
  • 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:

Maple

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

Maple

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:

Maple

On va enfin pouvoir le déployer :

Maple

Vérification

Normalement si nous allons dans : Containers > [LE_NOM_DU_CONTENEUR] > Console, nous pouvons aller sur le terminal du contenur.

Maple

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.