Хранилище → Документация

Документация

Эндпоинты, ключи, примеры для популярных клиентов и рецепт ночного бэкапа. Всё, что ниже, работает на любом тарифе, включая пробный.

S3-эндпоинт
https://s3.spb-vault.bulsan.site
Регион
spb-1
Стиль адресации
path-style и virtual-hosted, оба поддерживаются
WebDAV
https://dav.spb-vault.bulsan.site/<бакет>/
Подпись запросов
AWS Signature v4

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

Пара ключей выпускается в кабинете, раздел «Доступы». Идентификатор виден всегда, секретная часть показывается один раз при создании. Потеряли — выпустите новую пару и отзовите старую.

Каждой паре назначается политика: read, write, readwrite или admin, и список бакетов, на которые она распространяется. Бэкап-агенту достаточно write — тогда даже при краже ключа с машины злоумышленник не сможет прочитать или удалить уже загруженные копии.

S3-совместимые клиенты

aws-cli. Пропишите профиль и работайте обычными командами:

aws configure --profile granit
# Access Key ID     : GRN7QF...
# Secret Access Key : ****
# Default region    : spb-1

aws --profile granit --endpoint-url https://s3.spb-vault.bulsan.site \
    s3 ls s3://arch-work/

aws --profile granit --endpoint-url https://s3.spb-vault.bulsan.site \
    s3 cp ./dump.sql.zst s3://arch-work/db/dump-2026-09-03.sql.zst

Python, boto3:

import boto3

s3 = boto3.client(
    "s3",
    endpoint_url="https://s3.spb-vault.bulsan.site",
    region_name="spb-1",
    aws_access_key_id="GRN7QF...",
    aws_secret_access_key="...",
)

s3.upload_file("dump.sql.zst", "arch-work", "db/dump-2026-09-03.sql.zst")
print(s3.list_objects_v2(Bucket="arch-work", Prefix="db/")["KeyCount"])

rclone

Удобен для синхронизации каталогов и для монтирования бакета в файловую систему.

[granit]
type = s3
provider = Other
endpoint = https://s3.spb-vault.bulsan.site
region = spb-1
access_key_id = GRN7QF...
secret_access_key = ...
acl = private
rclone sync /var/www/uploads granit:arch-work/uploads --fast-list --transfers 8
rclone mount granit:arch-work /mnt/granit --vfs-cache-mode writes

WebDAV

Годится для ручной работы с файлами и для машин, где нельзя ставить сторонний софт.

Штатный клиент Windows ограничивает файл 4 ГБ, пока не поднят параметр FileSizeLimitInBytes в реестре. Для больших файлов используйте rclone или S3-клиент.

Правила жизненного цикла

Задаются на бакет, применяются раз в сутки. Типовой набор для бэкапов:

{
  "Rules": [
    { "ID": "cold-30",     "Prefix": "db/",   "Status": "Enabled",
      "Transition": { "Days": 30, "StorageClass": "COLD" } },
    { "ID": "drop-old",    "Prefix": "db/",   "Status": "Enabled",
      "Expiration": { "Days": 365 } },
    { "ID": "clean-parts", "Prefix": "",      "Status": "Enabled",
      "AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 7 } }
  ]
}

Незавершённые мультипарт-загрузки не видны в списке объектов, но занимают место и попадают в счёт — правило clean-parts стоит заводить сразу.

aws --profile granit --endpoint-url https://s3.spb-vault.bulsan.site \
    s3 presign s3://arch-work/reports/q3.pdf --expires-in 3600

Ссылка действует указанное время и не требует ключей у получателя. Все выданные ссылки видны в кабинете, любую можно отозвать досрочно — она перестанет работать сразу.

Ночной бэкап по расписанию

Рабочая схема для одного сервера: дамп базы, архив каталога, отправка в бакет, ротация правилами жизненного цикла на стороне хранилища.

#!/bin/bash
set -euo pipefail
D=$(date +%F)
pg_dump -Fc app | zstd -9 > /tmp/app-$D.dump.zst
tar -I zstd -cf /tmp/uploads-$D.tar.zst /var/www/uploads

export AWS_PROFILE=granit
EP=https://s3.spb-vault.bulsan.site
aws --endpoint-url $EP s3 cp /tmp/app-$D.dump.zst   s3://arch-work/db/
aws --endpoint-url $EP s3 cp /tmp/uploads-$D.tar.zst s3://arch-work/files/
rm -f /tmp/app-$D.dump.zst /tmp/uploads-$D.tar.zst
# crontab: каждый день в 3:20
20 3 * * * /usr/local/sbin/granit-backup.sh >> /var/log/granit-backup.log 2>&1

Ключ для этой машины выпускайте с политикой write на бакет arch-work — скрипту большего не нужно.

Коды ответов

КодЧто означаетЧто делать
403 SignatureDoesNotMatchНе сходится подпись запросаПроверьте секретный ключ и часы на машине — расхождение больше 15 минут ломает подпись
403 AccessDeniedПолитика ключа не даёт операциюПосмотрите права пары ключей в кабинете
404 NoSuchBucketБакета нет или он в другом аккаунтеСверьте имя и регион spb-1
409 BucketNotEmptyУдаление непустого бакетаСнимите объекты и версии, затем повторите
429 SlowDownПревышен лимит запросов в секундуПовтор с экспоненциальной задержкой; лимит поднимается заявкой
503 ServiceUnavailableВременная недоступность узлаПовторите запрос; при устойчивом повторении — в поддержку