summaryrefslogtreecommitdiff
path: root/content/irc.md
diff options
context:
space:
mode:
Diffstat (limited to 'content/irc.md')
-rw-r--r--content/irc.md948
1 files changed, 948 insertions, 0 deletions
diff --git a/content/irc.md b/content/irc.md
new file mode 100644
index 0000000..d6b601e
--- /dev/null
+++ b/content/irc.md
@@ -0,0 +1,948 @@
+---
+title: "IRC"
+date: 2020-07-03
+icon: "irc.svg"
+tags: ["service"]
+short_desc: "Self-hosting the Internet's classic chat protocol."
+---
+
+Creating your own chat server for you and your friends is easy, and you
+don\'t have to rely on a complicated system to get started. IRC is an
+old but gold protocol, and has clients for basically every operating
+system made since the 80s, with many powerful modern ones on Linux, Mac,
+and Windows.
+
+Having a chat server for you and your friends makes it impossible for a
+group of arbitrarily appointed moderators to deplatform you for
+wrong-think, and gives you greater freedom of communication.
+
+## Installing an IRCd {#installing}
+
+An IRCd is short for \"IRC daemon\", which just means an IRC server. The
+most easy IRCd to set up is [Ergo](https://ergo.chat/).
+
+The first thing you need to do is create a new user for the server to be
+run by. This is good practice for installing software/servers manually,
+as it give you more fine-grained control over which permissions the
+application has.
+
+```sh
+useradd -m ergo -s /bin/bash
+```
+
+Next, we want to switch to our newly created `ergo` user and create the
+server directory.
+
+```sh
+sudo -i -u ergo
+mkdir server
+cd server
+```
+
+You can find the latest release of Ergo on its GitHub [latest
+release](https://github.com/ergochat/ergo/releases/latest) page.\
+There are several platforms available, but you want to choose Linux,
+most likely `linux-x86_64`.\
+Once you have selected the correct package, copy its URL and replace the
+release url with the package URL (still as the `ergo` user):
+
+```sh
+wget "https://github.com/ergochat/ergo/releases/download/v2.15.0/ergo-2.15.0-linux-x86_64.tar.gz"
+tar -xf ergo-2.15.0-linux-x86_64.tar.gz
+mv ergo-2.15.0-linux-x86_64/* .
+rm -r ergo-2.15.0-linux-x86_64*
+```
+
+Executing `ls -l` should now yield something like this:
+
+```sh
+-rw-r--r-- 1 ergo ergo 118825 Jun 25 00:51 CHANGELOG.md
+-rw-r--r-- 1 ergo ergo 1983 Aug 30 01:48 LICENSE
+-rw-r--r-- 1 ergo ergo 1983 Oct 11 01:48 README
+-rw-r--r-- 1 ergo ergo 41440 Jan 14 00:42 default.yaml
+drwxr-xr-x 2 ergo ergo 4096 Feb 2 09:01 docs
+-rwxr-xr-x 1 ergo ergo 9654272 Jan 25 00:53 ergo
+-rw-r--r-- 1 ergo ergo 1753 Jan 2 01:48 ergo.motd
+drwxr-xr-x 2 ergo ergo 12288 Feb 2 09:01 languages
+-rw-r--r-- 1 ergo ergo 39722 Jan 14 00:42 traditional.yaml
+```
+
+If you see something similar to the above, that means Ergo is installed,
+although not quite ready to run yet.
+
+## Configuring Ergo {#configuring}
+
+Now that Ergo is installed, you want to configure it to fit the needs of
+your group.\
+The configuration in this section is tailored towards a small group of
+people, and less for a possibly large network, but it should work for
+any size of group.
+
+First thing, make sure you\'re still using the `ergo` user, and are in
+the `~/server` directory.\
+If you aren\'t, you can run the following to get back there:
+
+```sh
+sudo -i -u ergo
+cd ~/server
+```
+
+To start configuring, we need to copy some files:
+
+```sh
+cp default.yaml ircd.yaml
+cp ergo.motd ircd.motd
+```
+
+Next, generate certificate files for TLS:
+
+```sh
+./ergo mkcerts
+```
+
+Ergo comes with a default configuration file with detailed documentation
+that can be used to guide you through the configuration process. This
+guide will help you setup the server for a typical use-case, but if you
+see any settings that you would like to change along the way, go ahead
+and change them, as long as you know what you\'re doing.
+
+The next steps involve editing the newly copied `ircd.yaml` file. If you
+do not know how to edit text files from the command line, you can use
+`nano`, which is very simple, using arrow keys to navigate, <kbd>CTRL+O</kbd> to
+save, and <kbd>CTRL+X</kbd> to exit.\
+Another option is `vim`, which is a much more powerful text editor, but
+has a learning curve. It is only recommended for this guide if you
+already know how to use it.\
+Lastly, you can copy the `ircd.yaml` file to a text editor on your
+computer and edit it with a GUI text editor of your choice. If that is
+what you choose to do, you may want to just download the file from
+[Ergo\'s
+GitHub](https://raw.githubusercontent.com/ergochat/ergo/master/default.yaml),
+edit it on your computer, clear the `ircd.yaml` file on the server, and
+then paste the contents from your computer into the blank file.\
+No matter how you do it, the next steps assume you can edit the
+configuration file.
+
+**Note**:\
+The options highlighted in this section are not a complete overview of
+all options. Instead, the options shown are the ones which are most
+relevant to a small network.\
+You should read over the configuration file yourself if you are curious
+about everything you can change.
+
+### Network and server names {#configuring-names}
+
+One of the first properties in the config file is network name. You can
+change this to whatever you like, as it will show up as the name when
+you connect to the server.
+
+```yaml
+# network configuration
+network:
+ # name of the network
+ name: "SiTalk"
+```
+
+Change the server name to your server\'s domain name.
+
+```yaml
+# server configuration
+server:
+ # server name
+ name: "{{<hl>}}talk.thesiah.xyz{{</hl>}}"
+```
+
+### Network password {#configuring-password}
+
+The next step is optional, depending on if you want your network
+password protected or not. The benefit of password protection is fairly
+obvious; nobody can connect to your network unless you gave them the
+password. If you\'re wanting to run a public network which anyone can
+join and create a channel, you want to skip this, but for personal
+setups, it is highly recommended.
+
+Generate a password to use by executing the following:
+
+```sh
+./ergo genpasswd
+```
+
+It will ask you to enter a password and confirm it, then you will be
+given a hashed password.\
+Copy this password, and paste it into the following field (also removing
+the `#` before the `password:` line):
+
+```yaml
+# password to login to the server, generated using `ergo genpasswd`:
+password: "{{<hl>}}your hashed password{{</hl>}}"
+```
+
+### Message of the day (MotD) {#configuring-motd}
+
+Change the MotD (**M**essage **o**f **t**he **D**ay) file to the one you
+copied earlier:
+
+```yaml
+# motd filename
+# if you change the motd, you should move it to ircd.motd
+motd: ircd.motd
+```
+
+Feel free to edit `ircd.motd` to your heart\'s content. Its contents
+will be sent to clients when they connect to the network.
+
+### IP limits {#configuring-ip-limits}
+
+For security purposes, you might want to limit the amount of client
+connections per IP. For a private network, 4 is likely the maximum
+amount of connections you will have per IP, so that is a safe value.\
+If your network is password protected, this is less of an issue, since
+the only people connecting will be people who have the password. The
+following is the default, but you can change it to be whichever value
+you like:
+
+```yaml
+# IP-based DoS protection
+ip-limits:
+ # whether to limit the total number of concurrent connections per IP/CIDR
+ count: true
+ # maximum concurrent connections per IP/CIDR
+ max-concurrent-connections: 16
+```
+
+### IP cloaking {#configuring-ip-cloaking}
+
+Traditionally, IRC networks expose users\' IP addresses to everyone.
+This is not a good practice for privacy, however. With Ergo, IP cloaking
+is enable by default. You can enable or disable it if you like, and
+change how it looks to users.\
+In this case, `netname` was changed to `"chad"`.
+
+```yaml
+# IP cloaking hides users' IP addresses from other users and from channel admins
+# (but not from server admins), while still allowing channel admins to ban
+# offending IP addresses or networks. In place of hostnames derived from reverse
+# DNS, users see fake domain names like pwbs2ui4377257x8.irc. These names are
+# generated deterministically from the underlying IP address, but if the underlying
+# IP is not already known, it is infeasible to recover it from the cloaked name.
+# If you disable this, you should probably enable lookup-hostnames in its place.
+ip-cloaking:
+ # whether to enable IP cloaking
+ enabled: true
+
+ # whether to use these cloak settings (specifically, `netname` and `num-bits`)
+ # to produce unique hostnames for always-on clients. you can enable this even if
+ # you disabled IP cloaking for normal clients above. if this is disabled,
+ # always-on clients will all have an identical hostname (the server name).
+ enabled-for-always-on: true
+
+ # fake TLD at the end of the hostname, e.g., pwbs2ui4377257x8.irc
+ # you may want to use your network name here
+ netname: "SiTalk"
+```
+
+### Password enforcement adjustments for HexChat (and possibly other clients) {#configuring-hexchat-password}
+
+Ergo offers account registration to allow users to do things like use
+history and bouncer features, register channels, etc.\
+In clients such as HexChat, server passwords may conflict with account
+passwords, so the following setting should be enabled if you wish to use
+accounts with clients such as HexChat.\
+Note that this could under some circumstances be considered a security
+hazard, as a user with an account does not need to know the server
+password to connect, although that user would have needed to register an
+account before the server had a password, and then a password would need
+to have been set after the fact, so this can be considered a very small
+concern if your setup has always had a password.\
+Also keep in mind that this setting has no effect if your network does
+not even have a password at all.
+
+```yaml
+# some clients (notably Pidgin and Hexchat) offer only a single password field,
+# which makes it impossible to specify a separate server password (for the PASS
+# command) and SASL password. if this option is set to true, a client that
+# successfully authenticates with SASL will not be required to send
+# PASS as well, so it can be configured to authenticate with SASL only.
+skip-server-password: true
+```
+
+### Multiclient, always-on clients, history, etc {#configuring-multiclient}
+
+Traditionally, IRC servers have no message history, and once you close
+your client, you cannot receive messages, and are not shown to be online
+at all. Ergo includes functionality to allow users to both receive
+history, and keep their clients \"online\" even after they have left. It
+also allows multiple clients to connect to the same account.\
+If you are running a private network for friends, you should set
+`always-on` and `auto-away` to `opt-out`, to have all users with
+accounts to appear as if they are online at all times, and be able to
+receive messages when they are offline.\
+For a public network, keep everything as their default values, since you
+probably do not want randoms having this by default.\
+If for some reason you do not want any of these features at all, you can
+set `enabled` to `false`, but this is not recommended. Below are the
+recommended values for a private network (e.g. for friends) where users
+with accounts will be able to receive messages and history while they
+are offline.
+
+```yaml
+# multiclient controls whether Ergo allows multiple connections to
+# attach to the same client/nickname identity; this is part of the
+# functionality traditionally provided by a bouncer like ZNC
+multiclient:
+ # when disabled, each connection must use a separate nickname (as is the
+ # typical behavior of IRC servers). when enabled, a new connection that
+ # has authenticated with SASL can associate itself with an existing
+ # client
+ enabled: true
+
+ # if this is disabled, clients have to opt in to bouncer functionality
+ # using nickserv or the cap system. if it's enabled, they can opt out
+ # via nickserv
+ allowed-by-default: true
+
+ # whether to allow clients that remain on the server even
+ # when they have no active connections. The possible values are:
+ # "disabled", "opt-in", "opt-out", or "mandatory".
+ always-on: "opt-out"
+
+ # whether to mark always-on clients away when they have no active connections:
+ auto-away: "opt-out"
+
+ # QUIT always-on clients from the server if they go this long without connecting
+ # (use 0 or omit for no expiration):
+ #always-on-expiration: 90d
+```
+
+### VHosts {#configuring-vhosts}
+
+IP cloaking was mentioned previously, and somewhat related to that, Ergo
+includes \"vhost\" functionality, which allows users to set a custom
+IP/host string. This is mostly for cosmetic value, and does not
+interfere with operators being able to see actual IP addresses for
+banning, but if you do not want it enable for some reason, you can
+disable it.
+
+```yaml
+# vhosts controls the assignment of vhosts (strings displayed in place of the user's
+# hostname/IP) by the HostServ service
+vhosts:
+ # are vhosts enabled at all?
+ enabled: true
+```
+
+### Channels {#configuring-channels}
+
+Channels are where everyone on an IRC network talk. By default, anyone
+can create a channel, and anyone with an account can register one. The
+difference between a normal channel and a registered one is that the
+registered one will preserve the operator status of the person who
+created, whereas a normal channel\'s owner will lose operator status if
+they leave the channel or disconnect from the network.\
+There are various settings for channels available, but the defaults are
+suitable for a private network with trust among users, or where you just
+want anyone to have the ability to create a channel. Below are the
+default values:
+
+```yaml
+# channel options
+channels:
+ # modes that are set when new channels are created
+ # +n is no-external-messages and +t is op-only-topic
+ # see /QUOTE HELP cmodes for more channel modes
+ default-modes: +nt
+
+ # how many channels can a client be in at once?
+ max-channels-per-client: 100
+
+ # if this is true, new channels can only be created by operators with the
+ # `chanreg` operator capability
+ operator-only-creation: false
+
+ # channel registration - requires an account
+ registration:
+ # can users register new channels?
+ enabled: true
+
+ # restrict new channel registrations to operators only?
+ # (operators can then transfer channels to regular users using /CS TRANSFER)
+ operator-only: false
+
+ # how many channels can each account register?
+ max-channels-per-account: 15
+```
+
+### Operators (administrators, etc) {#configuring-operators}
+
+The IRC term for an administrator or another privileged user is
+\"operator\", or \"oper\" for short.\
+Ergo\'s opers have different permissions that can be granted to them,
+and are defined in \"classes\", basically groups of permissions under a
+name. For example, \"chat-moderator\" and \"server-admin\" are defined
+in the default configuration:
+
+```yaml
+# operator classes
+oper-classes:
+ # chat moderator: can ban/unban users from the server, join channels,
+ # fix mode issues and sort out vhosts.
+ "chat-moderator":
+ # title shown in WHOIS
+ title: Chat Moderator
+
+ # capability names
+ capabilities:
+ - "kill"
+ - "ban"
+ - "nofakelag"
+ - "roleplay"
+ - "relaymsg"
+ - "vhosts"
+ - "sajoin"
+ - "samode"
+ - "snomasks"
+
+ # server admin: has full control of the ircd, including nickname and
+ # channel registrations
+ "server-admin":
+ # title shown in WHOIS
+ title: Server Admin
+
+ # oper class this extends from
+ extends: "chat-moderator"
+
+ # capability names
+ capabilities:
+ - "rehash"
+ - "accreg"
+ - "chanreg"
+ - "history"
+ - "defcon"
+ - "massmessage"
+```
+
+The above can be kept with their default values, but you are free to
+modify them or create any new classes that are appropriate for your
+setup.\
+Next, let\'s actually create an operator account:
+
+```yaml
+# ircd operators
+opers:
+ # default operator named 'gigachad'; log in with /OPER gigachad <password>
+ "gigachad":
+ # which capabilities this oper has access to
+ class: "server-admin"
+
+ # custom whois line
+ whois-line: is the server administrator
+
+ # custom hostname
+ vhost: "SI"
+
+ # normally, operator status is visible to unprivileged users in WHO and WHOIS
+ # responses. this can be disabled with 'hidden'. ('hidden' also causes the
+ # 'vhost' line above to be ignored.)
+ hidden: false
+
+ # modes are modes to auto-set upon opering-up. uncomment this to automatically
+ # enable snomasks ("server notification masks" that alert you to server events;
+ # see `/quote help snomasks` while opered-up for more information):
+ #modes: +is acjknoqtuxv
+
+ # operators can be authenticated either by password (with the /OPER command),
+ # or by certificate fingerprint, or both. if a password hash is set, then a
+ # password is required to oper up (e.g., /OPER dan mypassword). to generate
+ # the hash, use `ergo genpasswd`.
+ password: "<your oper password>"
+```
+
+This is a modified version of the default oper entry. The account name
+is \"gigachad\", but you can change it to anything.\
+Replace `<your oper password>` with a password generated by
+`./ergo genpasswd`, and you will have a new oper account to use.\
+Note that to log into an oper account, clients have to enter
+`/OPER <oper name> <oper password>` each time they log in. This can be
+automated by most clients by setting the command to be executed when the
+client logs in. In the case of HexChat, you can edit your network and
+add the command to the `Connect commands` tab of the menu.\
+You can copy everything from `"gigachad"` to the end of the line, paste
+it again, and change the name to create another oper account. Another,
+less privileged example of an oper is shown as a comment below the above
+configuration snippet.
+
+### Chat history {#configuring-history}
+
+Traditionally, IRC networks do not store, relay, or handle chat history
+in any way.\
+On a privacy standpoint, this is a good thing, since chats are entirely
+ephemeral and handled by clients.\
+On a practicality standpoint, this is a bad thing, since people have to
+keep a client connected 24/7 to see message history.\
+For normalfriends, this can be a big problem, not only because having to
+stay online 24/7 is just annoying or infeasible, but also because they
+are likely used to chat platforms that handle history for them.\
+With this in mind, enabling history is a good idea if you want to move
+friends over to IRC, and will make things a lot more pleasant for
+private networks.
+
+Ergo\'s `history` configuration group is very long, so it is encouraged
+to read over it yourself. This section will go over the most important
+pieces of that configuration group.
+
+History is not endless (unless you want it to be), and the amount that
+can be stored for channels is configurable:
+
+```yaml
+# how many channel-specific events (messages, joins, parts) should be tracked per channel?
+channel-length: 2048
+```
+
+History is already enabled by default, but that just means it is being
+collected, not relayed by default. To relay history to clients when they
+connect, change the following to the amount of messages that you think
+is appropriate:
+
+```yaml
+# number of messages to automatically play back on channel join (0 to disable):
+autoreplay-on-join: 250
+```
+
+History older than a certain time can be configured to be deleted or be
+inaccessible. The default cutoff time is 1 week, but this is
+configurable as well.
+
+```yaml
+# options to delete old messages, or prevent them from being retrieved
+restrictions:
+ # if this is set, messages older than this cannot be retrieved by anyone
+ # (and will eventually be deleted from persistent storage, if that's enabled)
+ expire-time: 1w
+```
+
+By default, Ergo only stores chat history in memory, so when the server
+restarts, all history is lost. If you wish to have chat history persist
+beyond restarts, you must store it in a MySQL database:
+
+```yaml
+# options to store history messages in a persistent database (currently only MySQL).
+# in order to enable any of this functionality, you must configure a MySQL server
+# in the `datastore.mysql` section.
+persistent:
+ enabled: true
+
+ # store unregistered channel messages in the persistent database?
+ unregistered-channels: true
+
+# connection information for MySQL (currently only used for persistent history):
+mysql:
+ enabled: true
+ host: "localhost"
+ port: 3306
+ # if socket-path is set, it will be used instead of host:port
+ #socket-path: "/var/run/mysqld/mysqld.sock"
+ user: "ergo"
+ password: "hunter2"
+ history-database: "ergo_history"
+ timeout: 3s
+ max-conns: 4
+ # this may be necessary to prevent middleware from closing your connections:
+ #conn-max-lifetime: 180s
+```
+
+For privacy reasons, you may want to allow users to delete their own
+messages in history, or export their messages to JSON:
+
+```yaml
+# options to control how messages are stored and deleted:
+retention:
+ # allow users to delete their own messages from history?
+ allow-individual-delete: true
+
+ # if persistent history is enabled, create additional index tables,
+ # allowing deletion of JSON export of an account's messages. this
+ # may be needed for compliance with data privacy regulations.
+ enable-account-indexing: true
+```
+
+### Spam reduction {#configuring-spam}
+
+Most IRC networks have measures in place to reduce chat spam. By
+default, \"fakelag\" is enabled in Ergo, and that can deal with most
+aggregious chat spam.\
+If you are running a private network where user trust is high, you can
+disable it so that there are no limits on the speed that messages can be
+sent.
+
+```yaml
+# fakelag: prevents clients from spamming commands too rapidly
+fakelag:
+ # whether to enforce fakelag
+ enabled: true
+
+ # time unit for counting command rates
+ window: 1s
+
+ # clients can send this many commands without fakelag being imposed
+ burst-limit: 5
+
+ # once clients have exceeded their burst allowance, they can send only
+ # this many commands per `window`:
+ messages-per-window: 2
+
+ # client status resets to the default state if they go this long without
+ # sending any commands:
+ cooldown: 2s
+```
+
+## Starting and using your server
+
+Now that Ergo is both installed and configured, you can actually start
+using it!
+
+### Starting the server {#using-starting}
+
+First thing, make sure you\'re still using the `ergo` user, and are in
+the `~/server` directory.\
+If you aren\'t, you can run the following to get back there:
+
+```sh
+sudo -i -u ergo
+cd server
+```
+
+Starting the server is done in one command:
+
+```sh
+./ergo run
+```
+
+It will stay online until you close the terminal, or press <kbd>CTRL+C</kbd>.
+Don\'t worry, the next section goes over how to make it run like a
+normal server with a SystemD service.\
+If you have not already, make sure the port `6697` is not blocked on
+your server. If you are using UFW as your firewall, you need to run
+`ufw enable 6697` (not as the `ergo` user, of course).\
+If you make and configuration changes while the server is running, you
+can apply them without restarting by typing `/rehash` as an operator.
+
+### Connecting to the server {#using-connecting}
+
+To use IRC, you of course need an IRC client. There are many choices
+available, but the most widely used for Windows and Linux is
+[HexChat](https://hexchat.github.io/). On Mac, you have a slightly nicer
+option with [Textual](https://www.codeux.com/textual/), although you
+have to [compile it from
+source](https://github.com/Codeux-Software/Textual/#building-textual) if
+you want to use it for free.\
+A more user-friendly and modern client choice is TheLounge, which is
+explained in the last section of this guide, if you want to look into
+it.
+
+Connecting with HexChat is very easy. When you start it, you will see
+something like this:
+
+{{< img alt="HexChat network select" src="/pix/irc/hexchat-network-select.png" link="/pix/irc/hexchat-network-select.png" >}}
+
+From there, you should click `+ Add` and name the server whatever you
+like (so you can find it on the server list).\
+Once you have created a new server and named it, select it and click
+`Edit...`. A menu will show up like the one below. Change the domain to
+whatever domain your server is running on, and make sure to put in your
+server password if you set one.
+
+{{< img alt="HexChat network edit menu" src="/pix/irc/hexchat-network-edit.png" link="/pix/irc/hexchat-network-edit.png" >}}
+
+Once you\'re done editing the network, click `(X) Close`, select your
+network from the network list, and click `Connect`.\
+If all is well, you should be connected!
+
+{{< img alt="HexChat connection complete" src="/pix/irc/hexchat-connection-complete.png" link="/pix/irc/hexchat-connection-complete.png" >}}
+
+The process is very similar on Textual.\
+Create a new network and connect to it. Note that it will ask if you
+want to connect even though the certificate is unsigned. This is due to
+the self-signed certificates generated for the server, and is not a
+problem or security vulnerability, it is just a little annoying.
+
+{{< img alt="Textual network edit menu" src="/pix/irc/textual-network-edit.png" link="/pix/irc/textual-network-edit.png" >}}
+
+Surviving restarts with a SystemD service
+
+In the beginning of the last section, Ergo was started by simply running
+`./ergo run`, but this is only suitable for testing. To have a proper
+server setup, you need to run it as a service. This can be achieved via
+a SystemD service.
+
+Before creating your service file, make sure you are in `~/server` as
+the `ergo` user.\
+Once you have done that, create a file called `start.sh` with the
+following content:
+
+```sh
+#!/bin/bash
+./ergo run
+```
+
+Save the file, then mark it as executable:
+
+```sh
+chmod +x start.sh
+```
+
+Now, create a file called `ergo.service` with the following content:
+
+```systemd
+[Unit]
+Description=Ergo IRC server
+After=network.target
+# If you are using MySQL for history storage, comment out the above line
+# and uncomment these two instead (you must independently install and configure
+# MySQL for your system):
+# Wants=mysql.service
+# After=network.target mysql.service
+
+[Service]
+Type=simple
+User=ergo
+WorkingDirectory=/home/ergo/server
+ExecStart=/home/ergo/server/start.sh
+ExecReload=/bin/kill -HUP $MAINPID
+Restart=on-failure
+LimitNOFILE=1048576
+# Uncomment this for a hidden service:
+# PrivateNetwork=true
+
+[Install]
+WantedBy=multi-user.target
+```
+
+You now have your service file, but it is not installed yet. To install
+it, switch to your normal user, and execute the following lines to
+install, enable, and start the SystemD service:
+
+```sh
+ln -s /home/ergo/server/ergo.service /etc/systemd/system/ergo.service
+systemctl enable ergo
+systemctl start ergo
+```
+
+Ergo is now installed and running as a service, and will automatically
+start when the system boots.
+
+## Registering accounts and channels {#registering}
+
+Account and channel registration were mentioned multiple times in this
+guide, and are indeed very important parts of the modern IRC ecosystem.
+You can connect to most IRC networks and talk without creating an
+account, but you will not be able to reserve your nickname or register
+channels, so it is important to register an account.
+
+### Registering an account with NickServ {#registering-accounts}
+
+First, make sure you are connected to your IRC network. Once you are,
+type `/nickserv help` to make sure NickServ (the registration system) is
+working propertly.\
+If all is well, type the following, replacing `<your password>` with the
+password you want to use:
+
+```txt
+/nickserv register <your password>
+```
+
+At this point, you are now registered!\
+The final step is to configure authentication with your client.
+
+In HexChat, all that needs to be done is changing `Login method` to
+`SASL (username + password)`, and entering your NickServ password that
+you used earlier into the password field:
+
+{{< img alt="HexChat SASL in network edit menu" src="/pix/irc/hexchat-sasl.png" link="/pix/irc/hexchat-sasl.png" >}}
+
+In Textual, open up your network in the menu, and click `Identity` under
+`Server Properties`. Enter your password in `Personal Password`, and
+check `Wait for identification before joining channels`.
+
+{{< img alt="Textual identity menu" src="/pix/irc/textual-identity.png" link="/pix/irc/textual-identity.png" >}}
+
+You will now be logged into your account when you connect to your
+network.
+
+### Registering channels with ChanServ {#registering-channels}
+
+Once you have an account registered, you can register channels with
+ChanServ.\
+To do so, join the channel you want to register, then type the
+following, replacing `<your channel>` with the name of the channel you
+want to register:
+
+```txt
+/chanserv register #<your channel>
+```
+
+You are now the channel owner, and are free to appoint operators,
+administrators, etc for it. When you go offline, you won\'t lose
+ownership, and you cannot be removed as the owner unless you unregister
+the channel later.
+
+## Moderation
+
+Like any chat, there will come a point where you need to use moderation
+tools to keep things under control. Many IRC setup guides do not go over
+moderation, so it can be stressful when operators need to actually use
+moderation tools.\
+The main difference between IRC and other chat systems in terms of
+moderation is the difference between channel bans and network bans.
+Channel ban keeps a person out of channel a channel, whereas a network
+ban keeps a person out of the entire network.
+
+### Understanding masks {#moderation-masks}
+
+Bans are applied \"masks\", which are formatted pieces of text that
+contain a user\'s nick (username), their realname value, and their IP
+address or host.\
+This is what a mask looks like: `nick!~nick-dude@127.0.0.1`.\
+In bans, asterisks can be used as wildcards, which is useful for banning
+IP address ranges, patterns of nicknames, or whatever else you can think
+of.\
+A ban on the nick `person`, for example, would look like this:
+`person!*@*`.\
+A ban on anyone with the IP address `127.0.0.1` would look like this:
+`*!*@127.0.0.1`
+
+### Discovering real IPs {#moderation-real-ips}
+
+Even if IP cloaking is enabled on your network, you can still obtain
+real IP addresses/hosts if you are an operator. See the **Operators**
+part of the configuration section of this guide on how to become an
+operator.\
+To find out a user\'s real IP, simply type `/whois` along with the
+user\'s nick, and you will see information about the user, along with
+their real IP address/host.\
+`/whois` is not a command that is exclusive to operators, but it does
+not reveal as much information to non-operators.
+
+### Banning someone from the network {#moderation-network-ban}
+
+Any netword-wide moderation action requires being an operator. See the
+**Operators** part of the configuration section of this guide on how to
+become an operator.\
+Banning someone from the network is achieved with the `/kline` command.
+To see more info on the command, type `/helpop kline`.\
+
+To ban a nick from the network:
+
+```txt
+/kline andkill <nick>!*@*
+```
+
+To ban an IP address or host from the network:
+
+```txt
+/kline andkill *!*@<IP or mask>
+```
+
+To unban a mask, you can use the `/unkline` command with the mask you
+want to unban.
+
+### Banning someone from a channel {#moderation-channel-ban}
+
+Channel owners, administrators, and operators can ban people from
+channels. This is not the same as banning someone from the network,
+since it only has an effect on one channel. Additionally, a channel
+operator is not the same as a network operator.
+
+To ban someone in a channel, type the following in that channel,
+replacing `<mask>` with the user\'s mask:
+
+```txt
+/mode +b <mask>
+```
+
+Note that this will only ban the user, not kick them immediately. You
+will want to run `/kick` along with the user\'s nick to also kick them.\
+To unban a user, run the command above, but replace the `+` with a `-`.\
+You can see who is banned in a channel by typing `/banlist`.
+
+### Muting people in a channel {#moderation-muting}
+
+By default, anyone can speak in an IRC channel. To change this, you must
+be a channel owner, administrator, or operator.\
+Channels, along with users, have modes, which modify their behavior.
+There is a special mode for channels called `m` (moderated) which
+requires users to be privileged in some way to talk.\
+To set a channel as moderated, type the following in the channel:
+
+```txt
+/mode +m
+```
+
+Now, users must be an owner, administrator, operator, or be voiced to
+talk in the channel This be reversed by typing the command above, but
+changing the `+` to a `-`.\
+To voice a user, run the following, replacing _\<nick\>_ with the
+user\'s nick:
+
+```txt
+/mode +v <nick>
+```
+
+Unvoice the user by typing the above command, but replacing the `+` with
+a `-`.
+
+### Appointing channel administrators and operators {#moderation-appointing}
+
+Assuming you a channel owner, you can appoint both administrators and
+operators. If you are only an operator, you may only appoint operators.\
+The difference between administrator and operator is mainly that
+administrators cannot have their privileges taken away by operators,
+only owners. To appoint an administrator, type the following, replacing
+_\<nick\>_ with the user\'s nick:
+
+```txt
+/mode +a <nick>
+```
+
+To appoint an operator, type the following, replacing _\<nick\>_ with
+the user\'s nick:
+
+```txt
+/mode +o <nick>
+```
+
+You can also use `/op` and `/deop` on most clients to appoint and remove
+an operator.\
+To remove administrator or operator status, run either of the above
+commands, but replace the `+` with a `-`.
+
+Bringing modern-day features to IRC with TheLounge
+
+A large downside to IRC as a protocol is just how old it is, and the
+limitations that exist because of it. Other old protocols such as HTTP
+were built to be content-agnostic and versitile, but IRC was built with
+a very specific set of features, so it has not held up so well to
+contemporary chat systems.\
+A notable thing that IRC as a protocol is missing is file uploads, and
+other fancy features that many other chats have.\
+With that said, these problems can be fixed by clients, although many
+clients are still very primitive.
+
+[TheLounge](https://thelounge.chat/) is a modern self-hosted IRC web
+client that tries to make IRC as user-friendly as possible. It can be
+the answer to many of the complaints that normalfriends may have about
+IRC. It runs on anything with a web browser, can be \"installed\" since
+it is a PWA (Progressive Web App), and is optimized for both desktops
+and mobile devices. It keeps you logged in even when you are gone, and
+even supports file uploads and embeds.\
+Effectively, it brings IRC up to the standard of most other chat
+systems.
+
+If you would like to setup an instance of TheLounge for you and your
+friends, you can take a look at their [installation
+guide](https://thelounge.chat/docs/install-and-upgrade).\
+It is a self-hosted web app, so you can run it for multiple people, not
+just yourself.
+
+---
+
+_Written by [Termer](https://termer.net/)_