Asustor [Tuto] Installer Portainer Business Edition (EE) sur un nas Asustor, avec docker compose (en ssh)

MilesTEG

Administreur
Membre du personnel
6 Septembre 2020
3 091
742
213



Cette version est normalement payante mais il est possible d'obtenir gratuitement une licence 5 nœuds :D (voir ici : https://www.portainer.io/take-5 )
J'ai initialement rédigé le tuto en markdown sur GitHub dans ce GIST (lien ici même).



Note :
Ce tutoriel fonctionne aussi pour Portainer Community Edition (CE) : il faudra juste ajuster le fichier docker-compose.yml en changeant l'image.

L'un des avantages de cette version Business est la présence d'une pastille colorée indiquant la présence ou non d'une nouvelle image :
1668364119657.png 1668364153644.png


Sommaire du tutoriel


Date de création du tuto : 09/11/2022
 

Pièces jointes

  • 1668364676924.png
    1668364676924.png
    230.6 KB · Affichages: 41
Dernière édition:
  • J'aime
Réactions: Dami1 et FX Cachem

1. Prérequis

  • Savoir accéder au NAS en SSH via un terminal ;
  • Avoir installé le paquet Docker Engine via App Central ;
  • Avoir quelques rudiments sur l'utilisation de Docker et le vocabulaire qui va avec ;
  • Avoir créé un dossier partagé /volume1/docker/ ;
  • Savoir créer un utilisateur, et lui affecter des droits de lecture/écriture sur un dossier partagé ;
  • (Optionnel) Savoir créer un groupe, lui affecter des utilisateurs et des droits de lecture/écriture sur les dossiers partagés.
 
Dernière édition:

2. Préparation du nécessaire

2.1. Préparation du nécessaire

Depuis l'interface d'ADM (dans "Access Control"), il faut créer un utilisateur dédié à Portainer qui aura les droits d'accès aux dossiers créés précédemment.
1668459585746.png
Noter au passage le UID de cet utilisateur, nous en aurons besoin plus bas.

Il nous faut aussi le GID du groupe auquel appartient cet utilisateur. Si vous n'avez pas choisi de créer un groupe dédié à Docker, qui n'a les droits d'accès que sur le dossier /volume1/portainer/. Ce GID est présent aussi dans le Access Control, dans la section "Local Group".
1668459684752.png

2.2. Création des dossiers ../portainer/ et ../portainer/data/

  • Quand je crée un conteneur, j'utilise toujours un volume défini par un point de montage sur le NAS, ainsi les données sont toujours présentes, même si je supprime le conteneur.
    Je ne passe donc pas par un volume non persistant.
  • On va considérer que les dossiers des conteneurs sont présents dans le dossier /volume1/docker/, si ce dossier n'existe pas, soit il vous faudra le créer soit vous devrez utiliser un autre dossier que vous avez déjà créé/utilisé.
  • Nous créons donc un nouveau dossier dans /volume1/docker/ avec la commande suivante :
    Bash:
    mkdir -p /volume1/docker/portainer/data
    L'option -p va permettre de créer les sous-dossiers qui manquent et ne renverra pas d’erreurs s'ils existent.

2.3. Préparation du fichier docker-compose.yml

Pour installer Portainer, on va passer par l'utilisation de la commande docker compose up -d depuis le dossier /volume1/docker/portainer/.
Pour cela, il faudra placer le fichier docker-compose.yml suivant dans le dossier /volume1/docker/portainer/ :

YAML:
version: "2.4"
services:
  portainer:
    ## Image pour Portainer CE (Community Edition, gratuite)
    # image: portainer/portainer-ce:latest

    ## Image pour Portainer EE (Businnes Edition, 5 Nodes gratuits : https://www.portainer.io/take-5 )
    image: portainer/portainer-ee:latest    # https://docs.portainer.io/start/upgrade/tobe/docker#upgrading-from-version-2.0.0-and-later
   
    container_name: portainer
    hostname: portainer
    network_mode: bridge

    environment:
      - PUID=1045        # Utiliser la commande ` id user ` pour trouver le PUID et le PGID.
      - PGID=100
   
    ## ################################################
    ## Label pour Watchtower qui fera une mise à jour automatique. Peut être supprimé/commenté si Watchtower ne sera pas utilisé.
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
    ## ################################################

    volumes:
      # Ce volume est celui qui va contenir les données de portainer.
      - /volume1/docker/portainer/data:/data

      # Ce volume est le docker.sock, vital pour controler Docker, mais aussi risqué. Il ne faut pas le mettre dans n'importe quel conteneur. Surtout qu'ici il sera en lecture+écriture...
      - /var/run/docker.sock:/var/run/docker.sock
   
    ports:
      - 9000:9000     # Web-UI
      # - 8000:8000   # Edge Agent :    https://docs.portainer.io/admin/environments/add/edge
      # - 9443:9443   # Portainer API : https://docs.portainer.io/api/access
   
    restart: always

    healthcheck:
      test: ["CMD", "/docker", "container", "top", "portainer"]
      start_period: 15s
      interval: 90s
      timeout: 10s
      retries: 3

