Если headless-браузер на VPS рендерит страницы с «квадратами» вместо кириллицы, а сгенерированные PDF-отчёты выглядят как набор пустых прямоугольников — причина почти всегда одна: на сервере просто не установлены шрифты. Минимальные образы Ubuntu, Debian и CentOS, которые выдают хостинг-провайдеры, не содержат ни одного гарнитурного файла, потому что «чистому» серверу они не нужны — до тех пор, пока вы не запустите Puppeteer, wkhtmltopdf, LibreOffice или генерацию изображений через ImageMagick.
В этой статье разберём, как устроена шрифтовая подсистема Linux, какие пакеты ставить на VPS под разные задачи, как обновить кэш fontconfig и проверить, что шрифты реально видны приложениям. Все команды приведены для популярных дистрибутивов и не требуют графического окружения.
Зачем вообще нужны шрифты на сервере без монитора
Распространённое заблуждение: раз на VPS нет дисплея, то и шрифты не нужны. На практике рендеринг текста происходит в десятках сценариев, где участвует не экран, а растровый движок. Вот типовые случаи, когда отсутствие шрифтов ломает работу:
- 🖨️ Генерация PDF из HTML через wkhtmltopdf, WeasyPrint или headless Chrome — текст превращается в «тофу» (пустые квадраты).
- 🖼️ Создание изображений с текстом через ImageMagick, GD в PHP или Pillow в Python — подписи не отрисовываются.
- 🤖 Скриншоты сайтов и автотесты через Puppeteer или Playwright — снапшоты отличаются от локальных, падают визуальные тесты.
- 📄 Конвертация документов через LibreOffice в headless-режиме — вёрстка «плывёт», потому что подставляются случайные метрики.
- 🌐 Веб-сервер, отдающий шрифты клиентам, — файлы должны лежать в правильных каталогах с корректными MIME-типами.
Ключевой момент: шрифт нужен не «серверу», а библиотеке рендеринга — FreeType, Pango или встроенному движку приложения. Если приложение не находит ни одного подходящего начертания, оно либо молча рисует заглушки, либо падает с ошибкой вида fontconfig error: Cannot load default config file.
Как устроена шрифтовая подсистема Linux
За поиск и подбор шрифтов на Linux отвечает библиотека fontconfig. Она сканирует каталоги со шрифтами, строит кэш и по запросу приложения подбирает ближайшее начертание по семейству, весу и языку. Сами файлы обычно лежат в трёх местах:
- 📁 /usr/share/fonts/ — системные шрифты, установленные пакетным менеджером;
- 📁 /usr/local/share/fonts/ — шрифты, добавленные администратором вручную для всех пользователей;
- 📁 ~/.local/share/fonts/ или ~/.fonts/ — шрифты конкретного пользователя, не требующие root.
Конфигурация fontconfig хранится в /etc/fonts/fonts.conf и подключаемых файлах из /etc/fonts/conf.d/. Там же задаются правила подстановки: например, каким шрифтом заменять запрошенный Arial, если его нет в системе. Именно эти правила объясняют, почему на одном сервере PDF выглядит нормально, а на другом — с «поехавшей» вёрсткой: подставленный шрифт имеет другие метрики.
💡Шрифты на VPS нужны не для экрана, а для библиотек рендеринга. Если приложение рисует текст (PDF, картинки, скриншоты) — без установленных шрифтов и собранного кэша fontconfig оно выдаст «квадраты».