Halloween DealsAmazon USHalloween week deals: useful picks before month-endAmazon US: current deals, useful picks and tech finds.Check DealsPC HealthRecommendedCrashes, freezes, slowdowns? Check your PC nowSpot repairable issues before they interrupt work.Check PCHalloween DealsAmazon USOctober picks are moving - compare before checkoutAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
VGSources
Blog

How to Run an UnrealIRCd 6 Chat Server on a Debian VPS

A step-by-step guide to compiling UnrealIRCd 6 on a Debian VPS, securing it with TLS, opening the right firewall ports, enabling systemd startup, and adding optional Anope services.
Length12 min Posted Quest giverVGSources Team
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

You can run a production UnrealIRCd 6 network on a Debian 11, 12, or 13 VPS by compiling the supported 6.x series as a dedicated, unprivileged user, configuring a trusted TLS listener, opening only the ports you use, and managing the daemon with systemd. The essential sequence is: install build dependencies, compile and install UnrealIRCd, edit the shipped example configuration, pass ./unrealircd configtest, test by IP, then enable the supplied systemd unit.

This guide covers a single-server public network, encrypted client access on TCP 6697, optional plaintext migration on TCP 6667, DNS, firewalls, safe rehashes, and the separate Anope installation required for NickServ and ChanServ.

As an Amazon Associate I earn from qualifying purchases.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

What you need before installing

Prepare the VPS before downloading source code. Use a current Debian 11, 12, or 13 installation with a public IPv4 address, console or SSH access, and enough storage for the source tree, build files, logs, and backups. A DNS name such as irc.example.net should eventually point to the VPS address with an A record, but you can test against the address first.

Keep the operating-system administrator account for maintenance only. UnrealIRCd should compile and run under its own low-privilege account. If the VPS provider supplies a network firewall or security-group interface, plan to configure it as well as Debian’s local firewall; allowing a port in only one of those places is not sufficient.

Supported release and package differences

UnrealIRCd 6 is the project’s stable, supported series and has been the stable series since December 2021. Check the official release page when you install rather than copying an old patch number into a script. The documented compiler dependencies differ slightly by Debian release:

Debian Packages required by the official build guide
11 or 12 build-essential, pkg-config, libssl-dev, libpcre2-dev, libargon2-0-dev, libsodium-dev, libc-ares-dev, and libcurl4-openssl-dev
13 build-essential, pkg-config, libssl-dev, libpcre2-dev, libargon2-dev, libsodium-dev, libc-ares-dev, and libcurl4-openssl-dev

The Argon2 development package is the important version-specific change: Debian 11 and 12 use libargon2-0-dev, while Debian 13 uses libargon2-dev. Installing the wrong name causes an otherwise healthy apt-get command to fail.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Prepare Debian and a dedicated account

  1. Patch the operating system. From a root or sudo shell, run apt-get update followed by apt-get upgrade. Reboot if the kernel or other core components were upgraded, then reconnect over SSH.
  2. Create the service account. For example, create an account named unrealircd with no administrative role. Do not build or run the IRC daemon as root.
  3. Install the build tools. On Debian 11 or 12, run:
    sudo apt-get install build-essential pkg-config libssl-dev libpcre2-dev libargon2-0-dev libsodium-dev libc-ares-dev libcurl4-openssl-dev

    On Debian 13, substitute libargon2-dev:

    sudo apt-get install build-essential pkg-config libssl-dev libpcre2-dev libargon2-dev libsodium-dev libc-ares-dev libcurl4-openssl-dev
  4. Restrict SSH separately. Keep SSH reachable for administration, but limit it to the addresses or access method you actually use. Do not expose database, compiler, or unrelated management ports just because the VPS firewall permits them.

Switch to the service account for the remainder of the build. A typical administrative command is sudo -iu unrealircd. The official installation guidance specifically expects a VPS administrator to create this account and perform the build as that user.

Download, compile, and install UnrealIRCd 6

