Skip to content

Repository files navigation

gitops

k3s クラスタ上のセルフホストアプリを Argo CD で管理するマニフェスト群。

仕組み

bootstrap/argocd/repos.yaml の ApplicationSet が org 内のリポジトリを走査し、 各リポジトリの deploy/argocd.yaml を見つけて Argo CD の Application を生成する。 このリポジトリがどうデプロイされるか(同期対象パス・autoSync 等)もクラスタ側ではなく deploy/argocd.yaml で決まる。Argo CD が同期するのは apps/ 以下だけで、 bootstrap/ は同期対象外(下記)。

ディレクトリ

apps/ Argo CD が再帰的に同期するアプリのマニフェスト
bootstrap/ クラスタそのものを組む層(Argo CD 本体・Infisical・cert-manager・Gateway・auth)。Argo CD は触らない(apps/ の外にある)。main へのマージで GitHub Actions が当てる(SOPS 済みの 4 ファイルと cilium/ だけ手で)
backup/ ホストのバックアップ(restic → Cloudflare R2)。毎日 04:00 JST
recovery/ まっさらなホストから戻すための復元スクリプトと、暗号化した鍵
talos/ Talos への移行用 machine config(v1.14 の形。PR ごとに talos-validate が生成物まで検証する)。Talos では bootstrap/ のほぼ全部がここに載る ── render.shhelm template して inlineManifest にする
docs/ 移行当日の手順決定の記録復元リハーサルTalos の実機検証Entra ID の認可
ROADMAP.md 暫定構成から Talos までの道筋と、決定の記録
deploy/argocd.yaml このリポジトリ自身の Application 定義(他のリポジトリと同じ場所)
.sops.yaml 平文の秘密を SOPS(age)で暗号化する規則(bootstrap/ の 4 ファイルと talos/ の 2 つ)

秘密の扱い

アプリの秘密は Infisical(https://il.doany.io、このクラスタでセルフホスト)にあり、平文も暗号文も git には入らない。 各アプリの *-secrets.yamlInfisicalSecret で、フォルダは /<namespace>/<Secret 名>、シークレット名が そのまま Secret のキーになる。値を変えるのは Infisical の UI だけでよく、secrets.infisical.com/auto-reload: "true" の注釈がある Deployment は Pod ごと入れ替わる。詳しくは bootstrap/README.md

Infisical より下の層だけは Infisical から取れないので、bootstrap/ の 4 ファイル(Infisical 自身の鍵、 Argo CD が git を読む GitHub App 鍵、cert-manager の Cloudflare トークン)は SOPS + age で該当キーだけ暗号化してある。 鍵は recovery/sops-age.key.age(バックアップの env.age と同じパスフレーズ)。

mkdir -p ~/.config/sops/age
age -d -o ~/.config/sops/age/keys.txt recovery/sops-age.key.age
sops -d bootstrap/infisical/secrets.yaml | kubectl apply -f -

ホスト名の付け方

*.doany.io のサブドメインは短く付ける。規則は 2 つだけ。

アプリ名 規則 結果
2 語以上 それぞれの頭文字 ERPNext → en、Mattermost(Matter + most)→ mm、NetBird(Net + Bird)→ nb、Argo CD → ac、AdGuard Home → ah
1 語 頭文字と最後の子音 denpa → dp、hubble → hl、infisical → il、tamasagashi → ts、yosegaki → yk、proxy → px

1 文字で足りていたものはそのまま。 先に取ったもの勝ちで、a(auth)・d(AdGuard)・ h(headlamp)・l(lgtm)・w(worklog)・x(xool)・y(yuzuriha)は 1 文字で置いてある。 新しく足すときは上の規則で 2 文字にする(1 文字はもう埋まっているものが多い)。 headlamp が 1 文字なのは、規則どおりだと head + lamp でも hubble の 1 語読みでも hl に なってぶつかるため。

doany.io そのものはブログ。*.s.doany.io は SSO を通して LAN のホストへ中継する口で、 dp.l.doany.io のように途中に段が入るものは宅内からしか引けない名前 (Gateway のリスナーが段ごとに分かれている。bootstrap/gateway/)。

アプリ

ディレクトリ 内容
adguardhome/ AdGuard Home (DNS フィルタ)
cloudflare-ddns/ DDNS
erpnext/ ERPNext (Helm chart + OIDC セットアップ)
mattermost/ Mattermost + PostgreSQL
forgejo/ Forgejo(fj.doany.io、git + Actions)+ PostgreSQL + Runner(dind)。GitHub Actions の課金を避けて CI をここで回すため。使い始めの手順は apps/forgejo/README.md
netbird/ NetBird (VPN。combined コンテナ + 内蔵 IdP)
3proxy/ 3proxy (国内IP経由の HTTPS フォワードプロキシ)
k8up/ バックアップ(restic → Cloudflare R2)。Talos でホストのスクリプトが使えなくなるぶんの受け皿
infisical/ infisical-operator/ infisical-push-bridge/ 秘密の配布。本体は bootstrap/ にあり、ここには公開経路と operator と即時反映のブリッジ
headlamp/ Kubernetes の Web UI(h.doany.io、Portainer の置き換え)。認証は Entra、権限は bootstrap/apiserver/

アプリの多くはこのリポジトリに無い。 各アプリのリポジトリの deploy/ に置いてあり、 bootstrap/argocd/repos.yaml の ApplicationSet が拾う(上の「仕組み」)。 kubectl -n argocd get applications が実際の一覧。

About

クラスタ上のセルフホストアプリを ArgoCD で管理するマニフェスト群

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages