На связи Илья Шуйков, руководитель продукта «Фабрика данных» компании Диасофт.

В прошлой статье мы рассказали, зачем понадобилось строить свое объектное хранилище, и как устроен S3 Архипелаг изнутри. Теперь — практика: берем дистрибутив и разворачиваем рабочее хранилище.

Коротко о дистрибутиве

S3 Архипелаг входит в состав «Фабрики данных» (Digital Q.DataFactory) – нашего промышленного решения класса Data Lakehouse. Но использовать его можно и отдельно как самостоятельное S3-хранилище.

У S3 Архипелаг есть бесплатная лицензия на 500 ГБ – скачивайте и пользуйтесь без ограничений по функциональности. S3 API, монтирование через FUSE, Erasure Coding, tiered storage – все включено. Лицензия бессрочная – хватит для тестов, пилотов и небольших продуктивных инсталляций.

Возможности:

  • Полная совместимость с S3 API – работает с любыми S3-клиентами и SDK

  • Erasure Coding – экономия дискового пространства до 50% по сравнению с репликацией

  • Tiered storage – автоматическое перемещение данных между горячим и холодным хранилищем

  • FUSE/HDFS – монтируйте хранилище как файловую систему

  • Горизонтальное масштабирование – добавляйте узлы без остановки кластера

  • Два режима развертывания: Standalone для быстрого старта и Kubernetes для production. Времени понадобится минут 15.

 S3 Архипелаг состоит из нескольких компонентов:

  • Master – координатор кластера, управляет топологией и репликацией

  • Volume Server – хранит данные, упакованные в тома

  • Filer – слой метаданных, работает с PostgreSQL

  • S3 Gateway – S3-совместимый API для приложений

  • Admin UI – веб-интерфейс администрирования

  • SFTP Server – доступ к файлам по SFTP (опционально)

В Standalone-режиме все это запускается через Docker Compose. В Kubernetes – через Helm-чарты с полной отказоустойчивостью.

Где взять дистрибутив

Заходим на страницу продукта, жмем «Скачать бесплатно», вводим имя и почту. Через пару секунд начнется загрузка архива.

В архиве:
- Docker-образ (qs3archipelago-<version>.tar.gz)
- Helm-чарт для Kubernetes
- Документация по установке

Загрузка Docker-образа

Загрузите образ из архива в локальный Docker:

# Распаковка и загрузка образа
gunzip -c qs3archipelago-<version>.tar.gz | docker load
# Проверка загрузки
docker images | grep qs3archipelago

После загрузки образ будет доступен локально. Если вам нужно использовать его на нескольких машинах или в Kubernetes, опубликуйте образ в ваш container registry:

# Тегируем образ для вашего registry
docker tag qs3archipelago:latest your-registry.example.com/qs3archipelago:latest
# Публикуем в registry
docker push your-registry.example.com/qs3archipelago:latest

Примечание: Замените your-registry.example.com на адрес вашего container registry (Harbor, Nexus, GitLab Registry и т.д.).

Часть 1: Standalone-режим

Идеально для разработки, тестирования или небольших инсталляций до 10-20 TB.

Требования

  • 4 ядра CPU

  • 8 GB RAM

  • Любые диски (SSD предпочтительнее)

  • Docker и Docker Compose

  • PostgreSQL 15.6+

Шаг 0: Подготовка PostgreSQL

База данных метаданных — обязательный компонент. Настройте её первой.

Создайте базу данных и пользователя:

-- Подключитесь к PostgreSQL как администратор

CREATE USER qs3archipelago WITH PASSWORD 'your_secure_password';
CREATE DATABASE qs3archipelago OWNER qs3archipelago;

Схема public используется по умолчанию. Если нужна другая схема, задайте ее через переменную окружения DB_SCHEMA.

Шаг 1: Docker Compose

Docker Compose — рекомендуемый способ запуска в Standalone-режиме. Каждый компонент запускается в отдельном контейнере.

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

