Compare commits

...

10 commits

68 changed files with 1225 additions and 104 deletions

View file

@ -2,9 +2,15 @@ apiVersion: helm.cattle.io/v1
kind: HelmChart kind: HelmChart
metadata: metadata:
name: nvidia-device-plugin name: nvidia-device-plugin
namespace: kube-system namespace: charts
spec: spec:
chart: nvidia-device-plugin chart: nvidia-device-plugin
repo: https://nvidia.github.io/k8s-device-plugin repo: https://nvidia.github.io/k8s-device-plugin
valuesContent: |- valuesContent: |-
runtimeClassName: nvidia runtimeClassName: nvidia
namespaceOverride: kube-system
tolerations:
- key: "gpu"
value: "true"
operator: "Equal"
effect: "NoSchedule"

View file

@ -0,0 +1,48 @@
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup
spec:
schedule: "0 3 * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: backup
image: busybox
command:
- /bin/bash
- -c
- |
echo $HEALTHCHECK_BASE_URL/${HEALTHCHECK_ID}
# Start signal
curl -fsS -m 10 --retry 5 ${HEALTHCHECK_BASE_URL}/${HEALTHCHECK_ID}/start
# Perform backup
if ! ${BACKUP_COMMAND} | gzip > /backup/${ROTATE_PREFIX}-$(date +%Y%m%d).sql.gz; then
curl -fsS -m 10 --retry 5 ${HEALTHCHECK_BASE_URL}/${HEALTHCHECK_ID}/fail
exit 1
fi
# list backups
ls /backup
# Rotate old backups
find /backup -name "${ROTATE_PREFIX}-*.sql.gz" -mtime +7 -delete
# Success signal
curl -fsS -m 10 --retry 5 ${HEALTHCHECK_BASE_URL}/${HEALTHCHECK_ID}
envFrom:
- configMapRef:
name: backup-config
- secretRef:
name: core-secrets
volumeMounts:
- mountPath: /backup
name: backup
subPath: "data"
volumes:
- name: backup
persistentVolumeClaim:
claimName: backup-pvc

View file

@ -0,0 +1,9 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- batch.yaml
labels:
- includeSelectors: true
pairs:
app.kubernetes.io/managed-by: kustomize

View file

@ -1,5 +0,0 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: config
data:

View file

@ -9,7 +9,6 @@ resources:
- secret.yaml - secret.yaml
- httproute-http.yaml - httproute-http.yaml
- httproute-https.yaml - httproute-https.yaml
# - configmap.yaml
labels: labels:
- includeSelectors: true - includeSelectors: true

View file

@ -0,0 +1,7 @@
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
name: chart
namespace: charts
spec:
targetNamespace: default

View file

@ -0,0 +1,10 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- helmchart.yaml
labels:
- includeSelectors: true
pairs:
app.kubernetes.io/managed-by: kustomize

View file

@ -1,5 +0,0 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: config
data:

View file

@ -6,7 +6,6 @@ resources:
- deployment.yaml - deployment.yaml
- pvc.yaml - pvc.yaml
- secret.yaml - secret.yaml
# - configmap.yaml
labels: labels:
- includeSelectors: true - includeSelectors: true

View file

@ -11,10 +11,16 @@ spec:
hostnames: hostnames:
- web.leechpepin.com - web.leechpepin.com
rules: rules:
- matches: - filters:
- path: - type: RequestHeaderModifier
type: PathPrefix requestHeaderModifier:
value: / set:
- name: "X-Forwarded-Proto"
value: "https"
backendRefs: backendRefs:
- name: web - name: web
port: 80 port: 80
matches:
- path:
type: PathPrefix
value: /

View file

@ -0,0 +1,14 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- statefulset.yaml
- service.yaml
- httproute-http.yaml
- httproute-https.yaml
- secret.yaml
labels:
- includeSelectors: true
pairs:
app.kubernetes.io/managed-by: kustomize

View file

@ -0,0 +1,27 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: secrets
namespace: infisical
labels:
label-to-be-passed-to-managed-secret: homelab
annotations:
example.com/annotation-to-be-passed-to-managed-secret: "homelab"
spec:
hostAPI: https://app.infisical.com/api
resyncInterval: 10
authentication:
# Universal Auth
universalAuth:
secretsScope:
projectSlug: homelab-n-f-yj
envSlug: prod
secretsPath: "/apps/appname" # Root is "/"
recursive: false # Whether or not to use recursive mode (Fetches all secrets in an environment from a given secret path, and all folders inside the path) / defaults to false
credentialsRef:
secretName: universal-auth-credentials
secretNamespace: infisical
managedSecretReference:
secretName: app-secrets
secretNamespace: ns
creationPolicy: "Orphan" ## Owner | Orphan

View file

@ -0,0 +1,23 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: ss
namespace: core
spec:
serviceName: ss-svc
replicas: 1
template:
spec:
restartPolicy: Always
volumeClaimTemplates:
- metadata:
name: ss-data
annotations:
name: ss-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn-private
resources:
requests:
storage: 5Gi

View file

@ -13,7 +13,8 @@ spec:
effect: "NoSchedule" effect: "NoSchedule"
containers: containers:
- name: ollama - name: ollama
image: ollama/ollama:latest image: ollama/ollama:0.5.13
imagePullPolicy: IfNotPresent
resources: resources:
limits: limits:
nvidia.com/gpu: 1 nvidia.com/gpu: 1

View file

@ -12,7 +12,7 @@ spec:
- https://ollama.leechpepin.com:11434 - https://ollama.leechpepin.com:11434
websocket: websocket:
enabled: true enabled: true
url: redis://redis.core.svc.cluster.local:6379/0 url: redis://redis-svc.core.svc.cluster.local:6379/0
redis: redis:
enabled: false enabled: false
persistence: persistence:
@ -20,7 +20,7 @@ spec:
subPath: "data" subPath: "data"
storageClass: longhorn-private storageClass: longhorn-private
image: image:
tag: 0.5.10 tag: 0.5.20
extraEnvVars: extraEnvVars:
- name: ENABLE_OAUTH_SIGNUP - name: ENABLE_OAUTH_SIGNUP
value: "true" value: "true"

View file

@ -13,5 +13,5 @@ api_endpoint = "http://ollama-svc:11434/v1"
# Embedding model # Embedding model
[model.embedding.http] [model.embedding.http]
kind = "ollama/embedding" kind = "ollama/embedding"
model_name = "ordis/jina-embeddings-v2-base-code" model_name = "ordis/jina-embeddings-v2-base-code:latest"
api_endpoint = "http://ollama-svc:11434" api_endpoint = "http://ollama-svc:11434"

View file

@ -12,7 +12,8 @@ spec:
effect: "NoSchedule" effect: "NoSchedule"
containers: containers:
- name: tabby - name: tabby
image: tabbyml/tabby:latest image: tabbyml/tabby:0.25.2
imagePullPolicy: IfNotPresent
ports: ports:
- name: tabby - name: tabby
containerPort: 8080 containerPort: 8080

View file

@ -0,0 +1,94 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
transformers:
- |-
apiVersion: builtin
kind: NamespaceTransformer
metadata:
name: notImportantHere
namespace: apps
unsetOnly: true
namePrefix: dolibarr-
resources:
- ../../../kustomize/public-oidc/
replacements:
- source:
kind: Service
name: svc
targets:
- select:
kind: HTTPRoute
options:
create: true
fieldPaths:
- spec.rules.0.backendRefs.0.name
- source:
kind: Deployment
fieldPath: metadata.labels.[app.kubernetes.io/appName]
targets:
- select:
kind: HTTPRoute
options:
create: true
delimiter: "."
index: 0
fieldPaths:
- spec.hostnames.0
- select:
kind: InfisicalSecret
options:
delimiter: "-"
index: 0
fieldPaths:
- spec.managedSecretReference.secretName
- select:
kind: InfisicalSecret
options:
delimiter: "/"
index: 2
fieldPaths:
- spec.authentication.universalAuth.secretsScope.secretsPath
- select:
kind: Service
fieldPaths:
- spec.ports.0.name
- spec.ports.0.targetPort
- source:
kind: Deployment
fieldPath: metadata.labels.[app.kubernetes.io/appNamespace]
targets:
- select:
kind: InfisicalSecret
fieldPaths:
- spec.managedSecretReference.secretNamespace
patches:
- path: patches/deployment.yaml
target:
kind: Deployment
- path: patches/pvc.yaml
target:
kind: PersistentVolumeClaim
labels:
- includeSelectors: true
pairs:
app.kubernetes.io/appName: dolibarr
- pairs:
app.kubernetes.io/appNamespace: apps
configMapGenerator:
- name: config
literals:
- PHP_INI_DATE_TIMEZONE=America/New_York
- DOLI_INSTALL_AUTO=0
- DOLI_DB_TYPE=pgsql
- DOLI_DB_HOST=postgres-svc.core.svc.cluster.local
- DOLI_DB_HOST_PORT=5432
- DOLI_DB_USER=dolidbuser
- DOLI_COMPANY_NAME="JLP Tech Consulting, LLC"
- DOLI_COMPANY_COUNTRYCODE="US"
- DOLI_URL_ROOT=https://dolibarr.leechpepin.com

