Die wichtigsten drei Stellschrauben von PostgreSQL sitzen in drei Textdateien: postgresql.conf regelt das Server-Verhalten, pg_hba.conf legt fest, wer sich von wo anmelden darf, und pg_ident.conf ordnet Betriebssystem-Benutzer Postgres-Rollen zu. Wer diese drei kennt, hat 80 % der Postgres-Konfiguration in der Hand.
Wo liegen die Dateien?
Der genaue Pfad hängt vom Betriebssystem und Paket-Layout ab:
| System | Typischer Pfad |
|---|---|
| Ubuntu/Debian | /etc/postgresql/<version>/main/ |
| RHEL/Fedora | /var/lib/pgsql/<version>/data/ |
| macOS Postgres.app | ~/Library/Application Support/Postgres/var-<version>/ |
| macOS Homebrew | /opt/homebrew/var/postgresql@<version>/ |
| Docker (offizielles Image) | /var/lib/postgresql/data/ (im Container) |
| Generisch (selbst kompiliert) | <PGDATA>/ |
Den korrekten Pfad findest du am schnellsten direkt im laufenden Server:
SHOW config_file;
SHOW hba_file;
SHOW ident_file;
SHOW data_directory;Auf Ubuntu/Debian liegen die Config-Dateien unter /etc/postgresql/..., das Daten-Verzeichnis unter /var/lib/postgresql/... — anders als beim generischen Setup, wo alles im selben PGDATA liegt. Die SHOW-Befehle helfen, beim richtigen Mode nachzusehen.
postgresql.conf — der Hauptschalter
postgresql.conf enthält über 300 Parameter — von Speichergrößen über Logging bis zu Replikation. Wichtige Beispiele:
# Connections
listen_addresses = 'localhost' # 'localhost', '*', '10.0.0.5', ...
port = 5432
max_connections = 100
# Memory
shared_buffers = 128MB
effective_cache_size = 4GB
work_mem = 4MB
maintenance_work_mem = 64MB
# WAL / Checkpoints
wal_level = replica
max_wal_size = 1GB
checkpoint_timeout = 5min
# Logging
log_destination = 'stderr'
logging_collector = on
log_directory = 'log'
log_min_duration_statement = 250ms
log_line_prefix = '%m [%p] %q%u@%d 'Es gibt drei Wege, die Werte zu setzen, mit aufsteigender Priorität:
postgresql.conf(samt eingebundenen Dateien)ALTER SYSTEM SET … = …;schreibt inpostgresql.auto.confund überschreibt damitpostgresql.confALTER DATABASE … SET …/ALTER USER … SET …für Database/Role-spezifische Werte
Auf einem laufenden Server lohnt sich pg_settings für eine Komplettübersicht, was wie gesetzt ist:
SELECT name, setting, source, sourcefile, sourceline
FROM pg_settings
WHERE name IN ('shared_buffers','work_mem','log_min_duration_statement');Reload vs. Restart
Nicht jede Änderung braucht einen Restart. Postgres unterscheidet drei Kontexte:
| context-Wert in pg_settings | Wirkt nach |
|---|---|
user / superuser | sofort, pro Session (SET parameter = …) |
sighup | SELECT pg_reload_conf(); oder pg_ctl reload / systemctl reload postgresql |
postmaster | nur Restart des Servers |
Praktisch: nach jeder Änderung kurz SHOW <parameter>; und prüfen, ob der neue Wert greift. Wenn nicht — Restart vergessen.
-- Welche Aenderungen warten gerade noch auf einen Restart?
SELECT name, setting, pending_restart
FROM pg_settings
WHERE pending_restart;conf.d / Include-Mechanismen
postgresql.conf kennt drei Include-Direktiven, die Konfigurationen modular halten:
include 'extra.conf'
include_if_exists 'optional.conf'
include_dir 'conf.d'Konvention auf den meisten Systemen: ein leeres conf.d/-Verzeichnis liegt neben postgresql.conf. Eigene Anpassungen kommen als nummerierte Dateien dort hinein:
ls /etc/postgresql/18/main/conf.d/
# 10-logging.conf
# 20-tuning.conf
# 50-replication.confVorteil: Paket-Updates überschreiben deine Anpassungen nicht, und die Aufgaben sind sauber getrennt. Die letzte Datei in alphabetischer Reihenfolge gewinnt bei Konflikten.
pg_hba.conf — wer darf rein?
pg_hba.conf (Host-Based Authentication) ist eine zeilenbasierte Allow-Liste. Jede Zeile prüft fünf Felder, von oben nach unten, und die erste passende Zeile entscheidet:
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
local all all scram-sha-256
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256
host replication replicator 10.0.0.0/24 scram-sha-256
hostssl myapp app 0.0.0.0/0 scram-sha-256Was die Felder bedeuten:
| Feld | Werte |
|---|---|
| TYPE | local (Unix-Socket), host (TCP), hostssl (nur über SSL), hostnossl, hostgssenc |
| DATABASE | DB-Name, all, sameuser, replication, mehrere kommagetrennt |
| USER | Rollen-Name, all, +gruppe (Mitglieder einer Rolle) |
| ADDRESS | CIDR, einzelne IP, Hostname (nur für host*) |
| METHOD | peer, trust, scram-sha-256, md5, cert, ident, gss, ldap, radius, … |
Die wichtigsten Authentifizierungsmethoden:
peer— Postgres prüft den Unix-User des Clients gegen den Postgres-Rollennamen. Nur fürlocal. Standard für lokale Admin-Verbindungen.trust— kein Passwort, jeder darf rein. Gefährlich. Nur in geschlossenen Test-Setups.scram-sha-256— modernes Passwort-Verfahren. Default seit PG 14.md5— alter Passwort-Hash. Sollte nicht mehr genutzt werden, lebt nur noch wegen Legacy-Clients.cert— Client-Zertifikate (mTLS).ident— vergleichbar mitpeer, aber für TCP. Braucht einen Ident-Server am Client. Selten.
Nach Änderung an pg_hba.conf reicht ein Reload (pg_ctl reload / SELECT pg_reload_conf()); ein Restart ist nicht nötig.
pg_ident.conf — Mapping zwischen OS-User und Postgres-Rolle
Die Methoden peer, ident und cert identifizieren den Client als OS-User oder Cert-CN — nicht direkt als Postgres-Rolle. pg_ident.conf schlägt die Brücke:
# MAPNAME SYSTEM-USERNAME PG-USERNAME
deploy_map deploy app
deploy_map deploy admin
admins /^.*@example\.com$ postgresIn pg_hba.conf referenzierst du das Mapping per map=<mapname>:
local all all peer map=deploy_mapDamit darf sich der OS-User deploy als Postgres-Rolle app oder admin anmelden, ohne dass die Namen identisch sind. Der reguläre Ausdruck (Zeile 3) erlaubt sogar mehrere Cert-CNs. Praktisch für Service-Konten in Produktions-Setups.
Häufige Stolperfallen
Reihenfolge in pg_hba.conf zaehlt — die erste Treffer-Zeile entscheidet.
Eine zu liberale Zeile ganz oben (host all all 0.0.0.0/0 trust) macht alle darunter folgenden Regeln wirkungslos. Beim Editieren immer kurz prüfen: stehen die spezifischen Regeln vor den allgemeinen?
ALTER SYSTEM landet in postgresql.auto.conf — und ueberschreibt deine .conf.
Wenn du postgresql.conf editierst und der Parameter trotzdem nicht greift, wirf einen Blick in postgresql.auto.conf (gleicher Ordner). Dort liegt alles, was via ALTER SYSTEM gesetzt wurde — und das hat Vorrang. Aufräumen mit ALTER SYSTEM RESET <parameter>; oder ALTER SYSTEM RESET ALL;.
Restart vergessen.
Manche Parameter (shared_buffers, max_connections, wal_level, listen_addresses) lassen sich nur per Restart ändern. Wer bloß pg_reload_conf() macht, sieht den alten Wert weiter — und wundert sich. pg_settings.pending_restart zeigt, was noch wartet.
listen_addresses = 'localhost' versus 'pg_hba.conf'.
Beide müssen passen, damit eine Remote-Verbindung klappt. listen_addresses öffnet den Port nach außen, pg_hba.conf regelt, wer durchdarf. Wer nur eines ändert, bekommt entweder „connection refused” (Port zu) oder „no pg_hba.conf entry” (Server hört, lehnt aber ab).
md5 noch in der pg_hba.conf — schon mal nach scram-sha-256 umstellen.
md5-Hashes werden noch akzeptiert, sind aber kryptographisch nicht mehr empfehlenswert. Ein Wechsel auf scram-sha-256 ist drei Schritte: Parameter password_encryption = scram-sha-256 setzen, Methodenfeld in pg_hba.conf ändern, Passwörter mit \password <user> neu setzen. Nicht in einem Schritt — sonst ist niemand mehr drin.
Permission-Bits zu locker — und Postgres startet nicht.
postgresql.conf, pg_hba.conf und das Daten-Verzeichnis müssen Mode 0600 bzw. 0700 haben. Wer nach manuellem Hin-und-Her-Kopieren die Bits zu offen lässt, bekommt beim Start data directory has invalid permissions und der Server bleibt unten. Fix: chmod 0700 $PGDATA und für Configs chmod 0600.
Weiterführende Ressourcen
Externe Quellen
- Server Configuration – PostgreSQL Documentation
- The pg_hba.conf File – PostgreSQL Documentation
- User Name Maps (pg_ident.conf) – PostgreSQL Documentation
- ALTER SYSTEM – PostgreSQL Documentation
- pg_settings View – PostgreSQL Documentation