Exploring the roots and future of Internet Relay Chat

Ergo: el ircd moderno escrito en Go con servicios integrados

En 2020, un amigo me desafió a montar un servidor IRC desde cero en menos de 15 minutos. Con UnrealIRCd habría tardado una hora como mínimo entre compilación, configuración, certificados y servicios. Descargué Ergo, edité un YAML, y en 8 minutos tenía un ircd funcional con NickServ, ChanServ y TLS. Gané la apuesta. Y desde entonces, Ergo es mi recomendación para cualquiera que quiera montar un servidor IRC moderno sin sufrir.

Qué es Ergo y por qué existe

Ergo (antes conocido como Oragono) es un servidor IRC escrito en Go. Lo creó Daniel Oaks a partir de 2016 con una premisa clara: ¿cómo sería un ircd diseñado hoy, sin la herencia de 35 años de decisiones técnicas cuestionables?

La respuesta es un ircd que incluye servicios integrados (NickServ, ChanServ, HostServ), soporta IRCv3 de forma nativa, tiene historial de mensajes persistente, y se configura con un solo archivo YAML legible por humanos. Sin módulos externos, sin Anope, sin Atheme. Todo en un binario.

El nombre cambió de Oragono a Ergo en 2021. El renombrado generó confusión, pero el proyecto es el mismo. Si encuentras referencias a Oragono en documentación o foros, son sobre el mismo software.

Ergo ocupa un nicho específico: servidores IRC pequeños a medianos. No pretende competir con UnrealIRCd para redes de 50.000 usuarios. Pero para un servidor personal, una comunidad de desarrollo, o una red de hasta 5.000 usuarios, es la opción más práctica que existe.

Arquitectura: Go, servicios integrados, IRCv3

Estar escrito en Go le da a Ergo tres ventajas técnicas concretas. Primera: compilación a un binario estático. No hay dependencias de bibliotecas del sistema. Descargas el binario, lo ejecutas, funciona. En cualquier Linux, macOS o Windows. Sin ./configure && make && make install.

Segunda: concurrencia nativa con goroutines. Go está diseñado para manejar miles de conexiones simultáneas de forma eficiente. Cada conexión IRC es una goroutine, que consume mucha menos memoria que un thread del sistema operativo. Un servidor Ergo con 1000 usuarios consume menos de 100 MB de RAM.

Tercera: garbage collection automático. No hay memory leaks manuales. Los ircds en C como UnrealIRCd e InspIRCd son rápidos, pero una fuga de memoria puede degradar el servidor durante días hasta que alguien lo reinicia. Con Go, el garbage collector se encarga.

Los servicios integrados son la diferencia fundamental. En un ircd tradicional, NickServ y ChanServ son programas externos (Anope, Atheme) que conectan al ircd como un usuario especial. En Ergo, los servicios son parte del ircd. No hay conexión intermedia, no hay latencia adicional, no hay proceso separado que mantener. Registrar un nick es un comando que el ircd procesa directamente.

# Comparación de componentes

# Stack tradicional:
#   UnrealIRCd (ircd)
#   + Anope (servicios externos)
#   + Configuración de enlace ircd↔servicios
#   + 2 procesos separados
#   + 2 archivos de config
#   + Base de datos de Anope

# Stack Ergo:
#   Ergo (ircd + servicios integrados)
#   + 1 proceso
#   + 1 archivo de config (YAML)
#   + Base de datos integrada (buntdb)

Instalación paso a paso

Instalar Ergo es probablemente la experiencia más simple que vas a tener con cualquier ircd.

# Opción 1: Binario precompilado (recomendado)
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/

# Generar configuración por defecto
cp default.yaml ircd.yaml

# Generar certificados TLS autofirmados (para testing)
./ergo mkcerts

# Iniciar el servidor
./ergo run

# Opción 2: Desde código fuente
git clone https://github.com/ergochat/ergo.git
cd ergo
go build -o ergo .
cp default.yaml ircd.yaml
./ergo mkcerts
./ergo run

# Opción 3: Docker
docker run -d --name ergo \
  -p 6667:6667 -p 6697:6697 \
  -v ./ircd.yaml:/ircd/ircd.yaml \
  -v ./ergo-data:/ircd/db \
  ghcr.io/ergochat/ergo:v2.13.1

En la opción 1, todo el proceso tarda menos de un minuto. Descarga, descomprime, genera certs, ejecuta. Conecta con tu cliente IRC a localhost:6667 (sin TLS) o localhost:6697 (con TLS) y ya estás dentro.

Para producción, querrás un certificado TLS real de Let's Encrypt en vez del autofirmado. Y un servicio systemd para que Ergo arranque automáticamente.

# /etc/systemd/system/ergo.service
[Unit]
Description=Ergo IRCd
After=network-online.target
Wants=network-online.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=15
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
Consejo: El comando ./ergo mkcerts genera certificados autofirmados válidos para testing inmediato. Los clientes IRC mostrarán un aviso de certificado no confiable, pero la conexión será cifrada. Para producción, reemplaza los archivos tls.cert y tls.key con certificados de Let's Encrypt.

Configuración esencial

El archivo ircd.yaml es la única configuración que necesitas. Está bien documentado con comentarios en el propio archivo. Aquí van las secciones que debes ajustar desde el inicio.

# ircd.yaml — secciones clave

# Nombre y descripción del servidor
server:
    name: irc.tudominio.com
    listeners:
        ":6667":               # IRC sin TLS
        ":6697":
            tls:
                cert: /opt/ergo/tls/fullchain.pem
                key: /opt/ergo/tls/privkey.pem
        ":8097":               # WebSocket TLS
            websocket: true
            tls:
                cert: /opt/ergo/tls/fullchain.pem
                key: /opt/ergo/tls/privkey.pem

    # Límites de conexión
    ip-limits:
        count: 5               # Max conexiones por IP
        duration: 10m

# Cuentas de usuario (NickServ integrado)
accounts:
    registration:
        enabled: true
        allow-before-connect: true  # Registrar durante la conexión
        throttling:
            enabled: true
            duration: 10m
            max-attempts: 3
    authentication-enabled: true
    multiclient:
        enabled: true          # Múltiples clientes con una cuenta
        always-on: opt-in      # Bouncer integrado

# Canales (ChanServ integrado)
channels:
    registration:
        enabled: true
    default-modes: "+nt"       # Sin mensajes externos + topic protegido

# Historial de mensajes (GRAN diferencia vs ircds tradicionales)
history:
    enabled: true
    channel-length: 1024       # Mensajes guardados por canal
    client-length: 256         # Mensajes para playback al reconectar
    chathistory-maxmessages: 100  # Máximo por petición CHATHISTORY
    retention:
        allow-individual-delete: false
        cutoff: 168h           # 7 días de retención

La sección multiclient merece atención especial. Ergo puede funcionar como bouncer (similar a ZNC) de forma nativa. Si activas always-on, el servidor mantiene tu sesión activa cuando te desconectas y te reproduce los mensajes perdidos cuando vuelves. Esto elimina la necesidad de un bouncer externo para la mayoría de usuarios.

NickServ, ChanServ y HostServ integrados

Los servicios funcionan con los mismos comandos que esperarías de Anope o Atheme. La transición es transparente para el usuario.

# NickServ — Registro y gestión de cuentas
/msg NickServ REGISTER contraseña email@ejemplo.com
/msg NickServ IDENTIFY contraseña
/msg NickServ SET ENFORCE ON         # Proteger nick contra impostores
/msg NickServ INFO nick              # Ver info de una cuenta

# ChanServ — Registro y gestión de canales
/msg ChanServ REGISTER #canal
/msg ChanServ OP #canal nick         # Dar op
/msg ChanServ AMODE #canal +o nick   # Op automático al entrar
/msg ChanServ SET #canal TOPICLOCK ON
/msg ChanServ SET #canal KEEPTOPIC ON

# HostServ — Ocultar hostmask
/msg HostServ SET tudominio.personalizado

# Diferencias con Anope/Atheme:
# - No hay CERTFP para grupos de nicks (Ergo usa cuentas)
# - Un nick = una cuenta, no hay agrupación
# - SASL PLAIN y EXTERNAL soportados nativamente
# - Los registros son instantáneos (no hay delay)

La diferencia filosófica con servicios externos es que en Ergo las cuentas son ciudadanas de primera clase. No son un añadido externo que se comunica con el ircd por un protocolo interno. La base de datos de cuentas es la misma base de datos del ircd. Esto significa que operaciones como "registrar un nick" son atómicas e instantáneas, sin la latencia de comunicación entre procesos.

Soporte IRCv3: lo que cambia para el usuario

Ergo implementa más especificaciones IRCv3 que cualquier otro ircd. ¿Qué significa esto en la práctica para el usuario?

CHATHISTORY: los clientes pueden solicitar historial de mensajes al servidor. Si usas un cliente compatible (como Gamja, Goguma o The Lounge), puedes hacer scroll hacia arriba y ver mensajes que se enviaron cuando no estabas conectado. Como en Slack o Discord, pero en IRC.

