Pendant vingt ans, déployer un serveur IRC signifiait compiler du C, configurer Anope ou Atheme pour les services, mettre en place une base de données pour la persistance, et prier pour que le tout tienne ensemble. Quand j'ai découvert Ergo — anciennement Oragono — en 2019, j'ai d'abord cru à une blague. Un seul binaire Go qui fait serveur IRC ET services, avec historique persistant, support IRCv3 complet, et une configuration YAML lisible par un humain ? Il y avait forcément un piège. Après cinq ans d'utilisation, je n'ai pas trouvé le piège.
Pourquoi Ergo change la donne
Le problème historique des serveurs IRC, c'est la complexité du déploiement. Un setup classique avec UnrealIRCd ou InspIRCd nécessite : le serveur IRC lui-même, un package de services (Anope, Atheme) pour NickServ/ChanServ, une base de données (SQLite au minimum, MySQL/PostgreSQL pour la production), et la configuration du lien entre le serveur et les services. Quatre composants, quatre configurations, quatre points de défaillance.
Ergo fusionne tout ça dans un seul programme. NickServ, ChanServ, HostServ — ils sont intégrés. L'historique des messages est stocké nativement. Les comptes utilisateurs sont gérés en interne. Vous téléchargez un binaire, vous éditez un fichier YAML, vous lancez. Votre serveur IRC est opérationnel en cinq minutes, services inclus.
Le choix de Go comme langage n'est pas anodin. Go produit des binaires statiques sans dépendance. Pas de libssl.so manquante, pas de version de glibc incompatible, pas de ./configure qui échoue parce qu'un header est dans /usr/local/include au lieu de /usr/include. Vous copiez le binaire sur le serveur et il marche. Après des années de compilation manuelle de serveurs IRC en C, cette simplicité est un soulagement physique.
Architecture : un binaire, zéro dépendance
Ergo est un programme Go unique qui intègre :
ergo (binaire unique)
├── Serveur IRC (RFC 1459 + RFC 2812)
├── Services intégrés
│ ├── NickServ (comptes utilisateurs)
│ ├── ChanServ (enregistrement channels)
│ └── HostServ (cloaking)
├── Historique des messages (SQLite ou mémoire)
├── Bouncer intégré (always-on clients)
├── WebSocket (pour les clients web)
└── Support IRCv3 étendu
La base de données interne utilise BuntDB, un key-value store embarqué en Go, pour les données de configuration (comptes, channels). L'historique des messages peut être stocké en mémoire (volatile) ou dans une base SQLite (persistant). Pour un réseau de taille moyenne — quelques centaines d'utilisateurs — les performances sont excellentes sans aucun tuning.
Le bouncer intégré est une fonctionnalité que je n'ai vue nulle part ailleurs dans un serveur IRC. Quand un utilisateur se déconnecte, Ergo peut maintenir sa présence dans les channels (mode "always-on"). Quand il se reconnecte, il reçoit les messages manqués. C'est le comportement de Discord ou Slack, mais implémenté au niveau du serveur IRC. Plus besoin de ZNC ou de WeeChat en mode relay.
Installation en 5 minutes
L'installation d'Ergo est volontairement simple. Téléchargez le binaire depuis GitHub, extrayez-le, et initialisez la configuration :
# Téléchargement de la dernière version
wget https://github.com/ergochat/ergo/releases/download/v2.13.1/ergo-2.13.1-linux-x86_64.tar.gz
tar xzf ergo-2.13.1-linux-x86_64.tar.gz
cd ergo-2.13.1-linux-x86_64
# Initialisation de la configuration par défaut
./ergo initdb
./ergo mkcerts
# La configuration par défaut est dans ircd.yaml
# Éditez-la selon vos besoins
nano ircd.yaml
# Lancement
./ergo run
C'est tout. Le initdb crée la base de données interne. Le mkcerts génère des certificats TLS auto-signés (remplacez-les par des certificats Let's Encrypt en production). Le run lance le serveur au premier plan. Votre serveur écoute sur les ports 6667 (plaintext) et 6697 (TLS).
ergo.service d'exemple dans sa distribution. Copiez-le dans /etc/systemd/system/, ajustez les chemins, et activez-le avec systemctl enable ergo.# Service systemd pour Ergo
[Unit]
Description=Ergo IRCd
After=network.target
[Service]
Type=simple
User=ergo
Group=ergo
WorkingDirectory=/opt/ergo
ExecStart=/opt/ergo/ergo run
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
Le LimitNOFILE=65535 est là pour augmenter la limite de descripteurs de fichiers. Chaque connexion IRC consomme un descripteur. La limite par défaut de 1024 sur beaucoup de distributions Linux serait atteinte avec quelques centaines d'utilisateurs.
Les services intégrés
Les services d'Ergo fonctionnent comme les services traditionnels d'IRC, mais sans la complexité d'un lien serveur-services. Les commandes sont familières pour quiconque a utilisé Anope ou Atheme :
; Enregistrer un compte
/msg NickServ REGISTER motdepasse email@example.com
; S'identifier
/msg NickServ IDENTIFY motdepasse
; Enregistrer un channel
/msg ChanServ REGISTER #moncanal
; Définir un successeur pour le channel
/msg ChanServ AMODE #moncanal +o autre_utilisateur
; Activer le mode always-on (bouncer)
/msg NickServ SET ALWAYS-ON true
; Voir l'historique des messages manqués
/msg NickServ SET AUTO-REPLAY-MISSED true
; Configurer le cloaking
/msg HostServ ON
La différence avec les services traditionnels, c'est que tout est dans le même processus. Il n'y a pas de latence entre le serveur et les services — les commandes sont traitées instantanément. Il n'y a pas de risque de "split" entre le serveur et les services, ce bug classique où les services se déconnectent et les utilisateurs perdent leurs droits de channel.
Le système de comptes d'Ergo supporte SASL (authentification pendant la connexion, avant le join), ce qui signifie que les utilisateurs sont identifiés dès le début de leur session. Plus de course entre le JOIN et le /msg NickServ identify — un problème qui a agacé des millions d'utilisateurs IRC pendant des décennies.
IRCv3 : IRC au XXIe siècle
Ergo est l'un des serveurs IRC les plus avancés en termes de support IRCv3. IRCv3 est un ensemble d'extensions au protocole IRC qui modernisent le protocole sans casser la compatibilité avec les anciens clients.
; Extensions IRCv3 supportées par Ergo (liste partielle)
CAP LS 302
:irc.example.com CAP * LS :account-notify account-tag away-notify
batch cap-notify chghost draft/channel-rename echo-message
extended-join labeled-response message-tags multi-prefix
sasl server-time setname userhost-in-names
draft/chathistory draft/event-playback
Parmi les extensions les plus utiles :
server-time : chaque message est horodaté par le serveur. Les clients modernes (HexChat, The Lounge, Gamja) affichent l'heure exacte d'envoi, pas l'heure de réception. Pour les messages rejoués depuis l'historique, c'est indispensable.
chathistory : permet aux clients de demander l'historique des messages d'un channel. Quand vous rejoignez un channel, votre client peut récupérer les 100 derniers messages automatiquement. C'est le comportement attendu par les utilisateurs qui viennent de Discord ou Slack.
echo-message : le serveur renvoie vos propres messages avec un horodatage. Le client affiche le message après confirmation du serveur, pas avant. Cela garantit que ce que vous voyez est ce que les autres voient.
Configuration avancée
Le fichier ircd.yaml d'Ergo est documenté avec des commentaires détaillés. Voici les sections les plus pertinentes pour un déploiement de production :
# ircd.yaml — Extraits de configuration production
network:
name: MonReseau
server:
name: irc.mondomaine.com
listeners:
":6697":
tls:
cert: /opt/ergo/certs/fullchain.pem
key: /opt/ergo/certs/privkey.pem
min-tls-version: 1.2
":6667": {} # Plaintext — désactivez en production
websocket:
allowed-origins:
- "https://chat.mondomaine.com"
ip-limits:
count: true
max-per-ip: 5
max-per-subnet: 20
accounts:
registration:
enabled: true
allow-before-connect: true
throttling:
enabled: true
duration: 10m
max-attempts: 3
authentication-enabled: true
multiclient:
enabled: true
allowed-by-default: true
always-on: opt-in # Les utilisateurs choisissent
channels:
registration:
enabled: true
default-modes: +ntC
history:
enabled: true
channel-length: 2048 # 2048 derniers messages par channel
client-length: 256 # 256 derniers messages privés
chathistory-maxmessages: 1000
retention:
allow-individual-delete: false
cutoff: 168h # 7 jours
persistent:
enabled: true
unregistered-channels: false
registered-channels: true
direct-messages: true
La section history mérite une attention particulière. L'historique persistant transforme l'expérience IRC — vos utilisateurs retrouvent les conversations quand ils se reconnectent. Le cutoff de 168 heures (7 jours) est un bon compromis entre utilité et stockage. Sur un channel actif avec 100 messages par jour, 7 jours d'historique représentent quelques Mo en base SQLite.
La section multiclient active le bouncer intégré. Un même compte peut être connecté depuis plusieurs appareils simultanément (ordinateur + téléphone), et les messages sont synchronisés entre les sessions. C'est exactement le comportement des messageries modernes, implémenté nativement dans le serveur IRC.
Ergo peut recharger sa configuration à chaud avec un signal HUP : kill -HUP $(pidof ergo). La plupart des paramètres sont appliqués sans redémarrage ni déconnexion des utilisateurs. Les exceptions sont les paramètres qui affectent les listeners (ports, certificats TLS), qui nécessitent un redémarrage.
Questions fréquentes
Ergo peut-il remplacer UnrealIRCd ou InspIRCd pour un gros réseau ?
Pour un réseau mono-serveur avec quelques centaines d'utilisateurs, Ergo est un excellent choix. Pour un réseau multi-serveurs avec linking, Ergo ne supporte pas encore le server-to-server linking (au moment de la rédaction). Si vous avez besoin de plusieurs serveurs interconnectés, UnrealIRCd ou InspIRCd restent nécessaires.
Comment migrer depuis un autre serveur IRC vers Ergo ?
Il n'y a pas d'outil de migration automatique. Les comptes utilisateurs doivent être recréés — demandez à vos utilisateurs de s'enregistrer à nouveau. Les channels enregistrés doivent être recréés manuellement. L'historique des messages n'est pas transférable. Planifiez une date de migration et communiquez en avance.
Ergo supporte-t-il les modules ou plugins tiers ?
Non. Contrairement à InspIRCd ou UnrealIRCd qui ont un système de modules chargés dynamiquement, Ergo est monolithique. Toutes les fonctionnalités sont compilées dans le binaire. Si vous avez besoin d'une fonctionnalité spécifique, vous pouvez la proposer en issue sur GitHub ou forker le projet.
Quel est l'usage mémoire d'Ergo ?
Ergo consomme environ 30-50 Mo de RAM au démarrage, plus environ 10 Ko par connexion active. Pour 500 utilisateurs, comptez environ 35-55 Mo. C'est comparable aux serveurs IRC en C, malgré l'overhead habituel du runtime Go. Le garbage collector de Go gère la mémoire automatiquement.