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:

SystemTypischer 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:

SQL
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:

Bash Auszug aus postgresql.conf
# 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:

  1. postgresql.conf (samt eingebundenen Dateien)
  2. ALTER SYSTEM SET … = …; schreibt in postgresql.auto.conf und überschreibt damit postgresql.conf
  3. ALTER 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:

SQL Aktuelle Werte und ihre Quelle
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_settingsWirkt nach
user / superusersofort, pro Session (SET parameter = …)
sighupSELECT pg_reload_conf(); oder pg_ctl reload / systemctl reload postgresql
postmasternur Restart des Servers

Praktisch: nach jeder Änderung kurz SHOW <parameter>; und prüfen, ob der neue Wert greift. Wenn nicht — Restart vergessen.

SQL
-- 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:

Bash Auszug aus postgresql.conf
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:

Bash
ls /etc/postgresql/18/main/conf.d/
# 10-logging.conf
# 20-tuning.conf
# 50-replication.conf

Vorteil: 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:

Bash Beispielhafte pg_hba.conf
# 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-256

Was die Felder bedeuten:

FeldWerte
TYPElocal (Unix-Socket), host (TCP), hostssl (nur über SSL), hostnossl, hostgssenc
DATABASEDB-Name, all, sameuser, replication, mehrere kommagetrennt
USERRollen-Name, all, +gruppe (Mitglieder einer Rolle)
ADDRESSCIDR, einzelne IP, Hostname (nur für host*)
METHODpeer, 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ür local. 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 mit peer, 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:

Bash Beispiel pg_ident.conf
# MAPNAME      SYSTEM-USERNAME     PG-USERNAME
deploy_map     deploy              app
deploy_map     deploy              admin
admins         /^.*@example\.com$  postgres

In pg_hba.conf referenzierst du das Mapping per map=<mapname>:

Bash
local   all   all   peer   map=deploy_map

Damit 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

/ Weiter

Zurück zu Grundlagen

Zur Übersicht