Compare commits

..

1 Commits

Author SHA1 Message Date
Morten Olsen
df61e4f820 more-stuff 2025-09-03 17:09:13 +02:00
69 changed files with 107 additions and 905 deletions

View File

@@ -1,3 +0,0 @@
apiVersion: v2
version: 1.0.0
name: audiobookshelf

View File

@@ -1,13 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: OidcClient
metadata:
name: '{{ .Release.Name }}'
spec:
environment: '{{ .Values.globals.environment }}'
redirectUris:
- path: /audiobookshelf/auth/openid/callback
subdomain: '{{ .Values.subdomain }}'
matchingMode: strict
- path: /audiobookshelf/auth/openid/mobile-redirect
subdomain: '{{ .Values.subdomain }}'
matchingMode: strict

View File

@@ -1,52 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: '{{ .Release.Name }}'
spec:
strategy:
type: Recreate
replicas: 1
selector:
matchLabels:
app: '{{ .Release.Name }}'
template:
metadata:
labels:
app: '{{ .Release.Name }}'
spec:
containers:
- name: '{{ .Release.Name }}'
image: '{{ .Values.image.repository }}:{{ .Values.image.tag }}'
imagePullPolicy: '{{ .Values.image.pullPolicy }}'
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
tcpSocket:
port: http
readinessProbe:
tcpSocket:
port: http
volumeMounts:
- mountPath: /config
name: config
- mountPath: /metadata
name: metadata
- mountPath: /audiobooks
name: audiobooks
- mountPath: /podcasts
name: podcasts
volumes:
- name: config
persistentVolumeClaim:
claimName: '{{ .Release.Name }}-config'
- name: metadata
persistentVolumeClaim:
claimName: '{{ .Release.Name }}-metadata'
- name: audiobooks
persistentVolumeClaim:
claimName: books
- name: podcasts
persistentVolumeClaim:
claimName: podcasts

View File

@@ -1,11 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: ExternalHttpService
metadata:
name: '{{ .Release.Name }}'
spec:
environment: '{{ .Values.globals.environment }}'
subdomain: '{{ .Values.subdomain }}'
destination:
host: '{{ .Release.Name }}.{{ .Release.Namespace }}.svc.cluster.local'
port:
number: 80

View File

@@ -1,24 +0,0 @@
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: '{{ .Release.Name }}-config'
spec:
accessModes:
- 'ReadWriteOnce'
resources:
requests:
storage: '1Gi'
storageClassName: '{{ .Values.globals.environment }}'
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: '{{ .Release.Name }}-metadata'
spec:
accessModes:
- 'ReadWriteOnce'
resources:
requests:
storage: '1Gi'
storageClassName: '{{ .Values.globals.environment }}'

View File

@@ -1,15 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: '{{ .Release.Name }}'
labels:
app: '{{ .Release.Name }}'
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
selector:
app: '{{ .Release.Name }}'

View File

@@ -1,7 +0,0 @@
globals:
environment: prod
image:
repository: ghcr.io/advplyr/audiobookshelf
tag: 2.26.1
pullPolicy: IfNotPresent
subdomain: audiobookshelf

View File

@@ -3,7 +3,7 @@ kind: OidcClient
metadata: metadata:
name: '{{ .Release.Name }}' name: '{{ .Release.Name }}'
spec: spec:
environment: '{{ .Values.globals.environment }}' environment: '{{ .Values.environment }}'
redirectUris: redirectUris:
- path: /api/auth/oidc/callback - path: /api/auth/oidc/callback
subdomain: bytestash subdomain: bytestash

View File

@@ -3,7 +3,7 @@ kind: ExternalHttpService
metadata: metadata:
name: '{{ .Release.Name }}' name: '{{ .Release.Name }}'
spec: spec:
environment: '{{ .Values.globals.environment }}' environment: '{{ .Values.environment }}'
subdomain: '{{ .Values.subdomain }}' subdomain: '{{ .Values.subdomain }}'
destination: destination:
host: '{{ .Release.Name }}.{{ .Release.Namespace }}.svc.cluster.local' host: '{{ .Release.Name }}.{{ .Release.Namespace }}.svc.cluster.local'

