(O de cómo tres demonios de Linux casi me hacen aventar el servidor al monte) 🖥️💥
Prólogo: La mentira más grande del norte 🌙☕
Eran como las once y media de la noche, compa. En la calle ya no pasaba ni un alma, nomás se escuchaba a lo lejos el ladrido de los perros de la colonia y el zumbido del abanico de techo peleando por su vida contra el calorón.
Cualquier cristiano con dos dedos de frente ya se hubiera cenado unos tacos, apagado las luces y a dormir como los dioses. Pero uno es terco, plebe. Uno tiene esa maldición que cargamos los que le movemos a los fierros y a los servidores: el ego informático.
Miré la pantalla y me dije a mí mismo la frase más peligrosa y embustera que ha parido la humanidad desde que se inventó el fuego:
👉 «Nomás instalo rápido el contenedor de ONLYOFFICE en Docker, lo pego a mi Nextcloud para editar archivos en la nube, veo que jale y a mimir. En cinco minutitos queda al puro tiro, viejón». 🤦♂️
¡Ándale, pues! Esos «cinco minutitos» terminaron siendo una novela de misterio, traición, balazos criptográficos y brujería digital que ni la Rosa de Guadalupe se atrevería a escribir.
Acto I: La trampa del botón azul y la casilla embustera 🖱️🤡
La tirada se veía clarita y sin baches:
- Nextcloud jalando en el servidor para guardar las carpetas de la chamba.
- Un contenedor de Docker con ONLYOFFICE Document Server para no pagarle suscripciones en dólares a Don Bill Gates.
- Su dominio bien peinado con DNS dinámico, puertos configurados y certificados listos para que viajara todo encriptado como secreto de Estado.
Entro a la interfaz web de Nextcloud, me voy derechito al menú de ONLYOFFICE Docs y veo los campos limpiecitos. Pongo la URL pública con su puerto: [https://nube.mi-rancho-digital.com:9443](https://nube.mi-rancho-digital.com:9443) 🌐.
Luego me topo con una casilla que te mira con ojos de ternura:
☑️ «Desactivar la verificación de certificados (inseguro)».
«¡Uf, una chulada!», pensé. Como mi certificado SSL es local y el navegador chilla diciendo que «la conexión no es segura», esa casilla es como enseñarle la credencial de elector a un guardia que ya te conoce: pásale, pariente, estás en tu casa.
Pego el token secreto (JWT) del contenedor, respiro hondo y le aplasto con orgullo norteño al botón azul de Guardar.
La ruedita de carga empezó a girar. Uno… dos… tres segundos… Esos segundos donde se te va el aire del pecho esperando el milagro.
¡Tómala, barbón! 💥
Me salta un letrero rojo atravesado de oreja a oreja en la pantalla:
❌ «Error al intentar establecer la conexión (Se ha producido un error en el servicio de documentos: Error while downloading the document file to be converted.) (versión 9.4.0.129)».
¡Ah, caray! Me quedé pasmado. ¿Cómo que error al descargar el archivo para convertir? ¿Cuál archivo, si yo nomás le di Guardar?
Para la raza que nunca ha configurado esto: cuando tú le das Guardar, Nextcloud no nomás pregunta «¿estás ahí, viejo?». No, señor. Nextcloud agarra un archivo chiquito de prueba, se lo manda a ONLYOFFICE y le dice: «A ver si muy machito, descárgalo de mi casa, conviértelo a tu formato y regrésame una foto miniatura para ver si es cierto que trabajas».
Y ahí, en ese viaje de ida y vuelta, la cosa había tronado como ejote.
Cerré el navegador. La web es puro cuento, compa; si quieres ver dónde está el cochinero, hay que meterse a la terminal a rascarle a los logs. 🕳️💻
Acto II: El cadenero de Node.js se puso flamenco (DEPTH_ZERO_SELF_SIGNED_CERT) 🥊👮♂️
Abro la consola de comandos, tiro un docker ps para ver al sospechoso y le meto una zancadilla al registro del contenedor a ver qué le dolía:
Bash
sudo docker exec -it onlyoffice_docs tail -n 80 /var/log/onlyoffice/documentserver/docservice/out.log
Y la pantalla me escupe una letanía de errores en rojo que parecía árbol de Navidad descompuesto:
Plaintext
[ERROR] nodeJS - error downloadFile:url=https://nube.mi-rancho-digital.com:9443/index.php/apps/onlyoffice/empty?...
code:DEPTH_ZERO_SELF_SIGNED_CERT Error: self-signed certificate
¡Míralo, qué chulo! 🤬
El error era claro como el agua de la presa: DEPTH_ZERO_SELF_SIGNED_CERT. ONLYOFFICE me mandó por un tubo porque el certificado de Nextcloud era autofirmado.
—«A ver, cabrón», le dije a la pantalla, «¿pos no te marqué en Nextcloud la casilla de ignorar los certificados?».
Pues sí, compa, pero esa casilla es pura pantalla. Nextcloud ignora los certificados cuando él le habla a ONLYOFFICE. Pero cuando ONLYOFFICE tiene que ir de regreso a tocarle la puerta a Nextcloud para descargar el archivo, el que viaja es un proceso de Node.js que vive adentro del contenedor de Docker.
Y Node.js no cree en la buena voluntad de la gente. Node.js es como esos policías gringos de película: si el papel no viene con el sello oficial del presidente, te tumba al suelo, te esposa y te cancela la llamada.
Y para acabarla de amolar, adentro de ONLYOFFICE el archivo default.json venía amarrado con alambre de púas: "rejectUnauthorized": true 🔒
O sea: «¡Aquí no entra nadie con certificado del pueblo, puro Let’s Encrypt o certificado de ricos!».
Dije: «A mí no me vas a ganar en mi propia máquina, mi rey». Me fajé la camisa y le metí mano a la configuración con un machetazo de sed:
Bash
# Obligar a Node.js a tragar certificados locales
sudo docker exec -it onlyoffice_docs sed -i 's/"rejectUnauthorized": true/"rejectUnauthorized": false/g' /etc/onlyoffice/documentserver/default.json
# Y por si las moscas, inyectar la variable en el supervisor
sudo docker exec -it onlyoffice_docs bash -c 'echo -e "\n[supervisord]\nenvironment=NODE_TLS_REJECT_UNAUTHORIZED=\"0\"" >> /etc/supervisor/supervisord.conf'
# Reiniciar los fierros internos
sudo docker exec -it onlyoffice_docs supervisorctl restart all
Reviso el log y sale Node.js regañándome:
⚠️ «Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to ‘0’ makes TLS connections insecure».
—«Chilla todo lo que quieras, plebe, pero ahora me dejas pasar». 🤠
Primer demonio domado. Ya no había bronca con el certificado. Volví a la web, le di Guardar de nuevo… y ¡mocos! Otro error diferente.
Acto III: El fantasma de <documentserver> y el miedo a las IPs privadas 👻🚫
Ya para este punto eran las doce y media de la noche. El dolor de espalda empezaba a cobrar factura y el café ya sabía a pura resignación.
Me pongo a revisar la pantalla de Nextcloud con lupa y abro una pestañita abajo que dice «Ajustes de servidor avanzados».
¡Casi me voy para atrás de la risa y el coraje! 🤦♂️😂
En el campo de «Dirección de ONLYOFFICE Docs para solicitudes internas del servidor», la interfaz me había autollenado una cochinada:
¡No me friegues! El sistema no lo tenía como ejemplo gris clarito; ¡lo estaba mandando en serio! Cada vez que guardaba, Nextcloud intentaba conectarse a un dominio que literalmente se llamaba <documentserver>. Pos con razón, viejón: el DNS de mi proveedor de internet ha de haber pensado: «¿Y este vato qué se fumó? Eso ni existe».
Y por si fuera poco, para esquivar las broncas del enrutador de la casa (que a veces no le gusta salir a internet y regresar al mismo módem, el mentado Hairpin NAT), se me ocurrió ponerle en la dirección interna la IP local de la máquina:
[https://192.168.1.150:9443/](https://192.168.1.150:9443/)
Parecía plan con maña. Tráfico local, directito por la tarjeta de red, sin gastar megas.
Pero, ¡sorpresa! ONLYOFFICE tiene complejo de agente del FBI. Los desarrolladores le metieron una regla que dice:
"allowPrivateIPAddress": false
¿Qué significa eso en cristiano? Que si ONLYOFFICE ve una IP que empieza con 192.168.x.x o 10.x.x.x, le da un ataque de pánico pensando que un hacker ruso le está haciendo un ataque de falsificación de peticiones (SSRF) y bloquea la conexión de inmediato. ¡Ni en su propia casa se sentía seguro el contenedor!
Estábamos atrapados en un callejón sin salida:
- Por la URL pública no entraba por culpa del módem.
- Por la URL interna privada reventaba porque ONLYOFFICE le tenía fobia a las IPs de la casa.
- Y el campo fantasma
<documentserver>tirando patadas de ahogado.
Aquí fue donde mandé la interfaz web a volar. A grandes males, grandes machetazos de consola.
Descubrí que en este servidor Nextcloud no corría en un Apache pelón, sino empaquetado en Snap. Así que saqué la artillería pesada con el comando nextcloud.occ:
Bash
# 1. Borrar de raíz el fantasma de <documentserver>
sudo nextcloud.occ config:app:delete onlyoffice DocumentServerInternalUrl
# 2. Clavar la IP local para que descargue sin rodeos
sudo nextcloud.occ config:app:set onlyoffice StorageUrl --value="https://192.168.1.150:9443/"
# 3. Y quitarle la paranoia a ONLYOFFICE para que acepte IPs privadas
sudo docker exec -it onlyoffice_docs sed -i 's/"allowPrivateIPAddress": false/"allowPrivateIPAddress": true/g' /etc/onlyoffice/documentserver/default.json
sudo docker exec -it onlyoffice_docs supervisorctl restart all
Listo. Borrado el fantasma, habilitada la IP privada, y Node.js amarrado para no chillar por el SSL.
Tiré la prueba de fuego desde la terminal:
sudo nextcloud.occ onlyoffice:documentserver --check
Y la terminal me responde con una frialdad que me congeló las tripas:
💀 Error connection: Error occurred in the document service.
Ahí sí sentí ganas de apagar el switch de la luz y dedicarme a sembrar hortalizas. ¿Ahora qué demonios quería el mugre sistema? 🚜🌾
Acto IV: La guerra civil de Nginx y el misterio del 403 🕵️♂️🔥
Eran ya la una y pico de la mañana. Me quedé viendo fijamente el cursor parpadear. Cuando todo falla, compa, la única regla que no falla en la informática es: los registros no se hacen pendejos. Si truena, en algún lado está chillando el fierro.
Me fui a revisar el log profundo de Nextcloud en Snap:
Bash
sudo tail -n 50 /var/snap/nextcloud/current/logs/nextcloud.log
Y entre un montón de líneas kilométricas en formato JSON, me salta la joya de la corona:
Plaintext
Client error: `GET https://nube.mi-rancho-digital.com:9443/cache/files/data/conv_check_803784422_65/output.docx/...`
resulted in a `403 Forbidden` response
Me le quedé viendo a la línea como vaca viendo pasar el tren. 🐮🚂
403 Forbidden.
¡A ver, a ver, barájamela más despacio!
Fíjate bien en la ruta que estaba pidiendo:
/cache/files/data/conv_check.../output.docx
¿Qué diablos significaba eso?
¡Significaba que ONLYOFFICE SÍ se había conectado a Nextcloud!
¡Significaba que SÍ había descargado la plantilla de prueba!
¡Significaba que el motor conversor SÍ había generado el archivo .docx y lo tenía guardado calientito en su carpeta de caché!
O sea, la carrera de 100 metros planos ya la había corrido casi toda… pero en el metro 99, cuando Nextcloud iba contento a recoger el archivo terminado para decir «¡Ya quedó, compadre!», el servidor web Nginx que cuida la puerta de ONLYOFFICE le metía un portazo en las narices gritándole: ¡403 PROHIBIDO, AQUÍ NO ENTRAS! 🚪❌
—«¿Pero por qué me corres, desgraciado, si el archivo tú mismo me lo hiciste?», pensé.
Le revisé los permisos a las carpetas por si las moscas: chmod 755, chown ds:ds. Todo en orden. No era bronca de permisos de disco.
Y en eso, una chispa divina me iluminó el coco. 💡
Me acordé de cómo protege ONLYOFFICE sus descargas: usa un módulo de Nginx llamado secure_link.
Funciona bien curado: cuando el conversor crea el documento, agarra una contraseña secreta (secretString), la revuelve con la fecha y el nombre del archivo, y genera un código MD5 único. Cuando Nextcloud viene a descargar el archivo, Nginx revisa ese código con su propia contraseña. Si las contraseñas coinciden, te da el archivo; si no, ¡te la ensarta con un 403!
Dije: «No me digas que estos animales están usando claves diferentes adentro del mismo contenedor».
Tiré este comando para destapar la cloaca:
Bash
# Ver qué clave tiene Nginx en la libreta
sudo docker exec -it onlyoffice_docs grep -rn "secure_link_secret" /etc/nginx/ /etc/onlyoffice/
# Ver qué clave tiene el conversor en la memoria
sudo docker exec -it onlyoffice_docs grep -rn "secretString" /etc/onlyoffice/documentserver/local.json
¡Cállate los ojos, pariente! 🤯
Miren lo que salió en la pantalla:
- En la configuración activa de Nginx (
ds.conf):set $secure_link_secret lDpK21FnC0Pe6EwfMPtO;📜 - En el archivo de servicio de ONLYOFFICE (
local.json):"secretString": "fn7ZMjfj6y4oJFeepVUh"🔐
¡Traían una guerra civil armada los batos! 😂
La mano izquierda del contenedor generaba el documento con el sello A, y el portero de la mano derecha en Nginx tenía órdenes estrictas de aceptar únicamente documentos con el sello B. Al ver que no cuadraban, Nginx pensaba que era un impostor y lo mandaba a la tiznada con un 403.
¡Dos horas peleando contra fantasmas y eran las comadres adentro del contenedor que no se hablaban!
Acto V: El tiro de gracia y la gloria de la consola 🎯🏆
Con el clavo bien ubicado, la cura tomó menos de diez segundos. Había que obligar a Nginx a usar la misma clave que el servicio conversor:
Bash
# 1. Emparejar la clave en la libreta de Nginx
sudo docker exec -it onlyoffice_docs sed -i 's/set $secure_link_secret .*/set $secure_link_secret fn7ZMjfj6y4oJFeepVUh;/g' /etc/nginx/conf.d/ds.conf
# 2. Recargar Nginx para que le caiga el veinte
sudo docker exec -it onlyoffice_docs nginx -s reload
Se escuchó el suspiro del proceso recargando:
[notice] signal process started 🕊️
El cuarto estaba en completo silencio. Ni el abanico sonaba ya en mi cabeza. Puse las manos sobre el teclado para tirar el volado final. Si esto no jalaba, apagaba todo y me iba a poner un puesto de hot dogs. 🌭
Escribí:
Bash
sudo nextcloud.occ onlyoffice:documentserver --check
Le piqué a la tecla Enter con la fuerza de quien cobra un penal en el minuto 90. ⚽
Medio segundo de suspenso… un parpadeo del disco duro… y la terminal escupió la frase más hermosa que han visto mis ojos en todo el año:
✨ Document server [https://nube.mi-rancho-digital.com:9443/](https://nube.mi-rancho-digital.com:9443/) version 9.4.0.129 is successfully connected ✨
¡Uffff, qué chulada de maíz prieto! 🎉🥳
Casi pego un grito en la casa que despierta a la doña.
Me fui en fa al navegador, le di un recargón con Ctrl + F5 a la página de Nextcloud y ahí estaba: la barra verde brillando como esmeralda, los iconos de .docx, .xlsx y .pptx habilitados, y el servidor de documentos enlazado como mandilón en quincena.
Abrí un documento de Word en blanco nomás de puro gusto, y en un segundo se desplegó la suite de ONLYOFFICE directito en la pestaña, suavecita y sin pedirle nada a nadie.
Moraleja pa’ la raza de sistemas 🧠🍺
Si te vas a meter al ruedo del auto-hospedaje con Docker y Nextcloud, no te confíes de las ventanitas bonitas ni de los botones azules:
- Node.js es más bravo que perro de taller: Desactiva la verificación interna (
rejectUnauthorized: false) si andas con certificados locales, porque las casillas de la web no le hacen ni cosquillas. - Cuidado con las IPs de tu casa: ONLYOFFICE viene asustado de fábrica y le cierra la puerta a las IPs privadas (
allowPrivateIPAddress: true). - No dejes que Nginx y Node se agarren del chongo: Si te arroja un
403 Forbiddenal convertir el archivo, revisa que el$secure_link_secretde Nginx sea gemelo delsecretStringde tulocal.json.
Guardé la sesión de SSH, cerré la laptop con una sonrisa de oreja a oreja y me fui a dormir a las dos de la mañana, oliendo a café frío pero con la satisfacción de haberle ganado la partida a la máquina.
¡Fierro por la 300, plebada! Arre con la que barre. 🤠🚀🖥️
🌐 ¡No te quedes fuera de la jugada, pariente! 🤝📲
Si te sirvió esta guía para no arrancarte las greñas a las 2 de la mañana con tus servidores, o si nomás te late ver cómo le batallamos en las trincheras del código y el autohospedaje, pásale a mis canales pa’ seguir en contacto y apoyar el contenido:
- 💬 Comunidad y contacto en Telegram: t.me/CesarSystems (échate una vuelta pa’ cotorrear o tirar paro con las dudas de Linux y sistemas)
- ☕ Apoya el proyecto en Patreon: patreon.com/u74078772 (pa’ seguir patrocinando el café nocturno y los tutoriales sin censura)
- ✍️ Blog de artículos y tutoriales: shalom-now.blogspot.com (aquí desmenuzamos más hacks, configuraciones y vivencias)
- 🎥 Canal de YouTube: youtube.com/@rasec555 (suscríbete pa’ ver los videos al tiro)