Run Your Own IRC Server

Want a private comms channel without relying on Discord or Slack?
IRC is alive, and you can run your own today.

A small, well-configured IRC server gives you privacy, control, and minimal attack surface – all in a few commands.

Some people think that IRC is dead.
Some of them don’t even know what is it.
They’re young, grew up on modern comms.

IRC is the protocol that laid the foundation of modern chats.

Networks used large footprint ircd daemons for the base.
They registered services daemons for channel and nick retention.
TLS settings were rare and uncomfortable.
SASL authentication was hardly set.

Then new developments appeared.
The old technology got a modern revision.

Ergo Chat

Ergo Chat is a modern IRC server.
Written in Go its footprint is extremely small.

The architecture includes:

  • the IRC daemon
  • an integrated services (Nickserv, Chanserv)
  • TLS configuration
  • SASL authentication

One binary contains an entire IRC service.

It’s ideal for small teams on moderate hardware.

The Goal

The goal is to:

  1. Build a stable IRC service
  2. Use services (Nickserv, Chanserv)
  3. Run as TLS-only
  4. Host a single domain (e.g. irc.tomsitcafe.com)
  5. Minimal attack surface

Preparation

You want to run Ergo as a service.
Not as root.
As an ordinary user account.

The user is irc in this example.

sudo useradd --system --home /var/lib/ergo --shell /sbin/nologin irc

The directory structure is simple.
They will hold your data.

Configuration: /etc/ergo
Data store: /var/lib/ergo
Binary: /usr/local/bin

sudo install -o irc -g irc -d /etc/ergo /var/lib/ergo

Install The Ergo Binary

Download the latest version from GitHub.
Always check what is the latest version number.

wget https://github.com/ergochat/ergo/releases/download/v2.18.0/ergo-2.18.0-linux-x86_64.tar.gz -O ergo.tar.gz

Extract the archive.

tar xzf ergo.tar.gz

Move it to a system $PATH.

sudo mv ergo-2.18.0-linux-x86_64/ergo /usr/local/bin/ergo

Give it execute rights.

sudo chmod +x /usr/local/bin/ergo

Operational security, set the owner to root:

sudo chown root:root /usr/local/bin/ergo

Install The Language Packs

Most operators forget it.
Ergo needs its languages.

sudo cp -r ergo-2.18.0-linux-x86_64/languages/ /var/lib/ergo/
sudo chown -R irc:irc /var/lib/ergo/languages/

Firewalling

Based on your configuration the necessary ports can change.

For IRC over TLS: 6697/tcp is mandatory.
Let’s Encrypt validates your domain via 80/tcp.

Configure the firewall for your architecture.

Let’s Encrypt With Certbot

Valid TLS certificates are mandatory.

sudo certbot certonly --standalone \
-d irc.tomsitcafe.com \
--non-interactive \
--agree-tos \
-m admin@domain.tld

Deploy the certs into the ergo config directory:

sudo mkdir -p /etc/ergo/certs
sudo cp /etc/letsencrypt/live/irc.tomsitcafe.com/fullchain.pem /etc/ergo/certs/
sudo cp /etc/letsencrypt/live/irc.tomsitcafe.com/privkey.pem /etc/ergo/certs/
sudo chown -R irc:irc /etc/ergo/certs
sudo chmod 600 /etc/ergo/certs/privkey.pem

Deploy hook to move certs to etc/ergo/certs:

sudo mkdir -p /etc/letsencrypt/renewal-hooks/deploy
# then
sudo nano /etc/letsencrypt/renewal-hooks/deploy/ergo.sh

The hook script:

#!/bin/bash
set -e
cp /etc/letsencrypt/live/irc.tomsitcafe.com/fullchain.pem /etc/ergo/certs/
cp /etc/letsencrypt/live/irc.tomsitcafe.com/privkey.pem /etc/ergo/certs/
chown -R irc:irc /etc/ergo/certs
chmod 600 /etc/ergo/certs/privkey.pem
systemctl restart ergo

Make it executable:

sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/ergo.sh

Test the flow:

sudo certbot renew --dry-run

Configuration

Configure Ergo for your needs.

Config file: /etc/ergo/ircd.yaml
MOTD file: /etc/ergo/ircd.motd
Certs: /etc/ergo/certs/{fullchain.pem,privkey.pem}
Lock file: /var/lib/ergo/ircd.lock
DB file: /var/lib/ergo/ircd.db

Configure the network and server:

  • network.name
  • server.name
  • opers.admin.password

In the extracted package the default.yaml is the configuration reference.
Set up the paths properly.

Systemd Service

You want to run your IRC daemon as a service.
Create a systemd unit file.

nano /etc/systemd/system/ergo.service

Add this:

[Unit]
Description=Ergo IRC Server
After=network.target

[Service]
Type=simple
User=irc
Group=irc
ExecStart=/usr/local/bin/ergo run --conf /etc/ergo/ircd.yaml
Restart=on-failure
RestartSec=5

# Basic Hardening
NoNewPrivileges=yes    # prevents Ergo from gaining extra privileges
PrivateTmp=yes         # gives Ergo its own /tmp directory
ProtectSystem=strict   # limits file system access
ProtectHome=yes        # prevents access to user home directories
ReadWritePaths=/var/lib/ergo  # only this path is writable

[Install]
WantedBy=multi-user.target

It is a basic, hardened service unit file.

Add it to systemd and start Ergo:

sudo systemctl daemon-reload
sudo systemctl enable ergo
sudo systemctl start ergo

Your IRC server is fully functional.

Backup & Restore

This configuration is simple.

The files you want to backup:

  • Config file: /etc/ergo/ircd.yaml
  • MOTD file: /etc/ergo/ircd.motd
  • DB: /var/lib/ergo/ircd.db

IRC Clients

On Linux on desktop or server weechat is secure and easy to use.
Android has HexDroid that supports Ergo pretty well.

Final Thoughts

With this setup you have a small, almost zero footprint comms server.
It’s secure by default.

  • TLS
  • SASL
  • Services

IRC is alive in 2026. It just chooses its community carefully.

Leave a comment