207 Commits

Author SHA1 Message Date
Morten Olsen
ca80b72cb1 Update image tag to version 0.0.30 2026-02-07 09:03:40 +01:00
Morten Olsen
556f883bab update glados secrets 2026-02-05 23:52:00 +01:00
Morten Olsen
b7ee31a736 add glados 2026-02-02 16:35:00 +01:00
renovate[bot]
5f2fd756a7 Pin dependencies (#59)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-21 22:05:44 +01:00
Morten Olsen
46753fba60 add tandoor 2026-01-19 05:43:39 +01:00
Morten Olsen
e604e03831 secret templatte documentation 2026-01-19 04:57:59 +01:00
Morten Olsen
8675c34822 disable tubearchivist 2026-01-18 20:20:54 +01:00
Morten Olsen
05f8271e0d disable homarr 2026-01-18 20:18:51 +01:00
Morten Olsen
8be66d92a0 support all in one template 2026-01-18 20:16:40 +01:00
Morten Olsen
0b7d221180 add komga 2026-01-18 13:14:15 +01:00
Morten Olsen
7bf747402d correctly disabled paperless 2026-01-10 18:08:49 +01:00
Morten Olsen
8ff2e8268c enable wildcard on coder 2026-01-10 10:32:29 +01:00
Morten Olsen
68fc164c57 disable paperless 2026-01-10 10:26:13 +01:00
Morten Olsen
b553a9e6ce add intel gpu to ollama 2026-01-08 15:20:13 +01:00
Morten Olsen
d79d3bfaba add valkey to paperless 2026-01-08 12:30:52 +01:00
Morten Olsen
56232a1569 remove secret rotation 2026-01-08 12:26:13 +01:00
Morten Olsen
3e13c355f5 add paperless-ngx 2026-01-08 12:11:37 +01:00
Morten Olsen
284b899ab0 disable auto rotation of secrets 2026-01-06 09:09:40 +01:00
renovate[bot]
1c347e7f14 Pin dependencies (#58)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-05 16:37:23 +01:00
Morten Olsen
3c3234898d recreate image pvc 2026-01-05 16:22:54 +01:00
Morten Olsen
fc93c01795 add tubearchivist 2026-01-05 15:33:47 +01:00
Morten Olsen
aeb99ce6d5 add kids jellyfin 2026-01-05 13:27:01 +01:00
Morten Olsen
63c863b7e1 use persistent storage class 2026-01-05 13:24:19 +01:00
Morten Olsen
8bfb79bf83 increate jellyfin space 2026-01-05 08:55:42 +01:00
Morten Olsen
f42a167653 add scanopy 2026-01-05 00:00:53 +01:00
Morten Olsen
a46edfee5d zot-fix 2026-01-03 23:40:51 +01:00
Morten Olsen
d091f8feca fix mollysocket issue 2026-01-03 23:31:14 +01:00
Morten Olsen
c7824eb179 use public DNS on uptime kuma 2026-01-03 23:24:03 +01:00
Morten Olsen
9ee9abeadf add cups 2026-01-03 13:30:29 +01:00
Morten Olsen
434d9ed7a2 migrate immich 2026-01-03 12:52:21 +01:00
Morten Olsen
71feab50b1 add database to immich 2026-01-03 12:50:00 +01:00
Morten Olsen
c1c0ae8707 add db to baikal 2026-01-03 08:45:29 +01:00
Morten Olsen
d5a9bec508 remove legacy environment 2026-01-02 14:52:58 +01:00
Morten Olsen
1eaba01644 fix for immich db password 2026-01-02 14:50:16 +01:00
Morten Olsen
c50ce95086 start immich 2026-01-02 14:40:48 +01:00
Morten Olsen
be85172acf stop immich 2026-01-02 14:37:50 +01:00
Morten Olsen
f7a21fe704 initial immich migration 2026-01-02 14:32:30 +01:00
Morten Olsen
4aff162d1a migate bytestash 2026-01-02 13:59:58 +01:00
Morten Olsen
0205a58d2e migrate zot 2026-01-02 13:56:19 +01:00
Morten Olsen
c35196c657 migrate gitea 2026-01-02 13:52:34 +01:00
Morten Olsen
1a3c04df57 migrate reservoir 2026-01-02 13:37:22 +01:00
Morten Olsen
f203b6e4cd migrate umami 2026-01-02 13:35:09 +01:00
Morten Olsen
e15e33e16a migrate vikunja 2026-01-02 13:31:34 +01:00
Morten Olsen
c0c2f580cd migrate metabase 2026-01-02 13:28:11 +01:00
Morten Olsen
bec0a6face migate mealie 2026-01-02 13:24:45 +01:00
Morten Olsen
d150b96082 migrate homebox 2026-01-02 13:19:49 +01:00
Morten Olsen
eb443b9ae5 cleanup 2026-01-02 12:36:56 +01:00
Morten Olsen
8a08bbf793 migate homeassistant 2026-01-02 11:48:09 +01:00
Morten Olsen
1b626def24 migate n8n 2026-01-02 11:43:56 +01:00
Morten Olsen
ee3c103dc4 migate openwebui 2026-01-02 11:39:05 +01:00
Morten Olsen
b7256afac8 migrate homarr 2026-01-02 11:26:11 +01:00
Morten Olsen
b64ce72f3c migrate miniflux 2026-01-02 10:56:51 +01:00
Morten Olsen
4f88506ba7 migrate readeck 2026-01-02 10:36:07 +01:00
Morten Olsen
04f7abf186 remove unused apps 2026-01-02 10:19:50 +01:00
Morten Olsen
a00629694c fix: readd version history limit 2026-01-02 09:31:23 +01:00
Morten Olsen
faaad9dac4 migrate forgejo 2026-01-02 09:22:22 +01:00
Morten Olsen
8f3f96a685 simplified runner script 2026-01-02 00:20:53 +01:00
Morten Olsen
c50095a0b6 add forgejo runner 2026-01-01 22:43:35 +01:00
Morten Olsen
fb70ca519c cleanup 2026-01-01 21:32:20 +01:00
Morten Olsen
432607dfe8 migrate jellyfin 2026-01-01 21:25:52 +01:00
Morten Olsen
6bf0048f5b add new auth to coder 2026-01-01 20:50:57 +01:00
Morten Olsen
4e0b6ed008 moved common outside application set 2026-01-01 20:39:28 +01:00
Morten Olsen
d5a0803eee add database 2026-01-01 20:34:24 +01:00
Morten Olsen
9ac5b61a38 migrate gitea, coder and esphome 2026-01-01 18:01:41 +01:00
Morten Olsen
44f5a93d46 migate clibre-web 2026-01-01 17:56:09 +01:00
Morten Olsen
4ffa29f111 migrate bytestash 2026-01-01 17:54:49 +01:00
Morten Olsen
d7cc5e8d8b migrate blinko 2026-01-01 17:51:23 +01:00
Morten Olsen
bdf7900036 migrate baikal to new helper chart 2026-01-01 17:49:14 +01:00
Morten Olsen
f03dbea746 transform forgejo 2026-01-01 13:28:58 +01:00
Morten Olsen
f4ff0a20da add dns record 2026-01-01 13:18:52 +01:00
Morten Olsen
a96ec5d185 add new auth audiobookshelf 2026-01-01 12:32:49 +01:00
renovate[bot]
a9f963fc63 chore(deps): update docker images (#57)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-01 12:05:54 +01:00
renovate[bot]
06fc2a097f chore(deps): update docker images (#56)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-01 12:03:38 +01:00
Morten Olsen
e089935603 pin valkey 2026-01-01 12:02:17 +01:00
renovate[bot]
8a7338693e chore(deps): update docker images (#55)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-01 11:47:33 +01:00
Morten Olsen
19f81dcfc5 remove external proxy 2026-01-01 10:02:55 +01:00
Morten Olsen
5006edc768 add test OIDC client 2025-12-29 21:58:44 +01:00
Morten Olsen
76270442b4 add test OIDC client 2025-12-29 13:04:29 +01:00
Morten Olsen
e22ba25b7e feat: support public/private gateway 2025-12-29 11:06:01 +01:00
Morten Olsen
42d0fe6050 restrict immich cpu usage 2025-12-29 02:21:00 +01:00
Morten Olsen
5a77a91dcc reenable vaultwarden 2025-12-28 20:09:23 +01:00
Morten Olsen
d35827bcd6 feat: add immich 2025-12-28 20:05:46 +01:00
renovate[bot]
f80b838d41 chore(deps): update docker images (#54)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-26 10:08:32 +01:00
Morten Olsen
1e74c4dbff dexposed vaultwarden from the internet 2025-12-25 21:17:16 +01:00
Morten Olsen
e301dc1ab1 add vaultwarden 2025-12-25 00:38:25 +01:00
renovate[bot]
5c66e1c6a3 chore(deps): update docker images (#51)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-25 00:21:55 +01:00
Morten Olsen
7cb233b845 enable authentik operator 2025-12-24 00:22:55 +01:00
Morten Olsen
d6107d13a0 add authentik server 2025-12-22 23:34:59 +01:00
Morten Olsen
d41163578a add authentik operator 2025-12-22 23:24:51 +01:00
Morten Olsen
c7d9310118 add homelab operator 2025-12-22 21:06:43 +01:00
Morten Olsen
89b7ec1e21 add pictures to syncthing 2025-12-21 23:07:37 +01:00
Morten Olsen
646bb1c694 add syncthing 2025-12-21 22:33:29 +01:00
Morten Olsen
c4fe4ffefb add woodpecker 2025-12-21 21:10:20 +01:00
renovate[bot]
2ab1db7122 chore(deps): pin dependencies (#50)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-21 12:19:19 +01:00
Morten Olsen
ace5ee7ce5 add forgejo 2025-12-20 23:28:07 +01:00
renovate[bot]
e88c307f23 chore(deps): update docker images (#49)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-20 22:41:35 +01:00
renovate[bot]
781ba80bfc chore(deps): update docker images (#48)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-20 16:18:39 +01:00
Morten Olsen
2628e9d7a9 add immich 2025-12-18 22:12:42 +01:00
Morten Olsen
db06db1fee add sealed secrets 2025-12-18 09:35:01 +01:00
renovate[bot]
c9d6b087ae chore(deps): update docker images (#47)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-16 23:04:42 +01:00
renovate[bot]
1fc3d515ed chore(deps): update docker images (#46)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-16 20:26:01 +01:00
renovate[bot]
de59468b00 chore(deps): pin dependencies (#45)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-15 20:29:49 +01:00
Morten Olsen
5fdd794169 update nuclei 2025-12-13 08:22:17 +01:00
Morten Olsen
6b6b2c4534 bump nuclei operator 2025-12-12 21:54:24 +01:00
Morten Olsen
5412cd1744 update nuclei version 2025-12-12 19:53:56 +01:00
Morten Olsen
b7fb381bbe feat: add nuclei operator 2025-12-12 19:25:15 +01:00
Morten Olsen
4220330245 add drip 2025-12-12 08:39:13 +01:00
Morten Olsen
2b8766c634 switch to calibre-web-automated 2025-12-11 22:56:45 +01:00
renovate[bot]
c0ba17f12b chore(deps): pin dependencies (#43)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-11 13:17:55 +01:00
Morten Olsen
c8103869d8 docs: add agent context 2025-12-11 13:16:20 +01:00
renovate[bot]
b76f47d5d1 chore(deps): update docker images to v2 (#44)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-11 13:14:07 +01:00
Morten Olsen
02b2e5644d change n8n to external runner 2025-12-09 00:04:15 +01:00
Morten Olsen
fbfe0116da expose ollama internally 2025-12-08 22:24:33 +01:00
Morten Olsen
5773f147b1 add blinko 2025-12-08 22:15:00 +01:00
renovate[bot]
659f2bd778 chore(deps): update docker images (#42)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-08 21:57:01 +01:00
Morten Olsen
7d92c8c489 add apps to zerobyte 2025-12-08 21:48:07 +01:00
Morten Olsen
4eb9647d89 disable backup task 2025-12-08 20:50:57 +01:00
Morten Olsen
1b1997eb6c feat: add falco 2025-12-05 09:10:46 +01:00
Morten Olsen
066c3ce78e add truenas route 2025-12-05 08:46:32 +01:00
renovate[bot]
79d434a79f chore(deps): pin dependencies (#41)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-04 23:36:52 +01:00
Morten Olsen
3062e83482 use strict 2025-12-04 23:33:14 +01:00
renovate[bot]
1325e57188 chore(config): migrate config renovate.json5 (#39)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-04 23:29:10 +01:00
Morten Olsen
c8cf31a151 updated renovate to update apps as well as have a 2 day release age 2025-12-04 23:26:22 +01:00
Morten Olsen
371b703fa2 fix pen pot 2025-12-04 23:09:25 +01:00
Morten Olsen
cde3debdc8 feat: add homebox 2025-12-04 22:37:01 +01:00
Morten Olsen
452e6071cf feat add memos 2025-12-04 21:03:02 +01:00
Morten Olsen
76cf7f4824 feat: add uptime kuma 2025-12-04 20:19:03 +01:00
Morten Olsen
0d1a876dde fix: remove restic frontend 2025-12-04 13:21:23 +01:00
Morten Olsen
e40cc30422 add backup to argo 2025-12-04 13:19:30 +01:00
Morten Olsen
0b0a6f4d6c move environment into argo 2025-12-04 13:11:57 +01:00
renovate[bot]
4db3cd4ed4 chore(deps): pin docker.umami.is/umami-software/umami docker tag to e3ef93b (#37)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-04 11:26:41 +01:00
Morten Olsen
1a5322172f fix: remove empty prop 2025-12-04 11:08:07 +01:00
Morten Olsen
f36a3fab35 feat: add umami 2025-12-04 10:43:26 +01:00
Morten Olsen
8f394b2585 feat: add reloader 2025-12-04 10:20:30 +01:00
Morten Olsen
cc075f3af3 migrate to virtual services 2025-12-04 09:48:53 +01:00
Morten Olsen
0368d4e147 migrate first service to virtual service 2025-12-04 09:32:00 +01:00
Morten Olsen
d9b7dcd154 update kyverne 2025-12-04 09:00:53 +01:00
Morten Olsen
401a08831c disable grafana 2025-12-04 08:48:08 +01:00
Morten Olsen
605f804188 feat: add loki 2025-12-04 08:44:58 +01:00
Morten Olsen
7ec7105aeb add kube prometheus stack 2025-12-04 08:10:11 +01:00
Morten Olsen
7fc1cef442 feat: add kyverno 2025-12-04 08:02:21 +01:00
Morten Olsen
ff000854db scope foundation apps 2025-12-04 07:53:40 +01:00
Morten Olsen
61a12bcc41 fixes 2025-12-03 23:36:50 +01:00
renovate[bot]
c5ac34e274 chore(deps): update docker images (#35)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-03 23:34:02 +01:00
Morten Olsen
df3ccebafc renovate security guards 2025-12-03 23:33:33 +01:00
Morten Olsen
1851a6a506 cleanup 2025-12-03 23:23:06 +01:00
Morten Olsen
a8e86c3e74 feat: add vikunja 2025-12-03 23:10:39 +01:00
Morten Olsen
448eced634 add-nats 2025-12-03 21:46:59 +01:00
Morten Olsen
37600ea101 add backup 2025-12-03 21:06:57 +01:00
Morten Olsen
e249df8693 add shared resources 2025-12-03 20:23:09 +01:00
Morten Olsen
164570237b feat: add redis operator 2025-12-03 20:08:51 +01:00
Morten Olsen
8f044b62b3 feat: add foundation 2025-12-03 18:46:59 +01:00
Morten Olsen
05bfcfed2c restructure app 2025-12-03 15:58:49 +01:00
renovate[bot]
161a1eb062 chore(deps): update docker images (#33)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-03 13:54:50 +01:00
Morten Olsen
5b1127912d chore: switch to main 2025-12-03 13:44:06 +01:00
Morten Olsen
1c403e013c Argo (#34)
* update

* migrate remaining applications
2025-12-03 13:31:33 +01:00
renovate[bot]
2abb883c59 chore(deps): update docker images (#32)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-01 10:17:18 +01:00
renovate[bot]
8a4ed5eaa2 chore(deps): update docker images (#31)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-24 21:46:38 +01:00
Morten Olsen
1484649910 add kids music 2025-11-24 21:46:17 +01:00
Morten Olsen
a2ee42495e add mollysocket 2025-11-20 23:02:59 +01:00
Morten Olsen
63e28f5b64 add ntfy 2025-11-20 21:56:05 +01:00
renovate[bot]
715c8fd368 chore(deps): update docker images (#30)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-16 23:09:45 +01:00
Morten Olsen
165ac88918 update 2025-11-13 21:28:47 +01:00
Morten Olsen
44bf5469f8 fixes 2025-11-13 21:25:30 +01:00
renovate[bot]
c545e00cc3 chore(deps): update docker images (#29)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-13 20:45:49 +01:00
Morten Olsen
61cf9605a1 switch pigeon pod to latest 2025-11-06 23:00:56 +01:00
renovate[bot]
987bc41a5f chore(deps): update docker images (#28)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-06 22:37:30 +01:00
Morten Olsen
a5ead880e2 add metabase and appsmith 2025-11-05 21:22:57 +01:00
renovate[bot]
cf5e82808d chore(deps): update docker images (#27)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-05 21:22:09 +01:00
Morten Olsen
df79f42806 update 2025-11-04 14:56:58 +01:00
Morten Olsen
2c399e26f4 update 2025-11-04 14:56:47 +01:00
Morten Olsen
155c6b6702 update reservoir 2025-11-03 21:43:27 +01:00
renovate[bot]
50fb286a7a chore(deps): update docker images (#26)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-03 19:55:20 +01:00
Morten Olsen
df78604473 update 2025-11-03 13:29:43 +01:00
Morten Olsen
f75113c58b update 2025-11-02 20:31:40 +01:00
renovate[bot]
e419c95ad0 chore(deps): update docker images (#25)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-02 20:11:15 +01:00
Morten Olsen
8b0382e402 update 2025-11-02 20:10:26 +01:00
Morten Olsen
cbe5433378 add misc 2025-11-02 19:57:43 +01:00
renovate[bot]
b66ca8a679 chore(deps): update docker images (#24)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-31 12:24:01 +01:00
renovate[bot]
2fc39a703d chore(deps): update docker images (#23)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-27 18:46:28 +01:00
renovate[bot]
76edc3d29b chore(deps): update docker images (#22)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-25 14:07:39 +02:00
renovate[bot]
fb4ac4b8b6 chore(deps): update valkey/valkey:9.0 docker digest to 4503e20 (#21)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 20:32:20 +02:00
renovate[bot]
c4cedcc7f1 chore(deps): update docker images (#20)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 20:30:54 +02:00
Morten Olsen
dc66b1a406 pigeon-pod 2025-10-20 23:48:00 +02:00
renovate[bot]
d8caea7ab9 chore(deps): update docker images (#19)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-20 23:46:18 +02:00
Morten Olsen
f492dd491b feat: add mindsdb 2025-10-20 08:49:53 +02:00
renovate[bot]
875792d13c chore(deps): update docker images (#18)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-16 22:55:03 +02:00
Morten Olsen
522da48024 disable signal 2025-10-16 21:45:47 +02:00
Morten Olsen
c2a8fdb484 penpot fixes 2025-10-16 21:37:11 +02:00
renovate[bot]
ca1f088c0b chore(deps): update docker images (#17)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-16 21:36:34 +02:00
renovate[bot]
9f8df6c155 chore(deps): pin dependencies (#16)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-13 23:35:33 +02:00
Morten Olsen
4b77be0ccd add tika 2025-10-13 22:23:30 +02:00
renovate[bot]
797dc5d187 chore(deps): update docker images (#15)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-12 20:38:56 +02:00
Morten Olsen
d9f4d9c560 fix: metamcp oidc 2025-10-10 12:33:05 +02:00
renovate[bot]
5fcf7ee097 chore(deps): update docker images (#14)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-09 10:41:38 +00:00
renovate[bot]
c044298666 chore(deps): pin dependencies (#13)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-08 17:43:51 +00:00
Morten Olsen
86ffd441ca update 2025-10-07 19:49:54 +02:00
renovate[bot]
a1210f51c1 chore(deps): update docker images (#12)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-07 19:26:14 +02:00
Morten Olsen
56f5d1e65f fix: incorrect zot secret name 2025-10-06 14:40:31 +02:00
renovate[bot]
f2dcc2e4c2 chore(deps): update docker images (#11)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-06 14:38:21 +02:00
Morten Olsen
4d5cfa2717 add gitea runner 2025-10-01 22:42:05 +02:00
renovate[bot]
0df579eba5 chore(deps): pin dependencies (#10)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-01 22:34:54 +02:00
Morten Olsen
57e06bc8e9 pin penpot version 2025-10-01 22:32:53 +02:00
renovate[bot]
091138dfd4 chore(deps): update docker images (#8)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-01 22:31:30 +02:00
renovate[bot]
4300f733cb chore(deps): update valkey/valkey docker tag to v9 (#9)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-01 22:30:45 +02:00
Morten Olsen
b22478d36f added penpot 2025-10-01 20:37:06 +02:00
Morten Olsen
172f0cb8a0 chore: move globals to root 2025-09-30 23:51:42 +02:00
520 changed files with 9586 additions and 3580 deletions

View File

@@ -0,0 +1,16 @@
{
"permissions": {
"allow": [
"Bash(git -C /Users/alice/Projects/private/homelab/apps log --oneline -10)",
"Bash(git -C /Users/alice/Projects/private/homelab/apps remote -v)",
"Bash(git -C /Users/alice/Projects/private/homelab/apps config --list)",
"Bash(ls:*)",
"Bash(git -C /Users/alice/Projects/private/homelab/apps log --all --oneline --decorate -15)",
"Bash(git -C /Users/alice/Projects/private/homelab/apps branch -a)",
"Bash(helm dependency:*)",
"Bash(helm lint:*)",
"Bash(helm template:*)",
"Bash(kubectl get:*)"
]
}
}

11
.gitignore vendored Normal file
View File

@@ -0,0 +1,11 @@
# Helm chart dependencies (packaged library charts)
# These are generated by 'helm dependency update' and should not be committed
**/charts/*.tgz
charts/*.tgz
**/__pycache__/
__pycache__/
**/Chart.lock
*-local-secret.yaml

16
.yamllint Normal file
View File

@@ -0,0 +1,16 @@
---
extends: default
rules:
line-length:
max: 120
level: warning
indentation:
spaces: 2
indent-sequences: true
comments:
min-spaces-from-content: 1
document-start: disable
truthy:
allowed-values: ['true', 'false', 'on', 'off']

79
AGENTS.md Normal file
View File

@@ -0,0 +1,79 @@
# Application Helm Charts Guide
This document provides guidelines for creating and maintaining Helm charts in this homelab project.
## Project Structure
```
apps/
├── charts/ # Individual application Helm charts
│ ├── app-name/
│ │ ├── Chart.yaml
│ │ ├── values.yaml
│ │ └── templates/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── pvc.yaml
│ │ ├── client.yaml # OIDC client configuration
│ │ ├── database.yaml # Database provisioning
│ │ ├── secret.yaml # Secret generation
│ │ └── external-http-service.yaml
│ └── ...
└── root/ # ArgoCD ApplicationSet for auto-discovery
├── Chart.yaml
├── values.yaml
└── templates/
├── applicationset.yaml
└── project.yaml
foundation/
├── charts/ # Foundation service Helm charts
│ └── ...
└── root/ # ArgoCD ApplicationSet for foundation services
shared/
├── charts/ # Shared service Helm charts
│ └── ...
└── root/ # ArgoCD ApplicationSet for shared services
```
## ArgoCD ApplicationSets
This project uses three separate ArgoCD ApplicationSets to manage different categories of services:
1. **apps/** - Individual applications (web apps, tools, services)
2. **foundation/** - Core infrastructure for the cluster (monitoring, certificates, operators)
3. **shared/** - Infrastructure shared between applications (databases, message queues, caches)
Each category has its own `root/` chart containing an ApplicationSet that auto-discovers and deploys charts from its respective `charts/` directory.
## Creating a New Application Chart
### 1. Basic Chart Structure
Create a new directory under `apps/charts/` with the following structure:
```bash
mkdir -p apps/charts/my-app/templates
```
#### Chart.yaml
```yaml
apiVersion: v2
version: 1.0.0
name: my-app
```
#### values.yaml
```yaml
image:
repository: docker.io/org/my-app
tag: v1.0.0
pullPolicy: IfNotPresent
subdomain: my-app
```
See ./apps/common/README.md for guide on writing charts

100
CLAUDE.md Normal file
View File

@@ -0,0 +1,100 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
Kubernetes Helm-based homelab application deployment system using ArgoCD for GitOps. Contains 40+ containerized applications deployed via Helm charts with a shared common library to minimize template duplication.
## Commands
```bash
# Validate YAML files
yamllint .
# Helm chart operations (run from chart directory)
helm dependency build # Fetch common library dependency
helm lint . # Validate chart syntax
helm template <release> . --set globals.environment=prod --set globals.domain=example.com
# Utility scripts
./scripts/migrate_database.py <source_db> <dest_db> [--clean] # PostgreSQL migration
./scripts/sync_pvc_with_host.sh <host-path> <namespace> <pvc> # PVC sync
```
## Architecture
### Directory Structure
- `apps/charts/` - Individual application Helm charts (deployed to `prod` namespace)
- `apps/common/` - Shared Helm library chart with standardized templates
- `apps/root/` - ArgoCD ApplicationSet for auto-discovery
- `shared/charts/` - Shared infrastructure services (authentik, nats)
- `scripts/` - Python/Bash utility scripts for database migration and PVC sync
### Deployment Model
Three ArgoCD ApplicationSets auto-discover charts from their respective `charts/` directories. Folders suffixed with `.disabled` are excluded from deployment.
### Common Library Pattern
Most charts use the common library (`apps/common/`) which provides standardized templates. A minimal chart needs:
1. `Chart.yaml` with common library dependency:
```yaml
apiVersion: v2
version: 1.0.0
name: my-app
dependencies:
- name: common
version: 1.0.0
repository: file://../../common
```
2. Standardized `values.yaml` (see `apps/common/README.md` for full structure)
3. Template files that include common helpers:
```yaml
# templates/deployment.yaml
{{ include "common.deployment" . }}
```
Or use single file with `{{ include "common.all" . }}` to render all resources automatically.
### Key Templates
- `common.deployment` - Deployment with health probes, volumes, init containers
- `common.service` - Service(s) with port mapping
- `common.pvc` - Persistent volume claims
- `common.virtualService` - Istio routing (public/private gateways)
- `common.oidc` - Authentik OIDC client registration
- `common.database` - PostgreSQL database provisioning
- `common.externalSecrets` - Password generators and secret templates
### Placeholders in values.yaml
- `{release}` - Release name
- `{namespace}` - Release namespace
- `{fullname}` - Full app name
- `{subdomain}` - App subdomain (from `subdomain` value)
- `{domain}` - Global domain
- `{timezone}` - Global timezone
### Secret Naming Conventions
- OIDC credentials: `{release}-oidc-credentials` (clientId, clientSecret, issuer)
- Database connection: `{release}-connection` (url, host, port, user, password)
- Generated secrets: `{release}-secrets`
## Conventions
- Chart and release names use kebab-case
- All container images pinned by SHA256 digest (Renovate manages updates)
- Storage uses `persistent` storageClassName
- Istio VirtualServices route via public/private gateways
- Deployment strategy: `Recreate` for stateful apps, `RollingUpdate` for stateless
## YAML Style
- Max line length: 120 characters
- Indentation: 2 spaces
- Truthy values: `true`, `false`, `on`, `off`
## Documentation
- `AGENTS.md` - Chart creation guidelines
- `apps/common/README.md` - Complete common library reference
- `apps/common/MIGRATION.md` - Guide for migrating charts to common library
- `apps/common/TEMPLATING.md` - Placeholder system documentation

30
apps.yaml Normal file
View File

@@ -0,0 +1,30 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: apps-data
labels:
type: local
spec:
capacity:
storage: 5Gi # Adjust this to your desired size
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain # Retain the data even if the PV is deleted
storageClassName: "manual-app-data"
hostPath:
path: "/data/volumes" # The specific host path for your 'apps' volume
type: DirectoryOrCreate # Ensures the directory exists on the host
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: apps-data
namespace: prod # Specify the namespace
spec:
storageClassName: "manual-app-data"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi # Must match or be less than the PV's capacity

View File

@@ -0,0 +1,7 @@
apiVersion: v2
version: 1.0.0
name: audiobookshelf
dependencies:
- name: common
version: 1.0.0
repository: file://../../common

View File

@@ -0,0 +1 @@
{{ include "common.deployment" . }}

View File

@@ -0,0 +1 @@
{{ include "common.dns" . }}

View File

@@ -0,0 +1 @@
{{ include "common.oidc" . }}

View File

@@ -0,0 +1 @@
{{ include "common.pvc" . }}

View File

@@ -0,0 +1 @@
{{ include "common.service" . }}

View File

@@ -0,0 +1 @@
{{ include "common.virtualService" . }}

View File

@@ -0,0 +1,68 @@
image:
repository: ghcr.io/advplyr/audiobookshelf
tag: 2.32.1@sha256:a52dc5db694a5bf041ce38f285dd6c6a660a4b1b21e37ad6b6746433263b2ae5
pullPolicy: IfNotPresent
subdomain: audiobookshelf
# Deployment configuration
deployment:
strategy: Recreate
replicas: 1
# Container configuration
container:
port: 80
healthProbe:
type: httpGet
path: /ping
# Service configuration
service:
port: 80
type: ClusterIP
# Volume configuration
volumes:
- name: config
mountPath: /config
persistentVolumeClaim: config # Will be prefixed with release name in template
- name: metadata
mountPath: /metadata
persistentVolumeClaim: metadata # Will be prefixed with release name in template
- name: audiobooks
mountPath: /audiobooks
persistentVolumeClaim: books
- name: podcasts
mountPath: /podcasts
persistentVolumeClaim: podcasts
# Persistent volume claims
persistentVolumeClaims:
- name: config
size: 1Gi
storageClassName: persistent
- name: metadata
size: 5Gi
storageClassName: persistent
# DNS configuration
dns:
enabled: true
type: A
dnsClassRef:
name: private-dns
# OIDC/Authentik configuration
oidc:
enabled: true
redirectUris:
- "/audiobookshelf/auth/openid/callback"
- "/audiobookshelf/auth/openid/mobile-redirect"
# VirtualService configuration
virtualService:
enabled: true
gateways:
public: true
private: true

View File

@@ -0,0 +1,7 @@
apiVersion: v2
version: 1.0.0
name: baikal
dependencies:
- name: common
version: 1.0.0
repository: file://../../common

View File

@@ -0,0 +1 @@
{{ include "common.database" . }}

View File

@@ -0,0 +1 @@
{{ include "common.deployment" . }}

View File

@@ -0,0 +1 @@
{{ include "common.pvc" . }}

View File

@@ -0,0 +1 @@
{{ include "common.service" . }}

View File

@@ -0,0 +1 @@
{{ include "common.virtualService" . }}

View File

@@ -0,0 +1,50 @@
image:
repository: docker.io/ckulka/baikal
tag: 0.10.1-nginx@sha256:434bdd162247cc6aa6f878c9b4dce6216e39e79526b980453b13812d5f8ebf4b
pullPolicy: IfNotPresent
subdomain: baikal
# Deployment configuration
deployment:
strategy: Recreate
replicas: 1
# Container configuration
container:
port: 80
healthProbe:
type: tcpSocket
port: http # Use named port
# Database configuration
database:
enabled: true
# Service configuration
service:
port: 80
type: ClusterIP
# Volume configuration
volumes:
- name: data
mountPath: /var/www/baikal/Specific
persistentVolumeClaim: data
- name: config
mountPath: /var/www/baikal/config
persistentVolumeClaim: config
# Persistent volume claims
persistentVolumeClaims:
- name: data
size: 1Gi
- name: config
size: 1Gi
# VirtualService configuration
virtualService:
enabled: true
gateways:
public: true
private: true

View File

@@ -0,0 +1,7 @@
apiVersion: v2
version: 1.0.0
name: bytestash
dependencies:
- name: common
version: 1.0.0
repository: file://../../common

View File

@@ -0,0 +1 @@
{{ include "common.deployment" . }}

View File

@@ -0,0 +1 @@
{{ include "common.oidc" . }}

View File

@@ -0,0 +1 @@
{{ include "common.pvc" . }}

View File

@@ -0,0 +1 @@
{{ include "common.service" . }}

View File

@@ -0,0 +1 @@
{{ include "common.virtualService" . }}

View File

@@ -0,0 +1,74 @@
image:
repository: ghcr.io/jordan-dalby/bytestash
tag: 1.5.9@sha256:9c17b5510ca45c976fe23b0d4705ad416aa58d4bf756a70e03ef1f08cf7801fd
pullPolicy: IfNotPresent
subdomain: bytestash
# Deployment configuration
deployment:
strategy: Recreate
replicas: 1
# Container configuration
container:
ports:
- name: http
port: 5000
protocol: TCP
healthProbe:
type: tcpSocket
port: http
# Service configuration
service:
port: 80
type: ClusterIP
# Volume configuration
volumes:
- name: data
mountPath: /data/snippets
persistentVolumeClaim: data
# Persistent volume claims
persistentVolumeClaims:
- name: data
size: 1Gi
storageClassName: persistent
# VirtualService configuration
virtualService:
enabled: true
gateways:
public: true
private: true
# OIDC/Authentik configuration
oidc:
enabled: true
redirectUris:
- "/api/auth/oidc/callback"
subjectMode: user_username
# Environment variables
env:
ALLOW_NEW_ACCOUNTS: "true"
DISABLE_INTERNAL_ACCOUNTS: "true"
OIDC_ENABLED: "true"
OIDC_DISPLAY_NAME: OIDC
OIDC_CLIENT_ID:
valueFrom:
secretKeyRef:
name: "{release}-oidc-credentials"
key: clientId
OIDC_CLIENT_SECRET:
valueFrom:
secretKeyRef:
name: "{release}-oidc-credentials"
key: clientSecret
OIDC_ISSUER_URL:
valueFrom:
secretKeyRef:
name: "{release}-oidc-credentials"
key: issuer

View File

@@ -0,0 +1,7 @@
apiVersion: v2
version: 1.0.0
name: calibre-web
dependencies:
- name: common
version: 1.0.0
repository: file://../../common

View File

@@ -0,0 +1 @@
{{ include "common.deployment" . }}

View File

@@ -0,0 +1 @@
{{ include "common.pvc" . }}

View File

@@ -0,0 +1 @@
{{ include "common.service" . }}

View File

@@ -0,0 +1 @@
{{ include "common.virtualService" . }}

View File

@@ -0,0 +1,50 @@
image:
repository: crocodilestick/calibre-web-automated
tag: latest@sha256:577e846f104fd21453ef306eefb4a95dd95b3b9ddd2463a150944494284da0fd
pullPolicy: IfNotPresent
subdomain: calibre-web
# Deployment configuration
deployment:
strategy: Recreate
replicas: 1
# Container configuration
container:
port: 8083
healthProbe:
type: tcpSocket
# Service configuration
service:
port: 80
type: ClusterIP
# Volume configuration
volumes:
- name: data
mountPath: /config
persistentVolumeClaim: data # Will be prefixed with release name
- name: books
mountPath: /calibre-library
persistentVolumeClaim: books # External PVC, used as-is
# Persistent volume claims
persistentVolumeClaims:
- name: data
size: 1Gi
storageClassName: persistent
# VirtualService configuration
virtualService:
enabled: true
gateways:
public: true
private: true
# Environment variables
env:
NETWORK_SHARE_MODE: "true"
PUID: "1000"
PGID: "1000"

View File

@@ -0,0 +1,7 @@
apiVersion: v2
version: 1.0.0
name: coder
dependencies:
- name: common
version: 1.0.0
repository: file://../../common

View File

@@ -0,0 +1 @@
{{ include "common.deployment" . }}

View File

@@ -0,0 +1 @@
{{ include "common.oidc" . }}

View File

@@ -0,0 +1 @@
{{ include "common.pvc" . }}

View File

@@ -0,0 +1 @@
{{ include "common.service" . }}

View File

@@ -0,0 +1 @@
{{ include "common.virtualService" . }}

View File

@@ -0,0 +1,80 @@
image:
repository: ghcr.io/coder/coder
tag: v2.29.1@sha256:19b3ecd02510b4ee91ba488c61a3f40a6c164c9aeef38999c855e55fd653097c
pullPolicy: IfNotPresent
subdomain: coder
# Deployment configuration
deployment:
strategy: Recreate
replicas: 1
serviceAccountName: "{release}-serviceaccount" # Will be templated
# Container configuration
container:
port: 7080
healthProbe:
type: tcpSocket
port: http # Use named port
# Service configuration
service:
port: 80
type: ClusterIP
# OIDC client
oidc:
enabled: true
redirectUris:
- "/api/v2/users/oidc/callback"
# Volume configuration
volumes:
- name: data
mountPath: /home/coder/.config
persistentVolumeClaim: data
storageClassName: persistent
# Persistent volume claims
persistentVolumeClaims:
- name: data
size: 1Gi
# VirtualService configuration
virtualService:
enabled: true
allowWildcard: true
gateways:
public: false
private: true
# Environment variables
env:
CODER_HTTP_ADDRESS: "0.0.0.0:7080"
CODER_OIDC_ALLOWED_GROUPS: admin
CODER_OIDC_GROUP_FIELD: groups
CODER_ACCESS_URL:
value: "https://{subdomain}.{domain}"
CODER_WILDCARD_ACCESS_URL:
value: "*.{subdomain}.{domain}"
CODER_OIDC_ICON_URL: "https://{subdomain}.{domain}/static/dist/assets/icons/icon.png"
CODER_DISABLE_PASSWORD_AUTH: "true"
CODER_OAUTH2_GITHUB_ALLOW_SIGNUPS: "false"
CODER_OIDC_SIGN_IN_TEXT: "Sign in with OIDC"
CODER_OIDC_SCOPES: "openid,profile,email,offline_access"
CODER_OIDC_ISSUER_URL:
valueFrom:
secretKeyRef:
name: "{release}-oidc-credentials"
key: issuer
CODER_OIDC_CLIENT_ID:
valueFrom:
secretKeyRef:
name: "{release}-oidc-credentials"
key: clientId
CODER_OIDC_CLIENT_SECRET:
valueFrom:
secretKeyRef:
name: "{release}-oidc-credentials"
key: clientSecret

View File

@@ -0,0 +1,7 @@
apiVersion: v2
version: 1.0.0
name: esphome
dependencies:
- name: common
version: 1.0.0
repository: file://../../common

View File

@@ -0,0 +1 @@
{{ include "common.deployment" . }}

View File

@@ -0,0 +1 @@
{{ include "common.pvc" . }}

View File

@@ -0,0 +1 @@
{{ include "common.service" . }}

View File

@@ -0,0 +1 @@
{{ include "common.virtualService" . }}

View File

@@ -0,0 +1,43 @@
image:
repository: ghcr.io/esphome/esphome
tag: 2025.12.4@sha256:a7915def0a60c76506db766b7b733760f09b47ab6a511d5052a6d38bc3f424e3
pullPolicy: IfNotPresent
subdomain: esphome
# Deployment configuration
deployment:
strategy: Recreate
replicas: 1
hostNetwork: true # ESPHome needs hostNetwork for device discovery
# Container configuration
container:
port: 6052
healthProbe:
type: tcpSocket
port: http # Use named port
# Service configuration
service:
port: 80
type: ClusterIP
# Volume configuration
volumes:
- name: data
mountPath: /config
persistentVolumeClaim: data
# Persistent volume claims
persistentVolumeClaims:
- name: data
size: 10Gi
storageClassName: persistent
# VirtualService configuration
virtualService:
enabled: true
gateways:
public: false
private: true

View File

@@ -0,0 +1,7 @@
apiVersion: v2
version: 1.0.0
name: forgejo
dependencies:
- name: common
version: 1.0.0
repository: file://../../common

View File

@@ -0,0 +1,2 @@
{{ include "common.database" . }}

View File

@@ -0,0 +1,76 @@
{{- if .Values.actions.enabled }}
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "common.fullname" . }}
labels:
{{- include "common.labels" . | nindent 4 }}
spec:
strategy:
type: {{ include "common.deploymentStrategy" . }}
replicas: {{ .Values.deployment.replicas | default 1 }}
{{- if .Values.deployment.revisionHistoryLimit }}
revisionHistoryLimit: {{ .Values.deployment.revisionHistoryLimit }}
{{- end }}
selector:
matchLabels:
{{- include "common.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "common.selectorLabels" . | nindent 8 }}
spec:
{{- if .Values.deployment.serviceAccountName }}
serviceAccountName: {{ .Values.deployment.serviceAccountName | replace "{release}" .Release.Name | replace "{fullname}" (include "common.fullname" .) }}
{{- end }}
{{- if .Values.deployment.hostNetwork }}
hostNetwork: {{ .Values.deployment.hostNetwork }}
{{- end }}
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy | default "IfNotPresent" }}
ports:
{{ include "common.containerPorts" . | indent 12 }}
{{- if .Values.container.healthProbe }}
livenessProbe:
{{ include "common.healthProbe" . | indent 12 }}
readinessProbe:
{{ include "common.healthProbe" . | indent 12 }}
{{- end }}
lifecycle:
postStart:
exec:
command:
- /bin/sh
- -c
- |
sleep 10
su -c "forgejo forgejo-cli actions register --keep-labels --secret ${FORGEJO_RUNNER_SHARED_SECRET}" git || true
{{- if .Values.volumes }}
volumeMounts:
{{ include "common.volumeMounts" . | indent 12 }}
{{- end }}
{{- if or .Values.env .Values.globals.timezone }}
env:
{{ include "common.env" . | indent 12 }}
- name: FORGEJO_RUNNER_SHARED_SECRET
valueFrom:
secretKeyRef:
name: "{{ .Release.Name }}-runner-secrets"
key: shared-secret
{{- else }}
env:
- name: FORGEJO_RUNNER_SHARED_SECRET
valueFrom:
secretKeyRef:
name: "{{ .Release.Name }}-runner-secrets"
key: shared-secret
{{- end }}
{{- if .Values.volumes }}
volumes:
{{- include "common.volumes" . | nindent 8 }}
{{- end }}
{{- else }}
{{ include "common.deployment" . }}
{{- end }}

View File

@@ -0,0 +1 @@
{{ include "common.dns" . }}

View File

@@ -0,0 +1 @@
{{ include "common.oidc" . }}

View File

@@ -0,0 +1 @@
{{ include "common.pvc" . }}

View File

@@ -0,0 +1,25 @@
{{- if .Values.actions.enabled }}
apiVersion: v1
kind: ConfigMap
metadata:
name: "{{ .Release.Name }}-runner-config"
data:
config.yml: |
log:
level: warn
format: text
runner:
file: .runner
container:
network: host
options: -v /certs/client:/certs/client -e DOCKER_HOST=tcp://localhost:2376 -e DOCKER_TLS_VERIFY=1 -e DOCKER_CERT_PATH=/certs/client
valid_volumes:
- /certs/client
envs:
DOCKER_HOST: tcp://localhost:2376
DOCKER_TLS_VERIFY: "1"
DOCKER_CERT_PATH: /certs/client
{{- end }}

View File

@@ -0,0 +1,189 @@
{{- if .Values.actions.enabled }}
apiVersion: apps/v1
kind: Deployment
metadata:
name: "{{ .Release.Name }}-runner"
labels:
app: "{{ .Release.Name }}-runner"
spec:
replicas: {{ .Values.actions.runner.replicas | default 1 }}
revisionHistoryLimit: 2
selector:
matchLabels:
app: "{{ .Release.Name }}-runner"
template:
metadata:
labels:
app: "{{ .Release.Name }}-runner"
spec:
hostname: docker
initContainers:
- name: install-jq
image: curlimages/curl:latest
command:
- sh
- -c
- |
# Download static jq binary for Linux amd64
curl -L -o /shared/jq https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-amd64
chmod +x /shared/jq
# Verify it works
/shared/jq --version || echo "Warning: jq download may have failed"
volumeMounts:
- name: shared-tools
mountPath: /shared
containers:
- name: docker-in-docker
image: "{{ .Values.actions.runner.dind.image.repository }}:{{ .Values.actions.runner.dind.image.tag }}"
imagePullPolicy: "{{ .Values.actions.runner.dind.image.pullPolicy }}"
env:
- name: DOCKER_TLS_CERTDIR
value: /certs
- name: DOCKER_HOST
value: docker-in-docker
securityContext:
privileged: true
ports:
- name: docker
containerPort: 2376
protocol: TCP
volumeMounts:
- name: docker-certs
mountPath: /certs
- name: "{{ .Release.Name }}-runner"
image: "{{ .Values.actions.runner.image.repository }}:{{ .Values.actions.runner.image.tag }}"
imagePullPolicy: "{{ .Values.actions.runner.image.pullPolicy }}"
command:
- /bin/sh
- -c
- |
cd /data
# Use jq from shared volume (installed by initContainer)
export PATH="/shared:${PATH}"
export LD_LIBRARY_PATH="/shared/lib:${LD_LIBRARY_PATH}"
if ! /shared/jq --version >/dev/null 2>&1; then
echo "Error: jq is not working (checking dependencies...)"
ldd /shared/jq 2>&1 || true
exit 1
fi
echo "jq is available at /shared/jq"
# Wait for shared secret to be available
while [ -z "${FORGEJO_RUNNER_SHARED_SECRET}" ]; do
echo "Waiting for shared secret..."
sleep 1
done
# Always ensure runner file exists and is up to date
if [ ! -f .runner ]; then
echo "Creating runner file..."
forgejo-runner create-runner-file \
--connect \
--instance "https://{{ .Values.subdomain }}.{{ .Values.globals.domain }}" \
--name "{{ .Values.actions.runner.name | default "default" }}" \
--secret "${FORGEJO_RUNNER_SHARED_SECRET}" || {
echo "Failed to create runner file, will retry..."
sleep 5
exit 1
}
fi
# Always update labels to match configuration
{{- if .Values.actions.runner.labels }}
# Verify jq is available
if ! command -v jq >/dev/null 2>&1; then
echo "Error: jq is not available"
exit 1
fi
LABELS_JSON='[{{- range $index, $label := .Values.actions.runner.labels }}{{- if $index }},{{- end }}"{{ $label }}"{{- end }}]'
echo "Updating runner labels to match configuration..."
echo "New labels: ${LABELS_JSON}"
# Ensure .runner file exists and is readable
if [ ! -f .runner ]; then
echo "Error: .runner file does not exist"
exit 1
fi
# Show current labels before update
CURRENT_LABELS_BEFORE=$(jq -r '.labels // "null"' .runner 2>/dev/null || echo "error reading file")
echo "Current labels before update: ${CURRENT_LABELS_BEFORE}"
# Update labels
if jq --argjson labels "${LABELS_JSON}" '.labels = $labels' .runner > .runner.tmp; then
mv .runner.tmp .runner
echo "Labels updated successfully"
# Verify the update
CURRENT_LABELS_AFTER=$(jq -r '.labels // "null"' .runner)
echo "Current labels after update: ${CURRENT_LABELS_AFTER}"
else
echo "Error: Failed to update labels with jq"
exit 1
fi
{{- end }}
# Always copy config from ConfigMap to ensure it's up to date
echo "Copying config from ConfigMap..."
cp /config/config.yml config.yml || {
echo "Warning: Failed to copy config from ConfigMap, generating default..."
forgejo-runner generate-config > config.yml
}
# Wait for docker-in-docker TCP to be ready
echo "Waiting for docker-in-docker to be ready..."
while ! nc -z localhost 2376 2>/dev/null; do
echo "Docker daemon not ready, waiting..."
sleep 2
done
# Wait for TLS certificates to be available
while [ ! -f /certs/client/ca.pem ]; do
echo "Waiting for TLS certificates..."
sleep 1
done
echo "Docker daemon and certificates ready"
# Verify runner file exists before starting daemon
if [ ! -f .runner ] || [ ! -w .runner ]; then
echo "Error: .runner file is missing or not writable"
exit 1
fi
# Run daemon
echo "Starting runner daemon..."
while : ; do
forgejo-runner --config config.yml daemon || {
echo "Daemon exited, restarting in 5 seconds..."
sleep 5
}
done
env:
- name: FORGEJO_INSTANCE_URL
value: "https://{{ .Values.subdomain }}.{{ .Values.globals.domain }}"
- name: FORGEJO_RUNNER_NAME
value: {{ .Values.actions.runner.name | default "default" | quote }}
- name: FORGEJO_RUNNER_SHARED_SECRET
valueFrom:
secretKeyRef:
name: "{{ .Release.Name }}-runner-secrets"
key: shared-secret
- name: DOCKER_HOST
value: tcp://localhost:2376
- name: DOCKER_TLS_VERIFY
value: "1"
- name: DOCKER_CERT_PATH
value: /certs/client
securityContext:
runAsUser: 1000
runAsGroup: 1000
volumeMounts:
- name: runner-data
mountPath: /data
- name: docker-certs
mountPath: /certs
- name: runner-config
mountPath: /config
readOnly: true
- name: shared-tools
mountPath: /shared
volumes:
- name: runner-data
persistentVolumeClaim:
claimName: "{{ .Release.Name }}-runner-data"
- name: docker-certs
emptyDir: {}
- name: shared-tools
emptyDir: {}
- name: runner-config
configMap:
name: "{{ .Release.Name }}-runner-config"
{{- end }}

View File

@@ -0,0 +1,12 @@
{{- if .Values.actions.enabled }}
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: "{{ .Release.Name }}-runner-data"
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: {{ .Values.actions.runner.storage.size | default "10Gi" }}
{{- end }}

View File

@@ -0,0 +1,3 @@
{{- if .Values.actions.enabled }}
{{ include "common.externalSecrets.externalSecrets" . }}
{{- end }}

View File

@@ -0,0 +1,3 @@
{{- if .Values.actions.enabled }}
{{ include "common.externalSecrets.passwordGenerators" . }}
{{- end }}

View File

@@ -0,0 +1 @@
{{ include "common.service" . }}

View File

@@ -0,0 +1 @@
{{ include "common.virtualService" . }}

View File

@@ -0,0 +1,166 @@
image:
repository: codeberg.org/forgejo/forgejo
tag: 13@sha256:d05b9e587f02a746784d42c815c486b1d4f138646128f990a841833f513fe088
pullPolicy: IfNotPresent
subdomain: code
# Deployment configuration
deployment:
strategy: Recreate
replicas: 1
revisionHistoryLimit: 2
# Container configuration - multiple ports
container:
ports:
- name: http
port: 3000
protocol: TCP
- name: ssh
port: 22
protocol: TCP
healthProbe:
type: tcpSocket
port: http # Use named port
# DNS configuration
dns:
enabled: true
type: A
dnsClassRef:
name: private-dns
# OIDC/Authentik configuration
oidc:
enabled: true
redirectUris:
- "/user/oauth2/Authentik/callback"
# Database configuration
database:
enabled: true
# Service configuration - multiple services
service:
ports:
- name: http
port: 80
targetPort: 3000
protocol: TCP
type: ClusterIP
- name: ssh
port: 2206
targetPort: 22
protocol: TCP
type: LoadBalancer
serviceName: ssh # Will be prefixed with release name: {release}-ssh
# Volume configuration
volumes:
- name: data
mountPath: /data
persistentVolumeClaim: data
# Persistent volume claims
persistentVolumeClaims:
- name: data
size: 10Gi
storageClassName: persistent
# VirtualService configuration
virtualService:
enabled: true
gateways:
public: true
private: true
servicePort: 80 # Route to the http service port
# Environment variables
env:
USER_UID: "1000"
USER_GID: "1000"
FORGEJO__server__SSH_DOMAIN:
value: "ssh-{subdomain}.{domain}" # Will be templated: ssh-{subdomain}.{domain}
FORGEJO__server__SSH_PORT: "2206"
FORGEJO__service__REQUIRE_EXTERNAL_REGISTRATION_PASSWORD: "true"
FORGEJO__service__ENABLE_PASSWORD_SIGNIN_FORM: "false"
FORGEJO__service__DEFAULT_KEEP_EMAIL_PRIVATE: "true"
FORGEJO__service__DEFAULT_USER_IS_RESTRICTED: "true"
FORGEJO__service__DEFAULT_USER_VISIBILITY: "private"
FORGEJO__service__DEFAULT_ORG_VISIBILITY: "private"
FORGEJO__service__ALLOW_ONLY_EXTERNAL_REGISTRATION: "true"
FORGEJO__other__SHOW_FOOTER_POWERED_BY: "false"
FORGEJO__other__SHOW_FOOTER_TEMPLATE_LOAD_TIME: "false"
FORGEJO__other__SHOW_FOOTER_VERSION: "false"
FORGEJO__repository__ENABLE_PUSH_CREATE_USER: "true"
FORGEJO__repository__ENABLE_PUSH_CREATE_ORG: "true"
FORGEJO__openid__ENABLE_OPENID_SIGNIN: "false"
FORGEJO__openid__ENABLE_OPENID_SIGNUP: "false"
FORGEJO__database__DB_TYPE: postgres
FORGEJO__database__DB_PORT: "5432"
FORGEJO__database__NAME:
valueFrom:
secretKeyRef:
name: "{release}-connection"
key: database
FORGEJO__database__HOST:
valueFrom:
secretKeyRef:
name: "{release}-connection"
key: host
FORGEJO__database__USER:
valueFrom:
secretKeyRef:
name: "{release}-connection"
key: user
FORGEJO__database__PASSWD:
valueFrom:
secretKeyRef:
name: "{release}-connection"
key: password
# Actions configuration
FORGEJO__actions__ENABLED: "true"
FORGEJO__actions__ENABLED_FOR_REPOSITORIES: "true"
FORGEJO__actions__ENABLED_FOR_DEFAULT_BRANCH: "true"
FORGEJO__actions__SHARED_SECRET:
valueFrom:
secretKeyRef:
name: "{release}-runner-secrets"
key: shared-secret
# External Secrets configuration for Actions runner
externalSecrets:
- name: "{release}-runner-secrets"
passwords:
- name: shared-secret
length: 20
allowRepeat: true
noUpper: false
encoding: hex
secretKeys:
- shared-secret
# Actions runner configuration
actions:
enabled: true
runner:
image:
repository: code.forgejo.org/forgejo/runner
tag: "12.3.1"
pullPolicy: IfNotPresent
dind:
image:
repository: code.forgejo.org/oci/docker
tag: dind@sha256:3a33fc81fa4d38360f490f5b900e9846f725db45bb1d9b1fe02d849bd42a5cf2
pullPolicy: IfNotPresent
name: default
replicas: 1
storage:
size: 10Gi
labels:
- "ubuntu-latest:docker://gitea/runner-images:ubuntu-latest-slim"
- "ubuntu-slim-latest:docker://gitea/runner-images:ubuntu-latest-slim"
- "ubuntu-full-latest:docker://gitea/runner-images:ubuntu-latest-full"
- "docker-cli:docker://code.forgejo.org/oci/docker:cli"
- "node-bookworm:docker://code.forgejo.org/oci/node:20-bookworm"

View File

@@ -0,0 +1,7 @@
apiVersion: v2
version: 1.0.0
name: gitea
dependencies:
- name: common
version: 1.0.0
repository: file://../../common

View File

@@ -0,0 +1 @@
{{ include "common.oidc" . }}

View File

@@ -0,0 +1 @@
{{ include "common.database" . }}

View File

@@ -0,0 +1 @@
{{ include "common.deployment" . }}

View File

@@ -0,0 +1 @@
{{ include "common.pvc" . }}

View File

@@ -1,36 +1,37 @@
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
name: '{{ .Release.Name }}-runner' name: "{{ .Release.Name }}-runner"
labels: labels:
app: '{{ .Release.Name }}-runner' app: "{{ .Release.Name }}-runner"
spec: spec:
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
app: '{{ .Release.Name }}-runner' app: "{{ .Release.Name }}-runner"
template: template:
metadata: metadata:
labels: labels:
app: '{{ .Release.Name }}-runner' app: "{{ .Release.Name }}-runner"
spec: spec:
containers: containers:
- name: '{{ .Release.Name }}-runner' - name: "{{ .Release.Name }}-runner"
image: docker.io/gitea/act_runner:latest-dind-rootless image: docker.io/gitea/act_runner:latest-dind-rootless
env: env:
- name: GITEA_INSTANCE_URL - name: GITEA_INSTANCE_URL
value: '{{ .Release.Name }}' value: "https://{{ .Release.Name }}.{{ .Values.globals.domain }}"
- name: GITEA_RUNNER_NAME - name: GITEA_RUNNER_NAME
value: default
- name: GITEA_RUNNER_REGISTRATION_TOKEN - name: GITEA_RUNNER_REGISTRATION_TOKEN
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:
name: '{{ .Release.Name }}-runner' name: "{{ .Release.Name }}-runner"
key: registration_token key: registration_token
- name: DOCKER_HOST - name: DOCKER_HOST
value: tcp://localhost:2376 value: tcp://localhost:2376
- name: DOCKER_CERT_PATH - name: DOCKER_CERT_PATH
value: /certs/client value: /certs/client
- name: DOCKER_TLS_VERIFY - name: DOCKER_TLS_VERIFY
value: '1' value: "1"
securityContext: securityContext:
privileged: true privileged: true

View File

@@ -0,0 +1 @@
{{ include "common.service" . }}

View File

@@ -0,0 +1 @@
{{ include "common.virtualService" . }}

View File

@@ -0,0 +1,114 @@
image:
repository: docker.gitea.com/gitea
tag: 1.25.3@sha256:fee0e5e55da6d2d11186bf39023a772fe63d9deffc0a83283e3d8e5d11c2716a
pullPolicy: IfNotPresent
subdomain: gitea
# Deployment configuration
deployment:
strategy: Recreate
replicas: 1
# Container configuration - multiple ports
container:
ports:
- name: http
port: 3000
protocol: TCP
- name: ssh
port: 22
protocol: TCP
healthProbe:
type: tcpSocket
port: http # Use named port
# Service configuration - multiple services
service:
ports:
- name: http
port: 80
targetPort: 3000
protocol: TCP
type: ClusterIP
- name: ssh
port: 2205
targetPort: 22
protocol: TCP
type: LoadBalancer
serviceName: ssh # Results in: {release}-ssh
# Volume configuration
volumes:
- name: data
mountPath: /data
persistentVolumeClaim: data
# Persistent volume claims
persistentVolumeClaims:
- name: data
size: 10Gi
storageClassName: persistent
# VirtualService configuration
virtualService:
enabled: true
gateways:
public: true
private: true
servicePort: 80 # Route to the http service port
# OIDC client configuration
oidc:
enabled: true
redirectUris:
- "/user/oauth2/Authentik/callback"
subjectMode: user_username
# Database configuration
database:
enabled: true
# Environment variables
env:
USER_UID: "1000"
USER_GID: "1000"
GITEA__server__SSH_DOMAIN:
value: "ssh-{subdomain}.{domain}"
GITEA__server__SSH_PORT: "2205"
GITEA__service__REQUIRE_EXTERNAL_REGISTRATION_PASSWORD: "true"
GITEA__service__ENABLE_PASSWORD_SIGNIN_FORM: "false"
GITEA__service__DEFAULT_KEEP_EMAIL_PRIVATE: "true"
GITEA__service__DEFAULT_USER_IS_RESTRICTED: "true"
GITEA__service__DEFAULT_USER_VISIBILITY: "private"
GITEA__service__DEFAULT_ORG_VISIBILITY: "private"
GITEA__service__ALLOW_ONLY_EXTERNAL_REGISTRATION: "true"
GITEA__other__SHOW_FOOTER_POWERED_BY: "false"
GITEA__other__SHOW_FOOTER_TEMPLATE_LOAD_TIME: "false"
GITEA__other__SHOW_FOOTER_VERSION: "false"
GITEA__repository__ENABLE_PUSH_CREATE_USER: "true"
GITEA__repository__ENABLE_PUSH_CREATE_ORG: "true"
GITEA__openid__ENABLE_OPENID_SIGNIN: "false"
GITEA__openid__ENABLE_OPENID_SIGNUP: "false"
GITEA__database__DB_TYPE: postgres
GITEA__database__DB_PORT: "5432"
GITEA__database__NAME:
valueFrom:
secretKeyRef:
name: "{release}-connection"
key: database
GITEA__database__HOST:
valueFrom:
secretKeyRef:
name: "{release}-connection"
key: host
GITEA__database__USER:
valueFrom:
secretKeyRef:
name: "{release}-connection"
key: user
GITEA__database__PASSWD:
valueFrom:
secretKeyRef:
name: "{release}-connection"
key: password

View File

@@ -0,0 +1,7 @@
apiVersion: v2
version: 1.0.0
name: glados
dependencies:
- name: common
version: 1.0.0
repository: file://../../common

View File

@@ -0,0 +1 @@
{{ include "common.deployment" . }}

View File

@@ -0,0 +1 @@
{{ include "common.pvc" . }}

View File

@@ -0,0 +1,69 @@
image:
repository: ghcr.io/morten-olsen/agentic
tag: 0.0.39
pullPolicy: Always
subdomain: glados
deployment:
strategy: Recreate
replicas: 1
container:
ports:
- name: http
port: 8080
protocol: TCP
initContainers:
- name: fix-permissions
image: busybox
command: ["sh", "-c", "chown -R 1000:1000 /data"]
volumeMounts:
- name: data
mountPath: /data
securityContext:
runAsUser: 0
volumes:
- name: data
mountPath: /data
persistentVolumeClaim: data
persistentVolumeClaims:
- name: data
size: 10Gi
env:
GLADOS_LLM_MODEL:
valueFrom:
secretKeyRef:
name: glados-secrets
key: GLADOS_LLM_MODEL
GLADOS_LLM_API_KEY:
valueFrom:
secretKeyRef:
name: glados-secrets
key: GLADOS_LLM_API_KEY
GLADOS_TELEGRAM_BOT_TOKEN:
valueFrom:
secretKeyRef:
name: glados-secrets
key: GLADOS_TELEGRAM_BOT_TOKEN
GLADOS_TELEGRAM_OWNER_ID:
valueFrom:
secretKeyRef:
name: glados-secrets
key: GLADOS_TELEGRAM_OWNER_ID
GLADOS_HOMEASSISTANT_URL:
valueFrom:
secretKeyRef:
name: glados-secrets
key: GLADOS_HOMEASSISTANT_URL
GLADOS_HOMEASSISTANT_TOKEN:
valueFrom:
secretKeyRef:
name: glados-secrets
key: GLADOS_HOMEASSISTANT_TOKEN
GLADOS_HOMEASSISTANT_CALENDARS: "calendar.cecilie_og_morten,calendar.morten_olsen_zeronorth_com"
GLADOS_HOMEASSISTANT_PERSON_ENTITY: "person.morten"

View File

@@ -0,0 +1,7 @@
apiVersion: v2
version: 1.0.0
name: homarr
dependencies:
- name: common
version: 1.0.0
repository: file://../../common

View File

@@ -0,0 +1 @@
{{ include "common.all" . }}

View File

@@ -0,0 +1,95 @@
image:
repository: ghcr.io/homarr-labs/homarr
tag: v1.48.0@sha256:47f827c16e7a93435159f77ddb726d8dacdf8b6dd8fb7bb91777b933a915bf05
pullPolicy: IfNotPresent
subdomain: homarr
# Deployment configuration
deployment:
strategy: Recreate
replicas: 1
revisionHistoryLimit: 0
# Container configuration
container:
port: 7575
healthProbe:
type: tcpSocket
port: http # Use named port
# Service configuration
service:
port: 80
type: ClusterIP
# Volume configuration
volumes:
- name: data
mountPath: /appdata
persistentVolumeClaim: data
# Persistent volume claims
persistentVolumeClaims:
- name: data
size: 1Gi
storageClassName: persistent
# VirtualService configuration
virtualService:
enabled: true
gateways:
public: true
private: true
# OIDC client configuration
oidc:
enabled: true
redirectUris:
- "/api/auth/callback/oidc"
subjectMode: user_username
# External Secrets configuration
externalSecrets:
- name: "{release}-secrets"
passwords:
- name: encryptionkey
length: 32
allowRepeat: true
encoding: hex
secretKeys:
- encryptionkey
# Environment variables
env:
BASE_URL:
value: "https://{subdomain}.{domain}"
NEXTAUTH_URL:
value: "https://{subdomain}.{domain}"
AUTH_PROVIDERS: oidc
AUTH_OIDC_CLIENT_NAME: Authentik
AUTH_OIDC_SCOPE_OVERWRITE: "openid email profile"
AUTH_OIDC_GROUPS_ATTRIBUTE: groups
AUTH_OIDC_AUTO_LOGIN: "true"
AUTH_OIDC_ADMIN_GROUP: "admin"
AUTH_OIDC_ENABLE_DANGEROUS_ACCOUNT_LINKING: "true"
SECRET_ENCRYPTION_KEY:
valueFrom:
secretKeyRef:
name: "{release}-secrets"
key: encryptionkey
AUTH_OIDC_ISSUER:
valueFrom:
secretKeyRef:
name: "{release}-oidc-credentials"
key: issuer
AUTH_OIDC_CLIENT_ID:
valueFrom:
secretKeyRef:
name: "{release}-oidc-credentials"
key: clientId
AUTH_OIDC_CLIENT_SECRET:
valueFrom:
secretKeyRef:
name: "{release}-oidc-credentials"
key: clientSecret

View File

@@ -0,0 +1,7 @@
apiVersion: v2
version: 1.0.0
name: home-assistant
dependencies:
- name: common
version: 1.0.0
repository: file://../../common

View File

@@ -0,0 +1 @@
{{ include "common.oidc" . }}

View File

@@ -0,0 +1 @@
{{ include "common.deployment" . }}

View File

@@ -0,0 +1,72 @@
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: "{{ .Release.Name }}-matter"
spec:
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: "1Gi"
storageClassName: "{{ .Values.globals.environment }}"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: "{{ .Release.Name }}-matter"
spec:
strategy:
type: Recreate
replicas: 1
selector:
matchLabels:
app: "{{ .Release.Name }}-matter"
template:
metadata:
labels:
app: "{{ .Release.Name }}-matter"
spec:
hostNetwork: true
containers:
- name: "{{ .Release.Name }}-matter"
image: "{{ .Values.matter.image.repository }}:{{ .Values.matter.image.tag }}"
imagePullPolicy: "{{ .Values.matter.image.pullPolicy }}"
env:
- name: TZ
value: "{{ .Values.globals.timezone }}"
ports:
- name: http
containerPort: 5580
protocol: TCP
livenessProbe:
tcpSocket:
port: http
readinessProbe:
tcpSocket:
port: http
volumeMounts:
- mountPath: /data
name: data
volumes:
- name: data
persistentVolumeClaim:
claimName: "{{ .Release.Name }}-matter"
---
apiVersion: v1
kind: Service
metadata:
name: "{{ .Release.Name }}-matter"
labels:
app: "{{ .Release.Name }}-matter"
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 5580
protocol: TCP
name: http
selector:
app: "{{ .Release.Name }}-matter"

View File

@@ -0,0 +1 @@
{{ include "common.pvc" . }}

View File

@@ -0,0 +1 @@
{{ include "common.service" . }}

View File

@@ -0,0 +1 @@
{{ include "common.virtualService" . }}

View File

@@ -25,6 +25,8 @@ spec:
- "{{ .Values.whisper.model }}" - "{{ .Values.whisper.model }}"
- --language - --language
- "{{ .Values.whisper.language }}" - "{{ .Values.whisper.language }}"
- --data-dir
- /data
env: env:
- name: TZ - name: TZ
value: "{{ .Values.globals.timezone }}" value: "{{ .Values.globals.timezone }}"

View File

@@ -0,0 +1,74 @@
image:
repository: ghcr.io/home-assistant/home-assistant
tag: 2025.12.5@sha256:9a5a3eb4a213dfb25932dee9dc6815c9305f78cecb5afa716fa2483163d8fb5b
pullPolicy: IfNotPresent
subdomain: home-assistant
# Deployment configuration
deployment:
strategy: Recreate
replicas: 1
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
# Container configuration
container:
port: 8123
healthProbe:
type: tcpSocket
port: http # Use named port
securityContext:
privileged: true
# Service configuration
service:
port: 80
type: ClusterIP
# VirtualService configuration
virtualService:
enabled: true
gateways:
public: true
private: true
# OIDC client configuration
oidc:
enabled: true
redirectUris:
- "/auth/openid/callback"
subjectMode: user_username
# Volume configuration
volumes:
- name: config
mountPath: /config
persistentVolumeClaim: config
- name: misc
mountPath: /media/misc
persistentVolumeClaim: misc # External PVC, not prefixed
# Persistent volume claims
persistentVolumeClaims:
- name: config
size: 5Gi
storageClassName: persistent
piper:
image:
repository: ghcr.io/morten-olsen/glados-voice
tag: main@sha256:8fcc19bd9e7e846bdfd9e9e569c8c944dcfb1d0b47e3f479cbaa7f5587c7206c
pullPolicy: Always
model: en_US-glados-medium
whisper:
image:
repository: rhasspy/wyoming-whisper
tag: latest@sha256:995b37523bc422f4f7649e50ccded97a5b9bf6d1d0420591183a778dd5d7d3f2
pullPolicy: IfNotPresent
model: tiny-int8
language: us
matter:
image:
repository: ghcr.io/home-assistant-libs/python-matter-server
tag: stable@sha256:170aa093ce91c76cde4cc390918307590f0f5558fcec93f913af3cb019e6562a
pullPolicy: IfNotPresent

View File

@@ -0,0 +1,7 @@
apiVersion: v2
version: 1.0.0
name: homebox
dependencies:
- name: common
version: 1.0.0
repository: file://../../common

View File

@@ -0,0 +1 @@
{{ include "common.database" . }}

View File

@@ -0,0 +1 @@
{{ include "common.deployment" . }}

View File

@@ -0,0 +1 @@
{{ include "common.pvc" . }}

View File

@@ -0,0 +1 @@
{{ include "common.service" . }}

View File

@@ -0,0 +1 @@
{{ include "common.virtualService" . }}

View File

@@ -0,0 +1,79 @@
image:
repository: ghcr.io/sysadminsmedia/homebox
tag: latest@sha256:b6c1362ab0450ca8fc1a347c13614a0b4f5674e1ecfa9a57a8c456612921842b
pullPolicy: IfNotPresent
subdomain: homebox
# Deployment configuration
deployment:
strategy: RollingUpdate
replicas: 1
# Container configuration
container:
port: 7745
healthProbe:
type: tcpSocket
port: http # Use named port
# Service configuration
service:
port: 80
type: ClusterIP
# Volume configuration
volumes:
- name: data
mountPath: /data
persistentVolumeClaim: data
# Persistent volume claims
persistentVolumeClaims:
- name: data
size: 1Gi
storageClassName: persistent
# VirtualService configuration
virtualService:
enabled: true
gateways:
public: true
private: true
# Database configuration
database:
enabled: true
# Environment variables
env:
TZ:
value: "{timezone}"
HBOX_OPTIONS_ALLOW_REGISTRATION: "false"
HBOX_DATABASE_DRIVER: postgres
HBOX_DATABASE_DATABASE:
valueFrom:
secretKeyRef:
name: "{release}-connection"
key: database
HBOX_DATABASE_HOST:
valueFrom:
secretKeyRef:
name: "{release}-connection"
key: host
HBOX_DATABASE_PORT:
valueFrom:
secretKeyRef:
name: "{release}-connection"
key: port
HBOX_DATABASE_SSL_MODE: "disable"
HBOX_DATABASE_USERNAME:
valueFrom:
secretKeyRef:
name: "{release}-connection"
key: user
HBOX_DATABASE_PASSWORD:
valueFrom:
secretKeyRef:
name: "{release}-connection"
key: password

View File

@@ -0,0 +1,7 @@
apiVersion: v2
version: 1.0.0
name: immich
dependencies:
- name: common
version: 1.0.0
repository: file://../../common

View File

@@ -0,0 +1 @@
{{ include "common.database" . }}

View File

@@ -0,0 +1,201 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: "{{ .Release.Name }}-server"
spec:
strategy:
type: Recreate
replicas: 1
selector:
matchLabels:
app: "{{ .Release.Name }}-server"
template:
metadata:
labels:
app: "{{ .Release.Name }}-server"
spec:
containers:
- name: "{{ .Release.Name }}-server"
image: "{{ .Values.server.image.repository }}:{{ .Values.server.image.tag }}"
imagePullPolicy: "{{ .Values.server.image.pullPolicy }}"
env:
- name: DB_URL
valueFrom:
secretKeyRef:
name: "{{ .Release.Name }}-connection"
key: url
- name: DB_VECTOR_EXTENSION
value: pgvector
- name: REDIS_HOSTNAME
value: "{{ .Release.Name }}-valkey.{{ .Release.Namespace }}.svc.cluster.local"
- name: REDIS_HOST
value: "{{ .Release.Name }}-valkey.{{ .Release.Namespace }}.svc.cluster.local"
- name: REDIS_PORT
value: "6379"
- name: REDIS_URL
value: "redis://{{ .Release.Name }}-valkey.{{ .Release.Namespace }}.svc.cluster.local:6379"
- name: IMMICH_REDIS_HOSTNAME
value: "{{ .Release.Name }}-valkey.{{ .Release.Namespace }}.svc.cluster.local"
- name: IMMICH_PORT
value: "3003"
- name: IMMICH_UPLOAD_LOCATION
value: /usr/src/app/upload
- name: IMMICH_MACHINE_LEARNING_URL
value: http://{{ .Release.Name }}-ml.{{ .Release.Namespace }}.svc.cluster.local:3003
- name: OAUTH_AUTO_REGISTER
value: "true"
- name: OAUTH_AUTO_LAUNCH
value: "true"
- name: OAUTH_BUTTON_TEXT
value: "Login with OAuth"
- name: OAUTH_ENABLED
value: "true"
- name: OAUTH_ISSUER_URL
valueFrom:
secretKeyRef:
name: "{{ .Release.Name }}-oidc-credentials"
key: issuer
- name: OAUTH_CLIENT_ID
valueFrom:
secretKeyRef:
name: "{{ .Release.Name }}-oidc-credentials"
key: clientId
- name: OAUTH_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: "{{ .Release.Name }}-oidc-credentials"
key: clientSecret
- name: OAUTH_SCOPE
value: "openid profile email"
- name: OAUTH_STORAGE_LABEL_CLAIM
value: "preferred_username"
ports:
- name: http
containerPort: 3003
protocol: TCP
resources:
limits:
cpu: "1500m"
volumeMounts:
- mountPath: /usr/src/app/upload
name: upload
- mountPath: /usr/src/app/library
name: library
- mountPath: /mnt/media/nas
name: nas
livenessProbe:
tcpSocket:
port: http
readinessProbe:
tcpSocket:
port: http
volumes:
- name: upload
persistentVolumeClaim:
claimName: "{{ .Release.Name }}-upload"
- name: library
persistentVolumeClaim:
claimName: "{{ .Release.Name }}-library"
- name: nas
persistentVolumeClaim:
claimName: images
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: "{{ .Release.Name }}-ml"
spec:
strategy:
type: Recreate
replicas: 1
selector:
matchLabels:
app: "{{ .Release.Name }}-ml"
template:
metadata:
labels:
app: "{{ .Release.Name }}-ml"
spec:
containers:
- name: "{{ .Release.Name }}-ml"
image: "{{ .Values.ml.image.repository }}:{{ .Values.ml.image.tag }}"
imagePullPolicy: "{{ .Values.ml.image.pullPolicy }}"
env:
- name: DB_URL
valueFrom:
secretKeyRef:
name: "{{ .Release.Name }}-connection"
key: url
- name: DB_VECTOR_EXTENSION
value: pgvector
- name: REDIS_HOSTNAME
value: "{{ .Release.Name }}-valkey.{{ .Release.Namespace }}.svc.cluster.local"
- name: REDIS_HOST
value: "{{ .Release.Name }}-valkey.{{ .Release.Namespace }}.svc.cluster.local"
- name: REDIS_PORT
value: "6379"
- name: REDIS_URL
value: "redis://{{ .Release.Name }}-valkey.{{ .Release.Namespace }}.svc.cluster.local:6379"
- name: IMMICH_REDIS_HOSTNAME
value: "{{ .Release.Name }}-valkey.{{ .Release.Namespace }}.svc.cluster.local"
- name: IMMICH_PORT
value: "3003"
- name: IMMICH_MACHINE_LEARNING_MODEL_PATH
value: /cache
ports:
- name: http
containerPort: 3003
protocol: TCP
resources:
limits:
cpu: "4000m"
volumeMounts:
- mountPath: /cache
name: model-cache
livenessProbe:
tcpSocket:
port: http
readinessProbe:
tcpSocket:
port: http
volumes:
- name: model-cache
persistentVolumeClaim:
claimName: "{{ .Release.Name }}-model-cache"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: "{{ .Release.Name }}-valkey"
spec:
strategy:
type: Recreate
replicas: 1
revisionHistoryLimit: 0
selector:
matchLabels:
app: "{{ .Release.Name }}-valkey"
template:
metadata:
labels:
app: "{{ .Release.Name }}-valkey"
spec:
containers:
- name: "{{ .Release.Name }}-valkey"
image: "{{ .Values.valkey.image.repository }}:{{ .Values.valkey.image.tag }}"
imagePullPolicy: "{{ .Values.valkey.image.pullPolicy }}"
ports:
- name: tcp
containerPort: 6379
protocol: TCP
resources:
limits:
cpu: "500m"
livenessProbe:
tcpSocket:
port: tcp
readinessProbe:
tcpSocket:
port: tcp

Some files were not shown because too many files have changed in this diff Show More