# 02 設定一覧

システムの挙動を決める設定ファイル・パス・権限を整理する。ここに記載のファイルを変更すると動作に影響するため、修正時は事前にバックアップを取得すること。

---

## 1. nginx 設定

### 1.1 サイト設定

- ファイル: `/etc/nginx/sites-available/default`
- 有効化リンク: `/etc/nginx/sites-enabled/default`
- 役割: `app.hada-check.com` の 443（HTTPS）で受けて、すべてのリクエストを `http://127.0.0.1:8000` (PM2 で常駐する PHP Built-in Server) へリバースプロキシ。80番ポートは 443 へリダイレクト。

**現行の実際の設定内容:**

```nginx
server {
    server_name app.hada-check.com;

    client_max_body_size 100M;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cookie_path / /;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/app.hada-check.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app.hada-check.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    # HTTP → HTTPS リダイレクト（Certbot が自動追加）
    if ($host = app.hada-check.com) {
        return 301 https://$host$request_uri;
    }
    listen 80;
    server_name app.hada-check.com;
    return 404;
}
```

- アップロード上限は `client_max_body_size 100M`
- 変更後は `sudo nginx -t && sudo systemctl reload nginx`

### 1.2 アプリ同梱 `.htaccess` について

`/home/skin/asp.hada-check.com/.htaccess` が存在するが、本構成は Apache ではないため **実行時には評価されない**（nginx は `.htaccess` を読まない）。同ファイル内の `upload_max_filesize 512M` などは効かないため、アップロード上限は以下の 2 箇所で制御する。

1. nginx: `client_max_body_size`
2. PHP: PM2 起動コマンドに付与する `-d upload_max_filesize=... -d post_max_size=...`

---

## 2. PHP 設定

### 2.1 バージョンと実行形態

- PHP 8.3 CLI で内蔵サーバー (`php -S`) を起動する運用。
- 参照される ini ファイルは `/etc/php/8.3/cli/php.ini`（`php -i | grep "Loaded Configuration File"` で確認可）。
- `libapache2-mod-php` は**使用していない**。

### 2.2 起動コマンド（PM2 経由）

```
php -d upload_max_filesize=64M \
    -d post_max_size=256M \
    -S localhost:8000 \
    -t /home/skin/asp.hada-check.com
```

`-d` で指定している値が現行のアップロード上限。必要に応じてここを書き換え、`pm2 restart skin` で反映する。

### 2.3 PHP ini の設定値

**現行 CLI 環境の実測値:**

| キー | 現行値 | 備考 |
| --- | --- | --- |
| `memory_limit` | `-1`（無制限） | PHP CLI デフォルト。PM2 から `-d` で上書き可能 |
| `max_execution_time` | `0`（無制限） | PHP CLI デフォルト。タイムアウトなし |
| `upload_max_filesize` | PM2 起動コマンドで `64M` 指定 | PHP CLI デフォルト値より PM2 の `-d` 指定が優先 |
| `post_max_size` | PM2 起動コマンドで `256M` 指定 | 同上 |

**推奨 ini 値（Web サーバー運用向けの参考値）:**

| キー | 推奨値 | 変更が必要になる条件 |
| --- | --- | --- |
| `memory_limit` | 128M 以上 | PDF 生成時に画像が多い場合はメモリ不足になる可能性。512M 程度まで増やすことを検討 |
| `max_execution_time` | 300 | 画像解析・PDF 生成の待ち時間を考慮。ZIPの枚数が多い場合はさらに延長が必要になる可能性あり |
| `default_charset` | UTF-8 | — |
| `date.timezone` | Asia/Tokyo | — |

**補足:** 現行は CLI モード（`php -S`）のため `memory_limit` と `max_execution_time` がデフォルトで無制限。再構築時に Web サーバー（Apache/FPM）へ移行する場合は上記推奨値を明示的に設定すること。

### 2.4 必須拡張

`mysqli`, `mbstring`, `gd`, `zip`, `xml`, `fileinfo`。
CLI 版の PHP に入っていることを `php -m` で確認する。

---

## 3. PM2 設定

### 3.1 プロセス情報

| 項目 | 値 |
| --- | --- |
| プロセス名 | `skin` |
| 実行ユーザー | `skin` |
| cwd | `/home/skin/asp.hada-check.com` |
| script | `/usr/bin/bash` |
| script args | `-c php -d upload_max_filesize=64M -d post_max_size=256M -S localhost:8000 -t .` |
| 標準出力ログ | `/home/skin/.pm2/logs/skin-out.log` |
| エラー出力ログ | `/home/skin/.pm2/logs/skin-error.log` |
| プロセス定義ダンプ | `/home/skin/.pm2/dump.pm2` |

### 3.2 登録・保存

初回登録例:

```bash
cd /home/skin/asp.hada-check.com
pm2 start bash --name skin -- -c "php -d upload_max_filesize=64M -d post_max_size=256M -S localhost:8000 -t ."
pm2 save
```

