Dia 1 — OpenCloud, proxy i web del projecte

OpenCloud en Docker Compose, Nginx amb TLS en loopback, Fail2ban, subdomini cloud i la landing Astro KM0 publicada com a segon backend.

Introducció

El dia 1 converteix la base Debian en una plataforma completa: OpenCloud sobre Docker Compose amb overlays oficials, Nginx que finalitza TLS i encamina només al loopback, polítiques de firewall coherents i la landing Astro del projecte publicada com a segon backend darrere del mateix frontal.

També s'introdueixen millores posteriors al primer tall — Fail2ban i el subdomini dedicat del cloud — perquè formen part del relat operatiu real del desplegament.

OpenCloud

Core sense Collabora/WOPI

El mode triat arrenca OpenCloud com a servei únic des de la composició oficial (opencloud-eu/opencloud-compose), amb una imatge rodant etiquetada (opencloud-rolling amb tag fixat en desplegament) per poder actualitzar de forma deliberada (docker compose pull + finestra de manteniment).

  • Overlay external-proxy: adapta variables com PROXY_HTTP_ADDR per escoltar dins del contenidor i publicar el port HTTP del proxy només com a 127.0.0.1:<port> a l'host.
  • COMPOSE_PROJECT_NAME=opencloud: ancora els noms de volum Docker sense dependre del cwd.
  • Fitxer .env: font única de variables de desplegament; permisos estrictes en disc i fora del control de versions.
  • COMPOSE_FILE: llista els overlays necessaris (base més overlay de proxy extern).

Dins del contenidor coexisteixen microserveis que conversen per gRPC/HTTP en localhost intern; aquest rang no s'exposa directament a l'host excepte pels endpoints previstos pel chart upstream.

Arquitectura

OpenCloud darrere del proxy

Browser
   │  HTTPS :443
   ▼
Nginx (Debian, site dedicat OpenCloud)
   │  HTTP http://127.0.0.1:9200  (només loopback)
   ▼
Contenidor OpenCloud (UID/GID fix)
   │  microserveis interns ~9140–9300
   ▼
Volums Docker:
   • opencloud-data   → fitxers, índexs, NATS, IDM...
   • opencloud-config → opencloud.yaml, CSP, polítiques...

PROXY_TLS=false indica que la finalització TLS passa fora del contenidor (a Nginx). OpenCloud genera URLs coherents quan rep capçaleres X-Forwarded-* correctes.

Ports

Mapa de superfície exposada

  • 22 (sshd): administració SSH — Internet segons política.
  • 80/443 (Nginx): HTTP/S públic — redirecció ACME i virtual hosts KM0 + OpenCloud.
  • 9200 (Docker → OpenCloud): només 127.0.0.1 — backend HTTP que ve Nginx.
  • 9140–9300: microserveis interns del contenidor — no publicats a l'host.
UFW reforça la política permetent des d'Internet només el necessari. Si no l'ha de conèixer el navegador extern, no escolta a totes les interfícies.

Nginx

Directives clau cap a OpenCloud

  • proxy_buffering off: SSE per a actualitzacions en temps real del client web.
  • proxy_request_buffering off: pujades resumibles TUS sense emmagatzemar tot el cos en buffer.
  • proxy_pass http://127.0.0.1:9200: TLS ja resolt a la vora.
  • X-Forwarded-Proto $scheme: redireccions i cookies coherents per a HTTPS.
  • Upgrade/Connection passthrough: WebSockets per a la UI interactiva.
  • Timeouts 3600s i client_max_body_size 10G: sessions llargues i fitxers grans.

Desplegament

Arbre a /opt/opencloud

/opt/opencloud/
├── opencloud-compose/     # clon upstream + overlays
│   ├── docker-compose.yml
│   ├── external-proxy/opencloud.yml
│   └── .env                 # actiu — fora de git, chmod 600
├── nginx/                   # plantilles TLS + proxy
├── scripts/backup-volumes.sh
└── docs/runbook.md

Els snippets al repo serveixen com a referència; els fitxers actius sota /etc/nginx/sites-available/ s'han de revisar sempre amb nginx -t abans de systemctl reload nginx.

Dades

Volums Docker i persistència

OpenCloud centralitza la persistència en dos volums nomenats. El contingut rellevant inclou:

  • idm/ i idp/: directori LDAP intern i estat del proveïdor OIDC.
  • nats/: bus d'esdeveniments JetStream entre microserveis.
  • search/: índex full-text (Bleve).
  • storage/: metadades CS3 i nodes del driver decomposed.
  • web/: actius estàtics del frontal integrat.

Xifrat en repòs: blobs ordinaris dins del volum; opcions d'enduriment inclouen LUKS, SSE en backend objecte o xifrat E2E als clients. Xifrat en trànsit: TLS client↔Nginx.

Web KM0

Flux HTTPS del lloc corporatiu

Internet :443 ─► Nginx host (TLS, km0digital.com)
                     └──► http://127.0.0.1:9180  (km0-web — només loopback)
                            Astro estàtic + nginx Alpine
  • Stack: Astro 5 + Tailwind 3, sortida estàtica.
  • i18n: JSON a src/i18n/ + rutes /ca/, /en/, /de/; castellà per defecte a l'arrel.
  • Build: Node 22 Alpine multi-stage; repo a /opt/km0-web.
  • SEO: @astrojs/sitemap amb alternatives hreflang.

Perímetre

Fail2ban i subdomini del cloud

Després del primer tall estable es va afegir Fail2ban com a xarxa complementària al firewall. El cloud va quedar publicat a cloud.km0digital.com, separat de la marca de màrqueting a km0digital.com:

  • Certificats i polítiques CSP poden divergir.
  • Els usuaris entenen quina URL fer servir per a treball vs comunicació.
  • Els equips poden delegar DNS/TLS sense barrejar configuracions de l'Astro estàtic.

Operació

Ordres rutinàries

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

Laboratori vs producció

Fases del desplegament

  • TLS provisional: certificat autofirmat útil per validar el proxy — alertes al navegador fins a Let's Encrypt amb DNS estable.
  • Domini: passar d'IP en brut a FQDN millora enllaços interns i cookies.
  • INSECURE relaxat: només coherent mentre els certificats interns no formen una PKI de confiança.
  • Còpies de seguretat: script manual fins a cron supervisat; vigilar certbot.timer en producció.

Següent pas

Dia 2

El dia 2 madura l'autenticació OIDC amb Dex, actualitza OpenCloud 7.x i estableix la primera còpia integral. Mentrestant, explora els serveis o el relat del dia 2.