MAATRIX / Блог / SonarQube на Ubuntu 24.04: пошаговая установка

SonarQube на Ubuntu 24.04: пошаговая установка

MAATRIX

Код без статического анализа копит технический долг незаметно: багу находит не линтер, а пользователь в проде. SonarQube закрывает этот разрыв — разбирает код при каждом коммите, считает покрытие тестами, ловит дублирование и уязвимости, и не даёт мержить ветку, если качество просело. Ниже — установка Community-редакции на чистый Ubuntu 24.04 с нуля: от системных требований до подключения сканера в CI-пайплайн.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что нужно подготовить

SonarQube — не лёгкий сервис. Под капотом у него встроенный Elasticsearch для индексации результатов анализа, и это диктует требования к серверу заметно выше, чем у обычного веб-приложения.

Минимум для тестового стенда — 2 vCPU и 4 ГБ RAM, но это впритык: сервис будет стартовать медленно и тормозить на первом же крупном проекте. Для рабочего использования с несколькими проектами в анализе закладывайте от 8 ГБ RAM и 2-4 ядра — это ориентир, а не измеренная цифра, точная потребность зависит от размера кодовой базы и числа параллельных сканов.

Понадобится:

  • чистый Ubuntu 24.04 с root или sudo-доступом;
  • Java 17 — актуальные LTS-ветки SonarQube требуют именно эту версию (перед установкой сверьтесь с матрицей совместимости на официальном сайте — требования к JDK меняются от релиза к релизу);
  • PostgreSQL — единственная официально поддерживаемая внешняя СУБД для новых инсталляций SonarQube, MySQL и Oracle для self-managed версии больше не годятся;
  • отдельный непривилегированный пользователь ОС — SonarQube принципиально отказывается стартовать под root.

Если поднимаете сервер специально под это — держите в голове, что PostgreSQL, Java и сам SonarQube вместе с Elasticsearch съедят диск быстрее, чем кажется на старте: закладывайте от 20 ГБ под систему и логи анализов.

Java, PostgreSQL и системные лимиты

Начните с обновления системы и установки OpenJDK 17:

sudo apt update && sudo apt upgrade -y
sudo apt install -y openjdk-17-jdk unzip wget

java -version

В выводе должна быть ветка 17.x. Если в системе несколько версий JDK, переключите дефолтную через sudo update-alternatives --config java.

Дальше — PostgreSQL. Если сервер выделен только под SonarQube, проще поставить его из штатного репозитория Ubuntu:

sudo apt install -y postgresql postgresql-contrib
sudo systemctl enable --now postgresql

Создайте роль и базу под SonarQube:

sudo -u postgres psql <<'EOF'
CREATE USER sonarqube WITH ENCRYPTED PASSWORD 'замените_на_свой_пароль';
CREATE DATABASE sonarqube OWNER sonarqube;
GRANT ALL PRIVILEGES ON DATABASE sonarqube TO sonarqube;
EOF

Если планируете держать PostgreSQL отдельно и настроить его тщательнее — под тюнинг параметров и права есть отдельный разбор: как установить и настроить PostgreSQL на VPS.

Теперь системные лимиты. Embedded Elasticsearch у SonarQube требует повышенного vm.max_map_count и увеличенных ulimits — без этого сервис падает при старте с понятной ошибкой в логах. Задайте базовые значения:

echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
echo "fs.file-max=131072" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Если после первого запуска в sonarqube.log всё равно увидите жалобу на max virtual memory areas — конкретная версия попросит значение выше (в актуальных релизах Elasticsearch иногда требует 524288); поднимите vm.max_map_count до значения из текста ошибки той же командой.

Ulimits для будущего пользователя sonarqube:

sudo tee /etc/security/limits.d/99-sonarqube.conf <<'EOF'
sonarqube   -   nofile   131072
sonarqube   -   nproc    8192
EOF

Эти лимиты подхватятся при следующем логине пользователя, а при запуске через systemd мы зададим их ещё и в юните — так надёжнее.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Устанавливаем и настраиваем SonarQube

Создайте отдельного пользователя без права логина в шелл и каталог под установку:

sudo useradd -r -m -d /opt/sonarqube -s /bin/false sonarqube

Скачайте дистрибутив Community Edition с официального сайта SonarSource. Версии выходят регулярно, поэтому проверьте актуальный номер на странице загрузок перед тем, как подставлять его в команду:

cd /tmp
SONAR_VERSION="25.x.x.xxxxx"   # подставьте актуальную версию с sonarsource.com
wget "https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-${SONAR_VERSION}.zip"

