Herramientas Informaticas

Autor: cesar101290 Página 1 de 3

🎵 Cómo organizar tu música en Linux y crear tu propio Spotify con Picard y Navidrome

Entrada fija

¿Tienes cientos o miles de canciones desordenadas en carpetas? 😵‍💫🎶
¿Archivos con nombres como Track01.mp3, Audio_023.flac o canciones sin portada ni información?

En Linux podemos solucionar este problema de una forma sencilla utilizando MusicBrainz Picard para identificar y organizar nuestra música y Navidrome para crear nuestro propio servidor de música. 🐧🎧

El resultado: una biblioteca musical ordenada y accesible desde la computadora, celular o navegador. 📱💻

🎼 1. Organiza tu música con MusicBrainz Picard

El primer paso es tener correctamente identificadas nuestras canciones.

Para esto podemos utilizar MusicBrainz Picard, una herramienta gratuita que utiliza la base de datos de MusicBrainz para reconocer nuestros archivos y completar automáticamente sus metadatos.

Con Picard podemos obtener información como:

  • 🎤 Artista
  • 💿 Álbum
  • 🎵 Nombre de la canción
  • 📅 Año
  • 🎼 Género
  • 🔢 Número de pista
  • 🖼️ Portada del álbum
  • 💽 Información del disco

Esto es especialmente útil cuando tenemos una colección antigua de MP3, FLAC u otros formatos y queremos convertirla en una biblioteca musical bien organizada.

📂 Una estructura ordenada

Por ejemplo, podemos terminar con una estructura similar a:

Música/
├── Pink Floyd/
│   └── The Dark Side of the Moon/
│       ├── 01 - Speak to Me.flac
│       ├── 02 - Breathe.flac
│       └── 03 - On the Run.flac
│
├── Queen/
│   └── A Night at the Opera/
│       ├── 01 - Death on Two Legs.flac
│       └── 02 - Lazing on a Sunday Afternoon.flac
│
└── Metallica/
    └── Black Album/
        ├── 01 - Enter Sandman.flac
        └── 02 - Sad but True.flac

🎯 La ventaja es que posteriormente aplicaciones como Navidrome pueden utilizar estos metadatos para mostrar correctamente artistas, álbumes, géneros y canciones.


🏷️ 2. Picard: etiquetas y organización automática

Una vez que agregamos nuestra música a MusicBrainz Picard, el programa analiza las canciones y busca coincidencias en la base de datos.

Podemos revisar la información encontrada y después guardar los cambios. 💾

Así evitamos tener que editar manualmente cientos de canciones.

✅ El flujo sería:

🎵 Música desordenada
⬇️
🔎 MusicBrainz Picard
⬇️
🏷️ Etiquetas correctas
⬇️
📂 Archivos organizados
⬇️
🎧 Navidrome
⬇️
📱 Escuchar nuestra música desde cualquier dispositivo


🎧 3. Instala Navidrome y crea tu propio servidor de música

Una vez que nuestra biblioteca está organizada, podemos utilizar Navidrome.

Navidrome es un servidor de música que nos permite acceder a nuestra colección desde diferentes dispositivos mediante una interfaz web y clientes compatibles.

En lugar de depender exclusivamente de una plataforma de streaming, podemos tener nuestra propia biblioteca almacenada en nuestro servidor. 🖥️🎶

Por ejemplo:

Servidor Linux
      │
      ├── 🎵 Música
      │
      └── 🎧 Navidrome
             │
       ┌─────┼─────┐
       ↓     ↓     ↓
     📱      💻     🌐
   Celular   PC    Navegador

Esto resulta especialmente interesante si ya tienes una gran colección de música comprada, descargada legalmente o digitalizada desde tus propios discos.


🟢 4. ¿Navidrome puede ser una alternativa a Spotify?

Sí, pero son conceptos diferentes. 😉

Spotify es un servicio de streaming con un enorme catálogo disponible mediante su plataforma.

Navidrome, en cambio, está pensado para reproducir tu propia colección de música desde tu servidor.

🟢 Con Navidrome tienes:

✅ Tu propia biblioteca musical
✅ Control sobre tus archivos
✅ Organización mediante metadatos
✅ Acceso desde navegador
✅ Acceso desde dispositivos móviles mediante clientes compatibles
✅ Soporte para diferentes formatos de audio
✅ Sin depender de un catálogo externo para tu música
✅ Posibilidad de alojarlo en tu propio servidor Linux

🔵 Con Spotify tienes:

🎵 Un enorme catálogo de música
🔎 Búsqueda de artistas y canciones
📻 Recomendaciones y playlists
🌐 Servicio administrado por Spotify
📱 Aplicaciones oficiales para diferentes dispositivos

Por eso, Navidrome no busca reemplazar completamente a Spotify, sino ofrecer una alternativa para quienes quieren tener su propia biblioteca musical bajo su control.


🔥 5. ¿Por qué utilizar Picard + Navidrome?

La combinación es muy interesante:

🏷️ MusicBrainz Picard

Se encarga de identificar, etiquetar y organizar nuestra música.

🎧 Navidrome

Se encarga de servir y reproducir esa biblioteca desde nuestro servidor.

Es decir:

Picard organiza tu música. Navidrome te permite disfrutarla. 🎶

Y todo esto puede funcionar perfectamente dentro de un servidor Linux. 🐧


💻 6. Una biblioteca musical completamente organizada

Después de realizar todo el proceso podemos tener algo parecido a:

/home/usuario/Música/
│
├── Artista 1/
│   ├── Álbum 1/
│   └── Álbum 2/
│
├── Artista 2/
│   ├── Álbum 1/
│   └── Álbum 2/
│
└── Artista 3/
    └── Álbum 1/

Navidrome leerá la información de los archivos y podremos navegar por:

🎤 Artistas
💿 Álbumes
🎵 Canciones
🎼 Géneros
⭐ Favoritos
📋 Listas de reproducción


📱 7. Escucha tu música desde el celular

Una de las partes más interesantes de tener Navidrome es poder acceder a nuestra biblioteca desde otros dispositivos.

Por ejemplo:

🖥️ PC → Navidrome
📱 Celular → Cliente compatible
💻 Laptop → Navegador
🌐 Otros dispositivos → Acceso al servidor

Así podemos convertir una computadora o servidor Linux en nuestro centro personal de música. 🎶🐧


🔐 8. Tu música bajo tu control

Una de las principales ventajas de este enfoque es que tú decides dónde almacenar tu biblioteca y cómo administrarla.

Puedes utilizar:

💽 Disco duro
🖥️ PC vieja
🗄️ Servidor casero
☁️ Servidor remoto

Y si configuras correctamente el acceso remoto y la seguridad, también puedes acceder a tu biblioteca cuando estés fuera de casa. 🌎📱


🚀 Conclusión

Si tienes una colección grande de música y quieres dejar atrás el caos de carpetas y archivos mal nombrados, MusicBrainz Picard + Navidrome es una excelente combinación para Linux. 🐧🎵

Picard se encarga de identificar y organizar tus canciones.

Navidrome convierte esa biblioteca en tu propio servicio de música.

Y aunque no reemplaza directamente el enorme catálogo de Spotify, sí puede ser una excelente alternativa para quienes quieren disfrutar de su propia colección musical desde cualquier dispositivo.

🎵 Tu música.
📂 Tu biblioteca.
🖥️ Tu servidor.
🔐 Tu control.

#Linux #Navidrome #MusicBrainzPicard #Picard #Spotify #Musica #LinuxMint #ServidorLinux #SelfHosting #MusicaDigital #FLAC #MP3 #BibliotecaMusical #OpenSource #LinuxServer

📸 Cómo organizar fotos recuperadas con PhotoRec por año y mes en Linux

Entrada fija

¿Recuperaste miles de fotografías con PhotoRec y ahora tienes cientos de carpetas recup_dir.* llenas de archivos con nombres como f123456789.jpg? 😵‍💫

No necesitas organizarlas manualmente. En este tutorial vamos a utilizar ExifTool + Bash para leer automáticamente la fecha de las fotografías y organizarlas en carpetas por año y mes. 📅📸

🔎 ¿Qué hace este script?

El script analiza automáticamente las carpetas recuperadas por PhotoRec y realiza las siguientes tareas:

  • 📸 Busca fotografías recuperadas.
  • 🎥 Busca videos recuperados.
  • 📅 Lee la fecha original almacenada en los metadatos EXIF.
  • 🔎 Si no encuentra DateTimeOriginal, intenta utilizar CreateDate.
  • 📁 Crea automáticamente carpetas por año y mes.
  • ❓ Envía las fotografías sin fecha a SinFecha.
  • ❓ Envía los videos sin fecha a SinFecha.
  • 🔄 Evita sobrescribir archivos que tengan el mismo nombre.
  • 📝 Guarda un registro de todos los archivos movidos.
  • 🧹 Elimina las carpetas de recuperación que quedan vacías.

📂 Antes de organizar

Después de utilizar PhotoRec normalmente tendremos una estructura parecida a esta:

recup_dir.1/
recup_dir.2/
recup_dir.3/
recup_dir.4/
recup_dir.5/
...

Dentro de estas carpetas PhotoRec puede haber recuperado miles de archivos con nombres genéricos.

✨ Resultado final

Después de ejecutar el script, la información quedará organizada de esta manera:

Organizado/
├── Fotos/
│   ├── 2010/
│   │   ├── 01/
│   │   ├── 02/
│   │   └── 12/
│   ├── 2011/
│   ├── 2012/
│   ├── 2020/
│   └── SinFecha/
│
└── Videos/
    ├── 2010/
    │   ├── 01/
    │   └── 08/
    ├── 2011/
    └── SinFecha/

📸 Ejemplo

Supongamos que PhotoRec recuperó una fotografía con el nombre:

recup_dir.502/f268968512.jpg

Si ExifTool encuentra que la fotografía fue tomada en julio de 2018, el archivo será movido automáticamente a:

Organizado/Fotos/2018/07/f268968512.jpg

De esta forma podemos transformar una recuperación desordenada en una biblioteca mucho más fácil de administrar. 🚀

🛠️ Instalar ExifTool

En Linux Mint, Ubuntu y otras distribuciones basadas en Debian podemos instalar ExifTool con:

sudo apt update
sudo apt install exiftool

Podemos comprobar que está instalado con:

exiftool -ver

💻 Crear el script

Primero debemos entrar en la carpeta donde tenemos las carpetas recup_dir.*.

nano organizar_recuperados.sh

Después pegamos el siguiente código:

#!/bin/bash

DEST="$(pwd)/Organizado"
LOG="$(pwd)/organizar.log"

mkdir -p "$DEST/Fotos/SinFecha"
mkdir -p "$DEST/Videos/SinFecha"

echo "==================================" > "$LOG"
echo " ORGANIZACIÓN DE ARCHIVOS" >> "$LOG"
echo " Inicio: $(date)" >> "$LOG"
echo "==================================" >> "$LOG"

mover() {
    local origen="$1"
    local carpeta="$2"

    mkdir -p "$carpeta"

    local nombre
    nombre=$(basename "$origen")

    local base="${nombre%.*}"
    local ext="${nombre##*.}"

    if [[ "$base" == "$ext" ]]; then
        ext=""
    else
        ext=".$ext"
    fi

    local destino="$carpeta/$nombre"
    local i=1

    while [[ -e "$destino" ]]; do
        destino="$carpeta/${base}_$i$ext"
        ((i++))
    done

    mv "$origen" "$destino"

    echo "$origen -> $destino" >> "$LOG"
}

##################################
# FOTOS
##################################

echo
echo "=================================="
echo "        ORGANIZANDO FOTOS"
echo "=================================="
echo

echo "Contando fotos..."

TOTAL=$(find recup_dir.* -type f \( \
    -iname "*.jpg" -o \
    -iname "*.jpeg" -o \
    -iname "*.png" -o \
    -iname "*.bmp" -o \
    -iname "*.gif" -o \
    -iname "*.webp" -o \
    -iname "*.heic" -o \
    -iname "*.tif" -o \
    -iname "*.tiff" \
\) | wc -l)

echo "Fotos encontradas: $TOTAL"

N=0

find recup_dir.* -type f \( \
    -iname "*.jpg" -o \
    -iname "*.jpeg" -o \
    -iname "*.png" -o \
    -iname "*.bmp" -o \
    -iname "*.gif" -o \
    -iname "*.webp" -o \
    -iname "*.heic" -o \
    -iname "*.tif" -o \
    -iname "*.tiff" \
\) -print0 |

while IFS= read -r -d '' f
do

    ((N++))

    printf "\rFotos: %d / %d" "$N" "$TOTAL"

    fecha=$(exiftool -m -s3 -DateTimeOriginal "$f" 2>/dev/null)

    if [[ -z "$fecha" || "$fecha" == "0000:00:00 00:00:00" ]]; then
        fecha=$(exiftool -m -s3 -CreateDate "$f" 2>/dev/null)
    fi

    if [[ -n "$fecha" && "$fecha" != "0000:00:00 00:00:00" ]]; then

        año="${fecha:0:4}"
        mes="${fecha:5:2}"

        mover "$f" "$DEST/Fotos/$año/$mes"

    else

        mover "$f" "$DEST/Fotos/SinFecha"

    fi

done

echo
echo

##################################
# VIDEOS
##################################

echo "=================================="
echo "        ORGANIZANDO VIDEOS"
echo "=================================="
echo

echo "Contando videos..."

TOTAL=$(find recup_dir.* -type f \( \
    -iname "*.mp4" -o \
    -iname "*.mov" -o \
    -iname "*.3gp" -o \
    -iname "*.avi" -o \
    -iname "*.mkv" -o \
    -iname "*.mts" -o \
    -iname "*.m2ts" -o \
    -iname "*.wmv" -o \
    -iname "*.asf" -o \
    -iname "*.mpeg" -o \
    -iname "*.mpg" -o \
    -iname "*.vob" -o \
    -iname "*.webm" -o \
    -iname "*.flv" -o \
    -iname "*.m4v" \
\) | wc -l)

echo "Videos encontrados: $TOTAL"

N=0

find recup_dir.* -type f \( \
    -iname "*.mp4" -o \
    -iname "*.mov" -o \
    -iname "*.3gp" -o \
    -iname "*.avi" -o \
    -iname "*.mkv" -o \
    -iname "*.mts" -o \
    -iname "*.m2ts" -o \
    -iname "*.wmv" -o \
    -iname "*.asf" -o \
    -iname "*.mpeg" -o \
    -iname "*.mpg" -o \
    -iname "*.vob" -o \
    -iname "*.webm" -o \
    -iname "*.flv" -o \
    -iname "*.m4v" \
\) -print0 |

while IFS= read -r -d '' f
do

    ((N++))

    printf "\rVideos: %d / %d" "$N" "$TOTAL"

    fecha=$(exiftool -m -s3 -MediaCreateDate "$f" 2>/dev/null)

    if [[ -z "$fecha" || "$fecha" == "0000:00:00 00:00:00" ]]; then
        fecha=$(exiftool -m -s3 -CreateDate "$f" 2>/dev/null)
    fi

    if [[ -n "$fecha" && "$fecha" != "0000:00:00 00:00:00" ]]; then

        año="${fecha:0:4}"
        mes="${fecha:5:2}"

        mover "$f" "$DEST/Videos/$año/$mes"

    else

        mover "$f" "$DEST/Videos/SinFecha"

    fi

