A bouncer can be a useful tool if you rely on IRC for team communication and instant messaging. The most common use of such a server is to be permanently connected to IRC and to buffer messages while your client is disconnected.
However, that's not what got me interested in this tool. I'm not looking for another place where messages accumulate and wait to be processed later. I'm much happier if people email me when I'm not around.
Instead, I wanted to do to irssi what mosh did to ssh clients: transparently handle and hide temporary disconnections. Here's how I set everything up.
Server setup
The first step is to install znc:
apt-get install znc
Make sure you get the 1.0 series (in jessie or trusty, not wheezy or precise) since it has much better multi-network support.
Then, generate a Let's Encrypt TLS certificate for it:
apt install certbot
certbot certonly -d irc.example.com --standalone
Then install the certificate in the right place:
mkdir ~/.znc
cat /etc/letsencrypt/live/irc.example.com/privkey.pem /etc/letsencrypt/live/irc.example.com/fullchain.pem > ~/.znc/znc.pem
Once that's done, you're ready to create a config file for znc using the
znc --makeconf
command, again as the same non-root user:
- create separate znc users if you have separate nicks on different networks
- use your nickserv password as the server password for each network
- enable ssl
- say no to the
chansaver
andnickserv
plugins
Finally, open the IRC port (tcp port 6697 by default) in your firewall:
iptables -A INPUT -p tcp --dport 6697 -j ACCEPT
Client setup (irssi)
On the client side, the official documentation covers a number of IRC clients, but the irssi page was quite sparse.
Here's what I used for the two networks I connect to (irc.oftc.net
and irc.mozilla.org
):
servers = (
{
address = "irc.example.com";
chatnet = "OFTC";
password = "fmarier/oftc:Passw0rd1!";
port = "6697";
use_ssl = "yes";
ssl_verify = "yes";
},
{
address = "irc.example.com";
chatnet = "Mozilla";
password = "francois/mozilla:Passw0rd1!";
port = "6697";
use_ssl = "yes";
ssl_verify = "yes";
}
);
Make sure that you're no longer authenticating with the nickserv
from
within irssi. That's znc's job now.
Wrapper scripts
So far, this is a pretty standard znc+irssi setup. What makes it work with my workflow is the wrapper script I wrote to enable znc before starting irssi and then prompt to turn it off after exiting:
#!/bin/bash
ssh irc.example.com "pgrep znc || znc"
irssi
read -p "Terminate the bouncer? [y/N] " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]
then
ssh irc.example.com killall -sSIGINT znc
fi
Now, instead of typing irssi
to start my IRC client, I use irc
.
If I'm exiting irssi before commuting or because I need to reboot for a kernel update, I keep the bouncer running. At the end of the day, I say yes to killing the bouncer. That way, I don't have a backlog to go through when I wake up the next day.
Why don't you just use mosh to connect to an IRC session running in screen? What's the benefit of znc and a local client?
Also, I've looked at znc particularly for multi-client support. The idea would be that I have a main irssi session, but during certain times I'd like to tune in to just e.g. #debconf-team from my smartphone. Unfortunately, bouncers usually do all-or-nothing to all clients (meaning I can either subscribe to all channels or none from the smartphone, which will drain the battery like crazy) and while I am led to believe that znc actually supports slave accounts and can be used for this, it's very complex to set up.
Finally, when you have multiple clients working, then privmsgs sent from one don't show up on the other.
All this makes me stay with mosh for now. If only mosh existed for Android…