Skip to main content

SonarQube Application Guide

SonarQube is an open-source platform for continuous code quality and security inspection, detecting bugs, vulnerabilities, and code smells across 30+ programming languages.

Status: Plugin Example (Community Contribution)

Note: SonarQube is implemented as a plugin example in cfc-testing to demonstrate the ApplicationSpec plugin system. It serves as a template for creating custom application plugins.


Quick Reference

PropertyValue
Application IDsonarqube
CategoryCode Quality
Default Imagesonarqube:lts-community
Application Port9000
Default CPU2048 (Fargate)
Default Memory4096 MB (Fargate)
Default Instancet3.medium (EC2)
Health Check Path/api/system/health
Health Check Grace300 seconds
Supports FargateYes
Supports EC2Yes
OIDC SupportNo (Community Edition)
Database RequiredNo (embedded H2)

Editions

Important: Unlike Mattermost and Metabase, SonarQube editions are separate products:

EditionLicenseOIDC/SAMLFeatures
CommunityFreeNoBasic analysis, 15+ languages
DeveloperPaidYesBranch analysis, PR decoration
EnterprisePaidYesPortfolio management, security reports
Data CenterPaidYesHigh availability, horizontal scaling

CloudForge deploys Community Edition by default. Enterprise features require purchasing and deploying a different image.


Capabilities

  • Static code analysis
  • Security vulnerability detection (OWASP Top 10, CWE)
  • Code smell detection
  • Technical debt tracking
  • Quality gates
  • Multi-language support (30+ languages)
  • CI/CD integration
  • IDE integration (SonarLint)
  • Quality profiles
  • Custom rules

Optional Ports

SonarQube does not have optional ports. All traffic flows through port 9000.


Authentication

Supported Auth Modes

ModeStatusDescription
alb-oidcAvailableALB-level authentication
noneAvailableLocal accounts only

Note: Native OIDC/SAML requires Developer Edition or higher.


Environment Variables

VariableDescriptionExample
SONAR_WEB_CONTEXTContext path/
SONAR_WEB_HOSTBind address0.0.0.0
SONAR_WEB_PORTApplication port9000
SONAR_WEB_PUBLIC_URLExternal URLhttps://sonar.example.com
SONAR_WEB_JAVAADDITIONALOPTSWeb JVM options-XX:+UseG1GC -Xmx2g
SONAR_CE_JAVAADDITIONALOPTSCompute Engine JVM options-XX:+UseG1GC -Xmx1g

System Requirements

SonarQube has specific system requirements for Elasticsearch:

RequirementValue
vm.max_map_count262144
nofile limit65536
nproc limit4096
Java17+

CloudForge automatically configures these for EC2 deployments.


Storage Configuration

Container (Fargate)

PropertyValue
Data Path/opt/sonarqube/data
EFS Path/sonarqube
Volume NamesonarqubeData
Container User1000:1000
EFS Permissions755

EC2

PropertyValue
EBS Device/dev/xvdh
Data Path/opt/sonarqube/data
Log Paths/opt/sonarqube/logs/sonar.log, /opt/sonarqube/logs/web.log, /opt/sonarqube/logs/ce.log

Deployment Context Examples

Development

{
"stackName": "SonarQube-Dev",
"applicationId": "sonarqube",
"applicationName": "SonarQube Dev",
"description": "SonarQube code quality server",
"environment": "development",

"runtime": "fargate",
"securityProfile": "dev",
"topology": "application-service",

"networkMode": "public-no-nat",
"region": "us-east-1",

"authMode": "none",

"cpu": 2048,
"memory": 4096,

"enableMonitoring": true,
"logRetentionDays": "7"
}

Cost estimate: ~$60/month

Production - With ALB Authentication

