# 差分更新 2026-05-26

本ファイルは 2026-05-26 のクライアント依頼に基づく差分のみを記載する。
対象ドキュメントとセクションは以下の通り。

---

## 対象一覧

| 対象ドキュメント | セクション |
| --- | --- |
| 01_サーバー構成.md | 1.2 / 1.3 / 1.4 / 1.6.1 / 1.6.2 / 1.8 / 1.10 |
| 02_設定一覧.md | 2.1.1 / 2.2.3 |
| 04_画像処理連携仕様.md | 4.4（角辺 → 角片）※前回更新済み |

---

---

# 01_サーバー構成.md 差分

---

## 【01 / 1.2】OS / ミドルウェア バージョン — 互換性と確認すべき機能

再構築時のバージョン選択の基準。

### 同一バージョンに揃えるべきもの

| ミドルウェア | 現行バージョン | 理由 |
| --- | --- | --- |
| **Wine** | 6.0.3 | バージョン差で `SkinDiagnosisSystem2.exe` の動作・解析結果が変わる可能性がある。**必ず同一バージョンで動作確認を実施すること** |
| **ImageMagick** | 6.8.9-10 Q16 | `convert` による画像切り出し結果が解析入力画像に直結する。切り出し挙動が変わると解析値に影響する可能性がある |

### 同系統バージョンで許容できるもの（ただし動作確認必須）

| ミドルウェア | 現行バージョン | バージョン変更時の注意 |
| --- | --- | --- |
| OS | Ubuntu 22.04 LTS | Wine・ImageMagick が正常に動作するか確認。Wine はディストリビューションに依存するパッケージが多い |
| nginx | 1.18.0 | SSL 設定・`proxy_pass`・`client_max_body_size` の構文が変わることがある |
| PHP | 8.3.x → 8.x 系 | PHP 8.0 → 8.1 → 8.2 → 8.3 と細かい非互換あり。`php -S` の動作は変わらない |
| MySQL | 8.0.x | 認証プラグイン（`caching_sha2_password`）が 8.0 デフォルト。PHP の `mysqli` 拡張との互換性を確認 |
| Node.js / PM2 | v20.x / PM2 6.x | PM2 の起動コマンド構文・`pm2 startup` の出力形式に差異が生じることがある |

### バージョンが変わる場合に確認すべき機能

| ミドルウェア | 確認すべき機能 |
| --- | --- |
| OS | Wine の起動（`xvfb-run -a wine ...`）、ImageMagick の `convert` コマンド動作 |
| nginx | nginx から PHP サーバー（127.0.0.1:8000）への転送、SSL 証明書の読み込み、アップロードサイズ上限 |
| PHP | PHP サーバー起動（`php -S localhost:8000`）、DB 保存、PDF 生成、診断結果一致 |
| MySQL | DB 保存、診断結果一致（既存データが正常に読み書きできるか） |
| Node.js / PM2 | PM2 による自動起動（サーバー再起動後に `skin` プロセスが復元されるか） |
| Wine | **画像解析エンジンの起動、7 値取得**（最重要。旧環境と解析結果が一致するか必ず確認） |
| Xvfb | 画像解析エンジンの起動（Wine の仮想ディスプレイとして動作するか） |
| ImageMagick | 画像切り出し（300×300 の Crop1 画像が正しく生成されるか）、診断結果一致 |
| PHP 拡張（mysqli 等） | DB 保存・接続、ZIP アップロード後の処理完了、PDF 生成 |

---

## 【01 / 1.3】ディレクトリ配置 — user/ 配下の詳細と管理画面カスタマイズとの関係

### サーバー内フォルダー名と公開 URL の違い（再掲）

| 区分 | 値 |
| --- | --- |
| サーバー内フォルダー名 | `/home/skin/asp.hada-check.com/` |
| 公開サブドメイン（URL） | `https://app.hada-check.com/` |

フォルダー名は `asp.hada-check.com`、公開 URL は `app.hada-check.com`。現状フォルダー名を変更する必要はない（動作中のため）。nginx・SSL・DNS など URL として記載が必要な箇所はすべて `app.hada-check.com` を使用する。

### user/ 配下のフォルダー一覧（Panasonic 系・クレシエール系）

`/home/skin/asp.hada-check.com/user/{dir_name}/` の `{dir_name}` は DB（`admin.t_client.dir_name`）に登録されたクライアント識別名。

**Panasonic 系**

