Zum Hauptinhalt springen

PostgreSQL ausführen

Einführung

PostgreSQL ist ein leistungsstarkes, objektrelationales Datenbankmanagementsystem (ORDBMS), das für seine Stabilität, Skalierbarkeit und Erweiterbarkeit bekannt ist. Es ist Open Source und unterstützt eine Vielzahl von SQL-Funktionen, einschließlich komplexer Abfragen, Transaktionen, Indizierung und JSON-Daten.

PostgreSQL eignet sich sowohl für kleine Anwendungen als auch für große, datenintensive Systeme und wird weltweit von Unternehmen und Entwicklern genutzt.

Eine PostgreSQL-Datenbank erstellen

Du kannst eine PostgreSQL-Datenbank in deiner mittwald Hosting-Umgebung mit Containern bereitstellen. Es gibt verschiedene Hauptansätze:

Verwendung von Terraform (Empfohlen)

Der bequemste Weg, eine PostgreSQL-Datenbank bereitzustellen, ist die Verwendung von Terraform. Das folgende Beispiel zeigt, wie du einen PostgreSQL-Container in deinem eigenen Terraform-Deployment verwenden kannst:

variable "postgres_password" {
type = string
sensitive = true
}

data "mittwald_container_image" "postgres" {
image = "postgres:17"
}

resource "mittwald_container_stack" "postgresql" {
project_id = mittwald_project.example.id
default_stack = true

containers = {
postgresql = {
description = "PostgreSQL Database Server"
image = data.mittwald_container_image.postgres.image
entrypoint = data.mittwald_container_image.postgres.entrypoint
command = data.mittwald_container_image.postgres.command

environment = {
POSTGRES_DB = "mydatabase"
POSTGRES_USER = "myuser"
POSTGRES_PASSWORD = var.postgres_password
}

volumes = [
{
volume = "postgresql_data"
mount_path = "/var/lib/postgresql/data"
},
{
project_path = "/files/postgresql-backups"
mount_path = "/mnt"
}
]

ports = [
{
container_port = 5432
public_port = 5432
protocol = "tcp"
}
]
}
}

volumes = {
postgresql_data = {}
}
}

Du kannst auch die random_password-Ressource verwenden, um ein Passwort dynamisch zu generieren. Beachte, dass du in diesem Fall dieses Passwort auch sicher in einem Secret Manager speichern solltest, da es danach nicht mehr abrufbar ist.

resource "random_password" "postgres_password" {
length = 24
}

data "mittwald_container_image" "postgres" {
image = "postgres:17"
}

resource "mittwald_container_stack" "postgresql" {
project_id = mittwald_project.example.id
default_stack = true

containers = {
postgresql = {
description = "PostgreSQL Database Server"
image = data.mittwald_container_image.postgres.image
entrypoint = data.mittwald_container_image.postgres.entrypoint
command = data.mittwald_container_image.postgres.command

environment = {
POSTGRES_DB = "mydatabase"
POSTGRES_USER = "myuser"
POSTGRES_PASSWORD = random_password.postgres_password.result
}

volumes = [
{
volume = "postgresql_data"
mount_path = "/var/lib/postgresql/data"
},
{
project_path = "/files/postgresql-backups"
mount_path = "/mnt"
}
]

ports = [
{
container_port = 5432
public_port = 5432
protocol = "tcp"
}
]
}
}

volumes = {
postgresql_data = {}
}
}

Nachdem du die Ressource erstellt hast, kannst du von innerhalb deiner Hostingumgebung über die URL postgresql://postgresql:5432 auf die PostgreSQL-Datenbank zugreifen.

Verwendung der mStudio-Benutzeroberfläche

Alternativ kannst du einen PostgreSQL-Container manuell einrichten:

  1. Gehe in deinem Projekt in mStudio auf den Container-Menüpunkt und erstelle einen neuen Container. Du kannst einen beliebigen Namen wählen.

  2. Gib das Image postgres:17 ein. Du kannst den Entrypoint und das Command wie vorgeschlagen beibehalten.

Volumes

Um die Daten deiner PostgreSQL-Datenbank persistent zu speichern, definiere Volumes unter Volumes wie folgt:

  • Neues Volume erstellen, auf Pfad im Container (Mount Point): /var/lib/postgresql/data (Speichert die Nutzdaten der Datenbank)
  • Pfad im Projekt /files/postgresql-backups, auf Pfad im Container (Mount Point):** /mnt (Dieser Pfad dient dazu, Datenbank-Dumps oder Backups zu speichern)

Umgebungsvariablen

Setze die folgenden Umgebungsvariablen für den Container:

POSTGRES_PASSWORD=mypassword
POSTGRES_USER=myuser # optional; Standardwert ist "postgres"
POSTGRES_DB=mydatabase # optional; Standardwert ist "postgres"

Ports

Übernehme den vorgeschlagenen Standardport 5432.

Verwendung der CLI mit mw container run

Du kannst auch einen PostgreSQL-Container mit der mittwald CLI und dem Befehl mw container run bereitstellen:

mw container run \
--name postgresql \
--env POSTGRES_DB=mydatabase \
--env POSTGRES_USER=myuser \
--env POSTGRES_PASSWORD=mypassword \
--volume postgresql-data:/var/lib/postgresql/data \
--volume /files/postgresql-backups:/mnt \
--publish 5432:5432/tcp \
--create-volumes \
postgres:17

Dieser Befehl erstellt einen neuen Container namens "postgresql" mit dem PostgreSQL-Image, setzt alle notwendigen Umgebungsvariablen und mountet Volumes für die persistente Datenspeicherung.

Verwendung der CLI mit mw stack deploy

Wenn du Docker Compose bevorzugst, kannst du eine docker-compose.yml-Datei erstellen und sie mit dem Befehl mw stack deploy bereitstellen:

  1. Erstelle eine docker-compose.yml-Datei mit folgendem Inhalt:

    version: "3"
    services:
    postgresql:
    image: postgres:17
    environment:
    - POSTGRES_DB=mydatabase
    - POSTGRES_USER=myuser
    - POSTGRES_PASSWORD=mypassword
    ports:
    - "5432:5432"
    volumes:
    - postgresql_data:/var/lib/postgresql/data
    - /files/postgresql-backups:/mnt
    volumes:
    postgresql_data:
  2. Stelle den Stack mit der CLI bereit:

    mw stack deploy

Dieser Ansatz ist besonders nützlich, wenn du mehrere Container deployen möchtest, die zusammenarbeiten.

Zugriff auf deinen Container innerhalb deiner Hosting-Umgebung

Sobald der Container läuft, kannst du überprüfen, ob die PostgreSQL-Instanz verfügbar ist. Es gibt zwei Hauptmöglichkeiten:

Option 1: Direkter Zugriff über Container-Shell

mw container ssh postgresql
psql -U myuser -d mydatabase

Option 2: Port-Weiterleitung für lokalen Zugriff

mw container port-forward postgresql 5432:5432

In einem separaten Terminal kannst du dann lokal eine Verbindung herstellen:

psql -h localhost -p 5432 -U myuser -d mydatabase

Bei beiden Optionen solltest du zur PostgreSQL-Eingabeaufforderung weitergeleitet werden, wo du SQL-Befehle ausführen kannst.

Betrieb

Deine PostgreSQL-Daten werden im Rahmen des regelmäßigen Projektbackups gesichert. Für Datenbanken wird jedoch dringend empfohlen, zusätzlich eigene Dumps zu erstellen, um Konsistenz und Wiederherstellbarkeit sicherzustellen.

Ein Dump kann direkt im Container erstellt werden. Beispielbefehl für ein manuelles Backup:

mw container exec postgresql "pg_dump -U myuser mydatabase -f /mnt/mydatabase.sql"

Die Backup-Datei wird dann im Projekt unter /files/postgresql-backups/ verfügbar sein.

Automatisierungen sind über Cronjobs problemlos möglich.