Codebeamer 2.1 Docker インストレーションノート

# はじめに

:::note warn
ここで記載する手順は Codebeamer 2.1 まで有効です。Codebeamer 2.2 以降では、この手順では導入できませんので注意願います。
:::

本稿では Docker イメージを使用して Codebeamer の環境を構築する手順を説明します。前提として、

- Codebeamer 2.1 の Docker イメージを利用
- OS は Ubuntu 22.04 LTS
- DB は Postgresql 15 をホストに導入
- Apache を前段に立て、SSL 処理は Apache 側で実施
- Apache から Codebeamer（Tomcat）に proxy_http でリクエストをパス

という構築方法になります。

:::note warn
なお、筆者は PTC Japan に在籍していますが、本記事はあくまで個人として作成したものであり、PTC Japan は本記事に関して一切の責任を持たず、またお問合せにも対応しませんので予めご了承ください。
:::

# OS 環境のアップデート
## 最新パッチの適用

作業の最初に、Ubuntu を最新の状態にします。

```
sudo apt-get update
sudo apt-get upgrade
```
##タイムゾーンの設定

サーバーのシステムクロックを日本時間へ、ハードゥエアクロックを UTC へ変更します。

```
sudo timedatectl set-timezone Asia/Tokyo
sudo timedatectl set-local-rtc 0
```

変更が有効になったか確認します。
```
timedatectl
               Local time: Thu 2024-01-04 10:34:51 JST
           Universal time: Thu 2024-01-04 01:34:51 UTC
                 RTC time: Thu 2024-01-04 01:34:51
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
```

## codebeamer ユーザーの作成
```
sudo useradd -m -g www-data codebeamer
passwd codebeamer
```

# Apache 環境の構築
## Apache の導入

apache2 を導入します。

```
sudo apt -y install apache2
```

## SSL 化のための準備（サーバー証明書の取得と設定）

443/TCP を HTTPS で受けるために、最初にサーバー証明書を準備します。

```
sudo apt -y install certbot
```

certbot が導入できたら、サーバー証明書を取得します。この手順は、apache が起動して 80/TCP をリッスンしていることを確認した上で、```/var/www/html``` に書き込み権限を持っているユーザー id で実施する必要があります。80/TCP が閉じていたり、```/var/www/html``` への書き込み権限がない場合には、コマンドの実行が失敗するので注意が必要です。また、下記で`my.server`となっている部分は、実際のサーバーの FQDN を指定します。

