Compare commits

..
Author SHA1 Message Date
djpbessems fa2504d6a8 Rebase Jellyseerr/Seerr #2
renovate / renovate (push) Successful in 1m3s
2026-09-23 17:13:36 +10:00
djpbessems b0cb2bd03c Merge branch 'master' of https://code.spamasaurus.com/djpbessems/Kubernetes.K3s.installLog
renovate / renovate (push) Successful in 1m6s
2026-09-23 17:11:02 +10:00
djpbessems 00d6808f34 Rebase Jellyseerr/Seerr 2026-09-23 17:10:45 +10:00
djpbessems 611c0e61cb Update README.md
renovate / renovate (push) Successful in 1m3s
2026-09-23 03:04:44 +00:00
djpbessems 400846fba6 Kutt++
renovate / renovate (push) Successful in 1m3s
2026-09-22 12:26:17 +10:00
16 changed files with 353 additions and 34 deletions
+176
View File
@@ -1,5 +1,7 @@
# GitOps repository # GitOps repository
## Hypervisor
### 1) Harvester Hyperconverged Infrastructure ### 1) Harvester Hyperconverged Infrastructure
[...] [...]
@@ -7,6 +9,180 @@ Configure Harvester HCI nodes through cloud-init (requires node reboot):
```shell ```shell
kubectl apply -f system/Harvester/cloudinit-disable-nic-offloading.yaml kubectl apply -f system/Harvester/cloudinit-disable-nic-offloading.yaml
``` ```
## Downstream cluster(s)
Cluster configuration for RKE2 cluster using kube-vip with Traefik ingress controller:
```yaml
apiVersion: provisioning.cattle.io/v1
kind: Cluster
spec:
[...]
rkeConfig:
chartValues:
harvester-cloud-provider:
[...]
kube-vip:
env:
svc_election: 'true'
[...]
rke2-traefik:
service:
[...]
spec:
externalTrafficPolicy: Local
```
Traefik advanced configuration:
```yaml
additionalArguments:
- --providers.file.directory=/etc/traefik/dynamic
- --providers.file.watch=true
- --entryPoints.websecure.transport.respondingTimeouts.readTimeout=300s
certificatesResolvers:
default:
acme:
dnsChallenge:
propagation:
delayBeforeChecks: 5m0s
provider: cloudflare
resolvers:
- 1.1.1.1:53
- 1.0.0.1:53
email: <omitted>
storage: /data/acme.json
deployment:
initContainers:
- command:
- sh
- -c
- touch /data/acme.json; chown 65532 /data/acme.json; chmod -v 600 /data/acme.json
image: busybox:latest
name: volume-permissions
securityContext:
runAsGroup: 0
runAsNonRoot: false
runAsUser: 0
volumeMounts:
- mountPath: /data
name: traefik-data
kind: Deployment
env:
- name: CF_API_EMAIL
valueFrom:
secretKeyRef:
key: CF_API_EMAIL
name: traefik-cloudflare
- name: CF_API_KEY
valueFrom:
secretKeyRef:
key: CF_API_KEY
name: traefik-cloudflare
extraObjects:
- apiVersion: v1
data:
config.yml: |
http:
middlewares:
2fa-authentication:
forwardAuth:
address: "https://auth.spamasaurus.com/api/verify?rd=https://auth.spamasaurus.com/"
trustForwardHeader: true
security-headers:
headers:
forceSTSHeader: true
stsSeconds: 315360000
stsIncludeSubdomains: true
stsPreload: true
tls:
options:
defaults:
minVersion: VersionTLS12
sniStrict: false
curvePreferences:
- secp521r1
- secp384r1
- secp256r1
cipherSuites:
- TLS_AES_128_GCM_SHA256
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
- TLS_FALLBACK_SCSV
kind: ConfigMap
metadata:
name: traefik-file-provider
namespace: kube-system
ingressRoute:
dashboard:
enabled: true
entryPoints:
- websecure
matchRule: Host(`ingress.lab.spamasaurus.com`)
middlewares:
- name: 2fa-authentication@file
- name: security-headers@file
logs:
general:
level: INFO
persistence:
enabled: true
name: traefik-data
ports:
web:
http:
redirections:
entryPoint:
permanent: true
scheme: https
to: websecure
websecure:
forwardedHeaders:
insecure: true
http:
tls:
certResolver: default
domains:
- main: '*.pvr.spamasaurus.com'
- main: '*.lab.spamasaurus.com'
- main: '*.spamasaurus.com'
sans:
- spamasaurus.com
- main: '*.bessems.com'
sans:
- bessems.com
- main: '*.bessems.eu'
sans:
- bessems.eu
- main: '*.gabaldon.eu'
sans:
- gabaldon.eu
- main: '*.gabaldon.nl'
sans:
- gabaldon.nl
- main: '*.itch.fyi'
sans:
- itch.fyi
options: defaults@file
providers:
kubernetesCRD:
ingressClass: ""
service:
annotations:
cloudprovider.harvesterhci.io/ip-pool: <ippoolname>
cloudprovider.harvesterhci.io/ipam: pool
spec:
externalTrafficPolicy: Local
type: LoadBalancer
volumes:
- mountPath: /etc/traefik/dynamic
name: traefik-file-provider
type: configMap
```
### 2) Persistent storage ### 2) Persistent storage
+4
View File
@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: kutt
+18
View File
@@ -0,0 +1,18 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: kutt
namespace: argo-cd
spec:
destination:
namespace: kutt
server: https://kubernetes.default.svc
project: default
syncPolicy:
automated: {}
syncOptions:
- CreateNamespace=true
sources:
- repoURL: https://code.spamasaurus.com/djpbessems/Kubernetes.K3s.installLog
path: services/Kutt
targetRevision: HEAD
+37
View File
@@ -0,0 +1,37 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: kutt
namespace: kutt
labels:
app: kutt
spec:
replicas: 1
selector:
matchLabels:
app: kutt
template:
metadata:
labels:
app: kutt
spec:
containers:
- name: kutt
image: kutt/kutt:v3.2.6
ports:
- containerPort: 3000
name: http
env:
- name: JWT_SECRET
value: Gfn2rJaiAPqRQyauxdIVKj6kWcyt2MSj
- name: DEFAULT_DOMAIN
value: renewal.bessems.com
- name: DB_FILENAME
value: /var/lib/kutt/data.sqlite
volumeMounts:
- mountPath: /var/lib/kutt
name: csismb-kutt-db
volumes:
- name: csismb-kutt-db
persistentVolumeClaim:
claimName: csismb-kutt-db
+16
View File
@@ -0,0 +1,16 @@
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: kutt
namespace: kutt
spec:
entryPoints:
- websecure
routes:
- match: Host(`renewal.bessems.com`) || Host(`p.itch.fyi`)
kind: Rule
services:
- name: kutt
port: 3000
middlewares:
- name: security-headers@file
@@ -0,0 +1,31 @@
apiVersion: v1
kind: PersistentVolume
metadata:
annotations:
pv.kubernetes.io/provisioned-by: smb.csi.k8s.io
name: csismb-kutt-db
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: csismb-kutt-db
mountOptions:
- dir_mode=0777
- file_mode=0777
- nobrl
- cache=strict
- mfsymlinks
- noserverino # required to prevent data corruption
csi:
driver: smb.csi.k8s.io
# volumeHandle format: {smb-server-address}#{sub-dir-name}#{share-name}
# make sure this value is unique for every share in the cluster
volumeHandle: 192.168.154.195#kutt#db
volumeAttributes:
source: //192.168.154.195/K3s.Volumes
subDir: kutt/db
nodeStageSecretRef:
name: smb-credentials
namespace: kutt
@@ -0,0 +1,12 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csismb-kutt-db
namespace: kutt
spec:
accessModes:
- ReadWriteMany
storageClassName: csismb-kutt-db
resources:
requests:
storage: 1Gi
@@ -0,0 +1,14 @@
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: smb-credentials
namespace: kutt
spec:
encryptedData:
password: AgCRyItWRmD4KN9z0PupawuTVVhwvUovcgOC7HThLDiP56uI7WLo45ZmZYDdMZ0PeLv9KH5eWhimSch8+M9gH3dZXwarbXJ5VrSmNUF5fodP3LrL3Tgoq3rijppfLRpYL00mHclldCkCjsBfJpO5YKzPHo5ovmWx/i7p7BzegeokKyOe8l/2Rsn6qeU2UDFarqaUAjYvOWAGmjxwlZwtE3VGy52qujsSEKOcH0whk+GTcqWb8/tdIrT8yiW6OWQaUjI9LS3uBt3ZPKc65AQld4Jk0bS+Kxb3JDletbbo1qBuDTw1IGGziGDHZ1cCYamaywYmgqFs/NvGZ94tiXV66vZaPDRJH7w+2aaGTHAZPU1pCS08Nmd6kgECXm31TbyO4asFZ2bY+wR3Hpo369rjmh0btH829FzKC8xLoqkb9r9HnYX7AGb5hBkKGzboKBsx/RuzNBwdGJKFTGaYX7pVgqFDdtdyjlbppkBNN1WfGwS/Zuyam1ZryjMfgRdg97ihVCQBOoLXgqIKxgqettc1bOzFIGp1qsDyzG530EhCP3c6NE3AQabXTJ6LNTwM9DZROwCcHhekdnlarHif7sjng/jdVlmgxX0VY6L+4hUhDeX8IJ2QBqIwk9voO7QFz4c2CMLupho+EIz9TxF+CHrdsnRa5xKP2gjaggRLtYrD/3O7A3I1uefN7P6sn2Im2KWgXiV4PXQvW50iZmcooQMYTbT1
username: AgAF7+KE/BWxojaQNtIkAGiz4++Eb/Dlu6631vzrYX8T9oFwcnL3X0dUJ3ImmRX11Kn0Xba7U99kinv16RrcYkdBqWSrjSY0V4RvvHZ9Y4B5F5rSHXUavdr9CqHQRa7wvTVBRw2eH44kypnxH+WMR5derLINCKojXPbwWndY+iGQ+I/RhIsCOoY9E0L2YCGLWYJmQFnWLTv1q08w1UJwdo/uOmtrtrneNzkHhtHcg/DNsAZ6oNYpWqspLR0hfwiO2FxHOq0J3Hmf1DIsH/m9BIaIcRX3k0ZlIlIQaxnkHPUT++vSCy1Nrsa0le9K5lsoS53A7F68gRqv/Yj0qawYhcI4CfHndW5IpE7COld4Ko4J6PqBilOtPN1Lzv67grUbi9yOaYCjknZOoUdXJGAaWY8+7n4ajEM5DqOltbarQtZNjYW7U12DNwqDZeJl4gWzKUqHSLyPxLwwXP/MQJCupU4aLBL6U3pheUNfYWe8EHzFRmDB40Gin1YxRshuC+PHndzFuXSi8jvlvwPWpSDDC9/J23NWJENi68iDL6xKnGpgHXwucUZ+WyJj9ItrLSA3AQfbhZCXYQ0fA3TlRRcbtC09L8XVo4O6CO+p7Efu5XWWey24BGx+HphtuDUZDcdiRBTtAKmJZm3v9nyuthrH4xQZoEPh7zZfBsY6b0bubhj7xdoy7tA4l01NJ/eQ9PZyz4Zi2fyVmu8=
template:
metadata:
name: smb-credentials
namespace: kutt
type: Opaque
+13
View File
@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: kutt
namespace: kutt
spec:
type: ClusterIP
selector:
app: kutt
ports:
- port: 3000
targetPort: 3000
name: http
@@ -1,16 +0,0 @@
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
creationTimestamp: null
name: smb-credentials
namespace: jellyseerr
spec:
encryptedData:
password: AgAXVD3WsMzueRvwCYyh5mrkZsWr6vtR2WegrW3lMa3etjOAAy7ARhrx25pmfX3vzo0PaEbZBLyusMQ04hU0n96TG4+Q5k3H61t9KO6JIjJl3/4myMWfok6H+UuR6qpJl+H3H+A6lYm3M/rwpzvWrq7r3TiepYARHm+MLhI2zSwXn322Pht7Gu8yrshx0mq7ADf/rko9iBBixSGUOuol3eMG+5JNfVCdgb4EQWl5qUwZmXQjWN1Kp3lqRAKXpS5bxqwAmKFP0WRAlMsI63ZBdJeFg+hYcV3PTssDbL6I4hDa+8cVqOMN/JDYnZnNkPxIFy1X7hlOONfNVAda0PYgQO+C2fGuLBFyK2YVcL2uAn84FlEMshdaDpJ0AYlDndattbXSjUVXN04E3/wTsDo5bKzivamyphjeeLlrK0O82yJJvhBPvrQvy0LMtpoIIk39rlctckJKInZbFrl7wCVPUj3d1oCTV4z+quBNIFNCUZmK0aWvjmctW5h6zCFhSnyoWSsc8u+u2Zu/H3vCE3aPSfqg+DLKjv9Dz+itPFMU57kS6SfgcREVeNiqH97Y5wA/wOFcDutb7HHS7dw/l4QCwkBqJiVHDWe45tEsi1ZYmdBlNjKTjCtYzEpxcaO1d6HfRhA2JryrUpqH+WNM1kNA00yTIvfDDC+yKAaEN6y64sUEDhI33ygipo2LLuvB9Moy7DVyBCjYHVtnU0yQiEBoonFn
username: AgAGdnx+CIi0PFgSUx+X2LFChH9IlcMAXjlkB0rqM3XM0ht4ghl9HKk4nLa0R2cho6ISSNfpKeBQItMOTxmb5wWbkav0uTLone0nF4Eq0eKysQ4L0yApvKfipl0ZiVb4Z9hsve7MyVcNuE/H5NqLMkgqNPkLaK4yixlxb3KTwDi7/K8NvZjf0a073c1rpfgvbiV7Aodbda+2dmnAcI7k398RuEqTeY7xeBIgg4nR5grsDV448RIeouRX1t4NFvVwdF/6xaVTc085iTxoH9HWf5bpVbP8IxHUtbS+zjMxPz3rwZy1/0nXw8HOs+QFgtFIxNxgsQ1wIH5V46aufPzSc4JUCi0IpV3FsPlHMtv+6aFk4RNv/Z06aa+kT/WY2GHUU+3GdGoFVe2cV2Ty463K4SPluZ/R4UtVtRsCMp1SPkgMOZeUs0g9tK9CBu8l6+comSSny+ub2rAzGpRW0x/i5rEqXBsQqY28Gm36Cv175kB2UOXUTNAY868yaOzgo1LEgMyhFgKzYchju3nWFxyhY+AoG06XRSKzU1ClqlkCwnQBu77Yxu+FjZqXbv6ywUa9TvSVcs8RLGXX/+svM/xXztuots26VMrHLUfcnE23NIHSVkDy5JfDbzn6i2nUnOOJzrm+DUTeRQziu7LIlCFLVjVjygegupMMSC2+F8FbOyKuu5GDBXkZqycfM+n0CA+6Sh+Rrh2LqT4=
template:
metadata:
creationTimestamp: null
name: smb-credentials
namespace: jellyseerr
type: Opaque
@@ -1,12 +1,12 @@
apiVersion: argoproj.io/v1alpha1 apiVersion: argoproj.io/v1alpha1
kind: Application kind: Application
metadata: metadata:
name: jellyseerr name: seerr
namespace: argo-cd namespace: argo-cd
spec: spec:
destination: destination:
server: https://kubernetes.default.svc server: https://kubernetes.default.svc
namespace: jellyseerr namespace: seerr
project: default project: default
syncPolicy: syncPolicy:
automated: {} automated: {}
@@ -14,14 +14,14 @@ spec:
- CreateNamespace=true - CreateNamespace=true
sources: sources:
- repoURL: https://code.spamasaurus.com/djpbessems/Kubernetes.K3s.installLog - repoURL: https://code.spamasaurus.com/djpbessems/Kubernetes.K3s.installLog
path: services/PVR/Jellyseerr/manifests path: services/PVR/Seerr/manifests
targetRevision: HEAD targetRevision: HEAD
- repoURL: ghcr.io/fallenbagel/jellyseerr - repoURL: oci://ghcr.io/seerr-team/seerr/seerr-chart
chart: jellyseerr-chart chart: seerr
targetRevision: 2.7.0 targetRevision: 3.9.1
helm: helm:
valueFiles: valueFiles:
- $values/services/PVR/Jellyseerr/values.yaml - $values/services/PVR/Seerr/values.yaml
- repoURL: https://code.spamasaurus.com/djpbessems/Kubernetes.K3s.installLog - repoURL: https://code.spamasaurus.com/djpbessems/Kubernetes.K3s.installLog
targetRevision: HEAD targetRevision: HEAD
ref: values ref: values
@@ -3,14 +3,14 @@ kind: PersistentVolume
metadata: metadata:
annotations: annotations:
pv.kubernetes.io/provisioned-by: smb.csi.k8s.io pv.kubernetes.io/provisioned-by: smb.csi.k8s.io
name: csismb-jellyseerr-config name: csismb-seerr-config
spec: spec:
capacity: capacity:
storage: 1Gi storage: 1Gi
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
persistentVolumeReclaimPolicy: Retain persistentVolumeReclaimPolicy: Retain
storageClassName: csismb-jellyseerr-config storageClassName: csismb-seerr-config
mountOptions: mountOptions:
- dir_mode=0777 - dir_mode=0777
- file_mode=0777 - file_mode=0777
@@ -24,10 +24,10 @@ spec:
driver: smb.csi.k8s.io driver: smb.csi.k8s.io
# volumeHandle format: {smb-server-address}#{sub-dir-name}#{share-name} # volumeHandle format: {smb-server-address}#{sub-dir-name}#{share-name}
# make sure this value is unique for every share in the cluster # make sure this value is unique for every share in the cluster
volumeHandle: 192.168.154.195#jellyseerr#config volumeHandle: 192.168.154.195#seerr#config
volumeAttributes: volumeAttributes:
source: //192.168.154.195/K3s.Volumes source: //192.168.154.195/K3s.Volumes
subDir: jellyseerr/config subDir: seerr/config
nodeStageSecretRef: nodeStageSecretRef:
name: smb-credentials name: smb-credentials
namespace: jellyseerr namespace: seerr
@@ -1,12 +1,12 @@
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: csismb-jellyseerr-config name: csismb-seerr-config
namespace: jellyseerr namespace: seerr
spec: spec:
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
storageClassName: csismb-jellyseerr-config storageClassName: csismb-seerr-config
resources: resources:
requests: requests:
storage: 1Gi storage: 1Gi
@@ -0,0 +1,14 @@
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: smb-credentials
namespace: seerr
spec:
encryptedData:
password: AgAHq9+fxdZtWTNEd6yrfUlTwPewBHwIwfElk3MP2TJccxs2kPiuuQ2GtDiDmaVMiACm9iUaf8CPFZbzWfkUdu2PiqGJWh+Pn76ell2r6oRHDfAGfivqjG/VAspdYtClxSzIuShYLdd+klGj4aRkNLPkc+QJLOPdZ/8gIS9BUe1c+c57BhbH4fN5H+g2pIKkEVepWwG5WqaV63UdcsQoPi95CGUPoZQFqdj7QBTsc+0NIurMPs/Lx/8awu2cqJRvUrPkGnBQZgWbeuKVjYKzUeDRHfosv1K28YrVrn7VfKoLxEtTPDCLzxi+38KWNYyIAxjRqkbhPeT//I9ZhaIJ0xVz8GDJTaLW02Dz6pz2jqnjVbE0OlrnfJqSxLzFyMgyeRu8qVV+mI1OqWTqpAFZeZs4YFyTpEY2Zr7uEc4o9YIo7fqplbWiAat1yo+RpLREOa/nRTqNSp0kmQDIv+0GltoZC+k6/zL71ttioTColsNAXunvJXDzmEJErgiBYaF7reGbOz6IxCYShQCBJ1F6M0rpJJ+Qh4uq3eyRB9WDGlZR2nUxZtYs07q5pmtyKZXjFUHIBvdbViyZdrLG34IgM+RlNSbU51TAHIB4Mcx1SMzma/eMJUbfW9JTWVwgl0kPkD0KMvyVM6ZdxWzDkw1VpHsF6OUZQM0iWsXWwd8q//Tu1qVjC+d/fQph/jDaQ+BmFc9NR2HC7APhTxhF4CgCbMZK
username: AgCqVYzkzBi1rUSHf8jzAeNi9863Dn3BvVUTYwE9qUtRojwr4HxqLd2NIc6r4AHl7S217xIih9OM8612FdBz1bPu5E7ZNyKvreI0xailmMhhO8Lbu4P/RBg+quY4hD6JPkwfJyVavE0YsGHKrKPKUf5EwVcIsWZNjdMuqZ4H0jrNG/bdfOzcaryCs5R5ASw0s29C74rWB9hzSs2dwGTUhRx61vWsYOuEq0m0FTUlBZnbN7KgAfCL8p8fQFKGB1vvd75sERRe2GHIIEe6qWqLymaOhl9xBbiUCMj86e+3KqyKu2WZgVk1PBXL4FqwAcWHUQ32fSNJWLd18z8rvF8eb4FfP6uGIGNZy9u3D1MUsj1KRRdegxbsOsv1zezJmYmxxbUmISQ1XP74dPwYjTG4o+sHUlhXSzKYcmwjhKRjcz/K/9T0DUtVdU93nhb8dGk57ssKN3jo2+91Myiah9h28Kv6o2QOkXE7V0wEuLk8UqgggfNTv8oG6ut8JUvziTjTxFSQ3Sv9kejJEyOPZl8Mpnj8vGXI0EucPPn1wQDU5bHfYPZH35M8zr4mE5UlzXc5eRq9S1WgXWN2YAOv95CJPoInYlu8brvY259dSgB0kt/mnTpwNAscEHr8Z/qfSzXCILi0ZO80ps+pFoXM6e94FlQ49GgdIpuA0mH7U/6z8f8814RUJ8HEKjVOMutOVREyKxScu4wfHRE=
template:
metadata:
name: smb-credentials
namespace: seerr
type: Opaque
@@ -9,7 +9,7 @@ ingress:
config: config:
persistence: persistence:
name: csismb-jellyseerr-config name: csismb-seerr-config
storageClass: csismb-jellyseerr-config storageClass: csismb-seerr-config
accessModes: ["ReadWriteMany"] accessModes: ["ReadWriteMany"]
size: 1Gi size: 1Gi
+1 -1
View File
@@ -14,7 +14,7 @@ spec:
targetRevision: HEAD targetRevision: HEAD
- repoURL: https://argoproj.github.io/argo-helm - repoURL: https://argoproj.github.io/argo-helm
chart: argo-cd chart: argo-cd
targetRevision: 10.9.2 targetRevision: 10.9.1
helm: helm:
valueFiles: valueFiles:
- $values/system/ArgoCD/values.yaml - $values/system/ArgoCD/values.yaml