Pterohost docs

FastDL для Garry's Mod в 2026: настройка быстрой загрузки контента

Полное руководство по настройке FastDL для сервера Garry's Mod в 2026: nginx-конфиг, сжатие .bz2, sv_downloadurl, Cloudflare CDN, типичные ошибки.

Кратко: FastDL ускоряет загрузку контента в Garry’s Mod с 20 КБ/с (через игровой порт) до 5-50 МБ/с (через HTTP-сервер) - подключение нового игрока сокращается с 5-10 минут до 30-60 секунд. Для настройки нужен отдельный веб-сервер (nginx/apache), сжатые .bz2-файлы и две строки в server.cfg.

FastDL - обязательная инфраструктура для любого публичного Garry’s Mod сервера с кастомным контентом. Без неё игроки уходят на этапе загрузки карты, а сервер теряет онлайн. В этом гайде - полная настройка с нуля: HTTP-сервер на nginx, генерация .bz2, конфигурация Lua-ресурсов, подключение Cloudflare и диагностика типичных ошибок в 2026 году.

Что такое FastDL и зачем он нужен?

FastDL (Fast Download) - это механизм Source Engine для скачивания клиентского контента с внешнего HTTP-сервера, минуя медленный игровой канал. Стандартный download через игровой порт ограничен значением sv_downloadurl_disabled и работает на скорости около 20 КБ/с - карта в 100 МБ скачивается 80+ минут. FastDL раздаёт те же файлы через обычный nginx/apache на скорости канала - те же 100 МБ скачаются за 10-30 секунд.

Без FastDL сервер с DarkRP-сборкой (300-800 МБ контента) теряет 70-90% подключающихся игроков. С FastDL цифра падает до 5-15%, а CCU (concurrent users) растёт в 2-5 раз. Это критичный пункт инфраструктуры наравне с защитой от DDoS и резервными копиями.

Pterohost - игровой хостинг с DDoS-защитой L4+L7, NVMe SSD и круглосуточной поддержкой. Промокод 4START даёт -20% на первый заказ. Заказать сервер Garry’s Mod

Какие требования у FastDL?

Для запуска FastDL нужен отдельный HTTP-сервер, доступный по публичному IP или домену. Это может быть как тот же сервер, где стоит Garry’s Mod (на отдельном порту 80/443), так и внешний VPS, виртуальный хостинг или CDN. Полный список требований:

  • Веб-сервер: nginx, apache, lighttpd или Caddy. Рекомендуется nginx как самый лёгкий.
  • Дисковое пространство: 1.5-2x от размера контента сервера (оригиналы плюс .bz2).
  • Канал: минимум 100 Мбит/с symmetric, для 50+ игроков - 1 Гбит/с.
  • Утилита bzip2: для сжатия файлов (apt install bzip2 на Debian/Ubuntu).
  • Домен или поддомен: например fastdl.myserver.com - удобнее, чем сырой IP.
  • HTTPS-сертификат: с 2024 года клиенты GMod корректно работают с HTTPS, рекомендуется Let’s Encrypt.

Какая файловая структура нужна для FastDL?

FastDL раздаёт контент по тем же относительным путям, что и сервер Garry’s Mod. Корневая директория веб-сервера должна повторять структуру garrysmod/. Список папок, которые попадают на FastDL:

ПапкаСодержимоеСжимать в .bz2
maps/Файлы карт .bsp, .nav, .ainДа
materials/Текстуры .vmt, .vtf, .pngДа
models/Модели .mdl, .vvd, .vtx, .phyДа
sound/Звуки .wav, .mp3, .oggДа
particles/Партиклы .pcfДа
resource/Шрифты .ttf, локализацииДа
lua/Не нужно (передаётся через игру)Нет
addons/Не нужно (только содержимое addons)Нет

Lua-файлы и meta-данные аддонов передаются через игровое соединение и не идут на FastDL. На веб-сервер кладётся только то, что нужно для отрисовки контента у клиента.

Как генерировать .bz2-файлы?

Сжатие в bzip2 уменьшает размер передачи на 40-70%. Клиент Garry’s Mod сначала проверяет существование файла materials/example.vmt.bz2, и если он есть - скачивает архив, распаковывает локально и сохраняет как materials/example.vmt. Команда сжатия одного файла:

bzip2 -k materials/example.vmt
# создаст materials/example.vmt.bz2, оригинал останется (-k = keep)

Массовое сжатие всех файлов на FastDL-сервере одной командой:

cd /var/www/fastdl/garrysmod
find maps materials models sound particles resource \
  -type f \
  ! -name '*.bz2' \
  -exec bzip2 -k -9 {} \;

Флаг -9 - максимальное сжатие (медленнее, но эффективнее). Для регулярного обновления удобно завернуть в скрипт update-fastdl.sh и запускать после каждой синхронизации контента.

Как настроить resource.AddFile?

