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
docker exec mongo mongodump --archive=/dump/archive.json --gzip
"]-->B["[PROD] Export vers pre-prod
scp -i ~/.ssh/id_backup archive.tgz backup@dev.redteams:/home/backup"]; B-->C["[PRE-PROD] Démarrage mongodb
docker start mongo"]; C-->D["[PRE-PROD] Import base de donnée
docker exec -it mongo mongorestore --gzip --archive=/dump/archive.tgz --drop"]; D-->E["Démarrage RocketChat version à tester
docker start rocketchat"]; E-->F{Recette}; F-->|Bon aux essais|G["Deploiement sur la prod"]; G-->H["[PROD] Dump base de données
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
'image: rocketchat/rocket.chat:3.0.12'"]; J-->K["[PROD] Récupération de la nouvelle image
docker pull 'rocketchat/rocket.chat:3.0.12'"]; K-->L["[PROD] Redémarrage des services
docker-compose restart"];
docker exec mongo mongodump --archive=/dump/archive.json --gzip
"]-->B["[PROD] Export vers pre-prod
scp -i ~/.ssh/id_backup archive.tgz backup@dev.redteams:/home/backup"]; B-->C["[PRE-PROD] Démarrage mongodb
docker start mongo"]; C-->D["[PRE-PROD] Import base de donnée
docker exec -it mongo mongorestore --gzip --archive=/dump/archive.tgz --drop"]; D-->E["Démarrage RocketChat version à tester
docker start rocketchat"]; E-->F{Recette}; F-->|Bon aux essais|G["Deploiement sur la prod"]; G-->H["[PROD] Dump base de données
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
'image: rocketchat/rocket.chat:3.0.12'"]; J-->K["[PROD] Récupération de la nouvelle image
docker pull 'rocketchat/rocket.chat:3.0.12'"]; K-->L["[PROD] Redémarrage des services
docker-compose restart"];
Trois recettes Ansible sont associées à ce process :
- Dump et export de la base sur le serveur de préprod.
- Déploiement d’un environnement rocketchat de préproduction
Lors du déploiement la sauvegarde la plus récente est automatiquement restaurée.
- Mise à jour de l’environnement préproduction