プリザンターをAzure App Serviceにサーバレス構成でインストールする(Azure Database for MySQL利用)
**Azure Database for MySQLにおいてMySQL8.4は2025年5月時点では正式リリースされておらず、パブリックプレビューの位置付けです。ご使用の際は十分にご注意ください。**
## 概要
Microsoft Azure の App Service と Microsoft Azure Database for MySQL を利用しサーバレス構成でプリザンターの動作環境を構築するための手順を示したものです。
| 対象 | 環境・バージョン |
| ------------------ | :--------------------------- |
| Web | Microsoft Azure App Service |
| DB | Microsoft Azure Database for MySQL<br>(MySQL8.4 LTS) |
| ランタイムスタック | .NET 10 |
| Pleasanter | 1.5.0.0 以降 |
## 注意事項
CodeDefinerに引数を指定しないで実行した場合、言語:英語、タイムゾーン:UTCでセットアップされますので、必要に応じて言語とタイムゾーンをご指定ください。
## 前提条件
1. Azure Portal へのログインが可能であること
1. Microsoft Azure App Service(Windows/.NET 10)が 1 インスタンス準備できている
1. Microsoft Azure Database for MySQL が 1 インスタンス準備できている
1. Microsoft Azure Database for MySQL のサーバ名、管理ユーザ名、管理ユーザパスワードが準備できている
1. Microsoft Azure Database for MySQL のファイアウォール設定で App Service 及び PC からの接続が許可されている
## 手順
構築手順は以下の通りです。
1. 事前準備
1. .NETの設定
1. Azure Database for MySQLのサーバー パラメータ変更
1. プリザンターのダウンロードおよびパラメータ設定
1. プリザンターの配置
1. CodeDefinerの実行
1. プリザンターの起動確認
## 1. .NET の設定
1. [Azure Portal](https://portal.azure.com/)に接続します。
1. App Service を開きます。

1. 作成済みの App Service インスタンスを選択します。
1. 「構成」メニューの「全般設定」を開き、下図の通り設定します。


|番号|項目|設定内容|
|:-:|:--|:--|
|1|構成 (プレビュー)|クリックして選択します|
|2|全般設定|クリックして選択します|
|3|プラットフォーム|64bit|
|4|FTPの状態|無効|
|5|Always On|オン(※常時接続と表示されることがあります)|
|6|スタック設定|クリックして選択します|
|7|スタック|.NET|
|8|.NETのバージョン|.NET 10 (LTS)
## 2. Azure Database for MySQLのサーバー パラメータ変更
1. [Azure Portal](https://portal.azure.com/)に接続します。
1. Azure Database for MySQLを開きます。

1. 作成済みの Microsoft Azure Database for MySQL インスタンスを選択します。
1. 「設定」メニューの「サーバパラメータ」を開きます。
1. 「すべて」タブをクリックします。
1. 「sql_generate_invisible_primary_key」を検索します。
1. 「sql_generate_invisible_primary_key」を「OFF」に設定します。

1. 上部の「保存」ボタンをクリックします。
## 3. プリザンターのダウンロードおよびパラメータ設定
1. [ダウンロードセンター](https://pleasanter.org/dlcenter)から、プリザンター最新バージョンをダウンロードします。
1. ダウンロードしたzipファイルを解凍します。
1. パラメータファイルを設定します。
1. データベースへの接続情報を設定します。
「pleasanter\Implem.Pleasanter\App_Data\Parameters\Rds.json」を開き、パラメータを下記の通りに設定し、保存します。
|パラメータ名|値|説明|
|:--|:--|:--|
|Dbms|MySQL|リレーショナル・データベースに Microsoft Azure Database for MySQL を使用。|
|Provider|Local|リレーショナル・データベースに Microsoft Azure Database for MySQL を使用。|
|SaConnectionString|**\*\*\*\***|手順3.3.2の通り設定。|
|OwnerConnectionString|**\*\*\*\***|手順3.3.3の通り設定。|
|UserConnectionString|**\*\*\*\***|手順3.3.4の通り設定。|
|SqlCommandTimeOut|0|SQL コマンドタイムアウト時間を無期限にする。|
|MinimumTime|3|データベースが識別可能な最小時間単位をミリ秒で指定。本パラメータは変更不可。|
|DeadlockRetryCount|4|デッドロック発生時の最大再試行回数。|
|DeadlockRetryInterval|1000|デッドロック発生時に再試行を行うまでの間隔。|
|DisableIndexChangeDetection|true|バージョンアップ時にデータベースのインデックスの差異を検出しない。|
|SysLogsSchemaVersion|2|[システムログの拡張機能](/en/manual/syslog-extension)を利用する。|
|MySqlConnectingHost|%|App Serviceのホストから接続を許可するためワイルドカードを指定。|
1. 接続文字列SaConnectionStringは下記の通りに設定します。
|内容|設定例|詳細|
|:--|:--|:--|
|Server|{ServerName}.mysql.database.azure.com|Microsoft Azure Database for MySQLのサーバ名。|
|Port|3306|Microsoft Azure Database for MySQLのポート番号。|
|Database|mysql|mysql固定。|
|UID|{UserName}|Microsoft Azure Database for MySQLの管理ユーザ名。|
|PWD|{Password}|Microsoft Azure Database for MySQLの管理ユーザパスワード。|
接続文字列SaConnectionStringの設定例:
```text
Server={ServerName}.mysql.database.azure.com;Port=3306;Database=mysql;UID={UserName};PWD={Password}
```
1. 接続文字列OwnerConnectionStringは下記の通りに設定します。
|内容|設定例|詳細|
|:--|:--|:--|
|Server|{ServerName}.mysql.database.azure.com|Microsoft Azure Database for MySQLのサーバ名。|
|Port|3306|Microsoft Azure Database for MySQLのポート番号。|
|Database|#ServiceName#|Service.jsonのName。#ServiceName#はService.jsonのNameを参照するプレースホルダー。|
|UID|#ServiceName#_Owner|CodeDefinerで作成する任意のユーザ名。#ServiceName#はService.jsonのNameを参照するプレースホルダー。|
|PWD|SetAdminsPWD|CodeDefinerで設定する任意のユーザのパスワード。|
接続文字列OwnerConnectionStringの設定例:
```text
Server={ServerName}.mysql.database.azure.com;Port=3306;Database=#ServiceName#;UID=#ServiceName#_Owner;PWD=SetAdminsPWD
```
1. 接続文字列UserConnectionStringは下記の通りに設定します。
|内容|設定例|詳細|
|:--|:--|:--|
|Server|{ServerName}.mysql.database.azure.com|Microsoft Azure Database for MySQLのサーバ名。|
|Port|3306|Microsoft Azure Database for MySQLのポート番号。|
|Database|#ServiceName#|Service.jsonのName。#ServiceName#はService.jsonのNameを参照するプレースホルダー。|
|UID|#ServiceName#_User|CodeDefinerで作成する任意のユーザ名。#ServiceName#はService.jsonのNameを参照するプレースホルダー。|
|PWD|SetUsersPWD|CodeDefinerで設定する任意のユーザのパスワード。|
接続文字列UserConnectionStringの設定例:
```text
Server={ServerName}.mysql.database.azure.com;Port=3306;Database=#ServiceName#;UID=#ServiceName#_User;PWD=SetUsersPWD
```
## 4. プリザンターの配置
1. App Service にてインスタンスを停止します。
1. [Kudu](https://docs.microsoft.com/ja-jp/azure/app-service/resources-kudu#access-kudu-for-your-app) にアクセスします。
1. App Service の左側のメニューの"開発ツール"から「高度なツール」をクリック

2. [移動](/en/manual/table-record-move)のリンクをクリック

3. Kudu のヘッダメニューから「Debug console」>「CMD」をクリック

4. ディレクトリ一覧から「site」をクリックします。選択後、プロンプトが "C:\home\site" になったことを確認します。(ご利用ユーザによってはD:\home\siteの場合もあります。その場合は適宜読み替えてください。)

1. 「2. プリザンターのダウンロードおよびパラメータ設定」で準備したプリザンターファイルをApp Serviceにアップロードします。
1. 「pleasanter」フォルダに移動します。
2. 「Implem.Pleasanter」フォルダを「wwwroot」にリネームします。
3. wwwroot フォルダを zip 形式で圧縮し「wwwroot.zip」とします。
4. 「Implem.CodeDefiner」フォルダを[CodeDefiner](/en/manual/codedefiner-command)にリネームします。
5. CodeDefiner フォルダを zip 形式で圧縮し「CodeDefiner.zip」とします。
6. wwwroot.zip と CodeDefiner.zip を Kudu の Size をターゲットにドラッグアンドドロップし、展開されて格納されたことを確認します。

## 5. CodeDefiner の実行
1. Kudu のディレクトリ一覧から CodeDefiner を選択し、 プロンプトが C:\home\site\CodeDefiner となることを確認します。
2. 以下のコマンドを実行して、CodeDefinerを実行します。
※下記コマンドは初回インストール時にのみ実行します。
```
dotnet Implem.CodeDefiner.dll _rds /p C:\home\site\wwwroot /l "<言語>" /z "<タイムゾーン>"
```
|引数|設定例|説明|
|:--|:--|:--|
|/l|ja|Service.jsonのDefaultLanguageの値を書き換えます(※1)|
|/z|Tokyo Standard Time|Service.jsonのTimeZoneDefaultの値を書き換えます(※1)|
(※1) 言語、タイムゾーンは以下マニュアルページを参照ください。
[FAQ:プリザンターでサポートしている言語とタイムゾーンのパラメータの設定値を知りたい](https://pleasanter.org/manual/faq-supported-language)
日本語環境でご利用する場合は以下コマンドとなります。
```
dotnet Implem.CodeDefiner.dll _rds /p C:\home\site\wwwroot /l "ja" /z "Tokyo Standard Time"
```
## 6. プリザンターの起動確認
1. App Serviceにてインスタンスを起動します。
1. ブラウザでプリザンターのログイン画面を開き、「ログインID: Administrator」、「初期パスワード: pleasanter」を入力し、「ログイン」ボタンをクリックします。

1. ログイン後に「Administrator」ユーザーのパスワード変更を求められるので、任意のパスワードを入力し、「変更」ボタンをクリックします。