version: "3.8"
services:
  weed-master:
    image: qs3archipelago:latest #или your-registry.example.com/qs3archipelago:latest
    container_name: weed-master
    user: "30002:30002"
    environment:
      #Команда запуска
      WEED_COMMAND: master
      WEED_LOG_LEVEL: "1"

      # Сетевые настройки
      WEED_IP: weed-master
      WEED_IP_BIND: 0.0.0.0

      # Настройки Master
      WEED_MASTER_PORT: "9333"
      WEED_MASTER_DIR: /data
      WEED_MASTER_DEFAULT_REPLICATION: "000"
      WEED_MASTER_VOLUME_SIZE_LIMIT_MB: "1000"

      # Метрики
      WEED_METRICS_PORT: "9327"

      # Raft настройки
      WEED_MASTER_ELECTION_TIMEOUT: "10s"
      WEED_MASTER_HEARTBEAT_INTERVAL: "300ms"

      # PostgreSQL (для лицензирования)
      WEED_LEVELDB2_ENABLED: "false"
      WEED_POSTGRES2_ENABLED: "true"
      WEED_POSTGRES2_HOSTNAME: "host.docker.internal"        # или IP вашего PostgreSQL
      WEED_POSTGRES2_PORT: "5432"
      WEED_POSTGRES2_USERNAME: "qs3archipelago"
      WEED_POSTGRES2_PASSWORD: "your_secure_password"
      WEED_POSTGRES2_DATABASE: "qs3archipelago"
      WEED_POSTGRES2_SSLMODE: "disable"
    ports:
      - "9333:9333"        # HTTP API
      - "19333:19333"      # gRPC
      - "9327:9327"        # Metrics
    volumes:
      - weed-master-data:/data
    networks:
      - weed-net
    restart: unless-stopped
weed-volume:
    image: qs3archipelago:latest
    container_name: weed-volume
    user: "30002:30002"
    depends_on:
      - weed-master
    environment:
      WEED_COMMAND: volume
      WEED_LOG_LEVEL: "1"

      WEED_IP: weed-volume
      WEED_IP_BIND: 0.0.0.0

      # Настройки Volume Server
      WEED_VOLUME_PORT: "8080"
      WEED_VOLUME_DIR: /data
      WEED_VOLUME_DIR_IDX: /data
      WEED_VOLUME_READ_MODE: proxy
      WEED_VOLUME_MIN_FREE_SPACE_PERCENT: "1"
      WEED_VOLUME_COMPACTION_MBPS: "50"

      # Подключение к Master
      WEED_MASTER_SERVERS: weed-master:9333

      WEED_METRICS_PORT: "9327"
    ports:
      - "8080:8080"
    volumes:
      - weed-volume-data:/data
    networks:
      - weed-net
    restart: unless-stopped

  weed-filer:
    image: qs3archipelago:latest
    container_name: weed-filer
    user: "30002:30002"
    depends_on:
      - weed-master
      - weed-volume
    environment:
      WEED_COMMAND: filer
      WEED_LOG_LEVEL: "1"

      # Настройки Filer
      WEED_IP: weed-filer
      WEED_IP_BIND: 0.0.0.0
      WEED_FILER_PORT: "8888"
      WEED_FILER_GRPC_PORT: "18888"
      WEED_FILER_DIR_LIST_LIMIT: "100000"
      WEED_FILER_DEFAULT_REPLICA_PLACEMENT: "000"
      WEED_FILER_BUCKETS_FOLDER: "/buckets"
      WEED_FILER_QUEUES_FOLDER: "/queues"
      WEED_FILER_OPTIONS_RECURSIVE_DELETE: "false"

      # Подключение к Master
      WEED_MASTER_SERVERS: weed-master:9333
      WEED_FILER_MASTER: weed-master:9333

      # PostgreSQL (бэкенд метаданных)
      WEED_LEVELDB2_ENABLED: "false"
      WEED_POSTGRES2_ENABLED: "true"
      WEED_POSTGRES2_HOSTNAME: "host.docker.internal"      # или IP вашего PostgreSQL
      WEED_POSTGRES2_PORT: "5432"
      WEED_POSTGRES2_USERNAME: "qs3archipelago"
      WEED_POSTGRES2_PASSWORD: "your_secure_password"
      WEED_POSTGRES2_DATABASE: "qs3archipelago"
      WEED_POSTGRES2_SSLMODE: "disable"

      WEED_METRICS_PORT: "9327"
    ports:
      - "8888:8888"
      - "18888:18888"
    volumes:
      - weed-filer-data:/data
    networks:
      - weed-net
    restart: unless-stopped

  weed-s3:
    image: qs3archipelago:latest
    container_name: weed-s3
    user: "30002:30002"
    depends_on:
      - weed-filer
    environment:
      WEED_COMMAND: s3
      WEED_LOG_LEVEL: "1"

      WEED_IP: weed-s3
      WEED_IP_BIND: 0.0.0.0

      # Настройки S3 Gateway
      WEED_S3_PORT: "8333"
      WEED_S3_FILER: weed-filer:8888

      WEED_METRICS_PORT: "9327"
    ports:
      - "8333:8333"
    networks:
      - weed-net
    restart: unless-stopped

  weed-admin:
    image: qs3archipelago:latest
    container_name: weed-admin
    user: "30002:30002"
    depends_on:
      - weed-master
    environment:
      WEED_COMMAND: admin
      WEED_LOG_LEVEL: "1"

      # Настройки Admin UI
      WEED_ADMIN_PORT: "8081"
      WEED_ADMIN_DATA_DIR: /data
      WEED_ADMIN_USER: admin
      WEED_ADMIN_PASSWORD: admin    # Измените на безопасный пароль!
      WEED_ADMIN_MASTERS: weed-master:9333
    ports:
      - "8081:8081"
    volumes:
      - weed-admin-data:/data
    networks:
      - weed-net
    restart: unless-stopped

