Administration d'une instance RocketChat

Table des matières

Je partage ici mes notes d’administration d’une instance rocketchat. J’ai retenu une solution en version docker protégée par un reverse proxy Traefik qui assure également la génération de certificats letsencrypt.

Le projet rocketchat est très actif et donc les mises à jour fréquentes …

Afin d’avoir une charge d’administration minimale, j’ai mis en place des automatismes.

La validation des nouvelles versions est réalisée dans un environnement de préproduction minimaliste.

Configuration d’une instance de développement (version docker)

docker-compose.yml

version: '3.0'
services:

    rocketchat:
        image: rocketchat/rocket.chat:3.0.12
        container_name: rocketchat
        restart: unless-stopped
        command: >
         bash -c
            "for i in `seq 1 30`; do
              INSTANCE_IP=$$(hostname -i) node main.js &&
              s=$$? && break || s=$$?;
              echo \"Tried $$i times. Waiting 5 secs...\";
              sleep 5;
            done; (exit $$s)"         
        volumes:
          - /opt/docker/containers/redteams/rocket/data/uploads:/app/uploads
          - /tmp:/tmp
        environment:
          - PORT=3000
          - ROOT_URL=https://rocket.redteams.fr
          - MONGO_URL=mongodb://mongo:27017/rocketchat
          - MONGO_OPLOG_URL=mongodb://mongo:27017/local
          - SETTINGS_BLOCKED=Prometheus_Enabled,Prometheus_Port
          - Prometheus_Enabled=true
          - Prometheus_Port=9458
        ports:
          - "3000:3000"
        depends_on:
          - mongo

    mongo:
         container_name: mongo
         image: mongo:4.0
         restart: unless-stopped
         command: mongod --smallfiles --oplogSize 128 --replSet rs0
         volumes:
           - /opt/docker/containers/redteams/data/db:/data/db
           - /opt/docker/containers/redteams/data/backups:/dump

    mongo-init-replica:
        image: mongo:4.0
        command: >
           bash -c
             "for i in `seq 1 30`; do
               mongo mongo/rocketchat --eval \"
                 rs.initiate({
                  _id: 'rs0',
                   members: [ { _id: 0, host: 'localhost:27017' } ]})\" &&
               s=$$? && break || s=$$?;
               echo \"Tried $$i times. Waiting 5 secs...\";
               sleep 5;
             done; (exit $$s)"           
        
        depends_on:
           - mongo

Workflow de migration

graph TD;
  A["[PROD] Dump base de données<br />
   docker exec mongo mongodump --archive=/dump/archive.json --gzip <br />
   "]-->B["[PROD] Export vers pre-prod<br />
   scp -i ~/.ssh/id_backup archive.tgz backup@dev.redteams:/home/backup"];
  B-->C["[PRE-PROD] Démarrage mongodb <br />
   docker start mongo"];
  C-->D["[PRE-PROD] Import base de donnée <br />
   docker exec -it mongo mongorestore --gzip --archive=/dump/archive.tgz --drop"];
  D-->E["Démarrage RocketChat version à tester <br /> 
   docker start rocketchat"];
  E-->F{Recette};
  F-->|Bon aux essais|G["Deploiement sur la prod"];
  G-->H["[PROD] Dump base de données<br />
   docker exec mongo mongodump  --gzip --archive=/dump/archive.tgz"];
  H-->I["[PROD] Sauvegarde du docker-compose.yml"];  
  I-->J["[PROD] Actualisation de l'image dans docker-compose.yml<br />
       'image: rocketchat/rocket.chat:3.0.12'"];  
  J-->K["[PROD] Récupération de la nouvelle image<br />
       docker pull 'rocketchat/rocket.chat:3.0.12'"];
  K-->L["[PROD] Redémarrage des services<br />
       docker-compose restart"];  

Trois recettes Ansible sont associées à ce process :

  • Dump et export de la base sur le serveur de préprod.

Le repo gitlab est ici !

Demo Ansible

  • Déploiement d’un environnement rocketchat de préproduction

Le repo gitlab est ici !

Lors du déploiement la sauvegarde la plus récente est automatiquement restaurée.

  • Mise à jour de l’environnement préproduction

Le repo gitlab est ici !

Demo Ansible

Related