Skip to content

chore: フォルダを減らす(talos の手書き部分を controlplane.yaml 1 本に、apps の小物をまとめる) - #466

Merged
5ym merged 5 commits into
mainfrom
chore/fewer-folders
Oct 20, 2026
Merged

5ym merged 5 commits into
mainfrom
chore/fewer-folders

Conversation

@5ym

@5ym 5ym commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

変更

talos/(フォルダ 2 → 0)

  • patches/*.yaml(6 本)と registries.yaml を controlplane.yaml 1 本にまとめた。手で書く machine config はこれだけ
  • fj.doany.io のパスワードは controlplane.yaml の中で password の値だけ SOPS 暗号化(encrypted_regex + mac_only_encrypted。平文の部分は sops を通さず直せる)。render.sh は sops -d するだけ。CI は ENC[…] を ci-dummy に置き換える(cloudflare-secret.sops.yaml と同じ)。代わりに SOPS がドキュメントごとに sops: を付け、インデントが 4 になる
  • manifests/local-path.yaml → local-path.yaml

apps/(フォルダ 5 → 1)

  • infisical-operator/・infisical-push-bridge/ → apps/infisical/(operator.yaml・operator-rbac.yaml・push-bridge.yaml)
  • metrics-server/・pt3/ → apps/cluster/
  • apps/ は 1 つの Application(gitops、recurse)なので、移動でリソースは作り直されない

CI(talos-boot)・.sops.yaml・.gitignore・ドキュメントのパスも追随。

生成済みの controlplane.yaml を丸ごとコミットしない理由

生成物は約 300 KB で、9 割が chart を描いた inlineManifest(1 行の文字列)。読めず、chart / Kubernetes の版上げのたびに描き直しコミットが要る。inlineManifest をローカルファイルで指す仕組みは Talos に無く(issue / PR も無し。外を指せるのは URL の KubeExternalManifestConfig だけ)、ファイルを包むのは render.sh の役目のまま。talos/README.md に書いた。

確認

本物の秘密で main とこのブランチの render.sh を流して比べた。差は UserVolumeConfig の並び順と、inline manifest 内のコメント 3 行(パスの書き換え)だけ。registry のパスワードも同じ値に埋まった。当て直しは不要。

🤖 Generated with Claude Code

https://claude.ai/code/session_01NN4TmSXHrMP8dkTbtkjfz1

- talos/patches/*.yaml(6 本)と talos/registries.yaml を talos/controlplane.yaml にまとめる。
  秘密は書かず `${FJ_REGISTRY_PASSWORD}` を置き、render.sh が secrets.yaml(SOPS)の
  fjRegistryPassword で埋める(埋め残しがあれば止まる)。Talos の秘密は secrets.yaml 1 本に
- talos/manifests/local-path.yaml → talos/local-path.yaml
- apps/infisical-operator/・apps/infisical-push-bridge/ → apps/infisical/
- apps/metrics-server/・apps/pt3/ → apps/cluster/
- CI(talos-boot)・.sops.yaml・.gitignore・ドキュメントのパスを追随

本物の秘密で main とこのブランチの render.sh を流し、生成物はドキュメントの順番と
inline manifest のコメント(パスの書き換え)以外同じであることを確かめた。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NN4TmSXHrMP8dkTbtkjfz1
@claude

claude Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 23s —— View job


レビュー結果

大きな問題は見つかりませんでした。指摘は下の 2 点(どちらも軽微・要確認)です。

確認したこと

  • 旧パスの残存参照(patches/、registries.yaml、infisical-operator/、apps/pt3 など)を grep しました。残っていたのは apps/infisical/push-bridge.yaml 内の Infisical 側のフォルダパスだけで、これは移動対象外なので問題ありません。
  • .sops.yaml の creation_rules を整理した点は、secrets.yaml に fjRegistryPassword が追加され、暗号化も secrets.yaml の rule に載るので辻褄が合っています。
  • talos-boot.yml の CI では、gen secrets の出力にダミーの fjRegistryPassword を足して render を通す形になっています。render.sh の埋め残しチェックと整合しています。
  • render.sh の awk による置換は、コメント行を飛ばし、ENVIRON に無いキーなら停止します。値に / や & が入っても壊れません。$patch: delete は [A-Z_]+ に一致しないので誤爆しません。
  • apps/ を 1 つの Application(recurse)で同期しているので、移動でリソースは作り直されません。PR 本文の説明どおりです。

指摘(要確認・軽微)

  1. talos/render.sh:31 で、tr -d "\"'" によって値の中の引用符をすべて削除しています。パスワードに ' や " が含まれると黙って別の値になります。現状のパスワードには含まれない(PR 本文の比較で一致を確認済み)ので実害はありません。ただ、将来ローテーションしたときに壊れます。先頭と末尾の引用符だけを外すか、yq で読むと安全です。
  2. talos/controlplane.yaml:51 の password: ${FJ_REGISTRY_PASSWORD} は引用符なしの plain scalar に置換されます。値が #、: 、先頭の */&/!/@ などを含むと、YAML として壊れるか別の値になります。talosctl validate では気づけない可能性があります(壊れない別値になる場合)。置換後の値を YAML の引用形("…" とエスケープ)にして埋めるか、パスワードの文字種を制限する旨を README に書いておくと安心です。

テスト
CI(talos-boot)で、ダミーの秘密を使った render と talosctl validate が通る構成のままです。ファイル分割のリファクタとしては十分だと思います。

5ym and others added 2 commits October 20, 2026 12:30
印を "${…}" で囲み、埋めるときに \ と " をエスケープする(値の # や : で YAML が壊れない)。
secrets.yaml の値は外側の引用符だけ外す。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NN4TmSXHrMP8dkTbtkjfz1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NN4TmSXHrMP8dkTbtkjfz1
@claude

claude Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 16s —— View job


レビュー結果

大きな問題は見つかりませんでした。指摘は下の 1 点(要確認・軽微)だけです。

前回の指摘は解消済み

  • controlplane.yaml:51 の password: "${FJ_REGISTRY_PASSWORD}" は二重引用符つきになりました。render.sh の awk が \ と " をエスケープして埋めるので、値の # や : で YAML が壊れることはありません。
  • render.sh の secret() が外すのは外側の引用符 1 組だけになりました。値の中の引用符は残ります。

確認したこと

  • render.sh は、コメント行を飛ばし、ENVIRON に無いキーなら止まります。$patch: delete は [A-Z_]+ に一致しないので誤爆しません。
  • CI は gen secrets の出力に fjRegistryPassword: ci-dummy を足します。.sops.yaml の talos/secrets.yaml の rule が新しいキーも暗号化します。
  • CI の yq の参照先は talos/patches/cluster.yaml から talos/controlplane.yaml に変わっています。
  • apps/ は 1 つの Application(recurse)で同期されます。移動でリソースが作り直されない、という PR 本文の説明どおりです。

指摘(要確認・軽微)

  • talos/render.sh の secret() は、sops -d が出した 1 行の値をそのまま読みます。パスワードに特殊文字が入ると、sops は YAML の二重引用符形("a\"b" など)で書き出すことがあります。その場合、secret() は \" を解釈せずに値として読みます。すると awk がもう一度エスケープして、\\\" のように二重にエスケープされた値になる可能性があります。現状のパスワードでは起きません(PR 本文の比較で一致を確認済み)。ローテーションで " や \ を含む値にする前に、talos/README.md に文字種の制限を書くか、sops -d --extract '["fjRegistryPassword"]' で値を直接取るのが安全です。

テスト
CI(talos-boot)のダミー秘密での render と talosctl validate が、この構成を通します。ファイル分割のリファクタとしては十分です。

@claude

claude Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 18s —— View job


レビュー結果

大きな問題は見つかりませんでした。指摘は軽微な「要確認」2 点だけです。

前回の指摘への対応
前回の 2 点は、ffcf944 で解消されています。

  • controlplane.yaml:51 は "${FJ_REGISTRY_PASSWORD}" と引用符つきになり、render.sh が \ と " をエスケープして埋めます。
  • render.sh の secret() は外側の引用符だけを外し、値の中の引用符は残します。

確認したこと

  • 旧パス(patches/、registries.yaml、infisical-operator/ など)の参照が CI・.sops.yaml・.gitignore・docs から消えていること。
  • .sops.yaml が secrets.yaml の 1 ルールにまとまり、fjRegistryPassword はそのルールで丸ごと暗号化されること。
  • CI は gen secrets の出力にダミーの fjRegistryPassword を足して render します。render.sh の埋め残しチェックと整合しています。
  • talos-boot.yml の yq の参照先が controlplane.yaml に変わっていること。
  • apps/ は 1 つの Application(recurse)なので、移動でリソースが作り直されないこと。

指摘(要確認・軽微)

  1. talos/render.sh:34 の secret() は YAML のアンエスケープをしていません。sops -d が値を単一引用符形で出す(例: 'it''s')、または二重引用符形で \\ や \" を出すと、外側の引用符を外しただけの文字列が埋まります。現在のパスワードは PR 本文の比較で一致を確認済みなので実害はありません。ローテーションで '、"、\ を含む値にするときだけ壊れます。対処は 2 通りです。
    • パスワードの文字種を英数字などに限ると README に書く。
    • yq で読む。
  2. talos/render.sh:39 の置換キーは [A-Z_]+ で、ENVIRON 全体を引きます。controlplane.yaml に ${HOME} や ${PATH} のような名前を書くと、「値が無い」エラーにならず、シェルの環境変数が黙って埋まります。今は FJ_REGISTRY_PASSWORD しかなく、問題はありません。名前を増やすときは、許可リストにするか FJ_ 接頭辞に限ると安全です。

テスト
CI(talos-boot)で、ダミーの秘密を使った render と talosctl validate が通る構成のままです。リファクタとしては十分です。

