Настройка VPS + S3 для видео-стриминга (Nginx + Redis Queue + FFmpeg)

Бюджет: по договоренности
Настроить отказоустойчивую систему хранения и раздачи видео.
Backend: Очередь конвертации видео (чтобы при загрузке 10 файлов сервер не падал).
Frontend: Раздача через Nginx с кэшированием (чтобы не платить за трафик S3).
Стек: Ubuntu 22.04/24.04, Nginx, Python (или Go/Bash), Redis, FFmpeg, S3 (Timeweb/Selectel).

Техническое задание (ТЗ)

1. Система обработки видео (Очередь)

Проблема: Если залить 10 видео одновременно, запуск 10 процессов FFmpeg "убьет" процессор и память VPS.

Решение: Реализовать последовательную обработку через очередь.

Инструменты: Redis (как брокер) + скрипт-воркер (Python/PHP/Go на выбор исполнителя).

Алгоритм работы:
Скрипт мониторит папку загрузки /uploads (через inotify или CRON) ИЛИ принимает веб-хук от сайта.
При появлении файла задача добавляется в Redis.

Воркер (Worker):
Берет из очереди строго 1 задачу за раз.
Сжимает видео через FFmpeg (H.264, CRF 23, moov atom в начале файла для веб-оптимизации).
Загружает результат в S3 бакет (через rclone, s3cmd или AWS SDK).После успеха удаляет исходник и локальную копию.

Опционально: 
Отправляет callback (HTTP запрос) на мой сайт: "Видео ID 123 готово, ссылка: ...".

2. Раздача контента (Nginx Proxy)
Настроить Nginx как кэширующий шлюз перед S3.

Модуль Slice (Важно!):
Включить ngx_http_slice_module. Разбивать запросы к S3 на куски по 1 МБ.
Сервер должен корректно обрабатывать HTTP Range Requests и отдавать контент с заголовком 206 Partial Content. Это необходимо, чтобы в плеере работала перемотка (seeking) в любую точку видео без предварительной загрузки всего файла

Кэширование:
Настроить proxy_cache на SSD диске.
Время жизни кэша (TTL): 30 дней (или пока не кончится место).
При повторном запросе того же куска — отдача с диска VPS (Hit), без запроса к S3.

Оптимизация:
Включить aio, sendfile, tcp_nodelay.

3. Защита ссылок (Secure Link)
Настроить модуль secure_link (MD5 + Expires).
Видео должно быть доступно только по подписанной ссылке с временным токеном.
Прямые ссылки на .mp4 должны отдавать 403 Forbidden.
Артефакт: Предоставить пример кода (PHP/Python) для генерации ссылки, который я вставлю к себе на сайт.
4. Безопасность сервера
Firewall (UFW): Разрешить только порты 80, 443, SSH.
SSH: Отключить вход по паролю, оставить только по ключам.
Fail2Ban: Настроить бан за перебор SSH и (опционально) за DOS-атаки на Nginx.
Опубликован 15.02.2026 в 01:41 Последнее изменение: 15.02.2026 в 07:47

Выберите способ верификации:

Обновите страницу после прохождения верификации.