Команда инженеров · свой ЦОД в РФ · своё железо · своя панель · CloudStack + Linstor · MCP · база знаний по self-hosted
Документация · Технический стек

S3-хранилище: подключение и клиенты

Объектное хранилище Fatmetal совместимо с Amazon S3 API - подключается любым S3-клиентом, GUI, SDK или готовым приложением. Достаточно указать реквизиты и включить path-style адресацию.

01 · Что понадобится (реквизиты)

После создания хранилища в панели вы получаете пять значений - держите их под рукой:

ЧтоПримерГде взять
Endpointhttps://ssd-1.s3.fatmetal.ruпанель → хранилище → Подключение
Bucketmy-storageимя, которое вы задали
Regionсм. панельпанель → хранилище → Подключение
Access Key IDGK…панель
Secret Access Keyпоказывается один раз при создании
Endpoint у вашего хранилища может отличаться - берите точный адрес из панели (хранилище → Подключение). Он зависит от типа хранилища (SSD, HDD и т.д.), поэтому ssd-1.s3.fatmetal.ru во всех примерах ниже - лишь образец SSD-хранилища; подставляйте свой. Secret Access Key показывается один раз при создании и не хранится - сохраните сразу. Дополнительные ключи вы выпускаете сами в панели (раздел «Ключи доступа»), в том числе только на чтение - см. §10.

02 · Обязательно: path-style адресация

Это единственная нестандартная настройка, но без неё подключение не заработает. S3-клиенты обращаются к объектам двумя способами:

  • virtual-hosted (по умолчанию у многих): my-storage.ssd-1.s3.fatmetal.ru/photo.jpg
  • path-style (нужен нам): ssd-1.s3.fatmetal.ru/my-storage/photo.jpg

Мы работаем в path-style. Если клиент по умолчанию использует virtual-hosted, он обратится к несуществующему хосту и выдаст ошибку вроде «не резолвится my-storage.ssd-1.s3.fatmetal.ru». В конфигурациях ниже path-style уже включён (force_path_style, addressing_style: path или галочка в GUI).

03 · Файловый менеджер прямо в панели

Проще всего начать работу с хранилищем - открыть его в панели. Встроенный файловый менеджер закрывает повседневные задачи без единой команды и без установки стороннего клиента: откройте хранилище, загружайте и качайте файлы мышью, наводите порядок в папках.

Загрузка и папки

Перетащите файлы в окно браузера или выберите вручную - загрузка идёт очередью с прогрессом по каждому файлу. Большие файлы разбиваются на части автоматически (multipart). Создавайте папки, переименовывайте, удаляйте, скачивайте по одному или сразу несколько.

Предпросмотр

Изображения, видео, аудио, PDF и текстовые файлы открываются прямо в панели - не нужно скачивать, чтобы заглянуть в содержимое. Навигация по вложенным папкам через хлебные крошки.

Ссылки для доступа

Поделитесь файлом по временной ссылке с ограниченным сроком действия - удобно отдать коллеге или клиенту, не выдавая ключи доступа ко всему хранилищу.

Файловый менеджер S3 в панели Fatmetal: список файлов, загрузка, создание папок
Браузер файлов: загрузка, папки, поиск, действия над файлами
Предпросмотр файла прямо в панели с кнопками «Поделиться» и «Скачать»
Предпросмотр прямо в панели, кнопки «Поделиться» и «Скачать»
Менеджер подходит для ручной работы и разовых задач. Для автоматизации, бэкапов и интеграции с приложениями используйте S3-клиенты и SDK - о них ниже.

04 · Терминал

aws-cli

Универсальный клиент. Настройка выполняется один раз:

bash
aws configure set aws_access_key_id GK... aws configure set aws_secret_access_key ... aws configure set default.region rzn aws configure set s3.addressing_style path # ← path-style

Дальше работаете как с обычным S3, добавляя --endpoint-url (endpoint - из панели, в примере SSD):

# загрузить файл aws --endpoint-url https://ssd-1.s3.fatmetal.ru s3 cp photo.jpg s3://my-storage/photo.jpg # список aws --endpoint-url https://ssd-1.s3.fatmetal.ru s3 ls s3://my-storage/ # синхронизировать папку (зальёт только изменившееся) aws --endpoint-url https://ssd-1.s3.fatmetal.ru s3 sync ./site s3://my-storage/site/
Чтобы не писать --endpoint-url каждый раз, заведите alias: alias fms3='aws --endpoint-url https://ssd-1.s3.fatmetal.ru s3'.

rclone

Удобен, когда S3 не единственное хранилище. В ~/.config/rclone/rclone.conf:

rclone.conf
[fatmetal] type = s3 provider = Other access_key_id = GK... secret_access_key = ... endpoint = https://ssd-1.s3.fatmetal.ru region = rzn force_path_style = true
rclone copy ./photos fatmetal:my-storage/photos # загрузить rclone sync ./site fatmetal:my-storage/site # синхронизировать rclone ls fatmetal:my-storage # список rclone mount fatmetal:my-storage ~/cloud # бакет как папка в системе

s3cmd

Лёгкий вариант для скриптов. ~/.s3cfg:

access_key = GK... secret_key = ... host_base = ssd-1.s3.fatmetal.ru host_bucket = ssd-1.s3.fatmetal.ru use_https = True

05 · GUI-клиенты

Если командная строка не ваш вариант - подойдёт любой S3-клиент. Настройки похожие: протокол Amazon S3, сервер (endpoint из панели, без схемы) и включённый path-style.

  • Cyberduck (Windows, macOS): протокол Amazon S3, сервер ssd-1.s3.fatmetal.ru, ключи из панели, в дополнительных настройках включить «Path-style requests».
  • WinSCP (Windows): протокол Amazon S3, хост ssd-1.s3.fatmetal.ru порт 443, в «Дополнительно → S3» выбрать стиль URL «Path».
  • S3 Browser (Windows): аккаунт типа S3 Compatible Storage, endpoint ssd-1.s3.fatmetal.ru и ключи, включить path-style.

06 · Из кода (SDK)

Принцип везде одинаков: endpoint (свой из панели), ключи, регион rzn и path-style.

Python (boto3)

