EC2にSonarQubeをインストールする

# はじめに

最近、EC2(amazon linux2)にSonarQubeをインストールしました。
その際の手順をまとめた記事となります。

元は、自分用にメモしたものなので、コマンドはコピペで使えるかと思います。


## 環境

- EC2を使用、以下の条件としています。
    * amazon linux2
    * t2.medium(microだと、メモリが足りず、SonarQubeの要件を満たせません)
        * https://docs.sonarqube.org/latest/requirements/requirements/
    * セキュリティグループのインバウンド(22、9000(SonarQube))、アウトバウンド(80/443)を許可
    * EC2には、sshで接続して作業

## バージョン

- PostgreSQL 12 を使用
- JAVA 11(Amazon Corretto 11) を使用
- SonarQube 7.9 を使用

## 作業の流れ
0. 事前準備
1. PostgreSQLのインストール
2. JAVAのインストール
3. SonarQubeのインストール


## 0. 事前準備

### SonarQube実行ユーザの作成

SonarQube実行ユーザが必要となるため、事前に作成します。
ここでは、sonar としています。

```bash
$ sudo useradd sonar
```


## 1. PostgreSQLのインストール

こちらのページを参考にさせて頂きました。
https://qiita.com/tmiki/items/00d22edc6a554f61bd04

PostgreSQL 12をインストールします。

### リポジトリの更新

```bash
$ sudo rpm -ivh --nodeps https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
```

### リポジトリの修正

```bash
$ sudo sed -i 's/\$releasever/7/g' /etc/yum.repos.d/pgdg-redhat-all.repo
```

### インストール

```bash
$ sudo yum install -y postgresql12 postgresql12-server
$ sudo systemctl enable postgresql-12.service
```

### DBクラスタの初期化

```bash
$ PGSETUP_INITDB_OPTIONS='--encoding=UTF-8 --locale=C' sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
```

### 設定ファイル修正

- ファイル

```bash
$ sudo vi /var/lib/pgsql/12/data/postgresql.conf
```

- 内容

```diff
-#listen_addresses = 'localhost'         # what IP address(es) to listen on;
+listen_addresses = '0.0.0.0'            # what IP address(es) to listen on;
                                         # comma-separated list of addresses;
                                         # defaults to 'localhost'; use '*' for
```

- ファイル

```bash
$ sudo vi /var/lib/pgsql/12/data/pg_hba.conf
```

- 内容

```diff
 # "local" is for Unix domain socket connections only
 local   all             all                                     trust
 # IPv4 local connections:
-host    all             all             127.0.0.1/32            trust
+host    all             all             0.0.0.0/0               md5
 # IPv6 local connections:
 host    all             all             ::1/128                 trust---
```

### Postgresを起動

```bash
$ sudo systemctl start postgresql-12.service
```

### Postgresに接続

```bash
$ sudo su - postgres
$ psql
```

### SonarQube用のユーザ、データベースを作成

ここでは、ユーザ、及びパスワードを sonar としています。

```sql
create user sonar;
alter user sonar with password 'sonar';
create database sonar owner sonar TEMPLATE template1;
```

作成後、Postgresを切断、ec2-userに戻ります。

## 2.Javaのインストール

### インストール

```bash
$ sudo yum install -y java-11-amazon-corretto
```

### カーネルパラメータの調整

- ファイル(新規作成)

```bash
$ sudo vi /etc/sysctl.d/99-sonarqube.conf
```

- 内容

```diff
+fs.file-max= 65536
+vm.max_map_count= 262144
```

### Ulimitの設定

- ファイル(新規作成)

```bash
$ sudo vi /etc/security/limits.d/99-sonarqube.conf
```

- 内容

実行ユーザを変更している場合には、sonar を適宜変更して下さい。

```diff
+sonar   -   nofile   65536
+sonar   -   nproc    8192
```


今回は、systemdを使用して起動していますので、上記設定は不要ですが、
systemdを使用せず、SonarQubeを起動する際には必要となるため、設定しております。
systemdを使用しない起動/停止は、以下のイメージとなります。

```bash
$ sudo su sonar -c "/usr/local/sonarqube-7.9.3/bin/linux-x86-64/sonar.sh start"  # 起動
$ sudo su sonar -c "/usr/local/sonarqube-7.9.3/bin/linux-x86-64/sonar.sh stop"   # 停止
```

### カーネルパラメータ/ulimitを反映するため、EC2を再起動

```bash
$ sudo shutdown -r now
```

## 3.SonarQubeのインストール

### ダウンロード

実行ユーザを変更している場合には、sonar を適宜変更して下さい。

```bash
$ wget -P /tmp https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.9.3.zip
$ unzip /tmp/sonarqube-7.9.3.zip
$ sudo mv sonarqube-7.9.3 /usr/local/
$ sudo chown -R sonar:sonar /usr/local/sonarqube-7.9.3/
```

### Postgresを使用するよう設定ファイルを修正

- ファイル

```bash
$ sudo vi /usr/local/sonarqube-7.9.3/conf/sonar.properties
```

- 内容

Postgresのユーザ/パスワードを変更している場合には、sonar を適宜変更して下さい。

```diff
@@ -13,8 +13,8 @@
 # User credentials.
 # Permissions to create tables, indices and triggers must be granted to JDBC user.
 # The schema must be created first.
-#sonar.jdbc.username=
-#sonar.jdbc.password=
+sonar.jdbc.username=sonar
+sonar.jdbc.password=sonar

 #----- Embedded Database (default)
 # H2 embedded database server listening port, defaults to 9092
@@ -31,7 +31,7 @@

 #----- PostgreSQL 9.3 or greater
 # By default the schema named "public" is used. It can be overridden with the parameter "currentSchema".
-#sonar.jdbc.url=jdbc:oracle:thin:@localhost:1521/XE
+sonar.jdbc.url=jdbc:postgresql://localhost/sonar
```

### systemdに追加

- ファイル(新規作成)

```bash
$ sudo vi /etc/systemd/system/sonarqube.service
```

- 内容

実行ユーザを変更している場合には、User/Group を適宜変更して下さい。
JAVAのバージョンを替えたい場合には、ExecStart のパスを変更して下さい。

```diff
+[Unit]
+Description=SonarQube service
+After=syslog.target network.target
+
+[Service]
+Type=simple
+User=sonar
+Group=sonar
+PermissionsStartOnly=true
+ExecStart=/bin/nohup /usr/lib/jvm/java-11-amazon-corretto.x86_64/bin/java -Xms32m -Xmx32m -Djava.net.preferIPv4Stack=true -jar /usr/local/sonarqube-7.9.3/lib/sonar-application-7.9.3.jar
+StandardOutput=syslog
+LimitNOFILE= 65536
+LimitNPROC=8192
+TimeoutStartSec=5
+Restart=always
+SuccessExitStatus=143
+
+[Install]
+WantedBy=multi-user.target
```

### systemdをenableに変更

```bash
$ sudo systemctl enable sonarqube.service
```

### 起動

```bash
$ sudo systemctl start sonarqube.service
```

# SonarQubeに接続

`http://<EC2のGIP>:9000`

初期のID/パスワードは共にadminになります。

# 終わりに

今回は、ログインできるところまで確認しております。
基本的には、コピペでインストール可能なはずですが、もし、SonarQubeが動かない場合は、ログをご確認下さい。

ログは、sonarqubeのlogs配下に出力されます。今回は、/usr/local/配下に置きましたので、

```bash
/usr/local/sonarqube-7.9.3/logs
```
に出力されます。
こちらの sonar.log をご確認下さい。

また、念の為、前提条件（https://docs.sonarqube.org/latest/requirements/requirements/）
を確認してみて下さい。
自分の場合、確認したつもりが、見落としがありました。。。