ENVIRON 全体を引くと ${HOME} などが黙って埋まるので、FILL に並べた名前だけにする。
secret() は YAML のエスケープを戻さないので、引用符と \ を含む値はエラーにする。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NN4TmSXHrMP8dkTbtkjfz1
@claude

claude Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 11s —— View job


レビュー結果

問題は見つかりませんでした。

前回の指摘への対応(6272893 で解消)

  • 埋める名前は FILL の許可リストだけになりました。${HOME} などは「埋める値が無い」で止まります。
  • secret() は、引用符か \ を含む値を「読み戻せない」として止めます。黙って別の値が埋まることはありません。
  • 埋めるときは \ と " をエスケープします。値の # や : で YAML が壊れることもありません。

確認したこと

  • render.sh の挙動は、コメント行を飛ばし、許可リスト外の名前で止まります。$patch: delete は [A-Z_]+ に一致しないので誤爆しません。
  • apps/ は 1 つの Application(recurse)なので、ファイルの移動でリソースは作り直されません。
  • 旧パスの参照は、CI・.sops.yaml・.gitignore・ドキュメントで新パスに追随しています。
  • 本物の秘密で main と比較し、registry のパスワードが同じ値に埋まることを PR 本文で確認済みです。

テスト
CI(talos-boot)が、ダミーの秘密での render と talosctl validate を通します。ファイル分割のリファクタとしては十分です。

置き換え(${FJ_REGISTRY_PASSWORD} と secrets.yaml の fjRegistryPassword)をやめ、
controlplane.yaml の password の値だけを encrypted_regex で暗号化する。mac_only_encrypted なので
平文の部分は sops を通さず直せる。render.sh は sops -d するだけ。CI は ENC を ci-dummy に置き換える
(cloudflare-secret.sops.yaml と同じ)。secrets.yaml から fjRegistryPassword を外した。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NN4TmSXHrMP8dkTbtkjfz1
@claude

claude Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 33s —— View job


レビュー結果

今回の更新は 47cffa8 です。${FJ_REGISTRY_PASSWORD} の置換をやめ、controlplane.yaml の password の値だけを SOPS で暗号化する方式に変わりました。致命的な不具合は見つかりませんでした。設計面で 2 点、要確認があります。

前回までの指摘
前回までの指摘は、置換の仕組みごと無くなりました。secret() や FILL の許可リストは、この方式では要りません。fjRegistryPassword や FJ_REGISTRY の参照が残っていないことも grep で確認しました。

確認したこと

  • .sops.yaml の encrypted_regex: ^password$ と mac_only_encrypted: true の組み合わせで、平文部分は sops を通さずに直せます。暗号化されるのは password の値だけです(controlplane.yaml:51)。平文の秘密がコミットされている箇所はありません。
  • render.sh は sops -d のあとに ENC[ が残っていれば止まります。CI は del(.sops) と ENC[ → ci-dummy の置換をして、同じ検査を通します。cloudflare-secret.sops.yaml と同じやり方で、辻褄は合っています。
  • secrets.yaml から fjRegistryPassword が外れ、CA 一式だけになりました。gen secrets の形そのままなので、ほかの扱いは楽になります。

指摘

  1. (要確認)sops: ブロックが 16 個ある。
    • controlplane.yaml にはドキュメントが 16 個あり、すべてに約 25 行の sops: ブロックが付いています。同一の age 鍵と MAC がコピーされています(grep -c '^sops:' が 16、mac: も 16 行)。
    • 481 行のうち 400 行近くが暗号化のメタデータです。「手で書く部分を 1 本にして読みやすくする」というこの PR の狙いと逆になっています。
    • 暗号化するのは 1 ドキュメントの 1 値だけです。
    • 私の環境には sops が入っておらず、sops -d が複数ドキュメントを正しく復号するかは確認できていません。
    • 確認してほしいのは次の 2 点です。
      • 本物の鍵で render.sh を通した結果が、前回の main との比較と同じになること。
      • sops edit のあとに、各ドキュメントの MAC が壊れないこと。
  2. (要確認)新しいドキュメントを手で足すと壊れる可能性がある。
    • README には「SOPS はドキュメントごとに sops: を付ける」とあります。
    • 手で --- を足して sops: を付けなかったドキュメントがあると、sops -d が失敗するかもしれません。
    • 逆に sops: を手で書き写すと、MAC の検証で落ちるかもしれません。
    • 追加の手順を README に 1 行書いておくと安全です。
    • 代案として、パスワードだけを registries.sops.yaml のような別ファイルに分けて --config-patch に足す方法があります。この PR の「1 本にまとめる」狙いとは外れます。

テスト
CI(talos-boot)は、ENC[ をダミーにした controlplane.yaml で render と talosctl validate を通します。sops -d の経路そのものは CI では通りません(鍵が無いため)。PR 本文の「本物の秘密で main と比べた」確認は 47cffa8 より前の内容です。この方式でも同じ比較をやり直したか、本文に追記してください。

@5ym
5ym merged commit 9cba567 into main Oct 20, 2026
2 checks passed
@5ym
5ym deleted the chore/fewer-folders branch October 20, 2026 03:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant