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) oderpostgres(Docker-Netzwerk) - Port: 5432
- Datenbank: Wie in
POSTGRES_DBdefiniert - Authentifizierung: Benutzername und Passwort aus
.env
PGAdmin Webinterface¶
- URL:
http://localhost:5050(lokal) oderhttps://admin.ihre-domain.de(Produktion) - Anmeldung: E-Mail und Passwort aus
.env - Server-Verbindung: Automatisch konfiguriert
Datenbank-Verwaltung¶
Verbindung herstellen¶
- PGAdmin öffnen
-
Server hinzufügen:
-
Name:
PostgreSQL - Host:
postgres(Docker) oderlocalhost(lokal) - Port:
5432 -
Username/Password: Aus
.env -
Datenbank erkunden:
- Schemas → public → Tables
- 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/