Tag 1 — OpenCloud, Proxy und Projekt-Website

OpenCloud in Docker Compose, Nginx mit TLS auf Loopback, Fail2ban, Cloud-Subdomain und die Astro-KM0-Landing als zweites Backend.

Einleitung

Tag 1 verwandelt die Debian-Basis in eine vollständige Plattform: OpenCloud auf Docker Compose mit offiziellen Overlays, Nginx mit TLS-Terminierung und Weiterleitung nur zum Loopback, konsistente Firewall-Richtlinien und die Astro-Landing des Projekts als zweites Backend hinter demselben Front.

Außerdem werden Verbesserungen nach dem ersten Schnitt eingeführt — Fail2ban und die dedizierte Cloud-Subdomain —, weil sie Teil der realen Betriebsgeschichte des Deployments sind.

OpenCloud

Core ohne Collabora/WOPI

Der gewählte Modus startet OpenCloud als Einzeldienst aus der offiziellen Composition (opencloud-eu/opencloud-compose), mit einem Rolling-Image (opencloud-rolling, Tag im Deployment fixiert), um gezielt aktualisieren zu können (docker compose pull + Wartungsfenster).

  • Overlay external-proxy: passt Variablen wie PROXY_HTTP_ADDR an, damit innerhalb des Containers gehört wird und der HTTP-Proxy-Port nur als 127.0.0.1:<port> auf dem Host veröffentlicht wird.
  • COMPOSE_PROJECT_NAME=opencloud: verankert Docker-Volume-Namen unabhängig vom cwd.
  • .env-Datei: einzige Quelle für Deployment-Variablen; strenge Dateirechte und außerhalb der Versionskontrolle.
  • COMPOSE_FILE: listet die nötigen Overlays (Basis plus External-Proxy-Overlay).

Im Container koexistieren Microservices, die intern per gRPC/HTTP auf localhost kommunizieren; dieser Bereich wird nicht direkt auf den Host exponiert, außer über die vom Upstream-Chart vorgesehenen Endpoints.

Architektur

OpenCloud hinter dem Proxy

Browser
   │  HTTPS :443
   ▼
Nginx (Debian, dedizierte OpenCloud-Site)
   │  HTTP http://127.0.0.1:9200  (nur Loopback)
   ▼
OpenCloud-Container (feste UID/GID)
   │  interne Microservices ~9140–9300
   ▼
Docker-Volumes:
   • opencloud-data   → Dateien, Indizes, NATS, IDM...
   • opencloud-config → opencloud.yaml, CSP, Richtlinien...

PROXY_TLS=false bedeutet, dass die TLS-Terminierung außerhalb des Containers (in Nginx) erfolgt. OpenCloud erzeugt konsistente URLs, wenn korrekte X-Forwarded-*-Header ankommen.

Ports

Karte der exponierten Oberfläche

  • 22 (sshd): SSH-Administration — Internet je nach Richtlinie.
  • 80/443 (Nginx): öffentliches HTTP/S — ACME-Weiterleitung und Virtual Hosts KM0 + OpenCloud.
  • 9200 (Docker → OpenCloud): nur 127.0.0.1 — HTTP-Backend für Nginx.
  • 9140–9300: interne Microservices im Container — nicht auf dem Host veröffentlicht.
UFW verstärkt die Richtlinie und erlaubt aus dem Internet nur das Nötige. Was der externe Browser nicht kennen soll, lauscht nicht auf allen Interfaces.

Nginx

Wichtige Direktiven zu OpenCloud

  • proxy_buffering off: SSE für Echtzeit-Updates im Web-Client.
  • proxy_request_buffering off: wiederaufnehmbare TUS-Uploads ohne vollständiges Body-Buffering.
  • proxy_pass http://127.0.0.1:9200: TLS bereits am Rand gelöst.
  • X-Forwarded-Proto $scheme: konsistente Redirects und Cookies für HTTPS.
  • Upgrade/Connection passthrough: WebSockets für die interaktive UI.
  • Timeouts 3600s und client_max_body_size 10G: lange Sitzungen und große Dateien.

