From 85b7f69ccb66f913a9218d5d2dfd806f6c9812c0 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 19 Jul 2026 17:03:16 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20PVC=E3=83=AB=E3=83=BC=E3=83=88=E3=82=92?= =?UTF-8?q?=20/var/www=20=E3=81=AB=E3=83=9E=E3=82=A6=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=80=81/composer=20=E3=82=92=E4=BD=BF=E3=81=84=E6=8D=A8?= =?UTF-8?q?=E3=81=A6=E9=A0=98=E5=9F=9F=E3=81=AB=E5=A4=89=E6=9B=B4=20(v8.5.?= =?UTF-8?q?6-e)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit php-fpm コンテナのマウントを html サブパスのみから PVCルート (/var/www)に変更。html/ は公開フォルダ、それ以外は非公開ファイル の格納先として利用可能に。nginx は従来どおり html サブパスのみ マウントするため、非公開ディレクトリがWebに公開されることはない。 あわせて /composer のPVC永続化マウントを廃止し、Pod再起動ごとに クリーン再構築される使い捨て領域とした(マルウェア書き込み対策)。 永続化したい場合は composer.workingDir に /var/www/composer 等を指定。 Co-Authored-By: Claude Fable 5 --- CHANGELOG-8.5.6-e.md | 43 +++++++++++++++++++++++++++++++++++++++ CLAUDE.md | 6 ++++++ Chart.yaml | 2 +- README.md | 11 +++++++++- templates/deployment.yaml | 15 ++++++-------- values.yaml | 8 +++++--- 6 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 CHANGELOG-8.5.6-e.md diff --git a/CHANGELOG-8.5.6-e.md b/CHANGELOG-8.5.6-e.md new file mode 100644 index 0000000..a4e775d --- /dev/null +++ b/CHANGELOG-8.5.6-e.md @@ -0,0 +1,43 @@ +# Changelog - Version 8.5.6-e + +## 変更点 + +### php-fpm コンテナのマウントを PVCルート → /var/www に変更 + +従来、php-fpm コンテナには PVC の `html` サブパスのみが `/var/www/html` にマウントされており、PVC上の他のディレクトリにはアクセスできませんでした。 + +**対応**: php-fpm コンテナには PVC の**ルート**を `/var/www` にマウントするように変更しました。 + +- `/var/www/html` — 公開フォルダ(nginxが配信するWebルート、従来どおり) +- `/var/www/<任意>` — **非公開ファイルの格納先**(PHPから読み書き可能だがWebには公開されない) + +nginx コンテナは従来どおり `html` サブパスのみをマウントするため、`html/` 以外のディレクトリはWebサーバーのファイルシステムに存在せず、公開されることはありません。設定ファイル・秘密鍵・アップロード受け皿など、公開したくないファイルの置き場として利用できます。 + +### Composer導入先(/composer)を使い捨て領域に変更 + +v8.5.6-c/d では `/composer` をPVCの `composer` サブパスに永続化していましたが、このマウントを廃止しました。 + +`/composer` はコンテナローカルの**使い捨て領域**となり、Pod再起動のたびに `composer install` でクリーンに再構築されます。万一不正アクセスで `vendor/` 内にマルウェアを書き込まれても、再起動で消滅します。 + +- 永続化したい場合は `composer.workingDir` に `/var/www/composer` など `/var/www` 配下を指定してください。 +- 再起動ごとにパッケージの再ダウンロードが発生します(クリーン環境維持とのトレードオフ)。 + +## アップグレード手順 + +```bash +helm repo update +helm upgrade <リリース名> cafepieters/phpfpm --version 8.5.6-e -f values.yaml +``` + +## 互換性 + +- autoloadパスは変わりません: `require_once '/composer/vendor/autoload.php';` +- PVC上に残っている旧 `composer/` サブパスのデータは、今後は `/var/www/composer` として見えます。不要であれば削除してください: + ```bash + kubectl exec -c php-fpm -- rm -rf /var/www/composer + ``` + +--- + +**リリース日**: 2026-07-19 +**担当**: プロサーバーエンジニア(Claude) diff --git a/CLAUDE.md b/CLAUDE.md index 7d60268..dd197ca 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -22,6 +22,12 @@ Raspberry Pi などのベアメタルで稼働することを想定した、Kube ## チャート改修履歴 +### PVCルートを /var/www にマウント + /composer を使い捨て化(2026-07-19, v8.5.6-e) + +php-fpm コンテナのマウントを「`html` サブパスのみ」から「PVCルート → `/var/www`」に変更。`html/` は公開フォルダ、それ以外(`/var/www/<任意>`)は非公開ファイルの格納先として使える。nginx は `html` サブパスのみマウントするため非公開分は公開されない。あわせて `/composer` のPVC永続化マウントを廃止し、Pod再起動ごとにクリーン再構築される使い捨て領域とした(マルウェア混入対策、ユーザー要望)。永続化したい場合は `workingDir` に `/var/www/composer` 等を指定。 + +**対象ファイル**: `templates/deployment.yaml`, `values.yaml`, `README.md`, `Chart.yaml`, `CHANGELOG-8.5.6-e.md` + ### useComposerJson の YAML parse error 修正(2026-07-19, v8.5.6-d) `useComposerJson: true` 指定時、heredoc 内の `{{ .Values.composer.composerJson }}` がインデント無しで展開され、複数行JSONの2行目以降がブロックスカラーを破壊して YAML parse error になる潜在バグを修正。`trim | nindent 14` で展開するよう変更(`composerLock` も同様)。 diff --git a/Chart.yaml b/Chart.yaml index 52841de..655d743 100644 --- a/Chart.yaml +++ b/Chart.yaml @@ -2,6 +2,6 @@ apiVersion: v2 name: phpfpm description: Nginx + PHP-FPM Helm Chart with external DB and optional Selenium support type: application -version: 8.5.6-d +version: 8.5.6-e appVersion: "8.5.6" icon: https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/PHP-logo.svg/330px-PHP-logo.svg.png diff --git a/README.md b/README.md index ca61a5a..3a7c4db 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,14 @@ kubectl logs -l app.kubernetes.io/name=phpfpm -c nginx | `persistence.size` | ストレージサイズ | `1Gi` | | `persistence.accessMode` | アクセスモード | `ReadWriteOnce` | +> **📁 PVCマウント構成(php-fpmコンテナ)** +> php-fpm コンテナには PVC の**ルート**が `/var/www` にマウントされます。 +> +> - `/var/www/html` — **公開フォルダ**(nginxが配信するWebルート) +> - `/var/www/<任意のフォルダ>` — **非公開の格納先**(PHPからは読み書きできるが、Web経由では公開されない) +> +> nginx コンテナは `html` サブパスのみをマウントするため、`html/` 以外のディレクトリはWebサーバーのファイルシステムに存在せず、設定ミスでも公開されることはありません。設定ファイル・秘密鍵・アップロード受け皿・ログなど、公開したくないファイルの置き場として利用できます。 + ### Composer設定 | パラメータ | 説明 | デフォルト | @@ -241,7 +249,8 @@ persistence: > **📌 Composerの導入先について** > Composerパッケージはデフォルトで**Webルート外**の `/composer` に導入されます(`composer.workingDir` で変更可能)。 > `vendor/` や `composer.json` がWeb経由で公開されないため、情報漏洩などのセキュリティリスクを回避できます。 -> また、Webルート(`/var/www/html`)と親子関係にないパスのため、ネストマウントによる空フォルダも生成されません。 +> +> `/composer` は**PVCにマウントされない使い捨て領域**です。Pod再起動のたびにクリーンな環境へ再構築されるため、万一不正アクセスでマルウェアを書き込まれても再起動で消え、常にクリーンなComposer環境を維持できます(PVCに永続化したい場合は `/var/www/composer` など `/var/www` 配下を指定)。 > > PHPコードからは以下のように読み込みます: > ```php diff --git a/templates/deployment.yaml b/templates/deployment.yaml index 0225d77..6bc597c 100644 --- a/templates/deployment.yaml +++ b/templates/deployment.yaml @@ -200,16 +200,13 @@ spec: ports: - containerPort: 9000 # PHP-FPMは9000ポートでリッスン volumeMounts: + # PVCルートを /var/www にマウント + # - /var/www/html のみ nginx が公開(nginx側は html サブパスだけをマウント) + # - それ以外(/var/www/<任意>)は非公開ファイルの格納先として利用可能 + # ※ Composer導入先(デフォルト /composer)は意図的にマウントしない: + # Pod再起動のたびにクリーンな環境へ再構築される使い捨て領域とする - name: app-storage - mountPath: /var/www/html - subPath: html - {{- $composerDir := .Values.composer.workingDir | default "/composer" }} - {{- if and (or .Values.composer.enabled .Values.selenium.enabled) (ne $composerDir "/var/www/html") }} - # Composer導入先をPVCに永続化(Pod再起動時のvendor再構築を回避) - - name: app-storage - mountPath: {{ $composerDir }} - subPath: composer - {{- end }} + mountPath: /var/www {{- if and .Values.composer.enabled .Values.composer.useComposerJson }} - name: composer-config mountPath: /tmp/composer-init diff --git a/values.yaml b/values.yaml index 19af4e8..fc10bd7 100644 --- a/values.yaml +++ b/values.yaml @@ -86,13 +86,15 @@ composer: enabled: false # Composerの導入先ディレクトリ(composer.json / vendor の配置先) - # デフォルトはWebルート(/var/www/html)の外の /composer に導入し、 - # vendor/ や composer.json がWeb経由で公開されるのを防ぐ - # ※ Webルートと親子関係にないパスを推奨(ネストマウントによる空フォルダ生成を回避) + # デフォルトの /composer はWebルート外かつPVCにマウントされない「使い捨て」領域: + # - vendor/ や composer.json がWeb経由で公開されない + # - Pod再起動のたびにクリーンな環境へ再構築されるため、 + # 不正アクセスでマルウェアを書き込まれても再起動で消える # # 【重要】PHPコードからの autoload.php の読み込み方: # require_once '/composer/vendor/autoload.php'; # + # PVC上に永続化したい場合は /var/www 配下(例: "/var/www/composer")を指定 # 旧来の動作(Webルート直下に導入)へ戻す場合は "/var/www/html" を指定 workingDir: "/composer"