Зачем убирать файлы с диска приложения
Контейнеры приложений должны быть stateless, чтобы их можно было передеплоивать, масштабировать и откатывать без потери пользовательских загрузок. Когда аватары, фото товаров, счета и видео записываются на файловую систему контейнера, каждый рестарт рискует потерей данных, и у каждой реплики оказывается свой набор файлов. Object Storage решает это, давая всем репликам одно общее, надёжное место для чтения и записи. Ваше приложение остаётся одноразовым, пока данные живут независимо.
По-настоящему S3-совместимо, а не похоже
Сервис говорит на API S3, так что инструменты, которыми вы уже пользуетесь, продолжают работать: aws-cli, boto3, AWS SDK для JavaScript, драйверы файловой системы S3 в Laravel и Symfony, rclone и s3cmd — все они общаются с ним, как только вы задаёте URL эндпоинта и пару ключей. Многочастная загрузка больших файлов, метаданные объектов и обработка content-type ведут себя так, как ожидают разработчики S3. Это значит, что миграция приложения, уже использующего S3, обычно сводится к изменению конфигурации, а не переписыванию кода.
Бакеты, ключи доступа и радиус поражения
Вы организуете данные в бакеты и контролируете доступ парами access key ID и secret key, которые можно ротировать или отзывать в любой момент. Использование одного ключа на приложение или на бакет ограничивает радиус поражения: если ключ утекает в лог или клиентский бандл, вы отзываете именно эту пару и создаёте новую, не трогая остальные сервисы. Панель показывает список существующих ключей, чтобы вы могли проверить и вывести из эксплуатации те, что больше не используются.
Хранилище и CDN, работающие как единое целое
Поскольку Object Storage и edge CDN — одна и та же платформа, вы можете отдавать объекты бакета через кэш, не настраивая отдельный origin. Публичный бакет или подписанный edge-маршрут становится быстрым путём загрузки, где популярные файлы кэшируются рядом с пользователями и не обращаются к хранилищу повторно. Когда вы заменяете файл под существующим ключом, точечный purge из панели или cdnctl обновляет edge, чтобы никто не получил устаревшую копию.
Привязка хранилища к контейнерным приложениям
Вместо вставки учётных данных в Dockerfile или коммита их в репозиторий вы привязываете бакет к Container App, а платформа доставляет эндпоинт и ключи как переменные окружения, опционально под префиксом, чтобы несколько бакетов оставались различимыми. Ваш код читает стандартные имена env во время выполнения, секреты никогда не появляются в образе, а ротация ключа обновляет привязку, а не заставляет пересобирать образ. Это сохраняет разделение конфигурации и кода по принципу twelve-factor.
Резервные копии и холодные данные
Object Storage — естественный дом для дампов базы данных, резервных копий приложений и архивных экспортов, которые вы хотите убрать с основного сервера, сохранив быстрое восстановление. Поскольку доступ основан на ключах и ограничен, задача резервного копирования может держать ключ workflow'а вида «только запись», отдельный от ключей, которые использует ваше живое приложение. Скриптовано через cdnctl в ночном задании, загрузки и очистка по retention выполняются без присмотра, а лимит использования на бакет удерживает архивы от неконтролируемого роста.
Как настроить, шаг за шагом
Создайте бакет
В панели откройте Object Storage и выберите Create Bucket. Дайте ему DNS-безопасное имя (строчные буквы, цифры и дефисы) и решите, должны ли объекты быть приватными по умолчанию или доступными для публичного чтения. Приватный вариант подходит для резервных копий и оригиналов, которые вы будете подписывать или проксировать; публичное чтение подходит ресурсам, которые вы собираетесь отдавать напрямую через CDN.
Сгенерируйте пару ключей доступа
Откройте вкладку Access Keys и сгенерируйте ключ. Вы получаете access key ID и secret key; секрет показывается только один раз, поэтому сразу скопируйте его в менеджер секретов. Ограничивайте ключ областью нужного бакета, а не переиспользуйте один мастер-ключ для всех проектов, чтобы утечку можно было локализовать отзывом единственной пары.
Направьте S3-клиент на эндпоинт
Настройте любой SDK для S3 или aws-cli с URL эндпоинта cdn.com.tr, показанным на странице бакета, path-style адресацией и вашей парой ключей. Например: aws --endpoint-url <endpoint> s3 cp ./poster.jpg s3://my-media/posters/. Кастомный клиент не нужен, потому что API говорит на протоколе S3.
Привяжите бакет к контейнерному приложению
В Container App выберите Bind Object Storage и выберите бакет. Платформа внедряет эндпоинт, регион, access key и secret как переменные окружения (с опциональным префиксом, например ASSETS_), так что ваш код читает их из окружения вместо жёстко заданных учётных данных в образе или репозитории.
Поставьте это за CDN
Подключите домен или используйте edge-маршрут бакета, чтобы объекты отдавались из кэша в edge-локациях. Задайте заголовки кэша при загрузке и используйте purge из панели или cdnctl, когда перезаписываете файл под тем же ключом, чтобы зрители получили новую версию.
Задайте лимиты и автоматизируйте через cdnctl
Примените лимит использования на бакет, чтобы защититься от неконтролируемого роста, и скриптуйте рутинные задачи через cdnctl, чтобы загрузки резервных копий и очистка выполнялись из CI без открытия панели. Периодически ротируйте ключи с той же вкладки Access Keys.
Примеры сценариев
Сайт электронной коммерции хранит каждое изображение товара и оригинал загрузки в бакете, отдаёт производные через CDN и держит контейнеры приложения stateless, так что деплои никогда не трогают файлы пользователей.
Контейнерное приложение, масштабированное до нескольких реплик, записывает пользовательские загрузки в один бакет, так что каждый экземпляр читает одни и те же файлы, а рестарт или событие масштабирования никогда не теряет данные.
Cron- или CI-задача использует ограниченный ключ и cdnctl, чтобы каждую ночь отправлять сжатые дампы базы данных в приватный бакет, а лимит использования и очистка по retention держат стоимость предсказуемой.
Команда, уже использующая AWS S3, перенаправляет эндпоинт SDK и ключи на cdn.com.tr, использует rclone для копирования объектов и выпускает изменение без переписывания кода хранилища.
Часто задаваемые вопросы
Какие инструменты и SDK для S3 реально с этим работают?
Распространённые: aws-cli, boto3, AWS SDK для JavaScript, rclone, s3cmd и драйверы файловой системы S3 в Laravel и Symfony. Задайте URL эндпоинта со страницы бакета, используйте path-style адресацию и предоставьте свой access key и secret. Многочастная загрузка больших объектов поддерживается.
Могу ли я отдавать файлы бакета напрямую публике через CDN?
Да. Сделайте бакет или объект доступным для публичного чтения, или используйте edge-маршрут бакета, и подключите домен. Затем объекты кэшируются в edge-локациях, так что повторные загрузки отдаются из кэша, а не обращаются к хранилищу каждый раз.
Что происходит, когда я перезаписываю файл под тем же ключом?
Хранилище немедленно принимает новый объект, но edge может ещё какое-то время держать предыдущую версию до истечения кэша. Выполните purge для этого пути из панели или через cdnctl сразу после загрузки, чтобы зрители получили свежий файл.
Что делать, если ключ доступа утёк?
Отзовите эту пару ключей на вкладке Access Keys и сгенерируйте новую. Поскольку ключи следует ограничивать областью бакета или приложения, отзыв одной пары не затрагивает остальные ваши сервисы. Обновите привязку или своё хранилище секретов новым значением.
Нужно ли жёстко задавать учётные данные в моём образе контейнера?
Нет, и не следует. Привяжите бакет к Container App, и эндпоинт, регион, access key и secret придут как переменные окружения, опционально под префиксом. Ваш код читает их во время выполнения, так что секреты остаются вне образа и репозитория.
Как удержать хранилище от неограниченного роста?
Задайте лимит использования на бакет, чтобы он не разрастался незаметно, а для бакетов резервных копий скриптуйте очистку по retention через cdnctl, чтобы старые дампы удалялись по расписанию. Панель показывает текущее использование по каждому бакету, чтобы вы могли его отслеживать.