arculaДокументация

Приложения

Vault: снимки Raft

По умолчанию Vault копируется файлами каталога данных — без согласованности: файлы читаются, пока Vault работает. Для Vault на Raft есть способ лучше — снимок через API Vault, целый на момент снимка. Его включаете вы: нужна настройка на сервере. Холодного бэкапа с остановкой Vault arcula не делает.

Какой у вас Vault

План защиты сервера → «Данные приложений». Агент называет Vault по типу хранилища:

  • «Vault, Raft» — снимок возможен;
  • «Vault, файловое хранилище» — снимка нет, только копия файлов. Обновление агента этого не изменит. Как перейти на Raft — ниже;
  • просто «Vault» — агент не прочитал тип хранилища. Почему — по кнопке «Почему».

Включить снимки

1. План подтверждён

Vault уже должен быть в принятом плане — пока копией файлов: arcula vault setup ищет его там.

2. На сервере

sudo arcula vault setup

Команда:

  1. находит Vault в плане и его адрес: IP контейнера, схема и порт — из его VAULT_ADDR, по умолчанию порт 8200;
  2. проверяет, что Vault распечатан и его хранилище — raft;
  3. спрашивает токен администратора Vault без эха; токен не сохраняется;
  4. создаёт политику arcula-snapshot с одним правом — читать снимок — и вход AppRole arcula-snapshot. Токены входа живут 15 минут и отзываются после каждого снимка;
  5. делает пробный снимок и кладёт role_id и secret_id в /etc/arcula/vault/ с правами 0600.

Ключи unseal команде не нужны.

  • В плане несколько Vault — назовите нужный ключом ресурса: sudo arcula vault setup db:vault/vault/vault. Ключ — в плане, по кнопке «Почему».
  • Адрес не нашёлся — задайте его: --address http://127.0.0.1:8200. Он сохранится.
  • Токен можно передать и переменной VAULT_TOKEN.

3. В ЛК

План защиты → строка Vault → «Как копировать» → «снимок Vault (raft) — нужна настройка на сервере» → «Сохранить план».

Со следующего бэкапа Vault идёт снимком: в бэкапе — файл vault-raft.snap.

Снимок не вышел — Vault запечатан, хранилище не raft, вход не прошёл — агент скопирует каталог данных файлами и оставит предупреждение vault_snapshot_failed. Оно в строках лога бэкапа: сервер → «Журнал» → «Бэкап сохранён» → «Строки лога».

Восстановить из снимка

arcula restore снимок не применяет: для этого нужны ключи unseal, а их у агента нет. Он извлекает снимок в /var/lib/arcula/restore/<id>/vault или в каталог из --target. Дальше — штатно.

Поднимите Vault с той же конфигурацией Raft. Если он пустой — vault operator init, распечатайте его временными ключами и войдите временным root-токеном. Vault в контейнере — сначала скопируйте снимок внутрь: docker cp. Затем:

vault operator raft snapshot restore -force vault-raft.snap

После этого распечатайте Vault исходными ключами unseal и проверьте vault status и секреты.

Ключи unseal храните отдельно: их нет ни в бэкапе, ни в recovery kit. ЛК напоминает о них у сервера: «Обзор» → «Понадобится при восстановлении».

Перейти с file storage на Raft

С хранилищем file снимка нет: arcula vault setup откажет — «Vault storage is file, not raft». Перевести Vault на Raft — ваш шаг. Vault на это время выключен, обычно на минуты.

Пример — для Compose с томом ./vault/data:/vault/data и конфигурацией в переменной VAULT_LOCAL_CONFIG. Команды — в каталоге проекта.

1. Остановить Vault

Остановите Vault и всё, что от него зависит, и сохраните копию vault/data — это точка отката:

docker compose stop vault
sudo cp -a vault/data vault/data.bak

2. Каталог для Raft

Владелец каталога — пользователь vault из образа. Узнайте его uid и gid:

docker compose run --rm --no-deps --entrypoint id vault vault
mkdir vault/raft
sudo chown <uid>:<gid> vault/raft

3. Файл переноса

Рядом с файлом Compose создайте migrate.hcl:

storage_source "file" { path = "/vault/data" }
storage_destination "raft" {
  path    = "/vault/raft"
  node_id = "vault-1"
}
cluster_addr = "http://127.0.0.1:8201"

4. Перенос

docker compose run --rm --no-deps -u vault -v "$PWD/vault/raft:/vault/raft" -v "$PWD/migrate.hcl:/vault/migrate.hcl" --entrypoint vault vault operator migrate -config=/vault/migrate.hcl

Исходный vault/data команда только читает.

5. Конфигурация

В VAULT_LOCAL_CONFIG замените "backend": {"file": {…}} на "storage": {"raft": {"path": "/vault/raft", "node_id": "vault-1"}} и добавьте "cluster_addr": "http://127.0.0.1:8201". В volumes сервиса добавьте ./vault/raft:/vault/raft.

6. Запуск

docker compose up -d vault

Распечатайте Vault теми же ключами unseal. vault status должен показать Storage Type raft. Проверьте секреты, затем поднимите остальные сервисы.

7. Снимки

В ЛК: сервер → «Настройки защиты» → «Обнаружить сейчас» или дождитесь обнаружения. Vault станет «Vault, Raft». Дальше — sudo arcula vault setup и «снимок Vault (raft)» в плане, как выше.

Откат — вернуть backend file в конфигурации. Когда снимки пошли, ./vault/data можно убрать из Compose и с диска.

Та же статья — в панели, в разделе «Справка».