Mattermost
Avant Upgrade
- https://docs.mattermost.com/upgrade/important-upgrade-notes.html
Ligne de commande mmctl
Supprimer une Équipe
- Faire une sauvegarde du fichier
config.json - Activer la configuration expérimental
EnableAPITeamDeletiondefalseàtrue - Redémarrer le service
Se connecter avec le compte admin :
sudo -u mt_tchat_opteos ./bin/mmctl --config ./config/config.json auth login https://chat-opteos.paquerette.eu
Supprimer l'équipe concerné :
sudo -u mt_tchat_opteos ./bin/mmctl --config ./config/config.json auth login https://chat-opteos.paquerette.eu
Migrer depuis RocketChat
Les information sont dans le README du dépot
import de la base de données de rocketchat dans mongo
mongorestore --gzip --archive=2024-04-16T03\:23\:15Z_rs0.dump.gz
Exporter les données au bon format.
Il existe un projet (mattermost-etl-rocketchat pour extraire d'une base de donnée RocketChat les données et les mettre au format mattermost
Troobleshooting
le projet ne supporte que l'export de fichier depuis le filesystem ou gridFS, pas S3. À voir s'il ne faut pas le migrer.
Utilisation du repo filestore-migrator
Ce repo permet de migrer d'un stockage vers un autre via le fichier de conf suivant :
database:
connectionString: "mongodb://localhost:27017/rockethat?directConnection=true&authSource=admin"
database: "rocketchat"
source:
type: "AmazonS3"
AmazonS3:
endpoint: "hot-objects.liiib.re"
bucket: "chat-opteos-fr"
accessId: "ACCESS_ID"
accessKey: "ACCESS_KEY"
region: ""
useSSL: true
destination:
type: FileSystem
FileSystem:
location: "./files"
skipErrors: true
## Modification du projet
Attention, le projet à 2 ans et n'a pas forcément été largement testé, il y a donc des modifications à faire :
### Avant l'export
#### L'objet `user` ne doit pas avoir de `auth_data` si `auth_services` est nul
ajouter dans le fichier `lib/rocketchat/users.js`
if (user.auth_service == "") { delete user.auth_data }
#### les `username` doivent être lowercase
ajouter dans le fichier `lib/rocketchat/users.js`
```diff
- result.username,
+ result.username.toLowerCase(),
!! TODO !!! remplacer dans les messages et directs channels aussi
ou à postériori
# changer les username
sed -i 's/"username":"\(.*\)","first/"username":"\L\1","first/g' data.jsonl
# changer dans les message
sed -i 's/"members":\["\(.*\)"\]\}\}/"members":\["\L\1"\]\}\}/g' test.jsonl
# et là
sed -i 's/"user":"\(.*\)","create/"user":"\L\1"create/g' data2.jsonl
sed -i 's/members":\["\(.*\)"\],"user/members":\["\L\1"\],"user/g' data2.jsonl
sed -i 's/"user":"\(.*\)","create/"user":"\L\1","create/g' data2.jsonl
un Header de canal ne peut contenir plus de 1024 caractères
ajouter dans le fichier lib/rocketchat/channls.js
- result.topic,
+ result.topic.substring(0,1024)
Après l'export
Un canal ne doit pas commencer par un -
sed -i 's/"-/"0/g' data.jsonl
Les images de profil ne fonctionnent pas, on les supprime
sed -i 's#,"profile_image":".*"##g'
Mettre le dossier d'upload au bon endroit ou changer le chemin :
sed -i 's#./files#/tmp/rocketchat/files#g' data.jsonl
Un user a plusieurs channels de temps en temps
TODO
Importer dans Mattermost
- Bien penser à réhausser la limite d'utilisateurs par équipe
Mattermost est capable de faire des import bulk. Pour ça, il faut activer le mode local executer les commandes suivantes :
sudo -u USER_MATTERMOST ./mmctl import upload --local ARCHIVE.ZIP
# Upload session successfully created, ID: 3jbgyxie9ir1iydf43xgc6gq6a
# récupérer l'ID
sudo -u USER_MATTERMOST ./mmctl import --local process "ID_data.zip"
# Vérifier que tout se passe bien
sudo -u mt_tchat_test_paq ./mmctl import job show --local
Procédure depuis un dump mongo
(spécifique) Récupérér de dump chez indyhosters
- installer le client mc de minio.
- configurer un alias de connection :
mc alias set NOM_ALIAS https://cold-objects.liiib.re ACCESS_KEY SECRET_KEY
- copier le dump sur la machine
mc cp NOM_ALIAS/opteos-fr-dumps/mongodb/NOM_DU_DUMP.dump.gz .
Importer le dump dans mongo
mongorestore mongorestore --archive="NOM_DU_DUMP.dump.gz" --gzip
Créer un utilisateur
#mongosh
db.createUser(
{
user: "etl_user",
pwd: passwordPrompt(), // or cleartext password
roles: [ { role: "read", db: "rocketchat" },]
}
)
Jouer avec la base de données :
Récupérer l'id d'une équipe
select id from teams where name='NAME' ;
Récupérer les canaux d'une équipe
select id from channels where teamid='ID' ;
Récupérer l'id d'un utilisateurs
select id from users where username='USERNAME';
Sélectionner les posts d'un utilisateur dans une équipe
select * from posts where userid='USERID' and channelid in (select id from channels where teamid='TEAMID');
Changer l'utilisateur des messages dans une équipe
update posts set userid='NEW_USERID' where userid='OLD_USER_ID' and channelid in (select id from channels where teamid='TEAM_ID');
Focalboard
Restauration d'un board après suppression
Connexion à la base de donnée concerné
su - postgres
psql
\c MABASE
Récupération de l'ID du board et le numéro (temps ?) de suppression (delete_at)
SELECT id, title, delete_at FROM focalboard_boards_history WHERE delete_at > 0;
Re-création du board
INSERT INTO focalboard_boards SELECT * FROM focalboard_boards_history WHERE id = 'BOARD_ID' AND delete_at > 0;
UPDATE focalboard_boards SET delete_at = 0 WHERE id = 'MON_ID';
Restauration des cartes avec leur données
UPDATE focalboard_blocks_history SET channel_id = 0 WHERE board_id = 'BOARD_ID' AND delete_at > TEMPS_SUPPRESSION;
INSERT INTO focalboard_blocks SELECT * FROM focalboard_blocks_history WHERE board_id = 'BOARD_ID' AND delete_at > TEMPS_SUPPRESSION;
UPDATE focalboard_blocks SET delete_at = 0 WHERE board_id = 'BOARD_ID' AND delete_at > TEMPS_SUPPRESSION;