IRC is a simple idea, and should be simple to manage. Unfortunately by design it isn’t simple to manage a cluster of IRC servers.

InspIRCd attempts to fill the gap with remote configuration files which can be included via executable (eg- wget -O - https://example.com/inspircd.conf ).

Unfortunately using wget to grab up your configuration can lead to undesired side-effects. For example if your configuration fails to load from the website, you may find that all your modules, olines, etc. become unloaded. I have attempted to fix this via a simple configuration management tool written in nodejs. This post will walk you through setting up your IRCd and the configuration manager system-wide.

If instructions are unclear or something is missing from this guide then please let me know via the comments. Everything in this guide should work on Debian/Ubuntu systems and the like. Please let me know in the comments if you need to divert from the instructions for any reason.

IRCd Setup

You will need to perform these steps for each server that you would like to build an IRCd on.

Update: /var/run/irc has been changed to /home/irc due to /var/run being a tempfs on many distributions.

# apt-get install build-essential openssl libssl-dev pkg-config npm git # mkdir /home/irc # mkdir /home/irc/.ssh # chown irc:irc /home/irc # chsh irc -s /bin/bash # usermod -d /home/irc irc # mkdir $HOME/src # cd $HOME/src # git clone https://github.com/inspircd/inspircd.git # cd inspircd/ # git checkout insp20 # ./configure --prefix=/opt/inspircd --enable-openssl --uid=irc # make && make install # chown -R irc:irc /opt/inspircd # chmod -R 0770 /opt/inspircd # wget https://gitlab.com/BuddyIM/scripts/raw/master/ircd.service -O /etc/systemd/system/ircd.service # chmod +x /etc/systemd/system/ircd.service # systemctl enable ircd.service

While this makes go ahead and get yourself a cup of coffee and read through the next steps.

When it’s finished you should see something like this at the end of the output:

************************************* * INSTALL COMPLETE! * ************************************* Paths: Base install: /opt/inspircd Configuration: /opt/inspircd/conf Binaries: /opt/inspircd/bin Modules: /opt/inspircd/modules Data: /opt/inspircd/data To start the ircd, run: /opt/inspircd/inspircd start Remember to create your config file: /opt/inspircd/conf/inspircd.conf Examples are available at: /opt/inspircd/conf/examples/

Configuration

You will need to setup your configurations how you want them based on the example configurations provided by InspIRCd. This will operate as a base configuration for your network so setup your configurations how you want them, then proceed to the configuration management step. Make sure you use absolute paths for all includes.

Remember that while you are building your configuration you will want to place certain variables which will be used when generating the final configuration file for the program.

Variables

&ipv4-addr; - Put this wherever you need the IPv4 address of the server.

&ipv6-addr; - Put this wherever you need the IPv6 address of the server.

&network-name; - Put this wherever you need the network name.

&server; - Put this wherever you need the server address (eg- hostname.example.com)

&adminName; - Put this wherever you need the name of the admin for the server.

&adminNick; - Put this wherever you need the nickname of the admin for the server.

&adminEmail; - Put this wherever you need the email of the admin for the server.

InspIRCd configuration example

Final Configuration

Once your configuration is done your directory structure should look something like this:

|- conf |\- base | \- inspircd.conf |\- sync | |- modules.conf | |- opers.conf | \- rules.txt \- .gitignore

Update: An example of what your configs might look like can be found here.

Make sure you saved your inspircd.conf in the base directory.

The setup above would need a .gitignore file which would look something like this:

.gitignore:

./local ./inspircd.conf *.pid

Configuration Management

Preparing configurations for deployment

You will need to setup a git repository (if it’s not private, you’re doing it wrong). Once your git repo is setup simply push your configs out to the repo. The structure of your configuration files should look like the one shown above minus the local directory which will be created on a per-server basis.

Make sure to setup deploy keys on your repository for your configuration for the irc account on each server that you setup otherwise you won’t be able to pull the configuration files.

config-manager Setup

You will need to open up a root terminal again and type the following commands:

# su - irc # login to irc user $ ssh-keygen $ cat $HOME/.ssh/id_rsa.pub # copy the public key for later use. $ exit # logout of irc user # mkdir /opt/config-manager # wget https://gitlab.com/BuddyIM/scripts/raw/master/config-manager/pull.js -O /opt/config-manager/pull.js # wget https://gitlab.com/BuddyIM/scripts/raw/master/config-manager/config.json -O /opt/config-manager/config.json # npm install --save fs replaceall simple-git # su - irc # login to irc user $ cd /opt/inspircd/conf $ rm -rf examples $ git clone <[email protected]:config/path> . # git clone the configuration repository that you setup above. $ mkdir local/ $ touch local/links.conf local/motd.txt local/opers.conf local/ssl.cert local/ssl.key inspircd.conf # be sure to actually edit these files too! $ exit # end session as irc user.

Deploy configurations

The configuration file for config-manager is stored at /opt/config-manager/config.json and needs to be edited before you continue to the next step…

The configuration file at /opt/inspircd/conf/inspircd.conf should look something like this:

<include executable="/usr/bin/node /opt/config-manager/pull.js"> <include file="/opt/inspircd/conf/sync/modules.conf"> <include file="/opt/inspircd/conf/sync/opers.conf"> <include file="/opt/inspircd/conf/local/opers.conf"> <include file="/opt/inspircd/conf/local/links.conf">

Make sure the path to your nodejs install is correct, sometimes it is /usr/bin/nodejs instead of /usr/bin/node . In that case you will either need to create a symlink (recommended) or change the executable include to point to the correct path.