### 3.3 サーバー再起動時の自動起動

`pm2 startup` で systemd ユニットを生成する運用。

```bash
pm2 startup systemd -u skin --hp /home/skin
# 表示された sudo コマンドを実行する
pm2 save
```

`dump.pm2` に保存された状態が `systemctl start pm2-skin` 時に復元される。

---

## 4. アプリケーション設定

### 4.1 環境モード切替

- ファイル: `lib/environment.php`
- 定義: `Environment::MODE`
- 取り得る値: `PRODUCTION` / `STAGING` / `DEVELOPMENT`
- モードに応じて `lib/environments/{production|staging|development}.php` が読み込まれる。

### 4.2 本番環境設定

- ファイル: `lib/environments/production.php`
- 主な項目:

| 定数 | 現行値 | 用途 |
| --- | --- | --- |
| `CURRENT_HOST_NAME` | `asp.hada-check.com` | ホスト名（内部URL生成に使用） |
| `MYSQL_HOST` | `localhost` | DB 接続先 |
| `MYSQL_USER` | `admin` | DB 接続ユーザー |
| `MYSQL_PASSWORD` | （パスワード） | DB 接続パスワード |
| `MYSQL_CRYPT_KEY` | （文字列） | パスワード等の暗号化キー |
| `DBNAME_PREFIX` | 空文字 | クライアント DB 名の接頭辞 |
| `FILE_DIR` | `/home/skin/asp.hada-check.com/files` | アップロード／PDF 保存のベース |
| `PANASONIC_ID` | `4` | Panasonic 向け処理の切替キー |
| `PANASONICSBSC_ID` | `21` | Panasonic 定額サービス向け |
| `PANASONICPB_ID` | `25` | Panasonic 一般向けサービス |
| `AMCARE_ID` | `5` | アドバンスメディカル向け |
| `CRECHER_ID` | `11` | クレシェール化粧品（ID=11）向け処理の切替キー |

**移設時はホスト名・DB 認証情報・`FILE_DIR` を必ず書き換えること。**

### 4.3 共通設定（lib/config.php）

- ファイル: `lib/config.php`
- 各種定数の定義と Smarty・DB 接続の初期化を行う中心的な設定ファイル。

**主要定数一覧:**

| 定数名 | 値（実際の定義） | 用途 | 使われる処理 |
| --- | --- | --- | --- |
| `SKIN_DIAGNOSIS_SYSTEM_PATH` | `WINEPREFIX=/home/skin/.wine-skindiagnosis xvfb-run -a wine /home/skin/asp.hada-check.com/bin/SkinDiagnosisSystem/SkinDiagnosisSystem2.exe` | 画像解析エンジン起動コマンド | `zip_upload.php`、`zip_upload_panasonic.php` で `exec()` 呼出し |
| `SMARTY_DIR` | `{DOCUMENT_DIR}/Smarty/` | Smarty 本体ディレクトリ | `lib/config.php` 内で Smarty 初期化 |
| `SMARTY_TPL_DIR` | `{SMARTY_DIR}templates` | テンプレートファイル置き場 | 全画面 |
| `SMARTY_TPLC_DIR` | `{SMARTY_DIR}templates_c` | コンパイル済みキャッシュ | 自動生成 |
| `FILE_EXPORT_TEMP_DIR` | `{FILE_DIR}/pdf_result_temp` | PDF 一時保存先（定義のみ・未使用） | 現行コードでは参照なし |
| `FILE_EXPORT_DIR` | `{FILE_DIR}/pdf_result` | 診断結果 PDF の保存先 | `exec_make_pdf.php` |
| `ZIPUPLOAD_DIR` | `{FILE_DIR}/uploaded_zip` | ZIP 展開作業ディレクトリ | `zip_upload.php` |
| `CSVUPLOAD_DIR` | `{FILE_DIR}/uploaded_files` | CSV アップロード用（旧機能） | — |
| `SITE_NAME` | `肌診断ASP` | サイト名 | テンプレート等 |
| `MS_CSV_COLUMNS` | `38` | 標準 CSV カラム数 | `zip_upload.php` |
| `MS_CSV_PANASONIC_COLUMNS` | `46` | Panasonic CSV カラム数 | `zip_upload_panasonic.php` |
| `CLIENT_PDF_IMAGE_DIR` | `/images/pdf` | PDF 用画像のベースパス | `exec_make_pdf.php`、`output.php` |

`SKIN_DIAGNOSIS_SYSTEM_PATH` は画像解析エンジン呼び出しの核心定数。Wine プレフィックスパスとエンジン本体パスを含むため、移設時は必ず書き換えること。

---

## 5. 画像処理エンジン側の設定