done

echo
echo

##################################
# LIMPIEZA
##################################

echo "Eliminando carpetas de recuperación vacías..."

find recup_dir.* -type d -empty -delete

echo
echo "=================================="
echo "          FINALIZADO"
echo "=================================="
echo

echo "Fotos y videos organizados en:"
echo "$DEST"

echo
echo "Registro:"
echo "$LOG"

echo
echo "Fin: $(date)" >> "$LOG"

▶️ Dar permisos y ejecutar

Una vez guardado el archivo, le damos permisos de ejecución:

chmod +x organizar_recuperados.sh

Y lo ejecutamos:

./organizar_recuperados.sh

El programa mostrará el progreso mientras analiza las fotografías y videos recuperados.

📝 Registro de archivos

El script crea un archivo llamado:

organizar.log

Este archivo contiene información de los archivos que fueron movidos y su ubicación final. Es muy útil para comprobar qué hizo el script.

⚠️ ¿Qué pasa con las fotos que no tienen fecha?

No todas las fotografías recuperadas por PhotoRec conservan sus metadatos EXIF. Esto puede ocurrir especialmente cuando el archivo fue recuperado parcialmente o cuando los metadatos ya habían sido eliminados.

Cuando no se encuentra una fecha válida, la fotografía se coloca en:

Organizado/Fotos/SinFecha/

Lo mismo ocurre con los videos:

Organizado/Videos/SinFecha/

💡 Consejo importante antes de recuperar archivos

Si estás recuperando información importante con PhotoRec, evita trabajar directamente sobre el disco donde se encuentran los archivos eliminados. Lo ideal es recuperar los archivos hacia otro disco para evitar sobrescribir información que todavía podría recuperarse. 💾

🚀 ¿Qué podemos hacer después?

Una vez que las fotografías estén organizadas por fecha, podemos utilizar herramientas como Digikam para administrar grandes colecciones de fotografías y Czkawka para localizar archivos duplicados.

Para música recuperada, una estrategia similar consiste en utilizar MusicBrainz Picard para identificar canciones y corregir sus metadatos, y posteriormente utilizar Navidrome para convertir la colección en una biblioteca musical accesible desde el navegador o el teléfono. 🎵📱

🏁 Conclusión

Con unas cuantas herramientas gratuitas y de código abierto podemos transformar una recuperación desordenada de PhotoRec en una biblioteca organizada automáticamente.

PhotoRec → ExifTool → Organización por fecha → Czkawka/DigiKam → Biblioteca organizada 📸💾🐧

Este método resulta especialmente útil cuando se han recuperado miles de fotografías y videos y queremos volver a construir nuestra colección personal de forma rápida y ordenada. 🚀

Cómo Recuperar Fotos y Música Borradas con PhotoRec (Windows y Linux)

Entrada fija

📌 1. ¿Se te borraron fotos o música por accidente? ¡Que no cunda el pánico! 🛑

¿Borraste la carpeta de tus vacaciones sin querer? ¿Tu memoria USB o tarjeta SD te dice que “necesita formateo”? Perder recuerdos o canciones importantes da mucho susto, pero la buena noticia es que tus archivos siguen estando ahí adentro, ocultos pero recuperables. 🪄

Hoy aprenderás a usar PhotoRec, una de las mejores herramientas del mundo para rescatar archivos. Es 100% gratuita, totalmente segura y muy potente. ¡No necesitas pagar licencias ni llevar tu equipo a un técnico costoso!

🚨 REGLA DE ORO DE SEGURIDAD (¡MUY IMPORTANTE!)

¡NO guardes los archivos recuperados en la misma memoria o disco dañado! 🛑 Si guardas algo nuevo en la memoria dañada, los archivos borrados se sobrescribirán y se perderán para siempre. Guarda todo lo que rescates en tu disco duro principal o en otra memoria USB diferente.

🔎 2. ¿Cómo logra PhotoRec recuperar tus archivos? 🧠

Cuando le das a “Borrar” en tu computadora o cámara, el sistema no elimina el archivo al instante. Lo único que hace es esconderlo y marcar ese espacio como “disponible”. 🏷️

PhotoRec funciona como un sabueso digital: escanea tu disco o USB byte por byte buscando las marcas únicas que dejan las imágenes y las canciones (como si rastreara huellas dactilares 🐾) y reconstruye los archivos completos aunque la tabla de carpetas esté rota o formateada.

⚙️ 3. Instalación Súper Rápida en Windows y Linux Mint 🚀

🪟 Opción A: En Microsoft Windows (10 y 11)

  1. Entra a la página oficial: www.cgsecurity.org. 🌐
  2. Descarga el archivo .zip para Windows de 64 bits. 📦
  3. Haz clic derecho sobre el archivo descargado y dale a “Extraer todo”.
  4. ¡Listo! No hay que instalar nada molesto. Dentro verás el programa qphotorec_win.exe, que tiene una pantalla súper fácil de usar. 🖥️

🐧 Opción B: En Linux Mint

Abre tu terminal (teclas Ctrl + Alt + T) y copia estos comandos para instalarlo en 10 segundos: ⚡

# 1. Actualizar la lista de programas
sudo apt update

# 2. Instalar PhotoRec
sudo apt install testdisk -y

📝 4. Pasos para Recuperar tus Datos en Windows (Modo Gráfico) 🪟

  1. Abre el programa: Busca el archivo qphotorec_win.exe, haz clic derecho sobre él y selecciona “Ejecutar como administrador”. 🔑
  2. Elige tu unidad: En la parte superior, selecciona la memoria USB, tarjeta SD o disco donde perdiste las fotos o la música. 💾
  3. Selecciona los tipos de archivo: Haz clic en el botón “File Formats” (Formatos de archivo) abajo a la derecha:
    • Marca jpg y png para tus fotografías. 🖼️
    • Marca mp3, flac y wav para tus canciones y audios. 🎵
  4. Elige la carpeta donde guardarás el rescate: Haz clic en “Browse” y selecciona una carpeta de tu disco C:\ (¡recuerda, fuera de la USB dañada!). 📁
  5. ¡Empieza la búsqueda! Haz clic en el botón “Search” y deja que PhotoRec trabaje su magia. ✨

🐧 5. Pasos para Recuperar tus Datos en Linux Mint (Modo Guiado) 🛠️

  1. Conecta la memoria y abre la terminal: Escribe el comando sudo photorec y presiona Enter. ⌨️
  2. Selecciona el disco: Usa las flechas del teclado ⬆️⬇️ para moverte hasta la unidad dañada y presiona Enter. 🔘
  3. Filtra tus archivos en “File Opt”: Muévete con las flechas hasta la opción [File Opt]. Presiona la tecla 's' para desmarcarlo todo y luego selecciona con la barra espaciadora solo jpg, png, mp3 y flac. Esto hará que el escaneo sea 10 veces más rápido. ⚡
  4. Selecciona el tipo de escaneo: Elije [Free] si solo borraste fotos por error, o [Whole] si el disco fue formateado por completo. 🔄
  5. Escoge la carpeta de destino: Navega hasta una carpeta de tu sistema (por ejemplo, tu carpeta de Descargas) y presiona la tecla 'C' para empezar a guardar todo. 📥

📊 6. Formatos Compatibles más Comunes 📑

PhotoRec puede recuperar casi cualquier cosa, pero aquí tienes las extensiones más buscadas:

Tipo de ArchivoExtensión¿Para qué sirve?
Fotos Normales 🖼️.JPG / .PNGImágenes de cámaras, celulares y redes sociales.
Fotos Profesionales 📸.CR2 / .NEF / .RAWFotografías de cámaras réflex de alta calidad.
Música y Audios 🎧.MP3 / .WAVCanciones, podcasts y grabaciones de voz.
Música Sin Pérdida 🎼.FLACAudio en alta fidelidad y máxima calidad.

❓ 7. ¡Auxilio! Mis archivos recuperados no tienen su nombre original 🏷️

¡No te asustes si ves nombres raros como f12345.jpg o f98765.mp3! 🤖

Esto pasa porque PhotoRec rescata los datos directamente de la memoria profunda, saltándose el registro de nombres. Sin embargo, la información dentro del archivo sigue intacta:

  • En tus fotos: Se conserva la fecha exacta, la hora y el modelo de cámara con el que la tomaste. 📅
  • En tu música: Se conservan el nombre del artista, el álbum y el título de la canción dentro del archivo. 🎤

💡 CONSEJO PRO PARA MÚSICA REORGANIZADA

Para organizar miles de canciones recuperadas en segundos sin renombrar a mano, puedes usar programas gratuitos como MusicBrainz Picard, que leen la información interna de la canción y las ordenan automáticamente en carpetas por artista y álbum. 📲

💡 8. Resumen y Consejos Finales 🛡️

  • Haz copias de seguridad: Aplica siempre la regla 3-2-1 (mantén 3 copias de tus datos importantes, en 2 medios distintos y 1 copia en la nube). ☁️
  • Cierra todo durante el rescate: No uses la computadora para otras tareas pesadas mientras PhotoRec escanea para evitar errores. ⏳
  • PhotoRec es gratis para siempre: No te dejes engañar por programas de cobro que hacen exactamente lo mismo. 🤝

Cómo resolver “Error while downloading the document file to be converted” en OnlyOffice + Nextcloud tras actualizar el certificado

Entrada fija

Si acabas de renovar o cambiar el certificado SSL de tu servidor Nextcloud y ahora OnlyOffice Document Server (corriendo en Docker) dejó de funcionar mostrando el mensaje:

Error when trying to connect (Error occurred in the document service: Error while downloading the document file to be converted.)

este artículo documenta el diagnóstico completo y la solución que aplicamos en nuestro entorno (Docker, versión de Document Server 9.3.1.10).

El síntoma

Al intentar guardar la configuración de conexión entre la app de OnlyOffice en Nextcloud y el Document Server, Nextcloud devuelve el error de conversión de documento, sin más detalle en la interfaz.

Paso 1: Revisar los logs del contenedor de OnlyOffice

El primer paso —y el más importante— es ir directo al log del contenedor Docker, ya que la interfaz web no muestra el detalle técnico real:

sudo docker logs <container_id> --tail 100 | grep -i "downloadFile\|error\|CERT"

En nuestro caso, el log mostró claramente la causa:

error downloadFile:url=https://tu-dominio:444/index.php/apps/onlyoffice/empty?doc=...
code:DEPTH_ZERO_SELF_SIGNED_CERT;connect:undefined
Error: self-signed certificate

El diagnóstico

El código DEPTH_ZERO_SELF_SIGNED_CERT confirma que el problema es de confianza SSL, no de red, permisos ni JWT. El contenedor de OnlyOffice, al intentar descargar el archivo desde Nextcloud por HTTPS para convertirlo, rechaza el certificado porque es autofirmado (o le falta la cadena intermedia) y no forma parte de su almacén de certificados de confianza (CA store) interno.

Esto es un efecto colateral típico después de renovar o cambiar un certificado: aunque el navegador lo acepte (o lo tengas configurado para ignorarlo), el motor Node.js que corre dentro del contenedor de OnlyOffice valida los certificados de forma independiente y estricta.

La solución

Existen dos rutas posibles:

Opción A — Confiar en el certificado (recomendada si seguirá siendo autofirmado)

  1. Extraer el certificado servido en el puerto correspondiente:
echo | openssl s_client -connect tu-dominio:444 -servername tu-dominio 2>/dev/null | openssl x509 -outform PEM > cert.crt
  1. Copiarlo al contenedor y actualizar el almacén de confianza:
sudo docker cp cert.crt <container_id>:/usr/local/share/ca-certificates/cert.crt
sudo docker exec <container_id> update-ca-certificates
sudo docker restart <container_id>

Opción B — Deshabilitar la verificación estricta (solución que aplicamos)

Se edita el archivo de configuración del Document Server dentro del contenedor:

sudo docker exec -it <container_id> bash
nano /etc/onlyoffice/documentserver/local.json

Y se agrega la siguiente sección dentro de services.CoAuthoring:

"services": {
  "CoAuthoring": {
    "requestDefaults": {
      "rejectUnauthorized": false
    },
    ...
  }
}

Después de guardar el archivo, es indispensable reiniciar el contenedor para que los servicios internos (docservice, converter, nginx) carguen la nueva configuración:

sudo docker restart <container_id>

Tras el reinicio, la conexión entre Nextcloud y OnlyOffice vuelve a funcionar con normalidad.

Nota importante sobre seguridad

rejectUnauthorized: false desactiva la validación de certificados SSL para todas las peticiones salientes del Document Server, no solo hacia tu instancia de Nextcloud. Es una solución práctica y válida si el certificado en cuestión seguirá siendo autofirmado por diseño (por ejemplo, en una red interna), pero si en el futuro migras a un certificado válido emitido por una autoridad reconocida (como Let’s Encrypt), lo recomendable es revertir este valor a true para restaurar la verificación estricta y protegerte de posibles ataques de intermediario (man-in-the-middle) en esa conexión.

Resumen rápido

PasoAcción
1Revisar logs del contenedor con docker logs filtrando por downloadFile y CERT
2Confirmar el código de error (DEPTH_ZERO_SELF_SIGNED_CERT = problema de certificado)
3Editar local.json agregando rejectUnauthorized: false en requestDefaults
4Reiniciar el contenedor con docker restart
5Migrar a un certificado válido a futuro y revertir el ajuste (opcional, recomendado)

Documentado a partir de un caso real de integración Nextcloud + OnlyOffice Document Server 9.3.1.10 en Docker.

🔐 Solución definitiva: Error en ONLYOFFICE Docs al renovar certificado SSL en Nextcloud (certificado autofirmado)

Entrada fija

¿Tu integración de ONLYOFFICE con Nextcloud dejó de funcionar después de renovar el certificado SSL? Aparece el error: “Error when trying to connect (Error occurred in the document service: Error while downloading the document file to be converted.)” No te preocupes, aquí tienes la guía paso a paso para resolverlo de forma definitiva, tanto si usas certificado autofirmado como si quieres migrar a Let’s Encrypt.


📌 Índice

  1. Diagnóstico del problema
  2. Renovar el certificado en Nextcloud (Snap)
  3. Configurar Apache para el puerto 4445 (si aplica)
  4. Solución de confianza SSL en el contenedor ONLYOFFICE
  5. Configurar la integración en Nextcloud
  6. Automatizar renovaciones futuras
  7. Conclusión y recomendaciones finales

1. 🔍 Diagnóstico del problema

El error se debe a que el contenedor de ONLYOFFICE Document Server no confía en el nuevo certificado que presenta Nextcloud al intentar descargar el archivo a convertir. En los logs del contenedor aparece:

error downloadFile:url=https://gusadrive.dyndns.org:444/... code:DEPTH_ZERO_SELF_SIGNED_CERT

Para confirmar el diagnóstico, revisa los logs de tu contenedor:

sudo docker ps   # Identifica el nombre del contenedor (ej. reverent_torvalds)
sudo docker logs  --tail 100 | grep -i "downloadFile\|error\|CERT"

2. 🔄 Renovar el certificado en Nextcloud (Snap)

Si aún no has renovado tu certificado autofirmado, sigue estos pasos. Si ya lo hiciste, pasa al paso 3.