Les ports 8000 et 9443 ne sont pas indispensables pour une utilisation simple. Tout dépendra de l'usage de Portainer. Pour le moment on les laisse commentés, donc non utilisés.

 

Pièces jointes

  • 1668459627994.png
    1668459627994.png
    81.4 KB · Affichages: 2
Dernière édition:

3. Création du conteneur en SSH avec docker compose

Il faut :
  • se placer en mode root, ou bien il faudra taper sudo devant la commande ;
  • aller dans le dossier contenant le fichier docker-compose.yml ;
  • lancer la commande : docker compose up -d
    Bash:
    sudo -i
    cd /volume1/docker/portainer/
    docker compose up -d
    Cette commande va récupérer l'image présente dans le fichier docker-compose.yml et construire le conteneur selon ses spécifications. Le paramètre -d sert à lancer le conteneur en mode daemon c'est-à-dire qu'il s'exécutera en arrière plan, même quand la commande sera terminée.

    Le processus de création est alors lancé :
    1668637524843.png

    Une fois terminé, vous aurez ceci :
    1668637531160.png

    Il sera alors temps de passer à l'interface WEB.


 
Dernière édition:

4. Connexion à l'interface WEB

Il suffit te taper l'adresse IP du NAS suivi du port de connexion 9000 dans un navigateur : http://192.168.0.100:9000.
1668637854718.png

Il faudra alors choisir un mot de passe robuste. Il est également possible de changer le nom de l'administrateur de Portainer. Pour le tuto, je laisse admin.

Il est également possible de restaurer une sauvegarde de Portainer faite auparavent :
1668637894197.png

Si comme moi vous tardez à créer le compte administrateur de Portainer lors de la première connexion, vous aurez cet écran :
1668637973677.png
Il faudra alors, recréer le conteneur, et ne pas tarder autant à aller créer administrateur 😃

Dans le cas de l'édition Business pour laquelle vous avez récupérer gratuitement une licence pour 5 nœuds, c'est ici qu'il faut entrer cette licence :
1668638030407.png

On arrive ensuite sur cet écran :
1668638055810.png
Il suffira de choisir :
200949704-dd76732b-f407-40b5-ac70-5962da13b25a.png
1668638122616.png

Il est possible de renommer l'environnement actuellement appelé "local" :
1668638144771.png


On pourra alors voir dans la liste des conteneurs le seul et unique actuellement lancé : Portainer.

1668638174185.png

Sa stack n'est pas modifiable compte tenu qu'il a été créé en-dehors de portainer.




 

Pièces jointes

  • 1668637912067.png
    1668637912067.png
    51.7 KB · Affichages: 0
Dernière édition:

5. Exemple de création de stack, avec Watchtower

Une stack dans Portainer, c'est ce qui va permettre de créer un ou plusieurs conteneurs en même temps, liés ou non.

Je vais prendre l'exemple de Watchtower, conteneur qui permet de mettre à jour à intervalle fixe les conteneurs qui possèdent le label adapté :
YAML:
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

Dans l'éditeur WEB, il faut coller le contenue d'un fichier docker-compose.yml après avoir donné un nom à la stack :
1668638303164.png
1668638312426.png


Voilà le contenue du fichier docker-compose.yml que je vais utiliser. J'utilise les notifications email, il faudra modifier les paramètres SMTP en adéquation avec votre fournisseur).

YAML:
#
# Doc de Watchtower : https://containrrr.dev/watchtower/
# Dépôt GitHub : https://github.com/containrrr/watchtower/
#
---
version: "2.4"
services:
  watchtower:
    image: containrrr/watchtower:amd64-latest
    container_name: watchtower
    network_mode: bridge
    environment:
      - WATCHTOWER_NOTIFICATIONS=email
      #- WATCHTOWER_NOTIFICATIONS_LEVEL=debug
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_REMOVE_VOLUMES=true
      - WATCHTOWER_DEBUG=true
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_TIMEOUT=30s
      # Utiliser soit SCHEDULE soit INTERVAL (ce dernier en sec)
      # Pour SCHEDULE : https://crontab.guru/#0_9_*_*_*
      # Ajouter un 0 en premier pour les secondes : secondes | minutes | heures | jour du mois | mois | jour de la semaine
      #- WATCHTOWER_SCHEDULE=0 0 6 * * *
      - WATCHTOWER_SCHEDULE=0 0 5 * * *
      #- WATCHTOWER_POLL_INTERVAL=3000
      - TZ=Europe/Paris
     
      #####################################################################
      # Pour les notifications en emails :
      - WATCHTOWER_NOTIFICATIONS_HOSTNAME=Asustor-AS6704T
      - WATCHTOWER_NOTIFICATION_EMAIL_FROM=admin@ndd.tld
      - WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@ndd.tld
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.ndd.tld
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=admin@ndd.tld
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=0123456789@azertyuyuiop
      - WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2
     
      #####################################################################
   
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
     
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped

Le déploiement est en cours :
1668638402140.png


Un message apparaitra en haut à droite indiquant le succès de l'opération ou au contraire son échec.
1668638433178.png

Une fois terminé, on a notre nouvelle stack et notre nouveau conteneur :
1668638447694.png
1668638460207.png

Dans mon exemple, j'ai bien reçu l'email de lancement d'après création :
1668638481496.png

Voilà. À vous de jouer, et de créer plein de conteneurs ^^

Date de création du tuto : 09/11/2022

 
Dernière édition:
  • J'aime
Réactions: Dami1

6. (To-Do) Contrôler plusieurs instances de Portainer depuis une seule interface à l'aide de Portainer Agent


Ajouter une partie sur le contrôle de l'instance docker via l'agent Portainer depuis une autre instance de Portainer, afin de tout groupe au même endroit, comme ceci :
1668639095084.png
 
Dernière édition:

Changelog :

  • Première version (avec correction de quelques fautes par rapport au GIST) ;
  • Ajout de liens pour accéder aux différents paragraphes principaux.


Le tuto est ouvert aux commentaires 😊
 
Dernière édition:
Bonjour tout le monde,
J'ai une question, comment puis-je supprimer une stack ?
(car suite à un restore système via hyperbackup syno, suite à une énorme bétise sur les profils group/user) j'ai fait tout planter dans mes docker...

Maintenant que tout semble est remis d'équerre (sauf pihole !!!) j'ai remarqué qu'il m'était impossible de supprimer une stack
Est-ce possible de le faire manuellement ?
 
Bonjour tout le monde,
J'ai une question, comment puis-je supprimer une stack ?
(car suite à un restore système via hyperbackup syno, suite à une énorme bétise sur les profils group/user) j'ai fait tout planter dans mes docker...

Maintenant que tout semble est remis d'équerre (sauf pihole !!!) j'ai remarqué qu'il m'était impossible de supprimer une stack
Est-ce possible de le faire manuellement ?
Salut @Dimebag Darrell (j'ai vu ton sujet sur l'autre forum :) mais pas encore eu le temps de répondre )
Pourrais-tu poster une capture d'écran et le message d'erreur éventuel que ça te met ?

Ça me fait penser à une stack gérée ailleurs que dans Portainer, comme pour Portainer lui-même puisqu'il est créé à partir de la ligne de commande.
Est-ce que tu as ce genre d'état :
1680524187207.png

Si c'est le cas, essaye d'aller en ligne de commande et de faire un docker-compose down ou docker compose down (selon ce que tu as comme version de docker).
 
Salut @Dimebag Darrell (j'ai vu ton sujet sur l'autre forum :) mais pas encore eu le temps de répondre )
Pourrais-tu poster une capture d'écran et le message d'erreur éventuel que ça te met ?

Ça me fait penser à une stack gérée ailleurs que dans Portainer, comme pour Portainer lui-même puisqu'il est créé à partir de la ligne de commande.
Est-ce que tu as ce genre d'état :
Voir la pièce jointe 8689

Si c'est le cas, essaye d'aller en ligne de commande et de faire un docker-compose down ou docker compose down (selon ce que tu as comme version de docker).

Hello, @MilesTEG1
Voici les messages :
- failed to remove a stack:
- could not get the contents of the file 'docker-compose.yml'

Enfait, c'est suite à un restore de mon dossier docker et aussi de ma config système (hier soir...)
Suite à cela, j'ai une stack qui est "lockée" mais tjs en "Total" (et non limited)
 
Bonjour,

Pour ma part lors de la création du conteneur Portainer, j'ajoute un label . (Cacher=Oui)

Puis sous Portainer, dans la partie Hidden containers tu met ce label ce qui cache dans l'interface de Portainer.

Tu peux l'utiliser pour d'autre conteneur :)



Code:
################
version: '3.9' #
services:      #
################
############################################################################################
 Portainer:
  image: 'portainer/portainer-ee'
  container_name: 'Portainer'
  network_mode: 'bridge'
  restart: 'always'
  hostname: 'Portainer'
  volumes:
   - '/var/run/docker.sock:/var/run/docker.sock'
   - '/etc/localtime:/etc/localtime:ro'
   - 'Portainer:/data'
  ports:
   - '8000:8000'
   - '9000:9000'
   - '9443:9443'
  labels:
   Cacher: 'Oui'

############################################################################################
volumes:
 Portainer:
  external: true
############################################################################################


1704372268653.png


1704372351823.png
 
Dernière édition:
Bonjour,
Pourrais tu détailler ceci car j'ai pas saisi le test lui même.

healthcheck:
test: ["CMD", "/docker", "container", "top", "portainer"]
start_period: 15s
interval: 90s
timeout: 10s
retries: 3
 
Bonjour,
Pourrais tu détailler ceci car j'ai pas saisi le test lui même.
Salut @Drthrax74
Heu, c'est le heathcheck, ce qui fait apparaitre le Healthy ou pas dans Portainer, je crois avoir récupéré ce code sur Discord.
Je ne sais en revanche pas trop à quoi correspond la commande utilisée...