Приложение хранит пользовательские файлы отдельно от базы данных: вложения, загруженные документы, изображения и другие файлы, которые пользователи добавляют в систему. Перед установкой нужно выбрать, где будут храниться эти файлы.
Поддерживаются два основных варианта:
pv - хранение файлов в Kubernetes PVC. Для приложения это выглядит как обычная папка внутри backend pod.s3 - хранение файлов напрямую в S3-совместимом объектном хранилище через настройки приложения.Важно: если нужно использовать S3-совместимое хранилище для пользовательских файлов, не подключайте его к приложению как обычный Kubernetes PVC через S3 CSI/FUSE-драйверы. В таком варианте приложение считает, что работает с обычной папкой, но фактически запись и чтение проходят через промежуточный FUSE/CSI-слой между приложением и объектным хранилищем. Это может приводить к некорректному поведению при быстрой загрузке и чтении файлов, например, когда сразу после загрузки первый запрос на чтение получает пустой файл.
Этот режим используется по умолчанию. Его можно выбрать, если в Kubernetes-кластере есть подходящий storage class для хранения файлов приложения.
В этом варианте backend pod получает volume mount:
/var/www/html/storage
Для Helm chart storage class задаётся в values.yaml:
dreamteam:
backend:
pvc:
storageClassName: "<storage-class-rwx>"
redis:
pvc:
storageClassName: "<storage-class-rwo>"
Для dreamteam.backend.pvc.storageClassName нужен storage class, который подходит для хранения пользовательских файлов приложения. Если backend запускается в нескольких репликах, хранилище должно поддерживать доступ с нескольких pod одновременно, то есть режим ReadWriteMany.
В этом варианте backend PVC для пользовательских файлов не создаётся и путь /var/www/html/storage не монтируется. Приложение обращается к S3 напрямую.
Этот режим полезен, если в инфраструктуре уже есть S3-совместимое объектное хранилище: Yandex Object Storage, Selectel S3, MinIO или совместимый сервис. В этом варианте приложение работает с S3 напрямую, без промежуточного Kubernetes PVC для пользовательских файлов.
Для настройки S3-хранилища понадобятся параметры доступа:
APP_AWS_ACCESS_KEY_ID - ключ доступа S3-аккаунта.APP_AWS_SECRET_ACCESS_KEY - секретный ключ S3-аккаунта.APP_AWS_DEFAULT_REGION - регион S3-хранилища, например ru-central1.APP_AWS_BUCKET - имя bucket для пользовательских файлов приложения.APP_AWS_URL - URL bucket или префикса, если он используется S3-провайдером.APP_AWS_ENDPOINT - endpoint S3 API.APP_AWS_USE_PATH_STYLE_ENDPOINT - режим обращения к bucket. Значение зависит от S3-провайдера; для некоторых S3-совместимых хранилищ требуется true.Точные значения endpoint, URL, region и path-style уточните в документации вашего S3-провайдера.
В base.yaml укажите:
storageType: "s3"
APP_AWS_ACCESS_KEY_ID: "<key-id>"
APP_AWS_SECRET_ACCESS_KEY: "<secret-key>"
APP_AWS_DEFAULT_REGION: "ru-central1"
APP_AWS_BUCKET: "<bucket>"
APP_AWS_URL: "https://storage.yandexcloud.net/<bucket>"
APP_AWS_ENDPOINT: "https://storage.yandexcloud.net"
APP_AWS_USE_PATH_STYLE_ENDPOINT: "true"
S3-режим доступен начиная с Helm chart dreamteam-on-premise-app версии v1.0.36.
В values.yaml укажите:
dreamteam:
backend:
storageType: s3
environment:
APP_AWS_ACCESS_KEY_ID: "<key-id>"
APP_AWS_SECRET_ACCESS_KEY: "<secret-key>"
APP_AWS_DEFAULT_REGION: "ru-central1"
APP_AWS_BUCKET: "<bucket>"
APP_AWS_ENDPOINT: "https://storage.yandexcloud.net"
APP_AWS_URL: "https://storage.yandexcloud.net/<bucket>"
APP_AWS_USE_PATH_STYLE_ENDPOINT: "true"
При storageType: s3 не нужно указывать S3 CSI storage class в dreamteam.backend.pvc.storageClassName: backend PVC для файлов приложения не будет создан.
При использовании S3-хранилища удаление файла в приложении не означает немедленное удаление объекта из bucket. Приложение хранит удалённые файлы в течение заданного срока, а физическое удаление из S3 выполняется позже.
Срок хранения удалённых файлов задаётся переменной окружения FILESYSTEM_STORAGE_TIME_DELETED_FILES. Значение указывается в днях. По умолчанию для S3-хранилища приложения используется 100 дней.
Если значение по умолчанию подходит, переменную можно не указывать. Если срок нужно изменить, задайте её в конфигурации backend.
Для Helmfile добавьте переменную в base.yaml в блок extraENVvars:
extraENVvars: |
- name: FILESYSTEM_STORAGE_TIME_DELETED_FILES
value: "30"
Для Helm chart добавьте переменную в values.yaml в блок dreamteam.backend.environment:
dreamteam:
backend:
environment:
FILESYSTEM_STORAGE_TIME_DELETED_FILES: "30"
Дополнительно на стороне S3-провайдера можно настроить версионирование и политику жизненного цикла bucket, если они поддерживаются. Эти правила работают независимо от приложения, поэтому их нужно согласовывать со сроком хранения удалённых файлов в приложении. Политика жизненного цикла не должна удалять актуальные объекты раньше, чем приложение перестанет на них ссылаться. Если в bucket включено версионирование, удаление и lifecycle-правила могут оставлять предыдущие версии объектов или маркеры удаления (delete markers); для их очистки обычно настраивают отдельные правила для non-current versions и delete markers.
Проверьте, что релиз установлен или обновлён:
helm -n dreamteam list
helm -n dreamteam get values dreamteam-on-premise
Проверьте PVC:
kubectl -n dreamteam get pvc
В S3-режиме не должно быть backend PVC для /var/www/html/storage. PVC Redis при этом остаётся.
Проверьте deployment backend:
kubectl -n dreamteam get deploy dreamteam-on-premise-backend-app -o yaml | grep -E "storage|mountPath|claimName|APP_AWS|FILESYSTEM|LOG_CHANNEL" -C 3
В S3-режиме в deployment не должно быть mount path:
/var/www/html/storage
Проверьте ConfigMap backend:
kubectl -n dreamteam get cm dreamteam-on-premise-backend-app -o yaml | grep -E "APP_AWS|FILESYSTEM|LOG_CHANNEL" -C 2
Ожидаемые значения:
FILESYSTEM_DISK: "app-s3"
FILESYSTEM_DRIVER: "s3"
LOG_CHANNEL: "daily-s3"
Также проверьте работу в интерфейсе: загрузите файл и сразу скачайте или откройте его несколько раз подряд. Первый запрос не должен возвращать пустой файл.
S3-хранилище приложения и S3-хранилище резервных копий - это разные настройки.
storageType: s3 и переменные APP_AWS_*.BACKUP_DISC: backup-s3 и переменные AWS_*.Можно использовать один и тот же S3-провайдер, но рекомендуется заранее определить отдельные bucket или префиксы для пользовательских файлов и резервных копий.