IRC est un protocole de communication qui a récemment soufflé ses bougies pour son 30ème anniversaire. Apparu en août 1988 avec la RFC 1459, il est de moins en moins utilisé au profit d’outils plus polyvalents tels que Slack ou Discord. Mais les plus fervent utilisateurs d’IRC s’adaptent pour continuer d’utiliser le protocole historique …

IRC xkcd

L’objectif que nous allons essayer d’atteindre est de faire tourner avec Docker l’application Glowing Bear, une interface Web pour le client IRC WeeChat. Pour cela, nous utiliserons le dépôt officiel de Nginx et nous créerons une image pour WeeChat.

La première chose à faire est bien sûr d’installer Docker. Je vais également utiliser dans cet article Docker Compose. Cela facilite la gestion des applications Docker lorsqu’on utilise de multiples conteneurs.

Le conteneur WeeChat

Ce conteneur sera dédié au client IRC. Basé sur Alpine, il embarquera WeeChat avec un utilisateur dédié.

Une image Docker pour WeeChat

Il n’existe pas de dépôt officiel pour WeeChat. Afin de ne pas dépendre d’une tierce personne sur Internet, nous allons créer une image Docker dans laquelle nous allons installer et configurer le client IRC. Pour créer une image Docker, il faut utiliser un fichier Dockerfile dans lequel nous précisons les opérations à réaliser pour construire l’image. Pour plus de détails, je vous laisse aller jeter un œil à la documentation Dockerfile.

  1. Nous partons de l’image officielle d’Alpine ;
  2. Installation des paquets weechat, python et bash, puis suppression du cache ;
  3. Changement de la valeur de la variable globale LANG pour C.UTF8 (Préférences globales) ;
  4. Changement de la valeur de la variable globale HOME pour /weechat ;
  5. Création de l’utilisateur weechat avec l’uid 1000 et du groupe weechat avec le gid 1000 ;
  6. Création d’un point de montage pour le répertoire /weechat/.weechat ;
  7. Le répertoire de travail sera /weechat ;
  8. Le compte utilisé pour exécuter le conteneur sera weechat ;
  9. Le conteneur écoutera sur le port 9001 ;
  10. Au lancement du conteneur, la commande weechat sera exécutée.

Ensuite, il nous suffit de construire notre image avec la commande docker build (attention de ne pas oublier le point à la fin de la commande) :

Console

debian:~$ docker build -t vonkrafft/weechat:latest .
Successfully built 226da8c3ad94
Successfully tagged vonkrafft/weechat:latest
debian:~$ docker image ls
REPOSITORY             TAG           IMAGE ID            SIZE
vonkrafft/weechat      latest        226da8c3ad94        54.3MB

Préparer l’hôte pour accueillir le conteneur

À ce stade, nous disposons d’une image Docker pour notre client IRC. Il nous faut à présent créer le conteneur WeeChat qui utilisera cette image. Pour cela, nous utiliserons Docker Compose. Tout d’abord, il nous faut un utilisateur non privilégié sur l’hôte pour faire tourner le conteneur.

Console

debian:~$ groupadd -g 1000 weechat 
debian:~$ useradd -u 1000 -M -p '*' -s /bin/false -g 1000 weechat

Nous allons également avoir besoin d’un répertoire de travail. Pour ma part, j’aime bien avoir toutes les données relatives à Docker dans une répertoire /docker, mais libre à vous de stocker vos données où cela vous arrange. Dans notre répertoire de travail, nous allons stocker les fichiers de configuration et de journalisation de WeeChat.

Console

debian:~$ mkdir -p /docker/web-irc/weechat
debian:~$ chown 1000:1000 /docker/web-irc/weechat

Configurer et exécuter WeeChat

Console

debian:~$ ls -lh /docker/web-irc/
drwxr-xr-x 2 weechat weechat 4.0K Sep 29 11:29 weechat
debian:~$ docker run --rm -it -v "/docker/web-irc/weechat:/weechat/.weechat" vonkrafft/weechat:latest weechat

