Architektur-Brief · Stand 2026-08-10

openDesk —
auf einem einzigen Server.

Diese Seite erklärt, wie eine vollständige digitale Arbeitsplatz-Suite (openDesk) auf einem einzelnen Server betrieben wird. Kein Cluster aus vielen Maschinen — ein Node trägt alles: Portal, Mail, Dateien, Office, Chat, Video, Projekte und Monitoring.

1
Server
12 Cores
CPU
47 GiB
RAM
74
Dienste (Pods)
22
Web-Adressen
32
Daten-Volumes

Die Idee

openDesk bündelt die wichtigsten Arbeitswerkzeuge in einer Suite. Üblicherweise läuft sie auf mehreren Servern. Dieser Aufbau zeigt: Ein einzelner Server kann die Suite vollständig betreiben.

Größe Ein Server

Ein Contabo-VPS mit 12 Cores, 47 GiB RAM und 415 GiB Disk trägt die gesamte Suite. Keine getrennten Maschinen für Datenbank, Storage oder Monitoring — alles läuft auf einem Node.

Plattform Kubernetes (k0s)

k0s ist eine schlanke Kubernetes-Distribution. Sie bringt alle Kubernetes-Fähigkeiten auf einen einzigen Server: Deployments, Services, Ingress, TLS und Rolling Updates.

Reproduzierbar Alles als Code

Jede Komponente ist als Helm-Release oder Manifest beschrieben. Der gesamte Aufbau ist dokumentiert und per Skript reproduzierbar — ein Neubau des Systems ist jederzeit möglich.

Architektur

Kubernetes bringt normalerweise mehrere Maschinen mit. k0s kann auch mit genau einer: Der Server ist gleichzeitig Steuerung (Control-Plane) und Arbeitsrechner (Worker) für alle Dienste.

Server Ein Node

  • StandortContabo VPS
  • SystemUbuntu 26.04 LTS
  • Kubernetesv1.36.2+k0s
  • Containercontainerd 2.3.2
  • Cluster-Statekine (SQLite) (Datei)

Eingang Ein Tor nach außen

Der Ingress-Controller (HAProxy) nimmt allen Web-Verkehr entgegen. Er leitet jede Adresse an den richtigen Dienst. Zertifikate stellt Let's Encrypt automatisch aus — HTTPS ist überall Standard.

  • Ports80 + 443
  • TLSLet's Encrypt, automatisch
  • Maileigener Postfix (Port 25)

Verzeichnis 102 Pods

Alle Dienste laufen als Container (Pods). Die meisten gehören zur openDesk-Suite, der Rest zur Infrastruktur:

  • openDesk74 Pods
  • Storage10 Pods
  • Monitoring9 Pods
  • Infrastruktur8 Pods
# Datenfluss — ein BeispielBrowser → https://files.od.ap14.de → HAProxy-Ingress (80/443, TLS via Let’s Encrypt) → Service "nextcloud" → Pod (Nextcloud) → Volume auf der lokalen Disk (openebs-local)

Die Dienste

openDesk vereint die Arbeitswerkzeuge unter einer gemeinsamen Identität. Ein Login (Keycloak/SSO) gilt für alle Dienste.

AdresseDienst
portal.od.ap14.dePortal (Startseite)
webmail.od.ap14.deWebmail (OX App Suite)
files.od.ap14.deDateien (Nextcloud)
dav.od.ap14.deWebDAV
office.od.ap14.deOffice (Collabora Online)
pad.od.ap14.deEtherpad (Cryptpad)
notes.od.ap14.deNotizen (Impress)
chat.od.ap14.deChat (Matrix/Synapse)
meet.od.ap14.deVideo (Jitsi Meet)
wiki.od.ap14.deWiki (XWiki)
projects.od.ap14.deProjekte (OpenProject)
objectstorage.od.ap14.deS3-Objektspeicher (SeaweedFS)
id.od.ap14.deIdentität (Keycloak/SSO)
matrix-federation.od.ap14.deMatrix-Föderation
adminbot.od.ap14.deAdmin-Bot
ics.od.ap14.deKalender (ICS)

Suite openDesk v1.17.2

Entwickelt von ZenDiS. Bündelt Groupware, Dateien, Office, Chat, Video, Projekte, Wiki und Notizen in einer Plattform.

Identität Zentrale Anmeldung

Keycloak stellt die zentrale Anmeldung (SSO). Verzeichnis-Dienste (LDAP/UDM) liefern die Benutzerkonten und Gruppen.

Daten Lokal gespeichert

Dateien, Mail und Datenbanken liegen auf der lokalen Disk des Servers. Kein externer Cloud-Anbieter — die Daten bleiben im System.

Konfiguration

Der Aufbau ist vollständig als Code dokumentiert. Alle Änderungen landen zuerst im Repo, dann im Cluster. Dieses Kapitel zeigt die drei Ebenen: System-Bootstrap, k0s-Controller-Config und openDesk-Overrides.