| ファイル | 役割 |
| --- | --- |
| `bin/SkinDiagnosisSystem/SkinDiagnosisSystem2.exe` | 解析本体（Windows 実行ファイル） |
| `bin/SkinDiagnosisSystem/weightingfactor.ini` | 現行で使用している重み付け係数 |
| `bin/SkinDiagnosisSystem/weightingfactor.def.ini` | 初期値（リセット用の参照元） |

### 5.1 weightingfactor.ini の編集可否

| ファイル | 編集可否 | 理由 |
| --- | --- | --- |
| `weightingfactor.ini` | **原則編集禁止** | 解析結果の補正係数を持つ。変更すると診断結果の傾向が変わる |
| `weightingfactor.def.ini` | **編集禁止** | 初期値の参照元。`weightingfactor.ini` のバックアップとして機能 |

**株式会社テクノホライズンへの確認が必要なケース:**
- `weightingfactor.ini` の係数を変更したい場合
- 解析結果の傾向が明らかにおかしいと判断された場合
- `weightingfactor.ini` を `weightingfactor.def.ini` で初期化したい場合

当社側の判断で `weightingfactor.ini` を書き換えてはならない。変更が必要と判断した場合は、必ず株式会社テクノホライズンへ確認を取ること。

---

## 6. パス一覧

| 目的 | 絶対パス |
| --- | --- |
| アプリ本体 | `/home/skin/asp.hada-check.com/` |
| 画像解析エンジン | `/home/skin/asp.hada-check.com/bin/SkinDiagnosisSystem/SkinDiagnosisSystem2.exe` |
| 画像解析 Wine プレフィックス | `/home/skin/.wine-skindiagnosis/` |
| アップロード展開先 | `/home/skin/asp.hada-check.com/files/uploaded_zip/` |
| PDF 出力先 | `/home/skin/asp.hada-check.com/files/pdf_result/` |
| PDF 一時作業先（定数定義のみ・未使用） | `/home/skin/asp.hada-check.com/files/pdf_result_temp/` |
| クライアント別カスタマイズ | `/home/skin/asp.hada-check.com/user/` |
| nginx サイト設定 | `/etc/nginx/sites-available/default` |
| nginx 共通設定 | `/etc/nginx/nginx.conf` |
| SSL 証明書（Let's Encrypt） | `/etc/letsencrypt/live/app.hada-check.com/` |
| PHP 設定 (CLI) | `/etc/php/8.3/cli/php.ini` |
| MySQL 設定 | `/etc/mysql/mysql.conf.d/mysqld.cnf` |
| PM2 ログ | `/home/skin/.pm2/logs/` |
| PM2 プロセス定義 | `/home/skin/.pm2/dump.pm2` |
| nginx エラーログ | `/var/log/nginx/error.log` |
| nginx アクセスログ | `/var/log/nginx/access.log` |
| MySQL エラーログ | `/var/log/mysql/error.log` |
| PHP セッション | `/var/lib/php/sessions/` |

---

## 7. 権限（代表例）

再構築時に設定すべき標準権限。

| パス | 推奨権限 | 所有者 | 備考 |
| --- | --- | --- | --- |
| `/home/skin/asp.hada-check.com/` | `0775` | `skin:skin` | — |
| `files/` | `0775` | `skin:skin` | — |
| `files/pdf_result/` | `0777` | `skin:skin` | PHP（`skin`）が書き込み・読み取り。現行は 0777 |
| `files/uploaded_zip/` | `0775` | `skin:skin` | — |
| `Smarty/templates_c/`, `Smarty/cache/` | `0775` | `skin:skin` | PHP（`skin`）が書き込み |
| `bin/SkinDiagnosisSystem/` | `0775` | `skin:skin` | 実行権限必須（`SkinDiagnosisSystem2.exe`） |
| `/home/skin/.wine-skindiagnosis/` | `0775` | `skin:skin` | — |
| `lib/environments/production.php` | `0640` 推奨 | `skin:skin` | DB パスワード含むため厳しめに |
| `/var/lib/php/sessions/` | `1733` | `skin:skin` | スティッキービット付き。PM2 実行ユーザーが書き込めること |
| `user/` 配下（ファイル） | `0664` | `skin:skin` | PHP（`skin`）が読み取り可能であること |
| `user/` 配下（ディレクトリ） | `0775` | `skin:skin` | — |

`php -S` / PM2 が `skin` ユーザーで動くため、書き込みが必要なディレクトリはすべて `skin` が書けるだけで済む。nginx（www-data）にファイル権限を与える必要はない。

---

## 8. ログ・キャッシュ

- nginx ログ: `/var/log/nginx/`
- PM2 ログ: `/home/skin/.pm2/logs/`（`skin-out.log` / `skin-error.log`）
    - `pm2 logs skin` で tail 可能
- MySQL ログ: `/var/log/mysql/`
- Smarty コンパイルキャッシュ: `Smarty/templates_c/` / `Smarty/cache/`（テンプレートを差し替えた後に表示が反映されない場合はここの中身を削除する）
