fix: 実IPアドレス取得とメール送信の不具合を修正
Helm Chart Release / release-chart (push) Successful in 6s

- service.externalTrafficPolicy: Local を追加し、kube-proxyのSNATによる
  実IPアドレス消失を解消(ベアメタル/MetalLB構成向け)
- wp-config.php内の危険な二重REMOTE_ADDR上書き処理を削除
  (Nginx real_ipモジュールの信頼境界を迂回できるIP詐称の余地があった)
- smtp.* 設定を追加し、msmtp経由の外部SMTPリレー送信に対応
  (helmchart/phpfpm と同一の実装パターンを踏襲)
- README.md / CLAUDE.md を更新
This commit is contained in:
2026-08-08 00:24:05 +09:00
parent 2d698e6148
commit 40ca516249
8 changed files with 299 additions and 12 deletions
+48
View File
@@ -0,0 +1,48 @@
{{- if .Values.smtp.enabled }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "wordpress-nginx.fullname" . }}-smtp-config
labels:
{{- include "wordpress-nginx.labels" . | nindent 4 }}
data:
msmtprc: |
# msmtp設定ファイル
# PHPのsendmail_pathから呼び出される(wp_mail()経由の送信もこれを使用)
defaults
{{- if .Values.smtp.tls.verify }}
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
{{- else }}
tls off
{{- end }}
{{- if .Values.smtp.tls.allowSelfSigned }}
tls_certcheck off
{{- else }}
tls_certcheck on
{{- end }}
account default
host {{ .Values.smtp.host }}
port {{ .Values.smtp.port }}
{{- if eq .Values.smtp.protocol "starttls" }}
protocol smtp
{{- else if eq .Values.smtp.protocol "tls" }}
protocol smtps
{{- else if eq (int .Values.smtp.port) 465 }}
protocol smtps
{{- else }}
protocol smtp
{{- end }}
{{- if .Values.smtp.auth.enabled }}
auth on
user {{ .Values.smtp.auth.username }}
passwordeval "cat /etc/smtp-secrets/password"
{{- else }}
auth off
{{- end }}
from {{ .Values.smtp.from }}
{{- end }}
+62 -9
View File
@@ -69,15 +69,10 @@ spec:
$_SERVER['HTTPS'] = 'on';
}
{{- if .Values.nginx.forwardRealIP.enabled }}
// Add Trusted Proxy - Extract Real Client IP from X-Forwarded-For header
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$forwarded_ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = trim($forwarded_ips[0]);
} elseif (isset($_SERVER['HTTP_X_REAL_IP'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_REAL_IP'];
}
{{- end }}
// 実クライアントIPの解決はNginx側(real_ipモジュール)で完結しており、
// fastcgi_param REMOTE_ADDR として渡されるためPHP側での再判定は行わない。
// ここでX-Forwarded-Forを無条件に信頼して上書きすると、Nginxの信頼済み
// プロキシ判定を迂回してクライアントがIPを詐称できてしまうため実施しない。
$protocol = 'http';
if ( isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ) {
@@ -291,10 +286,38 @@ spec:
- name: wordpress
image: "{{ .Values.image.wordpress.registry }}/{{ .Values.image.wordpress.repository }}:{{ .Values.image.wordpress.tag }}"
imagePullPolicy: {{ .Values.image.wordpress.pullPolicy }}
{{- if .Values.smtp.enabled }}
# SMTP有効時はapk addでmsmtpを導入する必要があるためrootで起動し、
# セットアップ後にphp-fpmへexecする(ワーカープロセス自体はイメージ標準の
# www.confによりwww-data(uid82)で動作するため実処理は非rootのまま)
command: ["/bin/sh", "-c"]
args:
- |
set -e
echo "Configuring SMTP for mail sending..."
apk add --no-cache msmtp ca-certificates
# msmtpはPHP-FPMワーカー(www-data等の非root)から実行されるため、
# rootが作成するこのファイルも読み取り可にする必要がある
# (実パスワードはpasswordeval経由で別ファイルから取得するため、
# msmtprc自体に平文パスワードは含まれない)
cp /etc/smtp-config/msmtprc /etc/msmtprc
chmod 644 /etc/msmtprc
cat > /usr/local/etc/php/conf.d/99-smtp.ini << 'PHP_SMTP_EOF'
; SMTP設定 - msmtp経由でメール送信
sendmail_path = "/usr/bin/msmtp -t"
sendmail_from = "{{ .Values.smtp.from }}"
PHP_SMTP_EOF
echo "SMTP configured: {{ .Values.smtp.host }}:{{ .Values.smtp.port }}"
exec php-fpm
{{- else }}
command: ["php-fpm"]
securityContext:
runAsUser: 82
runAsGroup: 82
{{- end }}
env:
- name: WORDPRESS_DB_HOST
value: {{ .Values.wordpress.dbHost | quote }}
@@ -314,6 +337,16 @@ spec:
mountPath: /var/www/html
- name: wordpress-persistent
mountPath: /var/www/html/wp-content
{{- if .Values.smtp.enabled }}
- name: smtp-config
mountPath: /etc/smtp-config
readOnly: true
{{- if .Values.smtp.auth.enabled }}
- name: smtp-secrets
mountPath: /etc/smtp-secrets
readOnly: true
{{- end }}
{{- end }}
resources:
{{- toYaml .Values.resources.wordpress | nindent 12 }}
volumes:
@@ -334,6 +367,26 @@ spec:
configMap:
name: {{ include "wordpress-nginx.fullname" . }}-adstxt
{{- end }}
{{- if .Values.smtp.enabled }}
- name: smtp-config
configMap:
name: {{ include "wordpress-nginx.fullname" . }}-smtp-config
items:
- key: msmtprc
path: msmtprc
{{- if .Values.smtp.auth.enabled }}
- name: smtp-secrets
secret:
secretName: {{ include "wordpress-nginx.fullname" . }}-smtp
items:
- key: password
path: password
# 0600だとSecretボリュームの所有者はroot、
# msmtpはPHP-FPMワーカー(www-data等の非root)から実行されるため読めない
# → 全ユーザー読み取り可にする(ボリュームはPod内にしか存在しないため許容範囲)
mode: 0644
{{- end }}
{{- end }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
+13
View File
@@ -0,0 +1,13 @@
{{- if .Values.smtp.enabled }}
apiVersion: v1
kind: Secret
metadata:
name: {{ include "wordpress-nginx.fullname" . }}-smtp
labels:
{{- include "wordpress-nginx.labels" . | nindent 4 }}
type: Opaque
data:
{{- if .Values.smtp.auth.enabled }}
password: {{ .Values.smtp.auth.password | b64enc }}
{{- end }}
{{- end }}
+5
View File
@@ -6,6 +6,11 @@ metadata:
{{- include "wordpress-nginx.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
{{- if and .Values.service.externalTrafficPolicy (ne .Values.service.type "ClusterIP") }}
# ベアメタル環境(MetalLB等)でkube-proxyのSNATを回避し、クライアントの実IPを
# $remote_addr にそのまま渡すための設定。LoadBalancer/NodePortでのみ有効。
externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy }}
{{- end }}
ports:
- port: {{ .Values.service.port }}
targetPort: http