Deployment

Baum unter /opt/opencloud

/opt/opencloud/
├── opencloud-compose/     # Upstream-Klon + Overlays
│   ├── docker-compose.yml
│   ├── external-proxy/opencloud.yml
│   └── .env                 # aktiv — außerhalb von Git, chmod 600
├── nginx/                   # TLS- + Proxy-Vorlagen
├── scripts/backup-volumes.sh
└── docs/runbook.md

Snippets im Repo dienen als Referenz; aktive Dateien unter /etc/nginx/sites-available/ immer mit nginx -t prüfen, bevor systemctl reload nginx ausgeführt wird.

Daten

Docker-Volumes und Persistenz

OpenCloud bündelt Persistenz in zwei benannten Volumes. Relevanter Inhalt umfasst:

  • idm/ und idp/: internes LDAP-Verzeichnis und OIDC-Provider-Status.
  • nats/: JetStream-Event-Bus zwischen Microservices.
  • search/: Volltextindex (Bleve).
  • storage/: CS3-Metadaten und Knoten des decomposed Drivers.
  • web/: statische Assets des integrierten Frontends.

Verschlüsselung at rest: gewöhnliche Blobs im Volume; Härtungsoptionen sind LUKS, SSE im Objekt-Backend oder E2E-Verschlüsselung in Clients. Verschlüsselung in transit: TLS Client↔Nginx.

KM0-Web

HTTPS-Flow der Unternehmenswebsite

Internet :443 ─► Nginx Host (TLS, km0digital.com)
                     └──► http://127.0.0.1:9180  (km0-web — nur Loopback)
                            statisches Astro + nginx Alpine
  • Stack: Astro 5 + Tailwind 3, statische Ausgabe.
  • i18n: JSON in src/i18n/ + Routen /ca/, /en/, /de/; Spanisch standardmäßig in der Wurzel.
  • Build: Node 22 Alpine Multi-Stage; Repo unter /opt/km0-web.
  • SEO: @astrojs/sitemap mit hreflang-Alternativen.

Perimeter

Fail2ban und Cloud-Subdomain

Nach dem ersten stabilen Schnitt wurde Fail2ban als Ergänzung zur Firewall ergänzt. Die Cloud wurde unter cloud.km0digital.com veröffentlicht, getrennt von der Marketing-Marke unter km0digital.com:

  • Zertifikate und CSP-Richtlinien können abweichen.
  • Nutzer verstehen, welche URL für Arbeit vs. Kommunikation gilt.
  • Teams können DNS/TLS delegieren, ohne die statische Astro-Konfiguration zu vermischen.

Betrieb

Routinemäßige Befehle

cd /opt/opencloud/opencloud-compose
docker compose ps
docker compose logs -f opencloud
docker compose pull && docker compose up -d
git -C /opt/opencloud/opencloud-compose pull

ss -tulpn | grep -E ‘:22|:80|:443|:9200’ ufw status verbose bash /opt/opencloud/scripts/backup-volumes.sh

Labor vs. Produktion

Phasen des Deployments

  • Vorläufiges TLS: selbstsigniertes Zertifikat zum Validieren des Proxys — Browser-Warnungen bis Let's Encrypt mit stabilem DNS.
  • Domain: Wechsel von roher IP zu FQDN verbessert interne Links und Cookies.
  • INSECURE gelockert: nur sinnvoll, solange interne Zertifikate keine vertrauenswürdige PKI bilden.
  • Backups: manuelles Skript bis überwachter Cron; certbot.timer in Produktion im Blick behalten.

Nächster Schritt

Tag 2

Tag 2 reift OIDC-Authentifizierung mit Dex, aktualisiert OpenCloud 7.x und legt das erste vollständige Backup an. In der Zwischenzeit: die Services erkunden oder den Bericht zu Tag 2 lesen.