1 · System-Bootstrap

Schritt 0 k0s-Installer

Der offizielle Installer lädt k0s auf den Node. Danach installiert k0s install controller --single den Controller als Systemd-Dienst (aktiviert, startet automatisch).

Schritt 1 Firewall

Die Firewall erlaubt nur die nötigen Ports: SSH, HTTP, HTTPS und die Kubernetes-API. Alles andere ist standardmäßig gesperrt.

Schritt 2 Storage & Netz

Das Verzeichnis für lokale Volumes (/var/openebs/localpv) wird angelegt. Ein Tailscale-Exit-Node stellt den Netzzugang für Dienste außerhalb des Clusters bereit.

Schritt 3 Helm-Services

Die Basis-Dienste kommen per Helm: Ingress-Controller, cert-manager, OpenEBS (Storage) und das Monitoring. Ein idempotentes Skript bringt alle Releases in den dokumentierten Zustand.

2 · k0s-Controller-Config

Die Live-Config weicht an zwei Stellen vom k0s-Default ab. Beide sind im Repo dokumentiert (opendesk/k0s-controller.yaml).

kine Cluster-State in SQLite

Der Cluster-State liegt in einer SQLite-Datei (kine) statt in etcd. Das spart Ressourcen auf dem Single-Node. Wichtig: Ein generierter k0s-Default setzt etcd — das würde den State „verlieren". Die Config behält storage: kine.

NodePort Erweiterter Bereich

Der NodePort-Bereich ist auf 25-32767 erweitert. Grund: Postfix soll den Standard-SMTP-Port 25 direkt nutzen können. Der Ingress (80/443) läuft über hostNetwork und ist davon unberührt.

3 · openDesk-Overrides

openDesk wird per helmfile deployed. Die Abweichungen vom Standard liegen in opendesk/env/values.yaml.gotmpl (ohne Secrets):

# Cluster-Anpassungencluster.service.type: NodePort # kein LoadBalancer im k0s-Clustercluster.container.engine: containerd # statt cri-ocluster.networking.ipFamilies: IPv4 # Single-Node, IPv4-onlyglobal.domain: od.ap14.decertificate.issuerRef.name: letsencrypt-prodapps.notes.enabled: true # Notes (Impress) aktiviert # Ressourcen-Overrides (Requests/Limits, Auswahl)resources.umsUdmRestApi: limits 2Gi (Default 1Gi reichte nicht)resources.xwiki: requests 2Gi / limits 4Giresources.openproject: requests 1536Miresources.seaweedfs: requests 1 CPU / limits 3 CPUresources.openxchangeCoreMW: requests 250m CPU # Healthcheck-Probes: Perioden auf 30s angehoben (Load-Reduktion)customization.release.postfixOx → postfix-ox-ports.yaml.gotmpl # SMTP NodePort 25customization.release.postfix / mariadb / oxconnector / xwiki / openproject / openxchange / keycloak / ums / redis / postgresql / nextcloud → probes-*.yaml.gotmpl # liveness/readiness/startup 30s

Ein helmfile apply bringt alle ~35 Releases in diesen Zustand. Der Lauf dauert 15–25 Minuten — jeder Release einzeln aktualisiert, Wiederholungen setzen fort.

Betrieb & Überwachung

Ein einzelner Server ist einfach zu betreiben — vorausgesetzt, man sieht, was passiert. Deshalb gehört ein vollständiges Monitoring dazu.

Metriken Prometheus + Grafana

Prometheus sammelt Metriken aller Dienste. Grafana zeigt sie in Dashboards: Auslastung, Fehlerraten, Latenzen.

  • Retention60 Tage
  • Dashboards32

Logs Loki

Alle Dienst-Logs laufen zentral in Loki. Fehler lassen sich über die Zeit verfolgen — auch pro Web-Adresse (Route).

Speicher Volumes im Blick

Ein CronJob misst die echte Belegung jedes Volumes. Das Dashboard zeigt den Füllstand in Prozent plus IOPS und Bandbreite der Disk — Engpässe sind früh sichtbar.

# Speicher im Überblick (gemessen)Disk: 415 GiB gesamt · 74 GiB belegt (18 %) · 342 GiB freiVolumes: 32 (Standard 1 GiB; groß: 5–20 GiB)

Wartung Reproduzierbar

Updates laufen über Skripte aus dem Repo. Der Ablauf ist dokumentiert und jederzeit wiederholbar. Bei Last-Problemen gilt: System-Update + Neustart zuerst — meist behebt das die Ursache.

Einschränkungen Faktisch

Ein Node ist kein Hochverfügbarkeits-Cluster. Ausfallzeiten bei Wartung sind eingeplant. Volumes lassen sich nicht im laufenden Betrieb vergrößern — die Kapazitätsplanung zählt.