{
"stackName": "SonarQube-Production",
"applicationId": "sonarqube",
"applicationName": "SonarQube",
"description": "Production code quality server",
"environment": "production",

"runtime": "ec2",
"securityProfile": "production",
"topology": "application-service",

"domain": "example.com",
"subdomain": "sonar",
"enableSsl": true,

"networkMode": "private-with-nat",
"region": "us-east-1",

"authMode": "alb-oidc",
"cognitoAutoProvision": true,
"cognitoDomainPrefix": "sonarqube-prod-yourcompany",
"cognitoMfaEnabled": true,
"cognitoMfaMethod": "totp",

"instanceType": "t3.medium",
"minInstanceCapacity": 1,
"maxInstanceCapacity": 2,

"complianceFrameworks": "SOC2",
"scopeConfigRulesToDeployment": false,
"awsConfigEnabled": true,
"guardDutyEnabled": true,
"wafEnabled": true,
"albAccessLogging": true,

"enableMonitoring": true,
"enableEncryption": true,
"logRetentionDays": "730",
"retainStorage": true
}

Cost estimate: ~$250/month

Production - With External Database

For high availability, use PostgreSQL instead of embedded H2:

{
"stackName": "SonarQube-HA",
"applicationId": "sonarqube",
"applicationName": "SonarQube HA",
"description": "High availability SonarQube",
"environment": "production",

"runtime": "ec2",
"securityProfile": "production",
"topology": "application-service",

"domain": "example.com",
"subdomain": "sonar",
"enableSsl": true,

"networkMode": "private-with-nat",
"region": "us-east-1",

"authMode": "alb-oidc",
"cognitoAutoProvision": true,
"cognitoDomainPrefix": "sonarqube-ha-yourcompany",
"cognitoMfaEnabled": true,

"instanceType": "t3.large",
"minInstanceCapacity": 2,
"maxInstanceCapacity": 4,
"enableAutoScaling": true,

"provisionDatabase": true,
"databaseEngine": "postgres",
"databaseVersion": "15",
"databaseInstanceClass": "db.t3.medium",
"databaseAllocatedStorageGB": 50,
"databaseMultiAz": true,
"databaseName": "sonarqube",
"databaseBackupRetentionDays": 30,

"complianceFrameworks": "SOC2",
"awsConfigEnabled": true,
"guardDutyEnabled": true,
"wafEnabled": true,

"enableMonitoring": true,
"enableEncryption": true,
"logRetentionDays": "730",
"retainStorage": true
}

Note: When using external database, update sonar.properties with JDBC connection.

Cost estimate: ~$400/month


Plugin Development Reference

SonarQube in CloudForge demonstrates the ApplicationSpec plugin pattern:

@ApplicationPlugin(
value = "sonarqube",
category = "code-quality",
displayName = "SonarQube",
description = "Continuous code quality inspection",
defaultCpu = 2048,
defaultMemory = 4096,
defaultInstanceType = "t3.medium",
supportsFargate = true,
supportsEc2 = true,
supportsOidc = false // Community Edition
)
public class SonarQubeApplicationSpec implements ApplicationSpec {
// Implementation
}

Location: cfc-testing/src/main/java/com/cloudforgeci/samples/plugins/application/


Post-Deployment Tasks

1. Initial Login

  1. Navigate to https://sonar.your-domain.com
  2. Default credentials: admin / admin
  3. Immediately change password

2. Create Quality Profiles

  1. Quality Profiles > Create
  2. Select language
  3. Activate rules based on standards

3. Create Quality Gates

  1. Quality Gates > Create
  2. Set conditions (coverage, duplications, etc.)
  3. Assign to projects

4. Generate Tokens

For CI/CD integration:

  1. My Account > Security
  2. Generate Tokens
  3. Use in CI/CD pipelines

5. Configure Project Analysis

Maven:

mvn sonar:sonar \
-Dsonar.host.url=https://sonar.example.com \
-Dsonar.token=your-token

Gradle:

./gradlew sonarqube \
-Dsonar.host.url=https://sonar.example.com \
-Dsonar.token=your-token

Troubleshooting

SonarQube won't start

Check Elasticsearch requirements:

# Verify vm.max_map_count
sysctl vm.max_map_count
# Should be 262144

# Check logs
tail -f /opt/sonarqube/logs/sonar.log
tail -f /opt/sonarqube/logs/es.log

Out of memory

Increase JVM heap:

{
"cpu": 4096,
"memory": 8192
}

Or for EC2:

{
"instanceType": "t3.large"
}

Analysis taking too long

  1. Check Compute Engine logs
  2. Increase CE workers in settings
  3. Consider dedicated database