Einleitung

PostgreSQL ist ein relationales Datenbankmanagementsystem (RDBMS), das für seine Erweiterbarkeit, SQL-Standardkonformität, Robustheit und erweiterten Funktionen bekannt ist. PostgreSQL wird oft für Anwendungen bevorzugt, die eine strenge Transaktionskontrolle und Datenintegrität erfordern und FreeBSD bietet eine hervorragende Basis für den Betrieb einer PostgreSQL-Datenbank, die diese eine ähnliche Lizenz wie BSD verwendet.

Ziele

PostgreSQL bildet den Datenbankserver und damit die Basis für alle darauf aufbauenden Artikel.
Dies kann entweder separat als eigene Datenbank Jail oder zusammen mit der Applikation ohne separate Jail erfolgen. Gerade wenn ohnehin mehrere PostgreSQL-Datenbanken im Einsatz sind, lohnt sich ein zentraler Server.

NEU: Für ganz ungeduldige habe ich einen Konsole only Abschnitt. Da gibts nur Befehle, keine Erklärungen.

Letzte Aktualisierung:

  • 18.01.2026: Entfernen der externen Verzeichnisse. Das wird hier zwar erklärt, das ist nur für fortgeschrittene Admins.
  • 16.01.2026: Kleinere Anpassungen
  • 30.11.2025: Update Postgres Version 17, Upgrade von 13 als Beispiel eingefügt.
  • 26.12.2024: Überarbeitung und Integration in "FreeBSD als Server" Logik, TrueNAS entfernt.
  • 28.08.2024: Update PostgreSQL Version 16
  • 03.03.2024: Initiales Dokument

Voraussetzungen

Diagramm

Damit sieht das Setup inkl. aller optionalen Möglichkeiten so aus:

                   ┌──────────────────────────┐
                   │  FreeBSD                 │
                   │ ┌──────────────────────┐ │
                   │ │ jail/pgsql           │ │
LAN: 0.0.0.0:5432 ─│─│─► postgresql-server  │ │
                   │ │                      │ │
                   │ └──────────────────────┘ │
                   └──────────────────────────┘

Jail erstellen

Es wird ein eigenes Jail empfohlen, sollte PostgreSQL als zentraler Datenbank Server auch gleichzeitig für andere Anwendungen dienen. Hier nehmen wir pgsql als Jail Namen und es wird auf jeden Fall die Option allow_sysvipc benötigt, auch wenn PostgrSQL in ein vorhandenes Jail mit installiert wird.

Jail einrichten

Entweder mit bastile console pgsql eine Konsole in das erstellte Jail starten, oder es erfolgt ein Login per SSH (wenn aktiviert) mit ssh USERNAME@IP oder ssh USERNAME@HOSTNAME, um dann mit su root Rechte zu erlangen.

Paketquelle anpassen

Paketquellen sollten angepasst werden, siehe separater Artikel.

Pakete installieren & Dienste aktivieren

Nun die Paketquelle mit pkg update aktualisieren und dann die benötigten Pakete installieren: pkg install -y postgresql17-server Dienste aktivieren und beim Start des Jails automatisch mit starten: service postgresql enable

PostgreSQL

PostgreSQL mit service postgresql initdb initialisieren und mit service postgresql start starten.

Regelmäßige Wartung

Datenbanken sollten regelmäßig und am besten automatisch gewartet werden:

  • vacuumdb ist ein Dienstprogramm zum Bereinigen einer PostgreSQL-Datenbank
  • reindexdb ist ein Dienstprogramm zum Wiederaufbau von Indizes in einer PostgreSQL-Datenbank

Mit mkdir /var/db/postgres/bin eine Verzeichnis für das folgende Skript anlegen:

cat > /var/db/postgres/bin/vacuum.sh <<'EOF'
#! /bin/sh
/usr/local/bin/vacuumdb -az 1> /dev/null 2> /dev/null
/usr/local/bin/reindexdb -a 1> /dev/null 2> /dev/null
EOF

und dann jeden Abend um 0:00 Uhr ausführen lassen:

echo "# PostgreSQL house keeping" >> /etc/crontab
echo "0       0       *       *       *       postgres /var/db/postgres/bin/vacuum.sh" >> /etc/crontab

Netzwerkzugriff

Falls es ein separates PostgreSQL Jail ist, dürfen damit die anderen Jails auf die Datenbank(en) zugreifen, muss aber erst vorher erlaubt werden:

echo "# MIT Anmeldung, allen anderen wird nicht vertraut" >> /var/db/postgres/data17/pg_hba.conf
echo "host    all             all             all                     scram-sha-256" >> /var/db/postgres/data17/pg_hba.conf

Dies bedeutet auch, dass der Dienst nicht nur an localhost gebunden sein darf, da er sonst nicht über die Netzwerk-IP-Adresse erreichbar ist.

sed -i '' "s/#listen_addresses = 'localhost'/listen_addresses = '*'/" /var/db/postgres/data17/postgresql.conf

Danach muss PostgreSQL mit service postgresql restart neu gestartet werden.

Datenbanken und Benutzer erstellen

su -m postgres -c "createuser -s DATENBANKBENUTZER --pwprompt" # Erstellt den Benutzer
su -m postgres -c "createdb -O DATENBANKBENUTZER -E Unicode -T template1 DATENBANKNAME" # Erstellt die Datenbank für den Benutzer

Backup

pg_dump -Fc -h "DATENBANKHOST" -p "DATENBANKPORT" -d "DATENBANKNAME" -U "DATENBANKBENUTZER" -f "ZIELPFAD"

Konsole

Voilá