Stronghold можно установить двумя способами:
- быстрая установка — одноузловой сервер командой
stronghold bootstrap service, доступно с версииv1.19; - ручное развёртывание — кластер из нескольких узлов в режиме высокой доступности (HA) с хранилищем Raft.
Группа команд stronghold bootstrap также генерирует другие артефакты развёртывания: архив Helm-чарта и tar-архив Docker-образа. Полный интерфейс CLI см. в разделе Bootstrap.
Предварительные требования для обоих сценариев:
- на сервере установлена поддерживаемая ОС (Ubuntu, RedOS, Astra Linux);
- на сервер скопирован дистрибутив Stronghold, бинарный файл
strongholdдоступен для запуска.
Быстрая установка
Команда stronghold bootstrap service генерирует shell-скрипт, который подготавливает одноузловое окружение Stronghold: каталоги, файл конфигурации, systemd-unit, системного пользователя, установку бинарного файла и при необходимости самоподписанные TLS-сертификаты.
Самоподписанные TLS-сертификаты подходят только для тестирования.
Для production подготовьте собственные сертификаты и используйте параметр -no-tls.
По умолчанию скрипт выводится в stdout — его можно просмотреть перед применением:
stronghold bootstrap service | lessПримените скрипт одним из способов:
stronghold bootstrap service | sudo shили выполните установку напрямую:
sudo stronghold bootstrap service -applyСкрипт создаёт окружение в каталоге /opt/stronghold (параметр -base-dir), systemd-unit /etc/systemd/system/stronghold.service и системного пользователя stronghold, затем включает и запускает сервис.
После запуска откройте в браузере адрес https://<имя-узла>:8200 и выполните инициализацию через веб-интерфейс.
Либо продолжите инициализацию вручную, как описано ниже.
Укажите путь к CA-сертификату, созданному bootstrap:
export STRONGHOLD_CACERT=/opt/stronghold/tls/stronghold-ca.pemИнициализируйте Stronghold:
stronghold operator initПри необходимости задайте параметры:
-key-shares— количество частей ключа (по умолчанию 5);-key-threshold— минимальное число частей, достаточных для распечатывания хранилища (по умолчанию 3).
После инициализации в терминале будут показаны все части ключа и корневой токен. Обязательно сохраните их в надёжном месте. Без достаточного числа ключевых частей доступ к данным Stronghold будет невозможен.
Распечатайте хранилище. Выполните команду несколько раз, вводя ключи распечатки:
stronghold operator unsealЕсли параметр -key-threshold не менялся, нужно ввести 3 части ключа.
Проверьте статус:
stronghold statusОсновные параметры bootstrap service
Часто используемые параметры:
| Параметр | Назначение |
|---|---|
-apply | Выполнить сгенерированный скрипт вместо вывода в stdout |
-base-dir | Базовый каталог установки (по умолчанию /opt/stronghold) |
-force | Перезаписать существующие файлы |
-no-tls | Не генерировать TLS-сертификаты (для собственных сертификатов) |
-tls-disable | Отключить TLS в конфигурации listener (только для разработки) |
-no-systemd | Не создавать и не включать systemd-unit |
-listener-address | Адрес TCP-listener в формате host:port (по умолчанию 0.0.0.0:8200) |
-api-addr | API-адрес, который Stronghold сообщает клиентам |
-cluster-addr | Адрес кластера для Raft |
-node-id | Идентификатор узла Raft (по умолчанию — имя хоста) |
Полный список параметров и другие подкоманды bootstrap (helm, docker) см. в разделе Bootstrap или выполните stronghold bootstrap service -help.
Дополнительную настройку сервера см. в разделе Настройка.
Развёртывание кластера в режиме HA
Stronghold поддерживает мультисерверный режим для обеспечения высокой доступности (HA). Этот режим автоматически включается при использовании совместимого хранилища данных и защищает систему от сбоев за счёт работы нескольких серверов Stronghold.
Чтобы проверить поддержку режима высокой доступности, запустите сервер и убедитесь, что рядом с информацией о хранилище выводится сообщение HA available. В этом случае Stronghold автоматически использует режим HA.
Для обеспечения высокой доступности один из узлов Stronghold получает блокировку в системе хранения данных и становится активным, а остальные узлы переходят в режим ожидания. Если резервные узлы получают запросы, они либо перенаправляют их, либо переадресовывают клиентов в соответствии с настройками и текущим состоянием кластера.
Для работы Stronghold в режиме HA с интегрированным хранилищем Raft требуется как минимум три сервера Stronghold. Это условие необходимо для достижения кворума — без него кластер не сможет работать с хранилищем.
Дополнительные предварительные требования:
- для каждого узла в кластере Raft выпущены индивидуальные сертификаты;
- подготовлен сертификат корневого центра сертификации (CA).
Ниже приведён сценарий ручного развёртывания кластера Stronghold из трёх узлов: одного активного и двух резервных.
Подготовка инфраструктуры
Запуск через systemd-unit
Все примеры предполагают, что создан системный пользователь stronghold, и сервис запускается от его имени.
Если требуется использовать другого пользователя, замените stronghold на соответствующее имя.
Базовое окружение на каждом узле (каталоги, пользователь, systemd-unit, бинарный файл) можно подготовить командой stronghold bootstrap service с параметром -no-tls, а затем разместить собственные сертификаты и конфигурацию HA.
Либо создайте systemd-unit вручную:
Создайте файл
/etc/systemd/system/stronghold.serviceсо следующим содержимым:[Unit] Description=Stronghold service Documentation=https://deckhouse.ru/products/stronghold/ After=network.target [Service] Type=simple ExecStart=/opt/stronghold/stronghold server -config=/opt/stronghold/config.hcl ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=5 User=stronghold Group=stronghold LimitNOFILE=65536 CapabilityBoundingSet=CAP_IPC_LOCK AmbientCapabilities=CAP_IPC_LOCK SecureBits=noroot [Install] WantedBy=multi-user.targetПримените изменения в конфигурации systemd:
systemctl daemon-reloadВключите автозапуск сервиса:
systemctl enable stronghold.serviceСоздайте каталог
/opt/stronghold/dataи установите права доступа:mkdir -p /opt/stronghold/data chown stronghold:stronghold /opt/stronghold/data chmod 0700 /opt/stronghold/data
Подготовка необходимых сертификатов
Для настройки TLS требуется набор сертификатов и ключей в каталоге /opt/stronghold/tls:
- сертификат корневого центра сертификации (CA)
stronghold-ca.pem— сертификат, которым подписаны TLS-сертификаты Stronghold; - сертификаты узлов Raft (в сценарии — три узла):
node-1-cert.pem;node-2-cert.pem;node-3-cert.pem;
- закрытые ключи сертификатов узлов:
node-1-key.pem;node-2-key.pem;node-3-key.pem.
В данном примере создаётся корневой сертификат, а также набор самоподписанных сертификатов для каждого узла.
Самоподписанные сертификаты подходят только для тестовых сценариев и экспериментов. Для эксплуатации в production настоятельно рекомендуется использовать сертификаты, созданные и подписанные доверенным центром сертификации (CA).
На первом узле создайте каталог для хранения сертификатов (если он ещё не существует) и перейдите в него:
mkdir -p /opt/stronghold/tls cd /opt/stronghold/tls/Сгенерируйте ключ для корневого сертификата:
openssl genrsa 2048 > stronghold-ca-key.pemВыпустите корневой сертификат:
openssl req -new -x509 -nodes -days 3650 -key stronghold-ca-key.pem -out stronghold-ca.pem Country Name (2 letter code) [XX]:RU State or Province Name (full name) []: Locality Name (eg, city) [Default City]:Moscow Organization Name (eg, company) [Default Company Ltd]:MyOrg Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server hostname) []:demo.tldАтрибуты сертификата приведены в качестве примера.
Для выпуска сертификатов узлов создайте конфигурационные файлы с параметром
subjectAltName(SAN). Например, для узлаraft-node-1:cat << EOF > node-1.cnf [v3_ca] subjectAltName = @alt_names [alt_names] DNS.1 = raft-node-1.demo.tld IP.1 = 10.20.30.10 IP.2 = 127.0.0.1 EOFКаждый узел должен иметь корректные FQDN и IP-адреса. Поле
subjectAltNameв сертификате должно содержать значения, актуальные для конкретного узла. Аналогично создайте отдельный конфигурационный файл для каждого узла.Сформируйте запросы на сертификаты (CSR) и ключи для узлов:
openssl req -newkey rsa:2048 -nodes -keyout node-1-key.pem -out node-1-csr.pem -subj "/CN=raft-node-1.demo.tld" openssl req -newkey rsa:2048 -nodes -keyout node-2-key.pem -out node-2-csr.pem -subj "/CN=raft-node-2.demo.tld" openssl req -newkey rsa:2048 -nodes -keyout node-3-key.pem -out node-3-csr.pem -subj "/CN=raft-node-3.demo.tld"Выпустите сертификаты на основе созданных CSR:
openssl x509 -req -set_serial 01 -days 3650 -in node-1-csr.pem -out node-1-cert.pem -CA stronghold-ca.pem -CAkey stronghold-ca-key.pem -extensions v3_ca -extfile ./node-1.cnf openssl x509 -req -set_serial 01 -days 3650 -in node-2-csr.pem -out node-2-cert.pem -CA stronghold-ca.pem -CAkey stronghold-ca-key.pem -extensions v3_ca -extfile ./node-2.cnf openssl x509 -req -set_serial 01 -days 3650 -in node-3-csr.pem -out node-3-cert.pem -CA stronghold-ca.pem -CAkey stronghold-ca-key.pem -extensions v3_ca -extfile ./node-3.cnfРекомендуется использовать уникальные значения
-set_serialдля каждого сертификата.Скопируйте на каждый узел необходимые файлы:
- сертификат узла;
- закрытый ключ узла;
- корневой сертификат.
Например, для узлов
raft-node-2иraft-node-3:scp ./node-2-key.pem ./node-2-cert.pem ./stronghold-ca.pem raft-node-2.demo.tld:/opt/stronghold/tls scp ./node-3-key.pem ./node-3-cert.pem ./stronghold-ca.pem raft-node-3.demo.tld:/opt/stronghold/tlsЕсли каталога
/opt/stronghold/tlsнет на целевых узлах — создайте его.
Развёртывание кластера с Raft
Подключитесь к первому серверу, на котором будет выполняться инициализация кластера Stronghold.
Разрешите сетевые подключения для TCP-портов
8200и8201. Пример дляfirewalld:firewall-cmd --add-port=8200/tcp --permanent firewall-cmd --add-port=8201/tcp --permanent firewall-cmd --reloadПри необходимости можно использовать другие порты, указав их в конфигурационном файле
/opt/stronghold/config.hcl.Создайте конфигурационный файл
/opt/stronghold/config.hclдля Raft:ui = true cluster_addr = "https://10.20.30.10:8201" api_addr = "https://10.20.30.10:8200" disable_mlock = true listener "tcp" { address = "0.0.0.0:8200" tls_cert_file = "/opt/stronghold/tls/node-1-cert.pem" tls_key_file = "/opt/stronghold/tls/node-1-key.pem" } storage "raft" { path = "/opt/stronghold/data" node_id = "raft-node-1" retry_join { leader_tls_servername = "raft-node-1.demo.tld" leader_api_addr = "https://10.20.30.10:8200" leader_ca_cert_file = "/opt/stronghold/tls/stronghold-ca.pem" leader_client_cert_file = "/opt/stronghold/tls/node-1-cert.pem" leader_client_key_file = "/opt/stronghold/tls/node-1-key.pem" } retry_join { leader_tls_servername = "raft-node-2.demo.tld" leader_api_addr = "https://10.20.30.11:8200" leader_ca_cert_file = "/opt/stronghold/tls/stronghold-ca.pem" leader_client_cert_file = "/opt/stronghold/tls/node-1-cert.pem" leader_client_key_file = "/opt/stronghold/tls/node-1-key.pem" } retry_join { leader_tls_servername = "raft-node-3.demo.tld" leader_api_addr = "https://10.20.30.12:8200" leader_ca_cert_file = "/opt/stronghold/tls/stronghold-ca.pem" leader_client_cert_file = "/opt/stronghold/tls/node-1-cert.pem" leader_client_key_file = "/opt/stronghold/tls/node-1-key.pem" } }Запустите сервис Stronghold:
systemctl start strongholdУкажите путь к CA-сертификату:
export STRONGHOLD_CACERT=/opt/stronghold/tls/stronghold-ca.pemИнициализируйте кластер:
stronghold operator initПри необходимости задайте параметры:
-key-shares— количество частей ключа (по умолчанию 5);-key-threshold— минимальное число частей, достаточных для распечатывания хранилища (по умолчанию 3).
После инициализации в терминале будут показаны все части ключа и корневой токен. Обязательно сохраните их в надёжном месте. Без достаточного числа ключевых частей доступ к данным Stronghold будет невозможен.
Распечатайте кластер. Выполните команду несколько раз, вводя ключи распечатки:
stronghold operator unsealЕсли параметр
-key-thresholdне менялся, нужно ввести 3 части ключа.Настройте остальные узлы:
- укажите в
/opt/stronghold/config.hclсвои значенияcluster_addrиapi_addr, а также пути к сертификатам этого узла; - пропустите шаг инициализации;
- сразу выполните распечатку кластера (
operator unseal).
- укажите в
Проверьте работу кластера:
stronghold status Key Value --- ----- Seal Type shamir Initialized true Sealed false Total Shares 5 Threshold 3 Version 1.15.2 Build Date 2025-03-07T16:10:46Z Storage Type raft Cluster Name stronghold-cluster-a3fcc270 Cluster ID f682968d-5e6c-9ad4-8303-5aecb259ca0b HA Enabled true HA Cluster https://10.20.30.10:8201 HA Mode active Active Node Address https://10.20.30.10:8200 Raft Committed Index 40 Raft Applied Index 40