diff --git a/CLAUDE.md b/CLAUDE.md index 0469b47..96e3adb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,6 +21,27 @@ WordPress本体はイメージ内蔵のもの(`docker.io/wordpress:-fpm-a ## チャート改修履歴 +### 外部Secret連携(extraEnvFrom / extraEnv / SMTP existingSecret)を追加(2026-09-08, v7.1.0-b) + +**背景**: 別リポジトリの `helmchart/secret-manager` チャートが各ネームスペースへ配布する +`cred-<名前>` Secret(メールの msmtprc / API キー)を WordPress 側から参照する口が無かった。 +phpfpm チャートと同一方針で受け口を追加(ユーザー指定によりパターンを踏襲)。 + +**修正内容**: +- `values.yaml` に `extraEnvFrom`(`envFrom` 配列)と `extraEnv`(生の env エントリ配列)を追加。 + 稼働中の `wordpress` コンテナにのみ注入(`wordpress-init` initContainer には入れない)。 +- `smtp.auth.existingSecret` / `existingSecretKey`: msmtprc はチャート生成のまま、パスワード + ファイルだけ既存 Secret から取得。 +- `smtp.existingMsmtprcSecret` / `existingMsmtprcSecretKey`: 完成済み msmtprc を持つ既存 Secret を + そのまま `/etc/smtp-config/msmtprc` にマウント。指定時は `configmap-smtp` を生成せず + host/port/auth.* は無視、`smtp-secrets` ボリュームも張らない。起動ログの echo も出し分け。 +- `templates/secret-smtp.yaml` / `templates/configmap-smtp.yaml` を上記フラグで出し分け。 +- 既定値は全て空 → 既存挙動は不変(`helm template` の全シナリオで確認済み)。 +- 主アプリ(WordPress 7.1.0)は変わらないため手動リリース `7.1.0-b`。 + +**対象ファイル**: `values.yaml`, `templates/deployment.yaml`, `templates/configmap-smtp.yaml`, +`templates/secret-smtp.yaml`, `Chart.yaml`, `README.md`, `CLAUDE.md` + ### Hello Dolly等のデフォルトプラグインが削除しても復活する不具合の修正(2026-08-08, v7.1.0-a) ※自動更新ワークフローがこの作業と並行してWordPress 7.1.0への正式リリース(v7.1.0)を実行したため、本修正はそのタグの上に手動リリース `7.1.0-a` として適用した。 diff --git a/Chart.yaml b/Chart.yaml index c684563..52eca42 100644 --- a/Chart.yaml +++ b/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: wordpress-nginx description: WordPress with Nginx and PHP-FPM on Kubernetes type: application -version: 7.1.0-a +version: 7.1.0-b appVersion: "7.1.0" keywords: - wordpress diff --git a/README.md b/README.md index 58ce220..fff5c0d 100644 --- a/README.md +++ b/README.md @@ -139,12 +139,42 @@ WordPressコンテナ内にはメール送信を行うMTA(sendmail相当のプ | `smtp.auth.enabled` | 認証有効化 | `true` | | `smtp.auth.username` | SMTPユーザー名 | `smtp-user@example.com` | | `smtp.auth.password` | SMTPパスワード | `""`(Secretで指定) | +| `smtp.auth.existingSecret` | パスワードを取得する既存 Secret 名(`smtp.auth.password` と自作 Secret の代わり) | `""` | +| `smtp.auth.existingSecretKey` | 上記 Secret 内のキー名 | `password` | +| `smtp.existingMsmtprcSecret` | 完成済み `msmtprc` を持つ既存 Secret 名。指定時はチャートの msmtprc 生成を行わず host/port/auth.* は無視(`from` のみ使用) | `""` | +| `smtp.existingMsmtprcSecretKey` | 上記 Secret 内の `msmtprc` キー名 | `msmtprc` | | `smtp.from` | 送信元メールアドレス(固定) | `noreply@example.com` | | `smtp.tls.verify` | TLS証明書検証 | `true` | | `smtp.tls.allowSelfSigned` | 自己署名証明書を許可 | `false` | 有効化すると、WordPressコンテナ起動時に `msmtp` を導入し、PHPの `sendmail_path` を `msmtp` 経由に設定します。`wp_mail()` はコード変更なしにそのままSMTP経由で送信されるようになります。 +#### secret-manager チャートとの連携(メール設定の一元管理) + +別リポジトリの **secret-manager** チャートが `cred-gmail` などに生成する完成済み `msmtprc` を +そのまま使う場合(メール設定の変更は secret-manager 側だけで済みます): + +```yaml +smtp: + enabled: true + from: "no-reply@your-domain.com" # PHP の sendmail_from 用に必要 + existingMsmtprcSecret: "cred-gmail" # このSecretの msmtprc キーをそのまま利用 +``` + +サーバ設定は values に残し、パスワードだけ一元管理したい場合: + +```yaml +smtp: + enabled: true + host: "smtp.gmail.com" + port: 587 + auth: + enabled: true + username: "no-reply@your-domain.com" + existingSecret: "cred-gmail" + existingSecretKey: "SMTP_PASSWORD" +``` + **設定例**: ```yaml @@ -177,6 +207,32 @@ helm upgrade --install my-wordpress . \ **注意**: `smtp.enabled: true` の場合、msmtpのインストール(`apk add`)のためWordPressコンテナはrootとして起動し、セットアップ完了後に `php-fpm` へexecします。PHP-FPMのワーカープロセス自体はイメージ標準の設定により引き続き `www-data`(非root)で動作するため、実際のPHPコード実行権限は変わりません。`smtp.enabled: false`(デフォルト)の場合は従来どおり非rootユーザー(uid82)でコンテナが起動します。 +### 追加の環境変数(extraEnvFrom / extraEnv) + +WordPress(php-fpm)コンテナに任意の環境変数を渡します。プラグインが読む API キー等を、 +別リポジトリの **secret-manager** チャートが配布する `cred-<名前>` Secret から注入する用途を +想定しています。認証情報の変更は secret-manager 側を更新するだけで反映できます。 + +| パラメータ | 説明 | デフォルト値 | +|-----------|------|-------------| +| `extraEnvFrom` | 既存の Secret / ConfigMap をまるごと環境変数として注入(`envFrom` 配列) | `[]` | +| `extraEnv` | 個別の環境変数を追加(生の `env` エントリ配列。`valueFrom`/`secretKeyRef` 可) | `[]` | + +```yaml +extraEnvFrom: + - secretRef: + name: cred-gemini # GEMINI_API_KEY 等が丸ごと環境変数になる +extraEnv: + - name: ANTHROPIC_API_KEY + valueFrom: + secretKeyRef: + name: cred-claude + key: ANTHROPIC_API_KEY +``` + +PHP 側では `getenv('GEMINI_API_KEY')` で取得できます(初期化用の initContainer には注入されず、 +稼働中の WordPress コンテナにのみ渡ります)。 + ### Service設定 | パラメータ | 説明 | デフォルト値 | diff --git a/templates/configmap-smtp.yaml b/templates/configmap-smtp.yaml index adbdf86..9e7bb39 100644 --- a/templates/configmap-smtp.yaml +++ b/templates/configmap-smtp.yaml @@ -1,4 +1,4 @@ -{{- if .Values.smtp.enabled }} +{{- if and .Values.smtp.enabled (not .Values.smtp.existingMsmtprcSecret) }} apiVersion: v1 kind: ConfigMap metadata: diff --git a/templates/deployment.yaml b/templates/deployment.yaml index 66d51f4..9492658 100644 --- a/templates/deployment.yaml +++ b/templates/deployment.yaml @@ -321,7 +321,11 @@ spec: sendmail_from = "{{ .Values.smtp.from }}" PHP_SMTP_EOF + {{- if .Values.smtp.existingMsmtprcSecret }} + echo "SMTP configured from existing secret: {{ .Values.smtp.existingMsmtprcSecret }}" + {{- else }} echo "SMTP configured: {{ .Values.smtp.host }}:{{ .Values.smtp.port }}" + {{- end }} exec php-fpm {{- else }} command: ["php-fpm"] @@ -343,6 +347,13 @@ spec: key: db-password - name: WORDPRESS_TABLE_PREFIX value: {{ .Values.wordpress.tablePrefix | quote }} + {{- with .Values.extraEnv }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.extraEnvFrom }} + envFrom: + {{- toYaml . | nindent 12 }} + {{- end }} volumeMounts: - name: wordpress-data mountPath: /var/www/html @@ -352,7 +363,7 @@ spec: - name: smtp-config mountPath: /etc/smtp-config readOnly: true - {{- if .Values.smtp.auth.enabled }} + {{- if and .Values.smtp.auth.enabled (not .Values.smtp.existingMsmtprcSecret) }} - name: smtp-secrets mountPath: /etc/smtp-secrets readOnly: true @@ -380,17 +391,26 @@ spec: {{- end }} {{- if .Values.smtp.enabled }} - name: smtp-config + {{- if .Values.smtp.existingMsmtprcSecret }} + # 完成済み msmtprc を持つ既存 Secret(secret-manager の cred-* 等)を利用 + secret: + secretName: {{ .Values.smtp.existingMsmtprcSecret }} + items: + - key: {{ .Values.smtp.existingMsmtprcSecretKey | default "msmtprc" }} + path: msmtprc + {{- else }} configMap: name: {{ include "wordpress-nginx.fullname" . }}-smtp-config items: - key: msmtprc path: msmtprc - {{- if .Values.smtp.auth.enabled }} + {{- end }} + {{- if and .Values.smtp.auth.enabled (not .Values.smtp.existingMsmtprcSecret) }} - name: smtp-secrets secret: - secretName: {{ include "wordpress-nginx.fullname" . }}-smtp + secretName: {{ .Values.smtp.auth.existingSecret | default (printf "%s-smtp" (include "wordpress-nginx.fullname" .)) }} items: - - key: password + - key: {{ .Values.smtp.auth.existingSecretKey | default "password" }} path: password # 0600だとSecretボリュームの所有者はroot、 # msmtpはPHP-FPMワーカー(www-data等の非root)から実行されるため読めない diff --git a/templates/secret-smtp.yaml b/templates/secret-smtp.yaml index cf92b19..8951613 100644 --- a/templates/secret-smtp.yaml +++ b/templates/secret-smtp.yaml @@ -1,4 +1,4 @@ -{{- if .Values.smtp.enabled }} +{{- if and .Values.smtp.enabled (not .Values.smtp.existingMsmtprcSecret) (not .Values.smtp.auth.existingSecret) }} apiVersion: v1 kind: Secret metadata: diff --git a/values.yaml b/values.yaml index e5ca933..73ed2e5 100644 --- a/values.yaml +++ b/values.yaml @@ -69,6 +69,15 @@ smtp: # helm install ... --set smtp.auth.password='your-password' 等で指定 password: "" + # 【外部Secret連携】チャートで msmtprc を生成しつつ、パスワードファイルだけ + # 既存 Secret から取りたい場合に指定する。 + # 例: secret-manager チャートが配布する cred-<プロバイダ> の SMTP_PASSWORD キー + # existingSecret: "cred-gmail" + # existingSecretKey: "SMTP_PASSWORD" + # 指定時は smtp.auth.password と自作の -smtp Secret は使われない。 + existingSecret: "" + existingSecretKey: "password" + # 送信元アドレス(固定値。wp-config.phpやプラグイン側の指定より優先されます) from: "noreply@example.com" @@ -79,6 +88,35 @@ smtp: # 自己署名証明書を許可する場合(テスト環境のみ) allowSelfSigned: false + # 【外部Secret連携】完成済みの msmtprc がまるごと入っている既存 Secret を使う。 + # 指定するとチャート内の msmtprc 生成(configmap-smtp)は行わず、 + # host / port / protocol / auth.* / tls.* は無視される(from だけ PHP の + # sendmail_from 用に使用)。 + # secret-manager チャートが cred-<プロバイダ> に生成する msmtprc キーを + # そのまま利用できる: + # existingMsmtprcSecret: "cred-gmail" + # existingMsmtprcSecretKey: "msmtprc" + existingMsmtprcSecret: "" + existingMsmtprcSecretKey: "msmtprc" + +# 既存の Secret / ConfigMap をまるごと環境変数として wordpress コンテナへ注入する(envFrom)。 +# 別リポジトリの secret-manager チャートが各ネームスペースへ配布する +# cred-<名前> Secret(API キー等)をそのまま読み込む用途を想定。 +# 変更は secret-manager 側を更新するだけで全プロジェクトに反映できる。 +extraEnvFrom: [] +# - secretRef: +# name: cred-gemini +# - secretRef: +# name: cred-openai + +# 個別の環境変数を追加する(生の env エントリ配列。value / valueFrom(secretKeyRef 等) 使用可)。 +extraEnv: [] +# - name: OPENAI_API_KEY +# valueFrom: +# secretKeyRef: +# name: cred-openai +# key: OPENAI_API_KEY + nginx: # Ingress ControllerやCDN(Cloudflare等)、外部LB等、X-Forwarded-Forヘッダーを # 付与するリバースプロキシを前段に置く場合にのみ有効にしてください。