Exploring the roots and future of Internet Relay Chat

The Lounge : installer et configurer un client IRC web auto-hébergé

J'ai longtemps considéré les clients IRC web comme des jouets. Puis j'ai installé The Lounge sur un VPS pour un réseau communautaire en 2019, et j'ai changé d'avis. Ce n'est pas un gadget — c'est un client IRC complet qui tourne dans un navigateur, avec persistance des connexions, historique, upload de fichiers et une interface qui ne fait pas honte en 2024.

Pourquoi The Lounge

The Lounge (anciennement Shout, puis The Lounge IRC) est un client IRC web écrit en Node.js. Il fonctionne en mode serveur : vous l'installez sur une machine, vos utilisateurs s'y connectent via un navigateur. Le serveur maintient les connexions IRC actives même quand le navigateur est fermé — comme un bouncer ZNC, mais avec une interface web intégrée.

Concrètement, The Lounge résout trois problèmes :

L'accès depuis n'importe où. Pas besoin d'installer un client. Un navigateur suffit. Cela élimine la friction pour les utilisateurs non-techniques qui veulent rejoindre votre réseau IRC.

La persistance. Votre connexion IRC reste active 24/7. Vous recevez les messages même quand vous n'êtes pas connecté au web. Quand vous revenez, l'historique est là. C'est le comportement d'un bouncer, sans la complexité de configurer ZNC + un client séparé.

L'administration centralisée. Si vous gérez un réseau IRC et que vous voulez offrir un accès web à vos utilisateurs, The Lounge vous donne un point d'entrée unique. Vous contrôlez les comptes, les réseaux autorisés, les paramètres par défaut.

Installation sur Debian/Ubuntu

The Lounge nécessite Node.js 18 ou supérieur. Voici l'installation propre sur Debian 12 / Ubuntu 22.04+ :

# Installer Node.js 20 LTS via NodeSource
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash -
sudo apt install -y nodejs

# Vérifier
node --version   # v20.x.x
npm --version    # 10.x.x

# Installer The Lounge globalement
sudo npm install -g thelounge

# Créer l'utilisateur système
sudo useradd --system --home /opt/thelounge --shell /usr/sbin/nologin thelounge
sudo mkdir -p /opt/thelounge
sudo chown thelounge:thelounge /opt/thelounge

# Premier lancement pour générer la config
sudo -u thelounge env HOME=/opt/thelounge thelounge start
# Ctrl+C après le démarrage

Le fichier de configuration principal se trouve dans /opt/thelounge/.thelounge/config.js (ou config.json selon la version).

Pour gérer The Lounge comme un service systemd :

# /etc/systemd/system/thelounge.service
[Unit]
Description=The Lounge IRC Client
After=network.target

[Service]
Type=simple
User=thelounge
Group=thelounge
ExecStart=/usr/bin/thelounge start
WorkingDirectory=/opt/thelounge
Environment=HOME=/opt/thelounge
Restart=on-failure
RestartSec=5

# Sécurité
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/thelounge
PrivateTmp=true

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now thelounge
sudo systemctl status thelounge
Conseil : Si vous utilisez Debian 12, le paquet nodejs du dépôt par défaut est en version 18 — suffisant pour The Lounge. Vous pouvez éviter NodeSource et installer directement via apt install nodejs npm.

Configuration de base

Le fichier config.js contrôle le comportement global. Voici les paramètres que je modifie systématiquement :

module.exports = {
    // Mode : "public" (accès anonyme) ou "private" (comptes requis)
    public: false,

    // Port d'écoute (on mettra un reverse proxy devant)
    port: 9000,
    bind: "127.0.0.1",  // N'écouter que sur localhost

    // Reverse proxy : activer si derrière Nginx
    reverseProxy: true,

    // Historique : nombre de messages gardés par canal
    maxHistory: 10000,

    // Thème par défaut
    theme: "default",

    // Upload de fichiers
    fileUpload: {
        enable: true,
        maxFileSize: 10240,  // Ko
        baseUrl: null,  // Utilise l'URL de The Lounge
    },

    // Préfixes de liens (pour les intégrations)
    prefetch: true,
    prefetchStorage: true,
    prefetchMaxImageSize: 2048,

    // Réseaux par défaut proposés aux nouveaux utilisateurs
    defaults: {
        name: "MonReseau",
        host: "irc.example.net",
        port: 6697,
        tls: true,
        rejectUnauthorized: true,
        nick: "web_%%",
        username: "thelounge",
        realname: "The Lounge User",
        join: "#accueil"
    }
};

Le mode public: false est ce que vous voulez dans 95% des cas. En mode public, n'importe qui peut se connecter sans compte — utile pour un widget d'accès IRC sur un site web, mais un cauchemar à modérer.

Créer un utilisateur :

sudo -u thelounge env HOME=/opt/thelounge thelounge add monuser
# Saisir le mot de passe quand demandé

Lister les utilisateurs :

sudo -u thelounge env HOME=/opt/thelounge thelounge list

Réinitialiser un mot de passe :

sudo -u thelounge env HOME=/opt/thelounge thelounge reset monuser

Reverse proxy Nginx avec TLS

The Lounge écoute en HTTP sur un port local. En production, vous le placez derrière Nginx avec un certificat TLS. Voici la configuration Nginx :

server {
    listen 443 ssl http2;
    server_name irc.example.net;

    ssl_certificate /etc/letsencrypt/live/irc.example.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/irc.example.net/privkey.pem;

    # Headers de sécurité
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options DENY;
    add_header Referrer-Policy strict-origin-when-cross-origin;

    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Timeouts pour WebSocket
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }
}

server {
    listen 80;
    server_name irc.example.net;
    return 301 https://$server_name$request_uri;
}

Les en-têtes Upgrade et Connection sont indispensables : The Lounge utilise WebSocket pour la communication en temps réel. Sans ces en-têtes, la connexion tombera en polling HTTP, ce qui dégrade les performances et la réactivité.

Attention : Le proxy_read_timeout par défaut de Nginx est de 60 secondes. Si vous ne l'augmentez pas, les connexions WebSocket seront coupées après une minute d'inactivité. Réglez-le à 86400 secondes (24h) minimum.

Gestion des utilisateurs et LDAP

En mode privé, The Lounge gère ses utilisateurs via des fichiers JSON dans /opt/thelounge/.thelounge/users/. Chaque utilisateur a son fichier : monuser.json contient le hash du mot de passe, les réseaux configurés, les préférences.

Pour les organisations qui ont un annuaire LDAP ou Active Directory, il existe un plugin d'authentification :

# Installation du plugin LDAP
sudo -u thelounge env HOME=/opt/thelounge \
  thelounge install thelounge-plugin-auth-ldap

# Redémarrer The Lounge
sudo systemctl restart thelounge

Configuration LDAP dans config.js :

module.exports = {
    // ...
    ldap: {
        enable: true,
        url: "ldaps://ldap.example.net:636",
        primaryKey: "uid",
        baseDN: "ou=users,dc=example,dc=net",
        // Filtre optionnel pour limiter les accès
        filter: "(memberOf=cn=irc-users,ou=groups,dc=example,dc=net)"
    }
};

Avec LDAP activé, les utilisateurs s'authentifient avec leurs identifiants d'annuaire. The Lounge crée automatiquement le fichier utilisateur local lors de la première connexion. Les réseaux IRC et préférences sont stockés localement — seule l'authentification passe par LDAP.

Un point à surveiller : si le serveur LDAP est injoignable, personne ne peut se connecter. Prévoyez un compte local de secours (administrateur) pour ne pas vous retrouver bloqué.

Personnalisation et thèmes

The Lounge supporte les thèmes CSS via des paquets npm. Pour installer un thème :

# Lister les thèmes disponibles
npm search thelounge-theme

# Installer un thème
sudo -u thelounge env HOME=/opt/thelounge \
  thelounge install thelounge-theme-nord