View file

@ -0,0 +1,47 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
template:
spec:
containers:
- name: dolibarr
image: dolibarr/dolibarr:20.0.3
envFrom:
- configMapRef:
name: dolibarr-config
env:
- name: DOLI_DB_PASSWORD
valueFrom:
secretKeyRef:
name: dolibarr-secrets
key: DB_PASSWORD
optional: false
- name: DOLI_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: dolibarr-secrets
key: ADMIN_PASSWORD
optional: false
- name: DOLI_INSTANCE_UNIQUE_ID
valueFrom:
secretKeyRef:
name: dolibarr-secrets
key: SECRET_KEY
optional: false
ports:
- containerPort: 80
protocol: TCP
name: dolibarr
volumeMounts:
- mountPath: /var/www/documents
name: dolibarr
subPath: "documents"
- mountPath: /var/www/html/custom
name: dolibarr
subPath: html_custom
volumes:
- name: dolibarr
persistentVolumeClaim:
claimName: dolibarr-pvc

View file

@ -0,0 +1,8 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
spec:
resources:
requests:
storage: 10Gi

View file

@ -100,7 +100,7 @@ configMapGenerator:
- USER_UID=1000 - USER_UID=1000
- USER_GID=1000 - USER_GID=1000
- FORGEJO__database__DB_TYPE=postgres - FORGEJO__database__DB_TYPE=postgres
- FORGEJO__database__HOST=postgres.core.svc.cluster.local:5432 - FORGEJO__database__HOST=postgres-svc.core.svc.cluster.local:5432
- FORGEJO__database__NAME=forgejo - FORGEJO__database__NAME=forgejo
- FORGEJO__database__USER=forgejo - FORGEJO__database__USER=forgejo
- FORGEJO__mailer__ENABLED=true - FORGEJO__mailer__ENABLED=true

View file

@ -84,8 +84,8 @@ configMapGenerator:
- name: config - name: config
literals: literals:
- NEXTAUTH_URL="https://linkwarden.leechpepin.com/api/v1/auth" - NEXTAUTH_URL="https://linkwarden.leechpepin.com/api/v1/auth"
- NEXT_PUBLIC_OLLAMA_ENDPOINT_URL="http://ollama.ai.svc.cluster.local:11434" - NEXT_PUBLIC_OLLAMA_ENDPOINT_URL="https://ollama.leechpepin.com:11434"
- OLLAMA_MODEL="phi3:mini-4k" - OLLAMA_MODEL="granite3.1-moe:3b"
- NEXT_PUBLIC_AUTHENTIK_ENABLED="true" - NEXT_PUBLIC_AUTHENTIK_ENABLED="true"
- AUTHENTIK_CUSTOM_NAME="Authentik" - AUTHENTIK_CUSTOM_NAME="Authentik"
- AUTHENTIK_ISSUER="https://auth.leechpepin.com/application/o/linkwarden" - AUTHENTIK_ISSUER="https://auth.leechpepin.com/application/o/linkwarden"

View file

@ -88,7 +88,7 @@ configMapGenerator:
# Database Settings # Database Settings
- DB_ENGINE=postgres - DB_ENGINE=postgres
- POSTGRES_USER=mealie - POSTGRES_USER=mealie
- POSTGRES_SERVER=postgres.core.svc.cluster.local - POSTGRES_SERVER=postgres-svc.core.svc.cluster.local
- POSTGRES_PORT=5432 - POSTGRES_PORT=5432
- POSTGRES_DB=mealie - POSTGRES_DB=mealie
# Use Ollama # Use Ollama

View file

@ -91,8 +91,8 @@ labels:
configMapGenerator: configMapGenerator:
- name: config - name: config
literals: literals:
- PAPERLESS_REDIS=redis://redis.core.svc.cluster.local - PAPERLESS_REDIS=redis://redis-svc.core.svc.cluster.local
- PAPERLESS_DBHOST=postgres.core.svc.cluster.local - PAPERLESS_DBHOST=postgres-svc.core.svc.cluster.local
- PAPERLESS_DBUSER=paperless - PAPERLESS_DBUSER=paperless
- PAPERLESS_DBNAME=paperlessdb - PAPERLESS_DBNAME=paperlessdb
- PAPERLESS_TIKA_ENABLED="1" - PAPERLESS_TIKA_ENABLED="1"

