From 20128bcd73103370428509085eefbe11047b690b Mon Sep 17 00:00:00 2001 From: Ruben Hensen Date: Tue, 19 May 2026 23:19:21 +0200 Subject: [PATCH] Add gitea at git.rubenhensen.nl Single-pod sqlite install (simplest path for a home git host). HTTPS-only, no SSH listener for now. Wired into the Hetzner tunnel like the other rubenhensen.nl services. First visitor to git.rubenhensen.nl can register; Gitea auto-promotes the first user to admin. --- apps/templates/gitea-folder.yaml | 21 ++++++++ dns/domains/rubenhensen.nl.yaml | 4 ++ gitea/gitea-data-persistentvolumeclaim.yaml | 10 ++++ gitea/gitea-deployment.yaml | 60 +++++++++++++++++++++ gitea/gitea-service.yaml | 13 +++++ gitea/ingress.yaml | 24 +++++++++ nix-infra-machine/nodes/node001.nix | 1 + 7 files changed, 133 insertions(+) create mode 100644 apps/templates/gitea-folder.yaml create mode 100644 gitea/gitea-data-persistentvolumeclaim.yaml create mode 100644 gitea/gitea-deployment.yaml create mode 100644 gitea/gitea-service.yaml create mode 100644 gitea/ingress.yaml diff --git a/apps/templates/gitea-folder.yaml b/apps/templates/gitea-folder.yaml new file mode 100644 index 0000000..c196f13 --- /dev/null +++ b/apps/templates/gitea-folder.yaml @@ -0,0 +1,21 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: gitea + namespace: argocd + finalizers: + - resources-finalizer.argocd.argoproj.io +spec: + project: default + source: + repoURL: https://github.com/rubenhensen/k8scd.git + targetRevision: HEAD + path: gitea + destination: + server: https://kubernetes.default.svc + namespace: gitea + syncPolicy: + syncOptions: + - CreateNamespace=true + automated: + selfHeal: true diff --git a/dns/domains/rubenhensen.nl.yaml b/dns/domains/rubenhensen.nl.yaml index 1271c4a..ce1c99b 100644 --- a/dns/domains/rubenhensen.nl.yaml +++ b/dns/domains/rubenhensen.nl.yaml @@ -55,6 +55,10 @@ records: expire: 300 type: A content: "46.224.26.65" + - name: "git" + expire: 300 + type: A + content: "46.224.26.65" - name: "@" expire: 300 type: MX diff --git a/gitea/gitea-data-persistentvolumeclaim.yaml b/gitea/gitea-data-persistentvolumeclaim.yaml new file mode 100644 index 0000000..34f25cc --- /dev/null +++ b/gitea/gitea-data-persistentvolumeclaim.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: gitea-data +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi diff --git a/gitea/gitea-deployment.yaml b/gitea/gitea-deployment.yaml new file mode 100644 index 0000000..e7e17a4 --- /dev/null +++ b/gitea/gitea-deployment.yaml @@ -0,0 +1,60 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: gitea + labels: + app: gitea +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: gitea + template: + metadata: + labels: + app: gitea + spec: + securityContext: + fsGroup: 1000 + containers: + - name: gitea + image: gitea/gitea:1 + env: + - name: USER_UID + value: "1000" + - name: USER_GID + value: "1000" + - name: TZ + value: Europe/Amsterdam + - name: GITEA__server__ROOT_URL + value: https://git.rubenhensen.nl/ + - name: GITEA__server__DOMAIN + value: git.rubenhensen.nl + - name: GITEA__server__PROTOCOL + value: http + - name: GITEA__server__HTTP_PORT + value: "3000" + - name: GITEA__server__DISABLE_SSH + value: "true" + - name: GITEA__database__DB_TYPE + value: sqlite3 + - name: GITEA__database__PATH + value: /data/gitea/gitea.db + - name: GITEA__security__INSTALL_LOCK + value: "true" + - name: GITEA__log__MODE + value: console + ports: + - containerPort: 3000 + name: http + protocol: TCP + volumeMounts: + - mountPath: /data + name: data + restartPolicy: Always + volumes: + - name: data + persistentVolumeClaim: + claimName: gitea-data diff --git a/gitea/gitea-service.yaml b/gitea/gitea-service.yaml new file mode 100644 index 0000000..b387d38 --- /dev/null +++ b/gitea/gitea-service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: gitea + labels: + app: gitea +spec: + selector: + app: gitea + ports: + - name: http + port: 3000 + targetPort: 3000 diff --git a/gitea/ingress.yaml b/gitea/ingress.yaml new file mode 100644 index 0000000..27e787a --- /dev/null +++ b/gitea/ingress.yaml @@ -0,0 +1,24 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: gitea-ingress + annotations: + cert-manager.io/cluster-issuer: prod-cluster-issuer + nginx.ingress.kubernetes.io/proxy-body-size: "1g" +spec: + ingressClassName: nginx + rules: + - host: git.rubenhensen.nl + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: gitea + port: + number: 3000 + tls: + - secretName: letsencrypt-prod + hosts: + - git.rubenhensen.nl diff --git a/nix-infra-machine/nodes/node001.nix b/nix-infra-machine/nodes/node001.nix index 31264a3..492951c 100644 --- a/nix-infra-machine/nodes/node001.nix +++ b/nix-infra-machine/nodes/node001.nix @@ -19,6 +19,7 @@ let "lingo.rubenhensen.nl" "blog.rubenhensen.nl" "serpbear.rubenhensen.nl" + "git.rubenhensen.nl" ]; sniMapEntries =