1 Commits

Author SHA1 Message Date
581efa8478 Update ghcr.io/traefik/traefik Docker tag to v3.6.4
Some checks failed
lint-test-helm / lint-helm (pull_request) Failing after 13s
lint-test-docker / lint-docker-compose (pull_request) Failing after 50s
2025-12-07 04:27:56 +00:00
27 changed files with 112 additions and 331 deletions

View File

@@ -6,14 +6,12 @@ on:
- main
paths:
- 'hosts/**'
- '!clusters/**'
push:
branches:
- main
paths:
- 'hosts/**'
- '!clusters/**'
env:
BASE_BRANCH: "origin/${{ gitea.base_ref }}"
@@ -38,20 +36,14 @@ jobs:
id: branch-exists
if: github.event_name == 'push' || steps.check-branch-exists.outputs.exists == 'true' && github.event_name == 'pull_request'
run: |
if [ ${{ github.event_name == 'push' }} ]; then
echo ">> Action is from a push event, will continue with linting"
else
echo ">> Branch ${{ gitea.base_ref }} exists, will continue with linting"
fi
echo ">> Branch ${{ gitea.base_ref }} exists, will continue with linting"
echo "----"
echo "exists=true" >> $GITEA_OUTPUT
- name: Set up Node.js
if: steps.branch-exists.outputs.exists == 'true'
if: steps.check-branch-exists.outputs.exists == 'true'
uses: actions/setup-node@v6
with:
node-version: '24'
@@ -81,7 +73,7 @@ jobs:
for path in $GIT_DIFF; do
CHANGED_COMPOSE+=$(echo "$path")
CHANGED_COMPOSE+=$(echo " ")
RENDER_DIR+=$(echo " ")
done
else
@@ -106,14 +98,14 @@ jobs:
fi
- name: Lint Docker Compose
if: steps.check-dir-changes.outputs.changes-detected == 'true'
if: steps.check-branch-exists.outputs.exists == 'true'
env:
CHANGED_COMPOSE: ${{ steps.check-dir-changes.outputs.compose-dir }}
run: |
echo ">> Running dclint on changed compose files:"
echo "$CHANGED_COMPOSE"
for compose in $CHANGED_COMPOSE; do
echo "$CHANGED_COMPOSE" | while read -r compose; do
echo ">> Linting $compose ..."
npx dclint $compose
done

View File

@@ -6,14 +6,12 @@ on:
- main
paths:
- 'clusters/cl01tl/helm/**'
- '!hosts/**'
push:
branches:
- main
paths:
- 'clusters/cl01tl/helm/**'
- '!hosts/**'
env:
CLUSTER: cl01tl
@@ -39,13 +37,7 @@ jobs:
id: branch-exists
if: github.event_name == 'push' || steps.check-branch-exists.outputs.exists == 'true' && github.event_name == 'pull_request'
run: |
if [ ${{ github.event_name == 'push' }} ]; then
echo ">> Action is from a push event, will continue with linting"
else
echo ">> Branch ${{ gitea.base_ref }} exists, will continue with linting"
fi
echo ">> Branch ${{ gitea.base_ref }} exists, will continue with linting"
echo "----"
@@ -69,7 +61,6 @@ jobs:
if [ "${{ github.event_name }}" == "pull_request" ]; then
echo ""
echo ">> Checking for changes in a pull request ..."
git diff --name-only "${BASE_BRANCH}" | xargs -I {} dirname {} | sort -u | grep -E "clusters/[^/]+/helm/[^/]+"
GIT_DIFF=$(git diff --name-only "${BASE_BRANCH}" | xargs -I {} dirname {} | sort -u | grep -E "clusters/[^/]+/helm/[^/]+")
else
echo ""
@@ -84,7 +75,7 @@ jobs:
for path in $GIT_DIFF; do
CHANGED_CHARTS+=$(echo "$path" | awk -F '/' '{print $4}')
CHANGED_CHARTS+=$(echo " ")
RENDER_DIR+=$(echo " ")
done
else

View File

@@ -156,7 +156,6 @@ blocky:
radarr-anime IN CNAME traefik-cl01tl
radarr-standup IN CNAME traefik-cl01tl
searxng IN CNAME traefik-cl01tl
seerr IN CNAME traefik-cl01tl
slskd IN CNAME traefik-cl01tl
sonarr IN CNAME traefik-cl01tl
sonarr-4k IN CNAME traefik-cl01tl

View File