View file

@ -0,0 +1,28 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: smtp-secrets
namespace: infisical
labels:
label-to-be-passed-to-managed-secret: homelab
annotations:
example.com/annotation-to-be-passed-to-managed-secret: "homelab"
spec:
hostAPI: https://app.infisical.com/api
resyncInterval: 10
authentication:
# Universal Auth
universalAuth:
secretsScope:
projectSlug: homelab-n-f-yj
envSlug: prod
secretsPath: "/" # Root is "/"
recursive: false # Whether or not to use recursive mode (Fetches all secrets in an environment from a given secret path, and all folders inside the path) / defaults to false
credentialsRef:
secretName: universal-auth-credentials
secretNamespace: infisical
managedSecretReference:
secretName: smtp-secrets
secretNamespace: apps
creationPolicy: "Orphan" ## Owner | Orphan
---

View file

@ -83,3 +83,10 @@ labels:
configMapGenerator: configMapGenerator:
- name: config - name: config
literals: literals:
- SIGNUPS_ALLOWED="false"
- PUSH_ENABLED="true"
- DOMAIN=https://vaultwarden.leechpepin.com
- SMTP_FROM=homelab@leechpepin.com
- SMTP_FROM_NAME="Vaultwarden"
- SMTP_USERNAME=homelab
- SMTP_HOST=blizzard.mxrouting.net

View file

@ -7,7 +7,8 @@ spec:
spec: spec:
containers: containers:
- name: vaultwarden - name: vaultwarden
image: vaultwarden/server:latest image: vaultwarden/server:1.33.2
imagePullPolicy: IfNotPresent
envFrom: envFrom:
- configMapRef: - configMapRef:
name: vaultwarden-config name: vaultwarden-config

View file

@ -0,0 +1,29 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
transformers:
- |-
apiVersion: builtin
kind: NamespaceTransformer
metadata:
name: notImportantHere
namespace: cert-manager
unsetOnly: true
namePrefix: cert-manager-
resources:
- ../../../kustomize/helmchart-noaddons
- extras/cloudflare-token.yaml
patches:
- path: patches/chart.yaml
target:
kind: HelmChart
name: chart
labels:
- includeSelectors: true
pairs:
app.kubernetes.io/appName: cert-manager
- pairs:
app.kubernetes.io/appNamespace: cert-manager

View file

@ -0,0 +1,7 @@
---
apiVersion: v1
kind: Namespace
metadata:
labels:
homelab-access: "true"
name: charts

View file

@ -0,0 +1,12 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: backup-pvc
namespace: core
spec:
storageClassName: longhorn-private
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi

View file

@ -0,0 +1,7 @@
---
apiVersion: v1
kind: Namespace
metadata:
labels:
homelab-access: "true"
name: core

View file

@ -0,0 +1,51 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
transformers:
- |-
apiVersion: builtin
kind: NamespaceTransformer
metadata:
name: notImportantHere
namespace: core
unsetOnly: true
namePrefix: pgdump-
resources:
- ../../../kustomize/backups/
labels:
- includeSelectors: true
pairs:
app.kubernetes.io/appName: pgdump
- pairs:
app.kubernetes.io/appNamespace: core
configMapGenerator:
- name: config
literals:
- HEALTHCHECK_BASE_URL="https://healthchecks.leechpepin.com"
- HEALTHCHECK_ID="ping/7iBSS9akyokIWq-sbfEjHQ/pgdump"
- ROTATE_PREFIX="pgdump"
- BACKUP_COMMAND="pg_dumpall -U postgres -h postgres-svc.core -p 5432"
patches:
- path: patches/batch.yaml
target:
kind: CronJob
name: backup
replacements:
- source:
kind: CronJob
name: backup
fieldPath: metadata.labels.[app.kubernetes.io/appName]
targets:
- select:
kind: CronJob
name: backup
options:
delimiter: "-"
index: 0
fieldPaths:
- spec.jobTemplate.spec.template.spec.containers.0.envFrom.0.configMapRef.name

View file

@ -0,0 +1,13 @@
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: cimg/postgres:17.4

View file

@ -0,0 +1,16 @@
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: TCPRoute
metadata:
name: tcproute
namespace: core
spec:
parentRefs:
- name: homelab-gateway
sectionName: postgres
kind: Gateway
namespace: homelab
rules:
- backendRefs:
- name: postgres-svc
namespace: core
port: 5432

View file

@ -0,0 +1,97 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
transformers:
- |-
apiVersion: builtin
kind: NamespaceTransformer
metadata:
name: notImportantHere
namespace: core
unsetOnly: true
namePrefix: postgres-
resources:
- ../../../kustomize/statefulset/
- extras/tcproute.yaml
labels:
- includeSelectors: true
pairs:
app.kubernetes.io/appName: postgres
- pairs:
app.kubernetes.io/appNamespace: core
patches:
- path: patches/statefulset.yaml
target:
kind: StatefulSet
name: ss
- path: patches/httproutes-delete.yaml
target:
kind: HTTPRoute
replacements:
- source:
kind: StatefulSet
name: ss
fieldPath: metadata.labels.[app.kubernetes.io/appNamespace]
targets:
- select:
kind: InfisicalSecret
fieldPaths:
- spec.managedSecretReference.secretNamespace
- select:
kind: InfisicalSecret
options:
delimiter: "/"
index: 1
fieldPaths:
- spec.authentication.universalAuth.secretsScope.secretsPath
- source:
kind: StatefulSet
name: ss
fieldPath: metadata.labels.[app.kubernetes.io/appName]
targets:
- select:
kind: StatefulSet
options:
delimiter: "-"
index: 0
fieldPaths:
- spec.volumeClaimTemplates.0.metadata.annotations.name
- spec.volumeClaimTemplates.0.metadata.name
- spec.serviceName
- select:
kind: InfisicalSecret
options:
delimiter: "-"
index: 0
fieldPaths:
- spec.managedSecretReference.secretName
- select:
kind: InfisicalSecret
options:
delimiter: "/"
index: 2
fieldPaths:
- spec.authentication.universalAuth.secretsScope.secretsPath
- source:
kind: StatefulSet
name: ss
fieldPath: spec.template.spec.containers.0.ports.0.name
targets:
- select:
kind: Service
fieldPaths:
- spec.ports.0.name
- spec.ports.0.targetPort
- source:
kind: StatefulSet
name: ss
fieldPath: spec.template.spec.containers.0.ports.0.containerPort
targets:
- select:
kind: Service
fieldPaths:
- spec.ports.0.port

View file

@ -0,0 +1,5 @@
$patch: delete
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: https

View file

@ -0,0 +1,46 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: app
spec:
template:
spec:
securityContext:
fsGroup: 999
containers:
- name: postgres
image: postgres:17.4
ports:
- name: postgres
containerPort: 5432
protocol: TCP
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgres-data
subPath: "data"
env:
- name: POSTGRES_USER
value: postgres
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
key: ROOT_PASSWORD
name: postgres-secrets
startupProbe:
exec:
command:
- /bin/sh
- -c
- exec pg_isready -U ${POSTGRES_USER}
livenessProbe:
exec:
command:
- /bin/sh
- -c
- exec pg_isready -U ${POSTGRES_USER}
readinessProbe:
exec:
command:
- /bin/sh
- -c
- exec pg_isready -U ${POSTGRES_USER}

View file

@ -0,0 +1,112 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
transformers:
- |-
apiVersion: builtin
kind: NamespaceTransformer
metadata:
name: notImportantHere
namespace: core
unsetOnly: true
namePrefix: redis-
resources:
- ../../../kustomize/statefulset/
labels:
- includeSelectors: true
pairs:
app.kubernetes.io/appName: redis
- pairs:
app.kubernetes.io/appNamespace: core
patches:
- path: patches/statefulset.yaml
target:
kind: StatefulSet
name: ss
replacements:
- source:
kind: StatefulSet
name: ss
fieldPath: metadata.labels.[app.kubernetes.io/appNamespace]
targets:
- select:
kind: InfisicalSecret
fieldPaths:
- spec.managedSecretReference.secretNamespace
- select:
kind: InfisicalSecret
options:
delimiter: "/"
index: 1
fieldPaths:
- spec.authentication.universalAuth.secretsScope.secretsPath
- source:
kind: StatefulSet
name: ss
fieldPath: metadata.labels.[app.kubernetes.io/appName]
targets:
- select:
kind: StatefulSet
options:
delimiter: "-"
index: 0
fieldPaths:
- spec.volumeClaimTemplates.0.metadata.annotations.name
- spec.volumeClaimTemplates.0.metadata.name
- spec.serviceName
- select:
kind: InfisicalSecret
options:
delimiter: "-"
index: 0
fieldPaths:
- spec.managedSecretReference.secretName
- select:
kind: InfisicalSecret
options:
delimiter: "/"
index: 2
fieldPaths:
- spec.authentication.universalAuth.secretsScope.secretsPath
- select:
kind: HTTPRoute
options:
create: true
delimiter: "."
index: 0
fieldPaths:
- spec.hostnames.0
- source:
kind: StatefulSet
name: ss
fieldPath: spec.template.spec.containers.0.ports.0.name
targets:
- select:
kind: Service
fieldPaths:
- spec.ports.0.name
- spec.ports.0.targetPort
- source:
kind: Service
targets:
- select:
kind: HTTPRoute
fieldPaths:
- spec.rules.0.backendRefs.0.name
- source:
kind: StatefulSet
name: ss
fieldPath: spec.template.spec.containers.0.ports.0.containerPort
targets:
- select:
kind: Service
fieldPaths:
- spec.ports.0.port
- select:
kind: HTTPRoute
fieldPaths:
- spec.rules.0.backendRefs.0.port

View file

@ -0,0 +1,19 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: app
spec:
template:
spec:
restartPolicy: Always
containers:
- name: redis
image: redis:7.4.2-alpine3.21
ports:
- name: redis
containerPort: 6379
protocol: TCP
volumeMounts:
- mountPath: /data
name: redis-data
subPath: "data"

View file

@ -1,8 +1,7 @@
---
apiVersion: secrets.infisical.com/v1alpha1 apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret kind: InfisicalSecret
metadata: metadata:
name: homelab-sslcert-secrets name: core-postgres-secrets
namespace: infisical namespace: infisical
labels: labels:
label-to-be-passed-to-managed-secret: homelab label-to-be-passed-to-managed-secret: homelab
@ -17,17 +16,12 @@ spec:
secretsScope: secretsScope:
projectSlug: homelab-n-f-yj projectSlug: homelab-n-f-yj
envSlug: prod envSlug: prod
secretsPath: "/homelab" # Root is "/" secretsPath: "/core/postgres" # Root is "/"
recursive: true # Whether or not to use recursive mode (Fetches all secrets in an environment from a given secret path, and all folders inside the path) / defaults to false recursive: true # Whether or not to use recursive mode (Fetches all secrets in an environment from a given secret path, and all folders inside the path) / defaults to false
credentialsRef: credentialsRef:
secretName: universal-auth-credentials secretName: universal-auth-credentials
secretNamespace: infisical secretNamespace: infisical
managedSecretReference: managedSecretReference:
secretName: infisical-self-signed-cert secretName: postgres-secrets
secretNamespace: homelab secretNamespace: core
creationPolicy: "Orphan" ## Owner | Orphan creationPolicy: "Orphan" ## Owner | Orphan
secretType: kubernetes.io/tls
template:
data:
tls.crt: "{{ .TLS_CERT.Value }}"
tls.key: "{{ .TLS_KEY.Value }}"

View file

@ -0,0 +1,91 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: syncthing
namespace: core
spec:
replicas: 1
selector:
matchLabels:
name: syncthing
template:
metadata:
labels:
name: syncthing
spec:
restartPolicy: Always
containers:
- name: syncthing
image: syncthing/syncthing:latest
ports:
- name: http
containerPort: 8384
protocol: TCP
volumeMounts:
- mountPath: /var/syncthing
name: syncthing-data
subPath: "data"
env:
- name: PUID
value: "976"
- name: PGID
value: "976"
volumes:
- name: syncthing-data
persistentVolumeClaim:
claimName: syncthing-data
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: syncthing-data
namespace: core
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn-private
resources:
requests:
storage: 50Gi
---
apiVersion: v1
kind: Service
metadata:
name: syncthing
namespace: core
spec:
type: ClusterIP
selector:
name: syncthing
ports:
- port: 8384
name: http
targetPort: http
protocol: TCP
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: syncthing
namespace: core
spec:
parentRefs:
- name: homelab-gateway
sectionName: web
kind: Gateway
namespace: homelab
hostnames:
- syncthing.leechpepin.local
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: syncthing
namespace: core
port: 8384

View file

@ -0,0 +1,28 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
transformers:
- |-
apiVersion: builtin
kind: NamespaceTransformer
metadata:
name: notImportantHere
namespace: infisical
unsetOnly: true
namePrefix: infisical-
resources:
- ../../../kustomize/helmchart-noaddons
patches:
- path: patches/chart.yaml
target:
kind: HelmChart
name: chart
labels:
- includeSelectors: true
pairs:
app.kubernetes.io/appName: infisical
- pairs:
app.kubernetes.io/appNamespace: infisical

