[{"data":1,"prerenderedAt":1038},["ShallowReactive",2],{"navigation":3,"\u002Fen\u002Fblog\u002Fpostgresql-helm-chart-kubernetes":306,"\u002Fen\u002Fblog\u002Fpostgresql-helm-chart-kubernetes-surround":1033},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,219,231,262,299],{"title":5,"path":6,"stem":7},"Build and Deploy a Modern Website in 5 Minutes","\u002Fen\u002Fblog\u002Fbuild-with-loveable","en\u002F3.blog\u002F1.build-with-loveable",{"title":9,"path":10,"stem":11},"The Vercel Alternative for the German Mittelstand: Sovereign Hosting on Hetzner with lowcloud","\u002Fen\u002Fblog\u002Fdigital-sovereignty-lowcloud-vs-vercel-b2b","en\u002F3.blog\u002F10.digital-sovereignty-lowcloud-vs-vercel-b2b",{"title":13,"path":14,"stem":15},"Cloud Sovereignty Framework: How the EU Is Finally Making Cloud Sovereignty Measurable","\u002Fen\u002Fblog\u002Fcloud-sovereignty-framework","en\u002F3.blog\u002F12.cloud-sovereignty-framework",{"title":17,"path":18,"stem":19},"Avoiding Cloud Vendor Lock-in: What Real Sovereignty Means Technically","\u002Fen\u002Fblog\u002Fcloud-vendor-lock-in","en\u002F3.blog\u002F13.cloud-vendor-lock-in",{"title":21,"path":22,"stem":23},"Digital Sovereignty with Kubernetes: When Is Open Source Truly Sovereign?","\u002Fen\u002Fblog\u002Fkubernetes-digital-sovereignty","en\u002F3.blog\u002F14.kubernetes-digital-sovereignty",{"title":25,"path":26,"stem":27},"What Is DevOps as a Service and When Does It Actually Make Sense?","\u002Fen\u002Fblog\u002Fdevops-as-a-service","en\u002F3.blog\u002F15.devops-as-a-service",{"title":29,"path":30,"stem":31},"Cloud Sovereignty Governance: Why This Topic Belongs in the Boardroom, Not the Server Room","\u002Fen\u002Fblog\u002Fcloud-sovereignty-governance","en\u002F3.blog\u002F16.cloud-sovereignty-governance",{"title":33,"path":34,"stem":35},"PaaS vs. DaaS: What","\u002Fen\u002Fblog\u002Fpaas-vs-daas","en\u002F3.blog\u002F17.paas-vs-daas",{"title":37,"path":38,"stem":39},"Sovereign Cloud: Can SaaS Really Maintain Control Over Your Data?","\u002Fen\u002Fblog\u002Fsovereign-cloud-saas-data-control","en\u002F3.blog\u002F18.sovereign-cloud-saas-data-control",{"title":41,"path":42,"stem":43},"DevOps vs. DevOps as a Service – Which One Fits Your Team?","\u002Fen\u002Fblog\u002Fdevops-vs-devops-as-a-service","en\u002F3.blog\u002F19.devops-vs-devops-as-a-service",{"title":45,"path":46,"stem":47},"Docker Fundamentals -  Understanding Container Virtualization","\u002Fen\u002Fblog\u002Fhow-docker-works","en\u002F3.blog\u002F2.how-docker-works",{"title":49,"path":50,"stem":51},"The 7 Biggest DevOps Problems in SMBs – And How to Fix Them","\u002Fen\u002Fblog\u002Fdevops-problems-smb","en\u002F3.blog\u002F20.devops-problems-smb",{"title":53,"path":54,"stem":55},"PostgreSQL Helm Chart: How to Deploy Postgres on Kubernetes","\u002Fen\u002Fblog\u002Fpostgresql-helm-chart-kubernetes","en\u002F3.blog\u002F21.postgresql-helm-chart-kubernetes",{"title":57,"path":58,"stem":59},"Platform Engineering vs. DevOps – What","\u002Fen\u002Fblog\u002Fplatform-engineering-vs-devops","en\u002F3.blog\u002F22.platform-engineering-vs-devops",{"title":61,"path":62,"stem":63},"Cloud Act vs. GDPR: The Risk for EU Businesses","\u002Fen\u002Fblog\u002Fcloud-act-vs-gdpr","en\u002F3.blog\u002F23.cloud-act-vs-gdpr",{"title":65,"path":66,"stem":67},"Cut IT Costs with Automation: The Biggest Lever","\u002Fen\u002Fblog\u002Freduce-it-costs-automation","en\u002F3.blog\u002F24.reduce-it-costs-automation",{"title":69,"path":70,"stem":71},"NIS2 Compliance for DevOps Teams: What You Need to Do","\u002Fen\u002Fblog\u002Fnis2-compliance-devops","en\u002F3.blog\u002F25.nis2-compliance-devops",{"title":73,"path":74,"stem":75},"Self-Hosted EU Alternatives: Host LibreOffice & More","\u002Fen\u002Fblog\u002Fself-hosted-eu-alternatives","en\u002F3.blog\u002F26.self-hosted-eu-alternatives",{"title":77,"path":78,"stem":79},"DORA Compliance for DevOps: What the EU Resilience Act Means","\u002Fen\u002Fblog\u002Fdora-compliance-devops","en\u002F3.blog\u002F27.dora-compliance-devops",{"title":81,"path":82,"stem":83},"Cloud TCO: Hidden Costs AWS, Azure & GCP Don't Show You","\u002Fen\u002Fblog\u002Fcloud-tco-hidden-costs","en\u002F3.blog\u002F28.cloud-tco-hidden-costs",{"title":85,"path":86,"stem":87},"Data Residency vs. Data Sovereignty: What Really Matters","\u002Fen\u002Fblog\u002Fdata-residency-vs-data-sovereignty","en\u002F3.blog\u002F29.data-residency-vs-data-sovereignty",{"title":89,"path":90,"stem":91},"Self-Host n8n on Hetzner: Complete Docker Setup Guide","\u002Fen\u002Fblog\u002Fself-hosted-n8n-on-hetzner","en\u002F3.blog\u002F3.self-hosted-n8n-on-hetzner",{"title":93,"path":94,"stem":95},"Manual Deployments: An Underestimated Risk for SMBs","\u002Fen\u002Fblog\u002Fmanual-deployment-risks","en\u002F3.blog\u002F30.manual-deployment-risks",{"title":97,"path":98,"stem":99},"DevOps Tool Sprawl: How It Happens and How to Stop It","\u002Fen\u002Fblog\u002Fdevops-tool-sprawl","en\u002F3.blog\u002F31.devops-tool-sprawl",{"title":101,"path":102,"stem":103},"Kubernetes Monitoring: Using Logs and Metrics Effectively","\u002Fen\u002Fblog\u002Fkubernetes-monitoring-logs-metrics","en\u002F3.blog\u002F32.kubernetes-monitoring-logs-metrics",{"title":105,"path":106,"stem":107},"OB7 Case Study: Website Deployment Without Infrastructure Overhead","\u002Fen\u002Fblog\u002Fob7-case-study-lowcloud-deployment","en\u002F3.blog\u002F33.ob7-case-study-lowcloud-deployment",{"title":109,"path":110,"stem":111},"DevOps in SMBs: Why Missing Roles Become a Real Risk","\u002Fen\u002Fblog\u002Fmissing-devops-roles-smb","en\u002F3.blog\u002F34.missing-devops-roles-smb",{"title":113,"path":114,"stem":115},"Simplify Kubernetes Configuration: The Path to Human-Readable Cloud","\u002Fen\u002Fblog\u002Fsimplify-kubernetes-configuration","en\u002F3.blog\u002F35.simplify-kubernetes-configuration",{"title":117,"path":118,"stem":119},"Collaborative DevOps: How Modern Teams Build Cloud Apps Together","\u002Fen\u002Fblog\u002Fcollaborative-devops-teams","en\u002F3.blog\u002F36.collaborative-devops-teams",{"title":121,"path":122,"stem":123},"Knowledge Documentation in DevOps Teams: How to Actually Reduce Your Bus Factor","\u002Fen\u002Fblog\u002Fdevops-knowledge-documentation-bus-factor","en\u002F3.blog\u002F37.devops-knowledge-documentation-bus-factor",{"title":125,"path":126,"stem":127},"What Is PaaS? Platform as a Service Explained","\u002Fen\u002Fblog\u002Fwhat-is-paas","en\u002F3.blog\u002F38.what-is-paas",{"title":129,"path":130,"stem":131},"EU AI Act Hosting: What Changes for AI Workload Operators","\u002Fen\u002Fblog\u002Feu-ai-act-hosting","en\u002F3.blog\u002F39.eu-ai-act-hosting",{"title":133,"path":134,"stem":135},"Docker Compose Tutorial: Managing Multi-Container Apps Made Easy","\u002Fen\u002Fblog\u002Fdocker-compose-for-beginners","en\u002F3.blog\u002F4.docker-compose-for-beginners",{"title":137,"path":138,"stem":139},"Full-Stack Developer Reality: What the Title Actually Means","\u002Fen\u002Fblog\u002Ffull-stack-developer-reality","en\u002F3.blog\u002F40.full-stack-developer-reality",{"title":141,"path":142,"stem":143},"Cloud Egress Fees Compared: AWS vs. Azure vs. GCP Pricing","\u002Fen\u002Fblog\u002Fcloud-egress-fees","en\u002F3.blog\u002F41.cloud-egress-fees",{"title":145,"path":146,"stem":147},"Bring Your Own Cloud: What the Model Means and Why It","\u002Fen\u002Fblog\u002Fbring-your-own-cloud","en\u002F3.blog\u002F42.bring-your-own-cloud",{"title":149,"path":150,"stem":151},"Zero-Config Kubernetes: Why Simplicity Wins","\u002Fen\u002Fblog\u002Fzero-config-kubernetes","en\u002F3.blog\u002F43.zero-config-kubernetes",{"title":153,"path":154,"stem":155},"Minimalist Cloud Architecture: Why Less Complexity Means More Stability","\u002Fen\u002Fblog\u002Fminimalist-cloud-architecture","en\u002F3.blog\u002F44.minimalist-cloud-architecture",{"title":157,"path":158,"stem":159},"Software Deployment for SMBs: How Small Teams Ship Faster","\u002Fen\u002Fblog\u002Fsmb-software-deployment","en\u002F3.blog\u002F45.smb-software-deployment",{"title":161,"path":162,"stem":163},"EU Data Act: What Businesses and DevOps Teams Need to Know","\u002Fen\u002Fblog\u002Feu-data-act-business-devops","en\u002F3.blog\u002F46.eu-data-act-business-devops",{"title":165,"path":166,"stem":167},"Data Governance Act: What SMBs and DevOps Teams Need to Know","\u002Fen\u002Fblog\u002Fdata-governance-act-devops-guide","en\u002F3.blog\u002F47.data-governance-act-devops-guide",{"title":169,"path":170,"stem":171},"Cloud Agnostic Architecture: Meaning and Trade-offs","\u002Fen\u002Fblog\u002Fcloud-agnostic-architecture","en\u002F3.blog\u002F48.cloud-agnostic-architecture",{"title":173,"path":174,"stem":175},"Kubernetes Migration: What You Need to Know Before You Start","\u002Fen\u002Fblog\u002Fkubernetes-migration-guide","en\u002F3.blog\u002F49.kubernetes-migration-guide",{"title":177,"path":178,"stem":179},"Self-Host Docmost with Docker Compose and Traefik: Complete Guide","\u002Fen\u002Fblog\u002Fself-host-docmost-with-docker-and-traefik","en\u002F3.blog\u002F5.self-host-docmost-with-docker-and-traefik",{"title":181,"path":182,"stem":183},"AI Agent Infrastructure: What You Really Need for Production","\u002Fen\u002Fblog\u002Fai-agent-infrastructure","en\u002F3.blog\u002F50.ai-agent-infrastructure",{"title":185,"path":186,"stem":187},"What Is Kubernetes? A Practical Guide to Container Orchestration","\u002Fen\u002Fblog\u002Fwhat-is-kubernetes","en\u002F3.blog\u002F6.what-is-kubernetes",{"title":189,"path":190,"stem":191},"The Cloud Illusion: Why a Server Location in Germany Doesn’t Guarantee Digital Sovereignty","\u002Fen\u002Fblog\u002Fcloud-illusion-digital-sovereignty","en\u002F3.blog\u002F7.cloud-illusion-digital-sovereignty",{"title":193,"path":194,"stem":195},"S3-Compatible Object Storage: The Best Solutions at a Glance","\u002Fen\u002Fblog\u002Fs3-compatible-object-storage","en\u002F3.blog\u002F8.s3-compatible-object-storage",{"title":197,"path":198,"stem":199},"Deployment as a Bottleneck: When AI Codes Faster Than You Can Deploy","\u002Fen\u002Fblog\u002Fdeployment-bottleneck","en\u002F3.blog\u002F9.deployment-bottleneck",{"title":201,"path":202,"stem":203,"children":204,"icon":218},"Getting Started","\u002Fen\u002Fdocs\u002Fgetting-started","en\u002F1.docs\u002F1.getting-started\u002F1.index",[205,208,213],{"title":206,"path":202,"stem":203,"icon":207},"Introduction","i-lucide-house",{"title":209,"path":210,"stem":211,"icon":212},"Get Started","\u002Fen\u002Fdocs\u002Fgetting-started\u002Fget-started","en\u002F1.docs\u002F1.getting-started\u002F2.get-started","i-lucide-rocket",{"title":214,"path":215,"stem":216,"icon":217},"How It Works","\u002Fen\u002Fdocs\u002Fgetting-started\u002Fhow-it-works","en\u002F1.docs\u002F1.getting-started\u002F3.how-it-works","i-lucide-lightbulb",false,{"title":220,"path":221,"stem":222,"children":223,"icon":218},"Guides","\u002Fen\u002Fdocs\u002Fguides","en\u002F1.docs\u002F2.guides\u002F1.index",[224,226],{"title":220,"path":221,"stem":222,"icon":225},"i-lucide-book-open",{"title":227,"path":228,"stem":229,"icon":230},"Connect a Container Registry","\u002Fen\u002Fdocs\u002Fguides\u002Fcontainer-registries","en\u002F1.docs\u002F2.guides\u002F2.container-registries","i-lucide-container",{"title":232,"path":233,"stem":234,"children":235,"icon":218},"App Services","\u002Fen\u002Fdocs\u002Fapp-services","en\u002F1.docs\u002F3.app-services\u002F1.index",[236,237,242,247,252,257],{"title":232,"path":233,"stem":234,"icon":212},{"title":238,"path":239,"stem":240,"icon":241},"Build Settings","\u002Fen\u002Fdocs\u002Fapp-services\u002Fbuild-settings","en\u002F1.docs\u002F3.app-services\u002F2.build-settings","i-lucide-settings",{"title":243,"path":244,"stem":245,"icon":246},"Env Variables","\u002Fen\u002Fdocs\u002Fapp-services\u002Fenvironment-variables","en\u002F1.docs\u002F3.app-services\u002F3.environment-variables","i-lucide-key",{"title":248,"path":249,"stem":250,"icon":251},"Custom Domains","\u002Fen\u002Fdocs\u002Fapp-services\u002Fcustom-domains","en\u002F1.docs\u002F3.app-services\u002F4.custom-domains","i-lucide-globe",{"title":253,"path":254,"stem":255,"icon":256},"Health Checks","\u002Fen\u002Fdocs\u002Fapp-services\u002Fhealth-checks","en\u002F1.docs\u002F3.app-services\u002F5.health-checks","i-lucide-heart-pulse",{"title":258,"path":259,"stem":260,"icon":261},"Autoscaling","\u002Fen\u002Fdocs\u002Fapp-services\u002Fautoscaling","en\u002F1.docs\u002F3.app-services\u002F6.autoscaling","i-lucide-scaling",{"title":263,"path":264,"stem":265,"children":266,"icon":218},"Helm Releases","\u002Fen\u002Fdocs\u002Fhelm-releases","en\u002F1.docs\u002F4.helm-releases\u002F1.index",[267,269,274,279,284,289,294],{"title":263,"path":264,"stem":265,"icon":268},"i-lucide-package",{"title":270,"path":271,"stem":272,"icon":273},"Deploy PostgreSQL","\u002Fen\u002Fdocs\u002Fhelm-releases\u002Fdeploy-postgresql","en\u002F1.docs\u002F4.helm-releases\u002F2.deploy-postgresql","i-lucide-database",{"title":275,"path":276,"stem":277,"icon":278},"Deploy Redis","\u002Fen\u002Fdocs\u002Fhelm-releases\u002Fdeploy-redis","en\u002F1.docs\u002F4.helm-releases\u002F3.deploy-redis","i-lucide-zap",{"title":280,"path":281,"stem":282,"icon":283},"Deploy n8n","\u002Fen\u002Fdocs\u002Fhelm-releases\u002Fdeploy-n8n","en\u002F1.docs\u002F4.helm-releases\u002F4.deploy-n8n","i-lucide-workflow",{"title":285,"path":286,"stem":287,"icon":288},"Deploy RustFS","\u002Fen\u002Fdocs\u002Fhelm-releases\u002Fdeploy-rustfs","en\u002F1.docs\u002F4.helm-releases\u002F5.deploy-rustfs","i-lucide-hard-drive",{"title":290,"path":291,"stem":292,"icon":293},"Deploy OpenSearch","\u002Fen\u002Fdocs\u002Fhelm-releases\u002Fdeploy-opensearch","en\u002F1.docs\u002F4.helm-releases\u002F6.deploy-opensearch","i-lucide-search",{"title":295,"path":296,"stem":297,"icon":298},"Deploy Keycloak","\u002Fen\u002Fdocs\u002Fhelm-releases\u002Fdeploy-keycloak","en\u002F1.docs\u002F4.helm-releases\u002F7.deploy-keycloak","i-lucide-shield-check",{"title":300,"path":301,"stem":302,"children":303,"icon":218},"Glossary","\u002Fen\u002Fdocs\u002Fglossary","en\u002F1.docs\u002F5.glossary\u002F1.index",[304],{"title":300,"path":301,"stem":302,"icon":305},"i-lucide-book-a",{"id":307,"title":53,"authors":308,"badge":314,"body":315,"date":1025,"description":1026,"extension":1027,"image":1028,"lastUpdated":314,"meta":1030,"navigation":455,"path":54,"published":455,"seo":1031,"stem":55,"tags":314,"__hash__":1032},"posts\u002Fen\u002F3.blog\u002F21.postgresql-helm-chart-kubernetes.md",[309],{"name":310,"to":311,"avatar":312},"Fabian Sander","\u002Fabout\u002Ffabiansander",{"src":313},"\u002Fimages\u002Fblog\u002Fauthors\u002Ffabian.png",null,{"type":316,"value":317,"toc":1009},"minimark",[318,327,332,345,348,352,357,360,383,387,390,510,520,524,527,533,601,604,658,661,694,697,701,704,715,718,721,725,729,732,739,759,763,766,844,847,851,854,857,876,930,937,957,964,968,971,986,989,993,996,999,1005],[319,320,321,322,326],"p",{},"Running PostgreSQL on ",[323,324,325],"a",{"href":186},"Kubernetes"," has become standard practice for many teams. Helm has established itself as the go-to tool for making these deployments reproducible. What's often underestimated: stateful workloads like databases are far less forgiving of configuration mistakes than stateless services — and those who have blindly relied on Bitnami charts now face an unexpected decision since 2025.",[328,329,331],"h2",{"id":330},"what-helm-actually-does-here","What Helm actually does here",[319,333,334,335,339,340,344],{},"Helm is a package manager for Kubernetes. A ",[336,337,338],"strong",{},"Helm Chart"," bundles all the Kubernetes manifests you need for a deployment. That includes Deployments, Services, ConfigMaps, Secrets, and PersistentVolumeClaims — all wrapped into a versioned, configurable package. Instead of manually maintaining dozens of YAML files, you define your deviations from the defaults in a ",[341,342,343],"code",{},"values.yaml"," and let the chart handle the rest.",[319,346,347],{},"For PostgreSQL, this means the chart takes care of StatefulSets, Headless Services for peer communication, Persistent Volume integration, and optional replication configurations. You don't need to reinvent the wheel — but you should understand what's happening under the hood.",[328,349,351],{"id":350},"postgresql-helm-chart-deployment-the-direct-path","PostgreSQL Helm Chart deployment — the direct path",[353,354,356],"h3",{"id":355},"prerequisites","Prerequisites",[319,358,359],{},"Before you deploy, make sure you have the following in place:",[361,362,363,367,373,380],"ul",{},[364,365,366],"li",{},"Helm 3.x installed",[364,368,369,372],{},[341,370,371],{},"kubectl"," access to your cluster",[364,374,375,376,379],{},"A ",[336,377,378],{},"StorageClass"," configured that can dynamically provision Persistent Volumes",[364,381,382],{},"A Kubernetes version compatible with the chosen chart",[353,384,386],{"id":385},"installing-the-chart","Installing the chart",[319,388,389],{},"Using a community-compatible chart (more on choosing one in the next section), the basic command looks like this:",[391,392,397],"pre",{"className":393,"code":394,"language":395,"meta":396,"style":396},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","helm repo add \u003Crepo-name> \u003Crepo-url>\nhelm repo update\n\nhelm install my-postgres \u003Crepo-name>\u002Fpostgresql \\\n  --namespace databases \\\n  --create-namespace \\\n  -f values.yaml\n","bash","",[341,398,399,440,450,457,482,493,501],{"__ignoreMap":396},[400,401,404,408,412,415,419,422,426,429,431,434,437],"span",{"class":402,"line":403},"line",1,[400,405,407],{"class":406},"sBMFI","helm",[400,409,411],{"class":410},"sfazB"," repo",[400,413,414],{"class":410}," add",[400,416,418],{"class":417},"sMK4o"," \u003C",[400,420,421],{"class":410},"repo-nam",[400,423,425],{"class":424},"sTEyZ","e",[400,427,428],{"class":417},">",[400,430,418],{"class":417},[400,432,433],{"class":410},"repo-ur",[400,435,436],{"class":424},"l",[400,438,439],{"class":417},">\n",[400,441,443,445,447],{"class":402,"line":442},2,[400,444,407],{"class":406},[400,446,411],{"class":410},[400,448,449],{"class":410}," update\n",[400,451,453],{"class":402,"line":452},3,[400,454,456],{"emptyLinePlaceholder":455},true,"\n",[400,458,460,462,465,468,470,472,474,476,479],{"class":402,"line":459},4,[400,461,407],{"class":406},[400,463,464],{"class":410}," install",[400,466,467],{"class":410}," my-postgres",[400,469,418],{"class":417},[400,471,421],{"class":410},[400,473,425],{"class":424},[400,475,428],{"class":417},[400,477,478],{"class":410},"\u002Fpostgresql",[400,480,481],{"class":424}," \\\n",[400,483,485,488,491],{"class":402,"line":484},5,[400,486,487],{"class":410},"  --namespace",[400,489,490],{"class":410}," databases",[400,492,481],{"class":424},[400,494,496,499],{"class":402,"line":495},6,[400,497,498],{"class":410},"  --create-namespace",[400,500,481],{"class":424},[400,502,504,507],{"class":402,"line":503},7,[400,505,506],{"class":410},"  -f",[400,508,509],{"class":410}," values.yaml\n",[319,511,512,513,516,517,519],{},"Rather than passing every parameter as ",[341,514,515],{},"--set"," flags, use a proper ",[341,518,343],{},". This keeps the deployment traceable, version-controlled, and reproducible.",[353,521,523],{"id":522},"key-configuration-parameters","Key configuration parameters",[319,525,526],{},"Three areas are most critical in practice:",[319,528,529,530,532],{},"Passwords don't belong directly in your ",[341,531,343],{},". Instead, create Kubernetes Secrets upfront and reference them in the chart:",[391,534,538],{"className":535,"code":536,"language":537,"meta":396,"style":396},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","auth:\n  existingSecret: 'my-postgres-secret'\n  secretKeys:\n    adminPasswordKey: 'postgres-password'\n    userPasswordKey: 'user-password'\n","yaml",[341,539,540,549,566,573,587],{"__ignoreMap":396},[400,541,542,546],{"class":402,"line":403},[400,543,545],{"class":544},"swJcz","auth",[400,547,548],{"class":417},":\n",[400,550,551,554,557,560,563],{"class":402,"line":442},[400,552,553],{"class":544},"  existingSecret",[400,555,556],{"class":417},":",[400,558,559],{"class":417}," '",[400,561,562],{"class":410},"my-postgres-secret",[400,564,565],{"class":417},"'\n",[400,567,568,571],{"class":402,"line":452},[400,569,570],{"class":544},"  secretKeys",[400,572,548],{"class":417},[400,574,575,578,580,582,585],{"class":402,"line":459},[400,576,577],{"class":544},"    adminPasswordKey",[400,579,556],{"class":417},[400,581,559],{"class":417},[400,583,584],{"class":410},"postgres-password",[400,586,565],{"class":417},[400,588,589,592,594,596,599],{"class":402,"line":484},[400,590,591],{"class":544},"    userPasswordKey",[400,593,556],{"class":417},[400,595,559],{"class":417},[400,597,598],{"class":410},"user-password",[400,600,565],{"class":417},[319,602,603],{},"The default persistence configuration works for testing but isn't suitable for production. Define size and StorageClass explicitly:",[391,605,607],{"className":535,"code":606,"language":537,"meta":396,"style":396},"primary:\n  persistence:\n    enabled: true\n    size: 50Gi\n    storageClass: 'fast-ssd'\n",[341,608,609,616,623,634,644],{"__ignoreMap":396},[400,610,611,614],{"class":402,"line":403},[400,612,613],{"class":544},"primary",[400,615,548],{"class":417},[400,617,618,621],{"class":402,"line":442},[400,619,620],{"class":544},"  persistence",[400,622,548],{"class":417},[400,624,625,628,630],{"class":402,"line":452},[400,626,627],{"class":544},"    enabled",[400,629,556],{"class":417},[400,631,633],{"class":632},"sfNiH"," true\n",[400,635,636,639,641],{"class":402,"line":459},[400,637,638],{"class":544},"    size",[400,640,556],{"class":417},[400,642,643],{"class":410}," 50Gi\n",[400,645,646,649,651,653,656],{"class":402,"line":484},[400,647,648],{"class":544},"    storageClass",[400,650,556],{"class":417},[400,652,559],{"class":417},[400,654,655],{"class":410},"fast-ssd",[400,657,565],{"class":417},[319,659,660],{},"If you need high availability, a read replica setup is worth considering:",[391,662,664],{"className":535,"code":663,"language":537,"meta":396,"style":396},"architecture: replication\nreadReplicas:\n  replicaCount: 2\n",[341,665,666,676,683],{"__ignoreMap":396},[400,667,668,671,673],{"class":402,"line":403},[400,669,670],{"class":544},"architecture",[400,672,556],{"class":417},[400,674,675],{"class":410}," replication\n",[400,677,678,681],{"class":402,"line":442},[400,679,680],{"class":544},"readReplicas",[400,682,548],{"class":417},[400,684,685,688,690],{"class":402,"line":452},[400,686,687],{"class":544},"  replicaCount",[400,689,556],{"class":417},[400,691,693],{"class":692},"sbssI"," 2\n",[319,695,696],{},"Without explicit replication configuration, you're deploying a single instance. That works — but it's not production-grade.",[328,698,700],{"id":699},"the-bitnami-problem-and-what-it-means-for-your-setup","The Bitnami problem and what it means for your setup",[319,702,703],{},"For years, Bitnami delivered the de facto standard for Helm Charts. Their charts were easy to use, well-documented, and backed by a broad community. That has changed.",[319,705,706,707,710,711,714],{},"Since VMware acquired Bitnami, the repository model has been gradually restructured — a concrete example of ",[323,708,709],{"href":18},"vendor lock-in",". As of August 2025, direct access to the public Bitnami repository is restricted for commercial users. If you're running ",[341,712,713],{},"helm repo update"," in your CI\u002FCD pipeline without adjustments, you risk deployment failures — not because of a cluster issue, but because the chart repository is no longer accessible as expected.",[319,716,717],{},"For existing setups, this means: check which of your Helm Charts come from Bitnami. Determine whether you're affected — and if so, when your currently cached chart was last successfully pulled.",[319,719,720],{},"No reason to panic, but it does require concrete action.",[328,722,724],{"id":723},"alternatives-to-the-bitnami-postgresql-helm-chart","Alternatives to the Bitnami PostgreSQL Helm Chart",[353,726,728],{"id":727},"open-source-alternatives-at-a-glance","Open-source alternatives at a glance",[319,730,731],{},"There are fully functional alternatives that are actively maintained:",[319,733,734,735,738],{},"For a hands-on walkthrough of deploying PostgreSQL with the Cloudpirates Helm Chart on lowcloud, check out our ",[323,736,737],{"href":271},"step-by-step guide",".",[361,740,741,747,753],{},[364,742,743,746],{},[336,744,745],{},"Cloudpirates Open Source Helm Charts",": lowcloud provides its own open-source charts as a direct response to the Bitnami situation. The charts are designed with practical defaults and are actively maintained.",[364,748,749,752],{},[336,750,751],{},"Zalando Postgres Operator",": An operator approach controlled via CRDs. More powerful than a simple chart, but also more complex to set up.",[364,754,755,758],{},[336,756,757],{},"CloudNativePG Operator",": The CNCF-maintained Postgres operator with a strong focus on Kubernetes-native features like streaming replication, point-in-time recovery, and automatic failover.",[353,760,762],{"id":761},"criteria-for-choosing-the-right-chart","Criteria for choosing the right chart",[319,764,765],{},"The choice depends on your requirements:",[767,768,769,785],"table",{},[770,771,772],"thead",{},[773,774,775,779,782],"tr",{},[776,777,778],"th",{},"Criterion",[776,780,781],{},"Simple Chart",[776,783,784],{},"Operator Approach",[786,787,788,800,811,822,833],"tbody",{},[773,789,790,794,797],{},[791,792,793],"td",{},"Barrier to entry",[791,795,796],{},"Low",[791,798,799],{},"Medium to high",[773,801,802,805,808],{},[791,803,804],{},"Flexibility",[791,806,807],{},"Limited",[791,809,810],{},"High",[773,812,813,816,819],{},[791,814,815],{},"Automatic failover",[791,817,818],{},"Manually configured",[791,820,821],{},"Built-in",[773,823,824,827,830],{},[791,825,826],{},"Replication management",[791,828,829],{},"Static",[791,831,832],{},"Dynamic",[773,834,835,838,841],{},[791,836,837],{},"Production readiness",[791,839,840],{},"Good for small setups",[791,842,843],{},"Recommended for critical DBs",[319,845,846],{},"For teams running PostgreSQL in production with high-availability requirements, an operator is the more robust choice in the medium term. For smaller services or development environments, a well-configured chart is sufficient.",[328,848,850],{"id":849},"dont-forget-persistence-backups-and-monitoring","Don't forget persistence, backups, and monitoring",[319,852,853],{},"Once the deployment is running, the real operational work begins.",[319,855,856],{},"Make sure your PersistentVolumeClaim is bound to a StorageClass that actually delivers fast I\u002FO. Slow disks are a common PostgreSQL performance killer that only shows up under load.",[319,858,859,860,863,864,867,868,871,872,875],{},"For backups, ",[341,861,862],{},"pg_dump"," remains a valid solution for smaller databases. In Kubernetes-native setups, consider ",[336,865,866],{},"Velero"," for snapshot-based backups of the Persistent Volume on ",[323,869,870],{"href":194},"S3-compatible object storage",", or ",[336,873,874],{},"Barman"," for WAL archiving and point-in-time recovery.",[391,877,879],{"className":393,"code":878,"language":395,"meta":396,"style":396},"# Simple pg_dump from a running pod\nkubectl exec -it my-postgres-0 -n databases -- \\\n  pg_dump -U postgres mydb > backup.sql\n",[341,880,881,887,910],{"__ignoreMap":396},[400,882,883],{"class":402,"line":403},[400,884,886],{"class":885},"sHwdD","# Simple pg_dump from a running pod\n",[400,888,889,891,894,897,900,903,905,908],{"class":402,"line":442},[400,890,371],{"class":406},[400,892,893],{"class":410}," exec",[400,895,896],{"class":410}," -it",[400,898,899],{"class":410}," my-postgres-0",[400,901,902],{"class":410}," -n",[400,904,490],{"class":410},[400,906,907],{"class":410}," --",[400,909,481],{"class":424},[400,911,912,915,918,921,924,927],{"class":402,"line":452},[400,913,914],{"class":410},"  pg_dump",[400,916,917],{"class":410}," -U",[400,919,920],{"class":410}," postgres",[400,922,923],{"class":410}," mydb",[400,925,926],{"class":417}," >",[400,928,929],{"class":410}," backup.sql\n",[319,931,932,933,936],{},"For monitoring, ",[336,934,935],{},"postgres_exporter"," is the standard way to export PostgreSQL metrics to Prometheus. Key metrics to watch:",[361,938,939,945,951],{},[364,940,941,944],{},[341,942,943],{},"pg_stat_activity"," — active connections and running queries",[364,946,947,950],{},[341,948,949],{},"pg_replication_lag"," — replication delay for read replicas",[364,952,953,956],{},[341,954,955],{},"pg_database_size_bytes"," — database growth over time",[319,958,959,960,963],{},"A ready-made Grafana dashboard is available for import — search for Dashboard ID ",[341,961,962],{},"9628"," in the Grafana repository.",[328,965,967],{"id":966},"when-a-managed-approach-is-the-better-choice","When a managed approach is the better choice",[319,969,970],{},"Running PostgreSQL on Kubernetes is solvable, but it takes time. Someone has to update the charts, monitor backups, test failover scenarios, and ensure storage classes still work correctly after cluster upgrades.",[319,972,973,974,977,978,981,982,985],{},"For teams that want to focus on their application rather than database infrastructure, a ",[323,975,976],{"href":26},"DevOps as a Service platform"," like ",[336,979,980],{},"lowcloud"," is a pragmatic alternative. PostgreSQL is provided as a managed service — built on the same ",[323,983,984],{"href":22},"sovereign Kubernetes infrastructure",", but without the operational overhead. You don't need to maintain your own Helm Charts, set up manual backup configurations, or build a monitoring setup from scratch.",[319,987,988],{},"This isn't a replacement for every use case. If you need specific PostgreSQL configurations, custom extensions, or full control over every parameter, self-hosting is the better path. For everything else, it's worth asking: is this really a differentiating advantage for your team, or just necessary overhead?",[328,990,992],{"id":991},"conclusion","Conclusion",[319,994,995],{},"Deploying PostgreSQL with Helm on Kubernetes works. The steps are manageable, the configuration options well-documented. What has changed: choosing the right chart is no longer a given. If you've been relying on Bitnami, you should review your CI\u002FCD pipeline and evaluate an alternative — whether that's a community chart, an operator, or a managed service depends on your own requirements.",[319,997,998],{},"The infrastructure decisions you make today directly impact maintainability twelve months from now.",[319,1000,1001,1002,738],{},"To deploy PostgreSQL on lowcloud in minutes, follow our ",[323,1003,1004],{"href":271},"PostgreSQL guide in the documentation",[1006,1007,1008],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":396,"searchDepth":442,"depth":442,"links":1010},[1011,1012,1017,1018,1022,1023,1024],{"id":330,"depth":442,"text":331},{"id":350,"depth":442,"text":351,"children":1013},[1014,1015,1016],{"id":355,"depth":452,"text":356},{"id":385,"depth":452,"text":386},{"id":522,"depth":452,"text":523},{"id":699,"depth":442,"text":700},{"id":723,"depth":442,"text":724,"children":1019},[1020,1021],{"id":727,"depth":452,"text":728},{"id":761,"depth":452,"text":762},{"id":849,"depth":442,"text":850},{"id":966,"depth":442,"text":967},{"id":991,"depth":442,"text":992},"2026-03-16","Learn how to deploy PostgreSQL with Helm on Kubernetes, why Bitnami charts have become problematic, and what alternatives are available.","md",{"src":1029},"\u002Fimages\u002Fblog\u002Fpostgresql-helm-chart-kubernetes.jpg",{},{"title":53,"description":1026},"3xSKWaFJ0rWdToefOuuJ0fCpR05_EKiEwsmTkcYze8k",[1034,1036],{"title":49,"path":50,"stem":51,"description":1035,"children":-1},"DevOps in SMBs often fails for the same reasons: missing roles, manual deployments, no monitoring. Here is how to tackle the 7 most common pitfalls.",{"title":57,"path":58,"stem":59,"description":1037,"children":-1},"DevOps and Platform Engineering compared: key differences, overlap, and when it makes sense to invest in an Internal Developer Platform.",1775510462295]