@@ -9,7 +9,7 @@ booklore:
main:
image:
repository: ghcr.io/booklore-app/booklore
tag: v1.13.2
tag: v1.13.1
pullPolicy: IfNotPresent
env:
- name: TZ

View File

@@ -125,9 +125,6 @@ gatus:
- name: overseerr
url: https://overseerr.alexlebens.net
<<: *defaults
- name: seerr
url: https://seerr.alexlebens.net
<<: *defaults
- name: yamtrack
url: https://yamtrack.alexlebens.net
<<: *defaults
@@ -143,9 +140,6 @@ gatus:
- name: audiobookshelf
url: https://audiobookshelf.alexlebens.net
<<: *defaults
- name: booklore
url: https://booklore.alexlebens.net
<<: *defaults
- name: home-assistant
url: https://home-assistant.alexlebens.net
<<: *defaults
@@ -182,11 +176,6 @@ gatus:
- name: n8n
url: https://n8n.alexlebens.net
<<: *defaults
- name: kronic
url: https://kronic.alexlebens.net
<<: *defaults
conditions:
- "[STATUS] == 401"
- name: omni-tools
url: https://omni-tools.alexlebens.net
<<: *defaults
@@ -256,9 +245,6 @@ gatus:
- name: ceph
url: https://ceph.alexlebens.net
<<: *defaults
- name: garage
url: https://garage-webui.alexlebens.net
<<: *defaults
- name: pgadmin
url: https://pgadmin.alexlebens.net
<<: *defaults
@@ -268,29 +254,6 @@ gatus:
- name: vault
url: https://vault.alexlebens.net
<<: *defaults
- name: backrest
url: https://backrest.alexlebens.net
<<: *defaults
- name: qui
url: https://qui.alexlebens.net
<<: *defaults
- name: qbittorrent
url: https://qbittorrent.alexlebens.net
<<: *defaults
- name: prowlarr
url: https://prowlarr.alexlebens.net
<<: *defaults
- name: huntarr
url: https://huntarr.alexlebens.net
<<: *defaults
- name: bazarr
url: https://bazarr.alexlebens.net
<<: *defaults
conditions:
- "[STATUS] == 401"
- name: tdarr
url: https://tdarr.alexlebens.net
<<: *defaults
- name: sonarr
url: https://sonarr.alexlebens.net
<<: *defaults
@@ -321,11 +284,25 @@ gatus:
- name: slskd
url: https://slskd.alexlebens.net
<<: *defaults
- name: ephemera
url: https://ephemera.alexlebens.net
- name: qui
url: https://qui.alexlebens.net
<<: *defaults
- name: listenarr
url: https://listenarr.alexlebens.net
- name: qbittorrent
url: https://qbittorrent.alexlebens.net
<<: *defaults
- name: prowlarr
url: https://prowlarr.alexlebens.net
<<: *defaults
- name: bazarr
url: https://bazarr.alexlebens.net
<<: *defaults
conditions:
- "[STATUS] == 401"
- name: huntarr
url: https://huntarr.alexlebens.net
<<: *defaults
- name: tdarr
url: https://tdarr.alexlebens.net
<<: *defaults
- name: www
url: https://www.alexlebens.dev
@@ -370,14 +347,24 @@ gatus:
url: https://codeserver.alexlebens.dev
<<: *defaults
group: external
- name: authentik
url: https://auth.alexlebens.dev
<<: *defaults
group: external
- name: public homepage
url: https://home.alexlebens.dev
<<: *defaults
group: external
- name: discord
group: public
url: https://discord.com/app
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 400"
interval: 10s
- name: reddit
group: public
url: https://reddit.com
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 400"
interval: 10s
postgres-17-cluster:
mode: recovery
cluster:

View File

@@ -1,6 +1,6 @@
dependencies:
- name: generic-device-plugin
repository: https://gitea.alexlebens.dev/api/packages/alexlebens/helm
version: 0.20.5
digest: sha256:329b2d00301ab1467a8654dd92febfd7078db121c00c0960548010c01dee66b6
generated: "2025-12-08T03:02:06.697075532Z"
version: 0.20.4
digest: sha256:4aa24e57233783f99d3de453f997ff4dddecaea729ab09b78745ee89ffa0e4a8
generated: "2025-12-06T01:01:30.343689275Z"

View File

@@ -15,6 +15,6 @@ maintainers:
dependencies:
- name: generic-device-plugin
repository: https://gitea.alexlebens.dev/api/packages/alexlebens/helm
version: 0.20.5
version: 0.20.4
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/kubernetes.png
appVersion: 1.0.0

View File