View File

@@ -1,11 +0,0 @@
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: '{{ .Release.Name }}-data'
spec:
accessModes:
- 'ReadWriteOnce'
resources:
requests:
storage: '1Gi'
storageClassName: '{{ .Values.globals.environment }}'

View File

@@ -1,5 +1,5 @@
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: StatefulSet
metadata: metadata:
name: '{{ .Release.Name }}' name: '{{ .Release.Name }}'
labels: labels:
@@ -22,10 +22,6 @@ spec:
- containerPort: 5000 - containerPort: 5000
name: http name: http
env: env:
- name: ALLOW_NEW_ACCOUNTS
value: 'true'
- name: DISABLE_INTERNAL_ACCOUNTS
value: 'true'
- name: OIDC_ENABLED - name: OIDC_ENABLED
value: 'true' value: 'true'
- name: OIDC_DISPLAY_NAME - name: OIDC_DISPLAY_NAME
@@ -48,8 +44,20 @@ spec:
volumeMounts: volumeMounts:
- mountPath: /data/snippets - mountPath: /data/snippets
name: data name: bytestash-data
volumes:
- name: data # Defines security context for the pod to avoid running as root.
persistentVolumeClaim: # securityContext:
claimName: '{{ .Release.Name }}-data' # runAsUser: 1000
# runAsGroup: 1000
# fsGroup: 1000
volumeClaimTemplates:
- metadata:
name: bytestash-data
spec:
accessModes: ['ReadWriteOnce']
storageClassName: '{{ .Values.environment }}'
resources:
requests:
storage: 5Gi

View File

@@ -1,3 +1,2 @@
globals:
environment: prod environment: prod
subdomain: bytestash subdomain: bytestash

View File

@@ -1,3 +0,0 @@
apiVersion: v2
version: 1.0.0
name: gitea

View File

@@ -1,10 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: OidcClient
metadata:
name: '{{ .Release.Name }}'
spec:
environment: '{{ .Values.globals.environment }}'
redirectUris:
- path: /user/oauth2/Authentik/callback
subdomain: '{{ .Values.subdomain }}'
matchingMode: strict

View File

@@ -1,6 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: PostgresDatabase
metadata:
name: '{{ .Release.Name }}'
spec:
environment: '{{ .Values.globals.environment }}'

View File

@@ -1,96 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: '{{ .Release.Name }}'
spec:
strategy:
type: Recreate
replicas: 1
selector:
matchLabels:
app: '{{ .Release.Name }}'
template:
metadata:
labels:
app: '{{ .Release.Name }}'
spec:
containers:
- name: '{{ .Release.Name }}'
image: '{{ .Values.image.repository }}:{{ .Values.image.tag }}'
imagePullPolicy: '{{ .Values.image.pullPolicy }}'
ports:
- name: http
containerPort: 3000
protocol: TCP
livenessProbe:
tcpSocket:
port: http
readinessProbe:
tcpSocket:
port: http
volumeMounts:
- mountPath: /data
name: data
env:
- name: TZ
value: '{{ .Values.globals.timezone }}'
- name: USER_UID
value: '1000'
- name: USER_GID
value: '1000'
- name: GITEA__service__REQUIRE_EXTERNAL_REGISTRATION_PASSWORD
value: 'true'
- name: GITEA__service__ENABLE_BASIC_AUTHENTICATION
value: 'true'
- name: GITEA__service__ENABLE_PASSWORD_SIGNIN_FORM
value: 'false'
- name: GITEA__service__DEFAULT_KEEP_EMAIL_PRIVATE
value: 'true'
- name: GITEA__service__DEFAULT_USER_IS_RESTRICTED
value: 'true'
- name: GITEA__service__DEFAULT_USER_VISIBILITY
value: 'private'
- name: GITEA__service__DEFAULT_ORG_VISIBILITY
value: 'private'
- name: GITEA__service__ALLOW_ONLY_EXTERNAL_REGISTRATION
value: 'true'
- name: GITEA__other__SHOW_FOOTER_POWERED_BY
value: 'false'
- name: GITEA__other__SHOW_FOOTER_TEMPLATE_LOAD_TIME
value: 'false'
- name: GITEA__other__SHOW_FOOTER_VERSION
value: 'false'
- name: GITEA__repository__ENABLE_PUSH_CREATE_USER
value: 'true'
- name: GITEA__repository__ENABLE_PUSH_CREATE_ORG
value: 'true'
- name: GITEA__openid__ENABLE_OPENID_SIGNIN
value: 'false'
- name: GITEA__openid__ENABLE_OPENID_SIGNUP
value: 'false'
- name: GITEA__database__DB_TYPE
value: postgres
- name: GITEA__database__NAME
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: database
- name: GITEA__database__HOST
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: host
- name: GITEA__database__USER
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: user
- name: GITEA__database__PASSWD
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: password
volumes:
- name: data
persistentVolumeClaim:
claimName: '{{ .Release.Name }}-data'

