プリザンターを AWS EC2（Ubuntu 20.04）に構築

プリザンターを試すために、AWS上に環境構築を行ってみる。  
公式サイト([こちら](https://pleasanter.org/manual/2691749)）の手順に従って進める。

## 前提

- EC2インスタンス(Ubuntu20.04)の作成が完了していること。
- 固定IP(Elastic IP)はお任せ。
- SSHで接続できること。

## 今回やらないこと
- SSL対応
- RDS

## パッケージの更新

```
sudo apt -y update
sudo apt -y upgrade
```

## アカウント作成

```
sudo adduser pleasanter-dev
パスワード： developer
sudo gpasswd -a pleasanter-dev sudo

su - pleasanter-dev
ssh-keygen -t rsa
mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
```

## ホスト名変更

```
sudo hostnamectl set-hostname pleasanter-srv
```

## .Net Coreのインストール

### Gitのインストール

```
sudo apt-get -y install git
sudo apt-get update
```

### Microsoftパッケージリポジトリを有効にする

```
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update
```

### .NET Core SDK 3.1のインストール

```
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt install -y dotnet-sdk-3.1
sudo apt-get update
```

### GDI+のインストール

```
sudo apt install -y libgdiplus
sudo apt update
```

## PostgreSQLのセットアップ
### PostgreSQLのインストール
一旦EC2上に構築する。RDSへのセットアップは後日。。

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

### PostgreSQLの認証方式の設定

- /etc/postgresql/12/main/pg_hba.confを開き、METHODの"ident"を"md5", "peer"を"trust"に変更します。

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

2021/07/09時点では、md5になっていた。

### PostgreSQLのログ出力設定

- /etc/postgresql/12/main/postgresql.confを開き、以下の設定を編集します。

```
sudo vi /etc/postgresql/12/main/postgresql.conf
```

- 設定内容

```
log_destination = 'stderr'
logging_collector = on
log_line_prefix = '[%t]%u %d %p[%l]'
```

### PostgreSQLのサービス再起動、サービス化

```
sudo systemctl restart postgresql
```

### PostgreSQLユーザの設定

```
sudo su - postgres
psql -U postgres

postgres=# alter role postgres with password 'postgres';
```

### プリザンター用のデータベース作成

```
postgres=# create database "Implem.Pleasanter";
```

### 全文検索用モジュール（pg_trgm）のインストール

```
postgres=# \c "Implem.Pleasanter"
Implem.Pleasanter=# create extension pg_trgm;
```

## Pleasanterの導入
### アプリケーションの準備(.NET Core版Pleasanterをダウンロード)

```
su - pleasanter-dev
wget https://pleasanter.org/downloads/Pleasanter.NetCore_1.1.35.0.zip
sudo apt-get install -y unzip
```

`/web`配下に解凍する。

```
sudo mkdir /web
sudo chmod 777 /web
cd /web
unzip ~/Pleasanter.NetCore_1.1.35.0.zip
```

### データベースの構成

/web/pleasanter/Implem.Pleasanter/App_Data/Parameters/Rds.json を以下のように設定します。  

```
vi /web/pleasanter/Implem.Pleasanter/App_Data/Parameters/Rds.json
```

- 設定内容

```
{
       "Dbms": "PostgreSQL",
       "Provider": "Local",
       "TimeZoneInfo": "Tokyo Standard Time",
       "SaConnectionString":"Server=localhost;Port=5432;Database=postgres;UID=postgres;PWD=postgres",
       "OwnerConnectionString":"Server=localhost;Port=5432;Database=#ServiceName#;UID=#ServiceName#_Owner;PWD=postgres",
       "UserConnectionString":"Server=localhost;Port=5432;Database=#ServiceName#;UID=#ServiceName#_User;PWD=postgres",
       "SqlCommandTimeOut": 600,
       "MinimumTime": 3,
       "DeadlockRetryCount": 4,
       "DeadlockRetryInterval": 1000
}
```

### CodeDefinerの実行

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

### Pleasnterの起動確認

```
cd /web/pleasanter/Implem.Pleasanter
dotnet Implem.Pleasanter.NetCore.dll
```

別のターミナルで以下のコマンドを実行し、Pleasanterが起動していることを確認する。

```
curl -v http://localhost:5000/
```

- 出力内容

```
*   Trying 127.0.0.1:5000...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 5000 (#0)
> GET / HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 302 Found
< Date: Sat, 10 Jul 2021 00:19:02 GMT
< Server: Kestrel
< Content-Length: 0
< Location: http://localhost:5000/users/login?ReturnUrl=%2F
< X-Frame-Options: SAMEORIGIN
< X-Xss-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< 
* Connection #0 to host localhost left intact
```

「Ctrl+C」で終了する。

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

/etc/systemd/system/pleasanter.service を以下の内容で作成します。

```
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
``` 

### サービスとして登録・サービスの起動

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

## リバースプロキシ（NginX）の導入
### NginXのインストール

```
sudo apt install -y nginx
sudo systemctl enable nginx
```

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

/etc/nginx/conf.d/pleasanter.conf を以下の内容で作成する。

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

- 設定内容

```
server {
    listen  80;
    server_name xxx.xxx.xxx.xxx;
    client_max_body_size 100M;
    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 行には実際アクセスする際のホスト名を指定する。**

ファイルを作成後、サービスを再起動

```
sudo systemctl restart nginx
```

### Http(80) へのアクセス許可

Http（port:80）へのアクセス許可設定

```
sudo ufw allow 80/tcp
```

システム起動時にファイアウォール有効化

```
sudo ufw enable
```

## 動作確認

`http://server_name`にアクセスし、以下の画面が表示されればOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1742664/24411114-3e7a-efbd-7319-97147471dd99.png)

## その他設定
### 初期アカウント

ログインID：Administrator
パスワード：pleasanter

### リマインダーの設定
#### クライアント要求受信設定
/web/pleasanter/Tools/Reminder.py の "localhost" 部分をクライアントからアクセス可能なURLに変更する。

```
su - pleasanter-dev
vi /web/pleasanter/Tools/Reminder.py
```

- 設定内容

```
- urllib.request.Request("http://localhost/reminderschedules/remind?NoLog=1")
+ urllib.request.Request("http://server-name/reminderschedules/remind?NoLog=1")
```

SSL環境下では、`https`にする。

#### 「Python3.6」をインストール

```
sudo apt install -y python3-pip
```

#### Reminder.py を cron に登録

```
sudo crontab -e
@reboot python3 /web/pleasanter/Tools/Reminder.py
```

- 設定内容

```
*  *  *  *  * @reboot python3 /web/pleasanter/Tools/Reminder.py
```

## Appendix

https://qiita.com/mindwood/items/8f3cf5d1ce088420ec71#linux%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A

## 感想

公式の手順通りで問題なく完了しました！