Installer Zulip avec un reverse proxy NGINX
Zulip est une application de messagerie qu’on pourrait assimiler à Slack ou Microsoft Teams. Bien que par défaut, l’équipe de développement encourage à utiliser son service centralisé, il est possible d’auto-héberger sa propre instance Zulip. À noter que Zulip n’est pas du tout un réseau fédéré.
Containérisation & sécurité
Cette section part du principe que vous utilisez un environnement debian ou ubuntu sur lequel docker n’est pas installé. L’installation d’un serveur Zulip est pour le moins… opaque. Oui, l’installeur est censé affiché toutes les étapes de son exécution, mais 1) comment vérifier que c’est bien le cas, autrement qu’en lisant entièrement le script? 2) parfois les infos s’affichent vite, ce qui peut rendre assez ardu de suivre tout ce qui se passe. Pour palier à ce problème, une solution très simple est de le faire tourner dans un conteneur LXC. À défaut d’être aussi sécurisé qu’une VM, ça nous permettra au moins de relativement isoler le système, et d’éviter que l’installation de Zulip casse quoique ce soit sur notre serveur. Pour la gestion du LXC, on va simplifier ça avec LXD, qui permet d’automatiser quelques tâches pour nous.
Installation de LXD
On installe :
sudo apt install lxd
On lance la configuration de LXD (un prompt va nous poser quelques questions) :
sudo lxd init
Et enfin, on ajoute les droits LXD à notre utilisateur, pour ne pas avoir à passer en root à chaque fois qu’on veut interagir avec nos conteneurs :
sudo adduser utilisateur lxd
Création du conteneur
Pour Zulip, on peut se lancer sur une debian toute simple.
lxc launch images:debian/trixie MonConteneur
On peut lister les différents conteneurs créés et voir leurs adresses ip à l’aide de la commande lxc list. On va noter l’adresse IP de notre conteneur pour plus tard. S’il manque des IPs fonctionnelles à notre conteneur, on procède comme indiqué dans le point suivant.
Si le réseau ne passe pas
Il arrive parfois que la configuration du pare-feu empêche LXD d’ajouter les conteneurs au réseau qu’il aura créé. Pour régler ça, on va mettre à jour notre pare-feu, et ça devrait être bon. Ici, je vais utiliser les règles proposées dans la documentation d’Ubuntu, qui conviennent très bien dans notre cas.
# permet au conteneur d’obtenir une IP de la part de l’hôte
sudo ufw allow in on lxdbr0 to any port 67 proto udp
sudo ufw allow in on lxdbr0 to any port 547 proto udp
# permet au conteneur d’utiliser la résolution DNS de l’hôte
sudo ufw allow in on lxdbr0 to any port 53
# permet au conteneur d’avoir accès aux connexions sortantes
CIDR4="$(lxc network get lxdbr0 ipv4.address | sed 's|\.[0-9]\+/|.0/|')"
CIDR6="$(lxc network get lxdbr0 ipv6.address | sed 's|:[0-9]\+/|:/|')"
sudo ufw route allow in on lxdbr0 from "${CIDR4}"
sudo ufw route allow in on lxdbr0 from "${CIDR6}"
Agir dans le conteneur
Pour passer des commandes au conteneur, on utilisera la commande suivante :
lxc exec MonConteneur -- la commande
Si on a besoin d’entrer dans l’environnement, ça suit la même logique :
lxc exec MonConteneur -- /bin/bash
Installation de Zulip
Téléchargement
Pour la suite, on va se baser sur la documentation de Zulip, pour installer l’instance de manière standard. Mais avant tout, on va rentrer dans l’environnement en root avec la commande renseignée précédemment, lxc exec MonConteneur -- /bin/bash. Ensuite on se contente de suivre ce que nous dit la documentation.
Téléchargement de la dernière version en date.
cd $(mktemp -d)
curl -fLO https://download.zulip.com/server/zulip-server-latest.tar.gz
On vérifie le sha256sum.
sha256sum zulip-server-latest.tar.gz
Si tout est bon, on extrait le tout.
tar -xf zulip-server-latest.tar.gz
L’installation en elle-même
On va faire tourner l’installeur avec les arguments qui nous concernent. Dans notre cas, on veut les notifications push, accepter les TOS automatiquement, refuser d’envoyer les statistiques d’utilisation, pas de certificat SSL parce qu’on est derrière un proxy, et évidemment le hostname et l’adresse mail de contact qu’il faut obligatoirement indiquer.
./zulip-server-*/scripts/setup install --push-notifications --agree-to-terms-of-service --no-submit-usage-statistics --hostname exemple.fr --email=contact@exemple.fr
L’installeur va tourner tout seul, et créer un utilisateur zulip, qui fera tourner l’instance. Une fois l’installation finie, il nous fournira un lien à usage unique, permettant de créer l’organisation de notre instance. À ce stade, le lien ne sera pas fonctionnel, donc on le met de côté, pour ne pas le perdre.
Création du reverse proxy
On va créer un fichier de configuration nginx, puis certbot pour installer un certificat SSL.
sudo vim /etc/nginx/sites-available/zulip
Et on remplit comme suit, en utilisant la documentation pour les reverse proxies :
server {
listen 80;
listen [::]:80;
server_name exemple.fr
location /.well-known/acme-challenge/ { allow all; }
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_buffering off;
proxy_read_timeout 20m;
proxy_pass http:/X.X.X.X:80;
}
}
On active le tout avec un lien symbolique :
sudo ln -s /etc/nginx/sites-available/zulip /etc/nginx/sites-enabled/zulip
Et on relance nginx :
sudo systemctl restart nginx
Si tout va bien, on va pouvoir passer à la certification :
sudo certbot --nginx -d exemple.fr
On vérifie qu’il ne reste pas un port 80 inutilement ouvert dans la config nginx. Sinon, on édite et on relance nginx à nouveau. Désormais, notre instance est normalement accessible sur le web.
Configurer les mails sortants
Avant de créer notre organisation, je vous conseille de passer par cette étape, pour que tout fonctionne au mieux.
En premier lieu, on va éditer /etc/zulip/settings.py, et s’assurer de configurer le serveur SMTP. On s’assure d’éditer les lignes suivantes :
EMAIL_HOST = "smtp.fournisseurmail.fr"
EMAIL_HOST_USER = "utilisateur@fournisseurmail.fr"
[…]
EMAIL_USE_TLS = TRUE
EMAIL_PORT = 587
[…]
TOKENIZED_NOREPLY_EMAIL_ADDRESS = "nepasrepondre+{token}@exemple.fr"
[…]
INSTALLATION_NAME = "Exemple"
On vérifier si les mails fonctionne bien en faisant tourner la commande suivante. Normalement on devrait obtenir un mail de la part de contact@exemple.fr et un autre de nepasrepondre+{token}@exemple.fr. Si ça tombe dans les spams, il faudra bidouiller de votre côté, je n’ai pas eu ce problème.
su zulip -c '/home/zulip/deployments/current/manage.py send_test_email monadressemailperso@monfournisseurmail.fr'
Dernière ligne droite
On peut enfin cliquer sur le lien que nous a donné l’installeur ! On le ressort de nos notes, on clique dessus, et on suit les différentes étapes proposées. Félicitations, notre Zulip est désormais fonctionnel !
Si t’as apprécié ce post, envoie-moi une disquette.