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_ADDRan, damit innerhalb des Containers gehört wird und der HTTP-Proxy-Port nur als127.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.
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/sitemapmit 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 pullss -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.timerin 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.