CentOS 8で、SonarQubeをsystemdで起動・停止できるように設定する

# What's？

SonarQubeをsystemdで起動・停止できるようにしたい、ということで。


# 環境

利用するのは、CentOS 8にインストール済みのSonarQube 8.6とします。

```
SonarQube ID information
Server ID: 641C58CB-AXdrQxhRQD8BFDvb7Vf0
Version: 8.6.1.40680
Date: 2021-02-15
```

CentOS 8の情報は、こちら。

```shell
$ cat /etc/redhat-release 
CentOS Linux release 8.3.2011


$ uname -srvmpio
Linux 4.18.0-240.10.1.el8_3.x86_64 #1 SMP Mon Jan 18 17:05:51 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
```

また、SonarQubeサーバーのインストールディレクトリは、以下とします。

```shell
/opt/sonarqube/current
```

ダウンロードしてきたSonarQubeサーバーを`unzip`して、シンボリックリンクを付けただけですが。

```shell
$ ll /opt/sonarqube
total 244448
lrwxrwxrwx.  1 xxxxx xxxxx        21  2月  4 04:16 current -> sonarqube-8.6.1.40680
drwxr-xr-x. 11 xxxxx xxxxx       141  1月 25 12:30 sonarqube-8.6.1.40680
-rw-rw-r--.  1 xxxxx xxxxx 250314396  2月  4 04:05 sonarqube-8.6.1.40680.zip
```

# SonarQubeをsystemdのサービスユニットとして登録する

では、SonarQubeをsystemdのサービスユニットとして登録しましょう。

やり方自体は、SonarQubeのドキュメントに書かれています。