Download the current UnrealIRCd 6 release archive from the project’s official download page while logged in as the dedicated account. The exact archive name changes with each release, so do not hard-code an obsolete patch version. After downloading, inspect the filename and extract it in the account’s home directory.

  1. Extract the archive. A wildcard handles the changing patch number:
    tar -xf unrealircd-6*.tar.gz

    If the archive uses a different compression suffix, use the matching tar option or extract it with the archive utility supplied by Debian.

  2. Enter the release directory. Use cd followed by the directory created by extraction. Confirm that it contains the Config script before continuing.
  3. Run the configuration script.
    ./Config

    Accepting the documented defaults is a reasonable first installation. Review each prompt instead of blindly changing paths; the resulting layout is used by the supplied example configuration and startup unit.

  4. Compile.
    make

    The build must finish without compiler or linker errors. Missing headers almost always mean a development package from the dependency list was omitted.

  5. Install into the account’s home directory.
    make install
  6. Change to the installed tree. The normal destination is ~/unrealircd:
    cd ~/unrealircd

    Run operational commands from this installed directory, not from an old source tree that may remain beside it.

Keeping the source archive and installed tree separate makes upgrades easier: compile a new release in its own directory, verify its configuration, and retain the old installation until the replacement is known to start correctly.

Build the initial server configuration

Start with the example configuration shipped by UnrealIRCd. It demonstrates the syntax for server identity, operators, client authentication, messages, and listeners. Copy it to the active configuration filename if the installation does not already provide one, then edit that copy rather than inventing a configuration from an empty file.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Set a real server identity

Choose a fully qualified server name, for example irc.example.net, and create a DNS A record that points to the VPS public IPv4 address. Set a separate network name that users will recognize, such as Example Chat Network. The server name in the configuration, certificate hostname, and DNS record should agree; mismatches produce confusing client warnings.

Create an operator account safely

Define an administrator or IRC operator block in the configuration and use a strong password hash, never a plaintext password. Generate the hash from the installed directory:

./unrealircd mkpasswd

Paste the generated value into the operator block and protect the configuration file with filesystem permissions that prevent ordinary users from reading it. Use a distinct operator credential rather than reusing the VPS, SSH, or email password.

Choose client authentication rules

The example configuration contains the client authentication policy. Decide whether your network permits unauthenticated connections, requires a server password, or restricts access by address. Keep the default policy only after reading it: an IRC server that accepts every connection can attract abuse, while an over-restrictive mask can lock out legitimate clients.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Customize MOTD and rules files

Set the message-of-the-day and rules files to explain your network name, conduct expectations, contact address, and whether TLS is required. Keep these files concise and update them whenever connection policy changes. Their paths must match the files present in ~/unrealircd.

Define listeners

A normal public setup has a TLS listener on TCP 6697. During a migration you may also retain plaintext TCP 6667, but expose only listeners you intend to support. The TLS FAQ shows this basic form:

listen {
ip *;
port 6697;
options { ssl; };
}

Use the exact syntax and surrounding options from the shipped example for your release. Clients must explicitly select SSL/TLS when connecting to 6697; a normal plaintext connection to that port will fail.

Configure trusted TLS access

Use a certificate issued by a trusted certificate authority, such as a current Let’s Encrypt certificate, rather than a self-signed certificate for a public network. A trusted certificate prevents the browser-like trust errors that many IRC clients display and lets users verify that they reached your hostname.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Point UnrealIRCd at the certificate and key

Set the certificate-chain and private-key paths in the TLS options of the listener configuration. The UnrealIRCd account must be able to read the files, while the private key should not be world-readable. If your certificate renewal process replaces files atomically, ensure the daemon can read the renewed paths before every reload.

Choose migration or TLS-only operation

Policy Listeners When it fits Trade-off
Migration TCP 6667 plaintext and TCP 6697 TLS You still have users or clients that cannot use TLS. Plaintext sessions expose credentials and messages to network observers.
TLS-only TCP 6697 TLS You control the client instructions and require confidentiality. Legacy clients that lack TLS cannot connect.

Starting with UnrealIRCd 6.2.0, the project’s SSL/TLS guidance actively encourages administrators to close plaintext 6667 and use TLS on all client ports. If you adopt that policy, remove or disable the 6667 listener, close the corresponding firewall rule, and tell users to select the +6697 endpoint in their IRC client.

Validate before starting the daemon

Never restart a live network immediately after editing the configuration. From ~/unrealircd, run:

./unrealircd configtest

This checks the configuration without starting the daemon. Fix every blocking error and investigate warnings, then repeat the command until it passes. Run the test after certificate-path changes, listener edits, upgrades, or changes to MOTD and rules files. A passing test proves that the parser accepts the files; it does not prove that an external firewall or DNS record is correct.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Open only the required network ports

Permit the ports configured in your listener blocks in both layers of filtering:

  • Debian’s host firewall: add TCP 6697, and TCP 6667 only if plaintext is deliberately retained. If you use UFW, the equivalent rules are sudo ufw allow 6697/tcp and, when needed, sudo ufw allow 6667/tcp. Adapt the commands if your host uses nftables or another firewall manager.
  • VPS provider firewall or security group: add the same TCP ports there. A provider-level deny overrides a permissive Debian rule.
  • SSH: retain your restricted administration rule; do not remove it while testing IRC access.

Do not open arbitrary ranges for IRC. If you later add server-to-server links or monitoring endpoints, document and firewall those ports separately.

Test by IP, then by hostname

  1. Start the daemon locally or through systemd and connect an IRC client to the VPS public IP on 6697 with SSL/TLS enabled. If you deliberately kept plaintext, test 6667 separately.
  2. If the IP connection fails, check the daemon status, listener definitions, local firewall, and provider firewall before touching DNS.
  3. Once the IP works, connect to irc.example.net. If the hostname fails while the IP works, correct the DNS A record and wait for the record’s previous cache lifetime to expire.
  4. Check that the certificate covers the hostname users enter. A certificate for a different name can make an otherwise reachable TLS service appear broken.

Run UnrealIRCd at boot with systemd

The source tree includes a systemd unit under extras/startup. Use that supplied unit rather than creating an ad-hoc background process.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  1. From the source tree, enter the startup directory:
    cd extras/startup
  2. Edit unrealircd.service. Set User= and Group= to the dedicated account, and set ExecStart= to the installed daemon path under /home/unrealircd/unrealircd. Match any working-directory or environment paths to your installation.
  3. As an administrator, install the unit and reload systemd:
    sudo cp -av unrealircd.service /etc/systemd/system/
    sudo systemctl daemon-reload
  4. Enable it for future boots and start it now:
    sudo systemctl enable unrealircd.service
    sudo systemctl start unrealircd.service
  5. Inspect the result:
    sudo systemctl status unrealircd

    Read the UnrealIRCd logs as well as the systemd status output when startup fails.

Once systemd owns the process, use systemctl start unrealircd, systemctl stop unrealircd, and systemctl restart unrealircd for lifecycle control. Avoid launching a second copy manually from the shell; two daemons competing for the same listener can look like a firewall problem.

Apply configuration changes without an unnecessary restart

After editing unrealircd.conf, MOTD, rules, or certificate references, use this sequence:

  1. Save the files and verify ownership and permissions.
  2. Run ./unrealircd configtest.
  3. If it passes, run ./unrealircd rehash from ~/unrealircd. An IRC operator can also issue the IRC REHASH command.
  4. Inspect notices and logs for rejected directives, failed certificate reads, or listener changes.
  5. Reconnect a test client and verify the changed behavior.

A rehash loads changed files without a full process restart. If a change affects a startup-only setting or the daemon still reports the old state, schedule a controlled systemctl restart unrealircd after another successful configuration test.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Add NickServ and ChanServ only when you need them

UnrealIRCd’s core does not include NickServ or ChanServ. It can run a minimal network without services. Add a compatible services package only if you need registered nicknames, registered channels, persistent topics, account controls, or recovery features.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

What Anope adds

Anope is documented as compatible with UnrealIRCd. It runs as a separate services process and requires coordination between the two programs. Installation, database storage, service accounts, and upgrades belong to Anope rather than the IRCd package.

Link the services server

Configure a server-to-server Link block for the Anope services identity, matching the shared credentials and network addresses on both sides. Add the services identity to ULines so service clients receive the privileges they require, and set set::services-server to the exact services server name used by Anope. Follow the services documentation’s syntax for your installed versions instead of copying an example with mismatched names.