python
import boto3 from botocore.config import Config s3 = boto3.client( "s3", endpoint_url="https://ssd-1.s3.fatmetal.ru", aws_access_key_id="GK...", aws_secret_access_key="...", region_name="rzn", config=Config(s3={"addressing_style": "path"}), # ← path-style ) s3.upload_file("photo.jpg", "my-storage", "photo.jpg")

JavaScript / Node.js (AWS SDK v3)

javascript
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; import { readFileSync } from "fs"; const s3 = new S3Client({ endpoint: "https://ssd-1.s3.fatmetal.ru", region: "rzn", credentials: { accessKeyId: "GK...", secretAccessKey: "..." }, forcePathStyle: true, // ← важно });

PHP (AWS SDK)

$s3 = new Aws\S3\S3Client([ 'version' => 'latest', 'region' => 'rzn', 'endpoint' => 'https://ssd-1.s3.fatmetal.ru', 'use_path_style_endpoint' => true, // ← path-style 'credentials' => ['key' => 'GK...', 'secret' => '...'], ]);

Go (aws-sdk-go-v2)

client := s3.NewFromConfig(cfg, func(o *s3.Options) { o.BaseEndpoint = aws.String("https://ssd-1.s3.fatmetal.ru") o.UsePathStyle = true // ← path-style })

07 · Готовые приложения

Во всех примерах ниже ssd-1.s3.fatmetal.ru - образец; подставьте endpoint своего хранилища из панели.

restic (бэкапы)

export AWS_ACCESS_KEY_ID=GK... export AWS_SECRET_ACCESS_KEY=... export RESTIC_REPOSITORY=s3:https://ssd-1.s3.fatmetal.ru/my-storage restic init # один раз restic backup ~/projects # сделать копию restic snapshots # список копий

Docker Registry (образы в S3) - config.yml

storage: s3: accesskey: GK... secretkey: ... region: rzn regionendpoint: https://ssd-1.s3.fatmetal.ru bucket: my-storage forcepathstyle: true

GitLab CI (артефакты и статика)

deploy: script: - aws configure set s3.addressing_style path - aws --endpoint-url https://ssd-1.s3.fatmetal.ru s3 sync ./dist s3://my-storage/site/
  • Nextcloud: «Внешние хранилища → добавить → Amazon S3», хост ssd-1.s3.fatmetal.ru, включить SSL и path-style, указать bucket и ключи.
  • Duplicati (GUI-бэкапы): хранилище «S3 Compatible», endpoint ssd-1.s3.fatmetal.ru, ключи, в опциях включить path-style.

08 · Объём и тарификация

  • Оплата за объём (квоту) хранилища, за ГБ в месяц. Списание с баланса аккаунта, как за другие услуги.
  • Объём меняется на лету из панели («Изменить объём») - применяется сразу, без пересоздания бакета и простоя.
  • При достижении квоты запись новых объектов вернёт ошибку лимита. Освободите место или увеличьте объём.
  • Занятое место и число объектов видны в панели (карточка хранилища).

09 · Что поддерживается, а что нет

Хранилище построено на Garage. Он покрывает базовый S3 API, но не все расширенные возможности Amazon S3.

put / get / list / deletemultipart (большие файлы)префиксы · sync · --recursiveквоты на объёмизоляция по ключу

Не поддерживается (эти запросы вернут 501 Not Implemented):

версионированиеobject lock / WORMbucket policyobject tagging
Нужны versioning или WORM (например, для комплаенс-бэкапов)? Напишите в поддержку - подберём решение под задачу.

10 · Ключи доступа

У хранилища есть основной ключ - он выдаётся вместе с бакетом, через него бакет доступен по имени. Отозвать основной ключ нельзя; перевыпуск - через поддержку. Кроме него в панели (раздел «Ключи доступа») вы сами выпускаете дополнительные ключи.

  • Несколько ключей на одно хранилище. Выпускайте отдельный ключ под каждую задачу (бэкапы, CI, раздача) - при утечке достаточно отозвать один, остальные продолжат работать.
  • Права переключаются: ключ можно выдать только на чтение (read-only) - например для раздачи файлов или стороннего сервиса - или на чтение и запись. Права дополнительного ключа меняются в панели.
  • Отзыв в один клик. Ненужный дополнительный ключ отзывается в панели мгновенно, без влияния на остальные ключи и на данные.
  • Secret показывается один раз при создании ключа и у нас не хранится. Потеряли - выпустите новый ключ и отзовите старый.
  • Ключ = доступ к бакету. Не публикуйте secret в репозиториях, логах и на фронтенде. Для публичной раздачи используйте read-only ключ или временные ссылки, а не основной ключ.

11 · Именование бакета и изоляция

  • Имя бакета: только строчная латиница, цифры и дефис (a-z, 0-9, -), длина 3-63 символа, не начинается и не заканчивается дефисом. Регистр важен во всех обращениях.
  • Изоляция. Ваш ключ видит только ваши бакеты. Данные разных клиентов полностью разделены.

12 · Оплата и статусы

Хранилище тарифицируется за объём (квоту). Если баланс аккаунта уходит в минус, хранилище меняет статус:

  • NOT PAID - уведомительный статус, ограничений на работу нет: читаете и пишете как обычно.
  • BLOCK - остаются листинг, скачивание и удаление, но запись запрещена. Данные не удаляются. После оплаты доступ возвращается автоматически.

Если что-то не подключается

Клиент использует virtual-hosted стиль. Включите path-style - у нас адрес строится как endpoint/bucket/key, а не bucket.endpoint.

Проверьте имя бакета (регистр важен: My-Bucketmy-bucket) и что включён path-style. Имя в клиенте должно точно совпадать с именем в панели.

Проверьте пару ключей (Access Key ID + Secret) и что обращаетесь к своему бакету. Опечатка в secret или чужое имя бакета дают именно 403.

Вызвана неподдерживаемая операция - versioning, object-lock, bucket policy или tagging. Отключите её в настройках клиента (см. «Что поддерживается»).

Хранилище заполнено до квоты. Освободите место (удалите ненужное) или увеличьте объём в панели («Изменить объём») - применяется сразу.

Secret показывается один раз при создании и у нас не хранится. Для дополнительного ключа - выпустите в панели новый и отзовите старый. Основной ключ хранилища перевыпускает поддержка.

Удаление хранилища в панели удаляет бакет и отзывает все его ключи; данные теряются безвозвратно. Восстановления нет (versioning не поддерживается) - сохраните копию заранее.

Запустите команду с --debug (aws-cli) или -vv (rclone): в логе видно, какой хост и стиль адресации использует клиент. Проверьте endpoint со схемой https://, path-style, region rzn, пару ключей и регистр имени бакета.

Спросить инженера в TelegramМы на связи