View File

@@ -1,11 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: ExternalHttpService
metadata:
name: '{{ .Release.Name }}'
spec:
environment: '{{ .Values.globals.environment }}'
subdomain: '{{ .Values.subdomain }}'
destination:
host: '{{ .Release.Name }}.{{ .Release.Namespace }}.svc.cluster.local'
port:
number: 80

View File

@@ -1,11 +0,0 @@
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: '{{ .Release.Name }}-data'
spec:
accessModes:
- 'ReadWriteOnce'
resources:
requests:
storage: '1Gi'
storageClassName: '{{ .Values.globals.environment }}'

View File

@@ -1,15 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: '{{ .Release.Name }}'
labels:
app: '{{ .Release.Name }}'
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 3000
protocol: TCP
name: http
selector:
app: '{{ .Release.Name }}'

View File

@@ -1,8 +0,0 @@
globals:
environment: prod
timezone: Europe/Amsterdam
image:
repository: docker.gitea.com/gitea
tag: latest
pullPolicy: IfNotPresent
subdomain: gitea

View File

@@ -6,5 +6,5 @@ spec:
environment: '{{ .Values.environment }}' environment: '{{ .Values.environment }}'
redirectUris: redirectUris:
- path: /sso/OID/redirect/Authentik - path: /sso/OID/redirect/Authentik
subdomain: '{{ .Values.globals.subdomain }}' subdomain: '{{ .Values.subdomain }}'
matchingMode: strict matchingMode: strict

View File

@@ -3,7 +3,7 @@ kind: ExternalHttpService
metadata: metadata:
name: '{{ .Release.Name }}' name: '{{ .Release.Name }}'
spec: spec:
environment: '{{ .Values.globals.environment }}' environment: '{{ .Values.environment }}'
subdomain: '{{ .Values.subdomain }}' subdomain: '{{ .Values.subdomain }}'
destination: destination:
host: '{{ .Release.Name }}.{{ .Release.Namespace }}.svc.cluster.local' host: '{{ .Release.Name }}.{{ .Release.Namespace }}.svc.cluster.local'

View File

@@ -1,7 +1,6 @@
globals:
environment: prod
image: image:
repository: docker.io/jellyfin/jellyfin repository: docker.io/jellyfin/jellyfin
tag: latest tag: latest
pullPolicy: IfNotPresent pullPolicy: IfNotPresent
environment: prod
subdomain: jellyfin subdomain: jellyfin

View File

@@ -1,3 +0,0 @@
apiVersion: v2
version: 1.0.0
name: metamcp

View File

@@ -1,6 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: PostgresDatabase
metadata:
name: '{{ .Release.Name }}'
spec:
environment: '{{ .Values.globals.environment }}'

View File

