Migration sur un nouveau cluster Docker Swarm/Compose
Contexte, docker swarm et mattermost
Dans le cadre de la migration d'un certain nombre de services d'un cluster Docker Swarm vers un autre, je me suis retrouvé à devoir migrer une instance Mattermost.
La procédure que je vais décrire ici est aussi valable pour la migration d'un nœud du cluster vers un autre nœud du même cluster.
Par ailleurs, je suppose que cette procédure est aussi valable si vous avez déployé Mattermost avec docker-compose et que vous souhaitez faire une migration vers un autre serveur en continuant à utiliser docker-compose. Il est d'ailleurs probable qu'il soit aussi possible de migrer une instance Mattermost déployée avec docker-compose vers un cluster Docker Swarm.
Stack Docker Swarm
Voici la stack Docker Swarm que j'utilise pour Mattermost, celle-ci est simplifiée et ne correspond pas exactement à la stack que j'utilise en production.
Cette stack se base sur le docker-compose officiel de Mattermost, mais adapté pour fonctionner avec Docker Swarm. Il manque ici les variables d'environnement pour la configuration de Mattermost et Postgresql.
version: "3.3"
networks:
  network:
    driver: overlay
services:
  postgres:
    image: postgres:15
    security_opt:
      - no-new-privileges:true
    tmpfs:
      - /tmp
      - /var/run/postgresql
    volumes:
      - /var/swarm/mattermost/postgres:/var/lib/postgresql/data
    networks:
      - network
    deploy:
      placement:
        constraints:
          - node.role == manager
  mattermost:
    image: mattermost/mattermost-team-edition:9.0
    security_opt:
      - no-new-privileges:true
    volumes:
      - /var/swarm/mattermost/mattermost/config:/mattermost/config:rw
      - /var/swarm/mattermost/mattermost/data:/mattermost/data:rw
      - /var/swarm/mattermost/mattermost/logs:/mattermost/logs:rw
      - /var/swarm/mattermost/mattermost/plugins:/mattermost/plugins:rw
      - /var/swarm/mattermost/mattermost/client/plugins:/mattermost/client/plugins:rw
      - /var/swarm/mattermost/mattermost/bleve-indexes:/mattermost/bleve-indexes:rw
    tmpfs:
      - /tmp
    ports:
      - "8443:8443/udp"  # video and audio calls
      - "8065:8065/tcp"  # mattermost
    networks:
      - network
    deploy:
      placement:
        constraints:
          - node.role == manager
Préparation du nouveau serveur
Comme vous pouvez le voir dans la stack ci-dessus, les volumes utilisés par Mattermost et Postgresql sont montés sur le serveur hôte. Il est donc nécessaire de créer ces volumes sur le nouveau serveur.
Pour cela, il suffit de créer les dossiers correspondants sur le nouveau serveur, dans mon cas, les dossiers sont les suivants :
- 
  
/var/swarm/mattermost/mattermost/config - 
  
/var/swarm/mattermost/mattermost/data - 
  
/var/swarm/mattermost/mattermost/logs - 
  
/var/swarm/mattermost/mattermost/plugins - 
  
/var/swarm/mattermost/mattermost/client/plugins - 
  
/var/swarm/mattermost/mattermost/bleve-indexes - 
  
/var/swarm/mattermost/postgres 
Préparation de la migration
La préparation de la migration consiste à sauvegarder les données de l'instance Mattermost, que ce soit les données générées par Mattermost, mais aussi les données de la base de données (postgresql dans mon cas).
Attention, il est important de couper le service Mattermost et Postgresql avant de faire la migration des données.
Sauvegarde des données de Mattermost
 Pour Mattermost, les deux seuls volumes dont les données sont réellement nécessaires
lors de la migration sont les volumes
 
  config
 
 et
 
  data
 
 .
J'ai donc copié le contenu de ces deux répertoires vers le nouveau serveur.
- 
  
/var/swarm/mattermost/mattermost/config - 
  
/var/swarm/mattermost/mattermost/data 
Sauvegarde de la base de données
Comme pour Mattermost, j'ai directement copié le contenu du volume de la base de données postgresql vers le nouveau serveur.
- 
  
/var/swarm/mattermost/postgres 
Attention, cette manipulation n'est probablement pas la meilleure solution, et je suppose qu'il est nécessaire d'avoir la même version de postgresql sur le nouveau.
 Si cette solution ne marche pas, il vous faudra
utiliser une solution de sauvegarde/restauration de base de données postgresql en
utilisant
 
  pg_dump
 
 et
 
  pg_restore
 
 .
Mise en place de la stack sur le nouveau serveur
C'est la dernière étape, il suffit de déployer votre stack sur le nouveau serveur, et normalement votre instance Mattermost devrait être fonctionnelle.
Conclusion
La migration d'une instance Mattermost d'un cluster Docker Swarm à un autre est une opération étonnamment simple, et je n'ai pas rencontré de problème lors de cette migration.