diff --git a/.github/actions/pulumi-setup/action.yml b/.github/actions/pulumi-setup/action.yml new file mode 100644 index 00000000..ce57ba8d --- /dev/null +++ b/.github/actions/pulumi-setup/action.yml @@ -0,0 +1,27 @@ +# pulumi.yml の preview と up に共通の準備。checkout は呼ぶ側でする(このファイル自体が checkout の中にある)。 +name: pulumi setup +description: bun と Pulumi の CLI を入れ、SDK を作って bun install と型の確認まで済ませる +runs: + using: composite + steps: + - uses: oven-sh/setup-bun@v2 + with: + bun-version-file: pulumi/.bun-version + # CLI だけを入れる (command なし) + - uses: pulumi/actions@v7 + with: + pulumi-version-file: pulumi/.pulumi-version + # SDK (Pulumi.yaml の packages) を作って bun install まで済ませる。lock がずれたら落とす (--frozen-lockfile の代わり)。 + # Renovate の枝では postUpgradeTasks が同じ pulumi install で lock を作るので、ずれない (pulumi/README.md) + - shell: bash + working-directory: pulumi + run: | + pulumi install + git diff --exit-code -- package.json bun.lock || { + echo "::error::pulumi install で package.json / bun.lock が変わった。手元で pulumi install してコミットする" + exit 1 + } + # bun は .ts を走らせるだけで型は見ない + - shell: bash + working-directory: pulumi + run: bun run typecheck diff --git a/.github/workflows/pulumi.yml b/.github/workflows/pulumi.yml index fa1351b7..39a9eead 100644 --- a/.github/workflows/pulumi.yml +++ b/.github/workflows/pulumi.yml @@ -1,4 +1,4 @@ -# **Cloudflare の設定(いまは R2 だけ)を Pulumi で当てる。** 中身は pulumi/。 +# **Cloudflare・Entra・NetBird の設定を Pulumi で当てる。** 中身は pulumi/。 # # PR → preview。差分を PR にコメントする(読み取りの鍵だけ) # main → up。**マージした時点で当たる**(書き込みの鍵は Environment `pulumi-apply` に置き、 @@ -36,14 +36,13 @@ name: pulumi on: pull_request: - paths: + paths: &paths - pulumi/** - .github/workflows/pulumi.yml + - .github/actions/pulumi-setup/** push: branches: [main] - paths: - - pulumi/** - - .github/workflows/pulumi.yml + paths: *paths schedule: - cron: "0 4 * * 1" workflow_dispatch: @@ -95,25 +94,8 @@ jobs: AWS_SECRET_ACCESS_KEY: ${{ secrets.PREVIEW_AWS_SECRET_ACCESS_KEY }} steps: - uses: actions/checkout@v7 - - uses: oven-sh/setup-bun@v2 - with: - bun-version-file: pulumi/.bun-version - # CLI だけを入れる (command なし) - - uses: pulumi/actions@v7 - with: - pulumi-version-file: pulumi/.pulumi-version - # SDK (Pulumi.yaml の packages) を作って bun install まで済ませる。lock がずれたら落とす (--frozen-lockfile の代わり)。 - # Renovate の枝では postUpgradeTasks が同じ pulumi install で lock を作るので、ずれない (pulumi/README.md) - - run: | - pulumi install - git diff --exit-code -- package.json bun.lock || { - echo "::error::pulumi install で package.json / bun.lock が変わった。手元で pulumi install してコミットする" - exit 1 - } - working-directory: pulumi - # bun は .ts を走らせるだけで型は見ない - - run: bun run typecheck - working-directory: pulumi + # bun・Pulumi の CLI・SDK・型の確認(up と同じ) + - uses: ./.github/actions/pulumi-setup - uses: pulumi/actions@v7 with: @@ -156,21 +138,7 @@ jobs: AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} steps: - uses: actions/checkout@v7 - - uses: oven-sh/setup-bun@v2 - with: - bun-version-file: pulumi/.bun-version - - uses: pulumi/actions@v7 - with: - pulumi-version-file: pulumi/.pulumi-version - - run: | - pulumi install - git diff --exit-code -- package.json bun.lock || { - echo "::error::pulumi install で package.json / bun.lock が変わった。手元で pulumi install してコミットする" - exit 1 - } - working-directory: pulumi - - run: bun run typecheck - working-directory: pulumi + - uses: ./.github/actions/pulumi-setup - uses: pulumi/actions@v7 with: diff --git a/apps/3proxy/3proxy-secrets.yaml b/apps/3proxy/3proxy-secrets.yaml index 46933f96..3e3956e3 100644 --- a/apps/3proxy/3proxy-secrets.yaml +++ b/apps/3proxy/3proxy-secrets.yaml @@ -1,5 +1,5 @@ # Secret 3proxy は Infisical (il.doany.io) のフォルダ /3proxy/3proxy にあり、 -# Infisical 純正 operator (bootstrap/infisical-operator) が Secret にする。 +# Infisical 純正 operator (apps/infisical-operator) が Secret にする。 # 値は Infisical の UI で書き換えるだけ(push-bridge が数秒で同期。auto-reload 注釈のある # Deployment は自動で入れ替わる)。 apiVersion: secrets.infisical.com/v1alpha1 diff --git a/apps/3proxy/certificate.yaml b/apps/3proxy/certificate.yaml index 1fa96e41..ebd2b681 100644 --- a/apps/3proxy/certificate.yaml +++ b/apps/3proxy/certificate.yaml @@ -1,5 +1,5 @@ # px.doany.io の証明書。Gateway は TLS を passthrough するだけなので、終端は Pod 内の -# サイドカー(tls-terminator)が行う。Traefik が内蔵 ACME で持っていた役目の置き換え。 +# サイドカー(tls-terminator)が行う。 apiVersion: cert-manager.io/v1 kind: Certificate metadata: diff --git a/apps/adguardhome/certificate.yaml b/apps/adguardhome/certificate.yaml index 1119d4e3..be0f07b7 100644 --- a/apps/adguardhome/certificate.yaml +++ b/apps/adguardhome/certificate.yaml @@ -1,5 +1,4 @@ -# DoT(853)で使う証明書。以前は Traefik の acme.json を acme-watcher が監視して PVC に書き出していたが、 -# cert-manager が直接 Secret に発行する形にした(deployment.yaml がその Secret をマウントする)。 +# DoT(853)で使う証明書。deployment.yaml がこの Secret をマウントする。 apiVersion: cert-manager.io/v1 kind: Certificate metadata: diff --git a/apps/cloudflare-ddns/application.yaml b/apps/cloudflare-ddns/application.yaml index 62b68a59..0f534c65 100644 --- a/apps/cloudflare-ddns/application.yaml +++ b/apps/cloudflare-ddns/application.yaml @@ -17,9 +17,6 @@ spec: chart: cloudflare-ddns targetRevision: 0.1.0 helm: - # HelmChart CRD 時代と同じリリース名にしておくと、描き出されるものが一致して - # そのまま引き取れる(実際に helm template と live の diff が空なのを確認済み)。 - releaseName: cloudflare-ddns valuesObject: # API token は Infisical operator が作る Secret から(cloudflare-ddns-secrets.yaml)。 # キーは CLOUDFLARE_API_TOKEN。 diff --git a/apps/cloudflare-ddns/cloudflare-ddns-secrets.yaml b/apps/cloudflare-ddns/cloudflare-ddns-secrets.yaml index e8f61948..39eb5cc9 100644 --- a/apps/cloudflare-ddns/cloudflare-ddns-secrets.yaml +++ b/apps/cloudflare-ddns/cloudflare-ddns-secrets.yaml @@ -1,5 +1,5 @@ # Secret cloudflare-ddns-secrets は Infisical (il.doany.io) のフォルダ /cloudflare-ddns/cloudflare-ddns-secrets にあり、 -# Infisical 純正 operator (bootstrap/infisical-operator) が Secret にする。 +# Infisical 純正 operator (apps/infisical-operator) が Secret にする。 # 値は Infisical の UI で書き換えるだけ(push-bridge が数秒で同期。auto-reload 注釈のある # Deployment は自動で入れ替わる)。 apiVersion: secrets.infisical.com/v1alpha1 diff --git a/apps/external-dns/application.yaml b/apps/external-dns/application.yaml index 3ef37956..83013774 100644 --- a/apps/external-dns/application.yaml +++ b/apps/external-dns/application.yaml @@ -32,7 +32,6 @@ spec: chart: external-dns targetRevision: 1.23.0 helm: - releaseName: external-dns valuesObject: provider: name: cloudflare diff --git a/apps/external-dns/external-dns-secrets.yaml b/apps/external-dns/external-dns-secrets.yaml index b24dfc22..a15ffef3 100644 --- a/apps/external-dns/external-dns-secrets.yaml +++ b/apps/external-dns/external-dns-secrets.yaml @@ -1,5 +1,5 @@ # Secret external-dns は Infisical (il.doany.io) のフォルダ /external-dns/external-dns にあり、 -# Infisical 純正 operator (bootstrap/infisical-operator) が Secret にする。 +# Infisical 純正 operator (apps/infisical-operator) が Secret にする。 # # cloudflare-api-token Cloudflare の Account API token「external-dns (doany.io DNS write)」。 # 権限は doany.io のゾーンだけの Zone Read + DNS Write(2026-10-06 に作った) diff --git a/apps/forgejo/README.md b/apps/forgejo/README.md index f0b29096..3cd606af 100644 --- a/apps/forgejo/README.md +++ b/apps/forgejo/README.md @@ -40,7 +40,7 @@ ## プライベートのリポジトリを移す(1 本ずつ) **方針: プライベートは GitHub に置かない**(2026-09-15)。GitHub Actions の課金はプライベートにだけ掛かるので、 -公開リポジトリ(gitops・blog など)は GitHub のままでよい。対象は shadai / tamasagashi / worklog-cloud(noren は閉じた)。 +公開リポジトリ(gitops・blog など)は GitHub のままでよい。対象は todoroku / tamasagashi / worklog-cloud(noren は閉じた)。 **Forgejo が唯一の置き場になる。** バックアップは k8up(R2)の 1 日 1 回だけなので、手元の clone も捨てないこと。 @@ -95,7 +95,7 @@ **公開にしてはいけない。** パッケージ(コンテナイメージ)の読み取り権限はリポジトリではなく**組織の公開範囲**で決まり、 公開の組織だと非公開リポジトリのイメージでも匿名で pull できる(`services/packages/perm.go` の -`HasOrgOrUserVisible`。2026-09-15 に shadai のイメージが匿名で取れるのを見つけて limited にした)。 +`HasOrgOrUserVisible`。2026-09-15 に shadai(今の todoroku)のイメージが匿名で取れるのを見つけて limited にした)。 ## Actions からイメージを push するとき @@ -162,4 +162,4 @@ curl -X PATCH -H "Authorization: token $T" -H 'Content-Type: application/json' \ https://fj.doany.io/api/v1/repos/doa/ ``` -2026-09-15 に shadai / renovate / tamasagashi / worklog-cloud へ当てた。 +2026-09-15 に shadai(今の todoroku)/ renovate / tamasagashi / worklog-cloud へ当てた。 diff --git a/apps/forgejo/postgres.yaml b/apps/forgejo/postgres.yaml index 469ba287..15a37c07 100644 --- a/apps/forgejo/postgres.yaml +++ b/apps/forgejo/postgres.yaml @@ -1,4 +1,4 @@ -# Forgejo の DB。mattermost/postgres.yaml と同じ形(17 系、pg_dump を k8up に取らせる)。 +# Forgejo の DB。PostgreSQL 17 系。pg_dump を k8up に取らせる。 apiVersion: v1 kind: Service metadata: diff --git a/apps/headlamp/application.yaml b/apps/headlamp/application.yaml index c5a87004..8c20bc96 100644 --- a/apps/headlamp/application.yaml +++ b/apps/headlamp/application.yaml @@ -28,7 +28,6 @@ spec: chart: headlamp targetRevision: 0.45.0 helm: - releaseName: headlamp valuesObject: serviceAccount: create: true diff --git a/apps/infisical-push-bridge/application.yaml b/apps/infisical-push-bridge/application.yaml index 1851b3ac..e44b58af 100644 --- a/apps/infisical-push-bridge/application.yaml +++ b/apps/infisical-push-bridge/application.yaml @@ -25,7 +25,6 @@ spec: chart: infisical-push-bridge targetRevision: 0.1.1 helm: - releaseName: infisical-push-bridge valuesObject: infisicalSecret: enabled: true diff --git a/apps/k8up/application.yaml b/apps/k8up/application.yaml index 8f833d00..b8f29afa 100644 --- a/apps/k8up/application.yaml +++ b/apps/k8up/application.yaml @@ -18,7 +18,6 @@ spec: chart: k8up targetRevision: 4.10.0 helm: - releaseName: k8up valuesObject: k8up: # 注釈の無い PVC は取らない。`k8up.io/backup: "true"` が「取る」という宣言そのもの diff --git a/apps/k8up/notify.yaml b/apps/k8up/notify.yaml index 0562a16d..300a8901 100644 --- a/apps/k8up/notify.yaml +++ b/apps/k8up/notify.yaml @@ -276,7 +276,7 @@ data: body: JSON.stringify({ text }), }); if (!r.ok) { - console.error(`Mattermost への投稿に失敗: ${r.status} ${await r.text()}`); + console.error(`Matrix への投稿に失敗: ${r.status} ${await r.text()}`); process.exit(1); } // FAILED でも exit 0。「投稿できた」がこの Job の成功。非ゼロにすると backoffLimit ぶん同じ警告を投稿し、 diff --git a/apps/matrix/README.md b/apps/matrix/README.md index acb1771d..b3f45687 100644 --- a/apps/matrix/README.md +++ b/apps/matrix/README.md @@ -116,8 +116,8 @@ LiveKit が Matrix の通話(Element Call)の音声と映像を中継する。20 ### ルーターの転送 -**8443 の UDP と TCP をノード(10.0.0.2)に転送しておくこと。** Mattermost Calls のときと同じ番号なので、 -その転送をそのまま使う(消していなければ)。Gateway と Cloudflare は通らない。 +**8443 の UDP と TCP がノード(10.0.0.2)に届くこと。** ルーターは DMZ で全部をノードに向けているので、 +転送の設定は要らない(docs/router.md)。Gateway と Cloudflare は通らない。 外から見える IP は LiveKit が STUN で調べる。家の中の端末も外の IP に向けて送るので、ルーターの NAT ループバック(ヘアピン)が要る。家の中だけつながらないときはこれを疑う(Tuwunel の docs の Troubleshooting)。 diff --git a/apps/matrix/livekit.yaml b/apps/matrix/livekit.yaml index b961f6c0..16532959 100644 --- a/apps/matrix/livekit.yaml +++ b/apps/matrix/livekit.yaml @@ -4,10 +4,10 @@ # 通り道は 2 つ: # - 合図(WebSocket)は lk.doany.io の Gateway 経由(httproute.yaml) # - 音声と映像は **hostPort 8443(UDP、つながらないとき TCP)** でノードに直接。Gateway も Cloudflare も通らない。 -# ルーターで 8443 の UDP と TCP をノードに転送しておくこと(Mattermost Calls のときと同じ番号・同じ転送) +# ルーターは DMZ で全部をノードに向けているので、転送の設定は要らない(docs/router.md) # # 外から見える IP は STUN で調べて客に教える(use_external_ip)。家の中の端末も外の IP に向けて送るので、 -# ルーターの「NAT ループバック(ヘアピン)」が要る(Mattermost Calls と同じ条件)。 +# ルーターの「NAT ループバック(ヘアピン)」が要る。 --- apiVersion: v1 kind: ConfigMap diff --git a/apps/matrix/matrix-secrets.yaml b/apps/matrix/matrix-secrets.yaml index 1242eb35..eb568273 100644 --- a/apps/matrix/matrix-secrets.yaml +++ b/apps/matrix/matrix-secrets.yaml @@ -1,5 +1,5 @@ # Secret matrix は Infisical (il.doany.io) のフォルダ /matrix/matrix にあり、 -# Infisical 純正 operator (bootstrap/infisical-operator) が Secret にする。 +# Infisical 純正 operator (apps/infisical-operator) が Secret にする。 # # oidc-client-secret Entra の共用のアプリ登録のクライアントシークレット(auth などと同じ値) # hookshot-as-token Tuwunel と hookshot の合言葉(アプリサービスの登録。長いランダム文字列) diff --git a/apps/metrics-server/application.yaml b/apps/metrics-server/application.yaml index d77f32d8..b09f280c 100644 --- a/apps/metrics-server/application.yaml +++ b/apps/metrics-server/application.yaml @@ -18,7 +18,6 @@ spec: chart: metrics-server targetRevision: 3.14.0 helm: - releaseName: metrics-server valuesObject: # `args` は chart の `defaultArgs` に足される(置き換えではない)。 # kubelet の証明書はクラスタ CA では検証できない。Talos の kubelet は自己署名のサービング証明書を diff --git a/apps/netbird/deployment.yaml b/apps/netbird/deployment.yaml index d344e8a7..02626f7a 100644 --- a/apps/netbird/deployment.yaml +++ b/apps/netbird/deployment.yaml @@ -29,8 +29,7 @@ metadata: secrets.infisical.com/auto-reload: "true" spec: replicas: 1 - # hostPort 3478 と RWO の PVC を新旧 Pod で共有できないので Recreate - # (apps/wireguard の wg-easy と同じ事情)。 + # hostPort 3478 と RWO の PVC を新旧 Pod で共有できないので Recreate。 strategy: type: Recreate selector: diff --git a/apps/renovate/renovate-secrets.yaml b/apps/renovate/renovate-secrets.yaml index 34845abc..94bbe899 100644 --- a/apps/renovate/renovate-secrets.yaml +++ b/apps/renovate/renovate-secrets.yaml @@ -1,5 +1,5 @@ # Secret renovate-secrets は Infisical (il.doany.io) のフォルダ /renovate/renovate-secrets にあり、 -# Infisical 純正 operator (bootstrap/infisical-operator) が Secret にする。キーは README.md の表。 +# Infisical 純正 operator (apps/infisical-operator) が Secret にする。キーは README.md の表。 # CronJob は Secret を毎回読み直すので、値を Infisical で書き換えれば次の実行から効く(auto-reload は要らない)。 apiVersion: secrets.infisical.com/v1alpha1 kind: InfisicalSecret diff --git a/apps/rybbit/rybbit-secrets.yaml b/apps/rybbit/rybbit-secrets.yaml index e8492332..a895c833 100644 --- a/apps/rybbit/rybbit-secrets.yaml +++ b/apps/rybbit/rybbit-secrets.yaml @@ -1,5 +1,5 @@ # Secret rybbit は Infisical (il.doany.io) のフォルダ /rybbit/rybbit にあり、 -# Infisical 純正 operator (bootstrap/infisical-operator) が Secret にする(mattermost と同じ形)。 +# Infisical 純正 operator (apps/infisical-operator) が Secret にする。 # # | キー | 何に使うか | # | --- | --- | diff --git a/bootstrap/argocd/values.yaml b/bootstrap/argocd/values.yaml index a1606dad..5f47a21f 100644 --- a/bootstrap/argocd/values.yaml +++ b/bootstrap/argocd/values.yaml @@ -16,7 +16,7 @@ redis: repository: mirror.gcr.io/library/redis tag: 8.10.2-alpine # Native OIDC straight to Entra ID (same tenant/app registration as -# auth/deployment.yaml, gitlab, erpnext) instead of Dex. +# auth/deployment.yaml) instead of Dex. dex: enabled: false configs: diff --git a/bootstrap/auth/secrets.yaml b/bootstrap/auth/secrets.yaml index dfab3f6b..0e46bd6a 100644 --- a/bootstrap/auth/secrets.yaml +++ b/bootstrap/auth/secrets.yaml @@ -1,5 +1,5 @@ # Secret auth-secrets は Infisical (il.doany.io) のフォルダ /auth/auth-secrets にあり、 -# Infisical 純正 operator (bootstrap/infisical-operator) が Secret にする。 +# Infisical 純正 operator (apps/infisical-operator) が Secret にする。 # 値は Infisical の UI で書き換えるだけ(push-bridge が数秒で同期。auto-reload 注釈のある # Deployment は自動で入れ替わる)。 apiVersion: secrets.infisical.com/v1alpha1 diff --git a/bootstrap/auth/sub-proxy.yaml b/bootstrap/auth/sub-proxy.yaml index fc51d48d..aabd3104 100644 --- a/bootstrap/auth/sub-proxy.yaml +++ b/bootstrap/auth/sub-proxy.yaml @@ -1,5 +1,5 @@ # *.s.doany.io を SSO 付きで LAN のホスト(sub-backend)へ中継する oauth2-proxy。 -# Traefik では forward-auth ミドルウェアで実現していたが、Cilium の Gateway には ext auth が無いので +# Cilium の Gateway には ext auth が無いので # oauth2-proxy 自身を前段のプロキシとして置く(--upstream で中継先を持つ)。 # コールバックは既存の a.doany.io 側インスタンスが受ける。cookie secret を共有しているので # セッションはそのまま通る。 diff --git a/bootstrap/cert-manager/cloudflare-secret.sops.yaml b/bootstrap/cert-manager/cloudflare-secret.sops.yaml index 9ff39dcc..30723b00 100644 --- a/bootstrap/cert-manager/cloudflare-secret.sops.yaml +++ b/bootstrap/cert-manager/cloudflare-secret.sops.yaml @@ -5,19 +5,19 @@ metadata: namespace: cert-manager type: Opaque stringData: - CF_DNS_API_TOKEN: ENC[AES256_GCM,data:kdJ/zTsY2Kn7LE7AyGbLvXGtoNzVrO3j6coDybrB9Dr8INPcR36SABiyfDud2Gkt+uTF0cM=,iv:baLDIynuLj8xrDgLozcE32R6AGTFR8gUyVyQTztUTsY=,tag:ryBxbPSNhGThDGHrYcWMnA==,type:str] + CF_DNS_API_TOKEN: ENC[AES256_GCM,data:ZKZj+Y7z9VP19myu/lsV/q0gN9MPPHaBvXi4nddVecZVcL6IMeyCNxY+pQ3MHSblwj9RlIs=,iv:Cw73N20ElOtXT8niflI6VFo9pDL2M2B5AokPMcXgUhQ=,tag:T83dCJMIJ1BjvX2+21Obgw==,type:str] sops: age: - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA0THZ3alhkblVZeWRQM0Ir - S2ZoendBS1NpcVhCN2NEQWYwak5nMEhjcVQ4CnhmTGc5R2t4VndpQSticGN4TU5V - bFAxWUhMR3U1WU55UE04bVh1NnAvQ1EKLS0tIDRRSzdGODB2Si9CazFuRUhXUzdw - MSs4MElhMGtuTXkvdXNkTlpwejlHQmcKRM0WcDmSl/3m328waBKzB2QmYITojc7Z - 9PT3D5VQZ0v614ZvKR2Hwk5bZm5Uhu9M+QGyVJ19DAkp26btUyI49Q== + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkYmo0VVFlbkJKUW1uT0lr + YmFyZ0R1QkJkblJoRkRRTWZTN0ZzcjVJK0hNCktyK1BaRXVGc3dYODFxRFozZFZE + MnJTZXdyTk9UTUljRFZtMndzeVVaOVUKLS0tIGZ3V2lwL09yRnBVeEpaZEZ5cVhH + NkhYd3dhUGhRTDJycjJXQnp4R04xTjgKquThTvzOEzxMh/j77kJVWP8e5Ya2ZKZJ + itz859E3xv2eLBkxa6whBlZNxt9EVWh9fa20K27IFLY6TutqHEiqDw== -----END AGE ENCRYPTED FILE----- recipient: age1sgnnkn67wpt4wgjsff4c36w3cmjkk557ng504e4aczx2lzls9y6ssy0x9r - encrypted_regex: ^(ENCRYPTION_KEY|AUTH_SECRET|CLIENT_ID_GITHUB_LOGIN|CLIENT_SECRET_GITHUB_LOGIN|CF_DNS_API_TOKEN|githubAppPrivateKey|service\.webhook\.mattermost|password)$ - lastmodified: "2026-09-07T00:29:07Z" - mac: ENC[AES256_GCM,data:dqa0C4EDH9kjF89ykIZaBf+4w3J2+Om29BAmyYN69eImmYbkj+R0la+m6T6FFhSZ/m7leFHiRYofxskrW+k9qfs8Rz69JJNMCZMB8axIJQqy1RyNwEe5ZqA4mRsF63d1zEf5lCerCC+U91/ZlfIz9Ph2b3HsC6p8WYCNql8Sd2o=,iv:wX3CiNLlvUTLUiMr+CwZdMOo+MTMlhI27N32LKIobQg=,tag:6g9RKn26ZkF/19CSokr/bA==,type:str] + encrypted_regex: ^(ENCRYPTION_KEY|AUTH_SECRET|CLIENT_ID_GITHUB_LOGIN|CLIENT_SECRET_GITHUB_LOGIN|CF_DNS_API_TOKEN)$ + lastmodified: "2026-10-18T05:28:56Z" + mac: ENC[AES256_GCM,data:fEvwN+/NUGNImQwgDwaiWTKfN22EHOnXi4WGbC2CX6asPvhvcajEYyOTpxsw9biAJAtTkdJ3TU2b/LR9B4pCNUx0NJO+qtj4HOR243twNlPoVMjiWFyLAWv14iWZzkQAKYM/YSFmDtYySKxP+S9jNmPet4bipc+OgIuXEEL8in0=,iv:jhsWmC3nhkhIJfpxkzAvmcalTcgnKwFD0WbiL3w1j5c=,tag:gRkBWX4vVcm8SQzPDyXq/Q==,type:str] version: 3.13.3 diff --git a/bootstrap/cilium/values.yaml b/bootstrap/cilium/values.yaml index 77fc9154..ed29e580 100644 --- a/bootstrap/cilium/values.yaml +++ b/bootstrap/cilium/values.yaml @@ -47,16 +47,8 @@ externalIPs: nodePort: enabled: true # 範囲は既定(30000-32767)。Gateway の Service の nodePort は API サーバが割り当てるランダムな値のままでよい。 - # 外からの 80/443 は Envoy が hostNetwork で掴んだソケットに直接届く(下の gatewayAPI.hostNetwork)。 - # - # 2026-09-08〜10-17(k3s の頃)は違った。nodePort 80/443 の L7LB リダイレクトが経路そのもので、port-80 の nodePort を - # 30080 にずらすと 80 番が全部死んだ。そのため範囲を `"80,443"`、API サーバの `service-node-port-range` を `80-32767` にし、 - # nodePort を 80/443 に揃える Job を置いていた。副作用として、ノード自身から 80/443 に繋ぐと応答が返らなかった - # (apps/netbird/routing-peer.yaml。fj.doany.io の中継 apps/forgejo/node-access.yaml は 2026-10-18 に消した)。 - # - # 2026-10-18 に Talos で確かめ直した。VM では範囲を既定に戻し nodePort をランダム(32399/32657)にしても、外からも、 - # ノード自身(hostNetwork の Pod)からも、Pod からも http 301 / https 200。本番でも port-80 の nodePort を 30080 に - # ずらして 301 / 200 のままだった。それで 3 つとも外した。 + # 外からの 80/443 は Envoy が hostNetwork で掴んだソケットに直接届き、ノード自身からも届く(下の gatewayAPI.hostNetwork)。 + # k3s の頃は nodePort 80/443 の L7LB リダイレクトが経路そのもので、揃える手当てが要った(2026-10-18 に外した。#436)。 # # **範囲を広げないこと。** 範囲に入る hostPort を Cilium は張らない(`80-32767` にしたとき # AdGuard の 853、LiveKit の 8443、3proxy の 3129 が一斉に落ちた)。 @@ -75,9 +67,7 @@ gatewayAPI: # Gateway の `status.addresses` はノードの `10.0.0.2` になる。 # # Service は消えず NodePort になる(`operator/pkg/model/translation/gateway-api/translator.go` - # の `toServiceType`: `if HostNetworkConfig.Enabled { return ServiceTypeNodePort }`)。 - # - # nodePort の値は経路に関係しない(上の `nodePort` のコメント。k3s の頃は関係していた)。 + # の `toServiceType`: `if HostNetworkConfig.Enabled { return ServiceTypeNodePort }`)。nodePort の値は経路に関係しない。 # # ポートの指定は無い。Gateway のリスナー(80 / 443)がそのままホストに bind される。 # `httpPort` / `httpsPort` / `sharedListenerPort` は `ingressController.hostNetwork` @@ -97,7 +87,7 @@ gatewayAPI: # 有効にすると全リスナーが「HTTP/2 を試して、駄目なら HTTP/1.1」を広告する。 # つまりブラウザからの既存サイトも HTTP/2 になる。WebSocket は HTTP/2 上では # 拡張 CONNECT が要るが、ブラウザはそれが使えなければ HTTP/1.1 の別接続に落ちるので - # Mattermost・ArgoCD・Infisical はそのまま動く(適用後に実際に確認した)。 + # ArgoCD・Infisical はそのまま動く(適用後に実際に確認した)。 # # チャートの注記どおり appProtocol サポートも一緒に有効になるが、 # このクラスタに appProtocol を宣言している Service は 1 つも無いので影響しない。 diff --git a/bootstrap/infisical/secrets.sops.yaml b/bootstrap/infisical/secrets.sops.yaml index ace2fbd2..629e1f51 100644 --- a/bootstrap/infisical/secrets.sops.yaml +++ b/bootstrap/infisical/secrets.sops.yaml @@ -1,7 +1,5 @@ -# Infisical's own root secrets. Plaintext is the same call as the Entra -# client secret in argocd/helmchart.yaml -- this repo is private, and this is -# the layer *below* Infisical (it's what lets Infisical hold every other -# secret), so it can't come out of Infisical itself. +# Infisical 自身の根っこの秘密(DB の暗号鍵など)。Infisical がほかの秘密を全部持つための層なので、 +# Infisical からは取れない。値のキーだけ SOPS で暗号化してある(../../.sops.yaml)。 # # ENCRYPTION_KEY encrypts everything Infisical stores in Postgres. Losing or # changing it makes the whole database unreadable -- it's the one value here @@ -15,24 +13,24 @@ metadata: namespace: infisical type: Opaque stringData: - ENCRYPTION_KEY: ENC[AES256_GCM,data:WcitJwJAwSj6DuUijaVHYHw3th7IK0o60y10Hv3iBfs=,iv:Q6o+vLa5IV9/7xZa7IW0s/mRPd91l2vsNHzP4trtoCk=,tag:uSvtVkwfD+9P842H3LkxSg==,type:str] - AUTH_SECRET: ENC[AES256_GCM,data:K2Dbbql2D75+UvKOBWxV/XF6msmAYlQsXOj5ImSOMZ91Ul/NoS1Pa1T2q1E=,iv:OgKohCtKuA5tLOjuY5F6xb/0/I4hmti3TvJ3gunPHYs=,tag:ugtw1ZPAgvQnctevZrPwYA==,type:str] + ENCRYPTION_KEY: ENC[AES256_GCM,data:UrwIdN7DtFzgIaDFOlBoLv1oRrFAyFivtcE/L8IXPi4=,iv:vG4hFDtzh7Wc9eQRQnmRj2pSiGeOg5NW1eUpUYDlzjg=,tag:a6QA+VOKk7xLQeG6exo0sg==,type:str] + AUTH_SECRET: ENC[AES256_GCM,data:G8Bhl9gMSQ8h3IUFNZXm2vFE684znoxTZkSoe9jPY87IUJkvfWAWMoOPTRw=,iv:t9z8NG0UCxXWWz7wSDHbkzNYPfHTuMfiuPTpPxeZlg4=,tag:+9UH2qDfUTHjDOM5XqeAFA==,type:str] SITE_URL: https://il.doany.io TELEMETRY_ENABLED: "false" - CLIENT_ID_GITHUB_LOGIN: ENC[AES256_GCM,data:Q/gRHJn+SgBP84qLxCr4dTytPWQ=,iv:gYm7PZeyohMmqCDvK8WvWHGJWVpAgGSTQZ0nZzMNtV4=,tag:ix1DRzLheAHdKufkRDSggQ==,type:str] - CLIENT_SECRET_GITHUB_LOGIN: ENC[AES256_GCM,data:nTA2B9iqTasomezwZRLOr2hKPgnqLW0l5tij8CuYjyu94vtXjZtziQ==,iv:NKFbwwZ1UJ2muQY3mIRH0rfZ1q5FJGRo+tSzlt2JxgE=,tag:HzJcMXFeVakkfZcxR/j7wQ==,type:str] + CLIENT_ID_GITHUB_LOGIN: ENC[AES256_GCM,data:2ZMnXTHmiklPsT2zgJtB/DP+088=,iv:XnlZeFMWSMpoqyiYEEDRkOsHbBBPJ42Q0u1rzxHIo1M=,tag:PEpQ/qy5a8fVJYqjiABs6Q==,type:str] + CLIENT_SECRET_GITHUB_LOGIN: ENC[AES256_GCM,data:eB3o1vwvlip0PtIo5szAi4S5Pzr4hL7ehtdH91leftkGDta5ztprzg==,iv:r1PwnSdlENn9Kb1LG71I0+rmCSOK0GtJW5MxH7EWKh4=,tag:G/iDe/NL0Vu12WkTyMm+vw==,type:str] sops: age: - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBNcFNseDBWM0x6UjlldFFK - YnJReVNlbXI2NUk1cWs1UGppYklmUlMyT2hrCmJTVTRPZUROcWp4L1VVblZnWDIv - NXNFb1NBdG4zaVlPS3ZCNCtMNVkwRkUKLS0tIFBPeG5rRnVTcHJQMXY5aFh5UlR4 - VUNOSUttbHRVL2dPTHh6OTRFSnZsc0EKsHdzCJFPMBIll1PxJ8X4uhAL8NO5Cyo4 - G+QzAkgJ3xhyIuamKhEkIAa52TwGSFUw4de37S8O74JIbW/gcD3DvQ== + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIWmR5TnZZcmxobmJDRFMv + NDRkZkw3L0x4UzYzUkoxOFNCS1o4OGZPclRrCk1MaWhZdm5HQ1FWRVBNWDNxa29q + eERqbXBjUXViMzEyZ0c4Tk5MdlNSZDQKLS0tIDk0QTFuZzNvK2pCV21URUxNaGk5 + MFJ3UHl2bDJlV2I4UGZ1NzR5VHgvSTQK24lV1ZFNGdlKf7RYdyD+Q6TqGiuk/7Ue + 8XOSRFsFC2B+nhtCEHDu5LxHTjhJYkI3BvsptmVrDBOgu596H+/KMA== -----END AGE ENCRYPTED FILE----- recipient: age1sgnnkn67wpt4wgjsff4c36w3cmjkk557ng504e4aczx2lzls9y6ssy0x9r - encrypted_regex: ^(ENCRYPTION_KEY|AUTH_SECRET|CLIENT_ID_GITHUB_LOGIN|CLIENT_SECRET_GITHUB_LOGIN|CF_DNS_API_TOKEN|githubAppPrivateKey|service\.webhook\.mattermost|password)$ - lastmodified: "2026-09-06T10:49:49Z" - mac: ENC[AES256_GCM,data:LUqeh7TUWyGVyhHCfd5LlG5/Jq/PFPIsZdA6Yf/rYa8e0B+1Z+4I956EEIVCIqydwxbGWuGdodQaYLnJkKFVy5ho+n9lutnG6/VycZedbNwHsylG5gS/dVGdGBllrIKn+dt5/Qnbpl2IPbwI5BhgOEPLAegIHuX0nRxDZCW/wh4=,iv:aB2pQL5pAsMqVWp6pq094RrYFqhH4BZaTj1E1jJd09I=,tag:rJonIxpRROWpn7mzJTsrMg==,type:str] + encrypted_regex: ^(ENCRYPTION_KEY|AUTH_SECRET|CLIENT_ID_GITHUB_LOGIN|CLIENT_SECRET_GITHUB_LOGIN|CF_DNS_API_TOKEN)$ + lastmodified: "2026-10-18T05:28:56Z" + mac: ENC[AES256_GCM,data:mHl+ud4pRGFHlwWkmIr1O4KkSf6A5NAQCigawX6SdAO36K1q8bt/iB5QZu0OVimE4WQ1V5wMMGCFHyJbIIRdHLkCIu7mzSVaJyp0TzXYpWJVJTjtwddDXvmX72DLZOZ4mtAdsCqMaOaWmHaBnV07m7G3h6rExL7UAor4S1jcmSk=,iv:qDKUC5kdz+ZOQ+MjD40qqhzR67QfrFo1Lxj1TusSX8g=,tag:KPYbXrtPvmqMlEPGJRMarQ==,type:str] version: 3.13.3 diff --git a/bootstrap/infisical/smtp-secret.yaml b/bootstrap/infisical/smtp-secret.yaml index 9aef21b5..10892252 100644 --- a/bootstrap/infisical/smtp-secret.yaml +++ b/bootstrap/infisical/smtp-secret.yaml @@ -1,5 +1,5 @@ # Secret infisical-smtp は Infisical (il.doany.io) のフォルダ /infisical/infisical-smtp にあり、 -# Infisical 純正 operator (bootstrap/infisical-operator) が Secret にする。 +# Infisical 純正 operator (apps/infisical-operator) が Secret にする。 # 値は Infisical の UI で書き換えるだけ(push-bridge が数秒で同期。auto-reload 注釈のある # Deployment は自動で入れ替わる)。 apiVersion: secrets.infisical.com/v1alpha1 diff --git a/bootstrap/infisical/values.yaml b/bootstrap/infisical/values.yaml index 5d6f170d..cb057f25 100644 --- a/bootstrap/infisical/values.yaml +++ b/bootstrap/infisical/values.yaml @@ -25,7 +25,7 @@ infisical: - name: ALLOW_INTERNAL_IP_CONNECTIONS value: "true" # Outgoing mail via Exchange Online SMTP AUTH on the info@doany.io - # mailbox, same as mattermost/erpnext (STARTTLS on 587 is Infisical's + # mailbox (STARTTLS on 587 is Infisical's # default, SMTP_REQUIRE_TLS=true). The password is the one value here # that lives in Infisical itself (/infisical/infisical-smtp, pulled by # smtp-secret.yaml), hence optional: on a from-scratch install the diff --git a/docs/decisions.md b/docs/decisions.md index b0184df8..21c57cae 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -152,8 +152,6 @@ bootstrap のあとに `helm install` する案は、再構築のたびに「CNI | 認証 | oauth2-proxy を前段のプロキシに(下記) | — | - **Cilium 1.20 は Gateway API v1.6.1 の CRD を要求する。** 古いと GatewayClass が `Waiting for controller` のまま止まる -- **ノード自身からは 80/443 に届かなかった(k3s の頃)。** Gateway の nodePort 80/443 が L7LB リダイレクトとして載っていたため。 - 2026-10-18 に nodePort を既定の範囲に戻した(`bootstrap/cilium/values.yaml` の `nodePort`) - **`terminationGracePeriodSeconds` が長い Pod**(denpa と tuner-agent、6 時間)は Recreate と組むと入れ替わらない。`--grace-period=0 --force` で消す ### LoadBalancer をどう置き換えるか(2026-09-06 決定・実施済み) @@ -164,7 +162,7 @@ hostPort ならノードの全アドレスで受けられ、送信元 IP も保 | 対象 | hostPort | | --- | --- | -| Gateway(`cilium-gateway-doany`) | 80 / 443。Envoy が hostNetwork で bind し、外からの通信はそこに直接届く。Service の nodePort はランダムなままでよい(`bootstrap/cilium/values.yaml` の `nodePort`。k3s の頃は 80/443 に揃える必要があった) | +| Gateway(`cilium-gateway-doany`) | 80 / 443。Envoy が hostNetwork で bind し、外からの通信はそこに直接届く。Service の nodePort はランダムなままでよい(`bootstrap/cilium/values.yaml` の `nodePort`) | | adguardhome | 53 UDP・53 TCP・853 TCP | | matrix の LiveKit | 8443 UDP・8443 TCP | | 3proxy(tls-terminator サイドカー) | 3129 TCP |