Функция resource.AddFile() сообщает клиенту, что файл нужно скачать перед заходом на сервер. Вызывается в серверном Lua, обычно в garrysmod/lua/autorun/server/resources.lua. Базовый пример для одной карты:

-- garrysmod/lua/autorun/server/resources.lua
resource.AddFile("maps/gm_construct_v2.bsp")
resource.AddFile("materials/myaddon/logo.vmt")
resource.AddFile("materials/myaddon/logo.vtf")
resource.AddFile("models/myaddon/prop.mdl")
resource.AddFile("models/myaddon/prop.vvd")
resource.AddFile("models/myaddon/prop.vtx")
resource.AddFile("models/myaddon/prop.phy")
resource.AddFile("sound/myaddon/notify.wav")

Для Workshop-аддонов используется resource.AddWorkshop() - клиент получит контент с Steam Workshop вместо FastDL:

resource.AddWorkshop("123456789")  -- ID воркшоп-коллекции или аддона
resource.AddWorkshop("987654321")

Авто-генерация списка для всех файлов в директории:

cd /path/to/garrysmod
find maps -name '*.bsp' -printf 'resource.AddFile("maps/%f")\n' > resources.lua
find models -name '*.mdl' -printf 'resource.AddFile("models/%P")\n' >> resources.lua
# повторить для materials, sound, particles

Как настроить server.cfg для FastDL?

В garrysmod/cfg/server.cfg нужно прописать три ключевых параметра. Без них FastDL не активируется, даже если HTTP-сервер настроен правильно:

// URL FastDL без слэша в конце
sv_downloadurl "https://fastdl.example.com/garrysmod"

// Разрешить клиентам скачивать контент с FastDL
sv_allowdownload 1

// Разрешить серверу отдавать контент (можно отключить, если весь трафик идёт через FastDL)
sv_allowupload 0

// Максимальный размер файла, передаваемого по FastDL (МБ)
net_maxfilesize 64

Параметр sv_downloadurl - корень FastDL без слэша. То есть если карта лежит по адресу https://fastdl.example.com/garrysmod/maps/gm_construct.bsp, в server.cfg указывается https://fastdl.example.com/garrysmod (без /maps).

Какой nginx-конфиг использовать для FastDL?

nginx раздаёт статику в десятки раз быстрее, чем apache, и потребляет в 5-10 раз меньше памяти. Базовый конфиг для FastDL-домена fastdl.example.com:

server {
    listen 80;
    listen [::]:80;
    server_name fastdl.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name fastdl.example.com;

    ssl_certificate     /etc/letsencrypt/live/fastdl.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/fastdl.example.com/privkey.pem;

    root /var/www/fastdl;
    autoindex off;
    server_tokens off;

    # CORS для клиентов GMod
    add_header 'Access-Control-Allow-Origin' '*' always;

    # Корректные MIME-типы
    types {
        application/x-bzip2 bz2;
        application/octet-stream bsp mdl vvd vtx phy vmt vtf pcf wav mp3 ogg ttf;
        text/plain nav ain;
    }

    # Кэширование на стороне клиента
    location / {
        expires 30d;
        add_header Cache-Control "public, immutable";
        try_files $uri =404;
    }

    # Запрет доступа к скрытым файлам
    location ~ /\. {
        deny all;
    }
}

После создания конфига - проверка и перезапуск:

nginx -t && systemctl reload nginx

Как подключить Cloudflare как CDN?