@@ -12,6 +12,8 @@ spec:
matchLabels:
app.kubernetes.io/name: gitea
app.kubernetes.io/instance: {{ .Release.Name }}
matchExpressions:
- { key: app.kubernetes.io/controller, operator: NotIn, values: [backup] }
endpoints:
- port: http

View File

@@ -174,9 +174,6 @@ gitea-actions:
backup:
global:
fullnameOverride: gitea-backup
labels:
app.kubernetes.io/instance: gitea-backup
app.kubernetes.io/name: gitea-backup
controllers:
backup:
type: cronjob

View File

@@ -17,7 +17,7 @@ maintainers:
- name: alexlebens
dependencies:
- name: harbor
version: 1.18.1
version: 1.18.0
repository: https://helm.goharbor.io
- name: postgres-cluster
alias: postgres-17-cluster

View File

@@ -13,7 +13,7 @@ roleRef:
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: User
name: https://authentik.alexlebens.net/application/o/headlamp/#alexanderlebens@gmail.com
name: alexanderlebens@gmail.com
apiGroup: rbac.authorization.k8s.io
- kind: ServiceAccount
name: headlamp-admin

View File

@@ -40,14 +40,14 @@ spec:
key: /authentik/oidc/headlamp
metadataPolicy: None
property: scopes
- secretKey: HEADLAMP_CONFIG_OIDC_VALIDATOR_IDP_ISSUER_URL
- secretKey: OIDC_VALIDATOR_ISSUER_URL
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: /authentik/oidc/headlamp
metadataPolicy: None
property: validator-issuer-url
- secretKey: HEADLAMP_CONFIG_OIDC_VALIDATOR_CLIENT_ID
- secretKey: OIDC_VALIDATOR_CLIENT_ID
remoteRef:
conversionStrategy: Default
decodingStrategy: None

View File

@@ -143,16 +143,10 @@ homepage:
statusStyle: dot
- Media Requests:
icon: sh-overseerr.webp
description: Overseerr
description: Overseer
href: https://overseerr.alexlebens.net
siteMonitor: http://overseerr.overseerr:80
statusStyle: dot
- Media Requests (New):
icon: sh-overseerr.webp
description: Seerr
href: https://seerr.alexlebens.net
siteMonitor: http://seerr-seerr-chart.seerr:80
statusStyle: dot
- Media Tracking:
icon: sh-yamtrack.webp
description: Yamtrack

View File

@@ -28,7 +28,7 @@ qbittorrent:
qbittorrent:
image:
repository: ghcr.io/linuxserver/qbittorrent
tag: 5.1.4@sha256:043498de39c3dd63eec94360c5ad966a51271d1581070f42cb73ab0cf4776f29
tag: 5.1.4@sha256:f0465dbb2aa14397fd205a0240ee562eb062354c036ccc444084fe46c6c75091
pullPolicy: IfNotPresent
env:
- name: TZ

View File

@@ -20,36 +20,6 @@ spec:
metadataPolicy: None
property: private-key
---
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: searxng-browser-metrics-auth
namespace: {{ .Release.Namespace }}
labels:
app.kubernetes.io/name: searxng-browser-metrics-auth
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/part-of: {{ .Release.Name }}
spec:
secretStoreRef:
kind: ClusterSecretStore
name: vault
data:
- secretKey: metrics-password
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: cl01tl/searxng/browser
metadataPolicy: None
property: metrics-password
- secretKey: metrics-username
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: cl01tl/searxng/browser
metadataPolicy: None
property: metrics-username
---
apiVersion: external-secrets.io/v1
kind: ExternalSecret

View File

@@ -0,0 +1,32 @@
apiVersion: redis.redis.opstreelabs.in/v1beta2
kind: RedisReplication
metadata:
name: redis-replication-searxng
namespace: {{ .Release.Namespace }}
labels:
app.kubernetes.io/name: redis-replication-searxng
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/part-of: {{ .Release.Name }}
spec:
clusterSize: 3
podSecurityContext:
runAsUser: 1000
fsGroup: 1000
kubernetesConfig:
image: quay.io/opstree/redis:v8.0.3
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 50m
memory: 128Mi
storage:
volumeClaimTemplate:
spec:
storageClassName: ceph-block
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
redisExporter:
enabled: true
image: quay.io/opstree/redis-exporter:v1.48.0

View File