[Operating the Server / Running SonarQube as a Service on Linux with SystemD](https://docs.sonarqube.org/8.6/setup/operate-server/#header-3)

ドキュメントに記載の通り、以下の順番でやっていきましょう。

* SonarQube用のユーザー、グループを作成
* systemdのサービスユニット定義ファイルの作成
* サービスの有効化

`sonarqube`ユーザーの追加。今回は、ログイン不可ユーザーとしました。

```shell
$ sudo useradd -s /sbin/nologin sonarqube
```

グループについては、特に指定せずそのままユーザー名と同じグループ（`sonarqube`）に属してもらいます。

```shell
$ sudo -u sonarqube id
uid=1001(sonarqube) gid=1001(sonarqube) groups=1001(sonarqube) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
```

SonarQubeをインストールしているディレクトリの所有者は、`sonarqube`にしておきました。

```shell
$ sudo chown -R sonarqube.sonarqube /opt/sonarqube
```

ドキュメントを見ると、データとextensionを配置するディレクトリ以外は`root`の方が良いそうですけどね…。

> The SonarQube data directory, /opt/sonarqube/data, and the extensions directory, /opt/sonarqube/extensions should be owned by the sonarqube user. As a good practice, the rest should be owned by root

Javaは、`dnf`でインストールしたOpenJDK 11を使用します。

```shell
$ /usr/lib/jvm/java-11-openjdk/bin/java --version
openjdk 11.0.9.1 2020-11-04 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.9.1+1-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.9.1+1-LTS, mixed mode, sharing)
```

`/etc/systemd/system`配下に、SonarQubeのサービスユニット定義ファイルを作成します。

```shell:/etc/systemd/system/sonarqube.service
[Unit]
Description=SonarQube service
After=network.target

[Service]
Type=simple
User=sonarqube
Group=sonarqube
PermissionsStartOnly=true
ExecStart=/bin/nohup /usr/lib/jvm/java-11-openjdk/bin/java -Xms32m -Xmx32m -Djava.net.preferIPv4Stack=true -jar /opt/sonarqube/current/lib/sonar-application-8.6.1.40680.jar
LimitNOFILE=131072
LimitNPROC=8192
TimeoutStartSec=5
Restart=always
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
```

ドキュメントの例から変更しているのは、`java`コマンドのパス、SonarQubeのJARファイル名およびパス、そして`StandardOutput`の削除、`After`での`syslog.target`の削除です。

ドキュメントは`StandardOutput`でsyslogに出力するようにしていましたが、デフォルトのjournalで良いかなと…。  
といっても、結局`syslog`に指定していてもjournaldのログは出力されるのですが。

サービスユニットの有効化。

```shell
$ sudo systemctl enable sonarqube
```

起動。

```shell
$ sudo systemctl start sonarqube
```

ステータスを確認します。

```shell
$ sudo systemctl status sonarqube
● sonarqube.service - SonarQube service
   Loaded: loaded (/etc/systemd/system/sonarqube.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2021-02-15 03:43:38 UTC; 1min 3s ago
 Main PID: 59158 (java)
    Tasks: 150 (limit: 23679)
   Memory: 1.5G
   CGroup: /system.slice/sonarqube.service
           ├─59158 /usr/lib/jvm/java-11-openjdk/bin/java -Xms32m -Xmx32m -Djava.net.preferIPv4Stack=true -j>
           ├─59176 /usr/lib/jvm/java-11-openjdk-11.0.9.11-3.el8_3.x86_64/bin/java -XX:+UseConcMarkSweepGC ->
           ├─59286 /usr/lib/jvm/java-11-openjdk-11.0.9.11-3.el8_3.x86_64/bin/java -Djava.awt.headless=true >
           └─59354 /usr/lib/jvm/java-11-openjdk-11.0.9.11-3.el8_3.x86_64/bin/java -Djava.awt.headless=true >

 2月 15 03:43:38 centos8.localdomain nohup[59158]: 2021.02.15 03:43:38 INFO  app[][o.s.a.es.EsSettings] Ela>
 2月 15 03:43:38 centos8.localdomain nohup[59158]: 2021.02.15 03:43:38 INFO  app[][o.s.a.ProcessLauncherImp>
 2月 15 03:43:38 centos8.localdomain nohup[59158]: 2021.02.15 03:43:38 INFO  app[][o.s.a.SchedulerImpl] Wai>
 2月 15 03:43:38 centos8.localdomain nohup[59158]: OpenJDK 64-Bit Server VM warning: Option UseConcMarkSwee>
 2月 15 03:43:44 centos8.localdomain nohup[59158]: 2021.02.15 03:43:44 INFO  app[][o.s.a.SchedulerImpl] Pro>
 2月 15 03:43:44 centos8.localdomain nohup[59158]: 2021.02.15 03:43:44 INFO  app[][o.s.a.ProcessLauncherImp>
 2月 15 03:43:53 centos8.localdomain nohup[59158]: 2021.02.15 03:43:53 INFO  app[][o.s.a.SchedulerImpl] Pro>
 2月 15 03:43:53 centos8.localdomain nohup[59158]: 2021.02.15 03:43:53 INFO  app[][o.s.a.ProcessLauncherImp>
 2月 15 03:43:55 centos8.localdomain nohup[59158]: 2021.02.15 03:43:55 INFO  app[][o.s.a.SchedulerImpl] Pro>
 2月 15 03:43:55 centos8.localdomain nohup[59158]: 2021.02.15 03:43:55 INFO  app[][o.s.a.SchedulerImpl] Son>
```

これで、SonarQubeが起動しました。

停止。

```shell
$ sudo systemctl stop sonarqube
```

ステータスの確認（Webコンソールにアクセスしても止まっています）。

```shell
$ sudo systemctl status sonarqube
● sonarqube.service - SonarQube service
   Loaded: loaded (/etc/systemd/system/sonarqube.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Mon 2021-02-15 03:57:28 UTC; 1s ago
  Process: 59485 ExecStart=/bin/nohup /usr/lib/jvm/java-11-openjdk/bin/java -Xms32m -Xmx32m -Djava.net.pref>
 Main PID: 59485 (code=exited, status=143)

 2月 15 03:57:28 centos8.localdomain nohup[59485]: 2021.02.15 03:57:28 INFO  app[][o.s.a.SchedulerImpl] Sto>
 2月 15 03:57:28 centos8.localdomain nohup[59485]: 2021.02.15 03:57:28 WARN  app[][o.s.a.p.AbstractManagedP>
 2月 15 03:57:28 centos8.localdomain nohup[59485]: 2021.02.15 03:57:28 INFO  app[][o.s.a.SchedulerImpl] Pro>
 2月 15 03:57:28 centos8.localdomain nohup[59485]: 2021.02.15 03:57:28 WARN  app[][o.s.a.p.AbstractManagedP>
 2月 15 03:57:28 centos8.localdomain nohup[59485]: 2021.02.15 03:57:28 INFO  app[][o.s.a.SchedulerImpl] Pro>
 2月 15 03:57:28 centos8.localdomain nohup[59485]: 2021.02.15 03:57:28 WARN  app[][o.s.a.p.AbstractManagedP>
 2月 15 03:57:28 centos8.localdomain nohup[59485]: 2021.02.15 03:57:28 INFO  app[][o.s.a.SchedulerImpl] Pro>
 2月 15 03:57:28 centos8.localdomain nohup[59485]: 2021.02.15 03:57:28 INFO  app[][o.s.a.SchedulerImpl] Son>
 2月 15 03:57:28 centos8.localdomain systemd[1]: sonarqube.service: Succeeded.
 2月 15 03:57:28 centos8.localdomain systemd[1]: Stopped SonarQube service.
```

journaldでのログの確認。

```shell
$ sudo journalctl -u sonarqube -f
```

こんな感じでしょうかね。