# Modifier le thème par défaut dans config.js
theme: "thelounge-theme-nord"

Si vous voulez créer votre propre thème, The Lounge expose des variables CSS que vous pouvez surcharger :

/* custom-theme.css */
:root {
    --body-bg: #1a1b26;
    --body-color: #c0caf5;
    --link-color: #7aa2f7;
    --highlight-bg: #292e42;
    --unread-marker-color: #ff9e64;
    --button-color: #7aa2f7;
    --window-bg: #1a1b26;
    --sidebar-bg: #16161e;
}

Côté fonctionnalités, The Lounge offre l'aperçu des liens (preview avec image et titre), le support du Markdown partiel dans les messages, l'upload de fichiers via drag-and-drop, et les notifications push via le navigateur. Pour les notifications push sur mobile, il faut que le site soit servi en HTTPS — une raison de plus pour le reverse proxy TLS.

Mise en production et maintenance

Quelques recommandations tirées de l'exploitation de The Lounge sur plusieurs réseaux :

Sauvegardes. Les données utilisateur sont dans /opt/thelounge/.thelounge/. Sauvegardez ce répertoire régulièrement. Les fichiers sont du JSON — faciles à versionner ou à restaurer.

# Backup simple avec rsync
rsync -a /opt/thelounge/.thelounge/ /backup/thelounge/$(date +%Y%m%d)/

# Ou avec tar
tar czf /backup/thelounge-$(date +%Y%m%d).tar.gz \
  -C /opt/thelounge .thelounge/

Mises à jour. Les mises à jour de The Lounge passent par npm :

sudo npm update -g thelounge
sudo systemctl restart thelounge

Lisez les notes de version avant de mettre à jour — les changements de format de configuration arrivent parfois entre versions majeures.

Monitoring. The Lounge n'expose pas de métriques Prometheus nativement. Pour surveiller le service, vérifiez que le port répond :

# Health check basique
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:9000/
# Doit retourner 200

Logs. Par défaut, The Lounge log dans stdout/stderr, capturé par journald via systemd. Pour consulter les logs :

journalctl -u thelounge -f          # Temps réel
journalctl -u thelounge --since today # Aujourd'hui

Limites. The Lounge consomme environ 50-100 Mo de RAM par instance avec quelques utilisateurs. Si vous prévoyez 50+ utilisateurs simultanés, surveillez la mémoire et ajustez la limite dans le fichier systemd avec MemoryMax=512M. Au-delà de 100 utilisateurs, testez sous charge avant de déployer.

Conseil : Ajoutez "prefetchMaxSearchSize": 0 dans la config si vous voulez désactiver la recherche dans l'historique côté serveur. Sur les grosses instances, cette recherche peut consommer du CPU.

Questions fréquentes

The Lounge remplace-t-il ZNC ?

Partiellement. The Lounge fait office de bouncer (connexion persistante) ET de client web. Si vous utilisez ZNC uniquement pour la persistance et que vous êtes satisfait d'une interface web, The Lounge remplace les deux. Si vous préférez un client natif (WeeChat, HexChat) avec un bouncer derrière, gardez ZNC.

Peut-on utiliser The Lounge en mode public pour un widget web ?

Oui, c'est un cas d'usage valide. Réglez public: true et configurez le réseau par défaut avec un canal d'accueil. Attention à la modération : en mode public, n'importe qui peut se connecter. Mettez en place des limites de débit côté serveur IRC et surveillez les abus.

Comment migrer les données d'une instance à une autre ?

Copiez l'intégralité du dossier .thelounge/ vers la nouvelle machine. Installez la même version de The Lounge (ou une version supérieure — la migration ascendante fonctionne). Redémarrez le service. Les comptes utilisateur, réseaux et historiques sont préservés.

The Lounge supporte-t-il IRCv3 ?

Oui, partiellement. Le support inclut SASL, server-time, echo-message, cap-notify, et d'autres capacités. Le projet suit l'évolution d'IRCv3 et ajoute le support au fil des versions. Consultez le changelog pour les détails de votre version.