Если 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 оно выдаст «квадраты».
Установка базовых шрифтов на Debian и Ubuntu
На минимальной установке сначала обновите индекс пакетов и поставьте сам fontconfig — иногда его тоже нет в образе:
sudo apt update
sudo apt install fontconfig
Далее ставьте наборы под задачу. Для полноценной поддержки кириллицы и латиницы обычно достаточно свободных семейств:
sudo apt install fonts-dejavu fonts-liberation fonts-noto
Здесь DejaVu — универсальный набор с широким покрытием Unicode, Liberation — метрически совместимые замены Arial, Times New Roman и Courier New, а Noto от Google покрывает огромное количество письменностей, включая CJK. Если сервер обслуживает пользователей с китайским, японским или корейским текстом, пакет fonts-noto-cjk практически обязателен — без него иероглифы не отрисуются нигде.
Пакет fonts-noto-color-emoji добавляет цветные эмодзи. Он нужен, если вы генерируете скриншоты соцсетей или мессенджеров — без него эмодзи будут чёрно-белыми контурами или квадратами.
После установки обновите кэш и убедитесь, что шрифты видны:
sudo fc-cache -fv
fc-list | grep -i dejavu
Команда fc-list выводит все найденные шрифты. Если список пуст — fontconfig не видит каталоги, и это повод проверить конфигурацию, а не переустанавливать пакеты.
Шрифты Microsoft и проприетарные гарнитуры
Многие шаблоны документов и сайтов жёстко привязаны к Arial, Times New Roman или Verdana. На Debian и Ubuntu существует пакет ttf-mscorefonts-installer, который загружает эти шрифты с серверов Microsoft — он доступен в репозитории contrib (для Debian) или multiverse (для Ubuntu), которые нужно предварительно подключить.
⚠️ Внимание: установщик Microsoft-шрифтов скачивает файлы извне и требует принятия лицензионного соглашения EULA. На автоматизированных серверах это делается через debconf-пресидинг, иначе установка зависнет в интерактивном диалоге. Проверяйте лицензионные условия при коммерческом использовании.
Альтернатива без лицензионных вопросов — упомянутые выше Liberation и Carlito с Caladea (метрические замены Calibri и Cambria). Метрическая совместимость означает, что текст займёт ровно столько же места, и вёрстка документа не разъедется.
| Пакет | Что заменяет | Кириллица | Лицензия |
|---|---|---|---|
| fonts-dejavu | Универсальный набор | Да | Свободная |
| fonts-liberation | Arial, Times New Roman, Courier New | Да | Свободная |
| fonts-crosextra-carlito | Calibri | Да | Свободная |
| fonts-noto / noto-cjk | Многоязычный охват, CJK | Да | SIL OFL |
| ttf-mscorefonts-installer | Оригинальные Arial, Times, Verdana | Да | Проприетарная EULA |
Установка своих TTF и OTF файлов вручную
Если нужен конкретный корпоративный или купленный шрифт, его можно поставить без пакетного менеджера. Порядок такой: скопируйте файлы .ttf или .otf в /usr/local/share/fonts/ (удобно создать подкаталог с именем семейства), выставьте читаемые права и пересоберите кэш:
sudo mkdir -p /usr/local/share/fonts/myfont
sudo cp MyFont-Regular.ttf /usr/local/share/fonts/myfont/
sudo chmod 644 /usr/local/share/fonts/myfont/*
sudo fc-cache -f
Проверка, что система увидела шрифт и правильно определила его имя:
fc-match "MyFont"
Команда fc-match показывает, какой именно файл будет подставлен при запросе данного семейства. Если fc-match возвращает другой шрифт, чем вы ожидаете — приложения будут использовать именно его, а не ваш файл. Это самая частая причина ситуации «шрифт установил, но ничего не изменилось».
☑️ Проверка после установки шрифта
Шрифты для headless Chrome, Puppeteer и генерации PDF
Отдельная боль — Docker-контейнеры и VPS с headless-браузерами. Базовые образы вроде node:slim или python:slim не содержат ни шрифтов, ни fontconfig, поэтому скриншоты и PDF получаются с «тофу» даже при корректном коде. Лечится добавлением пакетов на этапе сборки образа или provisioning сервера:
apt-get update && apt-get install -y fontconfig fonts-liberation fonts-noto fonts-noto-cjk && fc-cache -f
Для кириллических проектов минимально достаточно fonts-liberation и fonts-dejavu; для многоязычных — добавляйте Noto. Учитывайте, что полный набор Noto весит заметно: на маленьких VPS с ограниченным диском имеет смысл ставить только нужные подсемейства, например fonts-noto-core, а не метапакет целиком.
⚠️ Внимание: после установки шрифтов уже запущенные процессы (Chrome, PHP-FPM, LibreOffice) могут продолжать работать со старым состоянием. Перезапустите сервис или контейнер — «на лету» многие приложения новые шрифты не подхватывают.
Диагностика типичных проблем
Разберём симптомы, с которыми чаще всего сталкиваются администраторы VPS, и их вероятные причины:
- 🔲 Квадраты вместо текста — шрифтов нет вообще либо ни один не покрывает нужный диапазон Unicode (проверка:
fc-list :lang=ru). - 🔤 Текст есть, но шрифт «не тот» — fontconfig подставил замену; смотрите вывод
fc-match "ИмяСемейства". - 📉 Вёрстка PDF отличается от локальной — на сервере нет метрически совместимого шрифта; поставьте Liberation или оригинальные MS-шрифты.
- 🐢 Медленный первый запуск приложения — пересобирается кэш fontconfig; выполните
fc-cache -fзаранее при деплое.
Полезная диагностическая команда для проверки покрытия языка:
fc-list :lang=ru family | sort -u
Она покажет все семейства, заявляющие поддержку русского языка. Если вывод пуст — кириллица на сервере отображаться не будет, и это однозначный сигнал доустановить пакеты.
Почему в консоли SSH шрифты настраивать не нужно
Текст в SSH-сессии отрисовывает ваш локальный терминал, а не сервер. VPS передаёт только байты символов, а начертание букв определяется шрифтом, выбранным в настройках PuTTY, Windows Terminal или iTerm. Поэтому «установить шрифт в консоль сервера» — бессмысленная задача; менять шрифт нужно на клиенте.
Шрифты при раздаче через веб-сервер
Если VPS отдаёт шрифты клиентам сайта (форматы .woff, .woff2), убедитесь, что веб-сервер отправляет корректные заголовки. В Nginx MIME-типы обычно уже описаны в /etc/nginx/mime.types, но для кроссдоменной загрузки шрифтов браузеры требуют заголовок CORS — иначе шрифт молча не применится на стороннем домене. Проверить отдачу заголовков можно командой:
curl -I https://ваш-домен/fonts/font.woff2
Ищите в ответе Content-Type: font/woff2 и, при необходимости, Access-Control-Allow-Origin. Конкретный синтаксис настройки зависит от вашего веб-сервера и его версии — сверяйтесь с официальной документацией Nginx или Apache.
Храните веб-шрифты в формате WOFF2 — он сжат значительно лучше TTF, а поддержка во всех современных браузерах есть. TTF на сервере оставляйте для рендеринга (PDF, картинки), WOFF2 — для отдачи клиентам.
Часто задаваемые вопросы
Почему после установки шрифтов ничего не изменилось?
Три типовые причины: не выполнен fc-cache -f, приложение не перезапущено и продолжает использовать старое состояние, либо fontconfig подставляет другой шрифт — проверьте через fc-match, какой файл реально выбирается.
Какие шрифты минимально нужны для кириллицы на Ubuntu Server?
Обычно достаточно пакетов fonts-dejavu и fonts-liberation. Они покрывают русский и украинский алфавиты и подходят для PDF, скриншотов и генерации изображений.
Можно ли ставить шрифты без root-доступа?
Да. Поместите файлы в ~/.local/share/fonts/ и выполните fc-cache -f от своего пользователя. Шрифты будут доступны процессам, запущенным от этой учётной записи.
Сколько места занимают шрифты на диске VPS?
Базовые наборы вроде DejaVu и Liberation занимают десятки мегабайт. Тяжёлым является полный метапакет Noto с CJK — на VPS с маленьким диском ставьте только нужные подсемейства.
Нужно ли настраивать шрифты для SSH-терминала?
Нет. Отображение текста в SSH-сессии определяется шрифтом вашего локального терминального клиента. Сервер передаёт только символы, а не их начертание.