@@ -1,79 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: '{{ .Release.Name }}'
spec:
strategy:
type: Recreate
replicas: 1
selector:
matchLabels:
app: '{{ .Release.Name }}'
template:
metadata:
labels:
app: '{{ .Release.Name }}'
spec:
containers:
- name: '{{ .Release.Name }}'
image: '{{ .Values.image.repository }}:{{ .Values.image.tag }}'
imagePullPolicy: '{{ .Values.image.pullPolicy }}'
ports:
- name: http
containerPort: 12008
protocol: TCP
livenessProbe:
tcpSocket:
port: http
readinessProbe:
tcpSocket:
port: http
volumeMounts:
- mountPath: /data
name: data
env:
- name: TZ
value: '{{ .Values.globals.timezone }}'
- name: APP_URL
value: https://metamcp.olsen.cloud # TODO: Change
- name: NEXT_PUBLIC_APP_URL
value: https://metamcp.olsen.cloud # TODO: Change
- name: BETTER_AUTH_SECRET
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-secrets'
key: betterauth
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: url
- name: POSTGRES_DB
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: database
- name: POSTGRES_HOST
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: host
- name: POSTGRES_PORT
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: port
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: user
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: password
volumes:
- name: data
persistentVolumeClaim:
claimName: '{{ .Release.Name }}-data'

View File

@@ -1,11 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: ExternalHttpService
metadata:
name: '{{ .Release.Name }}'
spec:
environment: '{{ .Values.globals.environment }}'
subdomain: '{{ .Values.subdomain }}'
destination:
host: '{{ .Release.Name }}.{{ .Release.Namespace }}.svc.cluster.local'
port:
number: 80

View File

@@ -1,11 +0,0 @@
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: '{{ .Release.Name }}-data'
spec:
accessModes:
- 'ReadWriteOnce'
resources:
requests:
storage: '1Gi'
storageClassName: '{{ .Values.globals.environment }}'

View File

@@ -1,9 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: GenerateSecret
metadata:
name: '{{ .Release.Name }}-secrets'
spec:
fields:
- name: betterauth
encoding: base64
length: 64

View File

@@ -1,15 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: '{{ .Release.Name }}'
labels:
app: '{{ .Release.Name }}'
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 12008
protocol: TCP
name: http
selector:
app: '{{ .Release.Name }}'

View File

@@ -1,8 +0,0 @@
globals:
environment: prod
timezone: Europe/Amsterdam
image:
repository: ghcr.io/metatool-ai/metamcp
tag: latest
pullPolicy: IfNotPresent
subdomain: metamcp

View File

@@ -1,3 +0,0 @@
apiVersion: v2
version: 1.0.0
name: ByteStash

View File

@@ -1,10 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: OidcClient
metadata:
name: '{{ .Release.Name }}'
spec:
environment: '{{ .Values.globals.environment }}'
redirectUris:
- path: /api/auth/oidc/callback
subdomain: bytestash
matchingMode: strict

View File

@@ -1,55 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: '{{ .Release.Name }}'
labels:
app: '{{ .Release.Name }}'
spec:
serviceName: '{{ .Release.Name }}-headless'
replicas: 1
selector:
matchLabels:
app: '{{ .Release.Name }}'
template:
metadata:
labels:
app: '{{ .Release.Name }}'
spec:
containers:
- name: '{{ .Release.Name }}'
image: ghcr.io/miniflux/miniflux:latest
ports:
- containerPort: 8080
name: http
env:
- name: ALLOW_NEW_ACCOUNTS
value: 'true'
- name: DISABLE_INTERNAL_ACCOUNTS
value: 'true'
- name: OIDC_ENABLED
value: 'true'
- name: OIDC_DISPLAY_NAME
value: OIDC
- name: OIDC_CLIENT_ID
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-client'
key: clientId
- name: OIDC_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-client'
key: clientSecret
- name: OIDC_ISSUER_URL
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-client'
key: configuration
volumeMounts:
- mountPath: /data/snippets
name: data
volumes:
- name: data
persistentVolumeClaim:
claimName: '{{ .Release.Name }}-data'

View File

