Быстрый старт

Назначение

В этой инструкции описана минимальная отказоустойчивая конфигурация Закрома.Хранение для пилота, демонстрации или функционального тестирования:

  • три узла с Zakroma-Storage и Zakroma-ZDS;
  • отдельный четвёртый узел PostgreSQL;
  • защита данных Erasure Coding 2+1;
  • локальные пользователи;
Не для production

Указанные ресурсы рассчитаны на функциональный пилот. Для production нужны отдельный расчёт ресурсов, HA-кластер PostgreSQL и внешний отказоустойчивый балансировщик. См. Типовые варианты конфигурации.

Схема стенда

Конфигурация 3+1 означает три узла Storage/ZDS и один узел PostgreSQL. Её не следует путать с параметрами Erasure Coding: для трёх ZDS-узлов используется EC 2+1.

1 +-----------------------------+ 2 | postgres-1 | 3 | PostgreSQL 16 | 4 | 192.168.1.14:5432 | 5 +--------------+--------------+ 6 | 7 +-------------------+-------------------+ 8 | | | 9 +---------+---------+ +-------+-----------+ +-----+-------------+ 10 | storage-1 | | storage-2 | | storage-3 | 11 | Storage + ZDS | | Storage + ZDS | | Storage + ZDS | 12 | 192.168.1.11 | | 192.168.1.12 | | 192.168.1.13 | 13 +-------------------+ +-------------------+ +-------------------+ 14 \______________ EC 2+1 ______________/

Минимальные требования

В примере используются Debian 12 и архитектура x86_64. Поддерживаемые ОС указаны в составе поставки.

РольКоличествоvCPURAMСистемный дискДиск данных
Zakroma-Storage + Zakroma-ZDS348 ГБSSD 50 ГБотдельный SSD 50 ГБ
PostgreSQL148 ГБSSD 50 ГБотдельный SSD рекомендуется

Для функционального пилота допускается сеть 1 Гбит/с. Для нагрузочных тестов рекомендуется 10 Гбит/с и выше. Размер ZDS-диска увеличьте, если объём тестовых данных превышает 50 ГБ.

Параметры конфигурации

ПараметрЗначение
Узлы Storage/ZDSstorage-1, storage-2, storage-3
Узел PostgreSQLpostgres-1
IP Storage/ZDS192.168.1.11, 192.168.1.12, 192.168.1.13
IP PostgreSQL192.168.1.14
Базовый доменzakroma.internal
Admin UIzakroma-admin.zakroma.internal:8444
S3 API<workspace>.zakroma.internal:6443
PostgreSQLpostgresql.zakroma.internal:5432
Подсеть кластера192.168.1.0/24
Диск ZDS/dev/vdb
Точка монтирования ZDS/data/zds

Замените примеры на адреса и имена из своей инфраструктуры.

Подготовка DNS

Записи DNS

Создайте следующие A-записи:

ИмяIP-адреса
storage-1.zakroma.internal192.168.1.11
storage-2.zakroma.internal192.168.1.12
storage-3.zakroma.internal192.168.1.13
postgresql.zakroma.internal192.168.1.14
zakroma-admin.zakroma.internal192.168.1.11, 192.168.1.12, 192.168.1.13
*.zakroma.internal192.168.1.11, 192.168.1.12, 192.168.1.13

Wildcard-запись покрывает global.zakroma.internal и имена вида <workspace>.zakroma.internal. Если DNS-сервер не поддерживает wildcard, создайте отдельные записи для global и каждой рабочей области.

DNS round-robin

Несколько A-записей распределяют клиентские запросы, но не проверяют состояние узлов. Для production используйте балансировщик с health checks. Файл /etc/hosts не поддерживает wildcard и не заменяет DNS для этого сценария.

Проверка DNS

Установите dig на машине оператора и на всех четырёх узлах:

1sudo apt-get update 2sudo apt-get install -y dnsutils

Проверьте имена:

1getent ahostsv4 storage-1.zakroma.internal 2getent ahostsv4 storage-2.zakroma.internal 3getent ahostsv4 storage-3.zakroma.internal 4getent ahostsv4 postgresql.zakroma.internal 5getent ahostsv4 zakroma-admin.zakroma.internal 6getent ahostsv4 dns-check.zakroma.internal 7getent ahostsv4 global.zakroma.internal

dns-check.zakroma.internal — заведомо несозданное отдельное имя. Его успешное разрешение подтверждает работу wildcard-записи.

Проверьте полный набор A-записей для Admin UI, global и wildcard:

1dig +short A zakroma-admin.zakroma.internal | sort -u 2dig +short A global.zakroma.internal | sort -u 3dig +short A dns-check.zakroma.internal | sort -u

Каждая команда должна вывести три адреса:

1192.168.1.11 2192.168.1.12 3192.168.1.13

Повторите команды на машине оператора и на всех четырёх узлах. Результат должен быть одинаковым.

Проверка узлов до установки

Установите на узлах базовые утилиты:

1sudo apt-get update 2sudo apt-get install -y curl jq openssl xfsprogs netcat-openbsd

На каждом узле проверьте ОС, архитектуру, процессоры, память, системный диск и синхронизацию времени:

1grep -E '^(PRETTY_NAME|VERSION_ID)=' /etc/os-release 2uname -m 3nproc 4free -h 5findmnt -n -o SOURCE,SIZE,FSTYPE,TARGET / 6timedatectl show -p NTPSynchronized --value

Ожидаются Debian 12, архитектура x86_64, не менее 4 vCPU, 8 ГБ RAM, системный диск от 50 ГБ и значение yes для синхронизации времени.

На каждом из трёх узлов Storage/ZDS дополнительно проверьте диск данных:

1lsblk -b -o NAME,SIZE,FSTYPE,MOUNTPOINTS,MODEL /dev/vdb 2sudo blockdev --getsize64 /dev/vdb 3sudo wipefs --no-act /dev/vdb

/dev/vdb должен быть отдельным пустым блочным устройством размером не менее 50 ГБ. Если имя устройства отличается, замените его во всех следующих командах.

Подготовка PostgreSQL

PostgreSQL не устанавливается Ansible-ролями из поставки Закрома. Выполните этот раздел на postgres-1.

Скрипт установки и настройки PostgreSQL

Скрипт подключает официальный PGDG-репозиторий, устанавливает PostgreSQL 16, настраивает сетевой доступ и создаёт базу со схемами Закрома.Хранение.

Сохраните его как /tmp/setup-postgresql.sh на узле postgres-1:

1#!/usr/bin/env bash 2set -euo pipefail 3 4CLIENT_CIDR=${1:-192.168.1.0/24} 5 6sudo apt-get update 7sudo apt-get install -y postgresql-common ca-certificates 8sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh 9sudo apt-get update 10sudo apt-get install -y postgresql-16 postgresql-client-16 11sudo systemctl enable --now postgresql 12 13sudo -u postgres psql -v ON_ERROR_STOP=1 <<'SQL' 14ALTER SYSTEM SET listen_addresses = '*'; 15ALTER SYSTEM SET max_connections = 200; 16SQL 17 18PG_HBA=$(sudo -u postgres psql -tAc 'SHOW hba_file;') 19PG_RULE="host zakroma zakroma_user ${CLIENT_CIDR} scram-sha-256" 20sudo grep -Fqx "$PG_RULE" "$PG_HBA" || printf '%s\n' "$PG_RULE" | sudo tee -a "$PG_HBA" 21 22if sudo -u postgres psql -tAc "SELECT 1 FROM pg_roles WHERE rolname = 'zakroma_user'" | grep -qx 1; then 23 echo 'PostgreSQL role zakroma_user already exists; password was not changed.' 24else 25 sudo -u postgres createuser --login --pwprompt zakroma_user 26fi 27 28if sudo -u postgres psql -tAc "SELECT 1 FROM pg_database WHERE datname = 'zakroma'" | grep -qx 1; then 29 echo 'Database zakroma already exists.' 30else 31 sudo -u postgres createdb --owner=zakroma_user zakroma 32 sudo -u postgres psql -d zakroma -v ON_ERROR_STOP=1 -c 'DROP SCHEMA public;' 33fi 34 35sudo -u postgres psql -d zakroma -v ON_ERROR_STOP=1 <<'SQL' 36CREATE SCHEMA IF NOT EXISTS core AUTHORIZATION zakroma_user; 37CREATE SCHEMA IF NOT EXISTS permission AUTHORIZATION zakroma_user; 38CREATE SCHEMA IF NOT EXISTS worker0 AUTHORIZATION zakroma_user; 39CREATE SCHEMA IF NOT EXISTS notification AUTHORIZATION zakroma_user; 40CREATE SCHEMA IF NOT EXISTS seclog AUTHORIZATION zakroma_user; 41SQL 42 43sudo systemctl restart postgresql 44sudo systemctl is-active postgresql 45sudo -u postgres psql -tAc 'SHOW server_version;' 46sudo -u postgres psql -d zakroma -c '\dn+' 47sudo ss -lntp | grep ':5432'

Запустите скрипт, передав подсеть трёх Storage-узлов:

1chmod +x /tmp/setup-postgresql.sh 2/tmp/setup-postgresql.sh 192.168.1.0/24

При первом запуске createuser запросит пароль для zakroma_user и не сохранит его в истории команд. Этот пароль должен совпадать с будущей переменной zakroma_postgresql_password в Ansible Vault.

Если роль уже существует и пароль нужно заменить, выполните отдельно:

1sudo -u postgres psql -c '\password zakroma_user'
Число подключений

200 включает запас для трёх узлов Storage, одного worker и отключённого Keycloak. При изменении состава сервисов пересчитайте значение по инструкции. Не указывайте в pg_hba.conf более широкую подсеть, чем требуется.

Ожидаются версия 16.x, статус active, пять схем Закрома и порт 5432 в состоянии LISTEN.

С каждого Storage-узла проверьте DNS, порт и авторизацию:

1getent ahostsv4 postgresql.zakroma.internal 2nc -vz -w 3 postgresql.zakroma.internal 5432 3psql -W "host=postgresql.zakroma.internal port=5432 dbname=zakroma user=zakroma_user sslmode=disable" \ 4 -c 'SET search_path TO core; SELECT current_database(), current_user, current_schema();'

Подробнее: Настройка PostgreSQL. PgBouncer в Quick Start не используется.

Подготовка дисков ZDS

Выполните на каждом из трёх Storage/ZDS-узлов.

Форматирование удалит данные

Команда mkfs.xfs безвозвратно удалит данные на выбранном устройстве. Сверьте /dev/vdb с фактическим диском данных. Не используйте автовыбор диска.

Проверьте устройства:

1lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINTS,MODEL 2sudo wipefs --no-act /dev/vdb

Если /dev/vdb — нужный пустой диск, создайте XFS и точку монтирования:

1sudo mkfs.xfs /dev/vdb 2sudo install -d -m 0755 /data/zds 3ZDS_UUID=$(sudo blkid -s UUID -o value /dev/vdb) 4FSTAB_LINE="UUID=${ZDS_UUID} /data/zds xfs defaults,noatime 0 2" 5sudo grep -Fqx "$FSTAB_LINE" /etc/fstab || printf '%s\n' "$FSTAB_LINE" | sudo tee -a /etc/fstab 6sudo mount -a

Проверьте результат:

1findmnt --target /data/zds 2df -h /data/zds

Подготовка поставки

Получите:

  1. Архив zakroma-roles-<версия>.tar.gz. См. Таблица соответствия версий.
  2. Файл лицензии.
  3. Wildcard-сертификат и ключ для *.zakroma.internal. Он покрывает Admin UI, global и имена рабочих областей.
  4. Машину оператора с Ansible 2.15.0–2.18.15 и SSH/sudo-доступом к трём Storage-узлам.

Распакуйте архив:

1RELEASE_VERSION=7.2.0 2tar -xvzf "zakroma-roles-${RELEASE_VERSION}.tar.gz" 3cd "zakroma-roles-${RELEASE_VERSION}" 4ansible --version

Положите файлы в каталог поставки:

1install -m 0644 /path/to/zakroma.crt files/zakroma.crt 2install -m 0600 /path/to/zakroma.key files/zakroma.key 3install -m 0644 /path/to/licence files/zakroma-licence/licence

Inventory

Замените inventories/base-cluster/hosts:

1[certificates] 2storage-1 ansible_host=192.168.1.11 3storage-2 ansible_host=192.168.1.12 4storage-3 ansible_host=192.168.1.13 5 6[zakroma-storage] 7storage-1 ansible_host=192.168.1.11 8storage-2 ansible_host=192.168.1.12 9storage-3 ansible_host=192.168.1.13 10 11[zakroma-zds-v2-ec] 12storage-1 ansible_host=192.168.1.11 zakroma_zds_node_name=storage-1 13storage-2 ansible_host=192.168.1.12 zakroma_zds_node_name=storage-2 14storage-3 ansible_host=192.168.1.13 zakroma_zds_node_name=storage-3

PostgreSQL не включается в Inventory: в поставке нет роли его установки.

Проверьте Inventory и SSH:

1ANSIBLE_CONFIG=ansible.cfg ansible-inventory -i inventories/base-cluster/hosts --graph 2ANSIBLE_CONFIG=ansible.cfg ansible -i inventories/base-cluster/hosts all -m ping 3ANSIBLE_CONFIG=ansible.cfg ansible -i inventories/base-cluster/hosts all -m setup -a 'filter=ansible_hostname'

Все три узла должны вернуть SUCCESS и pong. Не изменяйте zakroma_zds_node_name после начала эксплуатации.

Секреты Ansible Vault

Не записывайте реальные пароли в открытом виде. Создайте inventories/base-cluster/group_vars/all/vault.yml:

1mkdir -p inventories/base-cluster/group_vars/all 2touch inventories/base-cluster/group_vars/all/vault.yml 3 4ansible-vault encrypt_string --name zakroma_postgresql_password >> \ 5 inventories/base-cluster/group_vars/all/vault.yml 6ansible-vault encrypt_string --name zakroma_admin_password >> \ 7 inventories/base-cluster/group_vars/all/vault.yml 8ansible-vault encrypt_string --name zakroma_zds_password >> \ 9 inventories/base-cluster/group_vars/all/vault.yml

Для всех трёх команд используйте один и тот же Vault password. zakroma_postgresql_password должен совпадать с паролем zakroma_user в PostgreSQL.

Копирование сертификата

В inventories/base-cluster/group_vars/certificates.yml оставьте три узла:

1certificates_copy_source_path: files 2 3host_cert_config: 4 storage-1: 5 certs: 6 - src_dir: "{{ certificates_copy_source_path }}" 7 dest_dir: /opt/certs 8 cert_file: zakroma.crt 9 key_file: zakroma.key 10 owner: zakroma 11 group: zakroma 12 cert_permissions: "0644" 13 key_permissions: "0600" 14 storage-2: 15 certs: 16 - src_dir: "{{ certificates_copy_source_path }}" 17 dest_dir: /opt/certs 18 cert_file: zakroma.crt 19 key_file: zakroma.key 20 owner: zakroma 21 group: zakroma 22 cert_permissions: "0644" 23 key_permissions: "0600" 24 storage-3: 25 certs: 26 - src_dir: "{{ certificates_copy_source_path }}" 27 dest_dir: /opt/certs 28 cert_file: zakroma.crt 29 key_file: zakroma.key 30 owner: zakroma 31 group: zakroma 32 cert_permissions: "0644" 33 key_permissions: "0600"

Переменные Zakroma-Storage

В inventories/base-cluster/group_vars/zakroma-storage.yml проверьте и измените следующие блоки:

Не заменяйте весь файл

В примере показаны только изменяемые поля. Найдите их в поставляемом zakroma-storage.yml, измените указанные значения и сохраните остальные поля вложенных блоков.

1zakroma_storage_postgresql_host: postgresql.zakroma.internal 2 3zakroma_storage_admin: 4 path: "zakroma-admin.zakroma.internal:8444" 5 monitoring_path: "" 6 7zakroma_storage_nginx_proxy: false 8zakroma_storage_base_domain: zakroma.internal 9 10zakroma_storage_gateway: 11 host: "global.{{ zakroma_storage_base_domain }}" 12 s3api_port: 6443 13 management_port: 8444 14 tls: 15 enabled: true 16 certs: 17 - key: /opt/certs/zakroma.key 18 crt: /opt/certs/zakroma.crt 19 default_admin: zakromaadmin 20 auth: 21 auth_provider: file 22 user_provider: file 23 users: 24 - name: zakromaadmin 25 password: "{{ zakroma_admin_password }}" 26 groups: 27 - clouduser
Порты без балансировщика

Gateway отдельно слушает S3 API и Management API. Поэтому в Quick Start Admin UI доступен на 8444, а S3 API — на 6443. Единый порт 443 публикуется внешним HAProxy/Nginx и не входит в этот сценарий.

Замените во всех блоках PostgreSQL пароль-заглушку на Vault-переменную:

1postgresql_username: zakroma_user 2postgresql_password: "{{ zakroma_postgresql_password }}" 3postgresql_dbname: zakroma 4postgresql_sslmode: disable

Это нужно сделать для zakroma_storage_core, zakroma_storage_gateway, единственного элемента zakroma_storage_workers, zakroma_storage_notification и zakroma_storage_seclog. Не добавляйте второй worker в этом сценарии.

Переменные Zakroma-ZDS

В inventories/base-cluster/group_vars/zakroma-zds-v2-ec.yml задайте EC 2+1, группу Inventory и один диск:

Изменяйте только указанные поля

Не заменяйте показанным фрагментом весь файл: роли нужны и остальные поля блоков server, client, providers, workers, registry и drive. Внутри zakroma_zds_drive замените только подблок list.

1zakroma_zds_server: 2 accessKey: zakromaadmin 3 secretKey: "{{ zakroma_zds_password }}" 4 5zakroma_zds_cluster_server: 6 accessKey: zakromaadmin 7 secretKey: "{{ zakroma_zds_password }}" 8 9zakroma_zds_client: 10 accessKey: zakromaadmin 11 secretKey: "{{ zakroma_zds_password }}" 12 13zakroma_zds_providers: 14 maxConcurrentPipelines: 200 15 writeQueueDepth: 2 16 pipelineMinFileSize: 4096 17 ec: 18 dataPart: 2 19 parityPart: 1 20 cleanup: false 21 fc: 22 replicaCount: 2 23 cleanup: false 24 25zakroma_zds_background_window_jobs: 26 vacuum: 27 storePath: /etc/zds/vacuum-state 28 scan: 29 storePath: /etc/zds/scan-state 30 31zakroma_zds_registry: 32 path: /etc/zds/db 33 34zakroma_zds_hosts_group_name: zakroma-zds-v2-ec 35 36zakroma_zds_drive: 37 capacityThreshold: 1 38 defaultStorageClass: HDD 39 list: 40 - index: 1 41 path: /data/zds 42 storageGroup: 1 43 storageClass: HDD
Не оставляйте EC 3+1

Для dataPart: 3 и parityPart: 1 нужно не менее четырёх частей на разных узлах/дисках. В этом трёхузловом сценарии задайте 2+1 явно.

Запуск Ansible

Перед каждым запуском выполните --syntax-check. Из-за Vault-переменных Ansible запросит Vault password.

Сертификаты

1ANSIBLE_CONFIG=ansible.cfg ansible-playbook --ask-vault-pass \ 2 -i inventories/base-cluster/hosts \ 3 playbooks/sample-play-copy-certificates.yml --syntax-check 4 5ANSIBLE_CONFIG=ansible.cfg ansible-playbook --ask-vault-pass \ 6 -i inventories/base-cluster/hosts \ 7 playbooks/sample-play-copy-certificates.yml

Лицензия

1ANSIBLE_CONFIG=ansible.cfg ansible-playbook --ask-vault-pass \ 2 -i inventories/base-cluster/hosts \ 3 playbooks/sample-play-copy-licence-file.yml --syntax-check 4 5ANSIBLE_CONFIG=ansible.cfg ansible-playbook --ask-vault-pass \ 6 -i inventories/base-cluster/hosts \ 7 playbooks/sample-play-copy-licence-file.yml

Zakroma-Storage

1ANSIBLE_CONFIG=ansible.cfg ansible-playbook --ask-vault-pass \ 2 -i inventories/base-cluster/hosts \ 3 playbooks/sample-play-zakroma-storage.yml --syntax-check 4 5ANSIBLE_CONFIG=ansible.cfg ansible-playbook --ask-vault-pass \ 6 -i inventories/base-cluster/hosts \ 7 playbooks/sample-play-zakroma-storage.yml

Zakroma-ZDS

1ANSIBLE_CONFIG=ansible.cfg ansible-playbook --ask-vault-pass \ 2 -i inventories/base-cluster/hosts \ 3 playbooks/sample-play-zakroma-zds-v2-ec.yml --syntax-check 4 5ANSIBLE_CONFIG=ansible.cfg ansible-playbook --ask-vault-pass \ 6 -i inventories/base-cluster/hosts \ 7 playbooks/sample-play-zakroma-zds-v2-ec.yml

Полное описание переменных: Установка базового кластера.

Проверка сервисов

На каждом Storage/ZDS-узле проверьте:

1sudo systemctl is-active zakroma-storage-monolith.service 2sudo systemctl is-active zakroma-storage-gateway.service 3sudo systemctl is-active zakroma-ds-agent.service 4sudo systemctl is-enabled zakroma-storage-monolith.service 5sudo systemctl is-enabled zakroma-storage-gateway.service 6sudo systemctl is-enabled zakroma-ds-agent.service

Ожидаются active и enabled. Если сервис не запущен:

1sudo journalctl -u zakroma-storage-monolith.service -n 100 --no-pager 2sudo journalctl -u zakroma-storage-gateway.service -n 100 --no-pager 3sudo journalctl -u zakroma-ds-agent.service -n 100 --no-pager

Проверьте ZDS. curl запросит пароль, заданный в zakroma_zds_password:

1curl --fail --silent --show-error --user zakromaadmin \ 2 http://localhost:8089/inner/status | \ 3 jq -e ' 4 .status == "RUNNING" and 5 .clusterStatus == "RW" and 6 (.nodes | length) == 2 and 7 all(.nodes[]; .status == "RUNNING") and 8 all(.volumes[]; .status == "RUNNING") 9 '

Команда должна завершиться с кодом 0 и вывести true.

Проверка DNS и HTTPS после установки

Ещё раз проверьте DNS с машины оператора:

1dig +short A zakroma-admin.zakroma.internal | sort -u 2dig +short A global.zakroma.internal | sort -u 3dig +short A demo-ws.zakroma.internal | sort -u

Каждая команда должна вывести IP-адреса всех трёх Storage-узлов.

Затем проверьте каждый backend отдельно. --resolve передаёт правильные Host и SNI, но направляет запрос на конкретный IP:

1for ip in 192.168.1.11 192.168.1.12 192.168.1.13; do 2 curl --fail --silent --show-error \ 3 --resolve zakroma-admin.zakroma.internal:8444:${ip} \ 4 https://zakroma-admin.zakroma.internal:8444/auth/config >/dev/null 5 echo "OK: Admin UI on ${ip}" 6done

Проверьте сертификат на каждом узле:

1for ip in 192.168.1.11 192.168.1.12 192.168.1.13; do 2 openssl s_client -connect "${ip}:8444" \ 3 -servername zakroma-admin.zakroma.internal \ 4 -verify_return_error </dev/null 2>/dev/null | \ 5 grep -E 'subject=|issuer=|Verify return code' 6done

Ожидается Verify return code: 0 (ok). Если используется внутренний CA, добавьте его корневой сертификат в trust store машины оператора.

Проверьте обычный DNS-доступ:

1curl --fail https://zakroma-admin.zakroma.internal:8444/auth/config

Admin UI доступен по адресу:

1https://zakroma-admin.zakroma.internal:8444

Войдите под zakromaadmin с паролем zakroma_admin_password. Создайте рабочую область demo-ws, бакет demo и группу хранения с EC 2+1. Подробнее: Рабочие области и Бакеты.

Проверьте wildcard для созданной области:

1dig +short A demo-ws.zakroma.internal | sort -u

Ожидаются IP-адреса всех трёх Storage-узлов.

Проверка S3

Создайте для локального пользователя S3-ключ в Admin UI. Затем установите AWS CLI на машине оператора и передайте ключи через переменные окружения:

1export AWS_ACCESS_KEY_ID='<access-key>' 2read -rsp 'AWS Secret Access Key: ' AWS_SECRET_ACCESS_KEY 3export AWS_SECRET_ACCESS_KEY 4echo 5export S3_ENDPOINT='https://demo-ws.zakroma.internal:6443' 6export S3_BUCKET='demo'

Создайте тестовый файл, загрузите его в бакет, скачайте обратно, сравните содержимое и удалите объект:

1object="quick-start-$(date +%s).txt" 2printf 'Zakroma quick-start S3 check\n' >/tmp/zakroma-s3-source.txt 3aws --endpoint-url "$S3_ENDPOINT" s3 cp /tmp/zakroma-s3-source.txt "s3://${S3_BUCKET}/${object}" 4aws --endpoint-url "$S3_ENDPOINT" s3 ls "s3://${S3_BUCKET}/${object}" 5aws --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 --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

Команда cmp не должна вывести различий. Команда s3 rm должна подтвердить удаление тестового объекта.

Критерии готовности

  • Все четыре узла соответствуют минимальным ресурсам.
  • DNS-имена одинаково разрешаются с машины оператора и каждого узла.
  • zakroma-admin, global и wildcard возвращают три IP-адреса Storage.
  • PostgreSQL доступен с трёх Storage-узлов.
  • На каждом Storage-узле активны Storage, Gateway и ZDS.
  • ZDS видит три узла, волюмы имеют статус RUNNING, кластер — RW.
  • Каждый Storage backend отвечает при проверке через curl --resolve.
  • TLS-сертификат валиден для Admin UI и имени рабочей области.
  • Группа хранения создана с EC 2+1.
  • Проверка S3 успешно записывает, читает и удаляет объект.

Что дальше