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
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é.
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.
"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.