Для разработки и отладки интеграций можно запустить 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.
Создайте файл
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допустим только на локальной машине разработчика.Создайте файл
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: команда задаётся целиком, как в примере.Запустите контейнер:
docker compose up -dИнициализируйте и распечатайте 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.Войдите с 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» и «Клиенты приложений».