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

Первые шаги

Установка

Один контейнер, один файл конфигурации, одна мастер-фраза — и зачем нужен каждый из них.

Unruin поставляется одним образом Docker: бинарник unruin, restic, клиенты postgresql-client и mariadb-client и docker CLI. Один контейнер — это весь управляющий слой.

Эта страница доводит до работающего экземпляра. Боевая поза — выставление наружу, укрепление, резервная копия тома с состоянием, список проверок перед запуском — дальше, в развёртывании.

Что понадобится

Машина, где он будет жить что угодно с Docker. Между запусками он ничем не занят.
Доступ по SSH к тому, что копируем пользователь, который может читать данные, и его закрытый ключ.
Место под копии папка рядом, хост по SSH/SFTP или ведро, совместимое с S3.
Одна фраза, которую вы сохраните ею открывается хранилище секретов. Запишите её там, где не эта машина.

На серверы, которые копируются, ставить не нужно ничего. Для источников-папок и docker-томов Unruin сам доставляет свой статический restic в ~/.cache/unruin/ пользователя на цели, когда тот там впервые понадобится.

Взять образ

Закреплённая версия:

sh
docker pull git.dreep.ru/smirnar/unruin:1.0.0

Или собрать из клона — тем же Dockerfile, из которого собирается опубликованный образ:

sh
git clone https://git.dreep.ru/smirnar/unruin.git
cd unruin
docker build -t unruin:local .

Если тег в реестре вам недоступен, соберите из исходников. Для сборки не нужно ничего, кроме Docker, и получится тот же самый образ.

Есть и обычная сборка на Go — чтобы гонять команды без Docker. Ей нужен инструментарий Go и restic в PATH:

sh
go build -o bin/unruin ./cmd/unruin
./bin/unruin validate examples/jobs.yaml

Запустить

В репозитории лежит боевой compose — examples/production/. Скопируйте эту папку себе и работайте от неё, а не пишите свою с нуля: там уже сделано правильно то, что легко сделать неправильно. Закреплённая версия образа, конфигурация, примонтированная только на чтение, долговечный том с состоянием, порт, открытый только на loopback, проверка живости и no-new-privileges.

sh
cp -r examples/production /srv/unruin
cd /srv/unruin
cp .env.example .env      # и заполнить — см. ниже
docker compose up -d

Три переменные, которые важны на первом запуске:

Переменная Что это
UNRUIN_MASTER_PASSPHRASE открывает встроенное хранилище секретов kr://. Без неё ссылки kr:// не читаются, и панель об этом скажет.
UNRUIN_API_TOKEN обязателен, как только до порта может дотянуться кто-то кроме loopback этой машины. Сгенерировать: openssl rand -hex 32.
UNRUIN_IMAGE точная версия образа. Закрепите её: гоняться за :latest значит позволить случайному docker compose pull подменить работающую версию.

Всё, что должно пережить перезапуск, лежит на томе unruin-state: история запусков (runs.db), шифрованное хранилище секретов (secrets.kr), закреплённые ключи хостов SSH и кэш restic. Потерять его — потерять историю и секреты; что держать отдельно, написано на странице секреты.

Убедиться, что поднялся

sh
docker compose ps                 # STATUS должен дойти до "healthy" секунд за 20
docker compose logs unruin       # "unruin: dashboard on http://0.0.0.0:8080"

Дальше — проверить конфигурацию, сначала на бумаге, потом по-настоящему:

sh
docker compose exec unruin unruin validate /config/jobs.yaml
docker compose exec unruin unruin validate /config/jobs.yaml --preflight

--preflight разрешает каждый секрет, открывает соединение SSH с каждым сервером и щупает каждое хранилище. Это разница между «файл разбирается» и «это действительно пойдёт сегодня ночью». На заготовке из стартовой конфигурации он и должен упасть, пока вы не направите её на настоящий сервер.

Открыть панель

Compose публикует порт только на loopback хоста:

http://127.0.0.1:8080

Если задан UNRUIN_API_TOKEN, панель откроется на экране, который просит этот ключ; вставьте один раз, дальше он живёт в браузере. Если вы ходите на машину по SSH — пробросьте порт, а не открывайте его в сеть:

sh
ssh -N -L 8080:127.0.0.1:8080 you@your-host

Как выставить панель наружу по-человечески — TLS, обратный прокси, какой способ входа выбрать — на странице вход и выставление наружу.

Два способа владеть конфигурацией

Решите это сейчас: от этого зависит, что панели разрешено.

  • Через git (так сделано в примере): /config примонтирован только на чтение, задан UNRUIN_READONLY=1. Панель читает и запускает; любая попытка что-то изменить получает честный 403. Изменения идут через git pull и перезапуск. В бою рекомендуется именно это.
  • Через панель: уберите UNRUIN_READONLY и примонтируйте ./config на запись. Теперь задания, серверы, хранилища и секреты заводятся из браузера. Каждое изменение проверяется, прогоняется туда-обратно и пишется атомарно; отвергнутое изменение до работающей конфигурации не доходит. См. панель.

Переключаться можно когда угодно — это две строки в compose, и файл конфигурации в обоих случаях один и тот же.

Дальше

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