networks:
  weed-net:
    driver: bridge

volumes:
  weed-master-data:
  weed-volume-data:
  weed-filer-data:
  weed-admin-data:

Важно о volumes: Используйте named volumes (как в примере выше) для сохранения данных между перезапусками Docker. Анонимные volumes или bind mounts без явного указания пути могут привести к потере данных.

Запуск:
docker-compose up -d

 Что получаете:

Шаг 2: Проверка работоспособности

# Проверяем Master
curl http://localhost:9333/cluster/status

# Проверяем Filer
curl http://localhost:8888/

# Проверяем S3
curl http://localhost:8333/status

Шаг 3: Настройка S3-доступа

По умолчанию S3 Gateway требует аутентификации. Создайте ключи доступа:

Через Admin UI:

  1. Откройте http://localhost:8081

  2. Войдите с credentials из WEED_ADMIN_USER / WEED_ADMIN_PASSWORD

  3. Перейдите в раздел S3 → Identities

  4. Создайте нового пользователя с Access Key и Secret Key

Настройка aws-cli:

aws configure
# AWS Access Key ID: your_access_key
# AWS Secret Access Key: your_secret_key
# Default region name: ru-msk-1
# Default output format: json

# Тестируем
aws s3 mb s3://test-bucket --endpoint-url http://localhost:8333
aws s3 cp /etc/hosts s3://test-bucket/hosts.txt --endpoint-url http://localhost:8333
aws s3 ls s3://test-bucket/ --endpoint-url http://localhost:8333

Масштабирование Standalone

Нужно больше места? Добавьте Volume Server в docker-compose.yaml:

yaml
  weed-volume2:
    image: qs3archipelago:latest
    container_name: weed-volume2
    user: "30002:30002"
    depends_on:
      - weed-master
    environment:
      WEED_COMMAND: volume
      WEED_IP: weed-volume2
      WEED_IP_BIND: 0.0.0.0
      WEED_VOLUME_PORT: "8080"
      WEED_VOLUME_DIR: /data
      WEED_MASTER_SERVERS: weed-master:9333
    volumes:
      - weed-volume2-data:/data
    networks:
      - weed-net
    restart: unless-stopped

Master автоматически подхватит новый узел.

Часть 2: Kubernetes-режим

Для production-окружений с отказоустойчивостью и автоматическим масштабированием.

Требования:

  • Kubernetes 1.24+ (проверено на Deckhouse, vanilla K8s)

  • Helm 3.x

  • PostgreSQL 15.6+ (рекомендуем Digital Q.DataBase или свой кластер)

  • StorageClass для persistent volumes

  • Container registry с загруженным образом S3 Архипелаг

Подготовка образа для Kubernetes

Перед установкой загрузите Docker-образ в ваш container registry:

# Загружаем образ из архива
gunzip -c qs3archipelago-<version>.tar.gz | docker load

# Тегируем для вашего registry
docker tag qs3archipelago:latest your-registry.example.com/qs3archipelago:latest

 # Публикуем
docker push your-registry.example.com/qs3archipelago:latest

Архитектура кластера

Типичный production-кластер:

Control Plane (3 узла для Master + Filer):

  • CPU: 8-16 ядер

  • RAM: 32-64 GB

  • Диски: 2x SSD 500 GB (RAID1 для БД метаданных)

  • Сеть: 10GbE