sudo unzip "sonarqube-${SONAR_VERSION}.zip" -d /opt/
sudo mv "/opt/sonarqube-${SONAR_VERSION}"/* /opt/sonarqube/
sudo chown -R sonarqube:sonarqube /opt/sonarqube

Отредактируйте основной конфиг /opt/sonarqube/conf/sonar.properties — раскомментируйте и заполните блок подключения к базе, а веб-интерфейс на этом этапе разумнее оставить только на localhost:

sonar.jdbc.username=sonarqube
sonar.jdbc.password=замените_на_свой_пароль
sonar.jdbc.url=jdbc:postgresql://localhost:5432/sonarqube

sonar.web.host=127.0.0.1
sonar.web.port=9000

Наружу интерфейс отдадим позже через Nginx — открывать порт 9000 в интернет напрямую не стоит: там нет встроенной защиты от перебора паролей.

Автозапуск через systemd

Штатный скрипт sonar.sh для ручного запуска годится для проверки, но в проде нужен systemd-юнит с автозапуском и рестартом при падении. Создайте /etc/systemd/system/sonarqube.service:

[Unit]
Description=SonarQube service
After=syslog.target network.target postgresql.service

[Service]
Type=forking
ExecStart=/opt/sonarqube/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/bin/linux-x86-64/sonar.sh stop
User=sonarqube
Group=sonarqube
Restart=on-failure
LimitNOFILE=131072
LimitNPROC=8192

[Install]
WantedBy=multi-user.target

Включите и запустите сервис:

sudo systemctl daemon-reload
sudo systemctl enable --now sonarqube
sudo systemctl status sonarqube

Первый старт занимает минуту-две — SonarQube поднимает встроенный Elasticsearch и накатывает схему в PostgreSQL. Следите за логами:

sudo tail -f /opt/sonarqube/logs/sonar.log

Строка SonarQube is operational в es.log и web.log — сигнал, что можно идти в браузер. Проверьте локально:

curl -I http://127.0.0.1:9000

Ответ 200 OK означает, что веб-часть поднялась. Логин/пароль по умолчанию — admin / admin, при первом входе система сразу попросит сменить пароль.

Nginx как reverse proxy и SSL

Открывать порт 9000 наружу не нужно — поставьте перед SonarQube Nginx с доступом по домену и по HTTPS. Если раньше не настраивали reverse proxy на Ubuntu — есть отдельный пошаговый разбор: Nginx как reverse proxy на Ubuntu 24.04.

Конфиг для домена sonar.example.com:

server {
    listen 80;
    server_name sonar.example.com;

    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 300s;
    }
}

Активируйте конфиг и выпустите сертификат через certbot:

sudo ln -s /etc/nginx/sites-available/sonarqube /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

sudo certbot --nginx -d sonar.example.com

Таймаут proxy_read_timeout увеличен неслучайно — на больших проектах загрузка отчёта анализа в веб-интерфейсе может занимать заметное время, и дефолтные 60 секунд Nginx иногда обрывают запрос раньше, чем SonarQube успевает ответить.

Подключаем к CI-пайплайну

Сам сервер — это только приёмник результатов. Анализ конкретного проекта делает sonar-scanner, запущенный из CI на этапе сборки. На агенте (раннере) ставится CLI-сканер, а в корне репозитория — файл sonar-project.properties:

sonar.projectKey=my-project
sonar.projectName=My Project
sonar.sources=src
sonar.host.url=https://sonar.example.com
sonar.token=${SONAR_TOKEN}

Токен генерируется в веб-интерфейсе SonarQube — My Account → Security → Generate Token, и хранится в CI как секретная переменная, не в репозитории.

Для GitLab CI job выглядит примерно так:

sonarqube-check:
  stage: test
  image: sonarsource/sonar-scanner-cli:latest
  variables:
    SONAR_HOST_URL: "https://sonar.example.com"
  script:
    - sonar-scanner
  allow_failure: true

Если раннер ещё не настроен — есть отдельная статья про настройку GitLab CI/CD на VPS. Для Jenkins логика та же: плагин SonarQube Scanner добавляет шаг withSonarQubeEnv в Pipeline, а сам сервер SonarQube регистрируется один раз в Manage Jenkins → System — если Jenkins ещё не развёрнут, вот пошаговая установка Jenkins на Ubuntu 24.04.

allow_failure: true на старте пайплайна — осознанный выбор: сначала дайте команде накопить историю анализов и разобраться с существующим долгом, а Quality Gate, который реально блокирует мерж, включайте вторым шагом, когда база кода уже приведена в порядок хотя бы частично.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Сколько реально нужно RAM для SonarQube?

Для одного-двух небольших проектов хватает 4 ГБ, но это без запаса. Если анализируете несколько репозиториев параллельно или проекты крупные, закладывайте от 8 ГБ — Elasticsearch внутри SonarQube требователен к памяти, и при её нехватке сервис либо не стартует, либо анализ зависает.

Можно ли использовать MySQL вместо PostgreSQL?

Нет, для новых установок self-managed SonarQube поддерживает только PostgreSQL в качестве внешней СУБД. MySQL и Oracle убраны из списка поддерживаемых баз в актуальных версиях — миграция на PostgreSQL обязательна.

Почему SonarQube отказывается запускаться под root?

Это осознанное ограничение самого приложения — оно проверяет UID при старте и завершается с ошибкой, если процесс запущен от root. Причина — встроенный Elasticsearch, которому в принципе не рекомендуют работать с правами суперпользователя. Решение — отдельный системный пользователь, как в разделе про установку выше.

Нужен ли SonarQube отдельный сервер или можно на том же, где крутится GitLab или Jenkins?

Технически можно и на одном сервере, но embedded Elasticsearch конкурирует за память с любым другим тяжёлым процессом. На небольших командах это терпимо, на активной разработке лучше разносить SonarQube и CI-сервер по разным машинам — так проще и с лимитами памяти, и с диагностикой, если что-то тормозит.

Как обновить SonarQube без потери истории анализов?

Остановите сервис, сделайте бэкап базы PostgreSQL (pg_dump), разверните новую версию в тот же /opt/sonarqube поверх старой (с сохранением conf/sonar.properties и данных), запустите — SonarQube сам прогонит миграцию схемы базы при первом старте. Обновление сразу на несколько мажорных версий вперёд официально не поддерживается — читайте upgrade notes конкретного релиза.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →