Установка Single Node
Назначение и ограничения
Single Node — одноузловой стенд для демонстрации и функциональной проверки Закрома.Хранение. На одном сервере совмещены сервисы Закрома.Хранение, ZDS в режиме FS и PostgreSQL.
Не для продуктивной эксплуатацииОдин узел и режим ZDS FS без избыточного кодирования не дают необходимой отказоустойчивости: выход узла или диска из строя приводит к недоступности сервиса и может привести к потере данных. Для отказоустойчивой инсталляции используйте базовый трёхузловой кластер.
Опциональные компоненты в этой инструкции не устанавливаются. Внешняя аутентификация через Keycloak описана в сценарии с Keycloak.
Устанавливаемые компоненты
| Компонент | Назначение |
|---|---|
| Закрома.Хранение | Управляющий слой, предоставляющий S3 API и Admin UI. |
| ZDS (режим FS) | Слой хранения данных без избыточного кодирования на одном узле. |
| PostgreSQL | СУБД для метаданных Закрома.Хранение. |
| Сервер | Компоненты |
|---|---|
plank.zakroma.internal | Закрома.Хранение, ZDS, PostgreSQL |
Имя plank используется только в примере. Замените его реальным именем и IP-адресом из вашей инфраструктуры и используйте то же имя в инвентаре Ansible и переменных group_vars.
Схема установки
На одном сервере совмещены PostgreSQL, Закрома.Хранение и ZDS. DNS или файл hosts обеспечивают доступ к сервисам по выбранным доменным именам.
Обозначение Server1 условное. Используйте имя узла из таблицы и файла inventories/single-node/hosts.

