Сначала копия уходила на VPS по SFTP. Это удобно: нужен только SSH. Но у такого подхода есть слабое место. Ключ лежит на домашнем сервере, и им можно не только записывать, но и удалять. Если кто-то получит доступ к коробке, он дотянется и до внешней копии.
Режим только добавления
rest-server это маленький HTTP-сервер для репозиториев restic. Главное в нём флаг --append-only: клиент может добавлять снимки, но не может удалять или перезаписывать уже сохранённые данные.
Заодно копия стала обычным HTTPS на стандартном порту. С SFTP на некоторых сетях передача обрывалась на длинных заливках, а HTTPS через домашний роутер и провайдера идёт ровно. Первая заливка на 1,3 ТБ прошла без единого перезапуска.
Настройка на VPS
sudo useradd -r -d /srv/restic -s /usr/sbin/nologin restic
sudo install -d -o restic -g restic -m 700 /srv/restic
sudo htpasswd -B -c /srv/restic/.htpasswd box
sudo chown restic: /srv/restic/.htpasswd
Пароль здесь защищает доступ к серверу. Сами данные зашифрованы паролем restic, который на VPS не попадает.
Запуск со всеми нужными флагами:
rest-server --path /srv/restic \
--append-only --private-repos \
--tls --tls-cert /etc/rest-server/fullchain.pem \
--tls-key /etc/rest-server/key.pem
С --private-repos пользователь видит только репозитории внутри папки со своим именем. У меня это просто дополнительная страховка.
Настройка на клиенте
Адрес с паролем хранится в отдельном файле, чтобы он не попадал в список процессов:
sudo sh -c 'umask 077; echo "rest:https://box:ПАРОЛЬ@backup.example.org/box/main" > /etc/restic/remote-url'
restic --repository-file /etc/restic/remote-url snapshots
Кто теперь чистит старые снимки
При режиме добавления клиент не может выполнить forget, и репозиторий будет только расти. Чистить его должен сам VPS, напрямую с диска:
export RESTIC_PASSWORD_FILE=/root/restic-password
restic -r /srv/restic/box/main forget \
--keep-daily 7 --keep-weekly 5 --keep-monthly 12 --prune
Да, для этого пароль restic всё же попадает на VPS. Если не хочется держать его там, чистку можно запускать вручную раз в несколько месяцев, подключаясь по SSH и вводя пароль. Я так и делаю. На всякий случай снимки за год занимают немного, а объём диска есть с запасом.
Как это проверить
Попробуйте удалить снимок с клиента. Команда должна завершиться ошибкой:
restic --repository-file /etc/restic/remote-url forget latest
# ошибка: сервер отвечает 403, удаление запрещено
Если снимок удалился, значит флаг не применился. Лучше узнать об этом сейчас, чем после взлома.