IRC is cool, but IRC is volatile. Here is how to install [ZNC](http://wiki.znc.in) on an LXC machine.
> Note that irssi/weechat/whateverircclient in a screen/tmux would do as > well
First, ask for a LXC container to [snoc@gandi.net](mailto:snoc@gandi.net).
Once you get your container, follow those steps:
## Secure Your Container
### Provision Your SSH Key
On your host machine:
` bash
ssh-copy-id -i ~/.ssh/id.pub root@{yourname}.lxc.gandi.net
`
### Disable SSH Password Authentication
``` bash ssh root@{yourname}.lxc.gandi.net
- grep -q '^PasswordAuthentication' /etc/ssh/sshd_config &&
- sed -i 's/^PasswordAuthentication.*$/PasswordAuthentication no/' /etc/ssh/sshd_config || echo 'PasswordAuthentication no' >> /etc/ssh/sshd_config
- grep -q '^ChallengeResponseAuthentication' /etc/ssh/sshd_config &&
- sed -i 's/^ChallengeResponseAuthentication.*$/ChallengeResponseAuthentication no/' /etc/ssh/sshd_config || echo 'ChallengeResponseAuthentication no' >> /etc/ssh/sshd_config
Before exiting, open another console and make sure you can still ssh into the container.
### Change Password
` bash
passwd
`
## Install ZNC and dependencies
We use the recommanded install for wheezy (from [official website](http://wiki.znc.in/User:Resistance/Debian_Package_Repository_for_ZNC))
``` bash apt-get install debian-keyring debian-archive-keyring wget
- wget --quiet http://packages.temporal-intelligence.net/repo.gpg.key -O - |
- apt-key add -
- echo 'deb http://packages.temporal-intelligence.net/znc/debian/ wheezy main' >
- /etc/apt/sources.list.d/znc.list
apt-get update ; apt-get install znc ```
## Configure ZNC
` bash
useradd -c "ZNC IRC bouncer" -s /bin/bash -m znc
su znc -c 'znc --makeconf'
[ .. ] Checking for list of available modules...
[ >> ] ok
[ !! ] WARNING: config [/home/znc/.znc/configs/znc.conf] already exists.
[ ** ]
[ ** ] -- Global settings --
[ ** ]
[ ?? ] Listen on port (1025 to 65534): 6697
[ ?? ] Listen using SSL (yes/no) [no]: yes
[ ?? ] Listen using both IPv4 and IPv6 (yes/no) [yes]: yes
[ .. ] Verifying the listener...
[ >> ] ok
[ ** ] Enabled global modules [webadmin]
[ ** ]
[ ** ] -- Admin user settings --
[ ** ]
[ ?? ] Username (alphanumeric): themouette
[ ?? ] Enter password:
[ ?? ] Confirm password:
[ ?? ] Nick [themouette]:
[ ?? ] Alternate nick [themouette_]:
[ ?? ] Ident [themouette]:
[ ?? ] Real name [Got ZNC?]: Julien Muetton
[ ?? ] Bind host (optional):
[ ** ] Enabled user modules [chansaver, controlpanel]
[ ** ]
[ ?? ] Set up a network? (yes/no) [yes]: no
[ ** ]
[ .. ] Writing config [/home/znc/.znc/configs/znc.conf]...
[ !! ] This config already exists.
[ ?? ] Are you sure you want to overwrite it? (yes/no) [no]: yes
[ .. ] Overwriting config [/home/znc/.znc/configs/znc.conf]...
[ >> ] ok
[ ** ]
[ ** ] To connect to this ZNC you need to connect to it as your IRC server
[ ** ] using the port that you supplied. You have to supply your login info
[ ** ] as the IRC server password like this: user/network:pass.
[ ** ]
[ ** ] Try something like this in your IRC client...
[ ** ] /server <znc_server_ip> +6697 themouette:<pass>
[ ** ]
[ ** ] To manage settings, users and networks, point your web browser to
[ ** ] https://<znc_server_ip>:6697/
[ ** ]
[ ?? ] Launch ZNC now? (yes/no) [yes]: no
`
## Set as Daemon
Copy the following into /etc/init.d/znc
``` sh #! /bin/sh
### BEGIN INIT INFO # Provides: znc # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: ZNC IRC bouncer # Description: ZNC is an IRC bouncer ### END INIT INFO
PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="ZNC daemon" NAME=znc DAEMON=/usr/bin/$NAME DATADIR=/home/znc/.znc/ DAEMON_ARGS="--datadir=$DATADIR" PIDDIR=/var/run/znc PIDFILE=$PIDDIR/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME USER=znc GROUP=znc
# Exit if the package is not installed [ -x "$DAEMON" ] || exit 0
# Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh
# Define LSB log_* functions. # Depend on lsb-base (>= 3.2-14) to ensure that this file is present # and status_of_proc is working. . /lib/lsb/init-functions
# # Function that starts the daemon/service # do_start() {
# Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started if [ ! -d $PIDDIR ] then
mkdir $PIDDIRfi chown $USER:$GROUP $PIDDIR start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test --chuid $USER > /dev/null || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --chuid $USER -- $DAEMON_ARGS > /dev/null || return 2
}
# # Function that stops the daemon/service # do_stop() {
# Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME --chuid $USER RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 # Wait for children to finish too if this is a daemon that forks # and if the daemon is only ever run from this initscript. # If the above conditions are not satisfied then add some other code # that waits for the process to drop all resources that could be # needed by services started subsequently. A last resort is to # sleep for some time. start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON --chuid $USER [ "$?" = 2 ] && return 2 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL"
}
# # Function that sends a SIGHUP to the daemon/service # do_reload() {
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME --chuid $USER return 0
}
- case "$1" in
- start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac ;;
- stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac ;;
- status)
- status_of_proc -p $PIDFILE "$DAEMON" "$NAME" && exit 0 || exit $? ;;
- reload)
- log_daemon_msg "Reloading $DESC" "$NAME" do_reload log_end_msg $? ;;
- restart)
log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in
esac ;;
- *)
- echo "Usage: $SCRIPTNAME {status|start|stop|reload|restart}" >&2 exit 3 ;;
Then
` bash
chmod 755 /etc/init.d/znc
update-rc.d znc defaults
service znc start
`
## Configure ZNC
Open your browser at [https://yourname.lxc.gandi.net:6697](https://yourname.lxc.gandi.net:6697)
Connect to the admin panel.
Go to Your Settings and add the following networks:
- freenode (Servers of this IRC network: irc.freenode.net:6667)
- gandi (Servers of this IRC network: irc.scalix.gandi.net 6667)
### Automatic Away Status
While editing the network, enable the simple_away plugin.
### Fix Encoding
In the ZNC web interface, go to Your Settings > ZNC Behavior:
Select Don't ensure any encoding at all (legacy mode, not recommended)
In Every network configuration, set Server encoding to: Don't ensure any encoding at all (legacy mode, not recommended)
### Get Date In Logs
In the ZNC web interface, go to Your Settings > ZNC Behavior, set Timestamp Format to [%d/%m %H:%M:%S]
> Do not declare your channels in ZNC, just use the chansaver plugin (enabled > by default)
## Configure Your Client
All you need to know is that to connect to gandi network, you need to authenticate as yourZncUsername/gandi and to connect to freenode yourZncUsername/freenode.