Pleasanter .NetCore版 インストール（CentOS7 .NetCore2.2 SQL Server 2019 ）

# この記事に書いてある事

2020/6 追記：.NetCore3.1/PostgreSQLへの対応がアナウンスされました。
[公式のアナウンス：PostgreSQL対応版をリリースいたしました。](https://pleasanter.org/archives/7155)

.NetCore3.1対応版のインストール手順はこちら
[Pleasanter with PostgreSQL を CentOS7 にインストールしてみる \- Qiita](https://qiita.com/kichise/items/8cb8674916d8c1c7329a)
[CentOS8 にPleasanter With PostgreSQLをインストールしてみる。 \- Qiita](https://qiita.com/kichise/items/1b6b62d78feaaf5f55f8)

----

出来るだけ新しい環境で Plesanterを動かしたい。
で、
**2020/1/5 時点では Pleasanter は .NetCore 3.1 未対応** .NetCore2.2 で我慢
**.NetCore3.1/SQL Server 2019 は CentOS8 未対応** CentOS7で我慢
**CentOS7 ならSQL Server 2019が動きそう** 

Pleasanter公式が配布している .NetCore版を利用した導入手順です。(Buildしません)
Pleasanter公式のインストール手順をLinux向けに少し整理してインストール ＋ 以下手順を追加した作業ログです。

* systemctl で起動を制御する為の設定ファイル例  
  システム起動と一緒に Pleasanterを起動する設定の例
* NginX を使ったリバースプロキシ設定  
  Port 80 で外部公開する為の設定例
* Firewalld でのアクセス許可設定  
  外部からPleasanterへのアクセスを許可する為の設定

## 動作環境

|必要なパッケージ|動作環境|延長サポート終了日|
|:--:|:--:|:--:|
|[.NetCORE 2.2](https://dotnet.microsoft.com/download/dotnet-core/2.2)|RHEL 6 x64<br>RHEL/CentOS/Oracle 7 x64<br>Fedora28,29<br>Debian9<br>Ubuntu 16.04,18.04,18.10<br>Linux Mint 17,18<br>OpenSUSE 15+<br>SLES 12 SP2+<br>Alpine Linux 3.7+<br>MacOS 10.12+|2019年12月23日でサポート切れ|
|[SQL Server 2019](https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-overview?view=sql-server-linux-ver15)|RHEL 7.3,7.4,7.5,7.6 <br>SUSE Linux Enterprise Server v12 SP2,SP3,SP4<br>Ubuntu16.04<br>[Docker](https://docs.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker?view=sql-server-linux-ver15&pivots=cs1-bash)|リリース後6～10年が適用されるはず<br>2025年～2029年|
|[Microsoft ODBC Driver 17 for SQL Server](https://docs.microsoft.com/ja-jp/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15)|Debian 8,9,10<br>RHEL 6,7,8<br>SUSE Linux Enterprise Server 11 SP4,12,15<br>Ubuntu 14.04,16.04,18,04,18,10,19.04<br>MacOS| 不明 |
|[Pleasanter](https://pleasanter.org/dl-select)| － |

Ubuntuを利用する場合、全ての条件を満たすには Ubuntu16.04 を選択するのが良さそうです。([工夫すれば](https://blogs.msdn.microsoft.com/sql_server_team/installing-sql-server-2017-for-linux-on-ubuntu-18-04-lts/)18.04でも動くみたいです)
RedHatEnterpriseLinux(RHEL)であれば妥当ないろいろなバージョンを選べそうですが、RHEL8にはまだ対応していません。
また、CentOSはSQLServerの動作環境に含まれていませんが [FAQ](https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-faq?view=sql-server-linux-ver15) で動作するだろう。とコメントされています。で、実際動作してます。
妥当なバージョンのOSと導入ハードルの低さから CentOS7 を利用する事にしました。

## 導入の流れ

* OS導入：今回はCentOS7系がインストールされている物として進めます
* .NetCORE 2.2 導入
* SQL Server 2019 導入
* MS SQL Server Command Line Tools の導入
* Microsoft ODBC Driver 17 for SQL Server 導入
* GDI+ 導入  
* SQL Server 2019の構成
* Pleasanter の実行
* 動作確認
* リバースプロキシの設定
* Firewalld の設定
* 送信用メールサーバ設定
* 追加設定(Reminder機能/Backupスクリプト)

## .NetCORE 2.2 の導入

``` text
$ sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
$ sudo yum -y update
$ sudo yum -y install dotnet-sdk-2.2
```

## SQL Server 2019 の導入

MS SQL Server 導入


```text
$ sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2019.repo
$ sudo yum -y install mssql-server
```

MS SQL初期セットアップ

```text
$ sudo /opt/mssql/bin/mssql-conf setup
usermod: 変更はありません
SQL Server のエディションを選択します:
  1) Evaluation (無料、製品使用権なし、期限 180 日間)
  2) Developer (無料、製品使用権なし)
  3) Express (無料)
  4) Web (有料)
  5) Standard (有料)
  6) Enterprise (有料) - CPU Core utilization restricted to 20 physical/40 hyperthreaded
  7) Enterprise Core (有料) - CPU Core utilization up to Operating System Maximum
  8) 小売販売チャネルを介してライセンスを購入し、入力するプロダクト キーを持っています。

エディションの詳細については、以下を参照してください
https://go.microsoft.com/fwlink/?LinkId=852748&clcid=0x411

このソフトウェアの有料エディションを使用するには、個別のライセンスを以下から取得する必要があります
Microsoft ボリューム ライセンス プログラム。
有料エディションを選択することは、
このソフトウェアをインストールおよび実行するための適切な数のライセンスがあることを確認していることになります。

エディションを入力してください(1-8): 3
この製品のライセンス条項は
/usr/share/doc/mssql-server で参照できるほか、次の場所からダウンロードすることもできます:
https://go.microsoft.com/fwlink/?LinkId=855862&clcid=0x411

プライバシーに関する声明は、次の場所で確認できます:
https://go.microsoft.com/fwlink/?LinkId=853010&clcid=0x411


SQL Server の言語の選択:
(1) English
(2) Deutsch
(3) Espanol
(4) Francais
(5) Italiano
(6) 日本語
(7) ???
(8) Portugues
(9) Русский
(10) 中文 ? ?体
(11) 中文 （繁体）
オプション 1-11 を入力: 6
SQL Server システム管理者パスワードを入力してください: <管理者パスワードを設定>
SQL Server システム管理者パスワードを確認入力してください:
SQL Server を構成しています...

ForceFlush is enabled for this instance.
ForceFlush feature is enabled for log durability.
セットアップは正常に完了しました。SQL Server を起動しています。
$
$ systemctl status mssql-server
```

システム管理者パスワード（SAパスワード）には強力な文字列を指定しましょう。

## MS SQL Server Command Line Tools の導入

unixODBCの更新とmssql-tools の導入
17.3以降で SQL Server 2019をサポートしています。導入されているバージョンに注意しましょう。

```text
$ sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/7/prod.repo
$ sudo yum remove unixODBC-utf16 unixODBC-utf16-devel
削除対象が存在しない場合もあります。気にせず次に進んでください。
$ sudo yum install -y mssql-tools unixODBC-devel

以下の質問が 2回あります "YES" を応答してください
Do you accept the license terms? (Enter YES or NO)
YES
```

## Microsoft ODBC Driver 17 for SQL Server 導入

MS SQL Server Command Line Tools と同時に msodbcsql も導入済みなので省略

## GDIのインストール

GDI+互換のAPI をインストールします

```text
$ sudo yum install -y epel-release
$ sudo yum install -y libgdiplus
```

## Pleasanter導入

### 実行ファイルの配置

[公式のダウンロードサイト](https://pleasanter.org/dl-select)から入手してください。
簡単なアンケートがあるので記入しましょう。
入手したファイルを適当な位置に展開後、Rds.json の SaConnectionString 行内にある SetSaPWD を SQL Server の管理者パスワードに置き換えてください。

```text
$ sudo mkdir /Pleasanter
$ unzip -q Pleasanter.NetCore.1.0.0.0.zip
$ sudo mv Pleasanter/* /Pleasanter/
$ sudo vi /Pleasanter/Pleasanter.NetCore/Implem.Pleasanter/App_Data/Parameters/Rds.json
{
    "Provider": "Local",
    "TimeZoneInfo": "Tokyo Standard Time",
    "SaConnectionString": "Server=(local);Database=master;UID=sa;PWD=SetSaPWD;Connection Timeout=30;",
    "OwnerConnectionString": "Server=(local);Database=#ServiceName#;UID=#ServiceName#_Owner;PWD=SetAdminsPWD;Connection Timeout=30;",
    "UserConnectionString": "Server=(local);Database=#ServiceName#;UID=#ServiceName#_User;PWD=SetUsersPWD;Connection Timeout=30;",
    "SqlCommandTimeOut": 600,
    "MinimumTime": 3,
    "DeadlockRetryCount": 4,
    "DeadlockRetryInterval": 1000
}
$
```

### Pleasanter用DBの構成
```text
$ cd /Pleasanter/Pleasanter.NetCore/Implem.CodeDefiner/
$ dotnet Implem.CodeDefiner.NetCore.dll _rds
```
### Pleasanter 起動確認

起動が確認出来たら Ctrl + C で終了してください。

```text
$ cd ../Implem.Pleasanter/
$ dotnet Implem.Pleasanter.NetCore.dll
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {a11dba1c-f2da-4782-ae6d-ace09095eeac} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /Pleasanter/Pleasanter.NetCore/Implem.Pleasanter
Now listening on: http://localhost:5000
Now listening on: https://localhost:5001
Application started. Press Ctrl+C to shut down.
```

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

OS起動時に Pleasanter を自動起動させるためサービススクリプトを作成します。

```text
$ 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 --urls=http://localhost:5000
WorkingDirectory = /Pleasanter/Pleasanter.NetCore/Implem.Pleasanter
Restart = always
RestartSec = 10
User = root
Group = root
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy = multi-user.target

$ sudo systemctl daemon-reload
$ sudo systemctl start pleasanter
$ sudo systemctl enable pleasanter
```

## リバースプロキシ(NginX)の設定

通常のwebサーバを同じ Port80 でアクセス出来るようにリバースプロキシの設定を行います。
ここでは紹介しませんが、https化する場合もリバースプロキシを使うと簡単だと思います。

* 設定例の server_name 行には 実際アクセスする時のホスト名を指定してください。

```text
$ sudo vi /etc/nginx/conf.d/pleasanter.conf

server {
        listen  80;
    server_name   pleasanter.example.com;
    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;
    }
}

$ sudo sysetmctl restart nginx
```

## Firewalld の設定

クライアントからWebサービスへのアクセスさせるため 80/tcp(http) へのアクセス許可設定を追加します。

```text
有効なzoneを確認
$ sudo firewall-cmd --get-active-zone
public
  interfaces: enp1s0

Firewallのルールを確認
$ sudo firewall-cmd --list-all

Port 80/tcpの保護を解除します
$ sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
success
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
```

## 送信用メールサーバ設定

* SmtpHost に 送信に利用するメールサーバを指定します。  
その他の項目は必要に応じて設定してください。  
なお、設定変更後はPleasanterの再起動が必要です。

[Pleasanter Mail関連設定](https://github.com/Implem/Implem.Pleasanter/wiki/%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E8%A8%AD%E5%AE%9A%EF%BC%9AMail.json)

```text
$ sudo vi /Pleasanter/publish/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"
}
```

## Reminder設定

### Python36,pyodbc の導入/Reminderの設定

* EPEL リポジトリを登録しているのでyumで導入出来ます。  
python36はReminder、pyodbcはbackupで使用します。

```text
$ sudo yum -y install python36
$ sudo mkdir /Pleasanter/tools
$ sudo cp -P /Pleasanter/Implem.Pleasanter.NetCore/Tools/Reminder.py /Pleasanter/tools/
$ sudo vi /Pleasanter/tools/Reminder.py

localhost 部分をクライアントからアクセス出来るホスト名に変更する
urllib.request.Request("http://localhost/pleasanter/reminderschedules/remind?NoLog=1")

cron 設定
$ sudo crontab -e
@reboot python3 /opt/pleasanter-tools/Reminder.py

$ python3 /opt/pleasanter-tools/Reminder.py
```

## MS SQLのバックアップスクリプト設置

python3 で実行すると pyodbcが無いと怒られる。
python で実行すると、epelから導入したpyodbcが利用出来るのか正常に動作しました。

```text
$ sudo yum -y install pyodbc
$ sudo vi /Pleasanter/Implem.Pleasanter.NetCore/Tools/DbBackup.py

以下の行に sa パスワードを設定してください
pwd = "SetSaPWD"

$ python /Pleasanter/Implem.Pleasanter.NetCore/Tools/DbBackup.py
Backedup: /var/opt/mssql/data/backup/Implem.Pleasanter/20190815_121020.bak
Shrinked: Implem.Pleasanter
$
```

## 初期アカウント情報

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

## メモ

### saパスワードのリセット方法

作業中に困ったのでメモ

```text
$ sudo systemctl stop mssql-server
$ sudo /opt/mssql/bin/mssql-conf set-sa-password
SQL Server システム管理者パスワードを入力してください:　<新しい管理者パスワード>
SQL Server システム管理者パスワードを確認入力してください:
SQL Server を構成しています...

ForceFlush is enabled for this instance.
ForceFlush feature is enabled for log durability.
システム管理者パスワードが変更されました。
'sudo systemctl start mssql-server' を実行して SQL Server を起動してください。
$
```