Data Plane (6+ узлов для Volume Servers):

  • CPU: 8-16 ядер

  • RAM: 32-64 GB

  • Диски: 8-12x HDD/SSD

  • Сеть: 10GbE (или 25GbE для высоких нагрузок)

Шаг 1: Подготовка PostgreSQL

Для автоматической инициализации БД (создание пользователя, базы, схемы, таблиц) скрипту init-db.sh нужны административные права в PostgreSQL.

Вариант A: Ручная подготовка (рекомендуется)

Создайте базу и пользователя вручную:

-- Подключитесь как администратор (postgres)

CREATE USER qs3archipelago WITH PASSWORD 'your_secure_password';
CREATE DATABASE qs3archipelago OWNER qs3archipelago;

 Затем создайте Secret с credentials приложения:

apiVersion: v1
kind: Secret
metadata:
  name: postgres-credentials
  namespace: qs3archipelago
type: Opaque
stringData:
  hostname: "postgres-service.postgres-namespace.svc.cluster.local"
  port: "5432"
  username: "qs3archipelago"
  password: "your_secure_password"
  database: "qs3archipelago"


kubectl apply -f postgres-secret.yaml

Таблица filemeta создастся автоматически при первом запуске Filer.

Вариант B: Автоматическая инициализация

Если хотите, чтобы init-db.sh создал всё автоматически, передайте административные credentials:

Способ 1: Указать админа напрямую в WEED_POSTGRES2_USERNAME:

apiVersion: v1
kind: Secret
metadata:
  name: postgres-credentials
  namespace: qs3archipelago
type: Opaque
stringData:
  hostname: "postgres-service.postgres-namespace.svc.cluster.local"
  port: "5432"
  # Админ PostgreSQL для DDL-операций (CREATE DATABASE, CREATE USER)
  username: "postgres"
  password: "postgres_admin_password"
  database: "qs3archipelago"

Способ 2: Использовать отдельные переменные для админа. Если WEED_POSTGRES2_USERNAME не имеет прав на создание БД и таблиц, добавьте в extraEnvironmentVars для master и filters:

DB_ADMIN: "postgres"
DB_ADMINPASSWORD: "postgres_admin_password"

Скрипт использует DB_ADMIN / DB_ADMINPASSWORD для DDL-операций, а WEED_POSTGRES2_USERNAME – для работы с приложением

Скрипт создаст пользователя qs3archipelago, базу данных, схему и таблицу filemeta.

Шаг 2: Создание namespace и секретов

# Создаем namespace
kubectl create namespace qs3archipelago

 # Секрет для админ-панели
kubectl create secret generic qs3archipelago-admin-configuration \
  --namespace qs3archipelago \
  --from-literal=username=admin \
  --from-literal=password=your_admin_password

Шаг 3: Подготовка values.yaml

Создайте файл values.yaml для Helm:

nameOverride: "qs3archipelago"

global:
  createClusterRole: true
  # Укажите адрес вашего container registry
  registry: "your-registry.example.com"
  repository: "qs3archipelago"
  imageName: qs3archipelago
  imagePullPolicy: IfNotPresent
  serviceAccountName: "qs3archipelago"
  enableSecurity: false
  enableReplication: false
  replicationPlacement: "000"
  # Мониторинг Prometheus (опционально)
  monitoring:
    enabled: false
    namespace: monitoring
    gatewayHost: null
    gatewayPort: null
  extraEnvironmentVars:
    # Контекстный путь для Admin UI (опционально) 
  # WEED_ADMIN_CONTEXT_PATH: "/qs3arc"

  # Имя кластера для идентификации
  WEED_CLUSTER_DEFAULT: "qs3archipelago"
  # Адрес Master-сервера для внутренней коммуникации
  WEED_CLUSTER_SW_MASTER: "qs3archipelago-master.qs3archipelago:9333"
  # Адрес Filer для внутренней коммуникации
  WEED_CLUSTER_SW_FILER: "qs3archipelago-filer-client.qs3archipelago:8888"
  # Путь к директории с бакетами в Filer
  WEED_FILER_BUCKETS_FOLDER: "/buckets"
  # Запрет рекурсивного удаления (защита от rm -rf)
  WEED_FILER_OPTIONS_RECURSIVE_DELETE: "false"
  # Путь к директории очередей
  WEED_FILER_QUEUES_FOLDER: "/queues"
  # Отключение встроенного LevelDB (используем PostgreSQL)
  WEED_LEVELDB2_ENABLED: "false"
  # Включение PostgreSQL как бэкенда метаданных
  WEED_POSTGRES2_ENABLED: "true"
  # Режим SSL для PostgreSQL
     # ВАЖНО: Для production используйте verify-full с настроенными сертификатами
     # disable - трафик к БД идет открытым текстом
  WEED_POSTGRES2_SSLMODE: "disable"

image:
  # Укажите адрес вашего container registry
  registry: "your-registry.example.com"
  repository: "qs3archipelago"
  tag: "latest"   # Укажите конкретную версию для production

# Master Server - координатор кластера
master:
  enabled: true
  replicas: 3     # Для HA нужно минимум 3
  updatePartition: 0
  serviceAccountName: "qs3archipelago"
  podSecurityContext:
    enabled: true
    fsGroup: 30002
  data:
    type: "emptyDir"   # Или persistentVolumeClaim для production
  logs:
    type: "emptyDir"
  extraEnvironmentVars:
    # Количество томов для создания при репликации
    WEED_MASTER_VOLUME_GROWTH_COPY_1: '2'
    WEED_MASTER_VOLUME_GROWTH_COPY_2: '2'
    WEED_MASTER_VOLUME_GROWTH_COPY_3: '1'
    WEED_MASTER_VOLUME_GROWTH_COPY_OTHER: '1'
    # PostgreSQL credentials из секрета
    WEED_POSTGRES2_USERNAME:
      secretKeyRef:
        name: postgres-credentials
        key: username
    WEED_POSTGRES2_PASSWORD:
      secretKeyRef:
        name: postgres-credentials
        key: password
    WEED_POSTGRES2_DATABASE:
      secretKeyRef:
        name: postgres-credentials
        key: database
    WEED_POSTGRES2_HOSTNAME:
      secretKeyRef:
        name: postgres-credentials
        key: hostname
    WEED_POSTGRES2_PORT:
      secretKeyRef:
        name: postgres-credentials
        key: port

# Volume Server - хранение данных
volume:
  enabled: true
  replicas: 2   # Минимум 2 для отказоустойчивости
  serviceAccountName: "qs3archipelago"
  podManagementPolicy: Parallel
  # Скорость компактификации в MB/s
  compactionMBps: "80"
  # Минимальный процент свободного места на диске
  minFreeSpacePercent: 5
  podSecurityContext:
    enabled: true
    fsGroup: 30002
  dataDirs:
    - name: data1
      type: "persistentVolumeClaim"
      size: 100Gi
      # Укажите ваш StorageClass
      # Примеры: standard, gp2, yc-network-ssd, local-path
      storageClass: "local-storage-class"
      annotations: {}
      maxVolumes: 0
  logs:
    type: "persistentVolumeClaim"
    size: 10Gi
    storageClass: "local-storage-class"
    annotations: {}
  idx:
    type: "persistentVolumeClaim"
    size: 10Gi
    storageClass: "local-storage-class"
    annotations: {}

# Filer - слой метаданных
filer:
  enabled: true
  replicas: 2
  defaultReplicaPlacement: "000"
  serviceAccountName: "qs3archipelago"
  podSecurityContext:
    enabled: true
    fsGroup: 30002
  data:
    type: "persistentVolumeClaim"
    size: 10Gi
    storageClass: "local-storage-class"
    annotations: {}
  logs:
    type: "persistentVolumeClaim"
    size: 10Gi
    storageClass: "local-storage-class"
    annotations: {}
  extraEnvironmentVars:
    WEED_MYSQL_ENABLED: "false"
    WEED_LEVELDB2_ENABLED: "false"
    WEED_POSTGRES2_ENABLED: "true"
    WEED_POSTGRES2_SSLMODE: "disable"
# Подключение к PostgreSQL через секрет
  secretExtraEnvironmentVars:
    WEED_POSTGRES2_USERNAME:
      secretKeyRef:
        name: postgres-credentials
        key: username
    WEED_POSTGRES2_PASSWORD:
      secretKeyRef:
        name: postgres-credentials
        key: password
    WEED_POSTGRES2_DATABASE:
      secretKeyRef:
        name: postgres-credentials
        key: database
    WEED_POSTGRES2_HOSTNAME:
      secretKeyRef:
        name: postgres-credentials
        key: hostname
    WEED_POSTGRES2_PORT:
      secretKeyRef:
        name: postgres-credentials
        key: port
# Ingress для внешнего доступа  
ingress:
    enabled: true
    className: "istio"   # Для production используйте istio
    # className: "nginx" # Альтернатива для dev/test
    host: "filer.your-domain.com"
    path: "/"
    pathType: Prefix
    annotations:
      cert-manager.io/cluster-issuer: cluster-acme-issuer
    tls:
      - secretName: filer-tls-secret
        hosts:
          - "filer.your-domain.com"

# S3 Gateway
s3:
  enabled: true
  replicas: 2
  enableAuth: true   # Требует настройки ключей доступа (см. Шаг 6)
  existingConfigSecret: null
  podSecurityContext:
    enabled: true
    fsGroup: 30002
  logs:
    type: "emptyDir"
  ingress:
    enabled: true
    className: "istio"
    host: "s3.your-domain.com"
    path: "/"
    pathType: Prefix
    annotations:
      cert-manager.io/cluster-issuer: cluster-acme-issuer
    tls:
      - secretName: s3-tls-secret
        hosts:
          - "s3.your-domain.com"

# SFTP Server (опционально)
sftp:
  enabled: false

# Worker (опционально)
worker:
  enabled: false

# Admin UI
admin:
  enabled: true
  replicas: 1
  secret:
    existingSecret: "qs3archipelago-admin-configuration"
    userKey: "username"
    pwKey: "password"
  masters: "qs3archipelago-master.qs3archipelago:9333"
  podSecurityContext:
    enabled: true
    fsGroup: 30002
  data:
    type: "persistentVolumeClaim"
    size: 5Gi
    storageClass: "local-storage-class"
  logs:
    type: "emptyDir"
  ingress:
    enabled: true
    className: "istio"
    host: "admin.your-domain.com"
    path: "/"
    pathType: Prefix
    annotations:
      cert-manager.io/cluster-issuer: cluster-acme-issuer
    tls:
      - secretName: admin-tls-secret
        hosts:
          - "admin.your-domain.com"

# All-in-One режим (для dev/test)
allInOne:
  enabled: false

# COSI Driver
cosi:
  enabled: false

Шаг 4: Установка через Helm

helm install qs3archipelago ./qs3archipelago \
  --namespace qs3archipelago \
  --values values.yaml \
  --create-namespace

 Шаг 5: Проверка установки

# Проверяем поды
kubectl get pods -n qs3archipelago

 # Ожидаемый вывод:

# NAME                                  READY   STATUS    RESTARTS   AGE
# qs3archipelago-master-0               1/1     Running   0          2m
# qs3archipelago-master-1               1/1     Running   0          2m
# qs3archipelago-master-2               1/1     Running   0          2m
# qs3archipelago-volume-0               1/1     Running   0          2m
# qs3archipelago-volume-1               1/1     Running   0          2m
# qs3archipelago-filer-0                1/1     Running   0          2m
# qs3archipelago-filer-1                1/1     Running   0          2m
# qs3archipelago-s3-xxxxx-xxxxx         1/1     Running   0          2m
# qs3archipelago-admin-0                1/1     Running   0          2m

 # Проверяем сервисы
kubectl get svc -n qs3archipelago

 # Логи Filer (проверяем подключение к БД)
kubectl logs -n qs3archipelago qs3archipelago-filer-0 | head -50

Шаг 6: Настройка S3-доступа

S3 Gateway настроен с enableAuth: true, поэтому нужно создать ключи доступа.

Через Admin UI:

  1. Откройте Admin UI (через Ingress или port-forward)

  2. Перейдите в раздел S3 → Identities

  3. Создайте пользователя с Access Key и Secret Key

Через командную строку:

# Port-forward к Filer
kubectl port-forward -n qs3archipelago svc/qs3archipelago-filer-client 8888:8888 &

 # Создание S3-пользователя
kubectl exec -it -n qs3archipelago qs3archipelago-filer-0 -- \
  /usr/bin/weed s3 configure \
  -filer=localhost:8888 \
  -user=s3admin \
  -access_key=your_access_key \
  -secret_key=your_secret_key \
  -actions=Admin,Read,Write,List,Tagging

Шаг 7: Тестирование S3 API

