deployment/production/database-production.yml
Rama main · réplica de lectura del repositorio original.
# Production PostgreSQL Deployment with High Availability
# Phase 3: Production Database Infrastructure
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config
namespace: janua-production
data:
POSTGRES_DB: "janua"
POSTGRES_USER: "janua"
# PostgreSQL Configuration Optimizations
postgresql.conf: |
# Connection Settings
max_connections = 200
shared_buffers = 256MB
effective_cache_size = 1GB
# Memory Configuration
work_mem = 4MB
maintenance_work_mem = 64MB
# Checkpoint Configuration
checkpoint_completion_target = 0.9
wal_buffers = 16MB
# Query Performance
random_page_cost = 1.1
effective_io_concurrency = 200
# Logging Configuration
log_min_duration_statement = 100ms
log_statement = 'ddl'
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
# Replication (for future HA setup)
wal_level = replica
max_wal_senders = 3
max_replication_slots = 3
# Performance Monitoring
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all
pg_stat_statements.save = on
---
apiVersion: v1
kind: Secret
metadata:
name: postgres-secret
namespace: janua-production
type: Opaque
stringData:
POSTGRES_PASSWORD: "REPLACE_WITH_SECURE_PASSWORD"
# Database URL for applications
DATABASE_URL: "postgresql://janua:REPLACE_WITH_SECURE_PASSWORD@postgres-service:5432/janua"
---
# PostgreSQL StatefulSet for Production
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
namespace: janua-production
labels:
app: postgres
component: database
spec:
serviceName: postgres-service
replicas: 1 # Single instance for now, can be upgraded to HA later
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
component: database
spec:
securityContext:
fsGroup: 999
runAsUser: 999
runAsGroup: 999
containers:
- name: postgres
image: postgres:15-alpine
ports:
- containerPort: 5432
name: postgres
envFrom:
- configMapRef:
name: postgres-config
- secretRef:
name: postgres-secret
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 2000m
memory: 4Gi
# Health Checks
livenessProbe:
exec:
command:
- pg_isready
- -U
- janua
- -d
- janua
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
exec:
command:
- pg_isready
- -U
- janua
- -d
- janua
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 3
successThreshold: 1
failureThreshold: 3
# Volume Mounts
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
- name: postgres-config
mountPath: /etc/postgresql/postgresql.conf
subPath: postgresql.conf
# Security Context
securityContext:
runAsNonRoot: true
runAsUser: 999
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
volumes:
- name: postgres-config
configMap:
name: postgres-config
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "fast-ssd" # Use SSD storage for better performance
resources:
requests:
storage: 100Gi
---
# PostgreSQL Service
apiVersion: v1
kind: Service
metadata:
name: postgres-service
namespace: janua-production
labels:
app: postgres
component: database
spec:
type: ClusterIP
ports:
- port: 5432
targetPort: 5432
protocol: TCP
name: postgres
selector:
app: postgres
---
# PostgreSQL Exporter for Monitoring
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-exporter
namespace: janua-production
labels:
app: postgres-exporter
component: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: postgres-exporter
template:
metadata:
labels:
app: postgres-exporter
component: monitoring
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9187"
spec:
containers:
- name: postgres-exporter
image: prometheuscommunity/postgres-exporter:latest
ports:
- containerPort: 9187
name: metrics
env:
- name: DATA_SOURCE_NAME
valueFrom:
secretKeyRef:
name: postgres-secret
key: DATABASE_URL
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
securityContext:
runAsNonRoot: true
runAsUser: 65534
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
---
# PostgreSQL Exporter Service
apiVersion: v1
kind: Service
metadata:
name: postgres-exporter-service
namespace: janua-production
labels:
app: postgres-exporter
component: monitoring
spec:
type: ClusterIP
ports:
- port: 9187
targetPort: 9187
protocol: TCP
name: metrics
selector:
app: postgres-exporter