Pleasanter PostgreSQL対応版をDockerコンテナで稼働させる

## はじめに
待望のPleasanter PostgreSQL対応版がリリースされました！
Linux上に展開する場合、.NetCore版は以前から公開されていましたがSQL Serverを使うのは遠慮したい、私もそのように思っていた一人でした。
DBにPostgreSQLを利用することによって、いろんな制限またはコストを取っ払うことができますね。

ここではひと手間加えて、PleasanterをDockerコンテナ環境で稼働させたいと思います。

## docker インストール
割愛します。他サイト等を参照してインストールしてください。

## PostgreSQLコンテナ
* 以下内容でDockerfileを作成します。

```Dockerfile:Dockerfile
FROM postgres:12.2
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.utf8`
```

* ビルドします。

```
$ docker build -t mypostgres:12.2 .
```

PostgreSQLのdockerイメージが作成されたことを確認できます。

```
$ docker image ls

REPOSITORY   TAG    IMAGE ID       CREATED          SIZE
mypostgres   12.2   1fe9d8a7f265   17 seconds ago   318MB
```


* ネットワークを作成します。

```
$ docker network create -d bridge mynetwork
```

ネットワークが作成されました。

```
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
ab78a3703a75        bridge              bridge              local
54459fa57282        host                host                local
e975faae9194        mynetwork           bridge              local
cda8e2c61db1        none                null                local
```

* PostgreSQLコンテナを起動します。

```
$ docker run -d --name mypostgres12 -e POSTGRES_PASSWORD=password --net="mynetwork" mypostgres:12.2
```

PostgresSQLコンテナが起動したことを確認します。

```
$ docker ps
CONTAINER ID  IMAGE            COMMAND                 CREATED         STATUS         PORTS     NAMES
5ebba7a31bed  mypostgres:12.2  "docker-entrypoint.s…"  17 seconds ago  Up 15 seconds  5432/tcp  mypostgres12
```

* PostgreSQLコンテナにアタッチします。

```
$ docker exec -it mypostgres12 bash
```

* データベースを作成します。

```
# su - postgres
$ psql
postgres=# create database "Implem.Pleasanter";
postgres=# \l
                                     List of databases
       Name        |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-------------------+----------+----------+------------+------------+-----------------------
 Implem.Pleasanter | postgres | UTF8     | ja_JP.utf8 | ja_JP.utf8 |
```

以上でDBコンテナ（PostgreSQL）の準備は完了です。

## Pleasanterコンテナ

* まずはsystemdが有効なcentos7のイメージを準備します。

　イメージ作成手順は割愛します。[docker hub](https://hub.docker.com/_/centos)を参照してください。

* 作成したイメージをもとにコンテナを起動します。

```
$ docker run --privileged -d --name pleasanter --net="mynetwork" -p 8080:80 pleasanter-centos7 /sbin/init
```

コンテナが起動したことを確認します。

```
$ docker ps
CONTAINER ID  IMAGE               COMMAND       CREATED         STATUS        PORTS                 NAMES
7f272229599c  pleasanter-centos7  "/sbin/init"  10 seconds ago  Up 9 seconds  0.0.0.0:8080->80/tcp  pleasanter
```

* コンテナにアタッチします。

```
$ docker exec -it pleasanter bash
```

* Git client、.NetCore 3.1、GDI+ をインストールします。

```
# yum -y install git

# rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
# yum -y update
# yum -y install dotnet-sdk-3.1

# yum -y install epel-release
# yum -y install libgdiplus
```

* PleasanterアプリケーションをDLし展開します。

[公式DLサイト](https://pleasanter.org/dlcenter)からzipをDLし適当なディレクトリに展開します。
当サイトの例では「/web」ディレクトリ以下に「pleasanter」ディレクトリを配置しています。
/web/pleasanter/

* ファイルを編集しDB構成を設定します。

```/web/pleasanter/Implem.Pleasanter/App_Data/Parameters/Rds.json
{
    "Dbms": "PostgreSQL",
    "Provider": "Local",
    "TimeZoneInfo": "Asia/Tokyo",
    "SaConnectionString": "Server=mypostgres12;Database=postgres;UID=postgres;PWD=password",
    "OwnerConnectionString": "Server=mypostgres12;Database=#ServiceName#;UID=#ServiceName#_Owner;PWD=SetAdminsPWD",
    "UserConnectionString": "Server=mypostgres12;Database=#ServiceName#;UID=#ServiceName#_User;PWD=SetUsersPWD",
    "SqlCommandTimeOut": 600,
    "MinimumTime": 3,
    "DeadlockRetryCount": 4,
    "DeadlockRetryInterval": 1000
}
```

* CodeDefinerを実行します。

```
# cd /web/pleasanter/Implem.CodeDefiner
# dotnet Implem.CodeDefiner.NetCore.dll _rds
```

* サービス用スクリプトを作成します。

```/etc/systemd/system/pleasanter.service
[Unit]
Description = Pleasanter
Documentation =
Wants=network.target
After=network.target

[Service]
ExecStart = /usr/bin/dotnet Implem.Pleasanter.NetCore.dll
WorkingDirectory = /web/pleasanter/Implem.Pleasanter
Restart = always
RestartSec = 10
KillSignal=SIGINT
SyslogIdentifier=dotnet-pleasanter
User = root
Group = root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

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

* サービスの登録および起動します。

```
# systemctl daemon-reload
# systemctl enable pleasanter
# systemctl start pleasanter
```

* NginXのリポジトリを登録します。

```/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
```

* NginXをインストールします。

```
# yum -y install nginx
```

* NginXサービスを登録します。

```
# systemctl enable nginx
```

* NginXでリバースプロキシを設定します。

```/etc/nginx/conf.d/pleasanter.conf
server {
    listen  80;    
    server_name   192.168.0.200;
    location / {
       proxy_pass         http://localhost:5000;
       proxy_http_version 1.1;
       proxy_set_header   Upgrade $http_upgrade;
       proxy_set_header   Connection keep-alive;
       proxy_set_header   Host $host;
       proxy_cache_bypass $http_upgrade;      
       proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header   X-Forwarded-Proto $scheme;
    }
}
```
　※server_name 行には実際アクセスする際のIPアドレスまたはホスト名を記載してください。

* NginXを再起動します。

```
# systemctl restart nginx
```

## 利用開始

Webブラウザからアクセス（192.168.0.200:8080/users/login）するとログイン画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/c90c3c6b-1059-a6ec-772d-90c552bec4eb.png)
ID：Administrator
PW：pleasanter
※初回ログイン時にPW変更を求められますので、任意のPWを設定してください。

## おわりに

今回は公式サイトの手順に準じたうえで、Pleasanterをdockerコンテナにデプロイ、その際アプリケーションとDBをそれぞれ別のコンテナとしました。
上記例では実施していませんが、実際に利用する場合にはDBやアプリケーションデータの永続化なども検討要ですね。