| フォルダー名 | クライアント ID | DB 名 | 主なファイル・用途 |
| --- | --- | --- | --- |
| `user/panasonic/` | 4 | `c_panasonic` | `index.php`（エントリポイント）、`login/`（ログイン画面）、`check/`（診断受付）、`templates/`（Smarty テンプレート）、`common/`（CSS・JS）、`images/pdf/`（PDF 用背景・マーク画像） |
| `user/panasonicsbsc/` | 21 | `c_panasonicsbsc` | 同上構成。定額利用サービス向けデザイン |
| `user/Panasonicpb/` | 25 | `c_panasonicpb` | 同上構成 + `login/newuser.php`（新規ユーザー登録機能あり） |

**クレシエール系**

| フォルダー名 | クライアント ID | DB 名 | 主なファイル・用途 |
| --- | --- | --- | --- |
| `user/crecher/` | 11 | `c_crecher` | `index.php`、`login/`、`check/`（`result_drawing.php` を含む）、`templates/`、`common/`（CSS・JS）、`images/pdf/`（PDF 用画像）、`common/css/top/`（トップページ CSS） |
| `user/crecher2/` | 10 | `c_crecher2` | `user/crecher/` と同等構成 |

### 管理画面カスタマイズ（`/admin/client/customize/`）と user/ の対応

管理画面の「カスタマイズ」メニューからアップロードした画像は `user/{dir_name}/images/` 配下に保存される。テキスト系のカスタマイズ内容は各クライアント DB の `t_customize` テーブルに保存される。

| 管理画面の操作 | 保存先（画像） | 保存先（テキスト） |
| --- | --- | --- |
| PDF 用背景・マーク画像の登録（`pdf_images.php`） | `user/{dir_name}/images/pdf/index/`、`/mark/`、`/common/` | — |
| ページヘッダーロゴの登録（`page_header_logo.php`） | `user/{dir_name}/common/images/header/` | — |
| 肌タイプ表画像の登録（`skin_type_table.php`） | `user/{dir_name}/images/skin_type_table/` | — |
| コメント・アドバイス文の編集（各 comment 系ページ） | — | `c_{クライアント名}.t_customize` |

**`user/` 配下はバックアップ必須**（管理画面から登録した画像が格納されているため、紛失すると PDF が正常に生成できなくなる）。

---

## 【01 / 1.4】フロント nginx と公開 URL — ブラウザから PHP サーバーまでの経路

### ブラウザから PHP サーバーへの転送の流れ

```
[ブラウザ]
    │ https://app.hada-check.com/ (TCP/443)
    ▼
[ConoHa VPS ファイアウォール]
    │ TCP/443 を許可（ConoHa セキュリティグループで設定）
    ▼
[DNS]
    │ app.hada-check.com → サーバーの IP アドレス（A レコード）
    │ ※DNS 管理は ConoHa DNS または別途のドメイン管理業者
    ▼
[nginx（ポート 443）]
    │ SSL 終端（Let's Encrypt 証明書で HTTPS を復号）
    │ server_name: app.hada-check.com
    │ ssl_certificate: /etc/letsencrypt/live/app.hada-check.com/fullchain.pem
    │ proxy_pass: http://127.0.0.1:8000
    ▼
[PHP Built-in Server（127.0.0.1:8000）]
    │ PM2 が skin ユーザーで常駐管理
    │ php -S localhost:8000 -t /home/skin/asp.hada-check.com
    ▼
[MySQL（127.0.0.1:3306）] ← PHP から直接接続（外部非公開）
```

**HTTP（ポート 80）でアクセスした場合:**

```
[ブラウザ]
    │ http://app.hada-check.com/ (TCP/80)
    ▼
[nginx（ポート 80）]
    │ 301 リダイレクト → https://app.hada-check.com/
    ▼ （上記 443 フローへ）
```

### 各コンポーネントの役割

| コンポーネント | 役割 | 設定・確認場所 |
| --- | --- | --- |
| DNS（A レコード） | `app.hada-check.com` → サーバー IP への名前解決 | ConoHa DNS 設定画面（またはドメイン管理業者） |
| ConoHa ファイアウォール | TCP/80・TCP/443 を外部に開放 | ConoHa コントロールパネル > セキュリティグループ |
| nginx（443） | HTTPS 受信・SSL 終端・PHP サーバーへの転送 | `/etc/nginx/sites-available/default` |
| nginx（80） | HTTP アクセスを 443 へ 301 リダイレクト | 同上（`return 301 https://$host$request_uri`） |
| SSL 証明書（Let's Encrypt） | HTTPS 暗号化。Certbot が 90 日ごとに自動更新 | `/etc/letsencrypt/live/app.hada-check.com/` |
| PHP Built-in Server（:8000） | アプリケーション本体。外部非公開（127.0.0.1 のみ） | PM2 管理（`pm2 list` で確認） |
| MySQL（:3306） | DB。外部非公開（127.0.0.1 のみ） | `sudo systemctl status mysql` で確認 |