@@ -1,26 +1,19 @@
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: searxng-browser
name: redis-replication-searxng
namespace: {{ .Release.Namespace }}
labels:
app.kubernetes.io/name: searxng-browser
app.kubernetes.io/name: redis-replication-searxng
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/part-of: {{ .Release.Name }}
redis-operator: "true"
env: production
spec:
selector:
matchLabels:
app.kubernetes.io/name: searxng-browser
app.kubernetes.io/instance: {{ .Release.Name }}
redis_setup_type: replication
endpoints:
- port: mail
- port: redis-exporter
interval: 30s
scrapeTimeout: 15s
path: /metrics
basicAuth:
password:
name: searxng-browser-metrics-auth
key: metrics-password
username:
name: searxng-browser-metrics-auth
key: metrics-username
scrapeTimeout: 10s

View File

@@ -9,7 +9,7 @@ searxng:
main:
image:
repository: searxng/searxng
tag: latest@sha256:8354c2e3fdc4e400379c0fa906e42961dfc55a570d9769c70ab07e410dfb1468
tag: latest@sha256:c25c6b671382f0464318b2de3b142f1c9fe3721e46fdad027f4d6caf399728ea
pullPolicy: IfNotPresent
env:
- name: SEARXNG_BASE_URL
@@ -18,6 +18,10 @@ searxng:
value: http://searxng-api.searxng:8080/search?q=<query>
- name: SEARXNG_HOSTNAME
value: searxng-api.searxng
- name: UWSGI_WORKERS
value: 4
- name: UWSGI_THREADS
value: 4
- name: ENABLE_RAG_WEB_SEARCH
value: true
- name: RAG_WEB_SEARCH_ENGINE
@@ -39,7 +43,7 @@ searxng:
main:
image:
repository: searxng/searxng
tag: latest@sha256:8354c2e3fdc4e400379c0fa906e42961dfc55a570d9769c70ab07e410dfb1468
tag: latest@sha256:c25c6b671382f0464318b2de3b142f1c9fe3721e46fdad027f4d6caf399728ea
pullPolicy: IfNotPresent
env:
- name: SEARXNG_BASE_URL
@@ -48,25 +52,16 @@ searxng:
value: https://searxng.alexlebens.net/search?q=<query>
- name: SEARXNG_HOSTNAME
value: searxng.alexlebens.net
- name: SEARXNG_VALKEY_URL
value: valkey://127.0.0.1:6379/0
- name: GRANIAN_HOST
value: 0.0.0.0
- name: GRANIAN_PORT
value: 8080
- name: SEARXNG_REDIS_URL
value: redis://redis-replication-searxng-master.searxng:6379/0
- name: UWSGI_WORKERS
value: 4
- name: UWSGI_THREADS
value: 4
resources:
requests:
cpu: 10m
memory: 256Mi
valkey:
image:
repository: valkey/valkey
tag: 9.0.0-alpine3.22
pullPolicy: IfNotPresent
resources:
requests:
cpu: 10m
memory: 128Mi
gluetun:
image:
repository: ghcr.io/qdm12/gluetun
@@ -82,10 +77,18 @@ searxng:
secretKeyRef:
name: searxng-wireguard-conf
key: private-key
- name: VPN_PORT_FORWARDING
value: "on"
- name: VPN_PORT_FORWARDING_UP_COMMAND
value: '/bin/sh -c "/gluetun/update.sh {{ printf "{{PORTS}}" }}"'
- name: PORT_FORWARD_ONLY
value: "on"
- name: FIREWALL_OUTBOUND_SUBNETS
value: 192.168.1.0/24,10.244.0.0/16
- name: FIREWALL_INPUT_PORTS
value: 8080
- name: DOT
value: "off"
securityContext:
privileged: True
capabilities:
@@ -148,12 +151,3 @@ searxng:
main:
- path: /etc/searxng
readOnly: false
valkey-data:
storageClass: ceph-block
accessMode: ReadWriteOnce
size: 5Gi
advancedMounts:
browser:
valkey:
- path: /data
readOnly: false

View File

@@ -1,6 +0,0 @@
dependencies:
- name: seerr-chart
repository: oci://ghcr.io/seerr-team/seerr
version: 3.0.0
digest: sha256:6cf3525ac452922339261fa2a5ecc9d8cdf66b21bc30e032395d8d80bb79dc6c
generated: "2025-12-08T20:48:24.567069-06:00"

View File

