diff --git a/CHANGELOG-8.5.8-a.md b/CHANGELOG-8.5.8-a.md new file mode 100644 index 0000000..9348108 --- /dev/null +++ b/CHANGELOG-8.5.8-a.md @@ -0,0 +1,58 @@ +# Changelog - Version 8.5.8-a + +## 新機能 + +### Python導入オプションの追加 + +PHPからPythonスクリプトを呼び出す用途(データ処理・機械学習ライブラリの利用など)向けに、`values.yaml` の設定だけでPython仮想環境(venv)を導入できるようにしました。既存のComposerサポートと同じ設計方針を踏襲しています。 + +#### 主な変更点 + +1. **values.yaml** + - `python` セクションを新設 + - `enabled`: Python有効化 + - `venvDir`: venv導入先(デフォルト `/venv` — Webルート外かつPVCにマウントされない使い捨て領域) + - `packages` / `useRequirementsTxt` / `requirementsTxt`: pipパッケージ指定方法(Composerの `packages` / `useComposerJson` と同じ構造) + - `installOptions`: pip installオプション(デフォルト `--no-cache-dir`) + - `additionalApkPackages`: ネイティブ拡張ビルド用の追加APKパッケージ + +2. **templates/deployment.yaml** + - `python.enabled` 時に `python3` / `py3-pip` をAPKでインストール + - `python3 -m venv` で仮想環境を構築 + - `useRequirementsTxt` / `packages` に応じてpipインストールを実行 + - `requirementsTxt` の複数行内容は `trim | nindent 14` で展開(v8.5.6-d のComposer修正と同じ手法でYAML破壊を回避) + +3. **README.md** + - パラメータ表・使用例(例12)を追加 + - Alpine(musl)向け事前ビルドwheelが無いパッケージ(numpy等)はビルドに時間がかかる旨の注意書きを追加 + +## 設計方針(Composerとの一貫性) + +- デフォルトの `/venv` はPVCにマウントされず、**Pod再起動のたびにクリーンな環境へ再構築される使い捨て領域**です。不正アクセスで書き込まれても再起動で消えます。 +- 永続化したい場合は `python.venvDir` に `/var/www` 配下のパスを指定してください(例: `/var/www/venv`)。 + +## 使用例 + +```yaml +python: + enabled: true + useRequirementsTxt: true + requirementsTxt: | + requests>=2.31.0 + pandas>=2.0.0 +``` + +PHPからの呼び出し: + +```php +exec('/venv/bin/python3 /var/www/scripts/process.py 2>&1', $output, $exitCode); +``` + +## 互換性 + +- デフォルトは `enabled: false` のため、既存環境への影響はありません。 + +--- + +**リリース日**: 2026-07-19 +**担当**: プロサーバーエンジニア(Claude) diff --git a/CLAUDE.md b/CLAUDE.md index ae42cdd..09e1a93 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -22,6 +22,14 @@ Raspberry Pi などのベアメタルで稼働することを想定した、Kube ## チャート改修履歴 +### Python導入オプションの追加(2026-07-19, v8.5.8-a) + +`python` セクションを新設し、`values.yaml` の設定だけでPython仮想環境(venv)を導入可能にした。Composerと同じ設計方針(デフォルト導入先 `/venv` はPVC非マウントの使い捨て領域、`packages`/`useRequirementsTxt`の二択、`additionalApkPackages`でネイティブ拡張ビルド対応)。requirements.txtの展開は `trim | nindent 14`(v8.5.6-dのバグ修正と同じ手法)。PHPからは `exec('/venv/bin/python3 script.py')` で呼び出す。 + +なお、この改修中に自動更新ワークフローがPHP 8.5.8へのフルリリース(v8.5.8)を実行したため、本機能はそのタグの上に手動リリース `8.5.8-a` として適用した。 + +**対象ファイル**: `values.yaml`, `templates/deployment.yaml`, `README.md`, `Chart.yaml`, `CHANGELOG-8.5.8-a.md` + ### /etc/msmtprc の権限を0600→0644に修正(2026-07-19, v8.5.6-g) v8.5.6-f のフォローアップ。`/etc/smtp-secrets/password` の権限修正だけでは不十分で、起動スクリプトが `cp` 後に `chmod 600` していた `/etc/msmtprc` 自体もrootのみ読み取り可のままだった(msmtp: account default not found, exit:78)。`chmod 644` に変更。msmtprcには平文パスワードは含まれない(passwordeval経由で別ファイル参照)ため実害なし。 diff --git a/Chart.yaml b/Chart.yaml index c00b0f0..ca848ca 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.8 +version: 8.5.8-a appVersion: "8.5.8" 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 3a7c4db..c35eb92 100644 --- a/README.md +++ b/README.md @@ -138,6 +138,30 @@ kubectl logs -l app.kubernetes.io/name=phpfpm -c nginx | `composer.additionalPhpExtensions` | 追加PHP拡張 | `[]` | | `composer.additionalApkPackages` | 追加APKパッケージ | `[]` | +### Python設定(オプション) + +PHPからPythonスクリプトを呼び出す用途(データ処理・機械学習ライブラリの利用など)向けに、Python仮想環境(venv)を導入できます。 + +| パラメータ | 説明 | デフォルト | +|-----------|------|-----------| +| `python.enabled` | Python有効化 | `false` | +| `python.venvDir` | venv導入先ディレクトリ(`{venvDir}/bin/python3`) | `"/venv"` | +| `python.packages` | pipでインストールするパッケージ | `[]` | +| `python.useRequirementsTxt` | requirements.txt使用 | `false` | +| `python.requirementsTxt` | requirements.txtの内容 | `"requests>=2.31.0"` | +| `python.installOptions` | pip installオプション | `"--no-cache-dir"` | +| `python.additionalApkPackages` | 追加APKパッケージ(ネイティブ拡張のビルド用) | `[]` | + +> **📌 Python導入先について** +> Composerと同様、デフォルトの `/venv` は**Webルート外かつPVCにマウントされない使い捨て領域**です。Pod再起動のたびにクリーンな仮想環境へ再構築されます。PVCに永続化したい場合は `python.venvDir` に `/var/www` 配下(例: `/var/www/venv`)を指定してください。 +> +> PHPコードからは `exec()` 等で呼び出します: +> ```php +> exec('/venv/bin/python3 /var/www/scripts/process.py 2>&1', $output, $exitCode); +> ``` +> +> **⚠️ 注意**: `numpy` や `pillow` など、Alpine(musl)向けの事前ビルド済みwheelが無いパッケージは、Pod起動のたびにソースからビルドされ、Raspberry Pi等のARM環境では起動に数分〜十数分かかる場合があります。ビルドに必要なパッケージ(`gcc`, `musl-dev`, `python3-dev` 等)は `python.additionalApkPackages` に指定してください。永続化(`venvDir`をPVC配下に)すれば再起動のたびの再ビルドを回避できますが、使い捨てによるクリーン環境維持のメリットとのトレードオフになります。 + ### Selenium設定 | パラメータ | 説明 | デフォルト | @@ -696,6 +720,37 @@ $headers = [ SmtpConfig::mail($to, $subject, $body, $headers, 'custom@your-domain.com'); ``` +### 例12: Python連携(requirements.txtを使用) + +PHPからPythonスクリプトを呼び出してデータ処理を行う設定です。 + +```yaml +# values.yaml +python: + enabled: true + useRequirementsTxt: true + requirementsTxt: | + requests>=2.31.0 + pandas>=2.0.0 + installOptions: "--no-cache-dir" +``` + +**PHPでの使用例**: + +```php +&1", $output, $exitCode); + +if ($exitCode === 0) { + echo implode("\n", $output); +} else { + error_log('Python script failed: ' . implode("\n", $output)); +} +``` + +`/var/www/scripts/` のようなPVC上の非公開フォルダにPythonスクリプトを配置すれば、Web経由で公開されずに済みます(詳細はPVCマウント構成の項を参照)。 + **デプロイ手順**: ```bash diff --git a/templates/deployment.yaml b/templates/deployment.yaml index 2547ef9..09e9a55 100644 --- a/templates/deployment.yaml +++ b/templates/deployment.yaml @@ -36,17 +36,17 @@ spec: - | echo "Starting PHP-FPM setup process..." - {{- if or .Values.composer.enabled .Values.selenium.enabled .Values.externalDatabase.enabled }} + {{- if or .Values.composer.enabled .Values.selenium.enabled .Values.externalDatabase.enabled .Values.python.enabled }} # ======================================== # APKパッケージのインストール # ======================================== APK_PACKAGES="" - + {{- if or .Values.composer.enabled .Values.selenium.enabled }} # Composer本体に必要なパッケージ APK_PACKAGES="$APK_PACKAGES curl zip libzip-dev" {{- end }} - + {{- if .Values.externalDatabase.enabled }} # MySQL/MariaDB接続に必要なパッケージ APK_PACKAGES="$APK_PACKAGES mysql-client mysql-dev" @@ -57,13 +57,25 @@ spec: APK_PACKAGES="$APK_PACKAGES msmtp ca-certificates" {{- end }} + {{- if .Values.python.enabled }} + # Python本体に必要なパッケージ + APK_PACKAGES="$APK_PACKAGES python3 py3-pip" + {{- end }} + {{- if .Values.composer.additionalApkPackages }} - # ユーザー指定の追加APKパッケージ + # ユーザー指定の追加APKパッケージ(Composer用) {{- range .Values.composer.additionalApkPackages }} APK_PACKAGES="$APK_PACKAGES {{ . }}" {{- end }} {{- end }} + {{- if .Values.python.additionalApkPackages }} + # ユーザー指定の追加APKパッケージ(Python用) + {{- range .Values.python.additionalApkPackages }} + APK_PACKAGES="$APK_PACKAGES {{ . }}" + {{- end }} + {{- end }} + # PHP拡張(gd / mbstring)の依存パッケージを自動的に追加 {{- if .Values.composer.additionalPhpExtensions }} for ext in {{ join " " .Values.composer.additionalPhpExtensions }}; do @@ -172,6 +184,38 @@ spec: {{- end }} {{- end }} + {{- if .Values.python.enabled }} + {{- $pythonDir := .Values.python.venvDir | default "/venv" }} + # ======================================== + # Python仮想環境のセットアップ + # ======================================== + echo "Setting up Python virtual environment..." + + # Python導入先(デフォルトはWebルート外の /venv、Composerと同様の使い捨て領域) + # PHPからの呼び出し方: exec('{{ $pythonDir }}/bin/python3 /path/to/script.py 2>&1', $output, $exitCode); + python3 -m venv {{ $pythonDir }} + + {{- if .Values.python.useRequirementsTxt }} + echo "Creating requirements.txt from values..." + cat > /tmp/requirements.txt << 'REQUIREMENTS_TXT_EOF' + {{- .Values.python.requirementsTxt | trim | nindent 14 }} + REQUIREMENTS_TXT_EOF + + echo "Installing Python packages from requirements.txt..." + {{ $pythonDir }}/bin/pip install {{ .Values.python.installOptions }} -r /tmp/requirements.txt + rm -f /tmp/requirements.txt + + {{- else if .Values.python.packages }} + echo "Installing Python packages..." + {{- range .Values.python.packages }} + {{ $pythonDir }}/bin/pip install {{ $.Values.python.installOptions }} "{{ . }}" + {{- end }} + + {{- else }} + echo "No Python package configuration found, virtual environment created without additional packages" + {{- end }} + {{- end }} + {{- if .Values.smtp.enabled }} # ======================================== # SMTP設定(msmtp) diff --git a/values.yaml b/values.yaml index e50fc2e..6c741cd 100644 --- a/values.yaml +++ b/values.yaml @@ -131,6 +131,44 @@ composer: # - "gd" # - "zip" +# Python設定(オプション、PHPからPythonスクリプトを呼び出す用途) +python: + # Pythonを使用するかどうか + enabled: false + + # Python仮想環境(venv)の導入先ディレクトリ + # デフォルトの /venv はWebルート外かつPVCにマウントされない「使い捨て」領域: + # - Pod再起動のたびにクリーンな環境へ再構築される(Composerと同じ設計) + # + # 【重要】PHPからのPython呼び出し方(execを利用): + # exec('/venv/bin/python3 /path/to/script.py 2>&1', $output, $exitCode); + # + # PVC上に永続化したい場合は /var/www 配下(例: "/var/www/venv")を指定 + venvDir: "/venv" + + # pipでインストールするパッケージ + # packages配列が空の場合、requirements.txtを使用 + packages: [] + # - "requests>=2.31.0" + # - "pillow" + + # requirements.txtを使用する場合 + useRequirementsTxt: false + + # requirements.txtの内容(useRequirementsTxt: trueの場合に使用) + requirementsTxt: | + requests>=2.31.0 + + # pip installのオプション + installOptions: "--no-cache-dir" + + # 追加のAPKパッケージ(ネイティブ拡張のビルドに必要な場合、例: numpy等) + additionalApkPackages: [] + # - "gcc" + # - "musl-dev" + # - "python3-dev" + # - "jpeg-dev" + # Selenium設定(レガシー互換性維持) selenium: enabled: false