Документация
Эндпоинты, ключи, примеры для популярных клиентов и рецепт ночного бэкапа. Всё, что ниже, работает на любом тарифе, включая пробный.
- 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. Проводник → «Подключить сетевой диск» → адрес
https://dav.spb-vault.bulsan.site/arch-work/, логин — идентификатор ключа, пароль — секретная часть. - macOS. Finder → «Подключение к серверу» (⌘K) → тот же адрес.
- Linux.
mount -t davfs https://dav.spb-vault.bulsan.site/arch-work/ /mnt/granitили подключение через GVFS в файловом менеджере.
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 | Временная недоступность узла | Повторите запрос; при устойчивом повторении — в поддержку |