
Docker Compose auf dem VPS: Webserver, Datenbank & Reverse Proxy richtig betreiben
Praxisnaher Guide für Docker Compose auf dem VPS: Webserver, Datenbank, Reverse Proxy, TLS, Backups, Updates und Sicherheit richtig planen und betreiben.
K3s wurde ursprünglich von Rancher Labs entwickelt und wird heute von der Cloud Native Computing Foundation (CNCF) als Sandbox-Projekt gepflegt. Es bündelt alle Kubernetes-Komponenten in einer einzigen, statisch kompilierten Binary unter 100 MB. Dadurch entfällt die komplexe Installation einzelner Komponenten wie etcd, kubelet, kube-proxy oder Container Runtime.
Die wichtigsten Unterschiede zu klassischem Kubernetes sind die SQLite- oder embedded etcd-Datenbank statt eines separaten etcd-Clusters, ein schlanker Traefik-Ingress-Controller und ein lokaler Speicheranbieter. K3s nutzt containerd als Runtime und ersetzt mehrere Agenten durch eine einzige, effiziente Binary.
Für VPS-Umgebungen ist K3s besonders attraktiv, weil es bereits mit 512 MB RAM lauffähig ist und nur etwa 300 MB Festplattenplatz benötigt. Das macht es zur idealen Wahl, wenn du auf einem günstigen VPS dennoch Container-Orchestrierung einsetzen möchtest, ohne auf eine Managed-Plattform angewiesen zu sein.
| Eigenschaft | K3s | Klassisches Kubernetes |
|---|---|---|
| Binary-Größe | < 100 MB | > 1 GB |
| Min. RAM | 512 MB | 2 GB+ |
| Default Storage | Local Path Provisioner | Keiner (extern nötig) |
| Default Ingress | Traefik | Keiner (extern nötig) |
| Default LB | ServiceLB (Klipper) | MetalLB / Cloud-LB |
Bevor du K3s installierst, solltest du sicherstellen, dass dein VPS die Mindestanforderungen erfüllt. Für eine produktive Single-Node-Installation empfehlen wir mindestens 2 vCPU, 2 GB RAM und 20 GB SSD-Speicher. Für Multi-Node-Cluster oder produktive Workloads mit Datenbanken sind 4 GB RAM und mehr empfehlenswert.
Als Betriebssystem eignen sich Ubuntu 22.04 / 24.04 LTS, Debian 12, Rocky Linux 9 oder AlmaLinux 9. K3s unterstützt offiziell alle gängigen Linux-Distributionen mit systemd. Bei hostazar.com kannst du aus zahlreichen OS-Images direkt wählen und in Sekunden provisionieren.
Wichtig ist außerdem eine öffentliche IPv4-Adresse und idealerweise eine reservierte IPv6-Adresse. Die Firewall sollte die Ports 6443 (API), 10250 (kubelet) und 443 (Ingress) freigeben. Dein Domain-DNS sollte per A-Record auf die Server-IP zeigen, falls du externe Services anbieten möchtest.
| Szenario | vCPU | RAM | SSD | Empfehlung hostazar.com |
|---|---|---|---|---|
| Dev / Test | 2 | 2 GB | 20 GB | VPS S |
| Single-Node Produktion | 2 | 4 GB | 40 GB | VPS M |
| Multi-Node Cluster | 4 | 8 GB | 80 GB | VPS L |
| HA Production (3+ Nodes) | 8 | 16 GB | 160 GB | VPS XL |
Die Installation von K3s ist bewusst einfach gehalten und besteht im Wesentlichen aus einem einzigen curl-Befehl. Du verbindest dich per SSH mit deinem VPS und führst das offizielle Installationsskript aus. Innerhalb von 30 bis 60 Sekunden ist der Cluster betriebsbereit.
Wir empfehlen, vor der Installation ein Update der Pakete durchzuführen und sicherzustellen, dass weder Docker noch eine ältere Container-Runtime installiert ist. K3s bringt containerd selbst mit, ein paralleler Docker-Container kann zu Port-Kollisionen führen.
Für die Installation ohne Traefik (falls du einen anderen Ingress-Controller nutzen möchtest) oder ohne ServiceLB gibst du die entsprechenden --disable-Flags mit. Möchtest du statt SQLite eine externe PostgreSQL-Datenbank nutzen, kannst du dies ebenfalls direkt beim Start konfigurieren.
curl -sfL https://get.k3s.io | sh -
sudo systemctl status k3s
sudo kubectl get nodes
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--tls-san deine-domain.de --disable traefik" sh -
curl -sfL https://get.k3s.io | K3S_URL=https://master-host:6443 K3S_TOKEN=DEIN_TOKEN sh -
Das Token findest du auf dem Master-Node unter /var/lib/rancher/k3s/server/node-token. Notiere es sicher, da es zur Anmeldung weiterer Nodes benötigt wird.
Nach der Standardinstallation läuft K3s mit dem CNI-Plugin Flannel im VXLAN-Modus. Für die meisten VPS-Szenarien ist das ausreichend. Wenn du jedoch komplexere Netzwerk-Anforderungen hast – etwa Network Policies, BGP oder Calico-spezifische Features – kannst du Calico als CNI nachinstallieren.
ServiceLB (Klipper) ist der standardmäßig aktivierte LoadBalancer und übersetzt type: LoadBalancer-Services in lokale IP-Adressen oder bindet sie an bestimmte Node-Ports. Für öffentlich erreichbare Services empfehlen wir den Traefik Ingress Controller, der automatisch mitinstalliert wird.
Die kubeconfig-Datei liegt unter /etc/rancher/k3s/k3s.yaml. Kopiere sie auf deinen lokalen Rechner und setze die KUBECONFIG-Umgebungsvariable, um von außerhalb mit kubectl arbeiten zu können. Alternativ nutzt du Tools wie Lens, k9s oder das Rancher UI.
| Port | Protokoll | Zweck |
|---|---|---|
| 6443 | TCP | Kubernetes API Server |
| 10250 | TCP | kubelet |
| 8472 | UDP | Flannel VXLAN |
| 443 | TCP | Ingress HTTPS (Traefik) |
| 80 | TCP | Ingress HTTP (Traefik) |
Sobald der Cluster läuft, kannst du deine ersten Pods, Deployments und Services ausrollen. Wir empfehlen, mit einer einfachen Nginx- oder Hello-World-Anwendung zu beginnen, um die Funktion zu verifizieren. Erst danach solltest du produktive Workloads deployen.
Mit kubectl create deployment, kubectl expose und kubectl apply hast du drei schnelle Wege, Anwendungen bereitzustellen. Für reproduzierbare Deployments empfehlen wir jedoch ausschließlich deklarative YAML-Manifeste, die du in Git versionierst.
Ein typischer Workflow sieht vor, dass du mit kubectl apply -f arbeitest, Status mit kubectl get pods,svc prüfst und Logs mit kubectl logs analysierst. Tools wie stern helfen beim parallelen Log-Streaming über mehrere Pods hinweg.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-demo
spec:
type: ClusterIP
selector:
app: nginx
ports:
- port: 80
targetPort: 80
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: traefik
tls:
- hosts:
- demo.deine-domain.de
secretName: nginx-tls
rules:
- host: demo.deine-domain.de
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-demo
port:
number: 80
Standardmäßig nutzt K3s den Local Path Provisioner, der dynamisch lokale Verzeichnisse unter /var/lib/rancher/k3s/storage anlegt. Dies ist ideal für Single-Node-Setups, in denen Pods auf dem gleichen Node wieder hochfahren. In Multi-Node-Clustern ohne Replikation kann es jedoch zu Datenverlust kommen, wenn ein Node ausfällt.
Für produktive Setups empfehlen wir eine externe Storage-Lösung. Auf einem VPS bieten sich Network Block Devices, NFS-Server, Longhorn oder ein cloudnativer CSI-Driver an. Bei hostazar.com kannst du zusätzliche Block Storage Volumes bestellen und sie via iSCSI in den Cluster einbinden.
Wichtig: Definiere in deinen Pods immer persistentVolumeClaim-Requests mit passender Storage-Class. Nutze für Datenbanken niemals den Local Path Provisioner in Multi-Node-Setups, sondern immer replizierten Storage wie Longhorn mit drei Replicas.
| Storage-Typ | Replikation | Eignung | Aufwand |
|---|---|---|---|
| Local Path | Nein | Single-Node, Caches | Niedrig |
| NFS | Abhängig vom Server | Statische Inhalte | Mittel |
| Longhorn | Ja (3 Replicas) | Produktion, Datenbanken | Mittel |
| Rook-Ceph | Ja | HA-Cluster | Hoch |
| hostazar Block Storage | Ja (RAID-10) | Produktion auf hostazar.com | Niedrig |
K3s selbst bringt kein vollständiges Monitoring-Stack mit, lässt sich aber problemlos mit gängigen Lösungen erweitern. Für kleine Setups genügt oft das kostenlose Prometheus-Operator Helm Chart, kombiniert mit Grafana und Loki. So erhältst du in unter 15 Minuten ein vollwertiges Observability-Setup.
Alternativ kannst du auf schlanke Lösungen wie VictoriaMetrics statt Prometheus setzen – das spart RAM und CPU. Für Logs empfehlen wir Promtail oder Vector als Agent, der die Daten an Loki oder direkt an ein SIEM-System sendet.
Beim Logging auf einem VPS ist die Festplattennutzung ein kritischer Faktor. Konfiguriere unbedingt Log-Rotation, setze Retention-Limits und überlege, ob du ältere Logs in einen Object Storage wie S3-kompatiblen Speicher auslagerst. Bei hostazar.com sind 100 GB S3-kompatibler Object Storage inklusive.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
kubectl create namespace monitoring
helm install kube-prom prometheus-community/kube-prometheus-stack \
-n monitoring \
--set grafana.adminPassword=DEIN_PASSWORT \
--set prometheus.prometheusSpec.retention=15d
| Metrik | Quelle | Warnschwelle |
|---|---|---|
| Node-CPU-Auslastung | node-exporter | > 80 % über 10 Min |
Node
![]() Docker Compose auf dem VPS: Webserver, Datenbank & Reverse Proxy richtig betreibenPraxisnaher Guide für Docker Compose auf dem VPS: Webserver, Datenbank, Reverse Proxy, TLS, Backups, Updates und Sicherheit richtig planen und betreiben. |