Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ headlamp が 1 文字なのは、規則どおりだと head + lamp でも hubble
| [`3proxy/`](apps/3proxy/) | 3proxy (国内IP経由の HTTPS フォワードプロキシ) |
| [`k8up/`](apps/k8up/) | バックアップ(restic → Cloudflare R2)。**Talos でホストのスクリプトが使えなくなる**ぶんの受け皿 |
| [`infisical/`](apps/infisical/) [`infisical-operator/`](apps/infisical-operator/) [`infisical-push-bridge/`](apps/infisical-push-bridge/) | 秘密の配布。本体は `bootstrap/` にあり、ここには公開経路と operator と即時反映のブリッジ |
| [`renovate/`](apps/renovate/) | Renovate(GitHub の danything・5ym と Forgejo の doa の全リポジトリの依存を上げる PR)。CronJob で 15 分おき。**秘密の入れ方は [apps/renovate/README.md](apps/renovate/README.md)** |
| [`headlamp/`](apps/headlamp/) | Kubernetes の Web UI(`h.doany.io`、Portainer の置き換え)。認証は Entra、権限は `bootstrap/apiserver/` |
| [`rybbit/`](apps/rybbit/) | Rybbit(`rt.doany.io`、アクセス解析。クッキー無し)+ ClickHouse + PostgreSQL + Redis。トドロクの離脱をファネル・ジャーニー・セッションリプレイで見る。**使い始めは [apps/rybbit/README.md](apps/rybbit/README.md)** |

Expand Down
4 changes: 2 additions & 2 deletions apps/adguardhome/renovate-post-upgrade.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
# 読めない設定なら失敗する(= PR の postUpgradeTasks が落ちて気づける)。書き直したら config.yaml に戻し、
# deployment.yaml の doany.io/config-sha256 も合わせる(CI の adguard-config が見る)。
#
# 動くのは Renovate のコンテナ(ghcr.io/renovatebot/renovate、5ym/repo-config の renovate.yml)の中、リポジトリの直下。
# 動くのは Renovate のコンテナ(ghcr.io/renovatebot/renovate、apps/renovate/renovate.yaml の CronJob)の中、リポジトリの直下。
# AdGuard の版は deployment.yaml のイメージのタグ(Renovate が上げた後の値)から取り、公式のチェックサムと照らしてから使う。
# 許可は repo-config の renovate.yml の RENOVATE_ALLOWED_COMMANDS
# 許可は apps/renovate/renovate.yaml の RENOVATE_ALLOWED_COMMANDS
set -euo pipefail
cd "$(dirname "$0")"

Expand Down
41 changes: 41 additions & 0 deletions apps/renovate/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# renovate

Renovate を CronJob で回す(2026-10-16〜)。GitHub の `danything` と `5ym`、Forgejo(fj.doany.io)の `doa` の全リポジトリ。
設定は各リポジトリの `renovate.json`(共通は `github>5ym/repo-config`)。

それまでは GitHub Actions(5ym/repo-config の `renovate.yml`)と Forgejo Actions(doa/renovate)で毎時回していたが、
GitHub の schedule は 15〜40 分遅れ、丸ごと飛ばされることもあった。

| CronJob | 対象 | 時刻(毎時) |
| --- | --- | --- |
| `renovate-danything` | GitHub の danything | 2・17・32・47 分 |
| `renovate-5ym` | GitHub の 5ym | 7・22・37・52 分 |
| `renovate-forgejo` | Forgejo の doa | 12・27・42・57 分 |

**Job はいつも成功で終わる**(失敗で CronJob が Degraded になると、ArgoCD が gitops の同期を止めるため。
[renovate.yaml](renovate.yaml) の冒頭)。うまく動いているかはログで見る:

```shell
tools/t.ps1 kubectl -n renovate get jobs
tools/t.ps1 kubectl -n renovate logs job/<名前>
# 待たずに 1 回回す
tools/t.ps1 kubectl -n renovate create job --from=cronjob/renovate-5ym renovate-5ym-manual
```

## 秘密

Infisical の `/renovate/renovate-secrets`。**どれも無いあいだは、その CronJob は何もせずに終わる。**

| キー | 中身 | 使う CronJob |
| --- | --- | --- |
| `github-app-private-key` | GitHub App `doa-renovate` の秘密鍵(PEM をそのまま)。App の設定画面の Private keys で作る | danything・5ym |
| `forgejo-token` | Forgejo のユーザー `renovate` のトークン(チーム `bots` = 全リポジトリに書き込み) | forgejo |
| `github-com-token` | 任意。権限なしの GitHub のトークン。github.com のリリースノートやタグを読むときの回数制限(匿名 60 回/時)よけ | forgejo |

GitHub のトークンは実行のたびに App の鍵から作る(1 時間で切れる。[renovate.yaml](renovate.yaml) の `github-app-token.mjs`)。

## クラスタが落ちているとき

Renovate も止まる。もとの workflow は `workflow_dispatch` だけ残してあるので、急ぐときは手で回す
(GitHub は 5ym/repo-config の Actions → Renovate、Forgejo は doa/renovate の Actions)。
**CronJob と同時に走らせないこと**(同じリポジトリに 2 つの Renovate が触る)。
9 changes: 9 additions & 0 deletions apps/renovate/namespace.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# PSA は restricted で足りる(Renovate のイメージは非 root の 12021 で動き、hostPath も特権も使わない)。
apiVersion: v1
kind: Namespace
metadata:
name: renovate
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted
32 changes: 32 additions & 0 deletions apps/renovate/renovate-secrets.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Secret renovate-secrets は Infisical (il.doany.io) のフォルダ /renovate/renovate-secrets にあり、
# Infisical 純正 operator (bootstrap/infisical-operator) が Secret にする。キーは README.md の表。
# CronJob は Secret を毎回読み直すので、値を Infisical で書き換えれば次の実行から効く(auto-reload は要らない)。
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: renovate-secrets
namespace: renovate
# 2 つとも必須。前者は operator が作る Secret を prune させないため、後者は
# CRD がまだ無いクラスタで apps/ の同期が丸ごと落ちるのを防ぐため。
# bootstrap/README.md「InfisicalSecret には sync-options を 2 つ付けること」。
annotations:
argocd.argoproj.io/sync-options: Prune=false,SkipDryRunOnMissingResource=true
spec:
hostAPI: http://infisical.infisical.svc:8080/api
authentication:
kubernetesAuth:
identityId: f2bc3416-f196-4626-9bf3-c11693b32cc6
autoCreateServiceAccountToken: true
serviceAccountRef:
name: infisical-auth
namespace: infisical
secretsScope:
projectSlug: doa
envSlug: prod
secretsPath: /renovate/renovate-secrets
recursive: false
managedKubeSecretReferences:
- secretName: renovate-secrets
secretNamespace: renovate
# Orphan: CR を消しても Secret は残す(移行や再作成で稼働中の Pod を巻き込まない)
creationPolicy: Orphan
Loading
Loading