Saltar a contenido

Collabora Online

Servidor de edición colaborativa de documentos (Office) integrado con Nextcloud vía WOPI. https://office.matias7235.com.ar

Reemplaza al CODE built-in que venía con la app de Nextcloud (corría adentro del proceso PHP y se tildaba). Ahora corre como container standalone y se comunica con Nextcloud vía protocolo WOPI a través de los FQDN públicos.

📁 Rutas y configs

Qué Dónde
Compose /opt/docker/collabora/docker-compose.yml
Variables de entorno /opt/docker/collabora/.env
Config interna del container /etc/coolwsd/coolwsd.xml (NO montar como bind mount, ver Trampas)

Contenedor: collabora Puerto: 9980 (bindeado a 127.0.0.1, accesible solo desde el host vía Caddy)

🌐 Arquitectura del flujo WOPI

                    ┌─────────────────┐
Browser ────────────│    Caddy:443    │────────────► office.matias7235.com.ar
                    └────────┬────────┘                    (iframe del editor)
                             │ HTTP plano
                    ┌────────▼────────┐
                    │  collabora:9980 │
                    └────────┬────────┘
                             │ Server-to-server (WOPI callback)
                    ┌────────▼─────────────────┐
                    │ nextcloud.matias7235...  │ (descarga/guarda archivos)
                    └──────────────────────────┘

Importante: Collabora y Nextcloud NO se hablan por red Docker interna, se hablan por FQDN público. Por eso Collabora no necesita estar en nextcloud-network.

🛠️ Comandos útiles

# Ver logs
docker logs -f collabora

# Reiniciar
docker restart collabora

# Recrear (necesario si se cambió env vars)
cd /opt/docker/collabora && docker compose up -d

# Verificar env vars activas
docker exec collabora env | grep -iE 'ssl|domain|extra'

# Test de salud (desde el host)
curl http://localhost:9980/hosting/discovery
# Debe devolver XML largo con MIME types soportados

# Test desde afuera (vía Caddy)
curl https://office.matias7235.com.ar/hosting/discovery

🔑 Configuración clave

Variables de entorno (.env):

# Regex de qué Nextcloud puede pedirle documentos a Collabora
# Puntos escapados con UNA sola barra (en .env no hay doble escape)
NEXTCLOUD_DOMAIN_REGEX=nextcloud\.matias7235\.com\.ar

# Credenciales del panel admin de Collabora
COLLABORA_ADMIN_USER=admin
COLLABORA_ADMIN_PASSWORD=<generada>

Parámetros críticos del compose:

Parámetro Valor Por qué
ports 127.0.0.1:9980:9980 Solo localhost, Caddy lo alcanza desde el host
domain regex del FQDN de Nextcloud Allow-list WOPI: quién puede pedir documentos
extra_params --o:ssl.enable=false --o:ssl.termination=true TLS lo termina Caddy, Collabora habla HTTP plano
cap_add: MKNOD (sí) Necesario para el sandboxing interno del kit

⚙️ Tareas comunes

Conectar Collabora a Nextcloud (primera vez):

  1. En Nextcloud: Apps → desactivar "Collabora Online - Built-in CODE Server"
  2. Apps → activar "Nextcloud Office" si no está
  3. Settings (admin) → Office → "Use your own server" → https://office.matias7235.com.ar → Save
  4. Esperar el tilde verde "Collabora Online server is reachable"

Configurar la WOPI allow-list (importante para seguridad):

Sin esto, cualquier IP con un token válido puede descargar archivos. Collabora le pega a Nextcloud desde la red Docker, así que hay que permitir ese rango.

docker exec -u www-data nextcloud-app php occ \
  config:app:set richdocuments wopi_allowlist \
  --value="127.0.0.1,172.16.0.0/12"

Verificar:

docker exec -u www-data nextcloud-app php occ \
  config:app:get richdocuments wopi_allowlist

Verificar qué IP usa Collabora para llamar a Nextcloud:

docker logs nextcloud-app --tail 200 2>&1 | grep wopi | awk '{print $1}' | sort -u

Acceder al panel admin de Collabora:

URL: https://office.matias7235.com.ar/browser/dist/admin/admin.html

Muestra sesiones activas, kits forkeados, uso de memoria, documentos abiertos en tiempo real. User/pass del .env.

Verificar que Nextcloud está usando el Collabora externo (no el built-in):

docker exec -u www-data nextcloud-app php occ config:app:get richdocuments wopi_url
# Debe devolver: https://office.matias7235.com.ar

O abrir un .docx en Nextcloud, F12 → Network → filtrar por WS → la conexión debe ir a wss://office.matias7235.com.ar/cool/...

🔥 Problemas comunes

Problema Causa Solución
File not found: /etc/coolwsd/coolwsd.xml Bind mount vacío sobre /etc/coolwsd/ oculta el XML que trae la imagen NO montar /etc/coolwsd/ como bind mount. Las env vars alcanzan
curl: (52) Empty reply from server desde localhost:9980 Collabora intenta hablar HTTPS con cert self-signed pero Caddy le manda HTTP Asegurar extra_params=--o:ssl.enable=false --o:ssl.termination=true y recrear container (no restart)
502 Bad Gateway desde la URL pública Collabora no escucha en localhost:9980 o config TLS rota curl http://localhost:9980/hosting/discovery desde el host. Si falla local → es Collabora
"WOPI host not allowed" al abrir documento Regex del domain mal escrita o no matchea el FQDN real de Nextcloud Verificar con docker exec collabora env | grep domain. Tiene que tener UNA barra por punto: nextcloud\.matias7235\.com\.ar
Documento abre iframe en blanco con URL collabora:9980 (OpenCloud) El WOPI bridge de OpenCloud necesita alcanzar Collabora por FQDN público. Usar extra_hosts en el servicio collaboration para que resuelva office.matias7235.com.ar → 172.21.0.1 (gateway Docker → host → Caddy → Collabora). COLLABORATION_APP_ADDR debe ser la URL externa.
Cambios en .env no surten efecto docker compose restart NO aplica env vars nuevas Usar docker compose up -d (recrea el container)
Banner amarillo "WOPI allow-list not configured" en Nextcloud Falta setear wopi_allowlist en richdocuments Ver "Tareas comunes" arriba

📝 Trampas conceptuales aprendidas

  • Bind mount vs named volume: un bind mount sobre un directorio oculta el contenido original de la imagen. Solo los named volumes copian el contenido la primera vez. Por eso montar /etc/coolwsd/ con carpeta vacía rompe todo.
  • El domain de Collabora apunta a Nextcloud, no a Collabora. Es la allow-list de "quién puede pedirme documentos", no "quién soy yo".
  • WOPI es browser-mediated: el navegador es el puente entre Nextcloud y Collabora vía iframe. Por eso ambos necesitan FQDN público y no alcanza con red Docker compartida.
  • Escape de regex en Docker Compose: en .env usar UNA barra (\.). En el compose YAML con comillas dobles, DOS barras (\\.). Para evitar el quilombo, mantener todo en .env.
  • docker compose restart no aplica env vars nuevas. Hay que docker compose up -d para que recree el container.