---

## 【01 / 1.6.1】保存場所（ファイル系）

| 種別 | パス | 用途 | 作成主体 | バックアップ要否 |
| --- | --- | --- | --- | --- |
| アップロード ZIP 展開先 | `files/uploaded_zip/{クライアントID}_{日時}_{マイクロ秒}/` | ZIP 展開・画像切り出し・解析の作業領域。処理完了後は残留するが削除可能 | `client/main/zip_upload.php`（または `zip_upload_panasonic.php`） | 削除可（DB に診断結果が保存済みなら不要） |
| 診断結果 PDF | `files/pdf_result/client_{ID}_file_{連番}/result_{result_id}.pdf` | 生成済み PDF の永続保存先 | `client/main/exec_make_pdf.php` | **バックアップ必須** |
| PDF 一時保存先（未使用） | `files/pdf_result_temp/` | `lib/config.php` に `FILE_EXPORT_TEMP_DIR` として定数定義されているが、現行コードで参照するファイルは存在せず、ディレクトリ自体も未作成 | — | 対応不要（存在しない） |
| Smarty コンパイルキャッシュ | `Smarty/templates_c/`, `Smarty/cache/` | テンプレートのコンパイル済みキャッシュ。自動再生成される | 自動生成 | 削除可 |
| PHP セッション | `/var/lib/php/sessions/` | ログインセッション | PHP 標準 | 削除可（ログイン中ユーザーの再ログインが必要になる） |

---

## 【01 / 1.6.2】DB — 主要テーブルと用途

### DB 名とクライアント ID の対応

| DB 名 | 対応クライアント ID | 用途 |
| --- | --- | --- |
| `admin` | — | システム全体管理（クライアント一覧・管理者ユーザー） |
| `client_m` | — | クライアント共通マスタ（新規クライアント作成時のテンプレート） |
| `c_panasonic` | **4**（PANASONIC_ID） | Panasonic 向けクライアント DB |
| `c_panasonicsbsc` | **21**（PANASONICSBSC_ID） | Panasonic 定額サービス向け |
| `c_panasonicpb` | **25**（PANASONICPB_ID） | Panasonic 一般向けサービス |
| `c_crecher` | **11**（CRECHER_ID） | クレシェール化粧品（crecher） |
| `c_crecher2` | **10** | クレシェール化粧品（crecher2） |

### 主要テーブルと用途（各クライアント DB 共通）

| テーブル | 用途 | 保存・参照される情報 |
| --- | --- | --- |
| `t_inported_file` | ZIP アップロード単位の管理 | `file_id`（紐づけキー）、ZIP ファイル名、`pdf_download_flg`（PDF 生成済みフラグ） |
| `t_user` | 被験者ユーザー情報 | `user_id`、個人情報（暗号化） |
| `t_result` | **診断結果の中心テーブル** | 以下をすべて保存: |
| | | ・`file_id`（`t_inported_file` との紐づけキー） |
| | | ・`user_id`（`t_user` との紐づけキー） |
| | | ・問診回答: `ans1`〜`ans20` |
| | | ・画像解析結果 7 値: `k_checker_score1`〜`k_checker_score7` |
| | | ・診断判定結果: `k_checker`、`skin_type`、`skin_age`、`moisture_capacity_type`、`sebum_capacity_type` 等 |
| | | ・PDF 出力情報: `k_checker_img_path`（Crop3 画像パス）、各種 comment_id |
| `t_customize` | 管理画面カスタマイズのテキスト内容 | コメント文・アドバイス文（管理画面から編集） |
| `t_page_result_layout` | 診断結果ページのレイアウト設定 | 管理画面から設定するページ構成 |
| `m_skin_type` 等マスタ類 | 各種判定結果のマスタ | 肌タイプ・コメント・水分量・皮脂量等の定義値 |

`t_result` が診断処理・PDF 生成・結果表示のすべての起点。`t_result.file_id` ↔ `t_inported_file.file_id` で ZIP 単位と紐づく。`t_result.k_checker_img_path` が `files/uploaded_zip/.../KCheckerIng/` を指し、角質チェッカー画像（Crop3）の参照パスを保持する。

### admin DB の主要テーブル

| テーブル | 用途 |
| --- | --- |
| `t_client` | クライアント一覧。`client_id`、`dir_name`（user/ のフォルダー名）、`db_name`（接続先 DB 名）を管理 |
| `t_admin` | 管理者ユーザー情報 |
| `m_client_option` 等 | クライアントオプション・マスタ |

---

## 【01 / 1.8】ネットワーク — 公開ポートと用途

| ポート | 外部公開 | 用途 |
| --- | --- | --- |
| **TCP/443** | **公開** | HTTPS。ブラウザからのすべてのアクセスを受ける。nginx が SSL 終端し、PHP サーバー（127.0.0.1:8000）へ転送 |
| **TCP/80** | **公開** | HTTP。nginx が受信し、`https://app.hada-check.com/` へ 301 リダイレクトする。コンテンツは返さない |
| `127.0.0.1:8000` | 非公開（内部のみ） | PHP Built-in Server。nginx からの転送のみ受け付ける |
| `127.0.0.1:3306` | 非公開（内部のみ） | MySQL。PHP から直接接続。外部からは到達できない |

- 外部 API との通信なし（完結型）
- メール送信等の外部連携なし
- ConoHa のセキュリティグループで TCP/80・TCP/443 を開放済み

---

## 【01 / 1.10】監視・バックアップ

定期バックアップやジョブ監視は OS 側に仕組みを置いていない。以下を手動または個別スクリプトで実施する。

### バックアップ対象

| 対象 | バックアップ対象 | 取得方法 | 復元方法 | 取得頻度（推奨） | 保存先 |
| --- | --- | --- | --- | --- | --- |
| MySQL 全 DB | **必須** | `mysqldump --all-databases -u admin -p > dump.sql` | `mysql -u admin -p < dump.sql` | 日次 | 外部ストレージ等 |
| `files/pdf_result/` | **必須** | `tar czf pdf_result.tar.gz files/pdf_result/` | `tar xzf` で展開 | 週次または都度 | 同上 |
| `user/` 配下 | **必須** | `tar czf user.tar.gz user/` | `tar xzf` で展開 | 変更時 | 同上 |
| `bin/SkinDiagnosisSystem/` | **必須** | `tar czf skindiagnosis.tar.gz bin/SkinDiagnosisSystem/` | `tar xzf` で展開 | 変更時 | 同上 |
| アプリコード | **必須** | `git push`（Git 管理分） | `git clone` | コード変更時 | Git リポジトリ |
| PM2 設定（`dump.pm2`） | 推奨 | `pm2 save` 後にファイルコピー | `pm2 resurrect` | PM2 設定変更時 | Git または外部ストレージ |
| `lib/environments/production.php` | 推奨（Git 管理外の場合） | ファイルコピー | ファイルコピー | 変更時 | 安全な場所 |

### バックアップ不要（削除可能）

| 対象 | 削除可否 | 理由 |
| --- | --- | --- |
| `files/uploaded_zip/` 内の古い作業フォルダー | 削除可 | DB に診断結果が保存済みなら中間ファイルは不要。削除前に管理画面で結果を確認すること |
| `files/pdf_result_temp/` | 対応不要 | ディレクトリが存在しない（現行未使用） |
| `Smarty/templates_c/`、`Smarty/cache/` | 削除可 | 自動再生成される |
| `/var/lib/php/sessions/` | 削除可 | ログイン中ユーザーが再ログイン必要になる |
| PM2 ログ（`/home/skin/.pm2/logs/`） | 削除可（古いもののみ） | ログは再生成される。直近のログは障害調査のため保持推奨 |
| nginx ログ（`/var/log/nginx/*.gz`） | 削除可（ローテーション済みのみ） | 同上 |

---

---

# 02_設定一覧.md 差分

---

## 【02 / 2.1.1】nginx 設定 — 現行 app.hada-check.com 本番設定

- 設定ファイル: `/etc/nginx/sites-available/default`
- 有効化リンク: `/etc/nginx/sites-enabled/default`

**現行の実際の設定内容（ファイルより確認済み）:**

```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(80) → HTTPS(443) リダイレクト（Certbot が自動追加）
    if ($host = app.hada-check.com) {
        return 301 https://$host$request_uri;
    }
    listen 80;
    server_name app.hada-check.com;
    return 404;
}
```

**主要設定の確認ポイント:**

| 設定項目 | 現行値 | 説明 |
| --- | --- | --- |
| `server_name` | `app.hada-check.com` | 公開サブドメイン |
| `listen 443 ssl` | 443 番で HTTPS | SSL 終端はこの nginx が行う |
| `listen 80` | 80 番で HTTP | コンテンツは返さず 443 へリダイレクト |
| 80 → 443 転送 | あり（301 リダイレクト） | `return 301 https://$host$request_uri` |
| `ssl_certificate` | `/etc/letsencrypt/live/app.hada-check.com/fullchain.pem` | Let's Encrypt 証明書 |
| `ssl_certificate_key` | `/etc/letsencrypt/live/app.hada-check.com/privkey.pem` | 秘密鍵 |
| `proxy_pass` | `http://127.0.0.1:8000` | PHP Built-in Server への転送先 |
| `client_max_body_size` | `100M` | ZIP アップロード上限 |

変更後は必ず `sudo nginx -t && sudo systemctl reload nginx` で反映する。

---

## 【02 / 2.2.3】PHP ini の設定値 — 実際の反映値と推奨値

### 現行 CLI 環境の実測値

以下は現行サーバーで `php -i` により確認した実際の値（CLI デフォルト）。

| キー | 現行実測値 | 反映される設定ファイル・場所 |
| --- | --- | --- |
| `memory_limit` | `-1`（無制限） | `/etc/php/8.3/cli/php.ini`（CLI デフォルトが無制限） |
| `max_execution_time` | `0`（無制限） | 同上（CLI デフォルトが無制限） |
| `upload_max_filesize` | `64M`（PM2 起動コマンドで上書き） | PM2 起動コマンドの `-d upload_max_filesize=64M` |
| `post_max_size` | `256M`（PM2 起動コマンドで上書き） | PM2 起動コマンドの `-d post_max_size=256M` |
| `default_charset` | `UTF-8` | `/etc/php/8.3/cli/php.ini` |
| `date.timezone` | `Asia/Tokyo`（要確認） | `/etc/php/8.3/cli/php.ini` または PM2 起動コマンドで `-d date.timezone=Asia/Tokyo` |

**`-d` オプションによる上書き:** PM2 が起動コマンドに付与した `-d` オプションは、`php.ini` の値より優先される。現行では `upload_max_filesize` と `post_max_size` を PM2 コマンドで制御している。

### 再構築時の推奨設定値（参考）

PHP CLI のデフォルトは `memory_limit=-1`、`max_execution_time=0` と無制限であり、現行はこれを活用している。Web サーバー型（FPM 等）へ移行する場合は以下を明示的に設定すること。

| キー | 推奨値 | 変更時に確認すべき機能 |
| --- | --- | --- |
| `memory_limit` | 256M 以上 | **PDF 生成**（画像が多い場合にメモリ不足が発生しやすい）、ZIP アップロード後の処理完了 |
| `max_execution_time` | 300 以上 | **画像解析処理**（Wine 経由の実行は 1 枚あたり数秒〜10 秒）、ZIP アップロード後の処理完了、診断結果一致 |
| `upload_max_filesize` | 64M（現行維持） | ZIP アップロード後の処理完了 |
| `post_max_size` | 256M（現行維持） | ZIP アップロード後の処理完了 |
| `default_charset` | UTF-8 | 診断結果の文字化け |
| `date.timezone` | Asia/Tokyo | 診断結果の日時記録 |

---

---

# 04_画像処理連携仕様.md 差分

---

## 【04 / 4.4】戻り値の用語修正（角辺 → 角片）

前回更新（2026-05-25）にて修正済み。「角辺」はすべて「**角片**」に修正されている。

04_画像処理連携仕様.md の現行の記載（修正後）:

| PHP 側キー | 用途 |
| --- | --- |
| `k_checker_score4` | **角片**の数判定に利用 |
| `k_checker_score5` | **角片**の形状判定に利用 |
| `k_checker_score6` | **角片**の揃い方判定に利用 |
| `k_checker_score7` | **角片**の大きさ判定に利用 |

| 関数 | 出力（1〜5） |
| --- | --- |
| `GetResult2` | **角片**の数 |
| `GetResult3` | **角片**の大きさ |
| `GetResult4` | **角片**の形状 |
| `GetResult5` | **角片**の揃い方 |
