secluded/content/posts/running-an-irc-server.md

173 lines
7.3 KiB
Markdown
Raw Normal View History

2021-01-11 17:34:38 +00:00
---
title: Running an IRC server
description: Easy guide on setting up a modern IRC server
2021-11-10 08:07:08 +00:00
author: Amolith
2021-01-11 17:34:38 +00:00
cover: /assets/pngs/irc.png
date: 2020-12-05T16:55:00-04:00
2023-03-19 23:39:36 +00:00
draft: false
2021-01-11 17:34:38 +00:00
toc: true
categories:
- Technology
tags:
- IRC
- Chat
- Oragono
- Sysadmin
---
Many people will disagree but I think IRC is still one of the best chat
platforms there is for a [number of
2021-06-26 20:51:30 +00:00
reasons.](https://drewdevault.com/2019/07/01/Absence-of-features-in-IRC.html)
2021-01-11 17:34:38 +00:00
However, the documentation surrounding it is sometimes lacking, commands
are esoteric and can differ from server to server, some networks have
stupid requirements/defaults, etc. But who says you have to join them?
IRC is very easy to set up, use, and maintain and this post should be a
decent guide on doing just that.
## Picking an IRCd
First, `ircd` is short for *IRC daemon*; it's just a server running in
the background. Second, there are a *ton* of choices, from
[charybdis](https://github.com/charybdis-ircd/charybdis) and
[ngIRCd](https://github.com/ngircd/ngircd/) to
2021-06-26 20:51:30 +00:00
[UnrealIRCd,](https://www.unrealircd.org/)
[InspIRCd,](https://www.inspircd.org/) and many others. The ircd this
2021-01-11 17:34:38 +00:00
guide will focus on is [Oragono](https://oragono.io/) because it's one
of the simpler options yet has support for [IRCv3](https://ircv3.net/)
and comes with [services](https://en.wikipedia.org/wiki/IRC_services)
out of the box.
## Setup
While we could run Oragono as root or under whatever account you use,
that's a stupid idea. We're going to create an `oragono` user to make
sure things are properly separated.
``` bash
adduser --disabled-login oragono
```
Press the enter key a bunch of times and you're good. After that, run
`sudo su - oragono` to log into that user account then head to the
[GitHub releases
page](https://github.com/oragono/oragono/releases/latest) and download
the latest gzipped tarball[^1] for your architecture. Decompress it with
`tar xvf oragono-*.tar.gz`. I *don't* recommend renaming the folder to
something else; having the version name right there will make it easy to
figure out when you need to upgrade in the future.
Copy the default config to the production config with `cp default.yaml
ircd.yaml`, open it in your favourite TUI editor, and start exploring
the options! The file is commented very well but I'll list a few
specific options and values I recommend.
## Configuration
* Obtain a TLS cert from [Let's Encrypt](https://letsencrypt.org/) and
use it if possible. If not, use Oragono's self-signed certificates.
Don't enable plaintext use.
* Consider setting [Tor](https://community.torproject.org/onion-services/) up
and allowing users to connect through it.
* If you're using a TLS cert from Let's Encrypt (like you should be),
set `sts.enabled` and `sts.preload` to `true`.
* Unless you specifically want [IRC
cloaks](https://meta.wikimedia.org/wiki/IRC/Cloaks) to indicate
position, status, or affiliation, set `lookup-hostnames: true` and
`forward-confirm-hostnames: false`.
2021-06-26 20:51:30 +00:00
* Always make a cool MoTD. It's essential for any IRC server.[^2] I
2021-01-11 17:34:38 +00:00
recommend using something like
[TAAG](https://www.patorjk.com/software/taag/) to come up with it.
* You *may* want to enable email authentication but it's a pain to set
up properly. I haven't bothered.
* I recommend setting `channels.default-modes` to `+nts`. The `+s` flag
just indicates that it's a secret channel and won't show up in the
global list when someone runs `/list`. After creating a channel, if
you want it publicly listed, just run `/mode -s`.
* You *may* want to uncomment `opers.admin.modes` but it can get very
spammy when there are a lot of people on your server.
* If you plan to leave `history.enabled: true` and store channel message
history server-side, I highly recommend setting
`datastore.mysql.enabled` to `true` and going through that
configuration.
* Roleplay can be fun so it's a good idea to look through that section.
* If you enabled `datastore.mysql`, also enable `history.persistent`
* For privacy reasons, I *highly* recommend setting
`history.persistent.registered-channels` to `"opt-out"`. Message
history will not be stored by default but the channel owner can decide
to enable it if they wish. Same goes for
`history.persistent.direct-messages`.
* I recommend enabling both of the options under `history.retention`.
## Running the server
If you're using self-signed certs, run `./oragono mkcerts` and make sure
the paths are correct in your `ircd.yaml`. Assuming your config is
valid, you should be able to run `./oragono run` and connect to it. If
you can't, make sure port 6697 is open, your credentials are correct,
and nothing is wrong in the config.
You can always run Oragono in [tmux](https://en.wikipedia.org/wiki/Tmux)
or something but it would be much better to do it with
2021-06-26 20:51:30 +00:00
[systemd,](https://en.wikipedia.org/wiki/Systemd)
[OpenRC,](https://en.wikipedia.org/wiki/OpenRC)
[runit,](https://en.wikipedia.org/wiki/Runit) etc. I personally use
2021-01-11 17:34:38 +00:00
systemd and this service file should go in
`/etc/systemd/system/oragono.service` or something similar.
2021-06-26 20:51:30 +00:00
``` ini
2021-01-11 17:34:38 +00:00
[Unit]
Description=oragono
After=network.target
Wants=mysql.service
After=network.target mysql.service
[Service]
Type=simple
User=oragono
WorkingDirectory=/home/oragono/oragono
ExecStart=/home/oragono/oragono/oragono run --conf /home/oragono/oragono/ircd.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
2021-06-26 20:51:30 +00:00
```
2021-01-11 17:34:38 +00:00
Run the following commands to ensure Oragono starts when your server boots.
``` bash
systemctl daemon-reload
systemctl enable --now oragono
```
## Commands
As I said in the first section, IRC has a lot of commands and they can
be confusing to work with. I still don't know everything I should. That
said, here are a (very) few of the essentials:
| Command | Example | Operation |
|----------|------------------|--------------------------------------------|
| `/quote` | `/quote helpop` | Send argument as a command to the server |
| `/join` | `/join #channel` | Join a channel |
| `/leave` | `/leave` | Leave a channel |
| `/me` | `/me yawns` | Result will look like `* Amolith yawns` |
| `/query` | `/query amolith` | Open a direct message buffer with amolith |
| `/mode` | `/mode -s` | Add/remove flags from a channel[^3] |
| `/op` | `/op amolith` | Make amolith a channel operator |
| `/voice` | `/voice amolith` | Let amolith speak when channel set to `+M` |
The one command *every* Oragono oper[^4] should know is `/quote helpop
index`. It will list all the available commands so you can read through
them and discover what each does.
2024-10-18 22:37:51 +00:00
You've reached the end of the post. You are now disallowed from telling anyone
that IRC is too complicated. If you want to test a server you're setting up,
feel free to use my instance of [The Lounge;](https://thelounge.chat/) it's at
irc.nixnet.services and any IRCd details can be entered but mine are default.
Speaking of my IRC server, you should [join
#secluded](ircs://irc.nixnet.services:6697/secluded) and mention this post :D
2021-01-11 17:34:38 +00:00
[^1]: A *gzipped tarball* is just a compressed archive like a zip file
[^2]: You should definitely [join
mine](https://docs.nixnet.services/IRC) and look at our awesome MoTD
[^3]: See `/quote help cmodes` for all the flag options
[^4]: Short for [IRC operator](https://en.wikipedia.org/wiki/IRC_operator)