@@ -1,11 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: ExternalHttpService
metadata:
name: '{{ .Release.Name }}'
spec:
environment: '{{ .Values.globals.environment }}'
subdomain: '{{ .Values.subdomain }}'
destination:
host: '{{ .Release.Name }}.{{ .Release.Namespace }}.svc.cluster.local'
port:
number: 80

View File

@@ -1,11 +0,0 @@
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: '{{ .Release.Name }}-data'
spec:
accessModes:
- 'ReadWriteOnce'
resources:
requests:
storage: '1Gi'
storageClassName: '{{ .Values.globals.environment }}'

View File

@@ -1,15 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: '{{ .Release.Name }}'
labels:
app: '{{ .Release.Name }}'
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
protocol: TCP
name: http
selector:
app: '{{ .Release.Name }}'

View File

@@ -1,3 +0,0 @@
globals:
environment: prod
subdomain: miniflux

View File

@@ -1,3 +0,0 @@
apiVersion: v2
version: 1.0.0
name: Jellyfin

View File

@@ -1,6 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: PostgresDatabase
metadata:
name: '{{ .Release.Name }}'
spec:
environment: '{{ .Values.globals.environment }}'

View File

@@ -1,73 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: '{{ .Release.Name }}'
spec:
strategy:
type: Recreate
replicas: 1
selector:
matchLabels:
app: '{{ .Release.Name }}'
template:
metadata:
labels:
app: '{{ .Release.Name }}'
spec:
containers:
- name: '{{ .Release.Name }}'
image: '{{ .Values.image.repository }}:{{ .Values.image.tag }}'
imagePullPolicy: '{{ .Values.image.pullPolicy }}'
ports:
- name: http
containerPort: 5678
protocol: TCP
livenessProbe:
tcpSocket:
port: http
readinessProbe:
tcpSocket:
port: http
volumeMounts:
- mountPath: /home/node/.n8n
name: data
env:
- name: TZ
value: '{{ .Values.globals.timezone }}'
- name: GENERIC_TIMEZONE
value: '{{ .Values.globals.timezone }}'
- name: N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS
value: 'true'
- name: N8N_RUNNERS_ENABLED
value: 'true'
- name: DB_TYPE
value: postgresdb
- name: DB_POSTGRESDB_DATABASE
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: database
- name: DB_POSTGRESDB_HOST
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: host
- name: DB_POSTGRESDB_PORT
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: port
- name: DB_POSTGRESDB_USER
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: user
- name: DB_POSTGRESDB_PASSWORD
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-pg-connection'
key: password
volumes:
- name: data
persistentVolumeClaim:
claimName: '{{ .Release.Name }}-data'

View File

@@ -1,11 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: ExternalHttpService
metadata:
name: '{{ .Release.Name }}'
spec:
environment: '{{ .Values.globals.environment }}'
subdomain: '{{ .Values.subdomain }}'
destination:
host: '{{ .Release.Name }}.{{ .Release.Namespace }}.svc.cluster.local'
port:
number: 80

View File

@@ -1,11 +0,0 @@
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: '{{ .Release.Name }}-data'
spec:
accessModes:
- 'ReadWriteOnce'
resources:
requests:
storage: '1Gi'
storageClassName: '{{ .Values.globals.environment }}'

View File

@@ -1,15 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: '{{ .Release.Name }}'
labels:
app: '{{ .Release.Name }}'
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 5678
protocol: TCP
name: http
selector:
app: '{{ .Release.Name }}'

View File

@@ -1,8 +0,0 @@
globals:
environment: prod
timezone: Europe/Amsterdam
image:
repository: docker.n8n.io/n8nio/n8n
tag: latest
pullPolicy: IfNotPresent
subdomain: n8n

View File

@@ -1,3 +1,3 @@
apiVersion: v2 apiVersion: v2
version: 1.0.0 version: 1.0.0
name: ollama name: Ollama

View File

@@ -1,10 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: OidcClient
metadata:
name: '{{ .Release.Name }}'
spec:
environment: '{{ .Values.globals.environment }}'
redirectUris:
- path: /oauth/oidc/callback
subdomain: '{{ .Values.subdomain }}'
matchingMode: strict