Установку можно выполнять с самого узла или с отдельного управляющего сервера.
Минимальные требования
| Что подготовить | Минимум для функционального стенда | Комментарий |
|---|---|---|
| Узел | 1 узел x86_64, 4 vCPU и 8 ГБ RAM | Стенд предназначен только для демонстрации и функциональной проверки. |
| Системный диск | SSD от 40 ГБ | Обеспечьте рекомендуемую ёмкость под разделы ОС в соответствии с рекомендациями разработчика ОС. |
| Диск данных ZDS | Отдельный смонтированный том, например /mnt/data | Путь в этой статье приведён как пример. Используйте фактическую точку монтирования. |
| PostgreSQL | Установлен на этом же узле и доступен | Подготовьте базу и пользователя до запуска плейбуков. |
| ОС и Ansible | Поддерживаемая ОС из списка; Ansible 2.15.0–2.18.15 | Сверьте поддерживаемый дистрибутив со статьёй о составе поставки. |
| Доступ к узлу | SSH и возможность выполнять команды через sudo | Выполните проверку доступности узла модулем Ansible ping. |
| Файлы и учётные данные | Лицензия, TLS-сертификаты и ключ, CA | Подготовьте их до запуска плейбуков. |
Подготовка PostgreSQL, DNS и TLS
До начала установки:
- Подготовьте PostgreSQL по инструкции Настройка PostgreSQL.
- Рассчитайте требуемое количество подключений по инструкции Расчёт max_connections PostgreSQL.
- Убедитесь, что FQDN узла, Admin UI и S3 API разрешаются с управляющего сервера и с самого узла.
- Подготовьте wildcard-сертификат или сертификат с SAN для используемых FQDN. Требования к DNS, сертификатам, узлам и дискам приведены в Подготовке к установке.
- Убедитесь, что лицензия и TLS-файлы доступны на управляющем сервере.
Установка
1. Получение и распаковка архива поставки zakroma-roles
1tar -xvzf zakroma-roles-<ВЕРСИЯ_АРХИВА>.tar.gz 2cd zakroma-roles-<ВЕРСИЯ_АРХИВА>
Проверьте структуру распакованной поставки:
1tree -L 1
В корне должны присутствовать как минимум ansible.cfg, files, inventories, playbooks, requirements.yml.template и roles.
Установка из локальных файловВ этой инструкции все компоненты устанавливаются из локальных файлов архива поставки. Доступ к внешним репозиториям продукта не требуется.
2. Настройка инвентаря Ansible
Отредактируйте inventories/single-node/hosts. Оставьте в группах certificates, zakroma-storage и zakroma-zds-fs только один узел.
Замените имя узла и IP-адрес. Значение zakroma_zds_node_name должно быть постоянным и не должно меняться в процессе эксплуатации.
1[certificates] 2plank ansible_host=10.40.0.10 3 4[zakroma-storage] 5plank ansible_host=10.40.0.10 6 7# Не изменяйте zakroma_zds_node_name после ввода стенда в эксплуатацию. 8[zakroma-zds-fs] 9plank ansible_host=10.40.0.10 zakroma_zds_node_name=plank
Проверьте SSH-доступ и выполнение Python-модулей Ansible:
1ANSIBLE_CONFIG=ansible.cfg ansible -m ping -i inventories/single-node/hosts all
Ожидаемый результат: узел отвечает SUCCESS и pong.
3. Настройка распространения сертификатов
Поместите сертификат и ключ в каталог files на управляющем сервере. Затем отредактируйте inventories/single-node/group_vars/certificates.yml.
Исходный файл содержит два элемента списка certs для узла plank: сертификат Keycloak и сертификат Закрома.Хранение. Keycloak в этом сценарии не устанавливается — удалите элемент с файлами keycloak.crt и keycloak.key, затем настройте оставшийся элемент.
1--- 2certificates_copy_source_path: "files" 3 4host_cert_config: 5 plank: # имя из инвентаря Ansible 6 certs: 7 - src_dir: "{{ certificates_copy_source_path }}" 8 dest_dir: "/opt/certs/" 9 cert_file: "zakroma.crt" 10 key_file: "zakroma.key" 11 owner: "zakroma" 12 group: "zakroma" 13 cert_permissions: "0644" 14 key_permissions: "0600"
| Переменная | Что указать |
|---|---|
certificates_copy_source_path | Каталог с сертификатом и ключом на управляющем сервере. |
Ключ host_cert_config | Имя узла из инвентаря Ansible. |
cert_file, key_file | Реальные имена файлов сертификата и закрытого ключа. |
dest_dir | Каталог сертификатов, который затем используется в zakroma-storage.yml. |
owner, group, права | Пользователь сервиса и безопасные права на файлы. |
4. Настройка Закрома.Хранение
Отредактируйте inventories/single-node/group_vars/zakroma-storage.yml. Не заменяйте файл приведёнными ниже фрагментами целиком: сохраните остальные параметры поставки без изменений и измените только перечисленные параметры.
4.1. Настройка подключения к PostgreSQL
Параметры PostgreSQL находятся в нескольких блоках исходного файла. Во всех блоках должны использоваться одинаковые хост, порт, пользователь, пароль, имя базы и SSL-режим; значение postgresql_schema_name оставьте соответствующим компоненту.
| Блок | Схема |
|---|---|
zakroma_storage_core | core |
PostgreSQL внутри zakroma_storage_gateway | permission |
Первый элемент zakroma_storage_workers | worker0 |
zakroma_storage_seclog | seclog |
zakroma_storage_notification | notification |
Чтобы не повторять параметры подключения, задайте общие переменные рядом с существующей переменной zakroma_storage_postgresql_host. Блоки компонентов ниже уже используют эти общие значения:
1zakroma_storage_postgresql_host: "<POSTGRESQL_FQDN>" 2zakroma_storage_postgresql_port: 5432 3zakroma_storage_postgresql_username: "<POSTGRESQL_USER>" 4zakroma_storage_postgresql_password: "<POSTGRESQL_PASSWORD>" 5zakroma_storage_postgresql_dbname: "zakroma" 6zakroma_storage_postgresql_sslmode: "<POSTGRESQL_SSLMODE>" 7zakroma_storage_postgresql_max_open_conns: 10 8zakroma_storage_postgresql_max_idle_conns: 5 9zakroma_storage_postgresql_connection_timeout: "10s" 10zakroma_storage_postgresql_target_session_attrs: "read-write"
В каждом существующем блоке компонента замените только параметры подключения. Например:
1zakroma_storage_core: 2 postgresql_host: "{{ zakroma_storage_postgresql_host }}" 3 postgresql_port: "{{ zakroma_storage_postgresql_port }}" 4 postgresql_username: "{{ zakroma_storage_postgresql_username }}" 5 postgresql_password: "{{ zakroma_storage_postgresql_password }}" 6 postgresql_dbname: "{{ zakroma_storage_postgresql_dbname }}" 7 postgresql_schema_name: core 8 postgresql_sslmode: "{{ zakroma_storage_postgresql_sslmode }}" 9 postgresql_max_open_conns: "{{ zakroma_storage_postgresql_max_open_conns }}" 10 postgresql_max_idle_conns: "{{ zakroma_storage_postgresql_max_idle_conns }}" 11 postgresql_connection_timeout: "{{ zakroma_storage_postgresql_connection_timeout }}" 12 postgresql_target_session_attrs: "{{ zakroma_storage_postgresql_target_session_attrs }}" 13 # Остальные параметры zakroma_storage_core сохраните без изменений.
| Что изменить | Значение |
|---|---|
<POSTGRESQL_FQDN> | DNS-имя или IP PostgreSQL. Для локальной установки на этом же узле — его FQDN. |
<POSTGRESQL_USER> | Пользователь базы zakroma. |
<POSTGRESQL_PASSWORD> | Пароль пользователя PostgreSQL. |
<POSTGRESQL_SSLMODE> | Режим SSL, согласованный с конфигурацией PostgreSQL. |
postgresql_schema_name | Сохраните схемы core, permission, worker0, seclog и notification в соответствующих блоках. |
Защита чувствительных данныхДля безопасной работы с конфигурациями Ansible и переменными используйте
ansible-vault. Ниже приведён пример шифрования пароля PostgreSQL.
1ANSIBLE_CONFIG=ansible.cfg ansible-vault encrypt_string \ 2 --name zakroma_storage_postgresql_password
Завершение ввода значенияПосле ввода Vault-пароля введите значение переменной. Чтобы завершить ввод без добавления перевода строки, не нажимая
Enter, нажмитеCtrl+D.
Введите Vault-пароль и значение переменной, затем вставьте весь полученный YAML-блок с !vault вместо открытого zakroma_storage_postgresql_password. Если используются зашифрованные переменные, добавляйте при запуске Ansible ключ из примера в разделе распространения лицензии.
4.2. Настройка домена, TLS и локальной авторизации
Измените FQDN сервиса Admin UI, базовый домен, параметры TLS и параметры учётной записи локального администратора. Остальные параметры внутри блока zakroma_storage_gateway можно оставить без изменений.
1zakroma_storage_admin: 2 path: "<ADMIN_UI_FQDN>" 3 4zakroma_storage_nginx_proxy: false 5zakroma_storage_base_domain: "<BASE_DOMAIN>" 6 7zakroma_storage_gateway: 8 host: "<GATEWAY_FQDN>" 9 s3api_port: 80 10 management_port: 8080 11 admin_console_location: "/opt/zakroma/zakroma-storage-admin/frontend/dist/admin-ui/" 12 tls: 13 enabled: true 14 certs: 15 - key: "/opt/certs/zakroma.key" 16 crt: "/opt/certs/zakroma.crt" 17 path_to_licence: "/opt/zakroma/zakroma-storage-gateway/bin/licence" 18 19 default_admin: "<LOCAL_ADMIN>" 20 auth: 21 auth_provider: file 22 user_provider: file 23 users: 24 - name: "<LOCAL_ADMIN>" 25 password: "<LOCAL_ADMIN_PASSWORD>" 26 groups: 27 - clouduser 28# Группа clouduser тут указана в качестве примера.
| Переменная | Что указать |
|---|---|
<ADMIN_UI_FQDN> | FQDN Admin UI из DNS и сертификата. |
<BASE_DOMAIN> | Базовый домен рабочих областей и S3 API. |
<GATEWAY_FQDN> | URL сервиса gateway для совместимости с предыдущими версиями Закрома.Хранение. |
s3api_port, management_port | Порты из согласованной конфигурации инфраструктуры. |
tls.certs | Пути до сертификатов и ключей, которые совпадают с настройками шага распространения сертификатов. |
<LOCAL_ADMIN> | Имя локального администратора. |
<LOCAL_ADMIN_PASSWORD> | Пароль локального администратора. |
При использовании внешнего Nginx см. Настройка Nginx. Роль zakroma-storage не устанавливает внешний балансировщик.
5. Настройка сервиса ZDS в режиме FS
Отредактируйте inventories/single-node/group_vars/zakroma-zds-fs.yml. Режим FS работает на одном узле без избыточного кодирования. Сохраните неизменяемые параметры поставки и замените только значения, которые зависят от конфигурации вашего узла.
1# Список mountpoint на файловой системе, которые будет использовать ZDS 2zakroma_zds_volumes: 3 - index: 1 4 path: /mnt/data 5 6# Логин для подключения 7zakroma_zds_auth_user: "<ZDS_USER>" 8 9# Пароль для подключения 10zakroma_zds_auth_passwd: "<ZDS_PASSWORD>"
| Переменная | Что указать |
|---|---|
zakroma_zds_volumes | Реальная точка монтирования диска данных, существующая на узле. |
<ZDS_USER>, <ZDS_PASSWORD> | Учётные данные доступа к ZDS. Они понадобятся при подключении ZDS в Admin UI. |
6. Проверка конфигурации
Проверьте, что инвентарь и YAML-файлы корректно загружаются Ansible:
1ANSIBLE_CONFIG=ansible.cfg ansible-inventory \ 2 -i inventories/single-node/hosts \ 3 --list >/dev/null
7. Распространение сертификатов и лицензии
Выполните плейбук для распространения сертификатов:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook \ 2 -i inventories/single-node/hosts \ 3 playbooks/sample-play-copy-certificates.yml
На узле проверьте файлы, владельца и права:
1sudo stat -c '%U:%G %a %n' /opt/certs/zakroma.crt /opt/certs/zakroma.key 2openssl x509 -in /opt/certs/zakroma.crt -noout -subject -issuer -dates
Ожидаются владелец zakroma, права 644 для сертификата и 600 для ключа.
На управляющем сервере проверьте цепочку исходного сертификата с доверенным CA:
1openssl verify -CAfile <CA_CERTIFICATE> files/zakroma.crt
Ожидаемый результат — files/zakroma.crt: OK.
Поместите лицензию в files/zakroma-licence/licence и убедитесь, что файл существует:
1test -f files/zakroma-licence/licence
Скопируйте лицензию на узел:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook \ 2 -i inventories/single-node/hosts \ 3 playbooks/sample-play-copy-licence-file.yml \ 4 --ask-vault-pass
Проверьте, что лицензия находится по пути из zakroma_storage_gateway.path_to_licence:
1sudo test -f /opt/zakroma/zakroma-storage-gateway/bin/licence
8. Preflight-проверка перед установкой
После распространения сертификатов и лицензии выполните preflight-проверку Закрома.Хранение:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook \ 2 -i inventories/single-node/hosts \ 3 playbooks/sample-play-zakroma-storage-preflight.yml
Переходите к установке только после успешного выполнения плейбука. В PLAY RECAP должны быть unreachable=0 и failed=0.
Диагностика ошибок preflight
Preflight проверяет разрешение имени и доступность PostgreSQL, подключение с указанными учётными данными, наличие базы данных и требуемых схем. Если проверка завершилась ошибкой, используйте сообщение Ansible, чтобы определить причину:
| Ошибка | Что проверить |
|---|---|
| Имя PostgreSQL не разрешается | На узле выполните getent ahostsv4 <POSTGRESQL_FQDN> и проверьте DNS или /etc/hosts. |
| Истёк тайм-аут подключения | Выполните nc -vz -w 3 <POSTGRESQL_FQDN> 5432, затем проверьте маршрутизацию и межсетевой экран. |
| Ошибка аутентификации или SSL | Проверьте пользователя, пароль и postgresql_sslmode в zakroma-storage.yml. |
| База данных или схема не найдена | Проверьте подготовку базы командой psql -W "host=<POSTGRESQL_FQDN> dbname=zakroma user=<POSTGRESQL_USER>" -c '\dn+' и исправьте её по инструкции настройки PostgreSQL. |
Для ZDS в режиме FS отдельного preflight-плейбука в поставке нет. Проверьте узел вручную:
1mountpoint /mnt/data 2df -h /mnt/data 3ss -ltn | grep -E ':8088|:8089' || echo "порты свободны"
Ожидаемый результат: том данных смонтирован, на нём достаточно свободного места, порты ZDS не заняты другими процессами.
9. Установка Закрома.Хранение и сервиса ZDS
Установите сервисы Закрома.Хранение:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook \ 2 -i inventories/single-node/hosts \ 3 playbooks/sample-play-zakroma-storage.yml
В выводе Ansible PLAY RECAP должны быть unreachable=0 и failed=0. До установки ZDS проверьте доступность сервисов Закрома.Хранение:
1sudo systemctl status --no-pager --full \ 2 zakroma-storage-monolith.service \ 3 zakroma-storage-gateway.service
Для обоих сервисов должно быть указано состояние Active: active (running) и время работы с момента запуска. После этого установите сервис ZDS:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook \ 2 -i inventories/single-node/hosts \ 3 playbooks/sample-play-zakroma-zds-fs.yml
В выводе Ansible PLAY RECAP должны быть unreachable=0 и failed=0. Проверьте сервис ZDS:
1sleep 5 2sudo systemctl status --no-pager --full zakroma-ds-agent.service
Ожидаемое состояние — Active: active (running) с указанием времени работы сервиса.
Проверка готовности
10. Проверка работоспособности сервисов и API
На узле выполните:
1sudo systemctl status --no-pager --full \ 2 zakroma-storage-monolith.service \ 3 zakroma-storage-gateway.service \ 4 zakroma-ds-agent.service 5 6sudo systemctl is-enabled zakroma-storage-monolith.service 7sudo systemctl is-enabled zakroma-storage-gateway.service 8sudo systemctl is-enabled zakroma-ds-agent.service
Все сервисы должны иметь состояние Active: active (running), а команды проверки автозапуска — вернуть enabled.
Проверьте, что Admin UI открывается по настроенному FQDN. Подробная проверка сервисов приведена в Проверке статуса сервисов.
11. Функциональная проверка S3
Откройте Admin UI по настроенному FQDN и подключите ZDS, указав адрес узла, порт 8088 и учётные данные из шага 5. Затем создайте рабочую область, бакет, разрешающую политику и S3-ключ тестового пользователя. Для проверки используйте отдельный тестовый объект, который после проверки можно удалить.
Передайте секретный ключ интерактивно:
1export AWS_ACCESS_KEY_ID='<S3_ACCESS_KEY>' 2read -rsp 'AWS Secret Access Key: ' AWS_SECRET_ACCESS_KEY 3export AWS_SECRET_ACCESS_KEY 4echo 5export S3_ENDPOINT='https://<WORKSPACE_FQDN>:<S3_API_PORT>' 6export S3_BUCKET='<TEST_BUCKET>' 7AWS_TLS_OPTION=''
Самоподписанный сертификатЕсли S3 API использует самоподписанный сертификат, перед проверкой добавьте переменную среды
AWS_TLS_OPTION='--no-verify-ssl'. Параметр отключает для AWS CLI проверку сертификата сервера, поэтому используйте его только для функционального теста. Для сертификата от доверенного центра сертификации оставьте переменную пустой.
Загрузите объект, проверьте его наличие, скачайте, сравните и удалите:
1object="single-node-$(date +%s).txt" 2printf 'S3 functional check\n' >/tmp/zakroma-s3-source.txt 3aws ${AWS_TLS_OPTION} --endpoint-url "$S3_ENDPOINT" s3 cp /tmp/zakroma-s3-source.txt "s3://${S3_BUCKET}/${object}" 4aws ${AWS_TLS_OPTION} --endpoint-url "$S3_ENDPOINT" s3 ls "s3://${S3_BUCKET}/${object}" 5aws ${AWS_TLS_OPTION} --endpoint-url "$S3_ENDPOINT" s3 cp "s3://${S3_BUCKET}/${object}" /tmp/zakroma-s3-downloaded.txt 6cmp /tmp/zakroma-s3-source.txt /tmp/zakroma-s3-downloaded.txt 7aws ${AWS_TLS_OPTION} --endpoint-url "$S3_ENDPOINT" s3 rm "s3://${S3_BUCKET}/${object}" 8rm -f /tmp/zakroma-s3-source.txt /tmp/zakroma-s3-downloaded.txt 9unset AWS_SECRET_ACCESS_KEY 10unset AWS_TLS_OPTION
Проверка успешна, если cmp не вывел различий, а объект удалён из бакета.
12. Повторный запуск и проверка идемпотентности
Повторно выполните плейбуки установки с тем же инвентарём Ansible и переменными group_vars:
1ANSIBLE_CONFIG=ansible.cfg ansible-playbook \ 2 -i inventories/single-node/hosts \ 3 playbooks/sample-play-zakroma-storage.yml 4 5ANSIBLE_CONFIG=ansible.cfg ansible-playbook \ 6 -i inventories/single-node/hosts \ 7 playbooks/sample-play-zakroma-zds-fs.yml
Успешный результат повторного запуска:
- в
PLAY RECAPнетfailedиunreachable; - сервисы и функциональный S3-тест остаются рабочими;
- изменения в
PLAY RECAPобъяснимы, например перезапуск сервиса после реального изменения конфигурации.