After adding the Link, ULines, or services-server settings, run ./unrealircd configtest, rehash, and inspect both UnrealIRCd and Anope logs. If users see “NickServ” or “ChanServ” as unknown commands, the services process is not installed, linked, or online; those commands are not supplied by the IRCd core.

Troubleshooting by symptom

No listener appears

  • Run ./unrealircd status from the installed directory and check systemctl status unrealircd.
  • Inspect logs for a syntax error, an unreadable certificate key, or a port already occupied by another process.
  • Compare the configured listen blocks with the socket-listening output available on your Debian system. Confirm that the daemon is bound to the expected address and port.

TLS clients refuse the connection

  • Verify that the certificate and key paths are correct and readable by the service account.
  • Confirm that the certificate covers the hostname users enter and includes the proper chain.
  • Ensure the client is explicitly using SSL/TLS on 6697, represented in many clients as +6697.
  • Replace a self-signed certificate with a trusted certificate if clients reject it. A self-signed certificate can be useful for private testing but is a poor public default.

Local connections work, remote connections fail

Check Debian’s firewall and the VPS provider’s firewall or security group independently. Test the public IP from a separate network; a local test can succeed even when inbound traffic is blocked upstream.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The IP works but the hostname does not

Correct the DNS A record so it points to the VPS public IPv4 address. Also check that the TLS certificate name matches the hostname. Do not use a stale hostname in the IRC client while troubleshooting the network path.

Edits appear to be ignored

Run ./unrealircd configtest, then ./unrealircd rehash. Read the notices and logs for a misspelled directive, a file path outside the installation, or a rejected value. A successful text edit alone does not reload a running daemon.

The service fails after reboot

Run systemctl status unrealircd and inspect the unit’s User=, Group=, ExecStart=, and working-directory values. Confirm that the installed tree, configuration, certificate, and key are available at boot and readable by the configured account. Use journalctl or the UnrealIRCd logs to identify the first startup error rather than repeatedly restarting.

Deployment choices at a glance

Decision Option A Option B Practical implication
Installation Compile the supported source release Use a prebuilt distribution package Source compilation follows the project’s documented dependencies and keeps the UnrealIRCd 6 version current; package availability and freshness depend on Debian repositories.
Client transport Plaintext 6667 plus TLS 6697 TLS-only 6697 The first eases migration; the second protects all client sessions and follows the post-6.2.0 recommendation to close plaintext.
Startup systemd cron or a manual shell launch systemd provides boot ordering, status, logs, and consistent start/stop/restart operations; cron is more portable but less integrated.
Services No services A compatible services package such as Anope No-services deployments have a smaller footprint; services add NickServ, ChanServ, registration, and account management but require a separate linked process.

The official documentation does not publish a current performance benchmark, capacity figure, or cost comparison for these choices. Select based on security, compatibility, administration, and the features your community actually needs.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Operational checklist

  • Debian is patched and the UnrealIRCd account is not privileged.
  • The correct Debian-specific Argon2 development package is installed.
  • The current UnrealIRCd 6 archive was compiled with ./Config, make, and make install.
  • The installed ~/unrealircd tree contains the active configuration and message files.
  • The server name, DNS A record, certificate hostname, and network identity agree.
  • An operator password hash was generated with ./unrealircd mkpasswd; no plaintext operator password is stored.
  • The 6697 TLS listener is configured and tested; 6667 is closed unless migration requires it.
  • Both Debian and provider firewalls allow only the selected TCP ports.
  • ./unrealircd configtest passes before every start, restart, or rehash.
  • The supplied systemd unit uses the correct user, group, and executable path and is enabled.
  • Anope is installed and linked only if registered accounts and channels are required.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More quests from Patch Notes

  1. How to Set Up a RedM (RDR2) Server in 2026: License Key, txAdmin and server.cfg, Step by StepBlog11min
  2. Best RedM (RDR2) Server Hosting in 2026: Comparing Four Hosts on Slots, Memory and PriceBlog10min
  3. How to Host a Mindustry Server in 2026: server-release.jar, Port 6567 and the Commands That MatterBlog7min
Recommended PC Tool
Recommended PC Tool
Crashes, No Sound, or Screen Glitches?Free driver scan
Windows Errors? Fix Them Before They SpreadFree repair scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.