11 Commits

Author SHA1 Message Date
3a6a621193 Merge branch 'main' of https://github.com/vhaudiquet/homeprod
* 'main' of https://github.com/vhaudiquet/homeprod:
  build(deps): bump tomsquest/docker-radicale in /docker/personal/radicale
2026-05-08 18:15:38 +02:00
17ab87e276 infra: update VMs
- kube: add NIC, bump up memory
- ai: set to off by default
- docker: bump up memory to absorb buildpath importer consumption
2026-05-08 18:15:16 +02:00
dependabot[bot]
56f67dd447 build(deps): bump tomsquest/docker-radicale in /docker/personal/radicale
Bumps tomsquest/docker-radicale from 3.7.1.0 to 3.7.2.0.

---
updated-dependencies:
- dependency-name: tomsquest/docker-radicale
  dependency-version: 3.7.2.0
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-08 15:44:22 +01:00
dependabot[bot]
33bdb8f3b0 build(deps): bump hotio/jackett
Bumps [hotio/jackett](https://github.com/hotio/jackett) from release-v0.24.1815 to release-v0.24.1822.
- [Commits](https://github.com/hotio/jackett/commits)

---
updated-dependencies:
- dependency-name: hotio/jackett
  dependency-version: release-v0.24.1822
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-08 12:44:23 +01:00
dependabot[bot]
1b4e2dafbc build(deps): bump n8nio/n8n from 2.19.2 to 2.19.5 in /docker/home/n8n
Bumps [n8nio/n8n](https://github.com/n8n-io/n8n) from 2.19.2 to 2.19.5.
- [Release notes](https://github.com/n8n-io/n8n/releases)
- [Commits](https://github.com/n8n-io/n8n/compare/n8n@2.19.2...n8n@2.19.5)

---
updated-dependencies:
- dependency-name: n8nio/n8n
  dependency-version: 2.19.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-08 12:44:12 +01:00
dependabot[bot]
9f59f7cea0 build(deps): bump esphome/esphome in /docker/home/esphome
Bumps [esphome/esphome](https://github.com/esphome/esphome) from 2026.4.4 to 2026.4.5.
- [Release notes](https://github.com/esphome/esphome/releases)
- [Commits](https://github.com/esphome/esphome/compare/2026.4.4...2026.4.5)

---
updated-dependencies:
- dependency-name: esphome/esphome
  dependency-version: 2026.4.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-08 12:44:04 +01:00
524d0d7d3c caddy: listen on port 80 2026-05-08 13:43:42 +02:00
51b22d769e caddy: fix external ip annotation 2026-05-08 10:49:26 +02:00
4bd0274714 caddy: fix caddyfile syntax 2026-05-08 10:28:56 +02:00
69e3a793c8 caddy: change security context to fix permission error 2026-05-08 10:21:43 +02:00
d5831fd1e3 caddy: deploy caddy as edge reverse proxy (on kube) 2026-05-08 00:48:55 +02:00
18 changed files with 330 additions and 8 deletions

View File

@@ -53,6 +53,7 @@ updates:
- "/kubernetes/personal/photoprism"
- "/kubernetes/production/umami"
- "/kubernetes/system/blocky"
- "/kubernetes/system/caddy"
- "/kubernetes/system/coredns"
- "/kubernetes/system/csi-driver-nfs"
- "/kubernetes/system/external-dns"

View File

@@ -3,7 +3,7 @@ creation_rules:
encrypted_regex: ^(password|value|ssh-key|api-key|user|username|privateKey|clientSecret|clientId|apiKey|extraArgs.*|.*Secret.*|extraEnvVars|.*SECRET.*|.*secret.*|key|.*Password|.*\.ya?ml)$
pgp: DC6910268E657FF70BA7EC289974494E76938DDC
- path_regex: .*.yaml
encrypted_regex: ^(data|stringData)$
encrypted_regex: ^(data|stringData|.*.key|.*.crt)$
pgp: DC6910268E657FF70BA7EC289974494E76938DDC
- path_regex: .*.env$
input_type: dotenv

View File

@@ -1,6 +1,6 @@
services:
esphome:
image: ghcr.io/esphome/esphome:2026.4.4
image: ghcr.io/esphome/esphome:2026.4.5
ports:
- "6052"
networks:

View File

@@ -1,6 +1,6 @@
services:
n8n:
image: docker.n8n.io/n8nio/n8n:2.19.2
image: docker.n8n.io/n8nio/n8n:2.19.5
environment:
- TZ=Europe/Paris
- N8N_SECURE_COOKIE=false

View File

@@ -1,7 +1,7 @@
services:
jackett:
container_name: jackett
image: ghcr.io/hotio/jackett:release-v0.24.1815
image: ghcr.io/hotio/jackett:release-v0.24.1822
ports:
- "9117"
networks:

View File

@@ -1,6 +1,6 @@
services:
radicale:
image: tomsquest/docker-radicale:3.7.1.0
image: tomsquest/docker-radicale:3.7.2.0
container_name: radicale
ports:
- 5232

View File

@@ -47,7 +47,9 @@ resource "proxmox_virtual_environment_file" "ai-cloud-config" {
resource "proxmox_virtual_environment_vm" "ai" {
name = "ai-${var.proxmox_node_name}"
node_name = var.proxmox_node_name
on_boot = true
on_boot = false
started = false
agent {
enabled = true

View File

@@ -61,7 +61,7 @@ resource "proxmox_virtual_environment_vm" "docker-machine" {
}
memory {
floating = 22222
floating = 32000
dedicated = 38768
}

View File

@@ -29,7 +29,7 @@ resource "proxmox_virtual_environment_vm" "kube" {
memory {
dedicated = 32768
floating = 16192
floating = 22222
}
boot_order = ["scsi0", "ide0"]
@@ -89,6 +89,12 @@ resource "proxmox_virtual_environment_vm" "kube" {
vlan_id = 2
}
network_device {
bridge = "vmbr0"
model = "virtio"
vlan_id = 2
}
operating_system {
type = "l26"
}

View File

@@ -0,0 +1,93 @@
# Caddy Routes - External ConfigMap
# This file contains all route definitions, imported by the main Caddyfile.
# Edit this file to add/modify routes.
#
# Certificate files are mounted from the caddy-certificates Secret
# at /etc/caddy/certs/
apiVersion: v1
kind: ConfigMap
metadata:
name: caddy-routes
namespace: caddy
labels:
app.kubernetes.io/name: caddy
app.kubernetes.io/component: routes
data:
Caddyfile: |
vhaudiquet.fr {
tls /etc/caddy/certs/vhaudiquet-fr.crt /etc/caddy/certs/vhaudiquet-fr.key
reverse_proxy 10.1.2.212:80
}
*.vhaudiquet.fr {
tls /etc/caddy/certs/wildcard-vhaudiquet-fr.crt /etc/caddy/certs/wildcard-vhaudiquet-fr.key
# Kubernetes services (via Traefik)
@authentik host authentik.vhaudiquet.fr
@auth-nook host auth-nook.vhaudiquet.fr
@nook-mg host n.vhaudiquet.fr
@nook host nook.vhaudiquet.fr
@sse-nook host sse-nook.vhaudiquet.fr
@gitea host git.vhaudiquet.fr
@flux-wh host flux-webhook.vhaudiquet.fr
@umami host umami.vhaudiquet.fr
handle @authentik {
reverse_proxy traefik.traefik.svc.cluster.local:80
}
handle @auth-nook {
reverse_proxy traefik.traefik.svc.cluster.local:80
}
handle @nook-mg {
reverse_proxy traefik.traefik.svc.cluster.local:80
}
handle @nook {
reverse_proxy traefik.traefik.svc.cluster.local:80
}
handle @sse-nook {
reverse_proxy traefik.traefik.svc.cluster.local:80
}
handle @gitea {
reverse_proxy traefik.traefik.svc.cluster.local:80
}
handle @flux-wh {
reverse_proxy traefik.traefik.svc.cluster.local:80
}
handle @umami {
reverse_proxy traefik.traefik.svc.cluster.local:80
}
# Docker VM services (via Traefik)
@alexscript host alexscript.vhaudiquet.fr
@clips host clips.vhaudiquet.fr
@jellyfin host flix.vhaudiquet.fr
@mail host mail.vhaudiquet.fr
handle @alexscript {
reverse_proxy 10.1.2.212:80
}
handle @clips {
reverse_proxy 10.1.2.212:80
}
handle @jellyfin {
reverse_proxy 10.1.2.212:80
}
handle @mail {
reverse_proxy 10.1.2.212:80
}
}
semery.fr {
tls /etc/caddy/certs/semery-fr.crt /etc/caddy/certs/semery-fr.key
reverse_proxy 10.1.2.212:80
}
buildpath.win {
tls /etc/caddy/certs/buildpath-win.crt /etc/caddy/certs/buildpath-win.key
reverse_proxy 10.1.2.212:80
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,15 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: caddy
resources:
- namespace.yaml
- repository.yaml
- release.yaml
- certificates-secret.yaml
- caddyfile.yaml
secretGenerator:
- name: caddy-values
files:
- values.yaml=values.yaml
configurations:
- kustomizeconfig.yaml

View File

@@ -0,0 +1,6 @@
nameReference:
- kind: Secret
version: v1
fieldSpecs:
- path: spec/valuesFrom/name
kind: HelmRelease

View File

@@ -0,0 +1,7 @@
apiVersion: v1
kind: Namespace
metadata:
name: caddy
labels:
app.kubernetes.io/name: caddy
app.kubernetes.io/component: edge-proxy

View File

@@ -0,0 +1,30 @@
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: caddy
namespace: caddy
spec:
interval: 1m
chart:
spec:
sourceRef:
kind: HelmRepository
name: caddy
namespace: caddy
chart: caddy
interval: 1m
version: "0.7.1"
valuesFrom:
- kind: Secret
name: caddy-values
# Patch the Service to add loadBalancerIP since the chart doesn't support it
postRenderers:
- kustomize:
patches:
- target:
kind: Service
name: caddy
patch: |
- op: add
path: /spec/loadBalancerIP
value: "10.1.2.152"

View File

@@ -0,0 +1,8 @@
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: caddy
namespace: caddy
spec:
interval: 1m
url: https://charts.alekc.dev/

View File

@@ -0,0 +1,99 @@
# Caddy Edge Proxy
replicaCount: 2
# Listen on standard HTTP port
listenPort: 80
# Enable HTTPS
https:
enabled: true
port: 443
image:
repository: caddy
pullPolicy: IfNotPresent
tagSuffix: ""
tag: 2.11.2
service:
type: LoadBalancer
externalTrafficPolicy: Local
# Disable ingress - Caddy IS the edge proxy
ingress:
enabled: false
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
# Caddy needs root to bind to ports 80/443 and write runtime data
# Using restrictive security context causes "operation not permitted"
podSecurityContext: {}
securityContext: {}
health:
path: /
port: 9999
# Extra volumes: certificates + external routes ConfigMap
volumes:
- name: certificates
secret:
secretName: ENC[AES256_GCM,data:Er1F+5xhWKUT43+7jU/pwxWP,iv:Ohc3jFIQ4Enmbhd0F44SYWJiHlj1oFOrMdtM4oYKQEU=,tag:Kk8Y8aFSKMyGmY/uRVvyLw==,type:str]
optional: ENC[AES256_GCM,data:JdlpGQ==,iv:xaoqonC9cGHXizHuAFrjhC4ZEtZ2IICeg2hxvGjyFM4=,tag:JYmlIXgIMON7z4++FrBGKQ==,type:bool]
- name: routes
configMap:
name: caddy-routes
# Extra volume mounts
volumeMounts:
- name: certificates
mountPath: /etc/caddy/certs
readOnly: true
- name: routes
mountPath: /etc/caddy/routes
readOnly: true
# Caddy configuration
config:
debug: false
# Global options (goes inside the global {} block)
global: |
auto_https off
# The main Caddyfile content - imports routes from external ConfigMap
# This keeps routes in a separate, easily editable file
caddyFile: |
:80 {
redir https://{host}{uri} permanent
}
import /etc/caddy/routes/Caddyfile
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app.kubernetes.io/name: caddy
topologyKey: kubernetes.io/hostname
sops:
lastmodified: "2026-05-08T11:43:14Z"
mac: ENC[AES256_GCM,data:K0HWw8yTPKy6e3aQV4SdiVwrCjiyCFlFbeycAiyJq4IdlKX9v4wFvjVFLR8VziH8oXJXdUUhr+LOiqNI5HwghXkVn2dOP2ij9jvXZtMic4P0AUN16PfWoedu9ozA+xsGHZ1OTUv+sxvKEUo5Z5Wp+u761w/Xqdn5hHmU2Komatk=,iv:ICwn/LvizIjXVfgiMje50dQ11JAH37wSla29bGAnjuA=,tag:mV7rtahUy4ODZaA7baM12w==,type:str]
pgp:
- created_at: "2026-05-08T11:43:13Z"
enc: |-
-----BEGIN PGP MESSAGE-----
hQIMA7uy4qQr71wiAQ//aGnCSLLWTkhToTh833OJ1GwgN82F8R+RgsfpKIW+XNvI
YdTCgaFrYdCGXsaLHijb7vVwCU0VRf/ufZfQp2+GupqRHCbMLSmlkoiyr9ImGlYX
VWQDajv74H/3CcyCQNjqfFRdUHLE+rfNuYaH/p3+/Ee2bgJi52f3uRdJ4lXSCWIf
KW9lLbwjlfGnOnsnDkaPwcZW9QL353Mi82yXOu7OihobUaVgr83nESXbAS/k4mx1
whOXAoEDeLQZfZrITEewOQ0PHjWJwKc0x2YCiQ0If33GSfDjzWPoDuXmQo/xhk98
Nt3aNTMDvjriGNOIcZyUlEjq1HqCmd3pQSD5h8soR9Do/NsTocyK1da49iz91dha
jwoEga2iFis9Zd9rr7Caf3pWtmKENUGFJl15tpaelvk13jUebSyDubw0OIYbbILr
dVZAeiOHrRMD5crxG05zvOeLMASuL/IrK97RLBAonZLEkRrfgAwZHK2U0rq2HXpI
wlp4yDlF/eILvmMgAruP7lW0q/m5+DfxQtcZdamtm3FWj9m0iUAthvw02fplmFci
xJ82rkfkPAZSm7/yPJ9yiea+tKgX8yk1uArRtf8rsG6SED2lCRKmux8ElcZc5DYV
hyLivTN7X5Nr05mvaPIptCVm1iYoWaiQNZcPDax/LBZJhNaJgPUz1ue1Ppf422PS
XgE4dh3x1ulcUhXm4nK/0FzKmJUOjcygPeGWmia0ZOEHub/ju+z8LgRAkBasqRXP
4aepPm5xVY0g/Z0xksxIWpYUnLRzs0uUKd+zz1MvmWlZckxUO5wWJUWRcwCBDz4=
=Ql2K
-----END PGP MESSAGE-----
fp: DC6910268E657FF70BA7EC289974494E76938DDC
encrypted_regex: ^(password|value|ssh-key|api-key|user|username|privateKey|clientSecret|clientId|apiKey|extraArgs.*|.*Secret.*|extraEnvVars|.*SECRET.*|.*secret.*|key|.*Password|.*\.ya?ml)$
version: 3.10.2

View File

@@ -6,3 +6,4 @@ spec:
blocks:
- cidr: "10.1.2.171/32"
- cidr: "10.1.2.148/32"
- cidr: "10.1.2.152/32"