View file

@ -7,7 +7,6 @@ metadata:
- wrangler.cattle.io/on-helm-chart-remove - wrangler.cattle.io/on-helm-chart-remove
generation: 1 generation: 1
name: infisical-install name: infisical-install
namespace: default
spec: spec:
chart: secrets-operator chart: secrets-operator
repo: https://dl.cloudsmith.io/public/infisical/helm-charts/helm/charts/ repo: https://dl.cloudsmith.io/public/infisical/helm-charts/helm/charts/

View file

@ -0,0 +1,7 @@
---
apiVersion: v1
kind: Namespace
metadata:
labels:
homelab-access: "false"
name: infisical

View file

@ -1,39 +0,0 @@
apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
name: allow-routes-to-services
namespace: longhorn-system
spec:
from:
- group: gateway.networking.k8s.io
kind: HTTPRoute
namespace: traefik
to:
- group: ""
kind: Service
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: longhorn-ui
namespace: traefik
spec:
parentRefs:
- name: traefik-gateway
sectionName: web
kind: Gateway
namespace: traefik
hostnames:
- longhorn.leechpepin.local
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: longhorn-frontend
namespace: longhorn-system
port: 80

View file

@ -1,23 +0,0 @@
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: longhorn-private
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
numberOfReplicas: "2"
dataLocality: "best-effort"
diskSelector: "private"
nodeSelector: "private"
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: longhorn-public
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
numberOfReplicas: "2"
dataLocality: "best-effort"
diskSelector: "public"

View file

@ -0,0 +1,12 @@
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: private
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
numberOfReplicas: "2"
dataLocality: "best-effort"
diskSelector: "private"
nodeSelector: "private"

View file

@ -0,0 +1,11 @@
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: public
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
numberOfReplicas: "2"
dataLocality: "best-effort"
diskSelector: "public"

View file

@ -0,0 +1,99 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
transformers:
- |-
apiVersion: builtin
kind: NamespaceTransformer
metadata:
name: notImportantHere
namespace: longhorn
unsetOnly: true
namePrefix: longhorn-
resources:
- ../../../kustomize/helmchart
- extras/longhorn-public-storageclass.yaml
- extras/longhorn-private-storageclass.yaml
patches:
- path: patches/chart.yaml
target:
kind: HelmChart
name: chart
- path: patches/secrets.yaml
target:
kind: InfisicalSecret
name: secrets
labels:
- includeSelectors: true
pairs:
app.kubernetes.io/appName: longhorn
- pairs:
app.kubernetes.io/appNamespace: longhorn
- pairs:
app.kubernetes.io/chartServiceName: longhorn-frontend
replacements:
- source:
kind: HTTPRoute
name: http
fieldPath: metadata.labels.[app.kubernetes.io/chartServiceName]
targets:
- select:
kind: HTTPRoute
options:
create: true
delimiter: "."
index: 0
fieldPaths:
- spec.rules.0.backendRefs.0.name
- source:
kind: HTTPRoute
name: http
fieldPath: metadata.labels.[app.kubernetes.io/appName]
targets:
- select:
kind: HTTPRoute
options:
create: true
delimiter: "."
index: 0
fieldPaths:
- spec.hostnames.0
- select:
kind: InfisicalSecret
options:
delimiter: "-"
index: 0
fieldPaths:
- spec.managedSecretReference.secretName
- select:
kind: InfisicalSecret
options:
delimiter: "/"
index: 2
fieldPaths:
- spec.authentication.universalAuth.secretsScope.secretsPath
- source:
kind: HTTPRoute
name: http
fieldPath: metadata.labels.[app.kubernetes.io/appNamespace]
targets:
- select:
kind: HelmChart
name: chart
fieldPaths:
- spec.targetNamespace
- select:
kind: InfisicalSecret
options:
delimiter: "/"
index: 1
fieldPaths:
- spec.authentication.universalAuth.secretsScope.secretsPath
- select:
kind: InfisicalSecret
fieldPaths:
- spec.managedSecretReference.secretNamespace

View file

@ -7,7 +7,6 @@ metadata:
- wrangler.cattle.io/on-helm-chart-remove - wrangler.cattle.io/on-helm-chart-remove
generation: 1 generation: 1
name: longhorn-install name: longhorn-install
namespace: default # This should be elsewhere but changing it would delete
spec: spec:
version: v1.7.2 version: v1.7.2
chart: longhorn chart: longhorn

View file

@ -0,0 +1,5 @@
$patch: delete
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: secrets

