blob: 884ba9ba6d0579af61236f70dd413e75ebe5b25b [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 Benkard65b41322026-11-04 11:41:16 +010024 image: docker.io/woahbase/alpine-cgit:x86_64_1.2.1_20210405
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +020025 imagePullPolicy: Always
26 env: []
Matthias Andreas Benkardfaf5a092024-03-06 12:51:07 +010027 command:
28 - /bin/sh
29 - -c
30 - apk update && apk add groff python3 py3-docutils py3-markdown py3-pygments && /init
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +020031 resources:
32 limits:
33 cpu: 2000m
34 memory: 100Mi
35 requests:
36 cpu: 10m
37 memory: 50Mi
38 ports:
39 - containerPort: 80
40 name: cgit-http
41 protocol: TCP
42 volumeMounts:
43 - name: data
44 mountPath: /home/git
45 - name: config
46 mountPath: /etc/cgitrc
47 subPath: cgitrc
48 readOnly: true
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +010049 - name: gitolite
50 image: docker.io/elsdoerfer/gitolite:latest
51 imagePullPolicy: Always
52 env: []
53 #tty: true
54 #stdin: true
55 #command:
56 # - /bin/cat
57 resources:
58 limits:
59 cpu: 2000m
60 memory: 100Mi
61 requests:
62 cpu: 10m
63 memory: 50Mi
64 ports:
65 - containerPort: 2222
66 name: gitolite-ssh
67 protocol: TCP
68 volumeMounts:
69 - name: data
70 mountPath: /home/git/repositories
71 subPath: repositories
72 #- name: data
73 # mountPath: /home/git/projects.list
74 # subPath: projects.list
75 - name: data
76 mountPath: /home/git/.gitolite
77 subPath: .gitolite
78 - name: data
79 mountPath: /home/git/.gitolite.rc
80 subPath: .gitolite.rc
81 - name: data
82 mountPath: /home/git/.ssh
83 subPath: .ssh
84 - name: ssh
85 mountPath: /etc/ssh
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +020086 volumes:
87 - name: data
88 persistentVolumeClaim:
89 claimName: git-data
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +010090 - name: ssh
91 persistentVolumeClaim:
92 claimName: git-ssh
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +020093 - name: config
94 configMap:
95 name: git-config
96---
97apiVersion: v1
98kind: Service
99metadata:
100 name: git-cgit
101 namespace: mulk
102 labels:
103 k8s-app: git
104 name: git-cgit
105spec:
106 selector:
107 k8s-app: git
108 type: ClusterIP
109 ports:
110 - name: http
111 port: 80
112 targetPort: cgit-http
113 protocol: TCP
114---
115apiVersion: v1
116kind: Service
117metadata:
118 name: git-gitolite
119 namespace: mulk
120 labels:
121 k8s-app: git
122 name: git-gitolite
123spec:
124 selector:
125 k8s-app: git
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100126 type: NodePort
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +0200127 ports:
128 - name: ssh
129 port: 22
130 targetPort: gitolite-ssh
131 protocol: TCP
132---
133apiVersion: v1
134kind: PersistentVolumeClaim
135metadata:
136 name: git-data
137 namespace: mulk
138 labels:
139 name: git-data
140 k8s-app: git
141spec:
142 accessModes:
143 - ReadWriteOnce
144 resources:
145 requests:
146 storage: 200Gi
147 storageClassName: local-path
148---
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100149apiVersion: v1
150kind: PersistentVolumeClaim
151metadata:
152 name: git-ssh
153 namespace: mulk
154 labels:
155 name: git-ssh
156 k8s-app: git
157spec:
158 accessModes:
159 - ReadWriteOnce
160 resources:
161 requests:
162 storage: 50Mi
163 storageClassName: local-path
164---
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +0200165apiVersion: networking.k8s.io/v1
166kind: Ingress
167metadata:
168 name: git-cgit-cgi
169 namespace: mulk
170 annotations:
171 cert-manager.io/cluster-issuer: letsencrypt-prod
172 kubernetes.io/ingress.class: nginx
173 nginx.ingress.kubernetes.io/rewrite-target: /cgit/cgit.cgi/$1$2
Matthias Andreas Benkard191bbf12026-11-04 19:59:58 +0100174 # Cap cgit at 5 r/s in total (zone defined in ingress-nginx/config.yaml).
175 # A limit_req at location level replaces the inherited server-level one,
176 # so the bot limit is repeated here.
177 nginx.ingress.kubernetes.io/configuration-snippet: |
178 limit_req zone=bots burst=20 nodelay;
179 limit_req zone=perhost burst=20 nodelay;
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +0200180spec:
181 rules:
182 - host: git.benkard.de
183 http:
184 paths:
185 - backend:
186 service:
187 name: git-cgit
188 port:
189 number: 80
190 path: /(.*)[.]git(/.*)?$
191 pathType: ImplementationSpecific
192 - backend:
193 service:
194 name: git-cgit
195 port:
196 number: 80
197 path: /(.*)(.*)?$
198 pathType: ImplementationSpecific
199 tls:
200 - hosts:
201 - git.benkard.de
202 secretName: git-cgit-cgi-tls
203---
Matthias Andreas Benkardb4f91a12026-11-04 21:36:23 +0100204# Traefik route for cgit. Traefik's ingress-nginx provider rejects the
205# Ingress above because of its snippet, and it has no global per-host rate
206# limit, so cgit gets a native IngressRoute instead.
207#
208# A crawler botnet with thousands of rotating IPs and browser user agents
209# hammers cgit; cap it at 5 r/s in total (not per client). A single router
210# keeps the limit in one bucket (each router gets its own limiter).
211apiVersion: traefik.io/v1alpha1
212kind: Middleware
213metadata:
214 name: git-cgit-ratelimit
215 namespace: mulk
216spec:
217 rateLimit:
218 average: 5
219 period: 1s
220 burst: 20
221 sourceCriterion:
222 requestHost: true
223---
224# Same as the rewrite-target of the Ingress above: strip a ".git" suffix
225# from the repository name and route everything to cgit.cgi.
226apiVersion: traefik.io/v1alpha1
227kind: Middleware
228metadata:
229 name: git-cgit-rewrite
230 namespace: mulk
231spec:
232 replacePathRegex:
233 regex: "^/(?:(.*)[.]git(/.*)?|(.*))$"
234 replacement: "/cgit/cgit.cgi/${1}${2}${3}"
235---
236apiVersion: traefik.io/v1alpha1
237kind: Middleware
238metadata:
239 name: git-cgit-https-redirect
240 namespace: mulk
241spec:
242 redirectScheme:
243 scheme: https
244 permanent: true
245---
246apiVersion: traefik.io/v1alpha1
247kind: IngressRoute
248metadata:
249 name: git-cgit-cgi
250 namespace: mulk
251spec:
252 entryPoints:
253 - websecure
254 routes:
255 - kind: Rule
256 match: Host(`git.benkard.de`)
257 middlewares:
258 - name: git-cgit-ratelimit
259 - name: git-cgit-rewrite
260 services:
261 - name: git-cgit
262 port: 80
263 tls:
264 secretName: git-cgit-cgi-tls
265---
266apiVersion: traefik.io/v1alpha1
267kind: IngressRoute
268metadata:
269 name: git-cgit-cgi-http
270 namespace: mulk
271spec:
272 entryPoints:
273 - web
274 routes:
275 - kind: Rule
276 match: Host(`git.benkard.de`)
277 middlewares:
278 - name: git-cgit-https-redirect
279 services:
280 - name: git-cgit
281 port: 80
282---
Matthias Andreas Benkardc7560352021-09-05 12:25:13 +0200283apiVersion: networking.k8s.io/v1
284kind: Ingress
285metadata:
286 name: git-cgit-assets
287 namespace: mulk
288 annotations:
289 cert-manager.io/cluster-issuer: letsencrypt-prod
290 kubernetes.io/ingress.class: nginx
291 nginx.ingress.kubernetes.io/rewrite-target: /cgit/$1
292spec:
293 rules:
294 - host: static.git.benkard.de
295 http:
296 paths:
297 - backend:
298 service:
299 name: git-cgit
300 port:
301 number: 80
302 path: /(.*)
303 pathType: ImplementationSpecific
304 tls:
305 - hosts:
306 - static.git.benkard.de
307 secretName: git-cgit-assets-tls
308---
309apiVersion: v1
310kind: ConfigMap
311metadata:
312 name: git-config
313 namespace: mulk
314data:
315 cgitrc: |-
316 css=https://static.git.benkard.de/cgit.css
317 logo=https://static.git.benkard.de/cgit.png
318
319 remove-suffix=1
320 enable-commit-graph=1
321 enable-index-links=1
322 enable-log-filecount=1
323 enable-log-linecount=1
324 enable-git-config=1
325 case-sensitive-sort=0
326
327 virtual-root=https://git.benkard.de/
328
329 #cache-size=10000
330 #cache-root=/var/cache/cgit
331
332 # needs Pygments
333 #source-filter=/usr/lib/cgit/filters/syntax-highlighting.py
334
335 about-filter=/usr/lib/cgit/filters/about-formatting.sh
336
337 clone-url=https://git.benkard.de/$CGIT_REPO_URL
338
339 readme=:README.md
340 readme=:README.markdown
341 readme=:README.html
342 readme=:README.txt
343 readme=:README
344
345 project-list=/home/git/projects.list
346 scan-path=/home/git/repositories/
347
348 #
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100349
350---
351
352apiVersion: batch/v1
353kind: CronJob
354
355metadata:
356 name: git-github-replication
357 namespace: mulk
358 labels: &labels
359 k8s-app: git
360
361spec:
362 schedule: "*/120 * * * *"
Matthias Andreas Benkardcbdcd902022-12-27 15:31:15 +0100363 concurrencyPolicy: Forbid
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100364
365 jobTemplate:
366
367 spec:
368 ttlSecondsAfterFinished: 3600
369
370 template:
371 metadata:
372 name: git-github-replication
373 labels: *labels
374
375 spec:
376 restartPolicy: OnFailure
377
378 volumes:
379 - name: github-secrets
380 secret:
381 secretName: github-secrets
Matthias Andreas Benkard11298da2023-04-02 18:27:17 +0200382 defaultMode: 0444
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100383 - name: data
384 persistentVolumeClaim:
385 claimName: git-data
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100386 - name: etc
387 emptyDir: {}
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100388
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100389 initContainers:
390 - name: init
391 image: docker.io/library/buildpack-deps:scm
Matthias Andreas Benkard11298da2023-04-02 18:27:17 +0200392 securityContext:
393 runAsUser: 100
394 runAsGroup: 101
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100395 command:
396 - bash
397 - -c
398 - |
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100399 echo git:x:106:107:Git:/home/git:/bin/sh >/etc/passwd
400 volumeMounts:
401 - name: etc
402 mountPath: /etc
403
404 containers:
405 - name: main
406 image: docker.io/library/buildpack-deps:scm
407 securityContext:
408 runAsUser: 106
409 runAsGroup: 107
410 command:
411 - bash
412 - -c
413 - |
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100414 for x in \
Matthias Andreas Benkard7f8981a2026-11-04 11:41:17 +0100415 kartipalist
416 do
417 if ! test -e "/git/repositories/kellertomaten/$x.git"; then
418 printf "SKIP %s / %s\n" kellertomaten "$x"
419 continue
420 fi
421
422 cd "/git/repositories/kellertomaten/$x.git"
423
424 for branch in master main
425 do
426 printf "COPY %s / %s / %s\n" kellertomaten "$x" "$branch"
427 git fetch "ssh://git@gitlab.benkard.de:32222/kellertomaten/${x}.git" "$branch:$branch" && \
428 ( git push "ssh://mulk@gerrit.benkard.de:29418/${x}.git" "$branch"; \
429 git push "git@github.com:kellertomaten/${x}.git" "$branch" )
430 done
431 done
432
433 for x in \
Matthias Andreas Benkard06e9d792024-03-06 12:49:24 +0100434 .github \
435 aendggner \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100436 aquifer \
437 benki \
438 cellspp \
439 cl-json-template \
440 cl-mulkutils \
441 cl-protocols \
442 cljssss-g \
Matthias Andreas Benkard06e9d792024-03-06 12:49:24 +0100443 demos \
Matthias Andreas Benkard7f8981a2026-11-04 11:41:17 +0100444 dose \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100445 fibers \
446 hellonet \
Matthias Andreas Benkard06e9d792024-03-06 12:49:24 +0100447 hello-world-ng \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100448 instadump \
Matthias Andreas Benkard11298da2023-04-02 18:27:17 +0200449 jgvariant \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100450 json-template-r6rs \
451 json-template-racket \
452 json-template-typed-racket \
Matthias Andreas Benkard06e9d792024-03-06 12:49:24 +0100453 kubeia \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100454 logikorr \
Matthias Andreas Benkard7f8981a2026-11-04 11:41:17 +0100455 mulkbav \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100456 mulkcms \
Matthias Andreas Benkard11298da2023-04-02 18:27:17 +0200457 mulkcms2 \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100458 mulkjournal \
459 mulklib \
Matthias Andreas Benkard11298da2023-04-02 18:27:17 +0200460 mulkontainers \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100461 mulkrypt-for-racket \
462 mulkyid \
463 objective-cl \
Matthias Andreas Benkard11298da2023-04-02 18:27:17 +0200464 quarkus-googlecloud-jsonlogging \
Matthias Andreas Benkard06e9d792024-03-06 12:49:24 +0100465 renovate-config \
466 rust-samples \
467 rust-tutorial \
468 sb-eval2 \
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100469 toilet
470 do
Matthias Andreas Benkard06e9d792024-03-06 12:49:24 +0100471 if ! test -e "/git/repositories/mulk/$x.git"; then
Matthias Andreas Benkard7f8981a2026-11-04 11:41:17 +0100472 printf "SKIP %s / %s\n" mulk "$x"
Matthias Andreas Benkard06e9d792024-03-06 12:49:24 +0100473 continue
474 fi
475
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100476 cd "/git/repositories/mulk/$x.git"
Matthias Andreas Benkarde96ddfb2024-03-06 12:50:00 +0100477
478 for branch in master main
479 do
Matthias Andreas Benkard7f8981a2026-11-04 11:41:17 +0100480 printf "COPY %s / %s / %s\n" mulk "$x" "$branch"
Matthias Andreas Benkarde96ddfb2024-03-06 12:50:00 +0100481 git fetch "https://gitlab.benkard.de/mulk/${x}.git" "$branch:$branch" && \
482 ( git push "ssh://mulk@gerrit.benkard.de:29418/${x}.git" "$branch"; \
483 git push "git@github.com:benkard/${x}.git" "$branch" )
484 done
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100485 done
Matthias Andreas Benkard7f8981a2026-11-04 11:41:17 +0100486
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100487 true
Matthias Andreas Benkard11298da2023-04-02 18:27:17 +0200488 env:
489 - name: HOME
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100490 value: /home/git
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100491 resources:
492 limits:
493 memory: 100Mi
494 requests:
495 cpu: 20m
496 memory: 100Mi
497 volumeMounts:
498 - name: github-secrets
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100499 mountPath: /home/git/.ssh
Matthias Andreas Benkard7d78f7f2021-12-28 17:44:20 +0100500 readOnly: true
501 - name: data
502 mountPath: /git
Matthias Andreas Benkard8c9b6132024-03-06 12:51:33 +0100503 - name: etc
504 subPath: passwd
505 mountPath: /etc/passwd