
Instalando PostgreSql
Importe a chave do repositório
1
2
3
sudo apt install curl ca-certificates
sudo install -d /usr/share/postgresql-common/pgdg
sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc
Crie o arquivo de config do repo
1
sudo sh -c "echo 'deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release --codename --short)-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
Atualize os repositórios e instale o PostereSQL
1
2
3
sudo apt update
sudo apt -y install postgresql-15
Habilite e inicie o banco de dados
1
2
systemctl enable postgresql
systemctl start postgresql
Configure o PostgreSQL
Entre na cli do banco
1
sudo -u postgres psql
Crie o usuário sonarqube
com a senha desejada
1
postgres=# CREATE ROLE sonarqube WITH LOGIN ENCRYPTED PASSWORD 'MySuperSecretPassword';
Crie a base de dados
1
postgres=# CREATE DATABASE sonarqube;
Permita o usuário com acesso total a essa base de dados
1
postgres=# GRANT ALL PRIVILEGES ON DATABASE sonarqube TO sonarqube;
Altere ara a base sonarqube
1
postgres=# \c sonarqube
Output:
1
You are now connected to database "sonarqube" as user "postgres".
Atribua os privilégios do usuário ao schema public.
1
postgres=# GRANT ALL PRIVILEGES ON SCHEMA public TO sonarqube;
Saida do cli
1
postgres=# \q
Nginx
Utilizaremos o NGINX como font end da console web
Importe a chave do repositório
1
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/mainline/ubuntu/ `lsb_release --codename --short` nginx" > /etc/apt/sources.list.d/nginx.list
Crie o arquivo de config do repo
1
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Instale o Nginx
1
2
3
apt update
apt install -y nginx
apt install -y nginx-extras # precisa ser em comando separado
Configurando o NGINX
Edite o arquivo /etc/nginx/nginx.conf
conforme abaixo:
Lembre de verificar o parâmetro user
para manter o mesmo usuário.
1
2
nginx_user=$(cat /etc/nginx/nginx.conf | grep -E '\buser\b' | sed 's/user//g;s/\;//g' | tr -d ' ')
echo "Nginx User: $nginx_user"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log warn;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
# multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
limit_conn_zone $binary_remote_addr zone=addr:10m;
server_names_hash_bucket_size 256;
client_max_body_size 10m;
log_format log_standard '$remote_addr, $http_x_forwarded_for - $remote_user [$time_local] "$request_method $scheme://$host$request_uri $server_protocol" $status $body_bytes_sent "$http_referer" "$http_user_agent" to: $upstream_addr';
access_log /var/log/nginx/access.log log_standard;
error_log /var/log/nginx/error.log;
sendfile on;
#tcp_nopush on;
server_tokens off; # removed pound sign
more_set_headers 'Server: StrataSec';
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
Crie o arquivo /etc/nginx/conf.d/sonarqube.conf
conforme abaixo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
server {
listen 80;
server_name _;
root /dev/null;
index index.html index.htm;
try_files $uri $uri/ $uri/404 =404;
client_max_body_size 100000M;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_ssl_verify off;
proxy_buffer_size 8k;
proxy_buffering on;
proxy_buffers 8 8k;
proxy_busy_buffers_size 16k;
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:9000;
}
error_page 403 /403.txt;
location /403.txt{
internal;
return 403 'Forbidden';
}
}
Remova o arquivo padrão
1
rm -rf /etc/nginx/conf.d/default.conf
Habilite o serviço do nginx
1
2
systemctl enable nginx
systemctl start nginx
Configs gerais do sistema operacional
Log de erro multipathd
Dependendo da infra você verá constantemente no syslog o erro abaixo
1
2
3
4
Apr 12 19:03:41 webdev multipathd[736]: sda: add missing path
Apr 12 19:03:41 webdev multipathd[736]: sda: failed to get udev uid: Invalid argument
Apr 12 19:03:41 webdev multipathd[736]: sda: failed to get sysfs uid: Invalid argument
Apr 12 19:03:41 webdev multipathd[736]: sda: failed to get sgio uid: No such file or directory
Caso isso esteja ocorrendo edite o arquivo /etc/multipath.conf
adicionando as seguintes linhas
1
2
3
4
5
6
defaults {
user_friendly_names yes
}
blacklist {
devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st|sda)[0-9]*"
}
Posteriormente reinicie o serviço
1
/etc/init.d/multipath-tools restart
Locales
Para que o python possa funcionar em outros locales é necessário instalar
1
2
3
4
5
6
7
locale-gen en_US
locale-gen en_US.utf8
locale-gen pt_BR
locale-gen pt_BR.UTF-8
echo 'LANG="en_US.UTF-8"' > /etc/default/locale
echo 'LANGUAGE="en_US:en"' >> /etc/default/locale
echo 'LC_ALL="en_US.UTF-8"' >> /etc/default/locale
Gestão de logs
Um item interessante pata otimizar e gerir os logs é o processo de logrotate, para isso faremos algumas configurações
Edite o arquivo /etc/logrotate.conf
e adicione a linha abaixo
1
dateext
Edite os arquivos abaixo mantendo a seguinte configuração para todos eles:
1
2
3
4
5
6
7
rotate 365
daily
missingok
notifempty
delaycompress
compress
dateext
Arquivos a serem ajustados
- /etc/logrotate.d/rsyslog
- /etc/logrotate.d/nginx
Sincronização de data/hora
Etapa 1: lista de fusos horários disponíveis
1
timedatectl list-timezones
Etapa 2: definir o fuso horário desejado
1
timedatectl set-timezone America/Sao_Paulo
Configurar o NTP
Sincronize o relógio do sistema com o servidor a.ntp.br manualmente (use este comando apenas uma vez, ou conforme necessário):
1
2
3
service ntp stop
ntpdate a.ntp.br
service ntp start
Sonar
1
apt install openjdk-17-jre openjdk-17-jdk unzip zip curl jq
Verificar versão do java
1
java -version
Output
1
2
3
openjdk version "17.0.16" 2025-07-15
OpenJDK Runtime Environment (build 17.0.16+8-Ubuntu-0ubuntu122.04.1)
OpenJDK 64-Bit Server VM (build 17.0.16+8-Ubuntu-0ubuntu122.04.1, mixed mode, sharing)
Verifique a ultima release do SonarQube em SonarQube releases page. em Nosso caso utilizaremos a sonarqube-25.9.0.112764.zip
.
Realize o donwload deste arquivo
1
2
cd /opt/
curl -LO https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-25.9.0.112764.zip
Extraia o arquivo zip
1
unzip sonarqube-25.9.0.112764.zip
Mova o conteúdo descompactado para o diretório final da instalação
1
sudo mv sonarqube-25.9.0.112764/ /opt/sonarqube
Nota: O SonarQube não pode ser executado como root
então será necessário criar um usuário para execução. Desta forma criaremos um usuário sem diretório home e sem permissão de login.
1
adduser --system --no-create-home --group --disabled-login --gecos "" sonarqube
Defina as permissões do diretório /opt/sonarqube
para o usuário
1
sudo chown -R sonarqube:sonarqube /opt/sonarqube
Configure SonarQube
Edite o arquivo /opt/sonarqube/conf/sonar.properties
adicionando as linhas abaixo:
1
2
3
4
5
6
sonar.jdbc.username=sonarqube
sonar.jdbc.password=MySuperSecretPassword
sonar.jdbc.url=jdbc:postgresql://localhost:5432/sonarqube
sonar.web.javaAdditionalOpts=-server
sonar.web.host=127.0.0.1
sonar.web.port=9000
Crie o arquivo /etc/sysctl.d/99-sonarqube.conf
com o seguinte conteudo:
1
2
vm.max_map_count=524288
fs.file-max=131072
Que definirá as seguintes configurações:
- vm.max_map_count=524288: Aumenta o número de mapeamentos de memória que o Elasticsearch pode usar, permitindo lidar com grandes volumes de dados.
- fs.file-max=131072: Aumenta o número máximo de arquivos que o Elasticsearch pode abrir, permitindo que ele seja executado de forma eficiente.
O SonarQube utiliza o Elasticsearch para armazenar índices em um sistema de arquivos com memória mapeada. Ajustar os limites do sistema para mapeamento de memória virtual e manipulação de arquivos garante maior estabilidade e desempenho do SonarQube.
Crie um novo arquivo /etc/security/limits.d/99-sonarqube.conf
para configurar os limites de recursos do SonarQube:
1
2
sonarqube - nofile 131072
sonarqube - nproc 8192
Dentro dessa configuração:
- nofile=131072: Aumenta o número de descritores de arquivos abertos, permitindo ao SonarQube lidar com grandes cargas de trabalho.
- nproc=8192: Eleva o limite de processos para evitar falhas sob alta concorrência.
Configurando SonarQube como serviço
Crie um novo arquivo /etc/systemd/system/sonarqube.service
com o seguinte conteúdo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[Unit]
Description=SonarQube service
After=syslog.target network.target
[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
PermissionsStartOnly=true
Restart=always
StandardOutput=syslog
LimitNOFILE=131072
LimitNPROC=8192
TimeoutStartSec=5
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
Recarrege as configurações do Systemd, habilite e inicie o serviço
1
2
3
systemctl daemon-reload
systemctl enable sonarqube
systemctl start sonarqube
Access SonarQube
Acesse o SonarQube utilizando o IP do seu servidor ou o nome de domínio.
Faça login no SonarQube com as seguintes credenciais quando solicitado:
- Usuário: admin
- Senha: admin
Realizando Scan local
Crie um projeto
Analise utilizando uma imagem Docker
A imagem Docker torna-se versátil por poder ser utilizada em qualquer sistema operacional sem a necessidade de instalação de diversas ferramentas.
1
2
3
4
5
6
7
8
docker pull sonarsource/sonar-scanner-cli:latest
docker run \
--rm \
-e SONAR_TOKEN="sqp_558e1dfb9c..." \
-e SONAR_HOST_URL="https://${SONAR_HOST_URL}" \
-v "${PROJECT_BASEDIR}:/usr/src" \
sonarsource/sonar-scanner-cli -Dsonar.projectKey=projeto-exemplo
Links
Fonte: https://docs.sonarsource.com/sonarqube-server/9.8/setup-and-upgrade/install-the-server
Pré-requisitos: https://docs.sonarsource.com/sonarqube-server/9.8/requirements/prerequisites-and-overview