a) Generar un nuevo certificado autofirmado para el dominio:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /var/snap/nextcloud/current/certs/custom/key.pem \
    -out /var/snap/nextcloud/current/certs/custom/cert.pem \
    -subj "/CN=gusadrive.dyndns.org"

b) Crear el archivo chain.pem (necesario para Nextcloud Snap):

sudo cp /var/snap/nextcloud/current/certs/custom/cert.pem /var/snap/nextcloud/current/certs/custom/chain.pem

c) Instalar el certificado en Nextcloud Snap:

sudo nextcloud.enable-https custom \
    /var/snap/nextcloud/current/certs/custom/cert.pem \
    /var/snap/nextcloud/current/certs/custom/key.pem \
    /var/snap/nextcloud/current/certs/custom/chain.pem

d) Reiniciar Nextcloud:

sudo snap restart nextcloud

3. 🌐 Configurar Apache para el puerto 4445 (si aplica)

Si tienes un VirtualHost de Apache que expone el panel de ONLYOFFICE en el puerto 4445, actualiza la configuración.

a) Localiza el VirtualHost:

sudo grep -r "4445" /etc/apache2/sites-enabled/

b) Edita el archivo (ej. /etc/apache2/sites-available/onlyoffice.conf) y apunta a los nuevos certificados:

<VirtualHost *:4445>
    ServerName gusadrive.dyndns.org
    SSLEngine on
    SSLCertificateFile "/etc/apache2/ssl/onlyoffice.crt"
    SSLCertificateKeyFile "/etc/apache2/ssl/onlyoffice.key"
    ...
</VirtualHost>

c) Copia los certificados a la ruta especificada:

sudo mkdir -p /etc/apache2/ssl
sudo cp /var/snap/nextcloud/current/certs/custom/cert.pem /etc/apache2/ssl/onlyoffice.crt
sudo cp /var/snap/nextcloud/current/certs/custom/key.pem /etc/apache2/ssl/onlyoffice.key

d) Habilita el sitio y reinicia Apache:

sudo a2ensite onlyoffice.conf
sudo systemctl restart apache2

4. 🐳 Solución de confianza SSL en el contenedor ONLYOFFICE

Tienes dos opciones para que el contenedor confíe en el certificado autofirmado de Nextcloud.

✅ Opción A (Recomendada para producción): Agregar el certificado al almacén de CA del contenedor

1. Copia el certificado al contenedor:

sudo docker cp /var/snap/nextcloud/current/certs/custom/cert.pem <nombre_contenedor>:/usr/local/share/ca-certificates/nextcloud.crt

2. Actualiza el almacén de CA dentro del contenedor:

sudo docker exec <nombre_contenedor> update-ca-certificates

3. Reinicia el contenedor:

sudo docker restart <nombre_contenedor>

4. Verifica que el certificado se haya agregado:

sudo docker exec <nombre_contenedor> ls -la /usr/local/share/ca-certificates/

⚠️ Opción B (Solución temporal / pruebas): Deshabilitar la verificación SSL en ONLYOFFICE

Esta opción es más rápida pero reduce la seguridad (el contenedor no validará certificados en ninguna conexión saliente).

1. Entra al contenedor:

sudo docker exec -it <nombre_contenedor> bash

2. Edita el archivo /etc/onlyoffice/documentserver/local.json y agrega la siguiente sección (si no existe):

{
  "services": {
    "CoAuthoring": {
      "requestDefaults": {
        "rejectUnauthorized": false
      }
    }
  }
}

3. Guarda, sal del contenedor y reinícialo:

sudo docker restart <nombre_contenedor>

5. ⚙️ Configurar la integración en Nextcloud

Ve a Configuración → ONLYOFFICE → Servidor de documentos en Nextcloud y asegura estos valores:

  • URL del servidor de documentos: http://localhost:8085/ (con barra final).
  • Clave secreta (JWT): Debe coincidir con la generada en ONLYOFFICE. Obténla con: sudo docker exec <nombre_contenedor> sudo documentserver-jwt-status.sh
  • Configuración avanzada (JSON):
    • Si usaste la Opción A, no necesitas nada extra.
    • Si usaste la Opción B, agrega: { "rejectUnauthorized": false }

Guarda los cambios.


6. 🔁 Automatizar renovaciones futuras (para certificado autofirmado)

Crea un script que se ejecute mensualmente para regenerar el certificado e instalarlo tanto en Nextcloud como en el contenedor.

Script de ejemplo (/root/renew_selfsigned.sh):

#!/bin/bash
# Regenerar certificado autofirmado
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /var/snap/nextcloud/current/certs/custom/key.pem \
    -out /var/snap/nextcloud/current/certs/custom/cert.pem \
    -subj "/CN=gusadrive.dyndns.org"

cp /var/snap/nextcloud/current/certs/custom/cert.pem /var/snap/nextcloud/current/certs/custom/chain.pem

# Instalar en Nextcloud
nextcloud.enable-https custom \
    /var/snap/nextcloud/current/certs/custom/cert.pem \
    /var/snap/nextcloud/current/certs/custom/key.pem \
    /var/snap/nextcloud/current/certs/custom/chain.pem

snap restart nextcloud

# Copiar al contenedor de ONLYOFFICE
docker cp /var/snap/nextcloud/current/certs/custom/cert.pem <nombre_contenedor>:/usr/local/share/ca-certificates/nextcloud.crt
docker exec <nombre_contenedor> update-ca-certificates
docker restart <nombre_contenedor>

Programa en cron (diario a las 3 AM, primer día de mes):

sudo crontab -e
# Añadir la línea:
0 3 1 * * /root/renew_selfsigned.sh >> /var/log/renew_cert.log 2>&1

7. 🎯 Conclusión y recomendaciones finales

  • El error “Error while downloading the document file” después de renovar un certificado autofirmado en Nextcloud se debe a que el contenedor de ONLYOFFICE no confía en ese certificado.
  • Opción A (recomendada): Agregar el certificado al almacén de CA del contenedor y actualizar las CA. Es segura y permite mantener la verificación SSL activa.
  • Opción B (temporal): Deshabilitar la verificación SSL en ONLYOFFICE editando local.json. Más rápida pero menos segura.
  • Recomendación a largo plazo: Utilizar un certificado de Let’s Encrypt con validación DNS para evitar este problema de raíz y simplificar las renovaciones.

Notas adicionales:

  • La comunicación entre Nextcloud y ONLYOFFICE puede hacerse por HTTP interno (http://localhost:8085) para evitar SSL por completo (válido si ambos servicios corren en el mismo servidor).
  • Asegura que el token JWT coincida exactamente entre ambos lados; un token incorrecto dará error 403.
  • Los logs del contenedor son la mejor herramienta para depurar: sudo docker logs <nombre> --tail 50 -f.

¿Te ha sido útil esta guía? Déjanos un comentario si tienes dudas o comparte tu experiencia. Si necesitas ayuda adicional, no dudes en contactarnos.

🚀 Guía Completa para Administrar y Validar Conexiones SQL Server desde PHP, CodeIgniter y Linux

Entrada fija



Guía Completa para Administrar y Validar Conexiones SQL Server desde PHP, CodeIgniter y Linux

Las bases de datos son el corazón de los sistemas empresariales modernos. SQL Server es una de las plataformas más utilizadas para almacenar información crítica y su integración con PHP y CodeIgniter permite construir soluciones robustas y escalables.

💻 ¿Por qué es importante administrar conexiones?

Cuando una organización utiliza múltiples servidores SQL Server, mantener un catálogo centralizado de conexiones facilita la administración, mejora la seguridad y reduce errores de configuración.

📋 Información almacenada

  • 🏢 Empresa
  • 🌐 Host o servidor
  • 👤 Usuario
  • 🔑 Contraseña
  • 🗄️ Base de datos
  • 🔌 Puerto

✅ Validación automática

Una de las características más útiles es la capacidad de validar en tiempo real si una conexión es válida antes de utilizarla. Esto permite detectar errores de red, credenciales incorrectas o bases de datos inexistentes.

🔍 Beneficios

  • Ahorro de tiempo
  • Menos errores humanos
  • Mayor productividad
  • Seguridad mejorada
  • Escalabilidad

🐧 Compatibilidad

La solución funciona con Linux y Windows, integrándose con PHP y CodeIgniter 4 para proyectos empresariales modernos.

📦 Repositorio del proyecto

https://github.com/julio101290/boilerplatecompac

🎯 Conclusión

Administrar y validar conexiones SQL Server desde una interfaz centralizada simplifica enormemente el mantenimiento de sistemas empresariales y mejora la confiabilidad de las aplicaciones.

🚀 Cómo Instalar SQL Server (SQLSRV) en Linux Mint 22.1 para PHP 8.3 y CodeIgniter 4

Entrada fija

Si estás desarrollando aplicaciones con PHP y CodeIgniter 4 en Linux Mint y necesitas conectarte a Microsoft SQL Server, es posible que te encuentres con errores como:

  • ❌ Unable to connect to the database
  • ❌ Undefined constant “CodeIgniter\Database\SQLSRV\SQLSRV_ENC_CHAR”

La buena noticia es que la solución es sencilla una vez que se instalan correctamente los controladores de Microsoft y las extensiones de PHP. En esta guía te explicamos paso a paso cómo hacerlo. 👨‍💻

📋 Requisitos Previos

  • ✅ Linux Mint 22.1 (Xia)
  • ✅ PHP 8.3 instalado
  • ✅ Acceso a terminal con permisos de administrador
  • ✅ Conexión a Internet

🔍 Verificar la Versión de PHP

Primero, verifica la versión de PHP instalada:

php -v

📦 Instalar Dependencias Necesarias

Instala las herramientas necesarias para compilar las extensiones:

sudo apt update sudo apt install -y php8.3-dev php-pear build-essential unixodbc-dev

🛠️ Agregar el Repositorio de Microsoft

Importa la clave de Microsoft:

curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | \ sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg

Agrega el repositorio:

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft-prod.gpg] https://packages.microsoft.com/ubuntu/24.04/prod noble main" | sudo tee /etc/apt/sources.list.d/mssql-release.list

Actualiza los repositorios:

sudo apt update

💾 Instalar el Driver ODBC de SQL Server

Instala el controlador oficial de Microsoft:

sudo ACCEPT_EULA=Y apt install -y msodbcsql18

Verifica que el paquete esté disponible:

apt search msodbcsql

⚙️ Instalar las Extensiones SQLSRV y PDO_SQLSRV

Instala las extensiones PHP utilizando PECL:

sudo pecl install sqlsrv sudo pecl install pdo_sqlsrv

🔧 Activar las Extensiones

Crea los archivos de configuración:

echo "extension=sqlsrv.so" | sudo tee /etc/php/8.3/mods-available/sqlsrv.ini echo "extension=pdo_sqlsrv.so" | sudo tee /etc/php/8.3/mods-available/pdo_sqlsrv.ini

Activa las extensiones:

sudo phpenmod sqlsrv sudo phpenmod pdo_sqlsrv

🔄 Reiniciar Apache

Si utilizas Apache, reinícialo:

sudo systemctl restart apache2

✅ Verificar la Instalación

Comprueba que PHP cargó correctamente las extensiones:

php -m | grep sqlsrv

La salida correcta será:

pdo_sqlsrv sqlsrv

También puedes verificar la constante utilizada por CodeIgniter:

php -r "var_dump(defined('SQLSRV_ENC_CHAR'));"

Resultado esperado:

bool(true)

🎯 Configuración en CodeIgniter 4

Una vez instaladas las extensiones, puedes configurar la conexión de esta forma:

$config = [ 'DBDriver' => 'SQLSRV', 'hostname' => 'servidor', 'database' => 'base_de_datos', 'username' => 'usuario', 'password' => 'contraseña', 'port' => 1433, ];

🚨 Errores Comunes

❌ Undefined constant SQLSRV_ENC_CHAR

Este error ocurre cuando la extensión sqlsrv no está instalada o no se encuentra cargada en PHP.

❌ Unable to load dynamic library ‘sqlsrv.so’

Indica que PHP intenta cargar el módulo, pero el archivo sqlsrv.so no existe o no fue instalado correctamente.

❌ Error SSL Provider o Certificate

Con ODBC Driver 18 algunos servidores requieren configuración adicional de certificados o habilitar la confianza del certificado del servidor.

🎉 Conclusión

Instalar SQL Server en Linux Mint para PHP y CodeIgniter puede parecer complicado al principio, pero siguiendo estos pasos podrás conectar tu aplicación sin problemas.

Una vez instaladas las extensiones sqlsrv y pdo_sqlsrv, CodeIgniter podrá comunicarse con Microsoft SQL Server de forma nativa y eficiente.

💡 Si trabajas con aplicaciones empresariales, ERPs o sistemas administrativos, esta configuración te permitirá integrar fácilmente bases de datos SQL Server desde entornos Linux.

🚀 ¡Ahora ya estás listo para desarrollar con PHP, CodeIgniter y SQL Server en Linux Mint!

Tutorial: Instalación del High‑Performance Backend para Nextcloud Talk

Entrada fija

¡Excelente! A continuación encontrarás un tutorial completo desde cero para instalar y configurar el High‑Performance Backend (HPB) de Nextcloud Talk en un servidor Ubuntu, basado en la solución que aplicamos paso a paso.

Requisitos previos

  • Un servidor con Ubuntu 22.04 o 24.04 (mínimo 2 GB RAM, 2 vCPU).
  • Nextcloud ya instalado y funcionando (puede estar en el mismo servidor o en otro).
  • La aplicación Talk habilitada en Nextcloud.
  • Un nombre de dominio (por ejemplo, tudominio.com) apuntando al servidor.
    Necesitarás dos subdominios (o uno con puertos distintos):
    • nextcloud.tudominio.com → donde está Nextcloud (si no usas el mismo servidor, omítelo).
    • signal.tudominio.com → para el backend de alto rendimiento.
  • Puertos abiertos en el firewall del servidor:
    • 80/tcp y 443/tcp (web + WebSocket).
    • 3478/udp y 3478/tcp (STUN/TURN sin TLS).
    • 5349/udp y 5349/tcp (STUN/TURN con TLS).
  • Una cuenta de correo para recibir avisos de Certbot (Let’s Encrypt).

Nota: Este tutorial asume que Nextcloud está en el mismo servidor. Si está en otro, ajusta las IPs y dominios.

1. Instalación del script HPB

El script oficial de sunweaver automatiza la instalación de coturn, janus, nats y el servidor de señalización.

# Actualizar sistema e instalar dependencias básicas
sudo apt update && sudo apt upgrade -y
sudo apt install -y wget git curl

# Descargar la última versión del script (ejemplo con la 1.3.5)
cd ~
wget https://github.com/sunweaver/nextcloud-high-performance-backend-setup/archive/refs/tags/1.3.5.tar.gz
tar xzf 1.3.5.tar.gz
cd nextcloud-high-performance-backend-setup-1.3.5

# Ejecutar el instalador (responde a las preguntas)
sudo ./install.sh

Durante la instalación te pedirá:

  • Nextcloud base URL: https://nextcloud.tudominio.com (o la IP/puerto de tu Nextcloud). Si Nextcloud usa un puerto no estándar (ej. :444), indícalo.
  • Signaling domain: signal.tudominio.com (el subdominio para el HPB).
  • Correo para certificados SSL: tu email.
  • Secreto TURN: se generará automáticamente (guárdalo).
  • Secreto del backend: también se generará (guárdalo).

