На видеохостинге заказчика каждое загруженное видео кодируется в целую линейку качеств (h264 и h265, от 240p до 1440p, плюс добавленный по ходу проекта тир 8K/4320p). На процессоре это занимало часы: длинный ролик надолго занимал очередь, пользователи ждали.
В сервере стояла видеокарта NVIDIA RTX с аппаратным кодировщиком NVENC, но платформа (open-source, Python/Django + Celery + ffmpeg в Docker) умела кодировать только на CPU. Задача: задействовать GPU, не рискуя рабочим кодированием — сайт живой, ломать очередь загрузок нельзя.
1. Поставил в образ второй, статически собранный ffmpeg с поддержкой NVENC — рядом со штатным, ничего не заменяя.
2. Включение GPU сделал через фиче-флаг (переменная окружения): по умолчанию выключено, штатный CPU-путь не тронут вообще. Включение и откат — одна переменная.
3. При включённом флаге генератор команд кодирования выбирает h264_nvenc / hevc_nvenc; VP9 честно остаётся на CPU (у NVENC его нет).
4. Подобрал версию ffmpeg под версию драйвера видеокарты: свежий билд требовал более нового NVENC API и падал — зафиксировал совместимый релиз и проверил реальным кодированием на целевом железе, а не «по документации».
5. Отдельно тюнил качество (CQ/preset), чтобы картинка с GPU не уступала CPU-варианту.
6. Ограничение одновременных кодирований синхронизировал с интерфейсом загрузки — пользователь видит честную очередь, а не молча потерянные файлы.
7. Та же дисциплина «не сломать прод» — во всей инфраструктуре проекта: стабильный SSH-доступ к серверу за NAT через обратный туннель на VPS-релей (разобрался в причинах обрывов — потери на маршруте VPN и антибот-баны sshd — и устранил обе), деплой идемпотентными патч-скриптами с точными проверяемыми заменами, версия статики как сброс кеша, git-коммит после каждой правки на сервере и полный бэкап истории репозитория.
Стек: ffmpeg (NVENC), Python/Django, Celery, Docker, NVIDIA RTX.
Скорость кодирования на реальных роликах — около 9× реального времени: часовое видео обрабатывается за несколько минут вместо часов, очередь загрузок перестала копиться. Линейка качеств — вплоть до 8K (4320p).
Главное для заказчика: переход на GPU не создал риска для работающего сайта — штатный путь кодирования остался нетронутым, GPU включается и выключается одной переменной окружения.
Сайт живой, можно посмотреть: https://sawonce.com