[READ-ONLY] Mirror of https://github.com/tiborpilz/infrastructure. Personal Infrastructure managed via terraform & k8s
0

Configure Feed

Select the types of activity you want to include in your feed.

feat: add radicle (seed node, httpd API, explorer web UI) (#36)

authored by

Tibor Pilz and committed by
GitHub
(Jul 10, 2026, 8:14 PM +0200) afae3265 6bcc1e21

+306
+1
applications/services/kustomization.yaml
··· 8 8 - woodpecker 9 9 - tangled/argo-app.yaml 10 10 - pds/argo-app.yaml 11 + - radicle/argo-app.yaml 11 12 - tekton/argo-app.yaml 12 13 - headlamp/argo-app.yaml 13 14 - hubble/argo-app.yaml
+21
applications/services/radicle/argo-app.yaml
··· 1 + apiVersion: argoproj.io/v1alpha1 2 + kind: Application 3 + metadata: 4 + name: radicle 5 + namespace: argocd 6 + spec: 7 + project: platform 8 + source: 9 + path: applications/services/radicle 10 + repoURL: https://github.com/tiborpilz/infrastructure 11 + targetRevision: HEAD 12 + destination: 13 + server: https://kubernetes.default.svc 14 + namespace: radicle 15 + syncPolicy: 16 + automated: 17 + prune: true 18 + selfHeal: true 19 + syncOptions: 20 + - ServerSideApply=true 21 + - CreateNamespace=false
+97
applications/services/radicle/deployment.yaml
··· 1 + apiVersion: apps/v1 2 + kind: Deployment 3 + metadata: 4 + name: radicle 5 + namespace: radicle 6 + labels: 7 + app.kubernetes.io/name: radicle 8 + spec: 9 + replicas: 1 10 + strategy: 11 + type: Recreate 12 + selector: 13 + matchLabels: 14 + app.kubernetes.io/name: radicle 15 + template: 16 + metadata: 17 + labels: 18 + app.kubernetes.io/name: radicle 19 + spec: 20 + initContainers: 21 + - name: init-identity 22 + image: alpine:3.20 23 + command: ["/bin/sh", "-c"] 24 + args: 25 + - | 26 + set -eu 27 + mkdir -p "$RAD_HOME/keys" "$RAD_HOME/storage" 28 + if [ ! -f "$RAD_HOME/keys/radicle" ]; then 29 + apk add --no-cache openssh-keygen 30 + ssh-keygen -t ed25519 -N "" -C "radicle-tibor" -f "$RAD_HOME/keys/radicle" 31 + fi 32 + cp /config/config.json "$RAD_HOME/config.json" 33 + cat "$RAD_HOME/keys/radicle.pub" 34 + env: 35 + - name: RAD_HOME 36 + value: /radicle 37 + volumeMounts: 38 + - name: home 39 + mountPath: /radicle 40 + - name: node-config 41 + mountPath: /config 42 + containers: 43 + - name: node 44 + image: fredix/radicle-node:1.6.1 45 + imagePullPolicy: IfNotPresent 46 + env: 47 + - name: RAD_HOME 48 + value: /radicle 49 + - name: RUST_LOG 50 + value: info 51 + ports: 52 + - name: p2p 53 + containerPort: 8776 54 + volumeMounts: 55 + - name: home 56 + mountPath: /radicle 57 + readinessProbe: 58 + tcpSocket: 59 + port: 8776 60 + initialDelaySeconds: 15 61 + periodSeconds: 10 62 + livenessProbe: 63 + tcpSocket: 64 + port: 8776 65 + initialDelaySeconds: 45 66 + periodSeconds: 30 67 + - name: httpd 68 + image: fredix/radicle-httpd:0.23.0 69 + imagePullPolicy: IfNotPresent 70 + env: 71 + - name: RAD_HOME 72 + value: /radicle 73 + - name: RUST_LOG 74 + value: info 75 + ports: 76 + - name: http 77 + containerPort: 8080 78 + readinessProbe: 79 + tcpSocket: 80 + port: 8080 81 + initialDelaySeconds: 15 82 + periodSeconds: 10 83 + livenessProbe: 84 + tcpSocket: 85 + port: 8080 86 + initialDelaySeconds: 45 87 + periodSeconds: 30 88 + volumeMounts: 89 + - name: home 90 + mountPath: /radicle 91 + volumes: 92 + - name: home 93 + persistentVolumeClaim: 94 + claimName: radicle-home 95 + - name: node-config 96 + configMap: 97 + name: radicle-node-config
+28
applications/services/radicle/explorer-config.yaml
··· 1 + apiVersion: v1 2 + kind: ConfigMap 3 + metadata: 4 + name: radicle-explorer-config 5 + namespace: radicle 6 + data: 7 + config.json: | 8 + { 9 + "nodes": { 10 + "fallbackPublicExplorer": "https://app.radicle.xyz/nodes/$host/$rid$path", 11 + "requiredApiVersion": ">=0.18.0", 12 + "defaultHttpdPort": 443, 13 + "defaultLocalHttpdPort": 8080, 14 + "defaultHttpdScheme": "https" 15 + }, 16 + "source": { 17 + "commitsPerPage": 30 18 + }, 19 + "supportWebsite": "https://radicle.zulipchat.com", 20 + "deploymentId": null, 21 + "preferredSeeds": [ 22 + { 23 + "hostname": "radicle.tibor.sh", 24 + "port": 443, 25 + "scheme": "https" 26 + } 27 + ] 28 + }
+56
applications/services/radicle/explorer.yaml
··· 1 + apiVersion: apps/v1 2 + kind: Deployment 3 + metadata: 4 + name: radicle-explorer 5 + namespace: radicle 6 + labels: 7 + app.kubernetes.io/name: radicle-explorer 8 + spec: 9 + replicas: 1 10 + selector: 11 + matchLabels: 12 + app.kubernetes.io/name: radicle-explorer 13 + template: 14 + metadata: 15 + labels: 16 + app.kubernetes.io/name: radicle-explorer 17 + spec: 18 + containers: 19 + - name: explorer 20 + image: khuedoan/radicle-explorer:latest 21 + imagePullPolicy: IfNotPresent 22 + ports: 23 + - name: http 24 + containerPort: 80 25 + volumeMounts: 26 + - name: config 27 + mountPath: /usr/share/caddy/config.json 28 + subPath: config.json 29 + readinessProbe: 30 + tcpSocket: 31 + port: 80 32 + initialDelaySeconds: 5 33 + periodSeconds: 10 34 + livenessProbe: 35 + tcpSocket: 36 + port: 80 37 + initialDelaySeconds: 20 38 + periodSeconds: 30 39 + volumes: 40 + - name: config 41 + configMap: 42 + name: radicle-explorer-config 43 + --- 44 + apiVersion: v1 45 + kind: Service 46 + metadata: 47 + name: radicle-explorer 48 + namespace: radicle 49 + spec: 50 + type: ClusterIP 51 + selector: 52 + app.kubernetes.io/name: radicle-explorer 53 + ports: 54 + - name: http 55 + port: 80 56 + targetPort: 80
+27
applications/services/radicle/httproute.yaml
··· 1 + apiVersion: gateway.networking.k8s.io/v1 2 + kind: HTTPRoute 3 + metadata: 4 + name: radicle 5 + namespace: radicle 6 + spec: 7 + parentRefs: 8 + - name: public 9 + namespace: gateway-system 10 + sectionName: https 11 + hostnames: 12 + - radicle.tibor.sh 13 + rules: 14 + - matches: 15 + - path: 16 + type: PathPrefix 17 + value: /api 18 + backendRefs: 19 + - name: radicle-httpd 20 + port: 8080 21 + - matches: 22 + - path: 23 + type: PathPrefix 24 + value: / 25 + backendRefs: 26 + - name: radicle-explorer 27 + port: 80
+12
applications/services/radicle/kustomization.yaml
··· 1 + apiVersion: kustomize.config.k8s.io/v1beta1 2 + kind: Kustomization 3 + 4 + resources: 5 + - namespace.yaml 6 + - pvc.yaml 7 + - node-config.yaml 8 + - deployment.yaml 9 + - service.yaml 10 + - explorer-config.yaml 11 + - explorer.yaml 12 + - httproute.yaml
+8
applications/services/radicle/namespace.yaml
··· 1 + apiVersion: v1 2 + kind: Namespace 3 + metadata: 4 + name: radicle 5 + labels: 6 + managed-by: argocd 7 + annotations: 8 + argocd.argoproj.io/sync-wave: "-1"
+15
applications/services/radicle/node-config.yaml
··· 1 + apiVersion: v1 2 + kind: ConfigMap 3 + metadata: 4 + name: radicle-node-config 5 + namespace: radicle 6 + data: 7 + config.json: | 8 + { 9 + "node": { 10 + "alias": "radicle-tibor", 11 + "seedingPolicy": { 12 + "default": "block" 13 + } 14 + } 15 + }
+14
applications/services/radicle/pvc.yaml
··· 1 + apiVersion: v1 2 + kind: PersistentVolumeClaim 3 + metadata: 4 + name: radicle-home 5 + namespace: radicle 6 + annotations: 7 + argocd.argoproj.io/sync-options: Prune=false 8 + spec: 9 + accessModes: 10 + - ReadWriteOnce 11 + storageClassName: ceph-filesystem 12 + resources: 13 + requests: 14 + storage: 20Gi
+27
applications/services/radicle/service.yaml
··· 1 + apiVersion: v1 2 + kind: Service 3 + metadata: 4 + name: radicle-httpd 5 + namespace: radicle 6 + spec: 7 + type: ClusterIP 8 + selector: 9 + app.kubernetes.io/name: radicle 10 + ports: 11 + - name: http 12 + port: 8080 13 + targetPort: 8080 14 + --- 15 + apiVersion: v1 16 + kind: Service 17 + metadata: 18 + name: radicle-node 19 + namespace: radicle 20 + spec: 21 + type: ClusterIP 22 + selector: 23 + app.kubernetes.io/name: radicle 24 + ports: 25 + - name: p2p 26 + port: 8776 27 + targetPort: 8776