Al final verás un resumen similar a este (los valores cambiarán):

STUN server = signal.tudominio.com:5349
TURN server:
 - turn and turns
 - turnserver+port: signal.tudominio.com:5349
 - secret: a33e1511842947b2f2c514fba9e01dced4ed6d274bd8424d8c6bc8bcb00f60bb
 - udp & tcp
High-performance backend:
 - https://signal.tudominio.com/standalone-signaling
 - signal.tudominio.com -> 437929b3e7012e0d4a9e7a4564945d3a

Guarda estos datos, los necesitarás en Nextcloud.

2. Solución de problemas post‑instalación

El script a veces deja servicios sin arrancar o con configuraciones incorrectas. Aplica los siguientes arreglos si ves errores (como coturn o janus caídos, WebSocket fallando, invalid_backend, etc.).

2.1 Arreglar coturn (servidor TURN)

Edita /etc/turnserver.conf:

sudo nano /etc/turnserver.conf

Asegura estas líneas:

listening-ip=0.0.0.0
listening-port=3478
tls-listening-port=5349

# Comenta o elimina cualquier línea que ponga external-ip o relay-ip
# (a menos que estés detrás de NAT, en cuyo caso consulta la nota al final)
# external-ip=
# relay-ip=

Si tu servidor tiene IP pública directa, no necesitas external-ip. Si está detrás de NAT (IP privada), añade:

relay-ip=192.168.x.x   # IP privada del servidor
# external-ip = (no poner, el router hará NAT)

Reinicia coturn:

sudo systemctl restart coturn
sudo systemctl enable coturn

2.2 Arreglar el servidor de señalización (nextcloud‑spreed‑signaling)

Edita /etc/nextcloud-spreed-signaling/server.conf:

sudo nano /etc/nextcloud-spreed-signaling/server.conf

Corrige la sección [backend] (debe coincidir con la URL de tu Nextcloud, incluyendo puerto si es necesario):

[backend]

allowed = https://nextcloud.tudominio.com:444 # o sin puerto si es 443 secret = 437929b3e7012e0d4a9e7a4564945d3a # el secreto que te dio el script

Añade o corrige la sección [turn] (asegúrate de usar el puerto 5349, no 9991):

[turn]

secret = a33e1511842947b2f2c514fba9e01dced4ed6d274bd8424d8c6bc8bcb00f60bb # el secreto TURN servers = turn:signal.tudominio.com:5349?transport=udp, turn:signal.tudominio.com:5349?transport=tcp

Si existe una sección [nextcloud-backend-0], asegura que tenga:

[nextcloud-backend-0]

url = https://nextcloud.tudominio.com:444 secret = 437929b3e7012e0d4a9e7a4564945d3a

Reinicia el servicio:

sudo systemctl restart nextcloud-spreed-signaling

2.3 Configurar el proxy inverso (Nginx)

El script ya debería haber creado un archivo para signal.tudominio.com. Verifica que incluya las cabeceras WebSocket:

sudo nginx -T | grep -A20 "server_name signal.tudominio.com"

Debe aparecer algo como:

location /standalone-signaling/ {
    proxy_pass http://127.0.0.1:8080/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    # ... otras cabeceras
}

Si falta, edita el archivo correspondiente (por ejemplo, /etc/nginx/sites-available/signal.tudominio.com) y añade esas líneas. Luego recarga Nginx:

sudo nginx -t && sudo systemctl reload nginx

2.4 Firewall

Abre los puertos necesarios:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 3478/udp
sudo ufw allow 3478/tcp
sudo ufw allow 5349/udp
sudo ufw allow 5349/tcp

2.5 Reiniciar todos los servicios en orden

sudo systemctl restart coturn
sudo systemctl restart janus
sudo systemctl restart nats-server
sudo systemctl restart nextcloud-spreed-signaling

Comprueba que todos estén activos:

sudo systemctl status coturn janus nats-server nextcloud-spreed-signaling

3. Configuración en Nextcloud (interfaz web)

Accede a tu Nextcloud con una cuenta de administrador.

  1. Ve a Ajustes → Administración → Talk.
  2. En la sección High‑performance backend:
    • URL: https://signal.tudominio.com/standalone-signaling
    • Secreto compartido: 437929b3e7012e0d4a9e7a4564945d3a (el que generó el script).
  3. En STUN & TURN servers:
    • STUN: signal.tudominio.com:5349
    • TURN (dos líneas):
      • turn:signal.tudominio.com:5349?transport=udp
      • turn:signal.tudominio.com:5349?transport=tcp
    • Secreto TURN: a33e1511842947b2f2c514fba9e01dced4ed6d274bd8424d8c6bc8bcb00f60bb (el otro secreto).
  4. Guarda los cambios.

4. Prueba de funcionamiento

4.1 Prueba básica del signaling server

curl -k https://signal.tudominio.com/standalone-signaling/api/v1/welcome

Debe responder un JSON con "nextcloud-spreed-signaling":"Welcome".

4.2 Prueba del WebSocket con wscat

sudo apt install -y node-ws
wscat -c wss://signal.tudominio.com/standalone-signaling/spreed

Si ves Connected, presiona Ctrl+C.

4.3 Prueba en el navegador

  • Abre la consola de desarrollador (F12) en tu Nextcloud.
  • Ejecuta: window.OCA.Talk.SignalingStandaloneTest?.testConnection()
  • Deberías ver mensajes de éxito (no invalid_backend).
  • Inicia una llamada entre dos usuarios diferentes. El audio y vídeo deben fluir.

5. Solución de errores comunes

invalid_backend en la consola del navegador
Causa: la URL del backend en el signaling no coincide con la de Nextcloud.
Solución: edita /etc/nextcloud-spreed-signaling/server.conf y asegura que allowed y url tengan exactamente la URL que usas para acceder a Nextcloud (incluyendo https:// y el puerto si no es 443). Luego reinicia el signaling.

❌ WebSocket no conecta (Error en la consola: WebSocket connection failed)
Causa: Nginx no envía las cabeceras Upgrade.
Solución: agrega las líneas proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; en el bloque location /standalone-signaling/ de Nginx.

❌ Coturn no arranca o se cae (Cannot bind)
Causa: el servidor intenta escuchar en una IP que ya no existe o está mal configurada.
Solución: pon listening-ip=0.0.0.0 y comenta cualquier external-ip o relay-ip a menos que estés detrás de NAT.

❌ La llamada conecta pero no hay audio/vídeo (candidatos ICE vacíos)
Causa: el TURN no está accesible o el signaling anuncia un puerto incorrecto.
Solución: 1) Verifica que turnserver.conf tenga tls-listening-port=5349. 2) En server.conf del signaling, asegura que los servidores TURN usen el puerto 5349. 3) Abre los puertos en el firewall (UDP y TCP). 4) Si estás detrás de NAT, configura relay-ip y redirección de puertos en el router.

❌ Un usuario no administrador no puede unirse a la sala (user not invited)
Causa: la conversación no es pública o el usuario no fue invitado.
Solución: crea una nueva conversación, invita explícitamente al usuario, o convierte la sala en pública (enlace compartido). Asegúrate de que el usuario tenga habilitada la app Talk.

6. Nota final sobre IPs dinámicas y NAT

Si tu servidor tiene IP pública dinámica (cambia periódicamente) y usas DDNS (ej. dyndns.org):

  • No pongas external-ip en /etc/turnserver.conf. Deja que coturn use 0.0.0.0.
  • En el router, redirige los puertos 3478/5349 (UDP/TCP) a la IP privada del servidor.
  • Usa el nombre DDNS en todas las configuraciones (signal.tudominio.com).
  • El signaling server ya usará el nombre, y el navegador resolverá la IP actual.