```
sudo certbot certonly --webroot -w /var/www/html -d my.server
```
* [サーバー証明書取得の詳細手順（外部）](https://www.server-world.info/query?os=Ubuntu_20.04&p=ssl&f=2)

証明書が下記に保存されますので、この場所を記録しておきます。この証明書は、後工程で Apache の設定で必要になります。

* `/etc/letsencrypt/live/my.server/cert.pem`
* `/etc/letsencrypt/live/my.server/privkey.pem`
* `/etc/letsencrypt/live/my.server/chain.pem`

Let's Encrypt の証明書は3ヶ月しか有効期限がないため、定期的に再発行が必要です。root ユーザーの crontab に再発行用のコマンドを登録します。

```
sudo crontab
```

crontab には下記の設定をします。

```crontab
0 0 1 * * /usr/bin/certbot renew > /dev/null 2>&1
```

## Apache の設定

apache の設定を変更して、443/TCP を HTTPS で受け入れるようにします。

```
sudo vi /etc/apache2/sites-available/default-ssl.conf
```

変更点・追記点を下記に示します。SSLCertificateFile, SSLCertificateKeyFile, SSLCertificateChainFile は前の手順で取得したサーバー証明書のパスをセットします。

```default-ssl.conf
ServerName my.server
SSLCertificateFile /etc/letsencrypt/live/my.server/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/my.server/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/my.server/chain.pem
```

default-ssl.conf ファイル末尾近くにに次の二行を追加します。\</VirtualHost\> の直前が適切な場所です。

```default-ssl.conf
ProxyRequests   Off
ProxyPass       / http://localhost:8080/ keepalive=on
```

default-ssl.conf の修正を確定して、閉じます。


SSL とリバースプロキシーを有効にします。リバースプロキシーは、443/TCP （HTTPS）を apache で受け、tomcat にリクエストを転送するために必要になります。

```
sudo a2ensite default-ssl
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_http
```

上記手順で、proxy や proxy_http モジュールが有効化できない場合には、apt によってこれらのモジュールがインストールされたかどうかを確認してください。ubuntu の場合は apache2 と同時にインストールされているはずです。

最後に、apache を再起動します。

```
sudo systemctl restart apache2
```
# PostgreSQL 環境の構築

Codebeamer 2.1 のサポートする Postgresql のバージョンは 15 ですが、Ubuntu 22.04 LTS の　deb リポジトリには　Postgresql-14 までしかありません。このため、手動で Postgresql-15 のリポジトリを追加して導入します。

## 鍵の追加
```
sudo install -m 0755 -d /etc/apt/keyrings
curl -fSsL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /etc/apt/keyrings/postgresql.gpg > /dev/null
```

## リポジトリの追加
```
echo deb [arch=amd64,arm64,ppc64el signed-by=/etc/apt/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main | sudo tee /etc/apt/sources.list.d/postgresql.list
```

## PostgreSQL の導入

postgresql を導入します。

```
sudo apt update
sudo apt install postgresql-15 postgresql-contrib
```

"postgres" ユーザーのパスワードを変更します。こちらは OS のパスワードになります。

```
sudo passwd postgres
```

データベースの管理権限のパスワードを変更します。

```
sudo -u postgres psql
ALTER ROLE postgres WITH password '<パスワード>'
```

上記で <パスワード> の部分には実際のパスワードにする文字列を入力します。

## PostgreSQL の環境設定

`/etc/postgresql/15/main/postgresql.conf` を編集モードで開きます。

まず、localhost 以外からの接続を受け入れるようにします。

``` postgresql.conf
listen_addresses = '*'
```

さらに、codebeamer のデータベースとして必要となる下記の項目を postgresql.conf ファイルの最後部に追記します。

```postgresql.conf
effective_io_concurrency = 200
jit = on
max_locks_per_transaction = 5000
random_page_cost = 1.1
temp_buffers = 64MB
work_mem = 80000
default_statistics_target = 1000
checkpoint_timeout = 2700
```

つづいて、/etc/postgresql/15/main/pg_hba.conf ファイルを修正します。

```
sudo vi /etc/postgresql/15/main/pg_hba.conf
```

下記の項目を追加します。

```pg_hba.conf
# for Codebeamer
host    codebeamer    cbroot        0.0.0.0/0        md5
```

postgresql を再起動します。

```
sudo systemctl restart postgresql
```

## Codebeamer 用データベース作成

Postgresql 環境にログインします。

```
sudo -u postgres psql
```

Codebeamer 用データベースを作成します。下記の <パスワード> には、実際のパスワードをテキストで入力します。

```
CREATE DATABASE codebeamer LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' ENCODING 'UTF8' TEMPLATE = template0;
CREATE USER cbroot WITH PASSWORD '<パスワード>';
ALTER DATABASE codebeamer OWNER TO cbroot;
```

エクステンションを作成します。

```
\c codebeamer
CREATE EXTENSION pg_trgm;
```

postgresql の準備は以上で終了です。

# Docker の準備

[Official information](https://docs.docker.com/engine/install/ubuntu/#set-up-the-repository)

## Docker のインストール

Docker GPG Key の登録

```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
```

リポジトリの登録

```
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

リポジトリのアップデート

```
sudo apt update
```

docker グループの作成とユーザー登録

```
sudo groupadd docker
sudo usermod -aG docker codebeamer
```
docker のインストール

```
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose docker-compose-plugin
```

docker インストール後は OS の再起動が必要です。

```
sudo shutdown -r now
```

# Codebeamer のインストール
## docker-compose ファイルの作成

Codebeamer のフォルダを作成します。ルート以外のユーザーで、適当な場所で下記コマンドを実行します。

```
mkdir -p Docker/codebeamer
```

上記で作成したフォルダ（Docker/codebeamer）へ移動し、docker-compose.yml を作成します。docker-compose.yml ファイルには下記を記述します。

```docker-compose.yml
version: '2.1'

services:
  codebeamer-app:
    image: intland/codebeamer:2.1.0.0
    container_name: codebeamer
    ports:
      - 8080:8080
    extra_hosts:
      - host.docker.internal:host-gateway
    environment:
      - DEBUG=false
      - TZ=Asia/Tokyo
      - WAIT_HOSTS=host.docker.internal:5432
      - WAIT_HOSTS_TIMEOUT=120
      - "CB_database_JDBC_Username=cbroot"
      - "CB_database_JDBC_Password=<password>"
      - "CB_database_JDBC_Driver=org.postgresql.Driver"
      - "CB_database_JDBC_ConnectionURL=jdbc:postgresql://host.docker.internal:5432/codebeamer"
      - "HEAPSIZE_OVERRIDE=-Xss1m -Xms2000M -Xmx8000M"
    volumes:
      - codebeamer-logo:/home/appuser/codebeamer/repository/config/logo
      - codebeamer-repository-docs:/home/appuser/codebeamer/repository/docs
      - codebeamer-repository-search:/home/appuser/codebeamer/repository/search
      - codebeamer-logs:/home/appuser/codebeamer/logs
      - codebeamer-tmp:/home/appuser/codebeamer/tomcat/tmp
    restart: always


volumes:
  codebeamer-logo:
  codebeamer-repository-docs:
  codebeamer-repository-search:
  codebeamer-logs:
  codebeamer-tmp:
```

## Codebeamer の起動

上記で作成した docker-compose.yml ファイルを使用して Codebeamer の Docker イメージをスタートします。下記コマンドは docker-compose.yml ファイルがあるディレクトリで実施してください。

```
docker compose up -d
```

Docker イメージが起動したかどうかは、下記コマンドで確認できます。

```
docker ps
```

次のように表示されたら、起動は完了しています。

```
CONTAINER ID   IMAGE                        COMMAND                  CREATED         STATUS                            PORTS                                       NAMES
1bbb0c93cd5d   intland/codebeamer:2.1.0.0   "/home/appuser/entry…"   3 seconds ago   Up 2 seconds (health: starting)   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   codebeamer
```