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
:
[Unit] Description=Backup Service Minio Master runsvdir [Service] ExecStart=/usr/bin/runsvdir -P /backups/systems/conf/runit/ Restart=always KillMode=process KillSignal=SIGHUP SuccessExitStatus=111 WorkingDirectory=/backups/systems User=backups Group=backups UMask=002 [Install] WantedBy=multi-user.target
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".
Part 3 is coming, where I'll document backing up my first system.