feat(storage): migrate 38 NFS PVCs to proxmox-lvm (Wave 2)

Add proxmox-lvm PVCs with pvc-autoresizer annotations for all
remaining single-pod app data services. Deployments updated to
use new block storage PVCs. Old NFS modules retained for rollback.

Services: affine, changedetection, diun, excalidraw, f1-stream,
hackmd, isponsorblocktv, matrix, n8n, send, grampsweb, health,
onlyoffice, owntracks, paperless-ngx, privatebin, resume,
speedtest, stirling-pdf, tandoor, rybbit (clickhouse), tor-proxy
(torrserver), whisper+piper, frigate (config), ollama (ui),
servarr (prowlarr/listenarr/qbittorrent), aiostreams, freshrss
(extensions), meshcentral (data+files), openclaw (data+home+
openlobster), technitium, mailserver (data+roundcube html+enigma),
dbaas (pgadmin).

Strategy set to Recreate where needed for RWO volumes.
This commit is contained in:
Viktor Barzin 2026-04-04 19:25:12 +03:00
parent 3dccbca95b
commit cb8a808700
36 changed files with 1166 additions and 50 deletions

View file

@ -170,6 +170,28 @@ module "nfs_data" {
nfs_path = "/mnt/main/mailserver"
}
resource "kubernetes_persistent_volume_claim" "data_proxmox" {
wait_until_bound = false
metadata {
name = "mailserver-data-proxmox"
namespace = kubernetes_namespace.mailserver.metadata[0].name
annotations = {
"resize.topolvm.io/threshold" = "80%"
"resize.topolvm.io/increase" = "100%"
"resize.topolvm.io/storage_limit" = "5Gi"
}
}
spec {
access_modes = ["ReadWriteOnce"]
storage_class_name = "proxmox-lvm"
resources {
requests = {
storage = "1Gi"
}
}
}
}
resource "kubernetes_deployment" "mailserver" {
metadata {
name = "mailserver"
@ -428,7 +450,7 @@ resource "kubernetes_deployment" "mailserver" {
volume {
name = "data"
persistent_volume_claim {
claim_name = module.nfs_data.claim_name
claim_name = kubernetes_persistent_volume_claim.data_proxmox.metadata[0].name
}
# iscsi {
# target_portal = "iscsi.viktorbarzin.lan:3260"

View file

@ -46,6 +46,50 @@ module "nfs_roundcube_enigma" {
# }
resource "kubernetes_persistent_volume_claim" "roundcube_html_proxmox" {
wait_until_bound = false
metadata {
name = "roundcubemail-html-proxmox"
namespace = kubernetes_namespace.mailserver.metadata[0].name
annotations = {
"resize.topolvm.io/threshold" = "80%"
"resize.topolvm.io/increase" = "100%"
"resize.topolvm.io/storage_limit" = "5Gi"
}
}
spec {
access_modes = ["ReadWriteOnce"]
storage_class_name = "proxmox-lvm"
resources {
requests = {
storage = "1Gi"
}
}
}
}
resource "kubernetes_persistent_volume_claim" "roundcube_enigma_proxmox" {
wait_until_bound = false
metadata {
name = "roundcubemail-enigma-proxmox"
namespace = kubernetes_namespace.mailserver.metadata[0].name
annotations = {
"resize.topolvm.io/threshold" = "80%"
"resize.topolvm.io/increase" = "100%"
"resize.topolvm.io/storage_limit" = "5Gi"
}
}
spec {
access_modes = ["ReadWriteOnce"]
storage_class_name = "proxmox-lvm"
resources {
requests = {
storage = "1Gi"
}
}
}
}
resource "kubernetes_deployment" "roundcubemail" {
metadata {
name = "roundcubemail"
@ -61,7 +105,7 @@ resource "kubernetes_deployment" "roundcubemail" {
spec {
replicas = "1"
strategy {
type = "RollingUpdate"
type = "Recreate"
}
selector {
match_labels = {
@ -176,13 +220,13 @@ resource "kubernetes_deployment" "roundcubemail" {
volume {
name = "html"
persistent_volume_claim {
claim_name = module.nfs_roundcube_html.claim_name
claim_name = kubernetes_persistent_volume_claim.roundcube_html_proxmox.metadata[0].name
}
}
volume {
name = "enigma"
persistent_volume_claim {
claim_name = module.nfs_roundcube_enigma.claim_name
claim_name = kubernetes_persistent_volume_claim.roundcube_enigma_proxmox.metadata[0].name
}
}
dns_config {