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_ADDRper escoltar dins del contenidor i publicar el port HTTP del proxy només com a127.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.
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/sitemapamb 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 pullss -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.timeren 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.