Pleasanter with PostgreSQL を CentOS7 にインストールしてみる

# Pleasanter with PostgreSQL を CentOS7 にインストールしてみる

心待ちにしてたPleasanter with PostgreSQL がリリースされました。
[公式サイトのニュースリリース](https://pleasanter.org/archives/7155)

早速、公式の手順を参考に、CentOS7 に PostgreSQL 対応の ビジネスアプリケーションプラットフォームPleasanter をインストールしてみます。

[Pleasanterの説明はこちら](https://pleasanter.org/welcome)

## CentOS7 のインストール

ベース環境として"開発及びクリエイティブワークステーション"を選択してインストール
足りないものは、あとで追加します。

## VirtualBox Guest Additons のインストール

この手順は私がVirtualBox上でテストしてるのでそのまま手順を残してます。
もちろん、VirtualBox以外の環境でしたらインストールする必要はありません。

### 依存パッケージの導入

開発ツールグループとkernel-header、kernel-develが必要になります。
インストールされていない場合は、インストールしましょう。

```shell
[user01@pleasanter ~]$ sudo yum groups install -y "Development Tools"
[user01@pleasanter ~]$ sudo yum install -y kernel-devel kernel-headers
```

### VirtualBox Guest Additions のインストール

メニューからイメージをマウントして、適当にインストールしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560759/f39bf638-af25-ff97-cf67-74c114adbcf9.png)

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

.NetCore3.1のインストール

参考）[CentOS 7 パッケージ マネージャー - .NET Core をインストールする](https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-package-manager-centos7)

```shell
[user01@pleasanter ~]$ sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
[user01@pleasanter ~]$ sudo yum install -y dotnet-sdk-3.1
```

## グラフィックサブシステム GDI+ のインストール

epelリポジトリからGDI+をインストールします。

```shell
[user01@pleasanter ~]$ sudo yum install -y epel-release
[user01@pleasanter ~]$ sudo yum install -y libgdiplus
```

## PostgreSQLのインストール

CentOSの標準リポジトリのpostgresql-serverは、バージョン9.2.24とだいぶ古めだったので、
素直に公式リポジトリからインストールします。

参考）
[リポジトリの確認：Accessing to the PostgreSQL RPM Repositories](https://yum.postgresql.org/repopackages.php#pg12)
[古いけどインストール手順：Installing and configuring PostgreSQL 9.3 and 9.4 on RHEL 7](https://people.planetpostgresql.org/devrim/index.php?/archives/80-Installing-and-configuring-PostgreSQL-9.3-and-9.4-on-RHEL-7.html)

### インストール

* リポジトリの追加
* インストール

```shell
[user01@pleasanter ~]$ sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
[user01@pleasanter ~]$ sudo yum install -y postgresql12-server postgresql12-contrib
```

### DBの初期化

* encodeing：UTF8
* Locale：ja_JP.utf8
* AUTH：md5
* 初期化中に新規Superuserへのパスワード付与：実行する (後の手順で参考になるように、ここでは P@ssw0rd に設定しました)

```shell
[user01@pleasanter ~]$ sudo su - postgres -c '/usr/pgsql-12/bin/initdb -E UTF8 --locale=ja_JP.utf8 -A md5 -W'
データベースシステム内のファイルの所有者はユーザ"postgres"となります。
このユーザをサーバプロセスの所有者とする必要があります。

データベースクラスタはロケール"ja_JP.utf8"で初期化されます。
initdb: could not find suitable text search configuration for locale "ja_JP.utf8"
デフォルトのテキスト検索構成は simple に設定されます。

データベージのチェックサムは無効です。

新しいスーパユーザのパスワードを入力してください:
再入力してください:

ディレクトリ/var/lib/pgsql/12/dataの権限を設定しています ... ok
サブディレクトリを作成しています ... ok
動的共有メモリの実装を選択しています ... posix
デフォルトのmax_connectionsを選択しています ... 100
デフォルトの shared_buffers を選択しています ... 128MB
selecting default time zone ... Asia/Tokyo
設定ファイルを作成しています ... ok
ブートストラップスクリプトを実行しています ... ok
ブートストラップ後の初期化を実行しています ... ok
データをディスクに同期しています ... ok

成功しました。以下のようにしてデータベースサーバを起動することができます:

    /usr/pgsql-12/bin/pg_ctl -D /var/lib/pgsql/12/data -l ログファイル start

[user01@pleasanter ~]$
```

### ログ出力設定の変更

debug用かな？
[参考： PostgreSQL 12.0文書 - 19.8.3. 何をログに](https://www.postgresql.jp/document/12/html/runtime-config-logging.html#GUC-LOG-LINE-PREFIX)

log_line_prefix 行を変更します。

```shell
[user01@pleasanter ~]$ sudo vi /var/lib/pgsql/12/data/postgresql.conf

    510 #log_error_verbosity = default          # terse, default, or verbose messages 
    511 #log_hostname = off
    512 ###log_line_prefix = '%m [%p] '         # special values:
    513 log_line_prefix = '[%t]%u %d %p[%l] '           # special values:

[user01@pleasanter ~]$ 
```

### PostgreSQLの起動

```shell
[user01@pleasanter ~]$ sudo systemctl --now enable postgresql-12
```

### PostgreSQLへの接続確認

```ユーザ postgres のパスワード: ``` には、DB初期化時に設定したスーパーユーザパスワードを答えます。
接続後は、ユーザ一覧を表示するなど適当にDBの確認をしたら```\q```でPostgreSQLから抜けます。
OS上のユーザ```postgres```での操作も終わりなので```exit```で元々のユーザに戻ります。

```shell
[user01@pleasanter ~]$ sudo su - postgres
最終ログイン: 2020/05/29 (金) 17:36:32 JST日時 pts/0
-bash-4.2$ psql
ユーザ postgres のパスワード: 
psql (12.3)
"help"でヘルプを表示します。

postgres=# select * from pg_user;
 usename  | usesysid | usecreatedb | usesuper | userepl | usebypassrls |  passwd  | valuntil | useconfig 
----------+----------+-------------+----------+---------+--------------+----------+----------+-----------
 postgres |       10 | t           | t        | t       | t            | ******** |          | 
(1 行)

postgres=# exit
-bash-4.2$ exit
[user01@pleasanter ~]$ 
```

### PostgreSQLへのリモートアクセス許可（省略可）

公式の手順にはありますが、PleasanterとPostgrSQLを同一サーバ上で動かす場合は設定の必要はありません。

## Pleasanterのインストール

### インストールパッケージの入手／配備

[公式サイトのダウンロードページ](https://pleasanter.org/dlcenter) .NET Core版のダウンロードリンクを入手した上で、wgetを使ってダウンロードしました。
ブラウザが使える場合ブラウザでダウンロードした方が楽かな。

```shell
[user01@pleasanter ~]$ wget --content-disposition https://pleasanter.org/download/6475/
[user01@pleasanter ~]$

[user01@pleasanter ~]$ sudo mkdir /web
[user01@pleasanter ~]$ sudo unzip -q -d /web Pleasanter.NetCore_1.1.0.0.zip
```

### DBの構成

* 設定ファイルへのスーパーユーザパスワードの設定(5行目のPWD=に設定します)
* CodeDefinerの実行

```shell
[user01@pleasanter ~]$ sudo vi /web/pleasanter/Implem.Pleasanter/App_Data/Parameters/Rds.json
      1 {
      2     "Dbms": "PostgreSQL",
      3     "Provider": "Local",
      4     "TimeZoneInfo": "Asia/Tokyo",
      5     "SaConnectionString": "Server=localhost;Database=postgres;UID=postgres;PWD=P@ssw0rd",  ## この行を編集します。
      6     "OwnerConnectionString": "Server=localhost;Database=#ServiceName#;UID=#ServiceName#_Owner;PWD=SetAdminsPWD",
      7     "UserConnectionString": "Server=localhost;Database=#ServiceName#;UID=#ServiceName#_User;PWD=SetUsersPWD",
      8     "SqlCommandTimeOut": 600,
      9     "MinimumTime": 3,
     10     "DeadlockRetryCount": 4,
     11     "DeadlockRetryInterval": 1000
     12 }
[user01@pleasanter ~]$
```

```shell
[user01@pleasanter ~]$ cd /web/pleasanter/Implem.CodeDefiner
[user01@pleasanter Implem.CodeDefiner]$ sudo dotnet Implem.CodeDefiner.NetCore.dll _rds

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

<SUCCESS> Starter.ConfigureDatabase: Database configuration has been completed.
<SUCCESS> Starter.Main: All of the processes have been completed.
[user01@pleasanter Implem.CodeDefiner]$
```

## PostgreSQL 全文検索モジュールインストール

```shell
[user01@pleasanter ~]$ sudo su - postgres
最終ログイン: 2020/06/11 (木) 6:24:36 JST日時 pts/1
-bash-4.2$ psql
ユーザ postgres のパスワード: 
psql (12.3)
"help"でヘルプを表示します。

postgres=# \c "Implem.Pleasanter";
データベース"Implem.Pleasanter"にユーザ"postgres"として接続しました。
Implem.Pleasanter=# CREATE EXTENSION pg_trgm;
CREATE EXTENSION
Implem.Pleasanter=# exit
-bash-4.2$ exit
[user01@pleasanter ~]$ 
```

## Plesanter 起動確認

### コマンドラインからの起動

この操作だと、フォアグラウンドで動作する為起動後プロンプトが返ってきません。
想定通りの動作です。

```shell
[user01@pleasanter Implem.CodeDefiner]$ cd ../Implem.Pleasanter/
[user01@pleasanter Implem.Pleasanter]$ pwd
/web/pleasanter/Implem.Pleasanter
[user01@pleasanter Implem.Pleasanter]$ sudo dotnet Implem.Pleasanter.NetCore.dll
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {8f331b3c-7cfa-44c3-9534-e34c7ff5ec84} may be persisted to storage in unencrypted form.
```

### curl コマンドでの応答確認

新しいターミナルを開いて```curlコマンド```を使って応答の確認を行います。
CentOS上でFirefoxが利用できる場合、Firefoxで```http://localhost:5000/```にアクセスして確認する事もできます。

```shell
[user01@pleasanter ~]$ curl -v http://localhost:5000/
* About to connect() to localhost port 5000 (#0)
*   Trying ::1...
* Connected to localhost (::1) port 5000 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:5000
> Accept: */*
>
< HTTP/1.1 302 Found
< Date: Sat, 30 May 2020 15:50:06 GMT
< Server: Kestrel
< Content-Length: 0
< Location: http://localhost:5000/users/login?ReturnUrl=%2F
<
* Connection #0 to host localhost left intact
[user01@pleasanter ~]$
```

### 動作確認終了

curlコマンドまたはFirefoxで動作確認ができたら、Pleasanterを起動したターミナルで```Ctrl+C```を押してPleasanterを終了します。

## Pleasanterサービス用スクリプトの作成

### サービススクリプトの作成／登録

systemdでサービスを管理する為、```/etc/systemd/system/pleasanter.service```を作成します。
作成後```systemctl daemon-reload```を実行しsystemdに反映させます。

```shell
[user01@pleasanter ~]$ sudo vi /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
[user01@pleasanter ~]$ sudo systemctl daemon-reload
[user01@pleasanter ~]$ systemctl status pleasanter.service
● pleasanter.service - Pleasanter
   Loaded: loaded (/etc/systemd/system/pleasanter.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[user01@pleasanter ~]$
```

### Pleasanterサービスの起動

```shell
[user01@pleasanter ~]$ sudo systemctl --now enable pleasanter
Created symlink from /etc/systemd/system/multi-user.target.wants/pleasanter.service to /etc/systemd/system/pleasanter.service.
[user01@pleasanter ~]$ systemctl status pleasanter
● pleasanter.service - Pleasanter
   Loaded: loaded (/etc/systemd/system/pleasanter.service; enabled; vendor preset: disabled)
   Active: active (running) since 日 2020-05-31 01:08:07 JST; 13s ago
 Main PID: 8450 (dotnet)
    Tasks: 17
   CGroup: /system.slice/pleasanter.service
           └─8450 /usr/bin/dotnet Implem.Pleasanter.NetCore.dll

 5月 31 01:08:07 pleasanter systemd[1]: Started Pleasanter.
[user01@pleasanter ~]$
```

## Firewall設定

https(443/tcp)へのアクセスを開放します。
なんとなく、httpsでのアクセスだけを許可します。

```shell
[user01@pleasanter ~]$ sudo firewall-cmd --permanent --zone=public --add-service=https
success
[user01@pleasanter ~]$ sudo firewall-cmd --reload
success
[user01@pleasanter ~]$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dhcpv6-client https ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[user01@pleasanter ~]$
```

## Nginxを使ったリバースプロキシの設定（https対応）

利用者の多いchromeでもテスト出来るように、chromeに対応したテスト用証明書を作成します。
※実際に運用する場合は正規の証明書を取得しましょう。

### サーバ証明書の作成

mkcertを使ってテスト用証明書を作成します。
```pleasanter.example.co.jp```　と入力している部分は、実際のホスト名に置き換えてください。
※ mkcert -install 実行時に、テスト用CA証明書がサーバ上の証明書ストアに配置されます。
  この為、サーバ上のブラウザでアクセスすると、証明書の警告が出ませんがこのサーバ上だけでの事です。
  本番運用で利用できる証明書ではありませんので注意しましょう。

```shell
[user01@pleasanter ~]$ sudo yum install -y nss-tools golang
[user01@pleasanter ~]$ git clone https://github.com/FiloSottile/mkcert && cd mkcert
[user01@pleasanter mkcert]$ go build -ldflags "-X main.Version=$(git describe --tags)"
[user01@pleasanter mkcert]$ ./mkcert -install
[user01@pleasanter mkcert]$ ./mkcert pleasanter.example.co.jp
Using the local CA at "/home/user01/.local/share/mkcert" ✨

Created a new certificate valid for the following names 📜
 - "pleasanter.example.co.jp"

The certificate is at "./pleasanter.example.co.jp.pem" and the key at "./pleasanter.example.co.jp-key.pem" ✅

[user01@pleasanter mkcert]$
[user01@pleasanter mkcert]$ sudo cp pleasanter.example.co.jp* /etc/pki/tls/certs/
```

## DHE用ファイルの作成

```shell
[user01@pleasanter tls]$ sudo openssl dhparam -out /etc/pki/tls/dh2048.pem -outform PEM 2048
```

### Nginxリポジトリ追加

Nginx公式サイトの手順を基にリポジトリを追加します。
[Nginx : Installation instructions](http://nginx.org/en/linux_packages.html#RHEL-CentOS)

```shell
[user01@pleasanter ~]$ sudo vi /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[user01@pleasanter ~]$
```


### Nginxインストール

```shell
[user01@pleasanter ~]$ sudo yum install -y nginx
```

### リバースプロキシの設定／起動

```shell
[user01@pleasanter ~]$ sudo vi /etc/nginx/conf.d/reverse-proxy.conf
server {
    listen        443 ssl;
    server_name   pleasanter.example.co.jp;
    keepalive_timeout 60;
    root /usr/share/nginx/html;
    server_tokens off;

    ssl_protocols  TLSv1.2;
    ssl_ciphers    HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_certificate  /etc/pki/tls/certs/pleasanter.example.co.jp.pem;
    ssl_certificate_key  /etc/pki/tls/certs/pleasanter.example.co.jp-key.pem;
    ssl_dhparam /etc/pki/tls/dh2048.pem;
    ssl_session_cache   shared:SSL:10m; ## 1MB = about 4000 sessions
    ssl_session_timeout 10m;

    location / {
	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-Proto https;
	proxy_set_header X-Forwarded-Host $host;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

	proxy_redirect http:// https://;

	proxy_pass http://localhost:5000;
    }
}
[user01@pleasanter ~]$ sudo systemctl enable --now nginx
```

## SELinuxのアクセス許可

Nginxからpleasanterへの通信を許可するための設定を行います。
面倒だったら、SELinuxを無効にしても良いかしれません。

```shell
[user01@pleasanter ~]$ sudo setsebool -P httpd_can_network_connect 1 -P
```

### 初期ID／パスワード

|設定項目|初期値|備考|
|:-:|:-:|:-:|
|管理アカウント |administrator | |
|初期パスワード| pleasanter | 初回ログイン時に変更を求められます|

<img width="533" alt="スクリーンショット 2020-06-06 21.00.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560759/09af991b-7a70-6f90-5967-adea5e4a1e25.png">

## リマインダー設定（動かせてない）

設定通りreboot後、実行されますがすぐに終了しちゃってます。
起動方法を変更した方がいいのかな、、、あとで考えよう。

### ホスト名・TLS利用設定

９行目にプロトコルとホスト名を設定
１０行目にTLSオプションを設定

```shell
[user01@pleasanter ~]$ sudo vi /web/pleasanter/Tools/Reminder.py

      8         urllib.request.urlopen(
      9             urllib.request.Request("https://pleasanter.exxample.co.jp/pleasanter/reminderschedules/remind?NoLog=1")
     10             , context=ssl.SSLContext(ssl.PROTOCOL_TLS))   #If you must use TLS, change 'None' to 'ssl.SSLContext(ssl.PROTOCOL_TLS)'.
     11         print(str(datetime.now()) + ": success")

[user01@pleasanter ~]$
```

### Python3.6 のインストール

リマインダはpython３.6で書かれてるみたいです。

```shell
[user01@pleasanter ~]$ sudo yum install -y python36
```

### cronの設定

```shell
[user01@pleasanter ~]$ sudo crontab -e
@reboot python3 /web/pleasanter/Tools/Reminder.py

[user01@pleasanter ~]$
```

## メールサーバ設定（送れてない）

メールサーバだけ設定してみたけど、まだメールは送れてません。
出来たら記事を更新します。
[Pleasanter Mail関連設定](https://pleasanter.net/fs/publishes/422367/edit)

```shell
[user01@pleasanter pleasanter]$ sudo vi /web/pleasanter/Implem.Pleasanter/App_Data/Parameters/Mail.json
{
    "SmtpHost": "localhost",
    "SmtpPort": 25,
    "SmtpUserName": null,
    "SmtpPassword": null,
    "SmtpEnableSsl": false,
    "FixedFrom": null,
    "AllowedFrom": null,
    "SupportFrom": "\"Pleasanter.org\" <support@pleasanter.org>",
    "InternalDomains": "",
    "AddressValidation": "\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]+\\b"
}
[user01@pleasanter pleasanter]$ sudo systemctl restart pleasanter
```
## まだ出来てない事

* Reminderが動かない。（手動では動くから、起動方法を考えよう。）
* メール送信が出来ていない。