Secrets 一元管理チャート secret-manager v0.1.0 を実装
Helm Chart Release / release-chart (push) Successful in 6s

クラスター横断で使う認証情報を1チャートで管理し、複数ネームスペースへ
同一 Secret として配布する仕組みを実装。

- distribution: namespaces への複製 / kubernetes-reflector 自動同期 /
  stakater-Reloader 連携を選択可能
- common: namePrefix・共通ラベル/アノテーション・immutable
- mail.providers: SMTP/IMAP/POP3 のサーバ情報 + パスワードを一元管理。
  source 可能な smtp.env と任意の msmtprc スニペットを Secret に同梱
- api.credentials: 任意のキー/値集合を Opaque Secret 化(envFrom 向け)
- generic.secrets: 任意 type(dockerconfigjson / tls / basic-auth 等)
- values.schema.json による厳格バリデーション
- examples/(Gmail・M365・SendGrid・SES・Mailgun・reflector)
- .gitea/workflows/helm-release.yaml で Package Registry へ自動発行
- README.md にセキュリティモデル・values リファレンス・参照方法を記載
- 平文資格情報の混入防止に .gitignore を整備
This commit is contained in:
2026-08-31 09:41:41 +09:00
parent 507fd48d11
commit f374cd2e49
16 changed files with 1329 additions and 1 deletions
+148
View File
@@ -0,0 +1,148 @@
# ==========================================================================
# secret-manager
# --------------------------------------------------------------------------
# クラスター内の複数プロジェクトで横断的に使う「認証情報」を、この1チャートで
# 一元管理する。ここを更新して `helm upgrade` するだけで、配布先の全ネーム
# スペースの Secret がまとめて更新される。
#
# セキュリティ上の注意(必読):
# - この values.yaml には平文の資格情報を "書かない"。Git にコミットしない。
# - 実際の値は次のいずれかで注入する:
# 1) CI(Gitea Actions)から `--set` / `--set-file` で Gitea Secrets を注入
# 2) SOPS で暗号化した values ファイル(helm-secrets プラグイン)
# 3) git 管理外の `secrets.values.yaml` を `-f` で渡す(.gitignore 済み)
# - 詳細は README.md「セキュリティモデル」を参照。
# ==========================================================================
# --------------------------------------------------------------------------
# distribution: 生成した Secret を「どこへ」配るか
# --------------------------------------------------------------------------
distribution:
# 同一 Secret を複製配置するネームスペースのリスト。
# ここに挙げるネームスペースは事前に存在している必要がある。
# リストから外して `helm upgrade` すると、そのネームスペースのコピーは削除される。
namespaces:
- default
# true の場合、リリース先ネームスペース (.Release.Namespace) も配布対象に自動追加する。
includeReleaseNamespace: true
# emberstack/kubernetes-reflector を使った自動同期(任意 / クラスターにコントローラーが必要)
# 有効化すると Secret はリリース先ネームスペースにのみ作成し、reflector アノテーションを
# 付与する。namespaceRegex に一致する全ネームスペースへコントローラーが複製・追従する。
# namespaces の列挙より柔軟だが、外部コンポーネントへの依存が増える。
reflector:
enabled: false
# 同期先ネームスペースを絞る正規表現(例: "team-.*" / "prod|staging")
namespaceRegex: ".*"
# stakater/Reloader 連携(任意 / クラスターにコントローラーが必要)
# 有効化すると各 Secret に `reloader.stakater.com/match: "true"` を付与する。
# 参照側の Deployment/StatefulSet に `reloader.stakater.com/auto: "true"` があれば、
# Secret 更新時に自動でローリング再起動される。
reloader:
enabled: false
# --------------------------------------------------------------------------
# common: 生成する全 Secret に共通の設定
# --------------------------------------------------------------------------
common:
# 生成される Secret 名のプレフィックス。エントリキーの前に付く。
# 例: namePrefix="cred-" + mail プロバイダ "gmail" -> Secret 名 "cred-gmail"
namePrefix: "cred-"
# 全 Secret に付与する追加ラベル
labels: {}
# 全 Secret に付与する追加アノテーション
annotations: {}
# Secret を immutable にする(kind: Secret の immutable: true)。
# 誤編集を防ぎ apiserver 負荷を下げるが、値を変えるには一度 delete が必要。
immutable: false
# --------------------------------------------------------------------------
# mail: 外部メールの接続情報(パスワード + サーバ情報)
# --------------------------------------------------------------------------
# providers.<キー> ごとに 1 つの Secret を生成する。Secret には以下が入る:
# 個別キー:
# SMTP_HOST / SMTP_PORT / SMTP_SECURITY / SMTP_USERNAME / SMTP_PASSWORD
# SMTP_FROM / SMTP_FROM_NAME / SMTP_REPLY_TO / SMTP_AUTH_METHOD
# IMAP_HOST / IMAP_PORT / IMAP_SECURITY / IMAP_USERNAME / IMAP_PASSWORD (imap 定義時)
# POP3_HOST / POP3_PORT / POP3_SECURITY / POP3_USERNAME / POP3_PASSWORD (pop3 定義時)
# まとめ:
# smtp.env ... `export KEY=VALUE` 形式。コンテナ内で `source` して利用可能
# msmtprc ... msmtp / PHP sendmail 用設定(renderMsmtprc: true のとき)
#
# 代表的なプロバイダの設定値は examples/ および README.md の一覧表を参照。
mail:
providers: {}
# gmail:
# enabled: true
# smtp:
# host: "smtp.gmail.com"
# port: 587
# security: "starttls" # none | starttls | tls
# username: "no-reply@example.com"
# password: "APP_PASSWORD" # ← 実値は --set / SOPS 経由で注入する
# from: "no-reply@example.com"
# fromName: "Example"
# replyTo: ""
# authMethod: "plain" # plain | login | cram-md5
# imap:
# host: "imap.gmail.com"
# port: 993
# security: "tls" # none | starttls | tls
# username: "" # 空なら smtp.username を流用
# password: "" # 空なら smtp.password を流用
# # pop3:
# # host: "pop.gmail.com"
# # port: 995
# # security: "tls"
# renderMsmtprc: true
# # このプロバイダだけ別ネームスペースへ配る場合(省略時は distribution 準拠)
# namespacesOverride: []
# # このプロバイダ Secret だけに付ける追加アノテーション
# annotations: {}
# --------------------------------------------------------------------------
# api: API 認証情報(任意のキー/値の集合)
# --------------------------------------------------------------------------
# credentials.<キー> ごとに 1 つの Opaque Secret を生成する。
# data 配下のキーがそのまま Secret のキーになる(`envFrom` でまとめて注入しやすい)。
api:
credentials: {}
# stripe:
# enabled: true
# data:
# STRIPE_SECRET_KEY: "sk_live_xxx"
# STRIPE_WEBHOOK_SECRET: "whsec_xxx"
# namespacesOverride: []
# annotations: {}
# openai:
# enabled: true
# data:
# OPENAI_API_KEY: "sk-xxx"
# --------------------------------------------------------------------------
# generic: 汎用 Secret(type を指定したい場合など)
# --------------------------------------------------------------------------
# 上記カテゴリに当てはまらない資格情報。任意の Secret type を指定できる。
generic:
secrets: {}
# private-registry:
# enabled: true
# type: kubernetes.io/dockerconfigjson
# data:
# .dockerconfigjson: '{"auths":{"registry.example.com":{"auth":"BASE64"}}}'
# namespacesOverride: []
# internal-tls:
# enabled: true
# type: kubernetes.io/tls
# data:
# tls.crt: |
# -----BEGIN CERTIFICATE-----
# ...
# tls.key: |
# -----BEGIN PRIVATE KEY-----
# ...