Installare SonarQube su Rocky Linux
Questa guida spiega come installare e configurare SonarQube su un server Rocky Linux 9. SonarQube è una piattaforma open source per l'analisi statica del codice: rileva bug, code smell e vulnerabilità di sicurezza, supporta molti linguaggi e automatizza le revisioni del codice per mantenere un'alta qualità. SonarQube è basato su Java e può essere distribuito su diverse distribuzioni Linux (incluso Rocky Linux) o in container (Docker, Kubernetes).
Il deployment descritto qui utilizza OpenJDK 17, PostgreSQL come database, Apache come reverse proxy e Let's Encrypt per HTTPS.
Ordina un server
Per ospitare la tua istanza SonarQube, HostMyServers propone diverse offerte adatte:
- VPS Performance - Ideale per piccoli progetti
- VPS NVMe - Ottimo rapporto qualità/prezzo
- Server Dedicati Eco - Per molti progetti o analisi pesanti
- Server Dedicati Performance - Prestazioni massime
Prerequisiti
- Accesso SSH root o utente con sudo
- Sistema Rocky Linux 9 a 64 bit
- Almeno 4 GB di RAM (SonarQube ed Elasticsearch sono avidi di memoria)
- Un nome di dominio (es.
sonarqube.tuodominio.com) con record A che punta all'IP del server - Porte 80 (HTTP) e 443 (HTTPS) accessibili
Configurazione richiesta
| Componente | Minimo | Consigliato |
|---|---|---|
| RAM | 4 GB | 8 GB |
| CPU | 2 core | 4 core |
| Storage | 10 GB | 20 GB |
| Rete | 100 Mbps | 1 Gbps |
SonarQube è in ascolto sulla porta 9000 in locale. Apache fa da reverse proxy verso questa porta; l'accesso pubblico è in HTTP/HTTPS su 80/443.
Connessione al server
Connettiti via SSH al server Rocky Linux:
ssh utente@indirizzo_ip_server
Aggiornamento del sistema
Aggiorna i pacchetti prima di iniziare:
sudo dnf update -y
Installazione di OpenJDK 17
SonarQube richiede una JRE/JDK. La versione LTA (long-term active) 2025 di SonarQube richiede Java 17 o 21. Utilizziamo OpenJDK 17.
sudo dnf install -y java-17-openjdk java-17-openjdk-devel
Verifica la versione installata:
java -version
Dovresti vedere una riga del tipo: openjdk version "17.x.x". Se è attiva una versione più vecchia, seleziona Java 17 con: sudo alternatives --config java.
Creazione dell'utente SonarQube
SonarQube utilizza Elasticsearch per la ricerca e l'indicizzazione; deve essere eseguito da un utente non root. Crea un utente di sistema dedicato:
sudo useradd --system sonarqube
Database PostgreSQL per SonarQube
SonarQube supporta diversi motori di database. Utilizziamo PostgreSQL.
Installare e inizializzare PostgreSQL
sudo dnf install -y postgresql-server postgresql-contrib
sudo postgresql-setup --initdb
sudo systemctl enable postgresql
sudo systemctl start postgresql
Creare il database e l'utente
Connettiti a PostgreSQL con l'utente postgres:
sudo -i -u postgres psql
Nella console PostgreSQL, esegui (sostituisci TUA_PASSWORD con una password robusta):
\password postgres
CREATE DATABASE sonardb;
CREATE USER sonaruser WITH ENCRYPTED PASSWORD 'TUA_PASSWORD';
GRANT ALL PRIVILEGES ON DATABASE sonardb TO sonaruser;
\q
Abilitare l'autenticazione con password (pg_hba.conf)
Modifica il file di configurazione dell'autenticazione:
sudo nano /var/lib/pgsql/data/pg_hba.conf
Per le connessioni locali e TCP, usa trust per "local" e md5 per "host" (es. 127.0.0.1/32 e ::1/128). Esempio:
# TYPE DATABASE USER ADDRESS METHOD
local all all trust
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
Riavvia PostgreSQL:
sudo systemctl restart postgresql
Installazione di SonarQube
SonarQube non è fornito nei repository DNF predefiniti. Scarica l'archivio dal sito ufficiale.
Scaricare ed estrarre SonarQube
Consulta la pagina dei download SonarQube per l'ultima versione LTA. Esempio con la versione 25.x (adatta URL e nome della cartella se necessario):
sudo dnf install -y unzip
sudo mkdir -p /opt/sonarqube
cd /tmp
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-25.1.0.102122.zip
unzip sonarqube-25.1.0.102122.zip
sudo mv sonarqube-25.1.0.102122/* /opt/sonarqube
Sostituisci sonarqube-25.1.0.102122 con il nome esatto della cartella estratta corrispondente alla versione che hai scaricato.
Installare SonarScanner CLI (opzionale ma utile)
SonarScanner permette di analizzare progetti dalla riga di comando. Scarica l'ultima versione da SonarScanner CLI.
sudo mkdir -p /opt/sonarscanner
cd /tmp
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-7.0.2.4839-linux-x64.zip
unzip sonar-scanner-cli-7.0.2.4839-linux-x64.zip
sudo mv sonar-scanner-7.0.2.4839-linux-x64/* /opt/sonarscanner
Configura l'URL del server SonarQube (per le analisi in locale):
sudo nano /opt/sonarscanner/conf/sonar-scanner.properties
Aggiungi o modifica: sonar.host.url=http://127.0.0.1
Rendi l'eseguibile disponibile ovunque:
sudo chmod +x /opt/sonarscanner/bin/sonar-scanner
sudo ln -sf /opt/sonarscanner/bin/sonar-scanner /usr/local/bin/sonar-scanner
Verifica: sonar-scanner -v
Configurazione di SonarQube
File sonar.properties
Modifica la configurazione principale di SonarQube:
sudo nano /opt/sonarqube/conf/sonar.properties
Alla fine del file, aggiungi (sostituisci TUA_PASSWORD con la password dell'utente PostgreSQL sonaruser):
sonar.jdbc.username=sonaruser
sonar.jdbc.password=TUA_PASSWORD
sonar.jdbc.url=jdbc:postgresql://localhost/sonardb
sonar.web.host=0.0.0.0
sonar.web.port=9000
sonar.web.javaOpts=-Xmx512m -Xms256m -XX:+HeapDumpOnOutOfMemoryError
sonar.search.javaOpts=-Xmx1g -Xms1g -XX:MaxDirectMemorySize=512m -XX:+HeapDumpOnOutOfMemoryError
sonar.path.data=data
sonar.path.temp=temp
| Parametro | Descrizione |
|---|---|
sonar.jdbc.* | Connessione a PostgreSQL |
sonar.web.host | In ascolto su tutte le interfacce (0.0.0.0) |
sonar.web.port | Porta dell'interfaccia web (9000) |
sonar.web.javaOpts | Opzioni JVM per il server web |
sonar.search.javaOpts | Opzioni JVM per Elasticsearch (motore di ricerca) |
sonar.path.data / sonar.path.temp | Directory dati e temporanee |
Permessi e limiti di sistema
Assegna la proprietà della directory SonarQube all'utente sonarqube:
sudo chown -R sonarqube:sonarqube /opt/sonarqube
sudo chmod -R 775 /opt/sonarqube
SonarQube (Elasticsearch) richiede un limite più alto per le aree di memoria mappate. Aggiungi in /etc/sysctl.conf:
sudo nano /etc/sysctl.conf
Aggiungi alla fine:
vm.max_map_count=524288
fs.file-max=131072
Poi applica: sudo sysctl -p
Servizio systemd per SonarQube
SonarQube fornisce uno script di avvio in /opt/sonarqube/bin/linux-x86-64/sonar.sh. Crea un servizio systemd per utilizzarlo.
Contesto SELinux (Rocky Linux 9)
Su Rocky Linux, SELinux è attivo. Consenti l'esecuzione dello script:
sudo chcon -t bin_t /opt/sonarqube/bin/linux-x86-64/sonar.sh
sudo restorecon -Rv /opt/sonarqube
File di servizio
sudo nano /etc/systemd/system/sonarqube.service
Contenuto:
[Unit]
Description=SonarQube service
After=syslog.target network.target
[Service]
Type=forking
User=sonarqube
Group=sonarqube
PermissionsStartOnly=true
ExecStart=/opt/sonarqube/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/bin/linux-x86-64/sonar.sh stop
Restart=always
RestartSec=10
LimitNOFILE=131072
LimitNPROC=8192
SuccessExitStatus=143
TimeoutStartSec=300
[Install]
WantedBy=multi-user.target
Abilita e avvia il servizio:
sudo systemctl daemon-reload
sudo systemctl enable sonarqube
sudo systemctl start sonarqube
sudo systemctl status sonarqube
Lo stato deve indicare active (running). Il primo avvio può richiedere diversi minuti (inizializzazione di Elasticsearch e del database).
Reverse proxy Apache e HTTPS
L'interfaccia web SonarQube è disponibile sulla porta 9000 in locale. Per esporla in HTTP/HTTPS, utilizziamo Apache come reverse proxy.
Installare Apache
sudo dnf install -y httpd
sudo systemctl enable httpd
sudo systemctl start httpd
Verifica che i moduli proxy siano caricati: sudo httpd -M | grep proxy (proxy_module, proxy_http_module, proxy_balancer_module). Se necessario, decommenta le righe corrispondenti in /etc/httpd/conf/httpd.conf.
Virtual host per SonarQube
Crea un file di configurazione per il tuo dominio (sostituisci sonarqube.tuodominio.com con il tuo dominio):
sudo nano /etc/httpd/conf.d/sonarqube.conf
Contenuto:
<VirtualHost *:80>
ServerName sonarqube.tuodominio.com
ServerAdmin admin@tuodominio.com
ProxyPreserveHost On
ProxyPass / http://localhost:9000/
ProxyPassReverse / http://localhost:9000/
TransferLog /var/log/httpd/sonarqube_access.log
ErrorLog /var/log/httpd/sonarqube_error.log
</VirtualHost>
Testa la configurazione e riavvia Apache:
sudo apachectl configtest
sudo systemctl restart httpd
Consentire ad Apache di connettersi al backend (SELinux)
Per consentire ad Apache di fare proxy verso localhost:9000:
sudo setsebool -P httpd_can_network_connect 1
Firewall
Apri le porte HTTP e HTTPS:
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
Certificato TLS con Certbot (Let's Encrypt)
Per proteggere l'accesso in HTTPS:
sudo dnf install -y certbot python3-certbot-apache
sudo certbot --apache -d sonarqube.tuodominio.com -m tua-email@esempio.com --agree-tos
Certbot configura Apache per HTTPS e il rinnovo automatico dei certificati.
Accesso a SonarQube
- Apri un browser e vai a:
https://sonarqube.tuodominio.com - Accedi con le credenziali predefinite: admin / admin
- SonarQube ti chiederà di cambiare la password dell'amministratore; scegli una password robusta.
- Per le analisi (CI/CD o riga di comando), crea un utente o un token: Amministrazione → Sicurezza → Utenti → Crea utente, poi genera un token per quel conto.
Analizzare un progetto con SonarScanner
Per testare l'installazione, puoi analizzare un progetto di esempio:
cd ~
mkdir -p projects && cd projects
git clone https://github.com/SonarSource/sonar-scanning-examples
cd sonar-scanning-examples/sonar-scanner
Genera un token nell'interfaccia SonarQube (Amministrazione → Sicurezza → Utenti → Tokens), poi avvia l'analisi (sostituisci TUO_TOKEN con il token generato):
sonar-scanner -D sonar.token=TUO_TOKEN
Una volta completata l'analisi, consulta il progetto nell'interfaccia: Progetti → il progetto analizzato appare con le metriche (bug, vulnerabilità, copertura, duplicazioni).
Comandi utili
| Comando | Descrizione |
|---|---|
sudo systemctl status sonarqube | Stato del servizio SonarQube |
sudo systemctl restart sonarqube | Riavvia SonarQube |
sudo systemctl restart httpd | Riavvia Apache |
sonar-scanner -v | Versione di SonarScanner |
sonar-scanner -D sonar.token=TOKEN | Avvia un'analisi con token |
Struttura delle directory
| Percorso | Descrizione |
|---|---|
/opt/sonarqube/ | Installazione SonarQube (bin, conf, data, temp, extensions) |
/opt/sonarqube/conf/sonar.properties | Configurazione principale |
/opt/sonarscanner/ | Installazione SonarScanner CLI |
/etc/httpd/conf.d/sonarqube.conf | Virtual host Apache |
In caso di problemi
Il servizio SonarQube non si avvia
- Controlla i log:
sudo journalctl -u sonarqube.service -n 100 - Consulta i log SonarQube:
tail -f /opt/sonarqube/logs/sonar.logetail -f /opt/sonarqube/logs/web.log - Verifica che PostgreSQL sia avviato:
sudo systemctl status postgresql - Verifica i parametri del kernel:
sysctl vm.max_map_count(deve essere almeno 524288)
Errore 503 o pagina non raggiungibile via Apache
- Verifica che SonarQube sia in ascolto sulla 9000:
ss -tlnp | grep 9000 - Verifica SELinux:
getsebool httpd_can_network_connect(deve essere "on") - Consulta i log Apache:
sudo tail -f /var/log/httpd/sonarqube_error.log
Java o memoria
- Se le opzioni JVM in
sonar.propertiessono troppo basse per la tua RAM, aumentasonar.web.javaOptsesonar.search.javaOpts(es.-Xmx1gper il web,-Xmx2gper search in base alla RAM disponibile).