# Port-forward для локального тестирования
kubectl port-forward -n qs3archipelago svc/qs3archipelago-s3 8333:8333 &

# Настройка aws-cli с ключами из Шага 6
aws configure
# AWS Access Key ID: your_access_key
# AWS Secret Access Key: your_secret_key # Default region name: ru-msk-1
# Default output format: json

# Тестируем
aws s3 mb s3://test-bucket --endpoint-url http://localhost:8333
aws s3 cp /etc/hosts s3://test-bucket/hosts.txt --endpoint-url http://localhost:8333
aws s3 ls s3://test-bucket/ --endpoint-url http://localhost:8333

Шаг 8: Установка CSI Driver (опционально)

CSI Driver позволяет использовать S3 Архипелаг как постоянное хранилище для подов Kubernetes с динамическим выделением томов.

Важно: Устанавливайте CSI Driver только после того, как кластер S3 Архипелаг полностью развернут и работает (Шаги 4-7). CSI Driver требует доступа к Filer.

Загрузите образ CSI Driver из архива и опубликуйте в ваш registry:
gunzip -c s3archcsidriver-<version>.tar.gz | docker load
docker tag s3archcsidriver:latest your-registry.example.com/s3archcsidriver:latest
docker push your-registry.example.com/s3archcsidriver:latest

Установите через Helm:

helm install s3archipelago-csi-driver ./s3archcsidriver
  --namespace kube-system
  --set image.registry=your-registry.example.com
  --set image.repository=s3archcsidriver
  --set seaweedfs.filer=qs3archipelago-filer-client.qs3archipelago:8888

Создайте StorageClass:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: s3archipelago-storage
provisioner: seaweedfs-csi-driver
parameters:
  collection: "default"
  replication: "000"
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true


kubectl apply -f storageclass.yaml

Часть 3: Использование CSI Driver

После установки CSI Driver вы можете создавать PersistentVolumeClaim, которые автоматически провизионируются в S3 Архипелаге.

Пример PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-app-data
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: s3archipelago-storage
  resources:
    requests:
      storage: 10Gi

Использование в поде

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
    - name: app
      image: nginx
      volumeMounts:
        - name: data
          mountPath: /data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: my-app-data

Часть 4: Интеграция с SSO (опционально)

S3 Архипелаг поддерживает интеграцию с Keycloak для единого входа (SSO).

Настройка Keycloak

Добавьте переменные окружения в global.extraEnvironmentVars:

global:
  extraEnvironmentVars:
    # ... другие переменные ...
    # SSO через Keycloak
    SEAWEED_SSO_KEYCLOAK_ENABLED: "true"
    SEAWEED_SSO_KEYCLOAK_URL: "https://keycloak.your-domain.com/auth"
    SEAWEED_SSO_KEYCLOAK_REALM: "your-realm"
    SEAWEED_SSO_KEYCLOAK_CLIENT_ID: "qs3archipelago"
    SEAWEED_SSO_KEYCLOAK_CLIENT_SECRET: "your-client-secret"
    SEAWEED_SSO_KEYCLOAK_ADMIN_URL: "https://admin.qs3archipelago.your-domain.com"

После включения SSO пользователи смогут входить в Admin UI через Keycloak.

Переменные окружения

Общие переменные

Переменная

Описание

По умолчанию

WEED_COMMAND

Команда запуска: master, volume, filer, s3, admin, server

-

WEED_LOG_LEVEL

Уровень логирования (0-4)

1

WEED_IP

IP-адрес или hostname сервиса

-

WEED_IP_BIND

IP для привязки (0.0.0.0 для всех интерфейсов)

0.0.0.0

WEED_DIR

Директория для данных (режим server)

-

WEED_METRICS_PORT

Порт для метрик Prometheus

9327

Переменные кластера

Переменная

Описание

По умолчанию

WEED_CLUSTER_DEFAULT

Имя кластера для идентификации

-

WEED_CLUSTER_SW_MASTER

Адрес Master-сервера (host:port)

-

WEED_CLUSTER_SW_FILER

Адрес Filer-сервера (host:port)

-

Переменные Master

Переменная

Описание

По умолчанию

WEED_MASTER_PORT

HTTP-порт Master

9333

WEED_MASTER_DIR

Директория для данных Master

-

WEED_MASTER_DEFAULT_REPLICATION

Схема репликации по умолчанию

000

WEED_MASTER_VOLUME_SIZE_LIMIT_MB

Максимальный размер тома (MB)

1000

WEED_MASTER_ELECTION_TIMEOUT

Таймаут выборов лидера

10s

WEED_MASTER_HEARTBEAT_INTERVAL

Интервал heartbeat

300ms

WEED_MASTER_SERVERS

Адреса Master-серверов

-

WEED_MASTER_VOLUME_GROWTH_COPY_1

Количество томов при репликации x1

2

WEED_MASTER_VOLUME_GROWTH_COPY_2

Количество томов при репликации x2

2

WEED_MASTER_VOLUME_GROWTH_COPY_3

Количество томов при репликации x3

1

WEED_MASTER_VOLUME_GROWTH_COPY_OTHER

Количество томов для других схем

1

Переменные Volume Server

Переменная

Описание

По умолчанию

WEED_VOLUME_PORT

HTTP-порт Volume Server

8080

WEED_VOLUME_DIR

Директория для данных

-

WEED_VOLUME_DIR_IDX

Директория для индексов

-

WEED_VOLUME_READ_MODE

Режим чтения: proxy или redirect

proxy

WEED_VOLUME_MIN_FREE_SPACE_PERCENT

Минимум свободного места (%)

1

WEED_VOLUME_COMPACTION_MBPS

Скорость компактификации (MB/s)

50

Переменные Filer

Переменная

Описание

По умолчанию

WEED_FILER_PORT

HTTP-порт Filer

8888

WEED_FILER_GRPC_PORT

gRPC-порт Filer

18888

WEED_FILER_DIR_LIST_LIMIT

Лимит записей в листинге

100000

WEED_FILER_DEFAULT_REPLICA_PLACEMENT

Схема репликации

000

WEED_FILER_BUCKETS_FOLDER

Путь к директории бакетов

/buckets

WEED_FILER_QUEUES_FOLDER

Путь к директории очередей

/queues

WEED_FILER_OPTIONS_RECURSIVE_DELETE

Разрешить рекурсивное удаление

false

WEED_FILER_MASTER

Адрес Master-сервера

-

Переменные S3 Gateway

Переменная

Описание

По умолчанию

WEED_S3_PORT

HTTP-порт S3 Gateway

8333

WEED_S3_FILER

Адрес Filer (host:port)

-

Переменные Admin UI

Переменная

Описание

По умолчанию

WEED_ADMIN_PORT

HTTP-порт Admin UI

8081

WEED_ADMIN_DATA_DIR

Директория для данных

-

WEED_ADMIN_USER

Имя пользователя

admin

WEED_ADMIN_PASSWORD

Пароль

-

WEED_ADMIN_MASTERS

Адреса Master-серверов

-

WEED_ADMIN_CONTEXT_PATH

Контекстный путь (для reverse proxy)

/

Переменные PostgreSQL

Переменная

Описание

По умолчанию

WEED_POSTGRES2_ENABLED

Включить PostgreSQL бэкенд

false

WEED_POSTGRES2_HOSTNAME

Хост PostgreSQL

-

WEED_POSTGRES2_PORT

Порт PostgreSQL

5432

WEED_POSTGRES2_USERNAME

Пользователь

-

WEED_POSTGRES2_PASSWORD

Пароль

-

WEED_POSTGRES2_DATABASE

Имя базы данных

-

WEED_POSTGRES2_SSLMODE

Режим SSL: disable, require, verify-full

disable

WEED_LEVELDB2_ENABLED

Включить LevelDB (отключите при использовании PostgreSQL)

true

Устранение неполадок

Filer не запускается

Проверьте подключение к PostgreSQL:

# В контейнере Filer
kubectl exec -it -n qs3archipelago qs3archipelago-filer-0 -- \
  psql "postgresql://user:password@host:5432/database?sslmode=disable" -c "SELECT 1"

Volume Server не регистрируется

Проверьте связность с Master:
kubectl exec -it -n qs3archipelago qs3archipelago-volume-0 -- \
  curl http://qs3archipelago-master:9333/cluster/status

S3 возвращает 403

Проверьте, что ключи доступа созданы и совпадают с настройками aws-cli.

Что дальше

  • Настройте мониторинг через Prometheus/Grafana

  • Включите репликацию для отказоустойчивости данных

  • Настройте lifecycle policies для автоматического удаления старых данных

  • Интегрируйте с вашими приложениями через S3 SDK

Комментарии (0)