View File

@@ -2,9 +2,9 @@ apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
name: '{{ .Release.Name }}' name: '{{ .Release.Name }}'
labels:
app: '{{ .Release.Name }}'
spec: spec:
strategy:
type: Recreate
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
@@ -15,24 +15,38 @@ spec:
app: '{{ .Release.Name }}' app: '{{ .Release.Name }}'
spec: spec:
containers: containers:
- name: '{{ .Release.Name }}' - name: ollama
image: '{{ .Values.image.repository }}:{{ .Values.image.tag }}' image: ghcr.io/ollama/ollama:latest # Official image
imagePullPolicy: '{{ .Values.image.pullPolicy }}' imagePullPolicy: IfNotPresent
ports: ports:
- name: http - containerPort: 11434
containerPort: 11434 name: http
protocol: TCP
livenessProbe:
tcpSocket:
port: http
readinessProbe:
tcpSocket:
port: http
volumeMounts: volumeMounts:
- mountPath: /root/.ollama - name: ollama-data
name: data mountPath: /root/.ollama
env:
# If you want to prestart a model, set this env var to the
# model name (e.g., "gpt-4o-mini"). The container will download
# it automatically at startup.
# - name: OLLAMA_MODEL
# value: "gpt-4o-mini"
readinessProbe:
httpGet:
scheme: HTTP
path: /api/status
port: 11434
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 2000m
memory: 4Gi
volumes: volumes:
- name: data - name: ollama-data
persistentVolumeClaim: persistentVolumeClaim:
claimName: '{{ .Release.Name }}-data' claimName: '{{ .Release.Name }}-data'

View File

@@ -1,11 +1,11 @@
kind: PersistentVolumeClaim
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim
metadata: metadata:
name: '{{ .Release.Name }}-data' name: '{{ .Release.Name }}-data'
spec: spec:
storageClassName: '{{ .Values.environment }}'
accessModes: accessModes:
- 'ReadWriteOnce' - ReadWriteOnce
resources: resources:
requests: requests:
storage: '1Gi' storage: 20Gi
storageClassName: '{{ .Values.globals.environment }}'

View File

@@ -5,11 +5,11 @@ metadata:
labels: labels:
app: '{{ .Release.Name }}' app: '{{ .Release.Name }}'
spec: spec:
type: ClusterIP type: LoadBalancer # Set to NodePort/ClusterIP if you prefer
ports: ports:
- port: 80 - name: http
targetPort: 11434 port: 11434
targetPort: http
protocol: TCP protocol: TCP
name: http
selector: selector:
app: '{{ .Release.Name }}' app: '{{ .Release.Name }}'

View File

@@ -1,7 +1,2 @@
globals: environment: dev
environment: prod subdomain: bytestash
image:
repository: ollama/ollama
tag: 0.11.8
pullPolicy: IfNotPresent
subdomain: openwebui

View File

@@ -1,3 +0,0 @@
apiVersion: v2
version: 1.0.0
name: openwebui

View File

@@ -1,10 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: OidcClient
metadata:
name: '{{ .Release.Name }}'
spec:
environment: '{{ .Values.globals.environment }}'
redirectUris:
- path: /oauth/oidc/callback
subdomain: '{{ .Values.subdomain }}'
matchingMode: strict

View File

