UNRUIN
документация · v1.0

Первые шаги

Первая копия

От пустой машины до копии, которую уже развернули обратно и проверили.

Отсюда — от пустого места до копии, которую уже развернули обратно и проверили. В примере хранилище локальное, а источник — команда, чтобы весь путь можно было пройти на одной машине. В конце показано, как перевести то же самое на настоящий сервер.

Устройство одной строкой: завести сервер (адрес, пользователь, вставленный ключ), завести хранилище (папка, облако, другой компьютер), завести задание (что + куда + когда) — и всё. Ставить на ваши хосты, кроме доступа по SSH, нечего. Что изменилось и почему — в SIMPLIFICATION.md.

1. Собрать

sh
go build -o bin/unruin ./cmd/unruin

Ещё понадобится restic в PATH (restic version).

2. Самая маленькая конфигурация

local.yaml — снимает вывод команды в локальное хранилище:

yaml
servers:
  here:
    host: 127.0.0.1
    user: youruser
    ssh_key: "env://SSH_KEY"          # для команды, запускаемой локально, не нужен

destinations:
  primary:
    backend: { type: local, path: /tmp/unruin-repo }   # mode по умолчанию restic
    repo_password: "env://REPO_PW"

jobs:
  - name: hello
    server: here
    source: { type: command, command: "printf hello-world" }
    dest: [ { name: primary, required: true } ]
    rotation: { keep_last: 3 }
    verify: true

3. Проверить

sh
./bin/unruin validate local.yaml
# config OK: 1 server(s), 1 destination(s), 1 job(s)

validate ловит опечатки, битые ссылки, недостающие параметры и негодный cron — до трёх часов ночи, а не в три часа ночи.

4. Запустить

Источники-потоки идут по SSH, поэтому настоящему запуску нужен доступ по SSH до host. Чтобы честно попробовать на одной машине, включите SSH на localhost — или сразу перейдите к шагу 6 и возьмите настоящий сервер. Когда SSH работает:

sh
export REPO_PW="придумайте-длинную-фразу"
export UNRUIN_STATE_DIR=/tmp/unruin-state
./bin/unruin run local.yaml hello
# job "hello": success

Unruin снял вывод команды в хранилище, а затем развернул его обратно — достал последнюю точку восстановления во временную папку и убедился, что она не пустая.

5. Посмотреть и прибраться

sh
restic -r /tmp/unruin-repo snapshots          # точка восстановления с меткой job:hello
./bin/unruin prune local.yaml hello --dry-run # что удалила бы уборка

6. Настоящий сервер

Направьте задание на настоящую машину и настоящую базу:

yaml
servers:
  vps-prod-1:
    host: 10.0.0.11
    user: root
    ssh_key: "kr://ssh/vps-prod-1"

destinations:
  minio-primary:
    backend: { type: s3, endpoint: https://minio.example.com, bucket: backups }
    access:        "kr://minio/primary"      # в записи поля access_key и secret_key
    repo_password: "kr://restic/minio-primary#password"

jobs:
  - name: app-db-nightly
    server: vps-prod-1
    source: { type: postgres, db: app }
    dest: [ { name: minio-primary, required: true } ]
    schedule: "0 3 * * *"
    rotation: { keep_daily: 14 }

Положите секреты во встроенное хранилище kr:// (или вставьте в поле в панели) и запускайте:

sh
export UNRUIN_MASTER_PASSPHRASE="придумайте-длинную-фразу"   # открывает хранилище kr://
printf %s 'значение-секрета' | ./bin/unruin secret set restic/minio-primary#password
./bin/unruin run prod.yaml app-db-nightly      # разово
./bin/unruin serve prod.yaml                   # или демон с расписанием

Для источника-пути (files / docker_volume) на цель ставить нечего: Unruin доставит туда свой restic по SSH сам. Пользователю SSH достаточно уметь читать путь. См. SERVER-SETUP.md.

Каждое поле — в CONFIGURATION.md, как оно работает — в ARCHITECTURE.md, а восстановление после аварии — в RESTORE.md.

Бесплатно, целиком ваше, наружу ничего не уходит. Сайт статический: ни аналитики, ни куки, ни внешних запросов.