Si tout fonctionne (notamment vis-à-vis des permissions sur les répertoires partagés), vous devriez avoir accès à l’IHM de WeeChat en ligne de commande. C’est la seule fois où vous aurez besoin d’accéder à WeeChat via le terminal.

WeeChat en ligne de commande

Cet accès temporaire à WeeChat en ligne de commande va nous permettre de configurer le relais de WeeChat via le port 9001. Si vous souhaitez plus de détail, je vous invite à regarder la documentation sur le protocole WeeChat Relay.

WeeChat

/relay add weechat 9001
/set relay.network.password mon_super_mot_de_passe
/exit

Lorsque nous quittons WeeChat, le terminal va se fermer automatiquement et le conteneur WeeChat va être détruit car nous avions lancé ce conteneur avec l’option --rm (Clean-up). Pas d’inquiétude, la configuration sera persistante dans le dossier /docker/web-irc/weechat (un ls peut vous aider à vous en convaincre).

Le docker Nginx

Nous allons utiliser l’image officielle de Nginx, dans sa version stable sur Alpine. Le choix de la version est personnel, vous pouvez utiliser la version mainline ou bien vous baser sur Debian selon vos préférences.

Les répertoires partagés

Dans notre répertoire de travail, nous allons stocker le contenu du site Web, les fichiers de journalisation du serveur Nginx, ainsi que notre fichier de configuration Nginx default.conf.

Console

debian:~$ cd /docker
debian:~$ mkdir -p web-irc/log
debian:~$ touch web-irc/log/access.log web-irc/log/error.log
debian:~$ chmod a+rw web-irc/log/*

Les fichiers de journalisation doivent être accessibles en lecture et en écriture par le conteneur Nginx. Alors certes, un a+rw n’est pas très propre, mais c’est la meilleure solution que j’ai actuellement (n’hésitez pas à m’en suggérer d’autres).

Le fichier de configuration

Ensuite, il nous faut un fichier de configuration. Nous indiquons le port en écoute, le nom de domaine, le chemin des fichiers de journalisation et du code source. Il nous faut aussi préciser la redirection vers le relais WeeChat.

Le code source

Il nous faut à présent télécharger le code source de Glowing Bear. Vous pouvez télécharger l’archive ZIP et la décompresser dans /docker/web-irc/www, ou alors utiliser Git pour cloner le dépôt (dans ce cas là, pensez à supprimer ou à restreindre l’accès au répertoire .git).

Console

debian:~$ git clone https://github.com/glowing-bear/glowing-bear.git /docker/web-irc/www
debian:~$ rm -r /docker/web-irc/www/.git

Finaliser les conteneurs

Maintenant que notre image WeeChat est prête, que nos répertoires partagés sont créés et configurés et que notre fichier de configuration Nginx est terminé, nous pouvons lancer les deux conteneurs qui nous permettront d’avoir une IHM Web pour notre client IRC. Nous pouvons donc rédiger le fichier docker-compose.yml qui nous permettra de gérer nos conteneurs. À noter que nous utiliserons l’option tty pour le conteneur WeeChat car le client IRC a besoin d’un terminal pour s’exécuter.

Pour terminer, la commande docker-compose up -d va créer et lancer les conteneurs. Si tous se passe bien, vous devriez donc avoir deux conteneur en cours d’exécution et le conteneur Nginx devrait exposer le port TCP/80 vous permettant d’accéder à l’URL http://irc.docker.local/.

Glowing Bear authentication form

Et voilà, votre interface Web pour IRC est en place. Pour vous authentifier, utilisez l’adresse irc.docker.local (le hostname du serveur sur lequel le conteneur Nginx est lancé) avec le port 80 (ou 443 si vous avez mis en place le HTTPS) et le mot de passe défini plus haut (dans mon cas mon_super_mot_de_passe).

Glowing Bear interface

Sources

  1. Official build of Nginx (EN)
  2. Docker Documentation (EN)
  3. WeeChat Documentation (EN, FR et autres)
  4. Monter une passerelle de communication IRC/WeeChat/Glowing Bear/Bitlbee (FR)