Ich bin inzwischen ein kleiner Postgres Fans geworden und mag die Datenbank inzwischen viel lieber als MySQL.
Hier seht ihr mein Postgres Server Setup. Der Server dient als Datenhaltung für diverse Apps in meinem Homelab.
Zur einfachen Administration nutze ich noch einen pgadmin Server.
docker-compose.yml
Für das Monitoring meiner Datenbank-Schemen nutze ich einen Prometheus Exporter. Das Postgres Image habe ich leicht angepasst.
Wenn ihr keine speziellen Anpassungen an Postgres vornehmen möchtet, kann man einfach das fertige Image direkt nutzen (siehe auskommentierte Zeile).
services:
postgres:
container_name: postgres
#image: postgres:16
build: ./docker
#network_mode: host
ports:
- 5432:5432
command:
- postgres
# See https://www.youtube.com/watch?v=pvPkLTobK0c
- -c
- shared_buffers=4GB
- -c
- max_connections=200
- -c
- work_mem=10MB
- -c
- maintenance_work_mem=500MB
- -c
- wal_buffers=32MB
- -c
- effective_cache_size=5GB
- -c
- checkpoint_timeout=600
# SSD
- -c
- random_page_cost=1.1
- -c
- shared_preload_libraries=pg_stat_statements,vector
- -c
- ssl=on
- -c
- ssl_cert_file=/certs/postgres.muench.lan.crt
- -c
- ssl_key_file=/certs/postgres.muench.lan.key
restart: unless-stopped
env_file:
- postgres.env
volumes:
- postgres-data:/var/lib/postgresql/data
- ./certs:/certs
postgres-exporter:
container_name: postgres-exporter
image: prometheuscommunity/postgres-exporter
restart: unless-stopped
volumes:
- ./exporter/queries.yaml:/queries.yaml
env_file:
- exporter.env
ports:
- "9187:9187"
networks:
- default
depends_on:
- postgres
volumes:
postgres-data:
postgres.env
Super-User:
POSTGRES_USER=postgres
POSTGRES_PASSWORD=xxxxxxxxxxxxxxxx
docker/Dockerfile
Ich verwende die Extensions pgvector (Vektor-Datenbank) und PostGIS (Geo-Daten).
Daher erstelle ich mein eigenes Docker-Image in dem beide Extensions installiert werden.
ARG POSTGIS_MAJOR=3
ARG PG_MAJOR=16
ARG PG_VECTOR_VERSION=0.8.0
FROM postgres:$PG_MAJOR
# Set ARGs for build
ARG POSTGIS_MAJOR
ARG PG_MAJOR
ARG PG_VECTOR_VERSION
# Install runtime and build dependencies
RUN apt-get update && apt-get install -y \
postgresql-16-postgis-3 \
postgresql-16-pgvector && \
rm -rf /var/lib/apt/lists/*
postgres.conf
Meine Einstellungen habe ich für die Nutzung in einem LXC Container angepasst. Der LXC Container läuft in einem Proxmox Cluster. Ich habe dem Container 10 GB RAM zugeteilt. Die Einstellungen hier sind genau auf meine Bedürfnisse ausgelegt und müssen entsprechend für euer Setup angepasst werden.
# Memory settings
shared_buffers = 2GB # 20% of RAM
work_mem = 16MB # Memory for sorting operations
maintenance_work_mem = 512MB # Memory for maintenance tasks like vacuum
# CPU settings
max_parallel_workers_per_gather = 2 # Number of parallel workers per query
max_parallel_workers = 4 # Max parallel workers for entire instance
max_worker_processes = 8 # Max worker processes (should match cores + parallel workers)
# WAL settings
wal_buffers = 16MB # Buffer size for WAL (can be auto-tuned)
checkpoint_completion_target = 0.7 # Checkpoint frequency
effective_io_concurrency = 200 # I/O concurrency for SSDs
# Disk settings
random_page_cost = 1.1 # Set lower for SSDs, higher for spinning disks
effective_cache_size = 1GB # Approx 70% of RAM, including OS cache
# Autovacuum settings
autovacuum_max_workers = 3 # Number of autovacuum workers
autovacuum_naptime = 1min # How often autovacuum runs
# Connection settings
max_connections = 100 # Adjust based on expected traffic; lower for LXC