Sat, 16 Sep 2017

Part 2 of my series on building a restic-based
system backup setup. Part 1 can be found found
here.

As described in Part 1, my general strategy is to have a centralized backup
server at a particular location, running an instance of minio
for each server being backed up. In essence, I'm going to want to be running N
minio server --config-dir=/... instances, and I want a simple
way to add and start instances, and keep them running. In essence, I want
a simple init service.

Fortunately, if you're looking for a simple init service, you need look no
further than runit. It's an incredibly
tiny init-like system, composed of some simple tools: runsv to
run a service, keep it up and optionally log stdout output somewhere;
sv to control that service by simply talking to a socket; and
runsvdir to keep a collection of runsv instances
going. Defining a service is simple, in a directory there is a run
file, which is used by runsv to start the service. If you want
to log, create a log subdirectory, with it's own run
file — that file is executed and given the stdout of the main process
as its input (the included svlogd command is a simple process
for handling logs). To run a bunch of runsv instances, put
them (or symlinks to them) all in a single directory, and point runsvdir
at it. As a bonus, runsvdir monitors that directory, and if a
runsv directory is created or goes away, runsvdir
does the right thing.

It's an incredibly useful set of commands, and allows you to manage processes
fairly easily. In this case, every time I add a machine to this backup
scheme, I make an appropriate runsv dir with the correct
minio incantation in the run file, and just
symlink it into the runsvdir directory. We've been using
runit at work for quite a while now in containers, and it's
an awsome tool.

My newly-minted backup server is running Debian Stretch, which uses
systemd as its init system. Creating systemd unit files is still
something I have to think about hard whenever I do it, so here's the
one I use for runit:

Here, systemd starts runsvdir, pointing it at my
top-level directory of runsv directories. It runs
it as the backups user and group, and makes it
something that starts up once the system reaches "multi-user mode".