@@ -1,70 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: '{{ .Release.Name }}'
spec:
strategy:
type: Recreate
replicas: 1
selector:
matchLabels:
app: '{{ .Release.Name }}'
template:
metadata:
labels:
app: '{{ .Release.Name }}'
spec:
containers:
- name: '{{ .Release.Name }}'
image: '{{ .Values.image.repository }}:{{ .Values.image.tag }}'
imagePullPolicy: '{{ .Values.image.pullPolicy }}'
ports:
- name: http
containerPort: 8080
protocol: TCP
livenessProbe:
tcpSocket:
port: http
readinessProbe:
tcpSocket:
port: http
volumeMounts:
- mountPath: /app/backend/data
name: data
env:
- name: ENABLE_SIGNUP
value: 'false'
- name: WEBUI_URL # TODO: remove
value: https://openwebui.olsen.cloud
- name: ENABLE_OAUTH_PERSISTENT_CONFIG
value: 'false'
- name: ENABLE_OAUTH_SIGNUP
value: 'true'
- name: OAUTH_MERGE_ACCOUNTS_BY_EMAIL
value: 'true'
- name: OAUTH_PROVIDER_NAME
value: authentik
- name: OPENID_PROVIDER_URL
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-client'
key: configuration
- name: OAUTH_CLIENT_ID
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-client'
key: clientId
- name: OAUTH_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: '{{ .Release.Name }}-client'
key: clientSecret
- name: ENABLE_LOGIN_FORM
value: 'false'
- name: OPENID_REDIRECT
value: https://openwebui.olsen.cloud/oauth/oidc/callback
volumes:
- name: data
persistentVolumeClaim:
claimName: '{{ .Release.Name }}-data'

View File

@@ -1,11 +0,0 @@
apiVersion: homelab.mortenolsen.pro/v1
kind: ExternalHttpService
metadata:
name: '{{ .Release.Name }}'
spec:
environment: '{{ .Values.globals.environment }}'
subdomain: '{{ .Values.subdomain }}'
destination:
host: '{{ .Release.Name }}.{{ .Release.Namespace }}.svc.cluster.local'
port:
number: 80

View File

@@ -1,11 +0,0 @@
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: '{{ .Release.Name }}-data'
spec:
accessModes:
- 'ReadWriteOnce'
resources:
requests:
storage: '1Gi'
storageClassName: '{{ .Values.globals.environment }}'

View File

@@ -1,15 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: '{{ .Release.Name }}'
labels:
app: '{{ .Release.Name }}'
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
protocol: TCP
name: http
selector:
app: '{{ .Release.Name }}'

View File

@@ -1,7 +0,0 @@
globals:
environment: prod
image:
repository: ghcr.io/open-webui/open-webui
tag: main
pullPolicy: IfNotPresent
subdomain: openwebui

View File

