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):
- En Nextcloud: Apps → desactivar "Collabora Online - Built-in CODE Server"
- Apps → activar "Nextcloud Office" si no está
- Settings (admin) → Office → "Use your own server" →
https://office.matias7235.com.ar→ Save - 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:
Verificar qué IP usa Collabora para llamar a Nextcloud:
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
domainde 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
.envusar UNA barra (\.). En el compose YAML con comillas dobles, DOS barras (\\.). Para evitar el quilombo, mantener todo en.env. docker compose restartno aplica env vars nuevas. Hay quedocker compose up -dpara que recree el container.