@@ -1,22 +0,0 @@
apiVersion: v2
name: seerr
version: 1.0.0
description: Seerr
keywords:
- seerr
- media
- movies
- tv shows
home: https://wiki.alexlebens.dev/
sources:
- https://github.com/seerr-team/seerr
- https://github.com/seerr-team/seerr/pkgs/container/seerr
- https://github.com/seerr-team/seerr/tree/develop/charts/seerr-chart
maintainers:
- name: alexlebens
dependencies:
- name: seerr-chart
repository: oci://ghcr.io/seerr-team/seerr
version: 3.0.0
icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/overseerr.png
appVersion: develop

View File

@@ -1,55 +0,0 @@
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: seerr-config-backup-secret
namespace: {{ .Release.Namespace }}
labels:
app.kubernetes.io/name: seerr-config-backup-secret
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/part-of: {{ .Release.Name }}
spec:
secretStoreRef:
kind: ClusterSecretStore
name: vault
target:
template:
mergePolicy: Merge
engineVersion: v2
data:
RESTIC_REPOSITORY: "{{ `{{ .BUCKET_ENDPOINT }}` }}/seerr/seerr-config"
data:
- secretKey: BUCKET_ENDPOINT
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: /cl01tl/volsync/restic/config
metadataPolicy: None
property: S3_BUCKET_ENDPOINT
- secretKey: RESTIC_PASSWORD
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: /cl01tl/volsync/restic/config
metadataPolicy: None
property: RESTIC_PASSWORD
- secretKey: AWS_DEFAULT_REGION
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: /cl01tl/volsync/restic/config
metadataPolicy: None
property: AWS_DEFAULT_REGION
- secretKey: AWS_ACCESS_KEY_ID
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: /digital-ocean/home-infra/volsync-backups
metadataPolicy: None
property: access_key
- secretKey: AWS_SECRET_ACCESS_KEY
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: /digital-ocean/home-infra/volsync-backups
metadataPolicy: None
property: secret_key

View File

@@ -1,28 +0,0 @@
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: http-route-seerr
namespace: {{ .Release.Namespace }}
labels:
app.kubernetes.io/name: http-route-seerr
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/part-of: {{ .Release.Name }}
spec:
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: traefik-gateway
namespace: traefik
hostnames:
- seerr.alexlebens.net
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- group: ''
kind: Service
name: seerr-seerr-chart
port: 80
weight: 100

View File

@@ -1,26 +0,0 @@
apiVersion: volsync.backube/v1alpha1
kind: ReplicationSource
metadata:
name: seerr-config-backup-source
namespace: {{ .Release.Namespace }}
labels:
app.kubernetes.io/name: seerr-config-backup-source
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/part-of: {{ .Release.Name }}
spec:
sourcePVC: seerr-config
trigger:
schedule: 0 4 * * *
restic:
pruneIntervalDays: 7
repository: seerr-config-backup-secret
retain:
hourly: 1
daily: 3
weekly: 2
monthly: 2
yearly: 4
copyMethod: Snapshot
storageClassName: ceph-block
volumeSnapshotClassName: ceph-blockpool-snapshot
cacheCapacity: 10Gi

View File

@@ -1,31 +0,0 @@
seerr-chart:
image:
tag: develop
sha: f96deeef25cfb7bb0ecaa90f324bf6dfb66a844e8ed38501764f4d982a152280
probes:
livenessProbe:
initialDelaySeconds: 60
periodSeconds: 30
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
readinessProbe:
initialDelaySeconds: 60
periodSeconds: 30
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
service:
port: 80
config:
persistence:
size: 5Gi
accessModes:
- ReadWriteOnce
storageClass: ceph-block
ingress:
enabled: false
resources:
requests:
cpu: 10m
memory: 128Mi

View File

@@ -26,7 +26,7 @@ spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 5Gi
storage: 1Gi
redisExporter:
enabled: true
image: quay.io/opstree/redis-exporter:v1.48.0

View File

@@ -132,7 +132,6 @@ customDNS:
radarr-anime IN CNAME traefik-cl01tl
radarr-standup IN CNAME traefik-cl01tl
searxng IN CNAME traefik-cl01tl
seerr IN CNAME traefik-cl01tl
slskd IN CNAME traefik-cl01tl
sonarr IN CNAME traefik-cl01tl
sonarr-4k IN CNAME traefik-cl01tl

View File

@@ -132,7 +132,6 @@ customDNS:
radarr-anime IN CNAME traefik-cl01tl
radarr-standup IN CNAME traefik-cl01tl
searxng IN CNAME traefik-cl01tl
seerr IN CNAME traefik-cl01tl
slskd IN CNAME traefik-cl01tl
sonarr IN CNAME traefik-cl01tl
sonarr-4k IN CNAME traefik-cl01tl