S5W.
Собственное файловое хранилище для ваших приложений: принимает файлы по API, хранит их и раздаёт пользователям — с CDN-заголовками, временными ссылками и админ-панелью. Ставится одним контейнером на ваш сервер.
Что это
S5W — это сервис, которому приложение отдаёт файлы на хранение и у которого потом берёт ссылки на них. Аватары пользователей, вложения, документы, картинки для сайта, выгрузки — всё, что приложению неудобно держать у себя на диске или в базе.
Приложение загружает файл одним HTTP-запросом и получает в ответ его адрес. По этому адресу файл отдаётся браузеру, мобильному клиенту или CDN — быстро, с поддержкой докачки и кэширования. Чем управлять — бакетами, квотами, доступом, ссылками — видно в веб-панели.
Всё это работает у вас: на вашем сервере, в вашем контуре, без внешнего облака и без оплаты за трафик третьей стороне.
Какие задачи решает
Приложению больше не нужно хранить файлы у себя, следить за диском и раздавать их своим кодом. Оно хранит только короткий идентификатор файла.
Данные не покидают ваш сервер. Подходит, когда облачное хранилище нельзя по требованиям безопасности, закона или договора.
Публичные файлы — по открытой ссылке, закрытые — по токену, разовая передача — по временной ссылке, которая сама истекает.
Сроки хранения, квоты, очистка брошенного и пересчёт места выполняются сами, по расписанию.
Типовые сценарии
- Пользовательские загрузки — аватары, фото, вложения в обращениях. Картинки
можно сразу уменьшить и перевести в
webpилиavif. - Медиа для сайта или приложения — раздача через CDN с долгим кэшем и
ETag. - Передача документов — временная ссылка на сутки и с лимитом скачиваний, без выдачи доступа ко всему хранилищу.
- Временные файлы — выгрузки, отчёты, промежуточные результаты в папке со сроком хранения: через неделю или месяц они удалятся сами.
- Несколько проектов на одном сервере — каждый в своём бакете, со своей квотой и своими токенами.
Возможности
База, планировщик и панель уже внутри. Ни внешних зависимостей, ни настройки подключений.
У каждого бакета своя квота и токены, у папки — видимость, срок хранения и политика кэша.
Публичные ссылки, доступ по токену и подписанные временные ссылки с лимитом скачиваний.
Одинаковые файлы хранятся один раз: копия не занимает места на диске и не расходует квоту.
Загрузка частями, которая продолжается после обрыва связи.
Уменьшение, поворот по EXIF и перекодирование в webp, avif, jpeg, png при загрузке.
Range, ETag, условные запросы и настраиваемый Cache-Control.
Отдача, приём и число запросов — по бакетам и по дням.
Отдельное веб-приложение на своём порту: адаптивное, светлая и тёмная тема, русский и английский.
Как устроено
Внутри одного контейнера работают четыре части. Наружу смотрят только два порта.
:9090Клиентский API /v1/… для ваших приложений и раздача файлов /o, /p, /t.
:9091Веб-панель управления. Ходит к приложению внутри контейнера. Можно выключить.
наружу не открытМетаданные: бакеты, файлы, токены, ссылки, статистика. Создаётся и мигрируется сам.
по расписаниюСроки хранения, очистка брошенного, пересчёт места, сброс статистики.
Все данные — база, файлы, ключ подписи — лежат в одном томе /var/lib/s5w.
Резервная копия и перенос на другой сервер — это копия этого тома. Подробно — в
архитектуре.
Когда подходит, а когда нет
| Подходит | Лучше выбрать другое |
|---|---|
| Нужно своё хранилище в своём контуре | Нужен S3-совместимый протокол: S5W говорит на своём REST API |
| Один сервер справляется с объёмом и нагрузкой | Нужна репликация и работа на нескольких узлах: S5W — один контейнер на одном томе |
| Важна простота: одна команда запуска, без отдельной базы | Нужна обработка видео: S5W обрабатывает только картинки |
| Файлы от килобайт до гигабайт, загрузка частями | Объём данных больше, чем вмещает диск одного сервера |
Отказоустойчивость
S5W работает на одном сервере. Защита от потери данных — резервное копирование тома (см. эксплуатацию), а время восстановления — это время развернуть контейнер на копии тома.
Ограничения в цифрах
| Что | Предел |
|---|---|
Файл одним запросом POST /v1/files |
до 32 МиБ |
| Файл загрузкой частями | без отдельного предела — до квоты бакета и места на диске |
| Часть при загрузке частями | 4–16 МиБ |
| Незавершённая загрузка частями | живёт 24 часа с последней части |
| Временная ссылка | срок до 30 дней, до 1000 скачиваний |
| Картинка для обработки | до 25 мегапикселей |
| Срок хранения в папке | от суток до года, или бессрочно |
| Квота бакета по умолчанию | 100 МиБ, меняется в панели |
С чего начать
Запуск одной командой, первый бакет, токен и загрузка файла.
Из чего состоит, как хранятся файлы, как считается место.
Все переменные окружения: что, зачем и что будет, если не задать.
Токены, вход в панель, публичность файлов, подписи ссылок.
nginx-proxy-manager, traefik, nginx: два домена без открытых портов.
Токены, файлы, загрузка частями, папки, временные ссылки.
Готовый клиент для PHP: загрузка частями с продолжением, объекты и ошибки по типу.