Compare commits
282 Commits
9d5dd332fc
...
renovate/r
| Author | SHA1 | Date | |
|---|---|---|---|
| 223642ca21 | |||
| 3a57ef6953 | |||
| f4a865ce7a | |||
| e7b3b220aa | |||
| 0642d29ed5 | |||
| 3f044670e0 | |||
| 122770b128 | |||
| d894d42129 | |||
| 3426b1215d | |||
| 73a189f4e8 | |||
| 4518cdda22 | |||
| 3682e4d5bf | |||
| 3135514f6d | |||
| 5e39cc9082 | |||
| 6eed078d30 | |||
| 0bb805eaaa | |||
| c0f9670837 | |||
| 69728501e1 | |||
| 0a516b3798 | |||
| c9bb63b373 | |||
| 5b5043755d | |||
| e0fcaeaad4 | |||
| 102efd1254 | |||
| 5400c69771 | |||
| b6c70c9931 | |||
| 2710996a19 | |||
| 32f8ccfeb8 | |||
| 12aab2bf0e | |||
| 957b6dab43 | |||
| d1b30c7e61 | |||
| d880c342a5 | |||
| ae38951164 | |||
| 1e363acfca | |||
| c78ca0933c | |||
| 9a31c6bf15 | |||
| 45aa92fe10 | |||
| 708ffe203c | |||
| e2c75d2f22 | |||
| 3ceec2f10c | |||
| 95cfbfbe66 | |||
| bf9aefb44a | |||
| 5ffb171821 | |||
| a35116aa31 | |||
| b32337a2ba | |||
| d27b43715c | |||
| 4b0ce7a2e3 | |||
| 7f2ef7270c | |||
| 73a9b275a7 | |||
| 8a61a936c6 | |||
| 1c2f77927f | |||
| 4f5b25d910 | |||
| 7c5fafd54e | |||
| de11ec0d1b | |||
| 07c32643e7 | |||
| 9c61d47fda | |||
| 0f24f1dd7b | |||
| 83e5cada3f | |||
| ccf6302924 | |||
| 5eb0362788 | |||
| 0985832c2d | |||
| db86abff25 | |||
| a1b40a6a21 | |||
| 444c4faf96 | |||
| 9f304af879 | |||
| c0524510b8 | |||
| a26a351396 | |||
| 9269f21692 | |||
| 9d6a9ff304 | |||
| 3cd094007e | |||
| 94a57daaf8 | |||
| 6fec8d29a6 | |||
| 3a94da6021 | |||
| 70511ff9bc | |||
| e8b37d90d8 | |||
| 30b7a78360 | |||
| 2561b354d1 | |||
| 949d8b11db | |||
| 6c46b20dba | |||
| f0f9cb4d34 | |||
| 8386e21722 | |||
| c871dae045 | |||
| 70e4967497 | |||
| 8e68c45573 | |||
| c4628523bc | |||
| 071e87ee44 | |||
| 9e17aadb56 | |||
| 3ca4ddc233 | |||
| 215a2ac1fb | |||
| 5b8a861daa | |||
| 319e3bafbe | |||
| ad1c60a049 | |||
| 41020f8c79 | |||
| 60c7dd4bdc | |||
| 0fde3108d6 | |||
| a299c2cc2b | |||
| a4ea45a39c | |||
| 30bae60308 | |||
| 2f3b7af0da | |||
| 30efd5ae6e | |||
| 0e1279473f | |||
| 718a0d7e33 | |||
| 9765f1cf86 | |||
| 5f3a00b382 | |||
| b379c181f2 | |||
| e1801347f2 | |||
| d53db88fd2 | |||
| 5fb2bcfc7e | |||
| f5da3b52a2 | |||
| c3dbb0a608 | |||
| a520c62277 | |||
| 6cf45eda17 | |||
| 753d43b643 | |||
| 263b60018d | |||
| 0816b6e434 | |||
| 18eb912f03 | |||
| a2c23c5f97 | |||
| 15ce411c3e | |||
| 04a8c98d63 | |||
| f46219f87e | |||
| 53154eeed7 | |||
| 2ad310c550 | |||
| d32d94eb00 | |||
| 5b62f7e386 | |||
| 52124193e2 | |||
| 0f8ee9e53d | |||
| 122c70d0a8 | |||
| 5463d76771 | |||
| 60f2056806 | |||
| 6119ac7271 | |||
| 1a01f82e30 | |||
| 74c9ddad62 | |||
| caf62609d3 | |||
| d5622416de | |||
| 4183831d2f | |||
| ae6ed770a9 | |||
| 59d936d467 | |||
| 9b56ce5e4f | |||
| 2424ad440b | |||
| dff138ba31 | |||
| d95eb6f4ab | |||
| 5252f209f5 | |||
| e7348b2718 | |||
| c7cd2c5355 | |||
| 71e75afadb | |||
| 23169aa2ca | |||
| d8aa0a6a32 | |||
| a6630c0376 | |||
| 9056839784 | |||
| 1f8afa2f8e | |||
| e7b22509cd | |||
| e39574b60e | |||
| 197ceb6688 | |||
| 3e95a5edd1 | |||
| 10fe51f52d | |||
| e197cf5e5e | |||
| c54109dbf3 | |||
| 5a97e4b1d8 | |||
| 12cdfd96e2 | |||
| 7d2056b3ee | |||
| 35e579fc01 | |||
| 302613b76a | |||
| 89542df777 | |||
| 233466e2cd | |||
| 461f0589b3 | |||
| 5c16cd3a4b | |||
| 5cd5263d19 | |||
| a886e7c79c | |||
| dd676716f9 | |||
| 110ffa9c22 | |||
| 6ed7d61e21 | |||
| 051083cd6e | |||
| 87f2446cd1 | |||
| faa55fa069 | |||
| af29de91d6 | |||
| 5f3a775201 | |||
| 81f750e5e5 | |||
| 641e50b5e9 | |||
| 3fe8626391 | |||
| 94f851c607 | |||
| d2134ad554 | |||
| 22910085b7 | |||
| 6a4dee0852 | |||
| 49d5803b4f | |||
| b5c51f6720 | |||
| 3a8dbc6e0c | |||
| ead8be8bcb | |||
| f027dad029 | |||
| e35b8ccac8 | |||
| f69128b245 | |||
| d14b62f384 | |||
| ab7b8a6f26 | |||
| 8acc480b05 | |||
| 65834037ee | |||
| 1bf63168f2 | |||
| b3db332075 | |||
| b84c792992 | |||
| 947f154a81 | |||
| 1a88b1c602 | |||
| 55fce1fc36 | |||
| bb4afc0c07 | |||
| eb92a85cac | |||
| 8f70ae5f2e | |||
| f89a2fd1cc | |||
| b493ee9d77 | |||
| 8de0663571 | |||
| 3fc534f44b | |||
| 1c8ccd0fc4 | |||
| 847fd3557b | |||
| d2c2f5038f | |||
| afb9dcec65 | |||
| ba51980cec | |||
| e0eb26b63d | |||
| eda5ba08a0 | |||
| 318aedf89d | |||
| 7b9090afc1 | |||
| a109290c18 | |||
| f4b9742ab1 | |||
| b103358816 | |||
| 46cacb339d | |||
| 1e7dd52721 | |||
| 044cc37392 | |||
| 68ba891abc | |||
| 81ed455ff8 | |||
| b7c2da4419 | |||
| 4bc01e2e78 | |||
| 94d51de471 | |||
| dc0104c55d | |||
| 83be6619e8 | |||
| 48ccacefdd | |||
| cfeef90515 | |||
| ce0bef4970 | |||
| bd5fd97ed0 | |||
| 52641779bc | |||
| e98e02705d | |||
| 3c849f52f7 | |||
| 36187fff41 | |||
| 1ac7504585 | |||
| 879c013e89 | |||
| aa7fe8d3cf | |||
| fd280f1fca | |||
| 2ad381e35c | |||
| e63a285dc3 | |||
| 5336df3134 | |||
| 966639e3c8 | |||
| 97924a8064 | |||
| 37b78f079e | |||
| 0d17825eab | |||
| ffeecf65f6 | |||
| fea49ae167 | |||
| 6b6e7937c1 | |||
| 487baa2813 | |||
| fe2f79d13c | |||
| c3a747c03c | |||
| f1f6ffb9a0 | |||
| e851f6ab8c | |||
| 2ecd20c9d7 | |||
| bdb3bd3234 | |||
| 47e957e444 | |||
| b2dfb2dc0b | |||
| 6ccc964c87 | |||
| 5c7b258ccf | |||
| 351426f055 | |||
| ca598f9750 | |||
| 0cb93ce8a1 | |||
| 6fde991ba9 | |||
| 5f3840cc02 | |||
| d9a22723ef | |||
| f97a655ad5 | |||
| c2aacd0ef4 | |||
| f36ce88026 | |||
| d19d332b59 | |||
| 5cf9de7997 | |||
| 3c84632a2d | |||
| 14bcc8546c | |||
| ca8a63fdbe | |||
| 3a46d17f02 | |||
| add851ee9e | |||
| edbfd26bde | |||
| dea0dfb7cc | |||
| 874fc826cd | |||
| 33cb5c72c7 | |||
| 31df54fcf0 |
6
.vscode/extensions.json
vendored
6
.vscode/extensions.json
vendored
@@ -1,3 +1,7 @@
|
||||
{
|
||||
"recommendations": ["arrterian.nix-env-selector", "jnoortheen.nix-ide"]
|
||||
"recommendations": [
|
||||
"arrterian.nix-env-selector",
|
||||
"jnoortheen.nix-ide",
|
||||
"detachhead.basedpyright"
|
||||
]
|
||||
}
|
||||
|
||||
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -8,5 +8,6 @@
|
||||
}
|
||||
},
|
||||
"terminal.integrated.defaultProfile.linux": "Nix Shell",
|
||||
"ansible.python.interpreterPath": "/bin/python"
|
||||
"ansible.python.interpreterPath": "/bin/python",
|
||||
"python.defaultInterpreterPath": "${env:PYTHON_BIN}"
|
||||
}
|
||||
|
||||
12
Makefile
12
Makefile
@@ -3,7 +3,17 @@ install-router:
|
||||
|
||||
gen-talos-config:
|
||||
mkdir -p talos/generated
|
||||
talosctl gen config --with-secrets secrets.yaml --config-patch @talos/patches/controlplane.patch --config-patch @talos/patches/openebs.patch --config-patch @talos/patches/openbao.patch --config-patch @talos/patches/anapistula-delrosalae.patch --output-types controlplane -o talos/generated/anapistula-delrosalae.yaml homelab https://kube-api.homelab.lumpiasty.xyz:6443
|
||||
talosctl gen config \
|
||||
--with-secrets secrets.yaml \
|
||||
--config-patch @talos/patches/controlplane.patch \
|
||||
--config-patch @talos/patches/openebs.patch \
|
||||
--config-patch @talos/patches/openbao.patch \
|
||||
--config-patch @talos/patches/ollama.patch \
|
||||
--config-patch @talos/patches/llama.patch \
|
||||
--config-patch @talos/patches/frigate.patch \
|
||||
--config-patch @talos/patches/anapistula-delrosalae.patch \
|
||||
--output-types controlplane -o talos/generated/anapistula-delrosalae.yaml \
|
||||
homelab https://kube-api.homelab.lumpiasty.xyz:6443
|
||||
talosctl gen config --with-secrets secrets.yaml --config-patch @talos/patches/controlplane.patch --output-types worker -o talos/generated/worker.yaml homelab https://kube-api.homelab.lumpiasty.xyz:6443
|
||||
talosctl gen config --with-secrets secrets.yaml --output-types talosconfig -o talos/generated/talosconfig homelab https://kube-api.homelab.lumpiasty.xyz:6443
|
||||
talosctl config endpoint kube-api.homelab.lumpiasty.xyz
|
||||
|
||||
7
apps/frigate/kustomization.yaml
Normal file
7
apps/frigate/kustomization.yaml
Normal file
@@ -0,0 +1,7 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- namespace.yaml
|
||||
- secret.yaml
|
||||
- release.yaml
|
||||
- webrtc-svc.yaml
|
||||
5
apps/frigate/namespace.yaml
Normal file
5
apps/frigate/namespace.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: frigate
|
||||
179
apps/frigate/release.yaml
Normal file
179
apps/frigate/release.yaml
Normal file
@@ -0,0 +1,179 @@
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: blakeblackshear
|
||||
namespace: frigate
|
||||
spec:
|
||||
interval: 24h
|
||||
url: https://blakeblackshear.github.io/blakeshome-charts/
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: frigate
|
||||
namespace: frigate
|
||||
spec:
|
||||
interval: 30m
|
||||
chart:
|
||||
spec:
|
||||
chart: frigate
|
||||
version: 7.8.0
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: blakeblackshear
|
||||
namespace: frigate
|
||||
interval: 12h
|
||||
values:
|
||||
config: |
|
||||
mqtt:
|
||||
enabled: False
|
||||
|
||||
tls:
|
||||
enabled: False
|
||||
|
||||
auth:
|
||||
enabled: True
|
||||
cookie_secure: True
|
||||
|
||||
record:
|
||||
enabled: True
|
||||
retain:
|
||||
days: 90
|
||||
mode: motion
|
||||
|
||||
objects:
|
||||
track:
|
||||
- person
|
||||
- bicycle
|
||||
- car
|
||||
- motorcycle
|
||||
- cat
|
||||
- dog
|
||||
- horse
|
||||
- sheep
|
||||
- cow
|
||||
- bear
|
||||
|
||||
review:
|
||||
alerts:
|
||||
labels:
|
||||
- person
|
||||
- bicycle
|
||||
- car
|
||||
- motorcycle
|
||||
- cat
|
||||
- dog
|
||||
- horse
|
||||
- sheep
|
||||
- cow
|
||||
- bear
|
||||
|
||||
cameras:
|
||||
dom:
|
||||
enabled: True
|
||||
ffmpeg:
|
||||
inputs:
|
||||
- path: rtsp://127.0.0.1:8554/dom
|
||||
roles:
|
||||
- audio
|
||||
- detect
|
||||
- record
|
||||
output_args:
|
||||
record: preset-record-generic-audio-copy
|
||||
motion:
|
||||
mask:
|
||||
# Sasiad
|
||||
- 0.436,0,0.421,0.072,0.424,0.124,0.304,0.242,0.295,0.194,0.035,0.497,0.035,0.6,0,0.664,0,0
|
||||
garaz:
|
||||
enabled: True
|
||||
ffmpeg:
|
||||
inputs:
|
||||
- path: rtsp://127.0.0.1:8554/garaz
|
||||
roles:
|
||||
- audio
|
||||
- detect
|
||||
- record
|
||||
output_args:
|
||||
record: preset-record-generic-audio-copy
|
||||
motion:
|
||||
mask:
|
||||
# Sasiad
|
||||
- 0.662,0.212,0.569,0.2,0.566,0.149,0.549,0.119,0.532,0.169,0.495,0.14,0.491,0,0.881,0,1,0.154,1,0.221,0.986,0.296,0.94,0.28,0.944,0.178,0.664,0.126
|
||||
# Drzewo
|
||||
- 0.087,0.032,0,0.174,0,0.508,0.139,0.226,0.12,0.108
|
||||
objects:
|
||||
filters:
|
||||
person:
|
||||
# Uparty false positive
|
||||
mask: 0.739,0.725,0.856,0.76,0.862,0.659,0.746,0.614
|
||||
|
||||
# ffmpeg:
|
||||
# hwaccel_args: preset-vaapi
|
||||
|
||||
detectors:
|
||||
ov_0:
|
||||
type: openvino
|
||||
device: CPU
|
||||
model:
|
||||
width: 300
|
||||
height: 300
|
||||
input_tensor: nhwc
|
||||
input_pixel_format: bgr
|
||||
path: /openvino-model/ssdlite_mobilenet_v2.xml
|
||||
labelmap_path: /openvino-model/coco_91cl_bkgr.txt
|
||||
|
||||
go2rtc:
|
||||
streams:
|
||||
dom:
|
||||
- rtsp://{FRIGATE_RTSP_DOM_USER}:{FRIGATE_RTSP_DOM_PASSWORD_URLENCODED}@192.168.3.10:554/Streaming/Channels/101
|
||||
garaz:
|
||||
- rtsp://{FRIGATE_RTSP_GARAZ_USER}:{FRIGATE_RTSP_GARAZ_PASSWORD_URLENCODED}@192.168.3.11:554/Streaming/Channels/101
|
||||
webrtc:
|
||||
candidates:
|
||||
- frigate-rtc.lumpiasty.xyz:8555
|
||||
persistence:
|
||||
media:
|
||||
enabled: true
|
||||
size: 500Gi
|
||||
storageClass: mayastor-single-hdd
|
||||
skipuninstall: true
|
||||
config:
|
||||
enabled: true
|
||||
size: 5Gi
|
||||
storageClass: mayastor-single-hdd
|
||||
skipuninstall: true
|
||||
envFromSecrets:
|
||||
- frigate-camera-rtsp
|
||||
|
||||
ingress:
|
||||
enabled: true
|
||||
ingressClassName: nginx-ingress
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt
|
||||
hosts:
|
||||
- host: frigate.lumpiasty.xyz
|
||||
paths:
|
||||
- path: /
|
||||
portName: http-auth
|
||||
tls:
|
||||
- hosts:
|
||||
- frigate.lumpiasty.xyz
|
||||
secretName: frigate-ingress
|
||||
|
||||
nodeSelector:
|
||||
kubernetes.io/hostname: anapistula-delrosalae
|
||||
|
||||
# GPU access
|
||||
# extraVolumes:
|
||||
# - name: dri
|
||||
# hostPath:
|
||||
# path: /dev/dri/renderD128
|
||||
# type: CharDevice
|
||||
|
||||
# extraVolumeMounts:
|
||||
# - name: dri
|
||||
# mountPath: /dev/dri/renderD128
|
||||
|
||||
# securityContext:
|
||||
# # Not ideal
|
||||
# privileged: true
|
||||
43
apps/frigate/secret.yaml
Normal file
43
apps/frigate/secret.yaml
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: camera
|
||||
namespace: frigate
|
||||
---
|
||||
apiVersion: secrets.hashicorp.com/v1beta1
|
||||
kind: VaultAuth
|
||||
metadata:
|
||||
name: camera
|
||||
namespace: frigate
|
||||
spec:
|
||||
method: kubernetes
|
||||
mount: kubernetes
|
||||
kubernetes:
|
||||
role: frigate-camera
|
||||
serviceAccount: camera
|
||||
---
|
||||
apiVersion: secrets.hashicorp.com/v1beta1
|
||||
kind: VaultStaticSecret
|
||||
metadata:
|
||||
name: frigate-camera-rtsp
|
||||
namespace: frigate
|
||||
spec:
|
||||
type: kv-v2
|
||||
|
||||
mount: secret
|
||||
path: cameras
|
||||
|
||||
destination:
|
||||
create: true
|
||||
name: frigate-camera-rtsp
|
||||
type: Opaque
|
||||
transformation:
|
||||
excludeRaw: true
|
||||
templates:
|
||||
FRIGATE_RTSP_DOM_PASSWORD_URLENCODED:
|
||||
text: '{{ urlquery (get .Secrets "FRIGATE_RTSP_DOM_PASSWORD") }}'
|
||||
FRIGATE_RTSP_GARAZ_PASSWORD_URLENCODED:
|
||||
text: '{{ urlquery (get .Secrets "FRIGATE_RTSP_GARAZ_PASSWORD") }}'
|
||||
|
||||
vaultAuthRef: camera
|
||||
20
apps/frigate/webrtc-svc.yaml
Normal file
20
apps/frigate/webrtc-svc.yaml
Normal file
@@ -0,0 +1,20 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: go2rtc
|
||||
namespace: frigate
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
selector:
|
||||
app.kubernetes.io/instance: frigate
|
||||
app.kubernetes.io/name: frigate
|
||||
ipFamilyPolicy: RequireDualStack
|
||||
ports:
|
||||
- name: webrtc-tcp
|
||||
protocol: TCP
|
||||
port: 8555
|
||||
targetPort: webrtc-tcp
|
||||
- name: webrtc-udp
|
||||
protocol: UDP
|
||||
port: 8555
|
||||
targetPort: webrtc-udp
|
||||
33
apps/gitea/backups.yaml
Normal file
33
apps/gitea/backups.yaml
Normal file
@@ -0,0 +1,33 @@
|
||||
apiVersion: k8up.io/v1
|
||||
kind: Schedule
|
||||
metadata:
|
||||
name: gitea-backup
|
||||
namespace: gitea
|
||||
spec:
|
||||
backend:
|
||||
# Manually adding secrets for now
|
||||
repoPasswordSecretRef:
|
||||
name: gitea-backup-restic
|
||||
key: password
|
||||
s3:
|
||||
endpoint: https://s3.eu-central-003.backblazeb2.com
|
||||
bucket: lumpiasty-backups
|
||||
accessKeyIDSecretRef:
|
||||
name: gitea-backup-backblaze
|
||||
key: aws_access_key_id
|
||||
secretAccessKeySecretRef:
|
||||
name: gitea-backup-backblaze
|
||||
key: aws_secret_access_key
|
||||
backup:
|
||||
schedule: "@daily-random"
|
||||
failedJobsHistoryLimit: 2
|
||||
successfulJobsHistoryLimit: 2
|
||||
check:
|
||||
schedule: "@daily-random"
|
||||
prune:
|
||||
schedule: "@daily-random"
|
||||
retention:
|
||||
keepLast: 14
|
||||
keepDaily: 14
|
||||
keepWeekly: 50
|
||||
keepYearly: 10
|
||||
8
apps/gitea/kustomization.yaml
Normal file
8
apps/gitea/kustomization.yaml
Normal file
@@ -0,0 +1,8 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- namespace.yaml
|
||||
- postgres-cluster.yaml
|
||||
- release.yaml
|
||||
- secret.yaml
|
||||
- backups.yaml
|
||||
5
apps/gitea/namespace.yaml
Normal file
5
apps/gitea/namespace.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: gitea
|
||||
12
apps/gitea/postgres-cluster.yaml
Normal file
12
apps/gitea/postgres-cluster.yaml
Normal file
@@ -0,0 +1,12 @@
|
||||
---
|
||||
apiVersion: postgresql.cnpg.io/v1
|
||||
kind: Cluster
|
||||
metadata:
|
||||
name: gitea-postgresql-cluster
|
||||
namespace: gitea
|
||||
spec:
|
||||
instances: 1
|
||||
|
||||
storage:
|
||||
size: 10Gi
|
||||
storageClass: mayastor-single-hdd
|
||||
@@ -1,9 +1,3 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: gitea
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
@@ -23,7 +17,7 @@ spec:
|
||||
chart:
|
||||
spec:
|
||||
chart: gitea
|
||||
version: 10.6.0
|
||||
version: 12.4.0
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: gitea-charts
|
||||
@@ -34,7 +28,7 @@ spec:
|
||||
enabled: false
|
||||
|
||||
postgresql:
|
||||
enabled: true
|
||||
enabled: false
|
||||
primary:
|
||||
persistence:
|
||||
enabled: true
|
||||
@@ -43,12 +37,12 @@ spec:
|
||||
requests:
|
||||
cpu: 0
|
||||
|
||||
redis-cluster:
|
||||
valkey-cluster:
|
||||
enabled: false
|
||||
|
||||
redis:
|
||||
valkey:
|
||||
enabled: true
|
||||
master:
|
||||
primary:
|
||||
persistence:
|
||||
enabled: true
|
||||
storageClass: mayastor-single-hdd
|
||||
@@ -60,13 +54,19 @@ spec:
|
||||
enabled: true
|
||||
storageClass: mayastor-single-hdd
|
||||
|
||||
image:
|
||||
tag: 1.23.3
|
||||
|
||||
gitea:
|
||||
additionalConfigFromEnvs:
|
||||
- name: GITEA__DATABASE__PASSWD
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: gitea-postgresql-cluster-app
|
||||
key: password
|
||||
config:
|
||||
database:
|
||||
DB_TYPE: postgres
|
||||
HOST: gitea-postgresql-cluster-rw:5432
|
||||
NAME: app
|
||||
USER: app
|
||||
indexer:
|
||||
ISSUE_INDEXER_TYPE: bleve
|
||||
REPO_INDEXER_ENABLED: true
|
||||
@@ -79,8 +79,8 @@ spec:
|
||||
ssh:
|
||||
annotations:
|
||||
lbipam.cilium.io/sharing-key: gitea
|
||||
lbipam.cilium.io/sharing-cross-namespace: nginx-ingress-controller
|
||||
lbipam.cilium.io/ips: 10.44.0.0,2001:470:61a3:400::1
|
||||
lbipam.cilium.io/sharing-cross-namespace: nginx-ingress
|
||||
lbipam.cilium.io/ips: 10.44.0.6,2001:470:61a3:400::6
|
||||
type: LoadBalancer
|
||||
port: 22
|
||||
# Requirement for sharing ip with other service
|
||||
@@ -89,7 +89,7 @@ spec:
|
||||
|
||||
ingress:
|
||||
enabled: true
|
||||
className: nginx
|
||||
className: nginx-ingress
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt
|
||||
acme.cert-manager.io/http01-edit-in-place: "true"
|
||||
@@ -111,37 +111,3 @@ spec:
|
||||
resources:
|
||||
requests:
|
||||
cpu: 0
|
||||
---
|
||||
apiVersion: k8up.io/v1
|
||||
kind: Schedule
|
||||
metadata:
|
||||
name: gitea-backup
|
||||
namespace: gitea
|
||||
spec:
|
||||
backend:
|
||||
# Manually adding secrets for now
|
||||
repoPasswordSecretRef:
|
||||
name: restic-repo
|
||||
key: password
|
||||
s3:
|
||||
endpoint: https://s3.eu-central-003.backblazeb2.com
|
||||
bucket: lumpiasty-backups
|
||||
accessKeyIDSecretRef:
|
||||
name: backblaze
|
||||
key: keyid
|
||||
secretAccessKeySecretRef:
|
||||
name: backblaze
|
||||
key: secret
|
||||
backup:
|
||||
schedule: "@daily-random"
|
||||
failedJobsHistoryLimit: 2
|
||||
successfulJobsHistoryLimit: 2
|
||||
check:
|
||||
schedule: "@daily-random"
|
||||
prune:
|
||||
schedule: "@daily-random"
|
||||
retention:
|
||||
keepLast: 14
|
||||
keepDaily: 14
|
||||
keepWeekly: 50
|
||||
keepYearly: 10
|
||||
58
apps/gitea/secret.yaml
Normal file
58
apps/gitea/secret.yaml
Normal file
@@ -0,0 +1,58 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: backup
|
||||
namespace: gitea
|
||||
---
|
||||
apiVersion: secrets.hashicorp.com/v1beta1
|
||||
kind: VaultAuth
|
||||
metadata:
|
||||
name: backup
|
||||
namespace: gitea
|
||||
spec:
|
||||
method: kubernetes
|
||||
mount: kubernetes
|
||||
kubernetes:
|
||||
role: backup
|
||||
serviceAccount: backup
|
||||
---
|
||||
apiVersion: secrets.hashicorp.com/v1beta1
|
||||
kind: VaultStaticSecret
|
||||
metadata:
|
||||
name: gitea-backup-restic
|
||||
namespace: gitea
|
||||
spec:
|
||||
type: kv-v2
|
||||
|
||||
mount: secret
|
||||
path: restic
|
||||
|
||||
destination:
|
||||
create: true
|
||||
name: gitea-backup-restic
|
||||
type: Opaque
|
||||
transformation:
|
||||
excludeRaw: true
|
||||
|
||||
vaultAuthRef: backup
|
||||
---
|
||||
apiVersion: secrets.hashicorp.com/v1beta1
|
||||
kind: VaultStaticSecret
|
||||
metadata:
|
||||
name: gitea-backup-backblaze
|
||||
namespace: gitea
|
||||
spec:
|
||||
type: kv-v2
|
||||
|
||||
mount: secret
|
||||
path: backblaze
|
||||
|
||||
destination:
|
||||
create: true
|
||||
name: gitea-backup-backblaze
|
||||
type: Opaque
|
||||
transformation:
|
||||
excludeRaw: true
|
||||
|
||||
vaultAuthRef: backup
|
||||
9
apps/immich/kustomization.yaml
Normal file
9
apps/immich/kustomization.yaml
Normal file
@@ -0,0 +1,9 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- namespace.yaml
|
||||
- volume.yaml
|
||||
- redis.yaml
|
||||
- postgres-password.yaml
|
||||
- postgres-cluster.yaml
|
||||
- release.yaml
|
||||
4
apps/immich/namespace.yaml
Normal file
4
apps/immich/namespace.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: immich
|
||||
32
apps/immich/postgres-cluster.yaml
Normal file
32
apps/immich/postgres-cluster.yaml
Normal file
@@ -0,0 +1,32 @@
|
||||
---
|
||||
apiVersion: postgresql.cnpg.io/v1
|
||||
kind: Cluster
|
||||
metadata:
|
||||
name: immich-db
|
||||
namespace: immich
|
||||
spec:
|
||||
imageName: ghcr.io/tensorchord/cloudnative-vectorchord:14-0.4.3
|
||||
|
||||
instances: 1
|
||||
|
||||
storage:
|
||||
size: 10Gi
|
||||
storageClass: mayastor-single-hdd
|
||||
bootstrap:
|
||||
initdb:
|
||||
# Defaults of immich chart
|
||||
database: immich
|
||||
owner: immich
|
||||
|
||||
# We need to create custom role because default one does not allow to set up
|
||||
# vectorchord extension
|
||||
managed:
|
||||
roles:
|
||||
- name: immich
|
||||
createdb: true
|
||||
login: true
|
||||
superuser: true
|
||||
# We need to manually create secret
|
||||
# https://github.com/cloudnative-pg/cloudnative-pg/issues/3788
|
||||
passwordSecret:
|
||||
name: immich-db-immich
|
||||
38
apps/immich/postgres-password.yaml
Normal file
38
apps/immich/postgres-password.yaml
Normal file
@@ -0,0 +1,38 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: immich-password
|
||||
namespace: immich
|
||||
---
|
||||
apiVersion: secrets.hashicorp.com/v1beta1
|
||||
kind: VaultAuth
|
||||
metadata:
|
||||
name: immich
|
||||
namespace: immich
|
||||
spec:
|
||||
method: kubernetes
|
||||
mount: kubernetes
|
||||
kubernetes:
|
||||
role: immich
|
||||
serviceAccount: immich-password
|
||||
---
|
||||
apiVersion: secrets.hashicorp.com/v1beta1
|
||||
kind: VaultStaticSecret
|
||||
metadata:
|
||||
name: immich-db
|
||||
namespace: immich
|
||||
spec:
|
||||
type: kv-v2
|
||||
|
||||
mount: secret
|
||||
path: immich-db
|
||||
|
||||
destination:
|
||||
create: true
|
||||
name: immich-db-immich
|
||||
type: kubernetes.io/basic-auth
|
||||
transformation:
|
||||
excludeRaw: true
|
||||
|
||||
vaultAuthRef: immich
|
||||
29
apps/immich/redis.yaml
Normal file
29
apps/immich/redis.yaml
Normal file
@@ -0,0 +1,29 @@
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: bitnami
|
||||
namespace: immich
|
||||
spec:
|
||||
interval: 24h
|
||||
type: "oci"
|
||||
url: oci://registry-1.docker.io/bitnamicharts/
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: redis
|
||||
namespace: immich
|
||||
spec:
|
||||
interval: 30m
|
||||
chart:
|
||||
spec:
|
||||
chart: redis
|
||||
version: 23.1.3
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: bitnami
|
||||
values:
|
||||
global:
|
||||
defaultStorageClass: mayastor-single-hdd
|
||||
architecture: standalone
|
||||
69
apps/immich/release.yaml
Normal file
69
apps/immich/release.yaml
Normal file
@@ -0,0 +1,69 @@
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: secustor
|
||||
namespace: immich
|
||||
spec:
|
||||
interval: 24h
|
||||
url: https://secustor.dev/helm-charts
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: immich
|
||||
namespace: immich
|
||||
spec:
|
||||
interval: 30m
|
||||
chart:
|
||||
spec:
|
||||
chart: immich
|
||||
version: 1.0.2
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: secustor
|
||||
values:
|
||||
common:
|
||||
config:
|
||||
vecotrExtension: vectorchord
|
||||
postgres:
|
||||
host: immich-db-rw
|
||||
existingSecret:
|
||||
enabled: true
|
||||
secretName: immich-db-immich
|
||||
usernameKey: username
|
||||
passwordKey: password
|
||||
redis:
|
||||
host: redis-master
|
||||
existingSecret:
|
||||
enabled: true
|
||||
secretName: redis
|
||||
passwordKey: redis-password
|
||||
|
||||
server:
|
||||
volumeMounts:
|
||||
- mountPath: /usr/src/app/upload
|
||||
name: uploads
|
||||
volumes:
|
||||
- name: uploads
|
||||
persistentVolumeClaim:
|
||||
claimName: library
|
||||
|
||||
machineLearning:
|
||||
enabled: true
|
||||
|
||||
ingress:
|
||||
enabled: true
|
||||
className: nginx-ingress
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt
|
||||
nginx.ingress.kubernetes.io/proxy-body-size: "0"
|
||||
hosts:
|
||||
- host: immich.lumpiasty.xyz
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
tls:
|
||||
- hosts:
|
||||
- immich.lumpiasty.xyz
|
||||
secretName: immich-ingress
|
||||
13
apps/immich/volume.yaml
Normal file
13
apps/immich/volume.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: library
|
||||
namespace: immich
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 150Gi
|
||||
storageClassName: mayastor-single-hdd
|
||||
@@ -1,5 +1,12 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- gitea.yaml
|
||||
- renovate.yaml
|
||||
- gitea
|
||||
- registry
|
||||
- renovate
|
||||
- librechat
|
||||
- frigate
|
||||
- llama
|
||||
- immich
|
||||
- nas
|
||||
- searxng
|
||||
|
||||
5
apps/librechat/kustomization.yaml
Normal file
5
apps/librechat/kustomization.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- namespace.yaml
|
||||
- release.yaml
|
||||
5
apps/librechat/namespace.yaml
Normal file
5
apps/librechat/namespace.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: librechat
|
||||
99
apps/librechat/release.yaml
Normal file
99
apps/librechat/release.yaml
Normal file
@@ -0,0 +1,99 @@
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: dynomite567-charts
|
||||
namespace: librechat
|
||||
spec:
|
||||
interval: 24h
|
||||
url: https://dynomite567.github.io/helm-charts/
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: librechat
|
||||
namespace: librechat
|
||||
spec:
|
||||
interval: 30m
|
||||
chart:
|
||||
spec:
|
||||
chart: librechat
|
||||
version: 1.9.1
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: dynomite567-charts
|
||||
values:
|
||||
global:
|
||||
librechat:
|
||||
existingSecretName: librechat
|
||||
librechat:
|
||||
configEnv:
|
||||
PLUGIN_MODELS: null
|
||||
ALLOW_REGISTRATION: "false"
|
||||
TRUST_PROXY: "1"
|
||||
DOMAIN_CLIENT: https://librechat.lumpiasty.xyz
|
||||
SEARCH: "true"
|
||||
existingSecretName: librechat
|
||||
configYamlContent: |
|
||||
version: 1.0.3
|
||||
|
||||
endpoints:
|
||||
custom:
|
||||
- name: "Llama.cpp"
|
||||
apiKey: "llama"
|
||||
baseURL: "http://llama.llama.svc.cluster.local:11434/v1"
|
||||
models:
|
||||
default: [
|
||||
"DeepSeek-R1-0528-Qwen3-8B-GGUF",
|
||||
"Qwen3-8B-GGUF",
|
||||
"Qwen3-8B-GGUF-no-thinking",
|
||||
"gemma3n-e4b",
|
||||
"gemma3-12b",
|
||||
"gemma3-12b-q2",
|
||||
"gemma3-12b-novision",
|
||||
"gemma3-4b",
|
||||
"gemma3-4b-novision",
|
||||
"Qwen3-4B-Thinking-2507",
|
||||
"Qwen3-4B-Thinking-2507-long-ctx",
|
||||
"Qwen2.5-VL-7B-Instruct-GGUF",
|
||||
"Qwen2.5-VL-32B-Instruct-GGUF-IQ1_S",
|
||||
"Qwen2.5-VL-32B-Instruct-GGUF-Q2_K_L"
|
||||
]
|
||||
titleConvo: true
|
||||
titleModel: "gemma3-4b-novision"
|
||||
summarize: false
|
||||
summaryModel: "gemma3-4b-novision"
|
||||
forcePrompt: false
|
||||
modelDisplayLabel: "Llama.cpp"
|
||||
imageVolume:
|
||||
enabled: true
|
||||
size: 10G
|
||||
accessModes: ReadWriteOnce
|
||||
storageClassName: mayastor-single-hdd
|
||||
ingress:
|
||||
enabled: true
|
||||
className: nginx-ingress
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt
|
||||
nginx.ingress.kubernetes.io/proxy-body-size: "0"
|
||||
nginx.ingress.kubernetes.io/proxy-buffering: "false"
|
||||
nginx.ingress.kubernetes.io/proxy-read-timeout: 30m
|
||||
hosts:
|
||||
- host: librechat.lumpiasty.xyz
|
||||
paths:
|
||||
- path: /
|
||||
pathType: ImplementationSpecific
|
||||
tls:
|
||||
- hosts:
|
||||
- librechat.lumpiasty.xyz
|
||||
secretName: librechat-ingress
|
||||
|
||||
mongodb:
|
||||
persistence:
|
||||
storageClass: mayastor-single-hdd
|
||||
|
||||
meilisearch:
|
||||
persistence:
|
||||
storageClass: mayastor-single-hdd
|
||||
auth:
|
||||
existingMasterKeySecret: librechat
|
||||
68
apps/llama/auth-proxy.yaml
Normal file
68
apps/llama/auth-proxy.yaml
Normal file
@@ -0,0 +1,68 @@
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: llama-proxy
|
||||
namespace: llama
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/name: llama-proxy
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/name: llama-proxy
|
||||
spec:
|
||||
containers:
|
||||
- name: caddy
|
||||
image: caddy:2.10.2-alpine
|
||||
imagePullPolicy: IfNotPresent
|
||||
volumeMounts:
|
||||
- mountPath: /etc/caddy
|
||||
name: proxy-config
|
||||
env:
|
||||
- name: API_KEY
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: llama-api-key
|
||||
key: API_KEY
|
||||
volumes:
|
||||
- name: proxy-config
|
||||
configMap:
|
||||
name: llama-proxy-config
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
namespace: llama
|
||||
name: llama-proxy-config
|
||||
data:
|
||||
Caddyfile: |
|
||||
http://llama.lumpiasty.xyz {
|
||||
|
||||
@requireAuth {
|
||||
not header Authorization "Bearer {env.API_KEY}"
|
||||
}
|
||||
|
||||
respond @requireAuth "Unauthorized" 401
|
||||
|
||||
reverse_proxy llama:11434 {
|
||||
flush_interval -1
|
||||
}
|
||||
}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
namespace: llama
|
||||
name: llama-proxy
|
||||
spec:
|
||||
type: ClusterIP
|
||||
selector:
|
||||
app.kubernetes.io/name: llama-proxy
|
||||
ports:
|
||||
- name: http
|
||||
port: 80
|
||||
targetPort: 80
|
||||
protocol: TCP
|
||||
216
apps/llama/configs/config.yaml
Normal file
216
apps/llama/configs/config.yaml
Normal file
@@ -0,0 +1,216 @@
|
||||
healthCheckTimeout: 600
|
||||
|
||||
models:
|
||||
"DeepSeek-R1-0528-Qwen3-8B-GGUF":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/DeepSeek-R1-0528-Qwen3-8B-GGUF:Q4_K_M
|
||||
-ngl 37 -c 16384
|
||||
--no-warmup
|
||||
--port ${PORT}
|
||||
"Qwen3-8B-GGUF":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/Qwen3-8B-GGUF:Q4_K_M
|
||||
-ngl 37 -c 16384
|
||||
--no-warmup
|
||||
--port ${PORT}
|
||||
"Qwen3-8B-GGUF-no-thinking":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/Qwen3-8B-GGUF:Q4_K_M
|
||||
-ngl 37 -c 16384
|
||||
--jinja --chat-template-file /config/qwen_nothink_chat_template.jinja
|
||||
--no-warmup
|
||||
--port ${PORT}
|
||||
"gemma3n-e4b":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/gemma-3n-E4B-it-GGUF:UD-Q4_K_XL
|
||||
--ctx-size 16384
|
||||
--n-gpu-layers 99
|
||||
--seed 3407
|
||||
--prio 2
|
||||
--temp 1.0
|
||||
--repeat-penalty 1.0
|
||||
--min-p 0.00
|
||||
--top-k 64
|
||||
--top-p 0.95
|
||||
--no-warmup
|
||||
--port ${PORT}
|
||||
"gemma3-12b":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/gemma-3-12b-it-GGUF:Q4_K_M
|
||||
--ctx-size 16384
|
||||
--n-gpu-layers 99
|
||||
--prio 2
|
||||
--temp 1.0
|
||||
--repeat-penalty 1.0
|
||||
--min-p 0.00
|
||||
--top-k 64
|
||||
--top-p 0.95
|
||||
--no-warmup
|
||||
--port ${PORT}
|
||||
"gemma3-12b-novision":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/gemma-3-12b-it-GGUF:Q4_K_M
|
||||
--ctx-size 16384
|
||||
--n-gpu-layers 99
|
||||
--prio 2
|
||||
--temp 1.0
|
||||
--repeat-penalty 1.0
|
||||
--min-p 0.00
|
||||
--top-k 64
|
||||
--top-p 0.95
|
||||
--no-mmproj
|
||||
--no-warmup
|
||||
--port ${PORT}
|
||||
"gemma3-12b-q2":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/gemma-3-12b-it-GGUF:Q2_K_L
|
||||
--ctx-size 16384
|
||||
--n-gpu-layers 99
|
||||
--prio 2
|
||||
--temp 1.0
|
||||
--repeat-penalty 1.0
|
||||
--min-p 0.00
|
||||
--top-k 64
|
||||
--top-p 0.95
|
||||
--no-warmup
|
||||
--port ${PORT}
|
||||
"gemma3-4b":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/gemma-3-4b-it-GGUF:Q4_K_M
|
||||
--ctx-size 16384
|
||||
--n-gpu-layers 99
|
||||
--prio 2
|
||||
--temp 1.0
|
||||
--repeat-penalty 1.0
|
||||
--min-p 0.00
|
||||
--top-k 64
|
||||
--top-p 0.95
|
||||
--no-warmup
|
||||
--port ${PORT}
|
||||
"gemma3-4b-novision":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/gemma-3-4b-it-GGUF:Q4_K_M
|
||||
--ctx-size 16384
|
||||
--n-gpu-layers 99
|
||||
--prio 2
|
||||
--temp 1.0
|
||||
--repeat-penalty 1.0
|
||||
--min-p 0.00
|
||||
--top-k 64
|
||||
--top-p 0.95
|
||||
--no-mmproj
|
||||
--no-warmup
|
||||
--port ${PORT}
|
||||
"Qwen3-4B-Thinking-2507":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/Qwen3-4B-Thinking-2507-GGUF:Q4_K_M
|
||||
-ngl 99 -c 16384 --predict 8192
|
||||
--temp 0.6
|
||||
--min-p 0.00
|
||||
--top-p 0.95
|
||||
--top-k 20
|
||||
--repeat-penalty 1.0
|
||||
--no-warmup
|
||||
--port ${PORT}
|
||||
"Qwen3-4B-Thinking-2507-long-ctx":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/Qwen3-4B-Thinking-2507-GGUF:Q4_K_M
|
||||
-ngl 99 -c 262144 --predict 81920
|
||||
--temp 0.6
|
||||
--min-p 0.00
|
||||
--top-p 0.95
|
||||
--top-k 20
|
||||
--repeat-penalty 1.0
|
||||
--no-warmup
|
||||
--flash-attn
|
||||
--cache-type-k q8_0 --cache-type-v q8_0
|
||||
--port ${PORT}
|
||||
"Qwen3-4B-Instruct-2507":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/Qwen3-4B-Instruct-2507-GGUF:Q4_K_M
|
||||
-ngl 99 -c 16384 --predict 8192
|
||||
--temp 0.7
|
||||
--min-p 0.00
|
||||
--top-p 0.8
|
||||
--top-k 20
|
||||
--repeat-penalty 1.0
|
||||
--no-warmup
|
||||
--port ${PORT}
|
||||
"Qwen3-4B-Instruct-2507-long-ctx":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/Qwen3-4B-Instruct-2507-GGUF:Q4_K_M
|
||||
-ngl 99 -c 262144 --predict 81920
|
||||
--temp 0.7
|
||||
--min-p 0.00
|
||||
--top-p 0.8
|
||||
--top-k 20
|
||||
--repeat-penalty 1.0
|
||||
--no-warmup
|
||||
--flash-attn
|
||||
--cache-type-k q8_0 --cache-type-v q8_0
|
||||
--port ${PORT}
|
||||
"Qwen2.5-VL-32B-Instruct-GGUF-IQ1_S":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/Qwen2.5-VL-32B-Instruct-GGUF:IQ1_S
|
||||
-ngl 99 -c 16384 --predict 8192
|
||||
--temp 0.7
|
||||
--min-p 0.00
|
||||
--top-p 0.8
|
||||
--top-k 20
|
||||
--repeat-penalty 1.0
|
||||
--no-warmup
|
||||
--port ${PORT}
|
||||
"Qwen2.5-VL-32B-Instruct-GGUF-Q2_K_L":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/Qwen2.5-VL-32B-Instruct-GGUF:Q2_K_L
|
||||
-ngl 99 -c 16384 --predict 8192
|
||||
--temp 0.7
|
||||
--min-p 0.00
|
||||
--top-p 0.8
|
||||
--top-k 20
|
||||
--repeat-penalty 1.0
|
||||
--no-warmup
|
||||
--port ${PORT}
|
||||
"Qwen2.5-VL-7B-Instruct-GGUF":
|
||||
ttl: 600
|
||||
cmd: |
|
||||
/app/llama-server
|
||||
-hf unsloth/Qwen2.5-VL-7B-Instruct-GGUF:Q4_K_M
|
||||
-ngl 37 -c 16384 --predict 8192
|
||||
--temp 0.7
|
||||
--min-p 0.00
|
||||
--top-p 0.8
|
||||
--top-k 20
|
||||
--repeat-penalty 1.0
|
||||
--no-warmup
|
||||
--port ${PORT}
|
||||
101
apps/llama/configs/qwen_nothink_chat_template.jinja
Normal file
101
apps/llama/configs/qwen_nothink_chat_template.jinja
Normal file
@@ -0,0 +1,101 @@
|
||||
{%- if not add_generation_prompt is defined %}
|
||||
{%- set add_generation_prompt = false %}
|
||||
{%- endif %}
|
||||
{%- set ns = namespace(is_first=false, is_tool=false, is_output_first=true, system_prompt='', is_first_sp=true, is_last_user=false) %}
|
||||
{%- for message in messages %}
|
||||
{%- if message['role'] == 'system' %}
|
||||
{%- if ns.is_first_sp %}
|
||||
{%- set ns.system_prompt = ns.system_prompt + message['content'] %}
|
||||
{%- set ns.is_first_sp = false %}
|
||||
{%- else %}
|
||||
{%- set ns.system_prompt = ns.system_prompt + '\n\n' + message['content'] %}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
|
||||
{#- Adapted from https://github.com/sgl-project/sglang/blob/main/examples/chat_template/tool_chat_template_deepseekr1.jinja #}
|
||||
{%- if tools is defined and tools is not none %}
|
||||
{%- set tool_ns = namespace(text='You are a helpful assistant with tool calling capabilities. ' + 'When a tool call is needed, you MUST use the following format to issue the call:\n' + '<|tool▁calls▁begin|><|tool▁call▁begin|>function<|tool▁sep|>FUNCTION_NAME\n' + '```json\n{"param1": "value1", "param2": "value2"}\n```<|tool▁call▁end|><|tool▁calls▁end|>\n\n' + 'Make sure the JSON is valid.' + '## Tools\n\n### Function\n\nYou have the following functions available:\n\n') %}
|
||||
{%- for tool in tools %}
|
||||
{%- set tool_ns.text = tool_ns.text + '\n```json\n' + (tool | tojson) + '\n```\n' %}
|
||||
{%- endfor %}
|
||||
{%- if ns.system_prompt|length != 0 %}
|
||||
{%- set ns.system_prompt = ns.system_prompt + '\n\n' + tool_ns.text %}
|
||||
{%- else %}
|
||||
{%- set ns.system_prompt = tool_ns.text %}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{{- bos_token }}
|
||||
{{- '/no_think' + ns.system_prompt }}
|
||||
{%- set last_index = (messages|length - 1) %}
|
||||
{%- for message in messages %}
|
||||
{%- set content = message['content'] %}
|
||||
{%- if message['role'] == 'user' %}
|
||||
{%- set ns.is_tool = false -%}
|
||||
{%- set ns.is_first = false -%}
|
||||
{%- set ns.is_last_user = true -%}
|
||||
{%- if loop.index0 == last_index %}
|
||||
{{- '<|User|>' + content }}
|
||||
{%- else %}
|
||||
{{- '<|User|>' + content + '<|Assistant|>'}}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- if message['role'] == 'assistant' %}
|
||||
{%- if '</think>' in content %}
|
||||
{%- set content = (content.split('</think>')|last) %}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- if message['role'] == 'assistant' and message['tool_calls'] is defined and message['tool_calls'] is not none %}
|
||||
{%- set ns.is_last_user = false -%}
|
||||
{%- if ns.is_tool %}
|
||||
{{- '<|tool▁outputs▁end|>'}}
|
||||
{%- endif %}
|
||||
{%- set ns.is_first = false %}
|
||||
{%- set ns.is_tool = false -%}
|
||||
{%- set ns.is_output_first = true %}
|
||||
{%- for tool in message['tool_calls'] %}
|
||||
{%- set arguments = tool['function']['arguments'] %}
|
||||
{%- if arguments is not string %}
|
||||
{%- set arguments = arguments|tojson %}
|
||||
{%- endif %}
|
||||
{%- if not ns.is_first %}
|
||||
{%- if content is none %}
|
||||
{{- '<|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + arguments + '\n' + '```' + '<|tool▁call▁end|>'}}
|
||||
}
|
||||
{%- else %}
|
||||
{{- content + '<|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + arguments + '\n' + '```' + '<|tool▁call▁end|>'}}
|
||||
{%- endif %}
|
||||
{%- set ns.is_first = true -%}
|
||||
{%- else %}
|
||||
{{- '\n' + '<|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\n' + '```json' + '\n' + arguments + '\n' + '```' + '<|tool▁call▁end|>'}}
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{{- '<|tool▁calls▁end|><|end▁of▁sentence|>'}}
|
||||
{%- endif %}
|
||||
{%- if message['role'] == 'assistant' and (message['tool_calls'] is not defined or message['tool_calls'] is none) %}
|
||||
{%- set ns.is_last_user = false -%}
|
||||
{%- if ns.is_tool %}
|
||||
{{- '<|tool▁outputs▁end|>' + content + '<|end▁of▁sentence|>'}}
|
||||
{%- set ns.is_tool = false -%}
|
||||
{%- else %}
|
||||
{{- content + '<|end▁of▁sentence|>'}}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- if message['role'] == 'tool' %}
|
||||
{%- set ns.is_last_user = false -%}
|
||||
{%- set ns.is_tool = true -%}
|
||||
{%- if ns.is_output_first %}
|
||||
{{- '<|tool▁outputs▁begin|><|tool▁output▁begin|>' + content + '<|tool▁output▁end|>'}}
|
||||
{%- set ns.is_output_first = false %}
|
||||
{%- else %}
|
||||
{{- '\n<|tool▁output▁begin|>' + content + '<|tool▁output▁end|>'}}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- endfor -%}
|
||||
{%- if ns.is_tool %}
|
||||
{{- '<|tool▁outputs▁end|>'}}
|
||||
{%- endif %}
|
||||
{#- if add_generation_prompt and not ns.is_last_user and not ns.is_tool #}
|
||||
{%- if add_generation_prompt and not ns.is_tool %}
|
||||
{{- '<|Assistant|>'}}
|
||||
{%- endif %}
|
||||
70
apps/llama/deployment.yaml
Normal file
70
apps/llama/deployment.yaml
Normal file
@@ -0,0 +1,70 @@
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: llama-swap
|
||||
namespace: llama
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: llama-swap
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: llama-swap
|
||||
spec:
|
||||
containers:
|
||||
- name: llama-swap
|
||||
image: ghcr.io/mostlygeek/llama-swap:v166-vulkan-b6795
|
||||
imagePullPolicy: IfNotPresent
|
||||
command:
|
||||
- /app/llama-swap
|
||||
args:
|
||||
- --config=/config/config.yaml
|
||||
- --watch-config
|
||||
ports:
|
||||
- containerPort: 8080
|
||||
name: http
|
||||
protocol: TCP
|
||||
volumeMounts:
|
||||
- name: models
|
||||
mountPath: /root/.cache
|
||||
- mountPath: /dev/kfd
|
||||
name: kfd
|
||||
- mountPath: /dev/dri
|
||||
name: dri
|
||||
- mountPath: /config
|
||||
name: config
|
||||
securityContext:
|
||||
privileged: true
|
||||
volumes:
|
||||
- name: models
|
||||
persistentVolumeClaim:
|
||||
claimName: llama-models
|
||||
- name: kfd
|
||||
hostPath:
|
||||
path: /dev/kfd
|
||||
type: CharDevice
|
||||
- name: dri
|
||||
hostPath:
|
||||
path: /dev/dri
|
||||
type: Directory
|
||||
- name: config
|
||||
configMap:
|
||||
name: llama-swap
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: llama
|
||||
namespace: llama
|
||||
spec:
|
||||
type: ClusterIP
|
||||
ports:
|
||||
- name: http
|
||||
port: 11434
|
||||
targetPort: 8080
|
||||
protocol: TCP
|
||||
selector:
|
||||
app: llama-swap
|
||||
28
apps/llama/ingress.yaml
Normal file
28
apps/llama/ingress.yaml
Normal file
@@ -0,0 +1,28 @@
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
namespace: llama
|
||||
name: llama
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt
|
||||
acme.cert-manager.io/http01-edit-in-place: "true"
|
||||
nginx.ingress.kubernetes.io/proxy-buffering: "false"
|
||||
nginx.ingress.kubernetes.io/proxy-read-timeout: 30m
|
||||
spec:
|
||||
ingressClassName: nginx-ingress
|
||||
rules:
|
||||
- host: llama.lumpiasty.xyz
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
service:
|
||||
name: llama-proxy
|
||||
port:
|
||||
number: 80
|
||||
path: /
|
||||
pathType: Prefix
|
||||
tls:
|
||||
- hosts:
|
||||
- llama.lumpiasty.xyz
|
||||
secretName: llama-ingress
|
||||
15
apps/llama/kustomization.yaml
Normal file
15
apps/llama/kustomization.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- namespace.yaml
|
||||
- secret.yaml
|
||||
- auth-proxy.yaml
|
||||
- ingress.yaml
|
||||
- pvc.yaml
|
||||
- deployment.yaml
|
||||
configMapGenerator:
|
||||
- name: llama-swap
|
||||
namespace: llama
|
||||
files:
|
||||
- config.yaml=configs/config.yaml
|
||||
- qwen_nothink_chat_template.jinja=configs/qwen_nothink_chat_template.jinja
|
||||
5
apps/llama/namespace.yaml
Normal file
5
apps/llama/namespace.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: llama
|
||||
13
apps/llama/pvc.yaml
Normal file
13
apps/llama/pvc.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
namespace: llama
|
||||
name: llama-models
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 200Gi
|
||||
storageClassName: mayastor-single-ssd
|
||||
38
apps/llama/secret.yaml
Normal file
38
apps/llama/secret.yaml
Normal file
@@ -0,0 +1,38 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: llama-proxy
|
||||
namespace: llama
|
||||
---
|
||||
apiVersion: secrets.hashicorp.com/v1beta1
|
||||
kind: VaultAuth
|
||||
metadata:
|
||||
name: llama
|
||||
namespace: llama
|
||||
spec:
|
||||
method: kubernetes
|
||||
mount: kubernetes
|
||||
kubernetes:
|
||||
role: llama-proxy
|
||||
serviceAccount: llama-proxy
|
||||
---
|
||||
apiVersion: secrets.hashicorp.com/v1beta1
|
||||
kind: VaultStaticSecret
|
||||
metadata:
|
||||
name: llama-api-key
|
||||
namespace: llama
|
||||
spec:
|
||||
type: kv-v2
|
||||
|
||||
mount: secret
|
||||
path: ollama
|
||||
|
||||
destination:
|
||||
create: true
|
||||
name: llama-api-key
|
||||
type: Opaque
|
||||
transformation:
|
||||
excludeRaw: true
|
||||
|
||||
vaultAuthRef: llama
|
||||
14
apps/nas/configmap.yaml
Normal file
14
apps/nas/configmap.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: nas-sshd-config
|
||||
namespace: nas
|
||||
data:
|
||||
00-chroot.conf: |
|
||||
Subsystem sftp internal-sftp
|
||||
Match User nas
|
||||
ChrootDirectory /config
|
||||
ForceCommand internal-sftp -d /data
|
||||
AllowTcpForwarding no
|
||||
X11Forwarding no
|
||||
PermitTunnel no
|
||||
94
apps/nas/deployment.yaml
Normal file
94
apps/nas/deployment.yaml
Normal file
@@ -0,0 +1,94 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nas-ssh
|
||||
namespace: nas
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: nas-ssh
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nas-ssh
|
||||
spec:
|
||||
securityContext:
|
||||
fsGroup: 1000
|
||||
initContainers:
|
||||
- name: prepare-config
|
||||
image: alpine:3.20.3
|
||||
imagePullPolicy: IfNotPresent
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
set -euo pipefail
|
||||
chown root:root /config
|
||||
chmod 755 /config
|
||||
mkdir -p /config/data
|
||||
chown 1000:1000 /config/data
|
||||
chmod 750 /config/data
|
||||
mkdir -p /config/ssh_host_keys
|
||||
chown root:root /config/ssh_host_keys
|
||||
chmod 700 /config/ssh_host_keys
|
||||
for key in /config/ssh_host_keys/*; do
|
||||
[ -f "$key" ] || continue
|
||||
chown root:root "$key"
|
||||
chmod 600 "$key"
|
||||
done
|
||||
mkdir -p /config/sshd/sshd_config.d
|
||||
cp /defaults/00-chroot.conf /config/sshd/sshd_config.d/00-chroot.conf
|
||||
chown root:root /config/sshd/sshd_config.d/00-chroot.conf
|
||||
chmod 644 /config/sshd/sshd_config.d/00-chroot.conf
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /config
|
||||
- name: sshd-config
|
||||
mountPath: /defaults/00-chroot.conf
|
||||
subPath: 00-chroot.conf
|
||||
readOnly: true
|
||||
containers:
|
||||
- name: ssh
|
||||
image: lscr.io/linuxserver/openssh-server:version-10.0_p1-r9
|
||||
imagePullPolicy: IfNotPresent
|
||||
env:
|
||||
- name: PUID
|
||||
value: "1000"
|
||||
- name: PGID
|
||||
value: "1000"
|
||||
- name: TZ
|
||||
value: Etc/UTC
|
||||
- name: USER_NAME
|
||||
value: nas
|
||||
- name: SUDO_ACCESS
|
||||
value: "false"
|
||||
- name: PASSWORD_ACCESS
|
||||
value: "false"
|
||||
- name: LOG_STDOUT
|
||||
value: "true"
|
||||
- name: PUBLIC_KEY
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: nas-ssh-authorized-keys
|
||||
key: public_key
|
||||
ports:
|
||||
- containerPort: 2222
|
||||
name: ssh
|
||||
protocol: TCP
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /config
|
||||
resources:
|
||||
requests:
|
||||
cpu: 50m
|
||||
memory: 128Mi
|
||||
limits:
|
||||
memory: 512Mi
|
||||
volumes:
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: nas-data
|
||||
- name: sshd-config
|
||||
configMap:
|
||||
name: nas-sshd-config
|
||||
9
apps/nas/kustomization.yaml
Normal file
9
apps/nas/kustomization.yaml
Normal file
@@ -0,0 +1,9 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- namespace.yaml
|
||||
- secret.yaml
|
||||
- configmap.yaml
|
||||
- pvc.yaml
|
||||
- deployment.yaml
|
||||
- service.yaml
|
||||
4
apps/nas/namespace.yaml
Normal file
4
apps/nas/namespace.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: nas
|
||||
12
apps/nas/pvc.yaml
Normal file
12
apps/nas/pvc.yaml
Normal file
@@ -0,0 +1,12 @@
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: nas-data
|
||||
namespace: nas
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 500Gi
|
||||
storageClassName: mayastor-single-hdd
|
||||
9
apps/nas/secret.yaml
Normal file
9
apps/nas/secret.yaml
Normal file
@@ -0,0 +1,9 @@
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: nas-ssh-authorized-keys
|
||||
namespace: nas
|
||||
type: Opaque
|
||||
stringData:
|
||||
public_key: |
|
||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCresbDFZijI+rZMgd3LdciPjpb4x4S5B7y0U+EoYPaz6hILT72fyz3QdcgKJJv8JUJI6g0811/yFRuOzCXgWaA922c/S/t6HMUrorh7mPVQMTN2dc/SVBvMa7S2M9NYBj6z1X2LRHs+g1JTMCtL202PIjes/E9qu0as0Vx6n/6HHNmtmA9LrpiAmurbeKXDmrYe2yWg/FA6cX5d86SJb21Dj8WqdCd3Hz0Pi6FzMKXhpWvs5Hfei1htsjsRzCxkpSTjlgFEFVfmHIXPfB06Sa6aCnkxAFnE7N+xNa9RIWeZmOXdA74LsfSKQ9eAXSrsC/IRxo2ce8cBzXJy+Itxw24fUqGYXBiCgx8i3ZA9IdwI1u71xYo9lyNjav5VykzKnAHRAYnDm9UsCf8k04reBevcLdtxL11vPCtind3xn76Nhy2b45dcp/MdYFANGsCcXJOMb6Aisb03HPGhs/aU3tCAQbTVe195mL9FWhGqIK2wBmF1SKW+4ssX2bIU6YaCYc= cardno:23_671_999
|
||||
15
apps/nas/service.yaml
Normal file
15
apps/nas/service.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: nas-ssh
|
||||
namespace: nas
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
externalTrafficPolicy: Cluster
|
||||
ports:
|
||||
- name: ssh
|
||||
port: 22
|
||||
targetPort: 2222
|
||||
protocol: TCP
|
||||
selector:
|
||||
app: nas-ssh
|
||||
40
apps/registry/deployment.yaml
Normal file
40
apps/registry/deployment.yaml
Normal file
@@ -0,0 +1,40 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: registry
|
||||
namespace: registry
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: registry
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: registry
|
||||
spec:
|
||||
containers:
|
||||
- name: registry
|
||||
image: registry:3.0.0
|
||||
ports:
|
||||
- containerPort: 5000
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /var/lib/registry
|
||||
volumes:
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: registry-data
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: registry-service
|
||||
namespace: registry
|
||||
spec:
|
||||
selector:
|
||||
app: registry
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 80
|
||||
targetPort: 5000
|
||||
26
apps/registry/ingress.yaml
Normal file
26
apps/registry/ingress.yaml
Normal file
@@ -0,0 +1,26 @@
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
namespace: registry
|
||||
name: registry
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt
|
||||
nginx.ingress.kubernetes.io/proxy-body-size: "0"
|
||||
spec:
|
||||
ingressClassName: nginx-ingress
|
||||
rules:
|
||||
- host: registry.lumpiasty.xyz
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
service:
|
||||
name: registry-service
|
||||
port:
|
||||
number: 80
|
||||
path: /
|
||||
pathType: Prefix
|
||||
tls:
|
||||
- hosts:
|
||||
- registry.lumpiasty.xyz
|
||||
secretName: researcher-ingress
|
||||
8
apps/registry/kustomization.yaml
Normal file
8
apps/registry/kustomization.yaml
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- namespace.yaml
|
||||
- volume.yaml
|
||||
- deployment.yaml
|
||||
- ingress.yaml
|
||||
5
apps/registry/namespace.yaml
Normal file
5
apps/registry/namespace.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: registry
|
||||
13
apps/registry/volume.yaml
Normal file
13
apps/registry/volume.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: registry-data
|
||||
namespace: registry
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 50Gi
|
||||
storageClassName: mayastor-single-hdd
|
||||
11
apps/renovate/configmap.yaml
Normal file
11
apps/renovate/configmap.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
namespace: renovate
|
||||
name: renovate-config
|
||||
data:
|
||||
RENOVATE_AUTODISCOVER: "true"
|
||||
RENOVATE_ENDPOINT: https://gitea.lumpiasty.xyz/api/v1
|
||||
RENOVATE_PLATFORM: gitea
|
||||
RENOVATE_GIT_AUTHOR: Renovate Bot <renovate@lumpiasty.xyz>
|
||||
@@ -1,16 +1,11 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: renovate
|
||||
---
|
||||
apiVersion: batch/v1
|
||||
kind: CronJob
|
||||
metadata:
|
||||
name: renovate
|
||||
namespace: renovate
|
||||
spec:
|
||||
schedule: "@hourly"
|
||||
schedule: "@daily"
|
||||
concurrencyPolicy: Forbid
|
||||
jobTemplate:
|
||||
spec:
|
||||
@@ -20,8 +15,10 @@ spec:
|
||||
- name: renovate
|
||||
# Update this to the latest available and then enable Renovate on
|
||||
# the manifest
|
||||
image: renovate/renovate:39.215.2-full
|
||||
image: renovate/renovate:41.169.1-full
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: renovate-env
|
||||
name: renovate-gitea-token
|
||||
- configMapRef:
|
||||
name: renovate-config
|
||||
restartPolicy: Never
|
||||
7
apps/renovate/kustomization.yaml
Normal file
7
apps/renovate/kustomization.yaml
Normal file
@@ -0,0 +1,7 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- namespace.yaml
|
||||
- configmap.yaml
|
||||
- secret.yaml
|
||||
- cronjob.yaml
|
||||
5
apps/renovate/namespace.yaml
Normal file
5
apps/renovate/namespace.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: renovate
|
||||
38
apps/renovate/secret.yaml
Normal file
38
apps/renovate/secret.yaml
Normal file
@@ -0,0 +1,38 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: renovate
|
||||
namespace: renovate
|
||||
---
|
||||
apiVersion: secrets.hashicorp.com/v1beta1
|
||||
kind: VaultAuth
|
||||
metadata:
|
||||
name: renovate
|
||||
namespace: renovate
|
||||
spec:
|
||||
method: kubernetes
|
||||
mount: kubernetes
|
||||
kubernetes:
|
||||
role: renovate
|
||||
serviceAccount: renovate
|
||||
---
|
||||
apiVersion: secrets.hashicorp.com/v1beta1
|
||||
kind: VaultStaticSecret
|
||||
metadata:
|
||||
name: renovate-gitea-token
|
||||
namespace: renovate
|
||||
spec:
|
||||
type: kv-v2
|
||||
|
||||
mount: secret
|
||||
path: renovate
|
||||
|
||||
destination:
|
||||
create: true
|
||||
name: renovate-gitea-token
|
||||
type: Opaque
|
||||
transformation:
|
||||
excludeRaw: true
|
||||
|
||||
vaultAuthRef: renovate
|
||||
1
apps/searxng/configs/settings.yml
Normal file
1
apps/searxng/configs/settings.yml
Normal file
@@ -0,0 +1 @@
|
||||
use_default_settings: true
|
||||
42
apps/searxng/deployment.yaml
Normal file
42
apps/searxng/deployment.yaml
Normal file
@@ -0,0 +1,42 @@
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: searxng
|
||||
namespace: searxng
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: searxng
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: searxng
|
||||
spec:
|
||||
containers:
|
||||
- name: searxng
|
||||
image: searxng/searxng:2025.8.12-6b1516d
|
||||
ports:
|
||||
- containerPort: 8080
|
||||
env:
|
||||
- name: SEARXNG_SECRET
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: searxng-secret
|
||||
key: SEARXNG_SECRET
|
||||
optional: false
|
||||
volumeMounts:
|
||||
- name: config-volume
|
||||
mountPath: /etc/searxng/settings.yml
|
||||
subPath: settings.yml
|
||||
readOnly: true
|
||||
- name: searxng-persistent-data
|
||||
mountPath: /var/cache/searxng
|
||||
volumes:
|
||||
- name: config-volume
|
||||
configMap:
|
||||
name: searxng-config
|
||||
- name: searxng-persistent-data
|
||||
persistentVolumeClaim:
|
||||
claimName: searxng-persistent-data
|
||||
25
apps/searxng/ingress.yaml
Normal file
25
apps/searxng/ingress.yaml
Normal file
@@ -0,0 +1,25 @@
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
namespace: searxng
|
||||
name: searxng
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt
|
||||
spec:
|
||||
ingressClassName: nginx-ingress
|
||||
rules:
|
||||
- host: searxng.lumpiasty.xyz
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
service:
|
||||
name: searxng
|
||||
port:
|
||||
number: 8080
|
||||
path: /
|
||||
pathType: Prefix
|
||||
tls:
|
||||
- hosts:
|
||||
- searxng.lumpiasty.xyz
|
||||
secretName: searxng-ingress
|
||||
13
apps/searxng/kustomization.yaml
Normal file
13
apps/searxng/kustomization.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- namespace.yaml
|
||||
- pvc.yaml
|
||||
- deployment.yaml
|
||||
- service.yaml
|
||||
- ingress.yaml
|
||||
configMapGenerator:
|
||||
- name: searxng-config
|
||||
namespace: searxng
|
||||
files:
|
||||
- settings.yml=configs/settings.yml
|
||||
5
apps/searxng/namespace.yaml
Normal file
5
apps/searxng/namespace.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: searxng
|
||||
13
apps/searxng/pvc.yaml
Normal file
13
apps/searxng/pvc.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
namespace: searxng
|
||||
name: searxng-persistent-data
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 1Gi
|
||||
storageClassName: mayastor-single-ssd
|
||||
14
apps/searxng/service.yaml
Normal file
14
apps/searxng/service.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: searxng
|
||||
namespace: searxng
|
||||
spec:
|
||||
selector:
|
||||
app: searxng
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 8080
|
||||
targetPort: 8080
|
||||
type: ClusterIP
|
||||
File diff suppressed because it is too large
Load Diff
24
flake.lock
generated
24
flake.lock
generated
@@ -19,11 +19,11 @@
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1710146030,
|
||||
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
||||
"lastModified": 1731533236,
|
||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
|
||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -42,11 +42,11 @@
|
||||
"treefmt-nix": "treefmt-nix"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1738540903,
|
||||
"narHash": "sha256-/C5RTu3yCpVFHIL7u3hL9ZRGrXmIrLg3iB4+z9A3E8A=",
|
||||
"lastModified": 1751765453,
|
||||
"narHash": "sha256-tgo3BwFM2UUYQz6dVARztbj5AjKfz4exlPxnKLS/ZRg=",
|
||||
"owner": "a1994sc",
|
||||
"repo": "krew2nix",
|
||||
"rev": "5bc50d65d6496ad30f897a9fe5532f440fb143ef",
|
||||
"rev": "11f66e65a0146645388eeab68b6212de0b732ed9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -57,11 +57,11 @@
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1742069588,
|
||||
"narHash": "sha256-C7jVfohcGzdZRF6DO+ybyG/sqpo1h6bZi9T56sxLy+k=",
|
||||
"lastModified": 1751637120,
|
||||
"narHash": "sha256-xVNy/XopSfIG9c46nRmPaKfH1Gn/56vQ8++xWA8itO4=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "c80f6a7e10b39afcc1894e02ef785b1ad0b0d7e5",
|
||||
"rev": "5c724ed1388e53cc231ed98330a60eb2f7be4be3",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -116,11 +116,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1715940852,
|
||||
"narHash": "sha256-wJqHMg/K6X3JGAE9YLM0LsuKrKb4XiBeVaoeMNlReZg=",
|
||||
"lastModified": 1750931469,
|
||||
"narHash": "sha256-0IEdQB1nS+uViQw4k3VGUXntjkDp7aAlqcxdewb/hAc=",
|
||||
"owner": "numtide",
|
||||
"repo": "treefmt-nix",
|
||||
"rev": "2fba33a182602b9d49f0b2440513e5ee091d838b",
|
||||
"rev": "ac8e6f32e11e9c7f153823abc3ab007f2a65d3e1",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
||||
@@ -19,12 +19,13 @@
|
||||
overlays = [ krew2nix.overlay ];
|
||||
inherit system;
|
||||
};
|
||||
python = (pkgs.python313.withPackages (python-pkgs: with python-pkgs; [
|
||||
hvac
|
||||
]));
|
||||
in
|
||||
pkgs.mkShell {
|
||||
packages = with pkgs; [
|
||||
(python313.withPackages (python-pkgs: with python-pkgs; [
|
||||
hvac
|
||||
]))
|
||||
python
|
||||
vim gnumake
|
||||
talosctl cilium-cli
|
||||
kubectx k9s kubernetes-helm
|
||||
@@ -53,6 +54,8 @@
|
||||
|
||||
# Add scripts from utils subdir
|
||||
export PATH="$PATH:$(pwd)/utils"
|
||||
|
||||
export PYTHON_BIN=${python}/bin/python
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
38
infra/configs/ovh-cert-manager-secret.yaml
Normal file
38
infra/configs/ovh-cert-manager-secret.yaml
Normal file
@@ -0,0 +1,38 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: ovh-credentials
|
||||
namespace: cert-manager
|
||||
---
|
||||
apiVersion: secrets.hashicorp.com/v1beta1
|
||||
kind: VaultAuth
|
||||
metadata:
|
||||
name: cert-manager
|
||||
namespace: cert-manager
|
||||
spec:
|
||||
method: kubernetes
|
||||
mount: kubernetes
|
||||
kubernetes:
|
||||
role: cert-manager
|
||||
serviceAccount: ovh-credentials
|
||||
---
|
||||
apiVersion: secrets.hashicorp.com/v1beta1
|
||||
kind: VaultStaticSecret
|
||||
metadata:
|
||||
name: webhook-ovh-credentials
|
||||
namespace: cert-manager
|
||||
spec:
|
||||
type: kv-v2
|
||||
|
||||
mount: secret
|
||||
path: ovh-cert-manager
|
||||
|
||||
destination:
|
||||
create: true
|
||||
name: ovh-credentials
|
||||
type: Opaque
|
||||
transformation:
|
||||
excludeRaw: true
|
||||
|
||||
vaultAuthRef: cert-manager
|
||||
@@ -16,3 +16,5 @@ parameters:
|
||||
poolAffinityTopologyLabel: |
|
||||
type: hdd
|
||||
provisioner: io.openebs.csi-mayastor
|
||||
# Allow expansion of volumes
|
||||
allowVolumeExpansion: true
|
||||
|
||||
18
infra/configs/single-ssd-sc.yaml
Normal file
18
infra/configs/single-ssd-sc.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
apiVersion: storage.k8s.io/v1
|
||||
kind: StorageClass
|
||||
metadata:
|
||||
name: mayastor-single-ssd
|
||||
parameters:
|
||||
protocol: nvmf
|
||||
# Single replica
|
||||
repl: "1"
|
||||
# Thin provision volumes
|
||||
thin: "true"
|
||||
# Generate new filesystem's uuid when cloning
|
||||
cloneFsIdAsVolumeId: "true"
|
||||
# Schedule this sconly on ssd
|
||||
poolAffinityTopologyLabel: |
|
||||
type: ssd
|
||||
provisioner: io.openebs.csi-mayastor
|
||||
# Allow expansion of volumes
|
||||
allowVolumeExpansion: true
|
||||
@@ -18,14 +18,14 @@ spec:
|
||||
chart:
|
||||
spec:
|
||||
chart: cert-manager-webhook-ovh
|
||||
version: 0.7.3
|
||||
version: 0.8.0
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: cert-manager-webhook-ovh
|
||||
namespace: cert-manager
|
||||
interval: 12h
|
||||
values:
|
||||
configVersion: 0.0.1
|
||||
configVersion: 0.0.2
|
||||
groupName: lumpiasty-homelab
|
||||
certManager:
|
||||
namespace: cert-manager
|
||||
@@ -38,6 +38,7 @@ spec:
|
||||
acmeServerUrl: https://acme-v02.api.letsencrypt.org/directory
|
||||
email: arek.dzski@gmail.com
|
||||
ovhEndpointName: ovh-eu
|
||||
ovhAuthenticationMethod: application
|
||||
ovhAuthenticationRef:
|
||||
applicationKeyRef:
|
||||
name: ovh-credentials
|
||||
@@ -45,6 +46,6 @@ spec:
|
||||
applicationSecretRef:
|
||||
name: ovh-credentials
|
||||
key: applicationSecret
|
||||
consumerKeyRef:
|
||||
applicationConsumerKeyRef:
|
||||
name: ovh-credentials
|
||||
key: consumerKey
|
||||
|
||||
@@ -23,7 +23,7 @@ spec:
|
||||
chart:
|
||||
spec:
|
||||
chart: cert-manager
|
||||
version: 1.17.0
|
||||
version: v1.19.1
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: cert-manager
|
||||
|
||||
@@ -23,7 +23,7 @@ spec:
|
||||
chart:
|
||||
spec:
|
||||
chart: cilium
|
||||
version: 1.17.2
|
||||
version: 1.18.2
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: cilium
|
||||
|
||||
31
infra/controllers/cloudnative-pg.yaml
Normal file
31
infra/controllers/cloudnative-pg.yaml
Normal file
@@ -0,0 +1,31 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: cnpg-system
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: cnpg
|
||||
namespace: cnpg-system
|
||||
spec:
|
||||
interval: 24h
|
||||
url: https://cloudnative-pg.github.io/charts
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: cnpg
|
||||
namespace: cnpg-system
|
||||
spec:
|
||||
interval: 30m
|
||||
chart:
|
||||
spec:
|
||||
chart: cloudnative-pg
|
||||
version: 0.26.0
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: cnpg
|
||||
namespace: cnpg-system
|
||||
interval: 12h
|
||||
@@ -97,7 +97,7 @@ spec:
|
||||
env:
|
||||
- name: GOMEMLIMIT
|
||||
value: 161MiB
|
||||
image: registry.k8s.io/coredns/coredns:v1.12.0
|
||||
image: registry.k8s.io/coredns/coredns:v1.13.0
|
||||
imagePullPolicy: IfNotPresent
|
||||
livenessProbe:
|
||||
failureThreshold: 5
|
||||
|
||||
32
infra/controllers/external-secrets.yaml
Normal file
32
infra/controllers/external-secrets.yaml
Normal file
@@ -0,0 +1,32 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: external-secrets
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: external-secrets
|
||||
namespace: external-secrets
|
||||
spec:
|
||||
interval: 24h
|
||||
url: https://charts.external-secrets.io
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: external-secrets
|
||||
namespace: external-secrets
|
||||
spec:
|
||||
interval: 30m
|
||||
chart:
|
||||
spec:
|
||||
chart: external-secrets
|
||||
version: 0.16.2
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: external-secrets
|
||||
namespace: external-secrets
|
||||
interval: 12h
|
||||
values:
|
||||
@@ -23,7 +23,7 @@ spec:
|
||||
chart:
|
||||
spec:
|
||||
chart: k8up
|
||||
version: 4.8.3
|
||||
version: 4.8.6
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: k8up-io
|
||||
|
||||
33
infra/controllers/mongodb-operator.yaml
Normal file
33
infra/controllers/mongodb-operator.yaml
Normal file
@@ -0,0 +1,33 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: mongodb
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: mongodb
|
||||
namespace: mongodb
|
||||
spec:
|
||||
interval: 24h
|
||||
url: https://mongodb.github.io/helm-charts
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: mongodb-operator
|
||||
namespace: mongodb
|
||||
spec:
|
||||
interval: 30m
|
||||
chart:
|
||||
spec:
|
||||
chart: community-operator
|
||||
version: 0.13.0
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: mongodb
|
||||
namespace: mongodb
|
||||
values:
|
||||
operator:
|
||||
watchNamespace: "*"
|
||||
@@ -2,32 +2,32 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: nginx-ingress-controller
|
||||
name: nginx-ingress
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: nginx
|
||||
namespace: nginx-ingress-controller
|
||||
name: ingress-nginx
|
||||
namespace: nginx-ingress
|
||||
spec:
|
||||
interval: 24h
|
||||
url: https://helm.nginx.com/stable
|
||||
url: https://kubernetes.github.io/ingress-nginx
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: nginx-ingress
|
||||
namespace: nginx-ingress-controller
|
||||
namespace: nginx-ingress
|
||||
spec:
|
||||
interval: 30m
|
||||
chart:
|
||||
spec:
|
||||
chart: nginx-ingress
|
||||
version: 2.0.1
|
||||
chart: ingress-nginx
|
||||
version: 4.13.3
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: nginx
|
||||
namespace: nginx-ingress-controller
|
||||
name: ingress-nginx
|
||||
namespace: nginx-ingress
|
||||
interval: 12h
|
||||
values:
|
||||
controller:
|
||||
@@ -39,9 +39,11 @@ spec:
|
||||
cpu: 100m
|
||||
memory: 128Mi
|
||||
|
||||
ingressClass:
|
||||
create: true
|
||||
setAsDefaultIngress: true
|
||||
ingressClass: "nginx-ingress"
|
||||
ingressClassResource:
|
||||
name: "nginx-ingress"
|
||||
enabled: true
|
||||
default: false
|
||||
|
||||
service:
|
||||
create: true
|
||||
@@ -49,8 +51,11 @@ spec:
|
||||
# Requirement for sharing ip with other service
|
||||
externalTrafficPolicy: Cluster
|
||||
ipFamilyPolicy: RequireDualStack
|
||||
ipFamilies:
|
||||
- IPv4
|
||||
- IPv6
|
||||
annotations:
|
||||
# Share IP with gitea ssh so we can have the same domain for both port
|
||||
lbipam.cilium.io/sharing-key: gitea
|
||||
lbipam.cilium.io/sharing-cross-namespace: gitea
|
||||
lbipam.cilium.io/ips: 10.44.0.0,2001:470:61a3:400::1
|
||||
lbipam.cilium.io/ips: 10.44.0.6,2001:470:61a3:400::6
|
||||
@@ -23,7 +23,7 @@ spec:
|
||||
chart:
|
||||
spec:
|
||||
chart: openbao
|
||||
version: 0.8.1
|
||||
version: 0.19.0
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: openbao
|
||||
@@ -77,3 +77,5 @@ spec:
|
||||
storageClass: mayastor-single-hdd
|
||||
csi:
|
||||
enabled: true
|
||||
injector:
|
||||
affinity: ""
|
||||
|
||||
@@ -23,7 +23,7 @@ spec:
|
||||
chart:
|
||||
spec:
|
||||
chart: openebs
|
||||
version: 4.1.3
|
||||
version: 4.3.3
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: openebs
|
||||
@@ -63,7 +63,7 @@ spec:
|
||||
# Workaround for crashing io-engine
|
||||
# https://github.com/openebs/mayastor/issues/1763#issuecomment-2481922234
|
||||
envcontext: "iova-mode=pa"
|
||||
coreList: [2, 3]
|
||||
coreList: [1, 7]
|
||||
resources:
|
||||
limits:
|
||||
cpu: 4
|
||||
@@ -102,6 +102,25 @@ spec:
|
||||
requests:
|
||||
cpu: 0
|
||||
|
||||
# Remove antiaffinity, breaks when I set it to 1 replica
|
||||
nats:
|
||||
cluster:
|
||||
enable: true
|
||||
replicas: 3
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution: []
|
||||
|
||||
loki:
|
||||
loki:
|
||||
commonConfig:
|
||||
replication_factor: 1
|
||||
singleBinary:
|
||||
replicas: 1
|
||||
minio:
|
||||
replicas: 1
|
||||
mode: standalone
|
||||
|
||||
engines:
|
||||
local:
|
||||
lvm:
|
||||
|
||||
35
infra/controllers/vault-secrets-operator.yaml
Normal file
35
infra/controllers/vault-secrets-operator.yaml
Normal file
@@ -0,0 +1,35 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: vault-secrets-operator
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: HelmRepository
|
||||
metadata:
|
||||
name: hashicorp
|
||||
namespace: vault-secrets-operator
|
||||
spec:
|
||||
interval: 24h
|
||||
url: https://helm.releases.hashicorp.com
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: vault-secrets-operator
|
||||
namespace: vault-secrets-operator
|
||||
spec:
|
||||
interval: 30m
|
||||
chart:
|
||||
spec:
|
||||
chart: vault-secrets-operator
|
||||
version: 1.0.1
|
||||
sourceRef:
|
||||
kind: HelmRepository
|
||||
name: hashicorp
|
||||
namespace: vault-secrets-operator
|
||||
interval: 12h
|
||||
values:
|
||||
defaultVaultConnection:
|
||||
enabled: true
|
||||
address: "https://openbao.lumpiasty.xyz:8200"
|
||||
@@ -1,4 +1,4 @@
|
||||
apiVersion: "openebs.io/v1beta2"
|
||||
apiVersion: "openebs.io/v1beta3"
|
||||
kind: DiskPool
|
||||
metadata:
|
||||
name: anapistula-delrosalae-hdd
|
||||
|
||||
11
infra/diskpools/anapistula-delrosalae-ssd.yaml
Normal file
11
infra/diskpools/anapistula-delrosalae-ssd.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
apiVersion: "openebs.io/v1beta3"
|
||||
kind: DiskPool
|
||||
metadata:
|
||||
name: anapistula-delrosalae-ssd
|
||||
namespace: openebs
|
||||
spec:
|
||||
node: anapistula-delrosalae
|
||||
disks: ["aio:///dev/disk/by-id/nvme-eui.000000000000000000a07501ead1ebdb"]
|
||||
topology:
|
||||
labelled:
|
||||
type: ssd
|
||||
@@ -3,16 +3,23 @@ kind: Kustomization
|
||||
resources:
|
||||
- controllers/k8up-crd-4.8.3.yaml
|
||||
- controllers/cilium.yaml
|
||||
- controllers/nginx.yaml
|
||||
- controllers/nginx-ingress.yaml
|
||||
- controllers/dns-public.yaml
|
||||
- controllers/cert-manager.yaml
|
||||
- controllers/cert-manager-webhook-ovh.yaml
|
||||
- controllers/openebs.yaml
|
||||
- controllers/k8up.yaml
|
||||
- controllers/openbao.yaml
|
||||
- controllers/external-secrets.yaml
|
||||
- controllers/vault-secrets-operator.yaml
|
||||
- controllers/mongodb-operator.yaml
|
||||
- controllers/cloudnative-pg.yaml
|
||||
- diskpools/anapistula-delrosalae-hdd.yaml
|
||||
- diskpools/anapistula-delrosalae-ssd.yaml
|
||||
- configs/bgp-cluster-config.yaml
|
||||
- configs/loadbalancer-ippool.yaml
|
||||
- configs/single-hdd-sc.yaml
|
||||
- configs/single-ssd-sc.yaml
|
||||
- configs/mayastor-snapshotclass.yaml
|
||||
- configs/openbao-cert.yaml
|
||||
- configs/ovh-cert-manager-secret.yaml
|
||||
|
||||
16
monke/gpt-researcher.yaml
Normal file
16
monke/gpt-researcher.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: tavily
|
||||
namespace: gpt-researcher
|
||||
stringData:
|
||||
TAVILY_API_KEY: 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
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: openrouter
|
||||
namespace: gpt-researcher
|
||||
stringData:
|
||||
OPENROUTER_API_KEY: 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
|
||||
3
pyrightconfig.json
Normal file
3
pyrightconfig.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"allowedUntypedLibraries": ["hvac"]
|
||||
}
|
||||
@@ -1,10 +1,14 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"kubernetes": {
|
||||
"fileMatch": ["\\.yaml$"]
|
||||
"fileMatch": ["infra/.+\\.yaml$", "apps/.+\\.yaml$"]
|
||||
},
|
||||
"flux": {
|
||||
"fileMatch": ["infra/.+\\.yaml$", "apps/.+\\.yaml$"]
|
||||
"fileMatch": [
|
||||
"infra/.+\\.yaml$",
|
||||
"apps/.+\\.yaml$",
|
||||
"gotk-components\\.ya?ml$"
|
||||
]
|
||||
},
|
||||
"prHourlyLimit": 9
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
machine:
|
||||
network:
|
||||
interfaces:
|
||||
- interface: enp4s0
|
||||
- interface: eno1
|
||||
addresses:
|
||||
- 2001:470:61a3:100::3/64
|
||||
- 192.168.1.35/24
|
||||
@@ -10,13 +10,20 @@ machine:
|
||||
gateway: 2001:470:61a3:100:ffff:ffff:ffff:ffff
|
||||
- network: 0.0.0.0/0
|
||||
gateway: 192.168.1.1
|
||||
mtu: 1500
|
||||
mtu: 1280
|
||||
|
||||
install:
|
||||
diskSelector:
|
||||
wwid: t10.ATA SSDPR-CX400-256 GUH039914
|
||||
# Generated on https://factory.talos.dev/
|
||||
# intel-ucode and amdgpu
|
||||
image: factory.talos.dev/installer/06deebb947b815afa53f04c450d355d3c8bc28927a387c754db1622a0a06349e:v1.9.5
|
||||
# amd-ucode and amdgpu
|
||||
image: factory.talos.dev/metal-installer/9c1d1b442d73f96dcd04e81463eb20000ab014062d22e1b083e1773336bc1dd5:v1.10.6
|
||||
extraKernelArgs:
|
||||
- cpufreq.default_governor=performance
|
||||
sysfs:
|
||||
devices.system.cpu.cpu0.cpufreq.scaling_max_freq: "550000"
|
||||
devices.system.cpu.cpu1.cpufreq.scaling_max_freq: "550000"
|
||||
devices.system.cpu.cpu2.cpufreq.scaling_max_freq: "550000"
|
||||
devices.system.cpu.cpu6.cpufreq.scaling_max_freq: "550000"
|
||||
devices.system.cpu.cpu7.cpufreq.scaling_max_freq: "550000"
|
||||
devices.system.cpu.cpu8.cpufreq.scaling_max_freq: "550000"
|
||||
|
||||
11
talos/patches/frigate.patch
Normal file
11
talos/patches/frigate.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
# CSI driver requirement
|
||||
cluster:
|
||||
apiServer:
|
||||
admissionControl:
|
||||
- name: PodSecurity
|
||||
configuration:
|
||||
apiVersion: pod-security.admission.config.k8s.io/v1beta1
|
||||
kind: PodSecurityConfiguration
|
||||
exemptions:
|
||||
namespaces:
|
||||
- frigate
|
||||
11
talos/patches/llama.patch
Normal file
11
talos/patches/llama.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
# CSI driver requirement
|
||||
cluster:
|
||||
apiServer:
|
||||
admissionControl:
|
||||
- name: PodSecurity
|
||||
configuration:
|
||||
apiVersion: pod-security.admission.config.k8s.io/v1beta1
|
||||
kind: PodSecurityConfiguration
|
||||
exemptions:
|
||||
namespaces:
|
||||
- llama
|
||||
11
talos/patches/ollama.patch
Normal file
11
talos/patches/ollama.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
# CSI driver requirement
|
||||
cluster:
|
||||
apiServer:
|
||||
admissionControl:
|
||||
- name: PodSecurity
|
||||
configuration:
|
||||
apiVersion: pod-security.admission.config.k8s.io/v1beta1
|
||||
kind: PodSecurityConfiguration
|
||||
exemptions:
|
||||
namespaces:
|
||||
- ollama
|
||||
@@ -16,7 +16,7 @@ machine:
|
||||
- rw
|
||||
install:
|
||||
extraKernelArgs:
|
||||
- isolcpus=2,3
|
||||
- isolcpus=1,7
|
||||
|
||||
cluster:
|
||||
apiServer:
|
||||
|
||||
@@ -2,14 +2,15 @@
|
||||
|
||||
import argparse
|
||||
import os
|
||||
from hvac.api.system_backend import mount
|
||||
import yaml
|
||||
from typing import Any, cast
|
||||
|
||||
import hvac
|
||||
from hvac.api.auth_methods import Kubernetes, kubernetes
|
||||
from hvac.api.auth_methods import Kubernetes
|
||||
import yaml
|
||||
|
||||
# Read vault/policies dir then write what is there and delete missing
|
||||
def synchronize_policies(client: hvac.Client):
|
||||
policies = {}
|
||||
policies: dict[str, str] = {}
|
||||
# Read all policies files
|
||||
policy_dir = os.path.join(os.path.dirname(__file__), '../vault/policy')
|
||||
for filename in os.listdir(policy_dir):
|
||||
@@ -17,7 +18,7 @@ def synchronize_policies(client: hvac.Client):
|
||||
policy_name = os.path.splitext(filename)[0]
|
||||
policies[policy_name] = f.read()
|
||||
|
||||
policies_on_vault = client.sys.list_policies()['data']['policies']
|
||||
policies_on_vault: list[str] = cast(list[str], client.sys.list_policies()['data']['policies'])
|
||||
|
||||
# Delete policies that should not be there
|
||||
for policy in policies_on_vault:
|
||||
@@ -30,34 +31,41 @@ def synchronize_policies(client: hvac.Client):
|
||||
print(f'Updating policy: {policy_name}')
|
||||
client.sys.create_or_update_acl_policy(policy_name, policy_content)
|
||||
|
||||
# Read vault/kubernetes-config.yaml and write it to kubernetes auth method config
|
||||
def synchronize_auth_kubernetes_config(client: hvac.Client):
|
||||
config_file = os.path.join(os.path.dirname(__file__), '../vault/kubernetes-config.yaml')
|
||||
with open(config_file, 'r') as f:
|
||||
config = cast(dict[str, str], yaml.safe_load(f.read()))
|
||||
_ = client.write_data('/auth/kubernetes/config', data=config)
|
||||
|
||||
# Read vault/kubernetes-roles dir then write what is there and delete missing
|
||||
def synchronize_kubernetes_roles(client: hvac.Client):
|
||||
kubernetes = Kubernetes(client.adapter)
|
||||
|
||||
policy_dir = os.path.join(os.path.dirname(__file__), '../vault/kubernetes-roles/')
|
||||
|
||||
roles = {}
|
||||
roles: dict[str, Any] = {} # pyright:ignore[reportExplicitAny]
|
||||
for filename in os.listdir(policy_dir):
|
||||
with open(os.path.join(policy_dir, filename), 'r') as f:
|
||||
role_name = os.path.splitext(filename)[0]
|
||||
roles[role_name] = yaml.safe_load(f.read())
|
||||
|
||||
roles_on_vault = []
|
||||
roles_on_vault: list[str] = []
|
||||
try:
|
||||
roles_on_vault = kubernetes.list_roles()['keys']
|
||||
except hvac.exceptions.InvalidPath:
|
||||
roles_on_vault = cast(list[str], kubernetes.list_roles()['keys'])
|
||||
except hvac.exceptions.InvalidPath: # pyright:ignore[reportAttributeAccessIssue, reportUnknownMemberType]
|
||||
print("No roles found on server!")
|
||||
|
||||
|
||||
for role in roles_on_vault:
|
||||
if role not in roles_on_vault:
|
||||
if role not in roles:
|
||||
print(f'Deleting role: {role}')
|
||||
kubernetes.delete_role(role)
|
||||
|
||||
for role_name, role_content in roles.items():
|
||||
for role_name, role_content in roles.items(): # pyright:ignore[reportAny]
|
||||
print(f'Updating role: {role_name}')
|
||||
# Using write data instead of kubernetes.create_role, we can pass raw yaml
|
||||
client.write_data(f'/auth/kubernetes/role/{role_name}', data=role_content)
|
||||
_ = client.write_data(f'/auth/kubernetes/role/{role_name}', data=role_content) # pyright:ignore[reportAny]
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(
|
||||
@@ -71,5 +79,8 @@ if __name__ == '__main__':
|
||||
print('Synchronizing policies')
|
||||
synchronize_policies(client)
|
||||
|
||||
print('Synchronizing kubernetes config')
|
||||
synchronize_auth_kubernetes_config(client)
|
||||
|
||||
print('Synchronizing kubernetes roles')
|
||||
synchronize_kubernetes_roles(client)
|
||||
|
||||
1
vault/kubernetes-config.yaml
Normal file
1
vault/kubernetes-config.yaml
Normal file
@@ -0,0 +1 @@
|
||||
kubernetes_host: https://10.43.0.1:443
|
||||
6
vault/kubernetes-roles/backup.yaml
Normal file
6
vault/kubernetes-roles/backup.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
bound_service_account_names:
|
||||
- backup
|
||||
bound_service_account_namespaces:
|
||||
- gitea
|
||||
token_policies:
|
||||
- backup
|
||||
6
vault/kubernetes-roles/cert-manager.yaml
Normal file
6
vault/kubernetes-roles/cert-manager.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
bound_service_account_names:
|
||||
- ovh-credentials
|
||||
bound_service_account_namespaces:
|
||||
- cert-manager
|
||||
token_policies:
|
||||
- ovh-credentials
|
||||
6
vault/kubernetes-roles/frigate-camera.yaml
Normal file
6
vault/kubernetes-roles/frigate-camera.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
bound_service_account_names:
|
||||
- camera
|
||||
bound_service_account_namespaces:
|
||||
- frigate
|
||||
token_policies:
|
||||
- frigate
|
||||
6
vault/kubernetes-roles/immich.yaml
Normal file
6
vault/kubernetes-roles/immich.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
bound_service_account_names:
|
||||
- immich-password
|
||||
bound_service_account_namespaces:
|
||||
- immich
|
||||
token_policies:
|
||||
- immich
|
||||
6
vault/kubernetes-roles/llama-proxy.yaml
Normal file
6
vault/kubernetes-roles/llama-proxy.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
bound_service_account_names:
|
||||
- llama-proxy
|
||||
bound_service_account_namespaces:
|
||||
- llama
|
||||
token_policies:
|
||||
- ollama
|
||||
6
vault/kubernetes-roles/ollama-proxy.yaml
Normal file
6
vault/kubernetes-roles/ollama-proxy.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
bound_service_account_names:
|
||||
- ollama-proxy
|
||||
bound_service_account_namespaces:
|
||||
- ollama
|
||||
token_policies:
|
||||
- ollama
|
||||
6
vault/kubernetes-roles/renovate.yaml
Normal file
6
vault/kubernetes-roles/renovate.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
bound_service_account_names:
|
||||
- renovate
|
||||
bound_service_account_namespaces:
|
||||
- renovate
|
||||
token_policies:
|
||||
- renovate
|
||||
7
vault/policy/backup.hcl
Normal file
7
vault/policy/backup.hcl
Normal file
@@ -0,0 +1,7 @@
|
||||
path "secret/data/restic" {
|
||||
capabilities = ["read"]
|
||||
}
|
||||
|
||||
path "secret/data/backblaze" {
|
||||
capabilities = ["read"]
|
||||
}
|
||||
4
vault/policy/frigate.hcl
Normal file
4
vault/policy/frigate.hcl
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
path "secret/data/cameras" {
|
||||
capabilities = ["read"]
|
||||
}
|
||||
4
vault/policy/immich.hcl
Normal file
4
vault/policy/immich.hcl
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
path "secret/data/immich-db" {
|
||||
capabilities = ["read"]
|
||||
}
|
||||
3
vault/policy/ollama.hcl
Normal file
3
vault/policy/ollama.hcl
Normal file
@@ -0,0 +1,3 @@
|
||||
path "secret/data/ollama" {
|
||||
capabilities = ["read"]
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user