Сборка · s5w

S5W.

Собственное файловое хранилище для ваших приложений: принимает файлы по API, хранит их и раздаёт пользователям — с CDN-заголовками, временными ссылками и админ-панелью. Ставится одним контейнером на ваш сервер.

Поставка один Docker-образЗависимости нетДанные один томРантайм Swoole · PHP 8.5 · PostgreSQL 18

Что это

S5W — это сервис, которому приложение отдаёт файлы на хранение и у которого потом берёт ссылки на них. Аватары пользователей, вложения, документы, картинки для сайта, выгрузки — всё, что приложению неудобно держать у себя на диске или в базе.

Приложение загружает файл одним HTTP-запросом и получает в ответ его адрес. По этому адресу файл отдаётся браузеру, мобильному клиенту или CDN — быстро, с поддержкой докачки и кэширования. Чем управлять — бакетами, квотами, доступом, ссылками — видно в веб-панели.

Всё это работает у вас: на вашем сервере, в вашем контуре, без внешнего облака и без оплаты за трафик третьей стороне.

Какие задачи решает

Файлы уходят из приложения

Приложению больше не нужно хранить файлы у себя, следить за диском и раздавать их своим кодом. Оно хранит только короткий идентификатор файла.

Хранилище в своём контуре

Данные не покидают ваш сервер. Подходит, когда облачное хранилище нельзя по требованиям безопасности, закона или договора.

Доступ по правилам

Публичные файлы — по открытой ссылке, закрытые — по токену, разовая передача — по временной ссылке, которая сама истекает.

Порядок без ручной работы

Сроки хранения, квоты, очистка брошенного и пересчёт места выполняются сами, по расписанию.

Типовые сценарии

  • Пользовательские загрузки — аватары, фото, вложения в обращениях. Картинки можно сразу уменьшить и перевести в webp или avif.
  • Медиа для сайта или приложения — раздача через CDN с долгим кэшем и ETag.
  • Передача документов — временная ссылка на сутки и с лимитом скачиваний, без выдачи доступа ко всему хранилищу.
  • Временные файлы — выгрузки, отчёты, промежуточные результаты в папке со сроком хранения: через неделю или месяц они удалятся сами.
  • Несколько проектов на одном сервере — каждый в своём бакете, со своей квотой и своими токенами.

Возможности

Один контейнер

База, планировщик и панель уже внутри. Ни внешних зависимостей, ни настройки подключений.

Бакеты и папки

У каждого бакета своя квота и токены, у папки — видимость, срок хранения и политика кэша.

Три канала раздачи

Публичные ссылки, доступ по токену и подписанные временные ссылки с лимитом скачиваний.

Дедупликация

Одинаковые файлы хранятся один раз: копия не занимает места на диске и не расходует квоту.

Большие файлы

Загрузка частями, которая продолжается после обрыва связи.

Картинки на лету

Уменьшение, поворот по EXIF и перекодирование в webp, avif, jpeg, png при загрузке.

Готово к CDN

Range, ETag, условные запросы и настраиваемый Cache-Control.

Статистика трафика

Отдача, приём и число запросов — по бакетам и по дням.

Админ-панель

Отдельное веб-приложение на своём порту: адаптивное, светлая и тёмная тема, русский и английский.

Как устроено

Внутри одного контейнера работают четыре части. Наружу смотрят только два порта.

:9090
Приложение

Клиентский API /v1/… для ваших приложений и раздача файлов /o, /p, /t.

:9091
Админ-панель

Веб-панель управления. Ходит к приложению внутри контейнера. Можно выключить.

наружу не открыт
PostgreSQL 18

Метаданные: бакеты, файлы, токены, ссылки, статистика. Создаётся и мигрируется сам.

по расписанию
Планировщик

Сроки хранения, очистка брошенного, пересчёт места, сброс статистики.

Все данные — база, файлы, ключ подписи — лежат в одном томе /var/lib/s5w. Резервная копия и перенос на другой сервер — это копия этого тома. Подробно — в архитектуре.

Когда подходит, а когда нет

Подходит Лучше выбрать другое
Нужно своё хранилище в своём контуре Нужен S3-совместимый протокол: S5W говорит на своём REST API
Один сервер справляется с объёмом и нагрузкой Нужна репликация и работа на нескольких узлах: S5W — один контейнер на одном томе
Важна простота: одна команда запуска, без отдельной базы Нужна обработка видео: S5W обрабатывает только картинки
Файлы от килобайт до гигабайт, загрузка частями Объём данных больше, чем вмещает диск одного сервера

Отказоустойчивость

S5W работает на одном сервере. Защита от потери данных — резервное копирование тома (см. эксплуатацию), а время восстановления — это время развернуть контейнер на копии тома.

Ограничения в цифрах

Что Предел
Файл одним запросом POST /v1/files до 32 МиБ
Файл загрузкой частями без отдельного предела — до квоты бакета и места на диске
Часть при загрузке частями 4–16 МиБ
Незавершённая загрузка частями живёт 24 часа с последней части
Временная ссылка срок до 30 дней, до 1000 скачиваний
Картинка для обработки до 25 мегапикселей
Срок хранения в папке от суток до года, или бессрочно
Квота бакета по умолчанию 100 МиБ, меняется в панели

С чего начать