---
title: Running WeeChat on a Server for IRC Backlogs
teaser:
tags: irc,unix
author: Calle Erlandsson
published_on: 2014-08-04
---

In [a previous blog
post](https://thoughtbot.com/blog/weechat-for-slacks-irc-gateway) we walked you
through setting up and configuring the text based chat client
[WeeChat](http://weechat.org/) for use with the [Slack](https://slack.com/)
[IRC](https://en.wikipedia.org/wiki/Internet_Relay_Chat) gateway.

The blog post also explained how to set up
[Slacklog](https://github.com/thoughtbot/weechat-slacklog) - a WeeChat script
for retrieving backlog from the Slack API. This works great, but if you want
more backlog or want backlog for channels on other IRC servers a good solution
is to run WeeChat on a server. By doing this you won't miss anything that
happens in the channels you are connected to, even when you're not at your
computer or connected to the Internet. When you reconnect you can go through
messages that were meant for you or that you're interested in.

This tutorial assumes that you have a server running
[Debian](https://www.debian.org/) 7.0 (Wheezy) that you can access over SSH
using an account with `sudo` privileges. If you're using a different setup you
may have to alter the instructions. If you don't have a server but would like to
set one up, I recently wrote [a blog post explaining how to set up a basic
Debian
server](http://calleerlandsson.com/2014/06/15/setting-up-a-basic-linux-server/).

## Setting up WeeChat

Connect to your server using `ssh`:

    ssh YOURIP

To get the latest version of WeeChat you have to install it from the Wheezy
backports. If you haven't already, add the Wheezy backports to your
`/etc/apt/sources.list` file:

    sudo sh -c 'echo deb http://http.debian.net/debian wheezy-backports main >> /etc/apt/sources.list'

Update your package index and install WeeChat using `apt-get`:

    sudo apt-get update
    sudo apt-get -t wheezy-backports install weechat-curses

You can now start WeeChat using the `weechat-curses` command:

    weechat-curses

To exit type `/quit` and press <kbd>Enter</kbd>.

If you disconnect from your server by typing
<kbd>Ctrl</kbd>+<kbd>D</kbd>, you can now reconnect to the server and
run `weechat-curses` by running this command locally:

    ssh YOURIP -t weechat-curses

When you pass a command to `ssh` it will run the command on the remote machine
instead of running your normal shell. When it does so, it will also skip the
allocation of a [pseudo-tty](http://en.wikipedia.org/wiki/Pseudo_terminal). This
works fine for one-off commands with no output, but since WeeChat is an
interactive program, it needs a tty to connect to. The `-t` flag in the above
command forces the allocation of a pseudo-tty.

When you exit out of WeeChat, `ssh` will automatically disconnect from the
server.

Great! We can now connect to and run WeeChat on our server in one command. One
problem with this approach is that WeeChat won't continue to run after you
disconnect. This means that you will miss anything that happens in the channels
you were connected to since you're simply no longer connected. Always being
connected means that you will have access to the full backlog.

To fix this we will have to run WeeChat using a terminal multiplexer (like [GNU
Screen](https://www.gnu.org/software/screen/) or
[tmux](http://tmux.sourceforge.net/)) that has support for running programs in
background sessions that can be detached from and reattached to.

## Setting up GNU Screen

We will use GNU Screen in this tutorial mainly because a lot of us here at
thoughtbot use tmux locally and nesting tmux sessions can cause problems. If
you're not using tmux locally, using tmux on your server is perfectly fine.

Reconnect to your server and install GNU Screen using `apt-get`:

    ssh YOURIP
    sudo apt-get install screen

If you disconnect from your server you can now reconnect and run
`weechat-curses` in a `screen` session using this command:

    ssh YOURIP -t screen -D -RR weechat weechat-curses

This command will log in to your server and look for a `screen` session named
"weechat". If a session with that name exists, it will reattach to it. If not it
will create a new session and run the `weechat-curses` command inside of it.

To disconnect from the server without quitting WeeChat press
<kbd>Ctrl</kbd>+<kbd>A</kbd> and then <kbd>D</kbd>.

Awesome! We can now enjoy the upside of always being online even when we're not.

There is still one problem though. When you're done for the day, close your
laptop and head home, your SSH connection will eventually time out. When you get
home and open up your laptop, the terminal running the `ssh` command will be
frozen and the only way to quit it will be by pressing <kbd>~</kbd> and
<kbd>.</kbd>. To continue chatting you'll then have to reconnect. This will also
happen if you suddenly lose your Internet connection for a few minutes and it
can be really annoying.

Wouldn't it be simpler if you were reconnected automatically as soon as you were
reconnected to the Internet?

## Setting up Mosh

[Mosh](https://mosh.mit.edu/) stands for "mobile shell" and is a remote terminal
application that allows roaming and intermittent connectivity. In our case
`mosh` will replace `ssh`. Under the hood Mosh still uses `ssh` to log in to the
server to then start a `mosh-server` that you can communicate with over UDP.

Mosh connections will not freeze after losing the Internet connection but
will instead show a timer that tells how long ago it last got a response from
the server. As soon as you come online it will reconnect and you can continue
chatting.

Install Mosh locally using your favorite package manager.

On Debian:

    sudo apt-get install mosh

On Arch Linux:

    sudo pacman -S mosh

On Mac OS X (using Homebrew):

    brew install mobile-shell

Installation instructions for other systems can be found on
[the Mosh website](http://mosh.mit.edu/#getting).

Reconnect to your server and install Mosh using `apt-get`:

    ssh YOURIP
    sudo apt-get install mosh

By default, `mosh-server` binds to a UDP port between 60000 and 61000. If you're
running a firewall, you have to open these ports to be able to connect. If you
are using [UFW](https://help.ubuntu.com/community/UFW) to manage your firewall
you can run this command to open the ports:

    sudo ufw allow 60000:61000/udp

If you disconnect from your server, you can now reconnect to and attach to your
WeeChat `screen` session using `mosh`:

    mosh YOURIP -- screen -D -RR weechat weechat-curses

There we go! All set up.

## Connecting to servers and joining channels

You can now connect to an IRC server using WeeChat:

    /connect chat.freenode.net

Once connected you can join your favorite channel:

    /join #ruby

For more information on how to use WeeChat check out [WeeChat for Slack's IRC
Gateway](https://thoughtbot.com/blog/weechat-for-slacks-irc-gateway).
