blob: d85c6051737a6357e2621dcd7a467246854ae4ce [file] [log] [blame]
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +02001---
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: git
6 namespace: mulk
7 labels:
8 name: git
9 k8s-app: git
10spec:
11 replicas: 1
12 selector:
13 matchLabels:
14 k8s-app: git
15 name: git
16 template:
17 metadata:
18 labels:
19 name: git
20 k8s-app: git
21 spec:
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +020022 containers:
Matthias Andreas Benkardfaf5a092024-03-06 12:51:07 +010023 - name: cgit
Matthias Andreas Benkard68157fd2026-11-05 15:58:35 +010024 # Serves cgit at / (lighttpd rewrites /<repo>/... to cgit.cgi?url=...).
25 # The image's own sshd listens on :22 and is unused; gitolite is on :2222.
26 image: docker.io/woahbase/alpine-cgit:1.3_20260805
27 imagePullPolicy: IfNotPresent
28 env:
29 # Formatters for the about pages and syntax highlighting.
30 - name: S6_NEEDED_PACKAGES
31 value: "groff python3 py3-docutils py3-markdown py3-pygments"
32 # /home/git is gitolite's volume (owned by gitolite's uid 106), so
33 # cgit must not chown it: CGIT_SKIP_PERMFIX skips cgit's permfix,
34 # and an empty S6_USER skips the base image's usermod/chown of the
35 # user's home (scripts fall back to user "git").
36 - name: CGIT_SKIP_PERMFIX
37 value: "true"
38 - name: S6_USER
39 value: ""
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +020040 resources:
41 limits:
42 cpu: 2000m
43 memory: 100Mi
44 requests:
45 cpu: 10m
46 memory: 50Mi
47 ports:
48 - containerPort: 80
49 name: cgit-http
50 protocol: TCP
51 volumeMounts:
52 - name: data
53 mountPath: /home/git
54 - name: config
55 mountPath: /etc/cgitrc
56 subPath: cgitrc
57 readOnly: true
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +010058 - name: gitolite
Matthias Andreas Benkard7cc90d42026-11-05 14:43:06 +010059 image: docker.io/elsdoerfer/gitolite:v3.6.15-ubuntu-26.04-20260824.3
60 imagePullPolicy: IfNotPresent
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +010061 env: []
62 #tty: true
63 #stdin: true
64 #command:
65 # - /bin/cat
66 resources:
67 limits:
68 cpu: 2000m
69 memory: 100Mi
70 requests:
71 cpu: 10m
72 memory: 50Mi
73 ports:
74 - containerPort: 2222
75 name: gitolite-ssh
76 protocol: TCP
77 volumeMounts:
78 - name: data
79 mountPath: /home/git/repositories
80 subPath: repositories
81 #- name: data
82 # mountPath: /home/git/projects.list
83 # subPath: projects.list
84 - name: data
85 mountPath: /home/git/.gitolite
86 subPath: .gitolite
87 - name: data
88 mountPath: /home/git/.gitolite.rc
89 subPath: .gitolite.rc
90 - name: data
91 mountPath: /home/git/.ssh
92 subPath: .ssh
93 - name: ssh
94 mountPath: /etc/ssh
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +020095 volumes:
96 - name: data
97 persistentVolumeClaim:
98 claimName: git-data
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +010099 - name: ssh
100 persistentVolumeClaim:
101 claimName: git-ssh
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +0200102 - name: config
103 configMap:
104 name: git-config
105---
106apiVersion: v1
107kind: Service
108metadata:
109 name: git-cgit
110 namespace: mulk
111 labels:
112 k8s-app: git
113 name: git-cgit
114spec:
115 selector:
116 k8s-app: git
117 type: ClusterIP
118 ports:
119 - name: http
120 port: 80
121 targetPort: cgit-http
122 protocol: TCP
123---
124apiVersion: v1
125kind: Service
126metadata:
127 name: git-gitolite
128 namespace: mulk
129 labels:
130 k8s-app: git
131 name: git-gitolite
132spec:
133 selector:
134 k8s-app: git
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100135 type: NodePort
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +0200136 ports:
137 - name: ssh
138 port: 22
139 targetPort: gitolite-ssh
140 protocol: TCP
141---
142apiVersion: v1
143kind: PersistentVolumeClaim
144metadata:
145 name: git-data
146 namespace: mulk
147 labels:
148 name: git-data
149 k8s-app: git
150spec:
151 accessModes:
152 - ReadWriteOnce
153 resources:
154 requests:
155 storage: 200Gi
156 storageClassName: local-path
157---
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100158apiVersion: v1
159kind: PersistentVolumeClaim
160metadata:
161 name: git-ssh
162 namespace: mulk
163 labels:
164 name: git-ssh
165 k8s-app: git
166spec:
167 accessModes:
168 - ReadWriteOnce
169 resources:
170 requests:
171 storage: 50Mi
172 storageClassName: local-path
173---
Matthias Andreas Benkard8528b522026-11-05 10:57:03 +0100174# TLS certificate for the cgit IngressRoute below. It used to be created
175# by cert-manager's ingress-shim from an nginx Ingress, which has been
176# removed; the HTTP-01 solver still goes through Traefik's nginx-class
177# compat provider (see the letsencrypt-prod ClusterIssuer).
178apiVersion: cert-manager.io/v1
179kind: Certificate
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +0200180metadata:
Matthias Andreas Benkard8528b522026-11-05 10:57:03 +0100181 name: git-cgit-cgi-tls
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +0200182 namespace: mulk
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +0200183spec:
Matthias Andreas Benkard8528b522026-11-05 10:57:03 +0100184 secretName: git-cgit-cgi-tls
185 dnsNames:
186 - git.benkard.de
187 issuerRef:
188 kind: ClusterIssuer
189 name: letsencrypt-prod
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +0200190---
Matthias Andreas Benkard8528b522026-11-05 10:57:03 +0100191# Traefik route for cgit. Traefik's ingress-nginx provider does not
192# support nginx snippet annotations, and it has no global per-host rate
Matthias Andreas Benkardb4f91a12026-11-04 21:36:23 +0100193# limit, so cgit gets a native IngressRoute instead.
194#
195# A crawler botnet with thousands of rotating IPs and browser user agents
196# hammers cgit; cap it at 5 r/s in total (not per client). A single router
197# keeps the limit in one bucket (each router gets its own limiter).
198apiVersion: traefik.io/v1alpha1
199kind: Middleware
200metadata:
201 name: git-cgit-ratelimit
202 namespace: mulk
203spec:
204 rateLimit:
205 average: 5
206 period: 1s
207 burst: 20
208 sourceCriterion:
209 requestHost: true
210---
211# Same as the rewrite-target of the Ingress above: strip a ".git" suffix
212# from the repository name and route everything to cgit.cgi.
213apiVersion: traefik.io/v1alpha1
214kind: Middleware
215metadata:
216 name: git-cgit-rewrite
217 namespace: mulk
218spec:
219 replacePathRegex:
220 regex: "^/(?:(.*)[.]git(/.*)?|(.*))$"
Matthias Andreas Benkard68157fd2026-11-05 15:58:35 +0100221 replacement: "/${1}${2}${3}"
Matthias Andreas Benkardb4f91a12026-11-04 21:36:23 +0100222---
223apiVersion: traefik.io/v1alpha1
224kind: Middleware
225metadata:
226 name: git-cgit-https-redirect
227 namespace: mulk
228spec:
229 redirectScheme:
230 scheme: https
231 permanent: true
232---
233apiVersion: traefik.io/v1alpha1
234kind: IngressRoute
235metadata:
236 name: git-cgit-cgi
237 namespace: mulk
238spec:
239 entryPoints:
240 - websecure
241 routes:
242 - kind: Rule
243 match: Host(`git.benkard.de`)
244 middlewares:
245 - name: git-cgit-ratelimit
246 - name: git-cgit-rewrite
247 services:
248 - name: git-cgit
249 port: 80
250 tls:
251 secretName: git-cgit-cgi-tls
252---
253apiVersion: traefik.io/v1alpha1
254kind: IngressRoute
255metadata:
256 name: git-cgit-cgi-http
257 namespace: mulk
258spec:
259 entryPoints:
260 - web
261 routes:
262 - kind: Rule
263 match: Host(`git.benkard.de`)
264 middlewares:
265 - name: git-cgit-https-redirect
266 services:
267 - name: git-cgit
268 port: 80
269---
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +0200270apiVersion: networking.k8s.io/v1
271kind: Ingress
272metadata:
273 name: git-cgit-assets
274 namespace: mulk
275 annotations:
276 cert-manager.io/cluster-issuer: letsencrypt-prod
277 kubernetes.io/ingress.class: nginx
278 nginx.ingress.kubernetes.io/rewrite-target: /cgit/$1
279spec:
280 rules:
281 - host: static.git.benkard.de
282 http:
283 paths:
284 - backend:
285 service:
286 name: git-cgit
287 port:
288 number: 80
289 path: /(.*)
290 pathType: ImplementationSpecific
291 tls:
292 - hosts:
293 - static.git.benkard.de
294 secretName: git-cgit-assets-tls
295---
296apiVersion: v1
297kind: ConfigMap
298metadata:
299 name: git-config
300 namespace: mulk
301data:
302 cgitrc: |-
303 css=https://static.git.benkard.de/cgit.css
304 logo=https://static.git.benkard.de/cgit.png
305
306 remove-suffix=1
307 enable-commit-graph=1
308 enable-index-links=1
309 enable-log-filecount=1
310 enable-log-linecount=1
311 enable-git-config=1
312 case-sensitive-sort=0
313
314 virtual-root=https://git.benkard.de/
315
316 #cache-size=10000
317 #cache-root=/var/cache/cgit
318
319 # needs Pygments
320 #source-filter=/usr/lib/cgit/filters/syntax-highlighting.py
321
322 about-filter=/usr/lib/cgit/filters/about-formatting.sh
323
324 clone-url=https://git.benkard.de/$CGIT_REPO_URL
325
326 readme=:README.md
327 readme=:README.markdown
328 readme=:README.html
329 readme=:README.txt
330 readme=:README
331
332 project-list=/home/git/projects.list
333 scan-path=/home/git/repositories/
334
335 #
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100336
337---
338
339apiVersion: batch/v1
340kind: CronJob
341
342metadata:
343 name: git-github-replication
344 namespace: mulk
345 labels: &labels
346 k8s-app: git
347
348spec:
349 schedule: "*/120 * * * *"
Matthias Andreas Benkardcbdcd902022-12-27 15:31:15 +0100350 concurrencyPolicy: Forbid
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100351
352 jobTemplate:
353
354 spec:
355 ttlSecondsAfterFinished: 3600
356
357 template:
358 metadata:
359 name: git-github-replication
360 labels: *labels
361
362 spec:
363 restartPolicy: OnFailure
364
365 volumes:
366 - name: github-secrets
367 secret:
368 secretName: github-secrets
Matthias Andreas Benkard11298da2023-04-02 18:27:17 +0200369 defaultMode: 0444
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100370 - name: data
371 persistentVolumeClaim:
372 claimName: git-data
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100373 - name: etc
374 emptyDir: {}
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100375
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100376 initContainers:
377 - name: init
378 image: docker.io/library/buildpack-deps:scm
Matthias Andreas Benkard11298da2023-04-02 18:27:17 +0200379 securityContext:
380 runAsUser: 100
381 runAsGroup: 101
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100382 command:
383 - bash
384 - -c
385 - |
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100386 echo git:x:106:107:Git:/home/git:/bin/sh >/etc/passwd
387 volumeMounts:
388 - name: etc
389 mountPath: /etc
390
391 containers:
392 - name: main
393 image: docker.io/library/buildpack-deps:scm
394 securityContext:
395 runAsUser: 106
396 runAsGroup: 107
397 command:
398 - bash
399 - -c
400 - |
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100401 for x in \
Matthias Andreas Benkard7f8981a2026-11-04 11:41:17 +0100402 kartipalist
403 do
404 if ! test -e "/git/repositories/kellertomaten/$x.git"; then
405 printf "SKIP %s / %s\n" kellertomaten "$x"
406 continue
407 fi
408
409 cd "/git/repositories/kellertomaten/$x.git"
410
411 for branch in master main
412 do
413 printf "COPY %s / %s / %s\n" kellertomaten "$x" "$branch"
414 git fetch "ssh://git@gitlab.benkard.de:32222/kellertomaten/${x}.git" "$branch:$branch" && \
415 ( git push "ssh://mulk@gerrit.benkard.de:29418/${x}.git" "$branch"; \
416 git push "git@github.com:kellertomaten/${x}.git" "$branch" )
417 done
418 done
419
420 for x in \
Matthias Andreas Benkard06e9d792024-03-06 12:49:24 +0100421 .github \
422 aendggner \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100423 aquifer \
424 benki \
425 cellspp \
426 cl-json-template \
427 cl-mulkutils \
428 cl-protocols \
429 cljssss-g \
Matthias Andreas Benkard06e9d792024-03-06 12:49:24 +0100430 demos \
Matthias Andreas Benkard7f8981a2026-11-04 11:41:17 +0100431 dose \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100432 fibers \
433 hellonet \
Matthias Andreas Benkard06e9d792024-03-06 12:49:24 +0100434 hello-world-ng \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100435 instadump \
Matthias Andreas Benkard11298da2023-04-02 18:27:17 +0200436 jgvariant \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100437 json-template-r6rs \
438 json-template-racket \
439 json-template-typed-racket \
Matthias Andreas Benkard06e9d792024-03-06 12:49:24 +0100440 kubeia \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100441 logikorr \
Matthias Andreas Benkard7f8981a2026-11-04 11:41:17 +0100442 mulkbav \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100443 mulkcms \
Matthias Andreas Benkard11298da2023-04-02 18:27:17 +0200444 mulkcms2 \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100445 mulkjournal \
446 mulklib \
Matthias Andreas Benkard11298da2023-04-02 18:27:17 +0200447 mulkontainers \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100448 mulkrypt-for-racket \
449 mulkyid \
450 objective-cl \
Matthias Andreas Benkard11298da2023-04-02 18:27:17 +0200451 quarkus-googlecloud-jsonlogging \
Matthias Andreas Benkard06e9d792024-03-06 12:49:24 +0100452 renovate-config \
453 rust-samples \
454 rust-tutorial \
455 sb-eval2 \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100456 toilet
457 do
Matthias Andreas Benkard06e9d792024-03-06 12:49:24 +0100458 if ! test -e "/git/repositories/mulk/$x.git"; then
Matthias Andreas Benkard7f8981a2026-11-04 11:41:17 +0100459 printf "SKIP %s / %s\n" mulk "$x"
Matthias Andreas Benkard06e9d792024-03-06 12:49:24 +0100460 continue
461 fi
462
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100463 cd "/git/repositories/mulk/$x.git"
Matthias Andreas Benkarde96ddfb2024-03-06 12:50:00 +0100464
465 for branch in master main
466 do
Matthias Andreas Benkard7f8981a2026-11-04 11:41:17 +0100467 printf "COPY %s / %s / %s\n" mulk "$x" "$branch"
Matthias Andreas Benkarde96ddfb2024-03-06 12:50:00 +0100468 git fetch "https://gitlab.benkard.de/mulk/${x}.git" "$branch:$branch" && \
469 ( git push "ssh://mulk@gerrit.benkard.de:29418/${x}.git" "$branch"; \
470 git push "git@github.com:benkard/${x}.git" "$branch" )
471 done
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100472 done
Matthias Andreas Benkard7f8981a2026-11-04 11:41:17 +0100473
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100474 true
Matthias Andreas Benkard11298da2023-04-02 18:27:17 +0200475 env:
476 - name: HOME
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100477 value: /home/git
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100478 resources:
479 limits:
480 memory: 100Mi
481 requests:
482 cpu: 20m
483 memory: 100Mi
484 volumeMounts:
485 - name: github-secrets
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100486 mountPath: /home/git/.ssh
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100487 readOnly: true
488 - name: data
489 mountPath: /git
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100490 - name: etc
491 subPath: passwd
492 mountPath: /etc/passwd