fix: add request_upgrades.py to image, add web dashboard
CI/CD / lint-test (push) Failing after 1m40s
CI/CD / build-push (push) Has been skipped

- Dockerfile: add COPY for request_upgrades.py (was missing — root cause
  of Monday upgrade CronJob failing with 'No such file'), add git (needed
  for repo cloning in upgrade workflow), copy web.py + templates/
- requirements.txt: add fastapi, uvicorn, jinja2 for web dashboard
- web.py: FastAPI dashboard with image inventory and upgrade trigger pages
- templates/: base layout, images page (namespace→app→container grouped
  with live version status), upgrade page (outdated list + trigger button
  + job history)
- kubernetes/web-deployment.yaml: Deployment + LoadBalancer at 192.168.87.13
- kubernetes/rbac.yaml: add version-tracker-web ServiceAccount, ClusterRole
  (read pods/deployments/replicasets/statefulsets/daemonsets/jobs/cronjobs),
  and namespace Role to create upgrade Jobs
- kubernetes/upgrade-cronjob.yaml: fix YAML indentation bug on GITEA_USERNAME
  and GITEA_COMMITTER_NAME env vars
This commit is contained in:
claude-code
2026-07-12 16:15:15 +00:00
parent cb7a2abf17
commit 5ac7b2f5c5
9 changed files with 985 additions and 3 deletions
+91 -1
View File
@@ -1,4 +1,5 @@
---
# ── version-tracker: read-only pod/namespace lister (weekly report) ──────────
apiVersion: v1
kind: ServiceAccount
metadata:
@@ -6,7 +7,6 @@ metadata:
namespace: k8s-version-tracker
---
# Cluster-wide read access to list pods in all namespaces
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
@@ -29,3 +29,93 @@ subjects:
- kind: ServiceAccount
name: version-tracker
namespace: k8s-version-tracker
---
# ── upgrade-requester: read-only pod lister (upgrades go through GitOps/ArgoCD) ─
apiVersion: v1
kind: ServiceAccount
metadata:
name: upgrade-requester
namespace: k8s-version-tracker
---
# Reuse the same read-only ClusterRole — no direct workload patching needed.
# Image updates are committed to argocd-gitops and ArgoCD syncs automatically.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: upgrade-requester
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: version-tracker-reader
subjects:
- kind: ServiceAccount
name: upgrade-requester
namespace: k8s-version-tracker
---
# ── version-tracker-web: dashboard service account ───────────────────────────
apiVersion: v1
kind: ServiceAccount
metadata:
name: version-tracker-web
namespace: k8s-version-tracker
---
# Cluster-wide read access: pods, namespaces, and workload owners (to map pods → apps)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: version-tracker-web-reader
rules:
- apiGroups: [""]
resources: ["pods", "namespaces"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
resources: ["deployments", "replicasets", "statefulsets", "daemonsets"]
verbs: ["get", "list", "watch"]
- apiGroups: ["batch"]
resources: ["jobs", "cronjobs"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: version-tracker-web-reader
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: version-tracker-web-reader
subjects:
- kind: ServiceAccount
name: version-tracker-web
namespace: k8s-version-tracker
---
# Namespace-scoped: create upgrade Jobs in this namespace only
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: upgrade-trigger
namespace: k8s-version-tracker
rules:
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create", "get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: upgrade-trigger
namespace: k8s-version-tracker
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: upgrade-trigger
subjects:
- kind: ServiceAccount
name: version-tracker-web
namespace: k8s-version-tracker
+2 -2
View File
@@ -42,8 +42,8 @@ spec:
- name: GITEA_REPO_URL
value: "https://repo.adservio.us/ai_approver/argocd-gitops.git"
- name: GITEA_USERNAME
value: "ai_approver"
- name: GITEA_COMMITTER_NAME
value: "ai_approver"
- name: GITEA_COMMITTER_NAME
value: "k8s-version-tracker"
- name: GITEA_COMMITTER_EMAIL
value: "k8s-version-tracker@themosers.club"
+67
View File
@@ -0,0 +1,67 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: version-tracker-web
namespace: k8s-version-tracker
labels:
app: version-tracker-web
spec:
replicas: 1
selector:
matchLabels:
app: version-tracker-web
template:
metadata:
labels:
app: version-tracker-web
spec:
serviceAccountName: version-tracker-web
containers:
- name: web
image: registry.storedbox.net/k8s-version-tracker:latest
imagePullPolicy: Always
command: ["python", "web.py"]
ports:
- containerPort: 8080
name: http
env:
- name: MATTERMOST_WEBHOOK_URL
valueFrom:
secretKeyRef:
name: version-tracker-secrets
key: MATTERMOST_WEBHOOK_URL
- name: APPROVAL_MIDDLEWARE_URL
value: "http://192.168.87.14:8085"
resources:
requests:
cpu: 50m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
readinessProbe:
httpGet:
path: /api/images
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: version-tracker-web
namespace: k8s-version-tracker
labels:
app: version-tracker-web
annotations:
metallb.universe.tf/loadBalancerIPs: 192.168.87.13
spec:
type: LoadBalancer
selector:
app: version-tracker-web
ports:
- name: http
port: 80
targetPort: 8080