Skip to content

PostgreSQL & PGAdmin

PostgreSQL Datenbank

PostgreSQL ist ein leistungsstarkes, Open-Source relationales Datenbanksystem, das als primäre Datenbank für dieses Projekt dient.

Architektur

Container-Konfiguration

postgres:
  image: postgres:15-alpine
  environment:
    - POSTGRES_USER=${POSTGRES_USER}
    - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    - POSTGRES_DB=${POSTGRES_DB}
  volumes:
    - postgres_data:/var/lib/postgresql/data
    - ./docker/postgres/:/docker-entrypoint-initdb.d/
  ports:
    - "${POSTGRES_PORT:-5432}:5432"
  healthcheck:
    test: ["CMD", "pg_isready", "-U", "${POSTGRES_USER}"]
    interval: 10s
    timeout: 5s
    retries: 5

Daten-Volumes

  • postgres_data: Persistente Datenspeicherung
  • Init-Scripts: Automatische Datenbank-Initialisierung

PGAdmin - Weboberfläche

PGAdmin ist die offizielle Weboberfläche für PostgreSQL-Verwaltung.

Container-Setup

pgadmin:
  image: dpage/pgadmin4:latest
  environment:
    - PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}
    - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}
  volumes:
    - pgadmin_data:/var/lib/pgadmin
  ports:
    - "${PGADMIN_PORT:-5050}:80"
  depends_on:
    postgres:
      condition: service_healthy

Zugriff

Direkter Datenbankzugriff

  • Host: localhost (lokal) oder postgres (Docker-Netzwerk)
  • Port: 5432
  • Datenbank: Wie in POSTGRES_DB definiert
  • Authentifizierung: Benutzername und Passwort aus .env

PGAdmin Webinterface

  • URL: http://localhost:5050 (lokal) oder https://admin.ihre-domain.de (Produktion)
  • Anmeldung: E-Mail und Passwort aus .env
  • Server-Verbindung: Automatisch konfiguriert

Datenbank-Verwaltung

Verbindung herstellen

  1. PGAdmin öffnen
  2. Server hinzufügen:

  3. Name: PostgreSQL

  4. Host: postgres (Docker) oder localhost (lokal)
  5. Port: 5432
  6. Username/Password: Aus .env

  7. Datenbank erkunden:

  8. Schemas → public → Tables
  9. Views, Functions, etc.

SQL-Abfragen

-- Alle Tabellen anzeigen
SELECT tablename FROM pg_tables WHERE schemaname = 'public';

-- Daten aus Tabelle abfragen
SELECT * FROM users LIMIT 10;

-- Tabellenstruktur anzeigen
\d users

Backup und Restore

Backup erstellen

# Container-Backup
docker exec postgres pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} > backup.sql

# Volume-Backup
docker run --rm -v postgres_data:/data -v $(pwd):/backup alpine tar czf /backup/postgres_backup.tar.gz -C /data .

Backup wiederherstellen

# SQL-Datei importieren
docker exec -i postgres psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} < backup.sql

# Volume wiederherstellen
docker run --rm -v postgres_data:/data -v $(pwd):/backup alpine sh -c "cd /data && tar xzf /backup/postgres_backup.tar.gz"

Performance und Monitoring

Abfrage-Performance

-- Langsame Abfragen finden
SELECT pid, now() - pg_stat_activity.query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;

-- Index-Verwendung prüfen
SELECT schemaname, tablename, attname, n_distinct, correlation
FROM pg_stats
WHERE schemaname = 'public';

Ressourcen-Monitoring

  • Verbindungen: SELECT count(*) FROM pg_stat_activity;
  • Tabellengrößen: SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) FROM pg_tables WHERE schemaname = 'public';
  • Cache-Hit-Rate: Über pg_buffercache Extension

Sicherheit

Best Practices

  • Starke Passwörter: Komplexe Passwörter verwenden
  • Netzwerkzugriff: Nur notwendige IPs zulassen
  • Verschlüsselung: SSL für Verbindungen aktivieren
  • Regelmäßige Updates: PostgreSQL auf dem neuesten Stand halten
  • Backup-Verschlüsselung: Backups verschlüsseln

Zugriffsrechte

-- Benutzerrechte prüfen
SELECT grantee, privilege_type
FROM information_schema.role_table_grants
WHERE table_name = 'users';

-- Neue Rolle erstellen
CREATE ROLE readonly_user LOGIN PASSWORD 'secure_password';
GRANT CONNECT ON DATABASE ${POSTGRES_DB} TO readonly_user;
GRANT USAGE ON SCHEMA public TO readonly_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;

Wartung

Regelmäßige Aufgaben

  • VACUUM: Speicher bereinigen - VACUUM ANALYZE;
  • REINDEX: Indizes neu bauen - REINDEX DATABASE ${POSTGRES_DB};
  • ANALYZE: Statistiken aktualisieren - ANALYZE;

Updates

# PostgreSQL Update
docker compose pull postgres
docker compose up -d postgres

# PGAdmin Update
docker compose pull pgadmin
docker compose up -d pgadmin

Fehlerbehebung

Häufige Probleme

Verbindungsfehler:

  • Container-Status: docker compose ps postgres
  • Logs: docker compose logs postgres
  • Netzwerk: docker compose exec postgres ping postgres

Authentifizierungsfehler:

  • .env-Datei prüfen
  • Passwort-Syntax validieren
  • Benutzerrechte prüfen

Performance-Probleme:

  • Langsame Abfragen identifizieren
  • Indizes prüfen und optimieren
  • Ressourcenlimits anpassen

Speicherplatzmangel:

  • Volume-Größe prüfen
  • Unnötige Daten löschen
  • VACUUM durchführen

Debugging

# PostgreSQL Logs
docker compose logs postgres

# Live-Verbindungen
docker exec postgres psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} -c "SELECT * FROM pg_stat_activity;"

# Datenbankgröße
docker exec postgres psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} -c "SELECT pg_size_pretty(pg_database_size('${POSTGRES_DB}'));"

Dokumentation

PostgreSQL: https://www.postgresql.org/docs/
PGAdmin: https://www.pgadmin.org/docs/