@@ -5,25 +5,24 @@ metadata:
namespace: '{{ .Values.env }}-argo' namespace: '{{ .Values.env }}-argo'
spec: spec:
generators: generators:
- git: - directory:
repoURL: '{{ .Values.repo }}' path: charts/apps
revision: '{{ .Values.ref }}' recurse: false
directories:
- path: charts/apps/*
include: '.*' include: '.*'
exclude: '.*.disabled' filter: |
.is_dir == true and (.path | endswith(".disabled") | not)
template: template:
metadata: metadata:
name: '{{`{{path.basename}}`}}' name: '{{path.basename}}'
spec: spec:
project: default project: default
source: source:
repoURL: '{{ .Values.repo }}' repoURL: '{{ .Values.repo }}'
targetRevision: '{{ .Values.ref }}' targetRevision: '{{ .Values.ref }}'
path: charts/apps/{{`{{path.basename}}`}} path: charts/apps/{{path.basename}}
helm: helm:
values: | values: |
globals: {{ .Values.globals | toYaml | nindent 14 }} global: {{ .Values.global | toYaml | nindent 14 }}
destination: destination:
server: https://kubernetes.default.svc server: https://kubernetes.default.svc
namespace: '{{ .Values.globals.env }}' namespace: '{{ .Values.globals.env }}'

View File

@@ -10,17 +10,19 @@ spec:
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
persistentVolumeReclaimPolicy: Retain persistentVolumeReclaimPolicy: Retain
storageClassName: manual-books storageClassName: manual
hostPath: null
nfs: nfs:
path: '{{ .Values.books.path }}' path: '{{ .Values.books.path }}'
server: '{{ .Values.host }}' server: '{{ .Values.host }}'
readOnly: true
--- ---
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: books name: books
spec: spec:
storageClassName: manual-books storageClassName: manual
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
resources: resources:

View File

@@ -10,17 +10,19 @@ spec:
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
persistentVolumeReclaimPolicy: Retain persistentVolumeReclaimPolicy: Retain
storageClassName: manual-movies storageClassName: manual
hostPath: null
nfs: nfs:
path: '{{ .Values.movies.path }}' path: '{{ .Values.movies.path }}'
server: '{{ .Values.host }}' server: '{{ .Values.host }}'
readOnly: true
--- ---
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: movies name: movies
spec: spec:
storageClassName: manual-movies storageClassName: manual
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
resources: resources:

View File

@@ -10,17 +10,19 @@ spec:
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
persistentVolumeReclaimPolicy: Retain persistentVolumeReclaimPolicy: Retain
storageClassName: manual-music storageClassName: manual
hostPath: null
nfs: nfs:
path: '{{ .Values.music.path }}' path: '{{ .Values.music.path }}'
server: '{{ .Values.host }}' server: '{{ .Values.host }}'
readOnly: true
--- ---
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: music name: music
spec: spec:
storageClassName: manual-music storageClassName: manual
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
resources: resources:

View File

@@ -10,17 +10,19 @@ spec:
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
persistentVolumeReclaimPolicy: Retain persistentVolumeReclaimPolicy: Retain
storageClassName: manual-podcasts storageClassName: manual
hostPath: null
nfs: nfs:
path: '{{ .Values.podcasts.path }}' path: '{{ .Values.podcasts.path }}'
server: '{{ .Values.host }}' server: '{{ .Values.host }}'
readOnly: true
--- ---
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: podcasts name: podcasts
spec: spec:
storageClassName: manual-podcasts storageClassName: manual
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
resources: resources:

View File

@@ -10,17 +10,19 @@ spec:
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
persistentVolumeReclaimPolicy: Retain persistentVolumeReclaimPolicy: Retain
storageClassName: manual-tvshows storageClassName: manual
hostPath: null
nfs: nfs:
path: '{{ .Values.tvshows.path }}' path: '{{ .Values.tvshows.path }}'
server: '{{ .Values.host }}' server: '{{ .Values.host }}'
readOnly: true
--- ---
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: tvshows name: tvshows
spec: spec:
storageClassName: manual-tvshows storageClassName: manual
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
resources: resources:

View File

@@ -204,11 +204,7 @@ class Environment extends CustomResource<typeof specSchema> {
spec: { spec: {
targetNamespace: this.#argoNamespace.name, targetNamespace: this.#argoNamespace.name,
interval: '1h', interval: '1h',
values: { values: {},
applicationset: {
enabled: true,
},
},
chart: { chart: {
spec: { spec: {
chart: 'argo-cd', chart: 'argo-cd',

View File

@@ -40,7 +40,7 @@ class GenerateSecret extends CustomResource<typeof specSchema> {
...current, ...current,
}; };
await this.#secret.set(expected); await this.#secret.ensure(expected);
}; };
} }

View File

@@ -26,7 +26,6 @@ type SecretData = {
database: string; database: string;
host: string; host: string;
port: string; port: string;
url: string;
}; };
const sanitizeName = (input: string) => { const sanitizeName = (input: string) => {
@@ -88,22 +87,15 @@ class PostgresDatabase extends CustomResource<typeof specSchema> {
throw new NotReadyError('MissingClusterSecret'); throw new NotReadyError('MissingClusterSecret');
} }
const expected = { await this.#secret.set(
(current) => ({
password: generateRandomHexPass(), password: generateRandomHexPass(),
user: this.username, user: this.username,
database: this.database, database: this.database,
...this.#secret.value, ...current,
host: clusterSecret.host, host: clusterSecret.host,
port: clusterSecret.port, port: clusterSecret.port,
}; }),
const url = `postgresql://${expected.user}:${expected.password}@${expected.host}:${expected.port}/${expected.database}`;
await this.#secret.set(
{
...expected,
url,
},
{ {
metadata: { metadata: {
ownerReferences: [this.ref], ownerReferences: [this.ref],