Как собрать userver без Docker на Ubuntu: пошаговая инструкция

Собрать и запустить C++ фреймворк userver от Яндекса без Docker на Ubuntu — вполне реальная задача, которая требует лишь аккуратной установки зависимостей и терпения при первой компиляции. В этой статье мы подробно разберём весь процесс: от установки системных пакетов до сборки проекта, а также расс

Как собрать userver без Docker на Ubuntu: пошаговая инструкция

Собрать и запустить C++ фреймворк userver от Яндекса без Docker на Ubuntu — вполне реальная задача, которая требует лишь аккуратной установки зависимостей и терпения при первой компиляции. В этой статье мы подробно разберём весь процесс: от установки системных пакетов до сборки проекта, а также рассмотрим типичные проблемы и пути их решения.

Установка зависимостей

Первый шаг — установка всех необходимых пакетов. В официальной документации userver рекомендуется набор зависимостей, включающий компилятор, утилиты сборки и библиотеки для работы с асинхронностью, сетью и логированием. Выполните следующие команды в терминале:

bash sudo apt update sudo apt install -y \ build-essential \ ccache \ cmake \ git \ libboost-dev \ libboost-program-options-dev \ libboost-filesystem-dev \ libboost-iostreams-dev \ libboost-coroutine-dev \ libboost-context-dev \ libboost-regex-dev \ libboost-locale-dev \ libboost-thread-dev \ libboost-chrono-dev \ libboost-date-time-dev \ libboost-atomic-dev \ libboost-container-dev \ libc-ares-dev \ libkrb5-dev \ libldap2-dev \ libnghttp2-dev \ libssl-dev \ libyaml-cpp-dev \ libfmt-dev \ libspdlog-dev \ ninja-build \ python3-dev \ python3-jinja2 \ zlib1g-dev

Этот набор покрывает основные потребности userver. Если ваш сервис использует PostgreSQL, Redis, MongoDB или ClickHouse, дополнительно установите соответствующие клиентские библиотеки: libpq-dev, libhiredis-dev, libmongoc-dev и другие. Они не требуются для сборки ядра фреймворка, но понадобятся при компиляции сервиса, который взаимодействует с этими СУБД.

Какие проблемы могут возникнуть при установке зависимостей?

Даже при точном следовании инструкции можно столкнуться с несовместимостью версий. Например, в Ubuntu 22.04 пакет libfmt-dev имеет версию 8.x, а userver требует 9.x. В таком случае придётся установить libfmt вручную из исходников или подключить PPA. Аналогичная ситуация с spdlog, который зависит от fmt. Также в старых версиях Ubuntu может отсутствовать libc-ares-dev — его можно заменить на libc-ares2 или собрать из исходников. Если ninja-build не найден, используйте make, но сборка будет медленнее.

Клонирование репозитория и сборка

После установки зависимостей клонируйте репозиторий userver:

bash git clone https://github.com/userver-framework/userver.git cd userver

Сборка выполняется с помощью CMake и Ninja. Рекомендуется создать отдельную директорию для сборки:

bash mkdir buildrelease && cd buildrelease cmake -DCMAKEBUILDTYPE=Release -G Ninja .. ninja

Первая компиляция может занять от 15 до 30 минут в зависимости от мощности процессора. Чтобы ускорить последующие сборки, используйте ccache, который уже включён в список зависимостей. Если вы предпочитаете отладочную сборку, замените Release на Debug — это замедлит выполнение, но упростит поиск ошибок.

Предыстория и контекст

userver — это фреймворк с открытым исходным кодом, разработанный в Яндексе для создания высоконагруженных микросервисов на C++. Он активно используется внутри компании для таких сервисов, как Яндекс.Такси, Яндекс.Еда и других, где требуется высокая производительность и надёжность. Изначально userver был доступен только в составе внутренней инфраструктуры, но в 2022 году его исходный код опубликовали на GitHub.

Официальная документация рекомендует Docker для быстрого старта, так как это избавляет от проблем с зависимостями и версиями библиотек. Однако многие разработчики предпочитают нативную сборку, особенно если они работают на чистой системе или в окружении с ограниченными правами. Кроме того, нативная сборка даёт больше контроля над флагами компиляции и позволяет проще интегрировать userver в существующий CI/CD пайплайн.

Технические подробности: что входит в зависимости

Рассмотрим ключевые зависимости подробнее. Boost — одна из самых важных: userver активно использует Boost.Coroutine и Boost.Context для реализации асинхронности. Без этих библиотек фреймворк работать не будет. OpenSSL необходим для HTTPS и WebSocket, а c-ares — для DNS-запросов без блокировки. yaml-cpp нужен для парсинга конфигурационных файлов, fmt и spdlog — для логирования.

Если ваш сервис использует PostgreSQL, Redis, MongoDB или ClickHouse, потребуются соответствующие клиентские библиотеки: libpq-dev, libhiredis-dev, libmongoc-dev и т.д. Они устанавливаются отдельно по необходимости. Интересно, что userver не требует установки самой СУБД на сборочной машине — достаточно клиентских библиотек для компиляции. Это удобно, если вы собираете контейнер для продакшена, но сам сервер базы данных развёрнут отдельно.

Кого затронет и как

Нативная сборка userver в первую очередь полезна разработчикам, которые работают в окружениях без Docker (например, на виртуальных машинах с ограничениями), хотят минимизировать размер итогового образа или использовать свой базовый образ, предпочитают полный контроль над процессом сборки или интегрируют userver в существующую инфраструктуру с CI/CD, где уже настроены не-Docker сборочные агенты.

Для российских разработчиков это особенно актуально, так как многие компании переходят на отечественные ОС или используют изолированные сети, где Docker Registry может быть недоступен. С другой стороны, новичкам, которые только знакомятся с userver, Docker всё же может быть проще: он гарантирует воспроизводимость окружения и избавляет от ручной установки зависимостей. Однако после первого успешного опыта с Docker стоит попробовать нативную сборку, чтобы глубже понять устройство фреймворка.

Что будет дальше

Сообщество userver активно развивается: появляются новые компоненты, улучшается документация. В будущем можно ожидать упрощения процесса нативной сборки — например, создания скрипта-помощника, который автоматически проверяет и устанавливает зависимости. Также возможно появление официальных пакетов для популярных дистрибутивов Linux, что устранит необходимость ручной установки библиотек.

Пока же лучший способ оставаться в курсе — следить за репозиторием userver на GitHub и официальным каналом в Telegram. Если вы столкнулись с проблемами при сборке, стоит заглянуть в раздел Issues или задать вопрос в сообществе — разработчики и пользователи обычно быстро помогают.

Итог

Нативная сборка userver на Ubuntu без Docker — вполне реальная задача, требующая лишь аккуратной установки зависимостей и терпения при первой компиляции. Этот подход даёт больше гибкости и контроля, особенно в условиях ограниченной инфраструктуры. Следуя приведённой инструкции, вы сможете успешно собрать свой первый сервис на userver и избежать типичных ошибок. Удачи в разработке!