Перейти к основному содержимому

storage-configs

Эндпоинтов: 5

GET /api/storage-configs

Список конфигов хранилищ

Авторизация: Cookie (connect.sid) или Bearer PAT

Реестр бэкендов медиа: local (папка) и S3/MinIO.

Зачем: UI «Файлы» → «Хранилища»; фильтр файлов; новые загрузки → активное writable (isActive=true).

Отдаёт: id, name, backend, isActive, config (несекретные параметры), readOnly, hasSecrets, createdAt.

Не отдаёт: secretsEnc, access/secret keys — только булев hasSecrets.

Авторизация: cookie или Bearer PAT. Клиент: useStorageConfigs.

Ответы

КодОписание
200Все записи storage_configs без секретов
401Нет session cookie и Bearer PAT
500Ошибка чтения БД
503Приложение не настроено (setupGuard)

Пример ответа 200

[
{
"id": "local-default",
"name": "Локально: uploads",
"backend": "local",
"isActive": true,
"config": {
"rootPath": "uploads"
},
"readOnly": false,
"hasSecrets": false,
"createdAt": "2026-01-15T10:00:00.000Z"
},
{
"id": "s3-main",
"name": "Основное S3",
"backend": "s3",
"isActive": false,
"config": {
"bucket": "media",
"region": "ru-central1"
},
"readOnly": false,
"hasSecrets": true,
"createdAt": "2026-02-01T12:00:00.000Z"
}
]

POST /api/storage-configs

Создать конфиг хранилища

Авторизация: Cookie (connect.sid) или Bearer PAT

Регистрирует local или S3 с isActive=false (активация — PATCH).

S3: s3AccessKeyId + s3SecretAccessKey → шифрование в secretsEnc (нужен STORAGE_ENCRYPTION_KEY). В ответе секретов нет (hasSecrets).

После успеха — StorageRegistry.reload(). Не отдаёт ключи и secretsEnc.

Тело запроса: CreateStorageConfigRequest

Пример тела запроса

{
"name": "Загрузки проекта",
"backend": "local",
"config": {
"rootPath": "./uploads/extra"
}
}

Ответы

КодОписание
201Конфиг создан (DTO без секретов)
400Валидация или нет STORAGE_ENCRYPTION_KEY
401Не авторизован
409Конфиг с таким id уже существует
503Приложение не настроено

DELETE /api/storage-configs/{id}

Удалить конфиг хранилища

Авторизация: Cookie (connect.sid) или Bearer PAT

Удаляет запись и перезагружает реестр.

409: есть media_files с этим storageConfigId — в теле filesCount.

Отдаёт: { ok: true, id }. Объекты на диске/S3 этим вызовом не удаляются.

Параметры

ИмяInОбязательныйОписаниеПример
idpathдаID записи storage_configs (например local-default, s3-main)"local-default"

Ответы

КодОписание
200Конфиг удалён
401Не авторизован
404Хранилище не найдено
409На хранилище ещё есть файлы
503Приложение не настроено

PATCH /api/storage-configs/{id}

Обновить конфиг хранилища

Авторизация: Cookie (connect.sid) или Bearer PAT

Частичное обновление: имя, config (полная замена объекта), readOnly, креды S3, isActive.

Set-active: isActive: true снимает активность у остальных.

Креды: пара ключей перешифровывается; без полей — старые секреты не трогаются.

Отдаёт DTO без секретов. После успеха — StorageRegistry.reload().

Тело запроса: UpdateStorageConfigRequest

Параметры

ИмяInОбязательныйОписаниеПример
idpathдаID записи storage_configs (например local-default, s3-main)"local-default"

Пример тела запроса

{
"isActive": true
}

Ответы

КодОписание
200Обновлённый DTO
400Валидация или нет STORAGE_ENCRYPTION_KEY
401Не авторизован
404Хранилище не найдено
503Приложение не настроено

POST /api/storage-configs/{id}/test

Проверить доступность хранилища

Авторизация: Cookie (connect.sid) или Bearer PAT

Connectivity-check без активации.

  • local: папка writable или создаётся;
  • s3: HeadBucket (fallback ListObjectsV2).

200 { ok: true, message } · 400 { ok: false, message } (без секретов). Активация — отдельно PATCH с isActive: true.

Параметры

ИмяInОбязательныйОписаниеПример
idpathдаID записи storage_configs (например local-default, s3-main)"local-default"

Ответы

КодОписание
200Хранилище доступно
400Проверка не прошла
401Не авторизован
404Хранилище не найдено
503Приложение не настроено

Пример ответа 200

{
"ok": true,
"message": "Папка доступна на запись: uploads"
}