server-time: cada mensaje lleva una marca de tiempo del servidor. Los clientes pueden mostrar la hora exacta de cada mensaje, no la hora en que lo recibieron. Parece trivial, pero cuando reconectas después de una desconexión y recibes mensajes atrasados, la diferencia es clara.

message-tags: permite adjuntar metadatos a los mensajes. Reacciones con emoji, respuestas a mensajes específicos (reply threading), y otros datos que los clientes modernos pueden interpretar.

SASL: autenticación durante la conexión, antes de ser visible en la red. Más seguro que enviar un PRIVMSG a NickServ con tu contraseña en un canal que otros podrían ver.

# Capacidades IRCv3 que Ergo soporta (lista parcial)

account-notify       # Notifica cambios de cuenta
account-tag          # Adjunta cuenta a cada mensaje
away-notify          # Notifica cambios de /away
batch                # Agrupa mensajes relacionados
cap-notify           # Notifica nuevas CAPs disponibles
chathistory          # Solicitar historial
echo-message         # Eco de mensajes propios
message-tags         # Metadatos en mensajes
multi-prefix         # Múltiples prefijos en NAMES
sasl                 # Autenticación SASL
server-time          # Timestamps del servidor
setname              # Cambiar nombre real en vivo
typing               # Indicador de "escribiendo..."
userhost-in-names    # Host completo en NAMES
Advertencia: Las funciones IRCv3 solo funcionan si tu cliente las soporta. mIRC, irssi y WeeChat tienen soporte parcial. Para la experiencia completa necesitas clientes diseñados para IRCv3 como Gamja (web), Goguma (móvil) o The Lounge (web). Si tus usuarios usan clientes antiguos, seguirán funcionando — simplemente no verán las funciones nuevas.

Comparación honesta con UnrealIRCd e InspIRCd

No soy fanboy de nada. Uso lo que funciona para cada caso. Aquí va mi evaluación honesta.

Ergo gana en: simplicidad de instalación (1 binario vs compilación), configuración (1 YAML vs múltiples .conf), servicios integrados (0 dependencias extra), soporte IRCv3 (el más completo), bouncer integrado (reemplaza ZNC), y historial de mensajes nativo.

UnrealIRCd gana en: escalabilidad (probado en redes enormes), flexibilidad de módulos (docenas de módulos de terceros), server linking maduro (red multi-servidor robusta), documentación (20 años de wikis, foros y ejemplos), y base de usuarios (más gente que puede ayudarte).

InspIRCd gana en: modularidad extrema (todo es un módulo, incluso el protocolo de comandos), rendimiento bajo carga (C++ optimizado para miles de conexiones), y personalización a nivel de protocolo. Si necesitas algo raro, InspIRCd probablemente tiene un módulo para eso.

Mi recomendación: Si montas un servidor para tu comunidad de 10-500 personas, Ergo. Si administras una red de 5+ servidores enlazados, UnrealIRCd. Si necesitas personalización extrema del protocolo, InspIRCd. No hay una respuesta universal.

He administrado servidores con los tres. Ergo es el que menos mantenimiento requiere. UnrealIRCd es el que me da más confianza bajo presión. InspIRCd es el que me deja hacer cosas que los otros no permiten. Cada uno tiene su lugar.

Preguntas frecuentes

¿Puedo migrar mi red de UnrealIRCd a Ergo?

Puedes, pero no es trivial. Ergo tiene herramientas para importar bases de datos de Anope y Atheme. Las cuentas de usuario y canales registrados se pueden migrar. Lo que no se migra automáticamente son configuraciones específicas del ircd — tendrás que reconfigurar en YAML. Si tu red usa server linking extensivo, necesitas verificar que Ergo soporta tu topología, ya que su soporte de linking está menos maduro que el de UnrealIRCd.

¿Ergo soporta server linking?

Sí, pero de forma limitada comparado con UnrealIRCd o InspIRCd. Ergo soporta linking básico entre servidores, pero no tiene la madurez ni las opciones de configuración de ircds que llevan 20 años refinando esta funcionalidad. Para un solo servidor o dos servidores enlazados, funciona bien. Para una red con 10+ servidores y topología compleja, UnrealIRCd sigue siendo la mejor opción.

¿Ergo consume más recursos que un ircd en C?

Go usa más memoria base que C. Un servidor Ergo vacío consume unos 30-50 MB de RAM. Un UnrealIRCd vacío consume unos 10-15 MB. Pero la diferencia se vuelve irrelevante con usuarios reales. Con 1000 usuarios, Ergo usa ~100 MB y UnrealIRCd ~60 MB. Ambas cifras son insignificantes para cualquier servidor moderno. El rendimiento de CPU es comparable para cargas normales.