✅ ¡Listo!

Ahora tienes un backend de alto rendimiento para Talk funcionando con WebSocket y TURN correctamente. Disfruta de llamadas de vídeo escalables y con baja latencia.

Si encuentras algún problema no cubierto aquí, revisa los logs:

sudo journalctl -u coturn -f
sudo journalctl -u janus -f
sudo journalctl -u nextcloud-spreed-signaling -f
sudo tail -f /var/log/nginx/error.log

Boilerplate de Órdenes de Mantenimiento para CodeIgniter 4

Entrada fija
Versión Estable
Descargas Totales
Versión Inestable
Licencia

Boilerplate Mantenimiento

Boilerplate de Órdenes de Mantenimiento para CodeIgniter 4

Módulo de Gestión de Órdenes de Mantenimiento

Un módulo profesional y escalable para la gestión de órdenes de mantenimiento, desarrollado para CodeIgniter 4.

Este boilerplate está diseñado para:

  • Departamentos de TI
  • Talleres automotrices
  • Mantenimiento de equipos industriales
  • Centros de reparación en general

Características

  • Arquitectura modular (fácil integración)
  • Gestión completa de órdenes de mantenimiento
  • Catálogo de departamentos
  • Gestión de empleados
  • Asignación de activos por empleado
  • Dashboard con órdenes pendientes
  • Estructura escalable lista para integrarse en ERP

Requisitos

  • PHP 8.1 o superior
  • CodeIgniter 4
  • phpcfdi/sat-catalogos
  • julio101290/boilerplatelog
  • julio101290/boilerplateinventory

Instalación

Instalar vía Composer

composer require julio101290/boilerplatemaintenance

Ejecutar migraciones y seeders

php spark boilerplatemaintenance:installmaintenance

Capturas del Módulo

Dashboard – Órdenes Pendientes

Catálogo de Departamentos

Órdenes de Mantenimiento


Ejemplo de Integración en el Menú

Menú Principal de Mantenimiento

Dashboard

Departamentos

Empleados

Productos por Empleado

Órdenes de Mantenimiento


Sistema Listo


Uso

Revisa las rutas, controladores, modelos, vistas, migraciones y seeders para comprender el funcionamiento interno y adaptarlo a tu sistema.


Historial de Cambios

Consulta el archivo CHANGELOG para conocer las actualizaciones recientes.


Contribuciones

Las contribuciones son bienvenidas:

  1. Haz un fork del repositorio
  2. Crea una rama de mejora
  3. Envía un pull request

Licencia

Este paquete es software libre distribuido bajo la Licencia MIT.


Autor

Desarrollado y mantenido por Julio Leyva
¡Feliz programación! 🚀

Guía Definitiva: Conectividad PHP a SAP HANA en Linux (Drivers Nativos)

Entrada fija

Cómo eliminar la dependencia de drivers de pago y configurar una conexión profesional, gratuita y permanente.


Introducción

En el desarrollo de aplicaciones que interactúan con SAP Business One, la conectividad desde entornos Linux suele ser un desafío técnico. Muchos desarrolladores optan por drivers de terceros que, si bien son funcionales, requieren licencias costosas o expiran tras periodos de prueba.

Esta publicación detalla el proceso paso a paso para instalar el HDB Client oficial de SAP y configurar el gestor unixODBC para lograr una integración transparente con PHP, manteniendo la compatibilidad total con servidores Windows.

1. Preparación del Entorno

Antes de comenzar, debemos instalar las dependencias necesarias para que Linux pueda gestionar conexiones ODBC y para que PHP pueda comunicarse con ellas.

sudo apt-get update
sudo apt-get install unixodbc unixodbc-dev php-odbc

Tras la instalación, es vital reiniciar el servidor web para cargar el módulo ODBC:

sudo systemctl restart apache2

2. Instalación del SAP HANA Client (HDBClient)

El driver nativo de SAP es una librería de alto rendimiento (libodbcHDB.so). No busques un instalador .deb; SAP proporciona un script de instalación propio.

  1. Descarga el paquete HDB CLIENT LINUX X86_64.
  2. Descomprime y entra en la carpeta mediante la terminal.
  3. Ejecuta el instalador con privilegios de superusuario:
sudo ./hdbinst

Por defecto, el software se ubicará en /usr/sap/hdbclient/. Esta ruta será nuestra referencia para la configuración.

3. Registro del Driver en el Sistema

Linux utiliza el archivo /etc/odbcinst.ini para saber qué drivers están disponibles. Aquí es donde solucionaremos de forma global los problemas de certificados SSL y X.509.

Edita el archivo: sudo nano /etc/odbcinst.ini y pega lo siguiente:

[SAP_HANA_NATIVE]
Description = SAP HANA Driver Oficial
Driver      = /usr/sap/hdbclient/libodbcHDB.so
Setup       = /usr/sap/hdbclient/libodbcHDB.so
UsageCount  = 1
# Desactivación de cifrado para evitar errores de comunicación
encrypt                = false
sslValidateCertificate = false

4. Configuración del DSN (Data Source Name)

El DSN es el alias que usará tu código PHP. Al definirlo en /etc/odbc.ini, abstraes la dirección IP y el puerto de tu código fuente.

Edita el archivo: sudo nano /etc/odbc.ini:

[MI_DSN_SAPHANA]
Driver     = SAP_HANA_NATIVO
ServerNode = 192.168.x.x:30015
User       = TU_USUARIO_DB
Password   = TU_CONTRASEÑA_DB

Importante: Borra cualquier archivo oculto en tu carpeta personal (~/.odbc.ini) para asegurar que el sistema lea la configuración global de /etc/.

5. Prueba de Fuego desde Terminal

Antes de probar en la web, usamos la herramienta isql. Esta prueba valida que los archivos INI son correctos y que el firewall permite la conexión.

isql -v MI_DSN_SAPHANA TU_USUARIO_DB 'TU_CONTRASEÑA'

Si observas el mensaje + Connected! +, tu sistema operativo ya está hablando con SAP HANA.

6. Implementación en PHP

Gracias a esta configuración, tu código PHP se mantiene limpio y profesional. No necesitas strings de conexión kilométricos, solo el nombre del DSN.

<?php
$dsn      = "MI_DSN_SAPHANA";
$usuario  = "TU_USUARIO_DB";
$password = 'TU_CONTRASEÑA_COMPLEJA'; // Usar comillas simples para evitar errores con caracteres especiales

$conexion = odbc_connect($dsn, $usuario, $password);

if ($conexion) {
    echo "Conexión establecida con éxito a SAP HANA.";
    // Ejemplo de consulta
    $result = odbc_exec($conexion, "SELECT 'Conexión Exitosa' FROM DUMMY");
    print_r(odbc_fetch_array($result));
} else {
    echo "Error de conexión: " . odbc_errormsg();
}
?>

7. Mantenimiento de Compatibilidad con Windows

Una de las mayores ventajas de este método es la portabilidad. Si tu servidor de producción es Windows y tu entorno de desarrollo es Linux:

  • En Windows: Crea un DSN de Sistema con el nombre MI_DSN_SAPHANA desde el Administrador de Datos ODBC.
  • En Linux: Mantén el DSN con el mismo nombre en /etc/odbc.ini.

Resultado: El mismo archivo PHP funcionará en ambos sistemas sin modificar una sola línea de código.

Conclusión

Configurar drivers nativos requiere un poco más de trabajo manual que usar instaladores automáticos de pago, pero los beneficios son claros: estabilidad, gratuidad y control total sobre la seguridad de la conexión. Al centralizar la configuración en los archivos del sistema, permitimos que nuestras aplicaciones PHP sean más robustas y fáciles de mantener.

Página 1 de 3

Creado con WordPress & Tema de Anders Norén