Для разработки и отладки интеграций можно запустить Stronghold локально в Docker. Используйте такой экземпляр только для разработки: не храните в нём реальные секреты.

Сборка образа

Образ собирается командой stronghold bootstrap docker из бинарного файла Stronghold:

stronghold bootstrap docker
docker load -i stronghold-v1.19.0.tar

По умолчанию образ получает тег stronghold:<VERSION>, где <VERSION> — версия Stronghold, например stronghold:1.19.0.

Режим разработки

Команда контейнера по умолчанию — stronghold server -dev. В режиме разработки Stronghold:

  • хранит данные в памяти — после остановки контейнера всё теряется;
  • автоматически инициализируется и распечатывается;
  • выводит в лог root-токен;
  • работает без TLS.

Запустите контейнер. По умолчанию режим разработки слушает только 127.0.0.1 внутри контейнера, поэтому опубликованный порт будет недоступен. Задайте адрес прослушивания явно:

docker run --rm --name stronghold-dev -p 8200:8200 stronghold:1.19.0 stronghold server -dev -dev-listen-address=0.0.0.0:8200

Найдите root-токен в логе контейнера (строка Root Token) и настройте клиент:

export STRONGHOLD_ADDR=http://127.0.0.1:8200
export STRONGHOLD_TOKEN=<ROOT_TOKEN>
d8 stronghold status

Замените <ROOT_TOKEN> на root-токен из лога контейнера.

Для клиентских библиотек Vault задайте те же значения в VAULT_ADDR и VAULT_TOKEN. Подробнее — в разделе «Клиенты приложений».

Чтобы задать предсказуемый root-токен, добавьте параметр -dev-root-token-id:

docker run --rm --name stronghold-dev -p 8200:8200 stronghold:1.19.0 stronghold server -dev -dev-root-token-id=root -dev-listen-address=0.0.0.0:8200

Одноузловая конфигурация с Raft в Docker Compose

Если данные должны сохраняться между перезапусками, запустите Stronghold с конфигурационным файлом и хранилищем Raft.

  1. Создайте файл config/stronghold.hcl (формат описан в разделе «Настройка»):

    ui            = true
    disable_mlock = true
    api_addr      = "http://127.0.0.1:8200"
    cluster_addr  = "http://127.0.0.1:8201"
    
    storage "raft" {
      path    = "/stronghold/data"
      node_id = "dev-node-1"
    }
    
    listener "tcp" {
      address     = "0.0.0.0:8200"
      tls_disable = true
    }

    Параметр tls_disable = true допустим только на локальной машине разработчика.

  2. Создайте файл compose.yaml:

    services:
      stronghold:
        image: stronghold:1.19.0
        command: ["stronghold", "server", "-config=/stronghold/config/stronghold.hcl"]
        ports:
          - "8200:8200"
        volumes:
          - ./config:/stronghold/config:ro
          - stronghold-data:/stronghold/data
        restart: unless-stopped
    
    volumes:
      stronghold-data:

    Образ запускается от root (пользователь в образе не задан), поэтому права на том /stronghold/data дополнительно настраивать не нужно. В образе нет ENTRYPOINT: команда задаётся целиком, как в примере.

  3. Запустите контейнер:

    docker compose up -d
  4. Инициализируйте и распечатайте Stronghold. Для локальной разработки достаточно одного ключа:

    export STRONGHOLD_ADDR=http://127.0.0.1:8200
    d8 stronghold operator init -key-shares=1 -key-threshold=1
    d8 stronghold operator unseal

    Сохраните ключ распечатывания и root-токен из вывода operator init. После каждого перезапуска контейнера выполняйте d8 stronghold operator unseal.

  5. Войдите с root-токеном и включите нужные механизмы, например KV версии 2:

    export STRONGHOLD_TOKEN=<ROOT_TOKEN>
    d8 stronghold secrets enable -path=secret -version=2 kv
    d8 stronghold kv put -mount=secret myapp/db username=app password=S3cr3t

    Замените <ROOT_TOKEN> на root-токен из вывода operator init.

Веб-интерфейс доступен по адресу http://127.0.0.1:8200/ui.

Запуск приложения рядом со Stronghold

Приложение в том же файле compose.yaml обращается к Stronghold по имени сервиса. Добавьте сервис app в секцию services файла compose.yaml из предыдущего раздела:

services:
  app:
    image: registry.example.com/myapp:1.0.0
    environment:
      VAULT_ADDR: http://stronghold:8200
      VAULT_TOKEN: <ROOT_TOKEN>
    depends_on:
      - stronghold

Замените <ROOT_TOKEN> на root-токен из вывода operator init. Stronghold с хранилищем Raft не создаёт root-токен с заданным заранее значением, как -dev-root-token-id в режиме разработки.

Токен в переменной окружения допустим только для локальной разработки. В рабочих окружениях используйте методы аутентификации, описанные в разделах «Доставка секретов в поды Kubernetes» и «Клиенты приложений».