Cloudflare даёт бесплатный CDN с edge-нодами в 300+ городах мира, что критично для серверов с международной аудиторией. Пошаговая настройка:

  1. Зарегистрировать домен в Cloudflare и навести NS на их серверы.
  2. Создать A-запись fastdl.example.com -> IP вашего HTTP-сервера, включить proxy (оранжевая иконка).
  3. SSL/TLS -> Full (Strict) - использовать ваш Let’s Encrypt-сертификат.
  4. Caching -> Configuration -> Browser Cache TTL: 1 month.
  5. Rules -> Page Rules: для fastdl.example.com/* выставить Cache Level: Cache Everything, Edge Cache TTL: 1 month.

После активации 80-95% запросов будут отдаваться с edge-нод Cloudflare, а нагрузка на ваш HTTP-сервер упадёт до фоновой. Проверить, что контент кэшируется:

curl -I https://fastdl.example.com/garrysmod/maps/gm_construct.bsp.bz2
# В ответе должен быть заголовок CF-Cache-Status: HIT

Как диагностировать проблемы FastDL?

Если игрок не может скачать контент - в 90% случаев причина видна в его клиентской консоли. Включите подробный лог: developer 1 и попробуйте зайти на сервер - в консоли пойдёт строка вида:

Downloading https://fastdl.example.com/garrysmod/maps/gm_construct.bsp.bz2
Error: HTTP 404 - file not found

Чек-лист диагностики:

  1. Открыть URL вручную в браузере. Если 404 - файл не залит на FastDL.
  2. Проверить MIME-тип: curl -I должен вернуть Content-Type (не text/html).
  3. Проверить регистр имён: Linux чувствителен к регистру, gm_Construct.bsp != gm_construct.bsp.
  4. Проверить .bz2: если игроки качают медленно - возможно, .bz2 отсутствуют и идёт несжатая передача.
  5. Проверить CORS: добавить Access-Control-Allow-Origin: * в nginx (см. конфиг выше).
  6. Проверить sv_downloadurl: без слэша в конце, со схемой https://.
  7. Проверить net_maxfilesize: для файлов больше 16 МБ нужно 64.

Логи nginx показывают, какие файлы запрашиваются клиентами:

tail -f /var/log/nginx/access.log | grep fastdl

Какие типичные ошибки совершают админы GMod?

Самая частая ошибка - забыть про сжатие .bz2 на больших картах. Карта 80 МБ без сжатия качается на 3G-канале клиента 5-7 минут, а с .bz2 - около минуты. Вторая по частоте - неправильный путь в sv_downloadurl (со слэшем в конце или с подкаталогом garrysmod/garrysmod/). Третья - забыть resource.AddFile() для кастомных моделей: файл лежит на FastDL, но клиент не знает, что его надо скачать, и видит ERROR-модель.

Реже встречаются:

  • Сжатые .bz2 без оригиналов (тогда клиент думает, что файла нет вообще).
  • HTTP/2 ошибки на устаревшем nginx - обновить до 1.18+.
  • Неправильный chmod на FastDL-папке: nginx не может читать файлы. Решение: chmod -R 755 /var/www/fastdl && chown -R www-data:www-data /var/www/fastdl.
  • Cloudflare кэширует ошибку 404 на сутки. Если файл залит позже - сделать Purge Cache.

Сколько ресурсов потребляет FastDL?

Для типичного сервера на 32 игрока с DarkRP-сборкой (400-600 МБ контента) FastDL потребляет:

  • Диск: 800-1200 МБ (оригиналы плюс .bz2).
  • RAM: 30-50 МБ (nginx с дефолтными настройками).
  • CPU: фоновый, пиковые 1-2% на 10 одновременных загрузок.
  • Трафик: 10-25 ГБ/сутки при 100-200 заходах в день.

С Cloudflare трафик с вашего HTTP-сервера падает до 1-3 ГБ/сутки, что укладывается в любой бюджет хостинга. Для крупных проектов (5+ серверов одной сети) удобно вынести FastDL на отдельный VPS со 100 Гбайт NVMe и 1 Гбит/с каналом - такая инфраструктура стоит 5-10 евро/месяц и обслуживает онлайн в 500+ игроков.

Связанные материалы

Перед настройкой FastDL имеет смысл подготовить базу сервера: настройка DarkRP-сервера в Garry’s Mod и админ-панель ULX для модерации. Если контент уже лагает из-за тяжёлых аддонов - помогает удаление лишнего контента из Workshop.

Pterohost - игровой хостинг с DDoS-защитой L4+L7, NVMe SSD и круглосуточной поддержкой. Промокод 4START даёт -20% на первый заказ. Заказать сервер Garry’s Mod

FAQ: частые вопросы по FastDL

Можно ли использовать FastDL без HTTPS? Технически да - sv_downloadurl поддерживает HTTP. Но в 2026 году все актуальные браузеры и многие firewalls блокируют mixed content, а Cloudflare принудительно редиректит на HTTPS. Используйте Let’s Encrypt - сертификат бесплатный, обновляется автоматически.

Где хранить FastDL - на том же сервере или на отдельном? Для проекта до 32 игроков и 500 МБ контента - на том же сервере, на nginx с портом 80/443. Для крупных проектов или сети из 3+ серверов - отдельный VPS с 1 Гбит/с каналом и Cloudflare сверху.

Нужен ли FastDL, если используется только Workshop? Если весь контент сервера лежит в Steam Workshop и подключается через resource.AddWorkshop() - FastDL не обязателен. Но кастомные карты, серверные модели и звуки, не загруженные в Workshop, всё равно требуют FastDL.

Как обновить контент на FastDL без даунтайма? rsync с FastDL-сервера: rsync -avz --delete /opt/gmod/garrysmod/maps/ /var/www/fastdl/garrysmod/maps/, потом запустить сжатие новых файлов. Старые .bz2 удалить, если оригинал изменился. Cloudflare-кэш сбросить через Purge Everything или по URL.

Может ли FastDL раздавать аддоны напрямую (.gma)? Нет, FastDL работает только с распакованным контентом по стандартной структуре maps/, materials/, models/. Файлы .gma передаются через игровое соединение или через Steam Workshop. Чтобы раздать аддон через FastDL, его нужно распаковать: gmad.exe extract -file myaddon.gma -out /var/www/fastdl/garrysmod/.