View file

@ -0,0 +1,7 @@
---
apiVersion: v1
kind: Namespace
metadata:
labels:
homelab-access: "true"
name: longhorn

View file

@ -96,7 +96,7 @@ configMapGenerator:
literals: literals:
- ADMINS=jonathan@leechpepin.com - ADMINS=jonathan@leechpepin.com
- DB=postgres - DB=postgres
- DB_HOST=postgres.core.svc.cluster.local - DB_HOST=postgres-svc.core.svc.cluster.local
- DB_NAME=hc - DB_NAME=hc
- DB_PORT=5432 - DB_PORT=5432
- DB_USER=hc - DB_USER=hc

View file

@ -0,0 +1,97 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
transformers:
- |-
apiVersion: builtin
kind: NamespaceTransformer
metadata:
name: notImportantHere
namespace: monitoring
unsetOnly: true
namePrefix: umami-
resources:
- ../../../kustomize/public-oidc/
replacements:
- source:
kind: Service
name: svc
targets:
- select:
kind: HTTPRoute
options:
create: true
fieldPaths:
- spec.rules.0.backendRefs.0.name
- source:
kind: Deployment
name: app
fieldPath: metadata.labels.[app.kubernetes.io/appName]
targets:
- select:
kind: HTTPRoute
options:
create: true
delimiter: "."
index: 0
fieldPaths:
- spec.hostnames.0
- select:
kind: InfisicalSecret
options:
delimiter: "-"
index: 0
fieldPaths:
- spec.managedSecretReference.secretName
- select:
kind: InfisicalSecret
options:
delimiter: "/"
index: 2
fieldPaths:
- spec.authentication.universalAuth.secretsScope.secretsPath
- select:
kind: Service
fieldPaths:
- spec.ports.0.name
- spec.ports.0.targetPort
- source:
kind: Deployment
name: app
fieldPath: metadata.labels.[app.kubernetes.io/appNamespace]
targets:
- select:
kind: InfisicalSecret
fieldPaths:
- spec.managedSecretReference.secretNamespace
- select:
kind: InfisicalSecret
options:
delimiter: "/"
index: 1
fieldPaths:
- spec.authentication.universalAuth.secretsScope.secretsPath
patches:
- path: patches/deployment.yaml
target:
kind: Deployment
name: app
- path: patches/delete-pvc.yaml
target:
kind: PersistentVolumeClaim
name: pvc
labels:
- includeSelectors: true
pairs:
app.kubernetes.io/appName: umami
- pairs:
app.kubernetes.io/appNamespace: monitoring
configMapGenerator:
- name: config
literals:
- DATABASE_TYPE=postgresql

View file

@ -0,0 +1,5 @@
$patch: delete
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc

View file

@ -0,0 +1,42 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
template:
spec:
tolerations:
- key: "public"
operator: "Equal"
value: "true"
effect: "NoSchedule"
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: public
operator: In
values:
- "true"
containers:
- name: umami
image: ghcr.io/umami-software/umami:postgresql-v2.17.0
envFrom:
- configMapRef:
name: umami-config
env:
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: umami-secrets
key: UMAMI_APP_SECRET
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: umami-secrets
key: UMAMI_POSTGRESQL_CONNECTION
ports:
- containerPort: 3000
name: umami

View file

@ -0,0 +1,7 @@
---
apiVersion: v1
kind: Namespace
metadata:
labels:
homelab-access: "true"
name: public

View file

@ -0,0 +1,7 @@
---
apiVersion: v1
kind: Namespace
metadata:
labels:
homelab-access: "true"
name: traefik

View file

@ -0,0 +1,28 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
transformers:
- |-
apiVersion: builtin
kind: NamespaceTransformer
metadata:
name: notImportantHere
namespace: traefik
unsetOnly: true
namePrefix: traefik-lb
resources:
- ../../../kustomize/helmchart-noaddons/
patches:
- path: patches/chart.yaml
target:
kind: HelmChart
name: chart
labels:
- includeSelectors: true
pairs:
app.kubernetes.io/appName: traefik-lb
- pairs:
app.kubernetes.io/appNamespace: traefik

View file

@ -34,6 +34,12 @@ spec:
default: true default: true
port: 2222 port: 2222
exposedPort: 2222 exposedPort: 2222
service:
annotations:
svccontroller.k3s.cattle.io/tolerations: |
- effect: NoSchedule
key: public
operator: Exists
tolerations: tolerations:
- key: "public" - key: "public"
value: "true" value: "true"