Драйверы хранилища
Раздел для тех, кто разворачивает castbase у себя (владельцы инсталляции). Пользователю сервиса он не нужен.
Доменный код castbase не знает, где физически лежат файлы. Он работает с двумя портами; конкретное хранилище выбирается строкой DSN в окружении, а новое подключается без правки доменного кода.
| Порт | Где | Что делает | Настройка |
|---|---|---|---|
MediaStorage |
ядро (PHP) | оригиналы загруженных медиа | MEDIA_STORAGE_DSN |
PublicMediaHost |
вертикаль (Python) | публичные URL, с которых площадка скачивает файл | PUBLIC_MEDIA_DSN |
В v1 есть драйверы: local:// (диск сервера) для оригиналов и rsync:// (внешний хост вне РФ, JPEG-конвертация, публичный
URL по public_base) для публичной раздачи. Meta не скачивает медиа с российских хостов, поэтому публичный хост — вне РФ;
файлы там автоматически удаляются через 7 дней.
Драйвер оригиналов (ядро, PHP)
Порт App\Media\Application\MediaStorage:
interface MediaStorage
{
/** @param resource $stream читается до конца, закрывать его — забота вызывающего */
public function put(string $key, $stream, string $mime): void;
/** @return resource поток для чтения; вызывающий закрывает @throws MediaNotFound */
public function readStream(string $key);
/** Идемпотентно: удаление отсутствующего объекта — не ошибка. */
public function delete(string $key): void;
public function exists(string $key): bool;
}
Как подключить новый драйвер (например, S3):
- Класс в
src/Media/Infrastructure/, реализующийMediaStorageDriver:scheme()возвращает схему DSN (s3),create($dsn)разбирает DSN и возвращает реализациюMediaStorage. - Тег
app.media_storage_driverставится автоматически (autoconfigure):services.yamlправить не нужно. - В
.env.localна сервере:MEDIA_STORAGE_DSN=s3://…. Доменный код и контроллеры не меняются.
Неверный DSN даёт InvalidMediaStorageDsn со списком известных схем. Образец — LocalMediaStorageDriver.
Драйвер публичного хоста (вертикаль, Python)
Хранилище выбирается DSN в PUBLIC_MEDIA_DSN; доменный код вертикали знает только порт PublicMediaHost.
- Класс-наследник
castbase_kit.media.PublicMediaHost:put(local_path, name)— положить файл под именемname, доступным на чтение поpublic_base/name;purge(older_than)— удалить выложенное старше срока, вернуть число файлов;@classmethod from_dsn(dsn, **options)— разобрать свой DSN (обязателенpublic_base, если URL не вычисляется иначе — тогда переопределитеurl_for).
- Зарегистрировать схему в
default_registry():registry.register("s3", S3MediaHost.from_dsn). - Тест драйвера по образцу
tests/test_media.py; внешние вызовы — через подменяемый runner или клиент. - На сервере сменить
PUBLIC_MEDIA_DSN. Деплой кода вертикали не нужен, если драйвер уже в kit.
Сам DSN в сообщения об ошибках не попадает (в нём могут быть ключи).
Что остаётся неизменным
Ядро отдаёт оригинал вертикали по подписанному внутреннему URL; вертикаль конвертирует картинки в JPEG, выкладывает
через PublicMediaHost и удаляет через 7 дней. Новый драйвер заменяет только «где лежат байты».