Helm Chart Release / release-chart (push) Successful in 6s
あるプロジェクトから「serverSnippet が効かない」「snippet は古いキー」との 指摘があり調査した結果、指摘の前提は誤りだった。 - 実際に使われる templates/configmap.yaml が読むのは snippet で、values.yaml と README も snippet で一致している。 - serverSnippet / httpSnippet は、.Values.nginx.enabled が存在せず一度も出力 されない configmap-nginx.yaml だけが読むキーで、values・README に載ったことが なく、指定しても黙って無視される。 - README 例6・例9 が snippet に client_max_body_size を書く手順になっており、 v8.5.9-b 以降は uploadMaxSize の自動出力と重複して nginx が起動しない (2026-09-29 の障害の発生源)。例6 は location ~ \.php$ も重複定義していた。 挙動の変更はなくドキュメント・コメントのみ。 - values.yaml / README: 読まれるキーは snippet のみ、挿入先は server ブロック内、 client_max_body_size は書かず uploadMaxSize を使うことを明記 - README 例6・例9 を uploadMaxSize 指定に修正 - configmap-nginx.yaml: 未使用であることを示す注記を追加 手動リリース 8.5.11-a。
368 lines
16 KiB
YAML
368 lines
16 KiB
YAML
replicaCount: 1
|
||
|
||
image:
|
||
nginx:
|
||
registry: docker.io
|
||
repository: nginx
|
||
tag: "1.31.7-alpine-perl"
|
||
pullPolicy: IfNotPresent
|
||
php:
|
||
registry: docker.io
|
||
repository: php
|
||
tag: "8.5.11-fpm-alpine3.24"
|
||
pullPolicy: IfNotPresent
|
||
selenium:
|
||
registry: docker.io
|
||
repository: selenium/standalone-chromium
|
||
tag: "155.0-chromedriver-155.0"
|
||
pullPolicy: IfNotPresent
|
||
|
||
service:
|
||
type: ClusterIP
|
||
# type: LoadBalancer
|
||
port: 80
|
||
|
||
# アップロード可能な最大サイズ
|
||
# 以下3箇所に同じ値を反映する(どれか一つでも小さいと、そこで上限に達して失敗するため):
|
||
# - nginx(Podコンテナ内)の client_max_body_size
|
||
# - PHPの upload_max_filesize / post_max_size
|
||
# - ingress.enabled: true の場合、ingress-nginxの nginx.ingress.kubernetes.io/proxy-body-size
|
||
# 単位はnginx/PHP共通でk/m/g(大文字小文字問わず)が使用可能(例: "100m", "1g")
|
||
uploadMaxSize: "100m"
|
||
|
||
ingress:
|
||
enabled: false
|
||
className: ""
|
||
# nginx.ingress.kubernetes.io/proxy-body-size は uploadMaxSize の値が自動的に付与されるため
|
||
# 明示的に指定する必要はない(Ingress側の上限もnginx/PHPと揃う)
|
||
# 別の値にしたい場合や別コントローラーを使う場合は、ここに明示指定すれば上書きされる
|
||
annotations:
|
||
{
|
||
acme.cert-manager.io/http01-ingress-class: "nginx",
|
||
cert-manager.io/cluster-issuer: "letsencrypt-issuer",
|
||
nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
|
||
}
|
||
hosts:
|
||
- host: &appDomain example.tld
|
||
paths:
|
||
- path: /
|
||
pathType: Prefix
|
||
# secretNameは省略可能。省略した場合、そのエントリの最初のhostの"."を"-"に
|
||
# 置換し"-tls"を付与した値が自動生成される(例: example.tld → example-tld-tls)。
|
||
# appDomainの変更だけでhostとsecretNameが揃うため、通常は明示指定しなくてよい。
|
||
# 別の証明書Secret名にしたい場合のみ secretName: "your-secret-name" を追加する。
|
||
tls:
|
||
[
|
||
{
|
||
hosts: [*appDomain]
|
||
}
|
||
]
|
||
|
||
persistence:
|
||
enabled: true
|
||
accessMode: ReadWriteOnce
|
||
size: 1Gi
|
||
|
||
nginx:
|
||
# 独自のnginx設定を、server { } ブロックの末尾へそのまま挿入する(templates/configmap.yaml)。
|
||
# 読まれるキーは snippet のみ。serverSnippet / httpSnippet は未使用の
|
||
# templates/configmap-nginx.yaml 専用で出力されないため、指定しても無視される。
|
||
# また挿入先は server ブロック内のため、http レベル専用のディレクティブ
|
||
# (limit_req_zone 等)は書けない。
|
||
#
|
||
# 【重複注意】以下はチャートが自動で出力するため snippet に書かない
|
||
# (書くと "directive is duplicate" 等で nginx が起動しなくなる):
|
||
# - client_max_body_size → uploadMaxSize で設定する
|
||
# - location = /sitemap.xml(Content-Typeの明示)
|
||
customConfig:
|
||
enabled: false
|
||
snippet: |-
|
||
|
||
# リアルIP転送設定(ベアメタル/LoadBalancer環境向け)
|
||
forwardRealIP:
|
||
# リアルIP取得機能を有効化
|
||
enabled: true
|
||
|
||
# リアルIPを取得するヘッダー名
|
||
# LoadBalancer/Ingressによって異なる
|
||
# - X-Real-IP: シンプルな1段プロキシ
|
||
# - X-Forwarded-For: 多段プロキシ対応(推奨)
|
||
header: "X-Forwarded-For"
|
||
|
||
# 再帰的にリアルIPを検索(多段プロキシ環境で推奨)
|
||
recursive: true
|
||
|
||
# 信頼するプロキシのネットワーク範囲
|
||
# ベアメタルクラスターでは、PodネットワークとServiceネットワークを指定
|
||
trustedProxies:
|
||
- "10.0.0.0/8" # プライベートネットワーク
|
||
- "172.16.0.0/12" # プライベートネットワーク
|
||
- "192.168.0.0/16" # プライベートネットワーク
|
||
|
||
# 追加で信頼するプロキシ(環境に応じてカスタマイズ)
|
||
additionalTrustedProxies: []
|
||
# - "203.0.113.0/24" # 外部LoadBalancerなど
|
||
|
||
# Composer設定
|
||
composer:
|
||
# Composerを使用するかどうか
|
||
enabled: false
|
||
|
||
# Composerの導入先ディレクトリ(composer.json / vendor の配置先)
|
||
# デフォルトの /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"
|
||
|
||
# Composerでインストールするパッケージ
|
||
# packages配列が空の場合、composer.jsonを使用
|
||
packages: []
|
||
# - "monolog/monolog:^2.0"
|
||
# - "guzzlehttp/guzzle:^7.0"
|
||
|
||
# composer.jsonファイルを使用する場合
|
||
useComposerJson: false
|
||
|
||
# composer.jsonの内容(useComposerJson: trueの場合に使用)
|
||
composerJson: |
|
||
{
|
||
"require": {
|
||
"monolog/monolog": "^2.0"
|
||
}
|
||
}
|
||
|
||
# composer.lockファイルの内容(オプション、再現性を保証)
|
||
composerLock: ""
|
||
|
||
# Composerのインストールオプション
|
||
installOptions: "--no-dev --optimize-autoloader"
|
||
|
||
# 追加のAPKパッケージ(Composer依存関係のビルドに必要な場合)
|
||
additionalApkPackages: []
|
||
# - "libpng-dev"
|
||
# - "libjpeg-turbo-dev"
|
||
|
||
# 追加のPHP拡張(docker-php-ext-installで導入)
|
||
additionalPhpExtensions: []
|
||
# - "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設定
|
||
# v8.5.10-b以降、Selenium(有効時)はnginx/php-fpmと同一Podのサイドカーではなく、
|
||
# 独立したDeployment/Service(<release>-phpfpm-selenium)として起動する。
|
||
# 理由: サイドカー方式だとSelenium単体の不調(起動失敗・OOM等)でPod全体がReady=false
|
||
# になり、Seleniumを使わない静的ページ配信まで巻き込まれてサービス全体が止まっていた。
|
||
# php-fpmコンテナのSELENIUM_URL環境変数は、enabled:true時に自動でこのServiceを指す
|
||
# (phpEnvで独自に設定しても、こちらの値が優先される)。
|
||
selenium:
|
||
enabled: false
|
||
# Selenium Deployment自体のレプリカ数
|
||
replicaCount: 1
|
||
# Chromiumはメモリを多く使う。ノードのメモリ枯渇によるOOM Killを防ぐため、
|
||
# 実運用では必ずrequests/limitsを設定することを推奨する(下記resourcesセクション参照)。
|
||
resources: {}
|
||
# trueにすると、SeleniumコンテナにもPVCのhtmlサブパスを/var/www/htmlとしてマウントする
|
||
# (ブラウザのダウンロード先を公開ディレクトリに置きたい場合など)。別Podからの同時マウント
|
||
# になるため、有効にする場合はpersistence.accessModeをReadWriteMany
|
||
# (NFSバックエンドのStorageClassなら対応可能)にする必要がある。
|
||
# 通常のスクレイピング用途(スクリーンショット等をstorage/等の非公開領域に保存する場合)
|
||
# では不要なため、既定はfalse。
|
||
mountHtml: false
|
||
|
||
# 定期実行タスク(Kubernetes CronJob)
|
||
# php-fpmと同じPHPイメージ(image.php)を使い、指定したスケジュールで
|
||
# 1回限りのコマンドを実行するCronJobを作成する。複数ジョブを配列で定義できる。
|
||
# jobsが空の場合、CronJobは1つも作成されない。
|
||
#
|
||
# 【マウント/環境変数】/var/wwwにPVCルートをマウントし、externalDatabase/phpEnv/
|
||
# extraEnv/extraEnvFrom/SELENIUM_URLはphp-fpmコンテナと同じ内容が渡される。
|
||
# html/ 配下の公開コード、または /var/www/<非公開フォルダ> 配下の
|
||
# 非公開スクリプト・出力先のどちらも利用できる。
|
||
#
|
||
# 【Composer/Pythonとの併用について】
|
||
# composer.workingDir / python.venvDir が既定の /composer, /venv
|
||
# (PVC非マウントの使い捨て領域)のままの場合、CronJobのPodには存在しない
|
||
# (php-fpmの長時間稼働Pod内だけに存在する)ため利用できない。
|
||
# CronJobからComposer/Pythonの成果物を使いたい場合は、
|
||
# composer.workingDir: "/var/www/composer" のように/var/www配下へ変更し、
|
||
# PVC上に永続化すること(本体Deployment側で一度セットアップされていれば、
|
||
# CronJob側は改めてインストールし直す必要はない)。
|
||
#
|
||
# 【SMTPとの併用】smtp.enabled: true の場合、CronJobのPodでもmsmtpの導入・
|
||
# msmtprc配置・sendmail_path設定を自動で行うため、PHPのmail()関数がそのまま使える。
|
||
cron:
|
||
jobs: []
|
||
# - name: daily-report # 必須。CronJob名の一部に使用(英数字とハイフンのみ、小文字推奨)
|
||
# schedule: "0 18 * * *" # 必須。標準cron形式(timeZone省略時はUTC基準)
|
||
# command: "php /var/www/html/cron/daily-report.php"
|
||
# timeZone: "Asia/Tokyo" # 省略時はUTC(Kubernetes 1.27+で安定サポート)
|
||
# concurrencyPolicy: "Forbid" # Allow / Forbid / Replace(既定: Forbid。前回実行の長期化による多重起動を防止)
|
||
# restartPolicy: "OnFailure" # OnFailure / Never(既定: OnFailure)
|
||
# successfulJobsHistoryLimit: 3
|
||
# failedJobsHistoryLimit: 1
|
||
# activeDeadlineSeconds: 3600 # 実行タイムアウト(秒)。省略可
|
||
# suspend: false # trueにするとコード変更なしでこのジョブだけ一時停止できる
|
||
# resources: {} # 未指定時は resources.phpfpm を流用
|
||
|
||
externalDatabase:
|
||
enabled: false
|
||
host: mariadb-hostname
|
||
port: 3306
|
||
database: dbname
|
||
username: user
|
||
password: pass
|
||
|
||
# SMTP設定(PHPのメール送信用)
|
||
smtp:
|
||
enabled: false
|
||
|
||
# SMTPサーバー設定
|
||
host: "smtp.example.com"
|
||
|
||
# プロトコルとポート設定
|
||
# - auto: 自動判定(推奨)
|
||
# - starttls: STARTTLS(ポート587)
|
||
# - tls: SSL/TLS(ポート465)
|
||
protocol: "auto"
|
||
|
||
# ポート番号(通常は自動判定されるため手動設定は不要)
|
||
# protocol: auto の場合は以下の値を参考に
|
||
# - 25: SMTP (非暗号化)
|
||
# - 587: SMTP + STARTTLS (暗号化)
|
||
# - 465: SMTP + SSL/TLS (暗号化)
|
||
port: 587
|
||
|
||
# 認証設定
|
||
auth:
|
||
enabled: true
|
||
username: "smtp-user@example.com"
|
||
# password はSecretで管理する
|
||
# values-secret.yaml などで以下のように指定:
|
||
# smtp:
|
||
# auth:
|
||
# password: "your-smtp-password"
|
||
password: ""
|
||
|
||
# 【外部Secret連携】チャートで msmtprc を生成しつつ、パスワードファイルだけ
|
||
# 既存 Secret から取りたい場合に指定する。
|
||
# 例: secret-manager チャートが配布する cred-<プロバイダ> の SMTP_PASSWORD キー
|
||
# existingSecret: "cred-gmail"
|
||
# existingSecretKey: "SMTP_PASSWORD"
|
||
# 指定時は smtp.auth.password と自作の -smtp Secret は使われない。
|
||
existingSecret: ""
|
||
existingSecretKey: "password"
|
||
|
||
# 送信元アドレス(固定値)
|
||
# PHPプログラムで mail() 関数の $additional_parameters で上書き可能
|
||
# 例: mail($to, $subject, $body, $headers, "-f user@example.com")
|
||
from: "noreply@example.com"
|
||
|
||
# TLS/SSL設定
|
||
tls:
|
||
# 証明書検証を有効化(本番環境では true を推奨)
|
||
verify: true
|
||
# 自己署名証明書を許可する場合(テスト環境のみ)
|
||
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"
|
||
|
||
# nginx / php-fpm コンテナの CPU/メモリ requests・limits。
|
||
# v8.5.10-b より前は本キーがテンプレート側で参照されておらず(死んだ設定)、
|
||
# 何を指定してもコンテナには一切反映されない不具合があった(既存デプロイは
|
||
# 全コンテナが requests/limits なしの QoS Class: BestEffort になっていた)。
|
||
# BestEffortはノードのメモリ逼迫時にOOM Killの対象になりやすいため、
|
||
# 本番運用では requests/limits の設定を推奨する。例:
|
||
# resources:
|
||
# nginx:
|
||
# requests: { cpu: "50m", memory: "64Mi" }
|
||
# limits: { memory: "128Mi" }
|
||
# phpfpm:
|
||
# requests: { cpu: "100m", memory: "256Mi" }
|
||
# limits: { memory: "512Mi" }
|
||
# (selenium用は selenium.resources を参照。Chromiumは256Mi等では確実に不足する)
|
||
resources:
|
||
nginx: {}
|
||
phpfpm: {}
|
||
|
||
# PHP-FPM コンテナに渡す任意の環境変数
|
||
# DB接続情報(externalDatabase)と同様に、values.yamlで設定した値がPHPに環境変数として渡される
|
||
# PHPからは $_ENV['KEY'] または getenv('KEY') で取得可能
|
||
phpEnv: {}
|
||
# API_KEY: "your-api-key"
|
||
# STRIPE_SECRET: "sk_live_xxxxxxxxxxxxxxxx"
|
||
# REDIS_URL: "redis://localhost:6379"
|
||
# SOME_SERVICE_URL: "https://api.example.com"
|
||
|
||
# 既存の Secret / ConfigMap をまるごと環境変数として PHP-FPM コンテナへ注入する(envFrom)。
|
||
# 別リポジトリの secret-manager チャートが各ネームスペースへ配布する
|
||
# cred-<名前> Secret(API キー等)をそのまま読み込む用途を想定。
|
||
# 変更は secret-manager 側を更新するだけで全プロジェクトに反映できる。
|
||
extraEnvFrom: []
|
||
# - secretRef:
|
||
# name: cred-gemini
|
||
# - secretRef:
|
||
# name: cred-openai
|
||
# - configMapRef:
|
||
# name: some-shared-config
|
||
|
||
# 個別の環境変数を追加する(生の env エントリ配列。value / valueFrom(secretKeyRef 等) 使用可)。
|
||
extraEnv: []
|
||
# - name: OPENAI_API_KEY
|
||
# valueFrom:
|
||
# secretKeyRef:
|
||
# name: cred-openai
|
||
# key: OPENAI_API_KEY |