chore: remove zot stack
This commit is contained in:
parent
3066db793d
commit
8b9fc8ff1c
@ -9,4 +9,3 @@ resources:
|
|||||||
- ../../services/monitoring
|
- ../../services/monitoring
|
||||||
- ../../services/pegasus
|
- ../../services/pegasus
|
||||||
- ../../services/vault
|
- ../../services/vault
|
||||||
- ../../services/zot
|
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
kind: Kustomization
|
kind: Kustomization
|
||||||
resources:
|
resources:
|
||||||
- zot/kustomization.yaml
|
|
||||||
- gitea/kustomization.yaml
|
- gitea/kustomization.yaml
|
||||||
- vault/kustomization.yaml
|
- vault/kustomization.yaml
|
||||||
- jitsi/kustomization.yaml
|
- jitsi/kustomization.yaml
|
||||||
|
|||||||
@ -1,18 +0,0 @@
|
|||||||
# clusters/atlas/flux-system/applications/zot/kustomization.yaml
|
|
||||||
apiVersion: kustomize.toolkit.fluxcd.io/v1
|
|
||||||
kind: Kustomization
|
|
||||||
metadata:
|
|
||||||
name: zot
|
|
||||||
namespace: flux-system
|
|
||||||
spec:
|
|
||||||
interval: 10m
|
|
||||||
path: ./services/zot
|
|
||||||
targetNamespace: zot
|
|
||||||
prune: false
|
|
||||||
sourceRef:
|
|
||||||
kind: GitRepository
|
|
||||||
name: flux-system
|
|
||||||
namespace: flux-system
|
|
||||||
wait: true
|
|
||||||
dependsOn:
|
|
||||||
- name: core
|
|
||||||
@ -1,76 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Sync Keycloak users into Zot htpasswd.
|
|
||||||
# Intended to be rendered into a ConfigMap/Job; keep real secrets out of git.
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
require() { command -v "$1" >/dev/null 2>&1 || { echo "missing required binary: $1" >&2; exit 1; }; }
|
|
||||||
require curl; require jq; require kubectl; require htpasswd
|
|
||||||
|
|
||||||
: "${KEYCLOAK_URL:=https://sso.bstein.dev}"
|
|
||||||
: "${KEYCLOAK_REALM:=atlas}"
|
|
||||||
: "${KEYCLOAK_CLIENT_ID:?set KEYCLOAK_CLIENT_ID or export via secret}"
|
|
||||||
: "${KEYCLOAK_CLIENT_SECRET:?set KEYCLOAK_CLIENT_SECRET or export via secret}"
|
|
||||||
: "${ZOT_NAMESPACE:=zot}"
|
|
||||||
: "${HTPASSWD_SECRET_NAME:=zot-htpasswd}"
|
|
||||||
: "${DEFAULT_PASSWORD:=TempSsoPass!2025}"
|
|
||||||
: "${UI_PROXY_USER:=zot-ui-proxy}"
|
|
||||||
: "${UI_PROXY_PASSWORD:=TempSsoUiPass!2025}"
|
|
||||||
|
|
||||||
fetch_token() {
|
|
||||||
curl -fsS -X POST \
|
|
||||||
-d "grant_type=client_credentials" \
|
|
||||||
-d "client_id=${KEYCLOAK_CLIENT_ID}" \
|
|
||||||
-d "client_secret=${KEYCLOAK_CLIENT_SECRET}" \
|
|
||||||
"${KEYCLOAK_URL}/realms/${KEYCLOAK_REALM}/protocol/openid-connect/token" \
|
|
||||||
| jq -r '.access_token'
|
|
||||||
}
|
|
||||||
|
|
||||||
pull_users() {
|
|
||||||
local token="$1"
|
|
||||||
curl -fsS -H "Authorization: Bearer ${token}" \
|
|
||||||
"${KEYCLOAK_URL}/admin/realms/${KEYCLOAK_REALM}/users?max=500" \
|
|
||||||
| jq -r '.[] | select(.enabled == true) | select(.username | startswith("service-account-") | not) | .username'
|
|
||||||
}
|
|
||||||
|
|
||||||
decode_secret_file() {
|
|
||||||
local ns="$1" name="$2" key="$3" out="$4"
|
|
||||||
if kubectl -n "${ns}" get secret "${name}" >/dev/null 2>&1; then
|
|
||||||
kubectl -n "${ns}" get secret "${name}" -o "jsonpath={.data.${key}}" | base64 -d > "${out}" || true
|
|
||||||
else
|
|
||||||
: > "${out}"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
ensure_htpasswd_line() {
|
|
||||||
local user="$1" password="$2" file="$3"
|
|
||||||
if ! grep -q "^${user}:" "${file}" 2>/dev/null; then
|
|
||||||
htpasswd -nbB "${user}" "${password}" >> "${file}"
|
|
||||||
echo "added user ${user} to htpasswd"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
main() {
|
|
||||||
local token tmp existing
|
|
||||||
tmp="$(mktemp)"
|
|
||||||
existing="$(mktemp)"
|
|
||||||
trap 'rm -f "${tmp}" "${existing}"' EXIT
|
|
||||||
|
|
||||||
decode_secret_file "${ZOT_NAMESPACE}" "${HTPASSWD_SECRET_NAME}" htpasswd "${existing}"
|
|
||||||
cp "${existing}" "${tmp}"
|
|
||||||
|
|
||||||
ensure_htpasswd_line "${UI_PROXY_USER}" "${UI_PROXY_PASSWORD}" "${tmp}"
|
|
||||||
|
|
||||||
token="$(fetch_token)"
|
|
||||||
readarray -t users < <(pull_users "${token}")
|
|
||||||
for user in "${users[@]}"; do
|
|
||||||
ensure_htpasswd_line "${user}" "${DEFAULT_PASSWORD}" "${tmp}"
|
|
||||||
done
|
|
||||||
|
|
||||||
kubectl create secret generic "${HTPASSWD_SECRET_NAME}" \
|
|
||||||
--namespace "${ZOT_NAMESPACE}" \
|
|
||||||
--from-file=htpasswd="${tmp}" \
|
|
||||||
--dry-run=client -o yaml | kubectl apply -f -
|
|
||||||
}
|
|
||||||
|
|
||||||
main "$@"
|
|
||||||
@ -1,47 +0,0 @@
|
|||||||
# services/zot/config.map
|
|
||||||
apiVersion: v1
|
|
||||||
kind: ConfigMap
|
|
||||||
metadata:
|
|
||||||
name: zot-config
|
|
||||||
namespace: zot
|
|
||||||
data:
|
|
||||||
config.json: |
|
|
||||||
{
|
|
||||||
"storage": {
|
|
||||||
"rootDirectory": "/var/lib/registry",
|
|
||||||
"dedupe": true,
|
|
||||||
"gc": true,
|
|
||||||
"gcDelay": "1h",
|
|
||||||
"gcInterval": "1h"
|
|
||||||
},
|
|
||||||
"http": {
|
|
||||||
"address": "0.0.0.0",
|
|
||||||
"port": "5000",
|
|
||||||
"realm": "zot-registry",
|
|
||||||
"compat": ["docker2s2"],
|
|
||||||
"auth": {
|
|
||||||
"htpasswd": { "path": "/etc/zot/htpasswd" }
|
|
||||||
},
|
|
||||||
"accessControl": {
|
|
||||||
"repositories": {
|
|
||||||
"**": {
|
|
||||||
"policies": [
|
|
||||||
{ "users": ["bstein", "zot-ui-proxy"], "actions": ["read", "create", "update", "delete"] }
|
|
||||||
],
|
|
||||||
"defaultPolicy": [],
|
|
||||||
"anonymousPolicy": []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"adminPolicy": {
|
|
||||||
"users": ["bstein", "zot-ui-proxy"],
|
|
||||||
"actions": ["read", "create", "update", "delete"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"log": { "level": "info" },
|
|
||||||
"extensions": {
|
|
||||||
"ui": { "enable": true },
|
|
||||||
"search": { "enable": true },
|
|
||||||
"metrics": { "enable": true }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,102 +0,0 @@
|
|||||||
# services/zot/deployment.yaml
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: zot
|
|
||||||
namespace: zot
|
|
||||||
labels: { app: zot }
|
|
||||||
spec:
|
|
||||||
replicas: 1
|
|
||||||
selector:
|
|
||||||
matchLabels: { app: zot }
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels: { app: zot }
|
|
||||||
spec:
|
|
||||||
nodeSelector:
|
|
||||||
node-role.kubernetes.io/worker: "true"
|
|
||||||
affinity:
|
|
||||||
nodeAffinity:
|
|
||||||
requiredDuringSchedulingIgnoredDuringExecution:
|
|
||||||
nodeSelectorTerms:
|
|
||||||
- matchExpressions:
|
|
||||||
- key: hardware
|
|
||||||
operator: In
|
|
||||||
values: ["rpi4","rpi5"]
|
|
||||||
preferredDuringSchedulingIgnoredDuringExecution:
|
|
||||||
- weight: 50
|
|
||||||
preference:
|
|
||||||
matchExpressions:
|
|
||||||
- key: hardware
|
|
||||||
operator: In
|
|
||||||
values: ["rpi4"]
|
|
||||||
containers:
|
|
||||||
- name: zot
|
|
||||||
image: ghcr.io/project-zot/zot-linux-arm64:v2.1.8
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
args: ["serve", "/etc/zot/config.json"]
|
|
||||||
env:
|
|
||||||
- name: UI_PROXY_HTPASSWD
|
|
||||||
value: "zot-ui-proxy:$2y$05$ctfbLo5KBoNA6pluLGGWde6TK8eOPnIH9u8x/IivAhcE/k0qCCR3y"
|
|
||||||
ports:
|
|
||||||
- { name: http, containerPort: 5000 }
|
|
||||||
volumeMounts:
|
|
||||||
- name: cfg
|
|
||||||
mountPath: /etc/zot/config.json
|
|
||||||
subPath: config.json
|
|
||||||
readOnly: true
|
|
||||||
- name: htpasswd-merged
|
|
||||||
mountPath: /etc/zot/htpasswd
|
|
||||||
subPath: htpasswd
|
|
||||||
- name: zot-data
|
|
||||||
mountPath: /var/lib/registry
|
|
||||||
readinessProbe:
|
|
||||||
tcpSocket:
|
|
||||||
port: 5000
|
|
||||||
initialDelaySeconds: 2
|
|
||||||
periodSeconds: 5
|
|
||||||
livenessProbe:
|
|
||||||
tcpSocket:
|
|
||||||
port: 5000
|
|
||||||
initialDelaySeconds: 5
|
|
||||||
periodSeconds: 10
|
|
||||||
resources:
|
|
||||||
requests: { cpu: "50m", memory: "64Mi" }
|
|
||||||
initContainers:
|
|
||||||
- name: merge-htpasswd
|
|
||||||
image: busybox:1.36
|
|
||||||
command:
|
|
||||||
- sh
|
|
||||||
- -c
|
|
||||||
- |
|
|
||||||
set -e
|
|
||||||
if [ -f /src/htpasswd ]; then
|
|
||||||
cp /src/htpasswd /merged/htpasswd
|
|
||||||
else
|
|
||||||
touch /merged/htpasswd
|
|
||||||
fi
|
|
||||||
if [ -n "${UI_PROXY_HTPASSWD}" ]; then
|
|
||||||
echo "${UI_PROXY_HTPASSWD}" >> /merged/htpasswd
|
|
||||||
fi
|
|
||||||
env:
|
|
||||||
- name: UI_PROXY_HTPASSWD
|
|
||||||
value: "zot-ui-proxy:$2y$05$ctfbLo5KBoNA6pluLGGWde6TK8eOPnIH9u8x/IivAhcE/k0qCCR3y"
|
|
||||||
volumeMounts:
|
|
||||||
- name: htpasswd-source
|
|
||||||
mountPath: /src
|
|
||||||
readOnly: true
|
|
||||||
- name: htpasswd-merged
|
|
||||||
mountPath: /merged
|
|
||||||
volumes:
|
|
||||||
- name: cfg
|
|
||||||
configMap:
|
|
||||||
name: zot-config
|
|
||||||
- name: htpasswd-source
|
|
||||||
secret:
|
|
||||||
secretName: zot-htpasswd
|
|
||||||
optional: true
|
|
||||||
- name: htpasswd-merged
|
|
||||||
emptyDir: {}
|
|
||||||
- name: zot-data
|
|
||||||
persistentVolumeClaim:
|
|
||||||
claimName: zot-data
|
|
||||||
@ -1,54 +0,0 @@
|
|||||||
# services/zot/ingress.yaml
|
|
||||||
apiVersion: networking.k8s.io/v1
|
|
||||||
kind: Ingress
|
|
||||||
metadata:
|
|
||||||
name: zot-cli
|
|
||||||
namespace: zot
|
|
||||||
annotations:
|
|
||||||
cert-manager.io/cluster-issuer: letsencrypt
|
|
||||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
|
||||||
traefik.ingress.kubernetes.io/router.tls: "true"
|
|
||||||
traefik.ingress.kubernetes.io/router.middlewares: zot-zot-resp-headers@kubernetescrd
|
|
||||||
spec:
|
|
||||||
ingressClassName: traefik
|
|
||||||
tls:
|
|
||||||
- hosts: [ "cli.registry.bstein.dev" ]
|
|
||||||
secretName: cli-registry-bstein-dev-tls
|
|
||||||
rules:
|
|
||||||
- host: cli.registry.bstein.dev
|
|
||||||
http:
|
|
||||||
paths:
|
|
||||||
- path: /
|
|
||||||
pathType: Prefix
|
|
||||||
backend:
|
|
||||||
service:
|
|
||||||
name: zot
|
|
||||||
port:
|
|
||||||
number: 5000
|
|
||||||
---
|
|
||||||
apiVersion: networking.k8s.io/v1
|
|
||||||
kind: Ingress
|
|
||||||
metadata:
|
|
||||||
name: zot-ui
|
|
||||||
namespace: zot
|
|
||||||
annotations:
|
|
||||||
cert-manager.io/cluster-issuer: letsencrypt
|
|
||||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
|
||||||
traefik.ingress.kubernetes.io/router.tls: "true"
|
|
||||||
traefik.ingress.kubernetes.io/router.middlewares: zot-zot-resp-headers@kubernetescrd
|
|
||||||
spec:
|
|
||||||
ingressClassName: traefik
|
|
||||||
tls:
|
|
||||||
- hosts: [ "web.registry.bstein.dev" ]
|
|
||||||
secretName: web-registry-bstein-dev-tls
|
|
||||||
rules:
|
|
||||||
- host: web.registry.bstein.dev
|
|
||||||
http:
|
|
||||||
paths:
|
|
||||||
- path: /
|
|
||||||
pathType: Prefix
|
|
||||||
backend:
|
|
||||||
service:
|
|
||||||
name: zot-oauth2-proxy
|
|
||||||
port:
|
|
||||||
number: 80
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
# services/zot/kustomization.yaml
|
|
||||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
|
||||||
kind: Kustomization
|
|
||||||
resources:
|
|
||||||
- namespace.yaml
|
|
||||||
- pvc.yaml
|
|
||||||
- deployment.yaml
|
|
||||||
- configmap.yaml
|
|
||||||
- service.yaml
|
|
||||||
- oauth2-proxy-deployment.yaml
|
|
||||||
- oauth2-proxy-service.yaml
|
|
||||||
- ingress.yaml
|
|
||||||
- middleware.yaml
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
# services/zot/middleware.yaml
|
|
||||||
apiVersion: traefik.io/v1alpha1
|
|
||||||
kind: Middleware
|
|
||||||
metadata:
|
|
||||||
name: zot-resp-headers
|
|
||||||
namespace: zot
|
|
||||||
spec:
|
|
||||||
headers:
|
|
||||||
customResponseHeaders:
|
|
||||||
Docker-Distribution-Api-Version: "registry/2.0"
|
|
||||||
accessControlAllowOriginList:
|
|
||||||
- "*"
|
|
||||||
accessControlAllowCredentials: true
|
|
||||||
accessControlAllowHeaders:
|
|
||||||
- Authorization
|
|
||||||
- Content-Type
|
|
||||||
- Docker-Distribution-Api-Version
|
|
||||||
- X-Registry-Auth
|
|
||||||
accessControlAllowMethods:
|
|
||||||
- GET
|
|
||||||
- HEAD
|
|
||||||
- OPTIONS
|
|
||||||
- POST
|
|
||||||
- PUT
|
|
||||||
- PATCH
|
|
||||||
- DELETE
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
# services/zot/namespace.yaml
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Namespace
|
|
||||||
metadata:
|
|
||||||
name: zot
|
|
||||||
@ -1,84 +0,0 @@
|
|||||||
# services/zot/oauth2-proxy-deployment.yaml
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: zot-oauth2-proxy
|
|
||||||
namespace: zot
|
|
||||||
labels: { app: zot-oauth2-proxy }
|
|
||||||
spec:
|
|
||||||
replicas: 1
|
|
||||||
selector:
|
|
||||||
matchLabels: { app: zot-oauth2-proxy }
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels: { app: zot-oauth2-proxy }
|
|
||||||
spec:
|
|
||||||
nodeSelector:
|
|
||||||
node-role.kubernetes.io/worker: "true"
|
|
||||||
affinity:
|
|
||||||
nodeAffinity:
|
|
||||||
preferredDuringSchedulingIgnoredDuringExecution:
|
|
||||||
- weight: 50
|
|
||||||
preference:
|
|
||||||
matchExpressions:
|
|
||||||
- key: hardware
|
|
||||||
operator: In
|
|
||||||
values: ["rpi4","rpi5"]
|
|
||||||
containers:
|
|
||||||
- name: oauth2-proxy
|
|
||||||
image: quay.io/oauth2-proxy/oauth2-proxy:v7.6.0
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
args:
|
|
||||||
- --provider=oidc
|
|
||||||
- --redirect-url=https://web.registry.bstein.dev/oauth2/callback
|
|
||||||
- --oidc-issuer-url=https://sso.bstein.dev/realms/atlas
|
|
||||||
- --scope=openid profile email
|
|
||||||
- --email-domain=*
|
|
||||||
- --cookie-domain=web.registry.bstein.dev
|
|
||||||
- --cookie-name=_zot_ui_oauth
|
|
||||||
- --set-xauthrequest=true
|
|
||||||
- --set-authorization-header=false
|
|
||||||
- --pass-authorization-header=false
|
|
||||||
- --pass-access-token=false
|
|
||||||
- --pass-basic-auth=true
|
|
||||||
- --cookie-secure=true
|
|
||||||
- --cookie-samesite=lax
|
|
||||||
- --cookie-refresh=20m
|
|
||||||
- --cookie-expire=168h
|
|
||||||
- --upstream=http://zot-ui-proxy:TempSsoUiPass%212025@zot:5000
|
|
||||||
- --http-address=0.0.0.0:4180
|
|
||||||
- --skip-provider-button=true
|
|
||||||
- --skip-jwt-bearer-tokens=true
|
|
||||||
env:
|
|
||||||
- name: OAUTH2_PROXY_CLIENT_ID
|
|
||||||
valueFrom:
|
|
||||||
secretKeyRef:
|
|
||||||
name: zot-oidc
|
|
||||||
key: client_id
|
|
||||||
- name: OAUTH2_PROXY_CLIENT_SECRET
|
|
||||||
valueFrom:
|
|
||||||
secretKeyRef:
|
|
||||||
name: zot-oidc
|
|
||||||
key: client_secret
|
|
||||||
- name: OAUTH2_PROXY_COOKIE_SECRET
|
|
||||||
valueFrom:
|
|
||||||
secretKeyRef:
|
|
||||||
name: zot-oidc
|
|
||||||
key: client_secret
|
|
||||||
ports:
|
|
||||||
- containerPort: 4180
|
|
||||||
name: http
|
|
||||||
readinessProbe:
|
|
||||||
httpGet:
|
|
||||||
path: /ping
|
|
||||||
port: 4180
|
|
||||||
initialDelaySeconds: 5
|
|
||||||
periodSeconds: 10
|
|
||||||
livenessProbe:
|
|
||||||
httpGet:
|
|
||||||
path: /ping
|
|
||||||
port: 4180
|
|
||||||
initialDelaySeconds: 20
|
|
||||||
periodSeconds: 20
|
|
||||||
resources:
|
|
||||||
requests: { cpu: "25m", memory: "64Mi" }
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
# services/zot/oauth2-proxy-service.yaml
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Service
|
|
||||||
metadata:
|
|
||||||
name: zot-oauth2-proxy
|
|
||||||
namespace: zot
|
|
||||||
labels: { app: zot-oauth2-proxy }
|
|
||||||
spec:
|
|
||||||
type: ClusterIP
|
|
||||||
selector: { app: zot-oauth2-proxy }
|
|
||||||
ports:
|
|
||||||
- name: http
|
|
||||||
port: 80
|
|
||||||
targetPort: 4180
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
# services/zot/pvc.yaml
|
|
||||||
apiVersion: v1
|
|
||||||
kind: PersistentVolumeClaim
|
|
||||||
metadata:
|
|
||||||
name: zot-data
|
|
||||||
namespace: zot
|
|
||||||
spec:
|
|
||||||
accessModes:
|
|
||||||
- ReadWriteOnce
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
storage: 25Gi
|
|
||||||
storageClassName: asteria
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
# services/zot/service.yaml
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Service
|
|
||||||
metadata:
|
|
||||||
name: zot
|
|
||||||
namespace: zot
|
|
||||||
labels: { app: zot }
|
|
||||||
spec:
|
|
||||||
type: ClusterIP
|
|
||||||
selector: { app: zot }
|
|
||||||
ports:
|
|
||||||
- name: http
|
|
||||||
port: 5000
|
|
||||||
targetPort: 5000
|
|
||||||
Loading…
x
Reference in New Issue
Block a user