- 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:
@@ -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 }}
|
||||
@@ -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 }}
|
||||
|
||||
@@ -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 }}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user