Herramientas Informaticas

Etiqueta: GNU/LINUX Página 1 de 16

🔧 PHP + SAP HANA ODBC: solución cuando odbc_fetch_array() no devuelve todos los registros

Entrada fija

¿Te ha pasado que una consulta en SAP HANA devuelve cientos de registros correctamente, pero al consumirla desde PHP mediante ODBC solamente recibes uno?

Eso fue exactamente lo que ocurrió en este caso: una consulta en SAP HANA tenía 902 registros, pero desde PHP, al incluir la descripción del artículo OITM."ItemName", odbc_fetch_array() solamente recuperaba 1 registro.

Después de varias pruebas se pudo determinar que no era un problema de memoria, SQL, JOIN, PHP ni del while.

La solución fue configurar correctamente el controlador SAP HANA ODBC para manejar los caracteres mediante UTF-8:

CHAR_AS_UTF8=true

manteniendo:

EnableArrayFetch=1

La configuración se aplicó tanto en Linux Mint como en Windows 10.


🚨 El problema

La consulta original era similar a:

SELECT
    a."ItemCode",
    b."ItemName",
    a."Price",
    a."PriceList",
    c."ListName"
FROM ITM1 a
INNER JOIN OITM b
    ON a."ItemCode" = b."ItemCode"
INNER JOIN OPLN c
    ON a."PriceList" = c."ListNum"
WHERE a."PriceList" = 1
  AND IFNULL(a."Price", 0) > 0;

En SAP HANA la consulta contenía 902 artículos con precio.

Sin embargo, PHP solamente recibía:

1 registro

y no aparecía ningún error ODBC.

El código PHP era completamente normal:

while ($row = odbc_fetch_array($stmt)) {

    $data[] = [
        'ItemCode'  => $row['ItemCode'],
        'ItemName'  => $row['ItemName'],
        'Price'     => (float) $row['Price'],
        'PriceList' => (int) $row['PriceList'],
        'ListName'  => $row['ListName'],
    ];
}

🔍 Primero: comprobar si realmente existen los registros

Antes de culpar a PHP u ODBC, se comprobó directamente en HANA:

SELECT COUNT(*) AS "Total"
FROM ITM1
WHERE "PriceList" = 1
  AND IFNULL("Price", 0) > 0;

Resultado:

902

Por lo tanto, los datos sí existían.


🧪 Diagnóstico paso a paso

Para encontrar el problema se fue simplificando la consulta.

1️⃣ Solamente ITM1

SELECT
    "ItemCode",
    "Price",
    "PriceList"
FROM ITM1
WHERE "PriceList" = 1
  AND IFNULL("Price", 0) > 0;

Desde PHP:

TOTAL: 902

ITM1 funcionaba correctamente.


2️⃣ Agregar el JOIN con OITM

Se añadió:

INNER JOIN OITM b
    ON a."ItemCode" = b."ItemCode"

pero solamente se recuperó el código:

SELECT
    a."ItemCode",
    b."ItemCode"
FROM ITM1 a
INNER JOIN OITM b
    ON a."ItemCode" = b."ItemCode"
WHERE a."PriceList" = 1
  AND IFNULL(a."Price", 0) > 0;

Resultado:

TOTAL: 902

✅ El JOIN con OITM también funcionaba.


⚠️ 3️⃣ Agregar ItemName

El problema apareció cuando se añadió:

b."ItemName"

La consulta:

SELECT
    a."ItemCode",
    b."ItemName"
FROM ITM1 a
INNER JOIN OITM b
    ON a."ItemCode" = b."ItemCode"
WHERE a."PriceList" = 1
  AND IFNULL(a."Price", 0) > 0;

Desde PHP solamente devolvía:

TOTAL: 1

🎯 Aquí quedó localizado el problema.

No era el JOIN.

No era ITM1.

No era OPLN.

No era memoria.

El comportamiento aparecía específicamente al recuperar el contenido de:

OITM."ItemName"

🧠 Una pista importante: los caracteres especiales

Durante las pruebas también apareció algo muy revelador.

En SAP HANA el texto era:

REV 14±2

pero PHP recibía:

REV 14±2

Eso indicaba claramente un problema de codificación de caracteres entre:

SAP HANA
   ↓
HDBODBC
   ↓
PHP
   ↓
JSON
   ↓
DataTables

Además, el problema no generaba un error ODBC tradicional.

Por eso era especialmente difícil de localizar.


🐧 Solución en Linux Mint

Primero se comprobó la configuración de unixODBC:

odbcinst -j

La salida mostraba:

DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
USER DATA SOURCES..: /home/usuario/.odbc.ini

El DSN utilizado estaba en:

/etc/odbc.ini

La configuración original era:

[mi_dsn_hana]
Driver=SAP HANA
ServerNode=SERVIDOR_HANA:30015

Se añadió:

CHAR_AS_UTF8=true

Quedando:

[mi_dsn_hana]
Driver=SAP HANA
ServerNode=SERVIDOR_HANA:30015
CHAR_AS_UTF8=true

El driver utilizado estaba definido en:

/etc/odbcinst.ini

con:

[HANA_ODBC]
Description=SAP HANA ODBC Driver
Driver=/ruta/al/cliente-hana/libodbcHDB.so

🔎 Comandos útiles para localizar ODBC en Linux

Para saber dónde están los archivos:

odbcinst -j

Para ver el DSN:

cat /etc/odbc.ini

Para ver los drivers:

cat /etc/odbcinst.ini

Para buscar configuraciones relacionadas con HANA:

grep -RniE "HDB|HANA|CHAR_AS_UTF8|char_as_utf8|ServerNode|Driver" \
/etc/odbc.ini \
/etc/odbcinst.ini \
~/.odbc.ini 2>/dev/null

Para listar los DSN:

odbcinst -q -s

🪟 Solución en Windows 10

En Windows se comprobó primero la arquitectura de PHP:

php -i | findstr /I "Architecture"

Resultado:

Architecture => x64

Por lo tanto se utilizó el administrador ODBC de 64 bits:

C:\Windows\System32\odbcad32.exe

El DSN utilizado era:

mi_dsn_hana

y estaba registrado en:

HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana

Al consultar el registro:

reg query "HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana" /s

se encontró, entre otros valores:

Driver              C:\Program Files\SAP\hdbclient\libodbcHDB.dll
Host                SERVIDOR_HANA
PortNumber          30015
EnableArrayFetch    1
ArrayFetchSize      5000

💾 Antes de modificar el registro: hacer respaldo

Siempre es recomendable guardar una copia del DSN.

reg export "HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana" "%USERPROFILE%\Desktop\mi_dsn_hana-backup.reg"

Windows responderá:

La operación se completó correctamente.

Así se dispone de un archivo de respaldo en el escritorio.


⚙️ Agregar CHAR_AS_UTF8 en Windows

Se agregó directamente al registro:

reg add "HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana" /v CHAR_AS_UTF8 /t REG_SZ /d true /f

Para comprobarlo:

reg query "HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana" /v CHAR_AS_UTF8

El resultado esperado es:

CHAR_AS_UTF8    REG_SZ    true

✅ Configuración aplicada correctamente.


🔄 Reiniciar Apache

Después de modificar el DSN, es importante reiniciar Apache/XAMPP para que PHP cree una nueva conexión ODBC.

Desde XAMPP:

Stop Apache
Start Apache

O, si Apache está instalado como servicio:

net stop Apache2.4
net start Apache2.4

El nombre del servicio puede variar según la instalación.


⚙️ ¿Qué pasó con EnableArrayFetch?

El DSN de Windows ya tenía:

EnableArrayFetch=1

y:

ArrayFetchSize=5000

Durante las pruebas se decidió mantenerlo activado.

La configuración final quedó:

CHAR_AS_UTF8=true
EnableArrayFetch=1

Esto mismo se mantuvo tanto en Linux como en Windows.

No fue necesario desactivar EnableArrayFetch.


💻 La función PHP no necesitó cambios especiales

Una vez solucionada la configuración del ODBC, la consulta PHP puede seguir siendo una consulta normal:

static public function ctrMostrarListaPrecio($conn, int $id)
{
    $sql = '
        SELECT
            a."ItemCode",
            b."ItemName",
            a."Price",
            a."PriceList",
            c."ListName"
        FROM ITM1 a
        INNER JOIN OITM b
            ON a."ItemCode" = b."ItemCode"
        INNER JOIN OPLN c
            ON a."PriceList" = c."ListNum"
        WHERE a."PriceList" = ?
          AND IFNULL(a."Price", 0) > 0
    ';

    $stmt = odbc_prepare($conn, $sql);

    if (!$stmt) {
        throw new Exception(
            'Error ODBC prepare: ' . odbc_errormsg($conn)
        );
    }

    if (!odbc_execute($stmt, [$id])) {
        throw new Exception(
            'Error ODBC execute: ' . odbc_errormsg($conn)
        );
    }

    $data = [];

    while ($row = odbc_fetch_array($stmt)) {

        $data[] = [
            'ItemCode'  => $row['ItemCode'],
            'ItemName'  => $row['ItemName'],
            'Price'     => (float) $row['Price'],
            'PriceList' => (int) $row['PriceList'],
            'ListName'  => $row['ListName'],
        ];
    }

    return $data;
}

La solución estuvo en la configuración del HDBODBC, no en cambiar la consulta.


🧪 Otra prueba importante: comprobar si era memoria

También se revisó la memoria de PHP:

echo memory_get_usage(true);

Durante las pruebas se obtuvo aproximadamente:

2097152 bytes

Y el pico:

2097152 bytes

No hubo incremento importante al procesar los registros.

Por lo tanto:

❌ No era falta de memoria.

❌ No era que 902 registros fueran demasiados.

❌ No era el while.

❌ No era odbc_prepare().

❌ No era odbc_execute().

❌ No era el JOIN.

✅ El comportamiento estaba relacionado con el tratamiento de caracteres por HDBODBC.


🛠️ Diagnóstico recomendado para futuros problemas

Cuando PHP y SAP HANA devuelvan menos registros de los esperados, no hay que asumir inmediatamente que el problema está en SQL.

Una buena estrategia es ir agregando las columnas progresivamente.

Primero:

SELECT
    "ItemCode"
FROM ITM1
WHERE "PriceList" = 1;

Después:

SELECT
    a."ItemCode",
    b."ItemCode"
FROM ITM1 a
INNER JOIN OITM b
    ON a."ItemCode" = b."ItemCode"
WHERE a."PriceList" = 1;

Después:

SELECT
    a."ItemCode",
    b."ItemName"
FROM ITM1 a
INNER JOIN OITM b
    ON a."ItemCode" = b."ItemCode"
WHERE a."PriceList" = 1;

De esta forma puedes identificar exactamente qué columna provoca el comportamiento.

En este caso:

ITM1                         → 902
ITM1 + OITM.ItemCode         → 902
ITM1 + OITM.ItemName         → 1

Ese pequeño experimento permitió descubrir rápidamente que había que investigar el tratamiento del campo de texto.


📌 Configuración final

Después de todas las pruebas, la configuración que quedó funcionando fue:

CHAR_AS_UTF8=true
EnableArrayFetch=1

Linux Mint

Archivo:

/etc/odbc.ini

Configuración:

[mi_dsn_hana]
Driver=SAP HANA
ServerNode=SERVIDOR_HANA:30015
CHAR_AS_UTF8=true

Windows 10

Registro:

HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana

Valor:

CHAR_AS_UTF8    REG_SZ    true

Manteniendo:

EnableArrayFetch    REG_SZ    1

✅ Conclusión

El problema parecía inicialmente un problema de PHP porque:

while ($row = odbc_fetch_array($stmt))

solamente recuperaba un registro.

Sin embargo, las pruebas demostraron que SAP HANA sí tenía 902 registros y que ODBC podía recorrerlos correctamente mientras no se solicitara directamente el contenido de ItemName.

La pista definitiva fue que los textos con caracteres especiales aparecían alterados, por ejemplo:

14±2

se recibía como:

14±2

La corrección fue configurar el controlador de SAP HANA para trabajar con UTF-8:

CHAR_AS_UTF8=true

manteniendo:

EnableArrayFetch=1

La configuración fue aplicada tanto en Linux Mint como en Windows 10.

💡 Moraleja: cuando PHP + ODBC + SAP HANA devuelve menos filas de las esperadas, especialmente al trabajar con campos NVARCHAR o textos con caracteres especiales, conviene revisar primero la configuración del HDBODBC antes de modificar la consulta o asumir que existe un problema de memoria.


🚀 Resumen rápido

Linux

sudo cp /etc/odbc.ini /etc/odbc.ini.bak
sudo nano /etc/odbc.ini

Agregar:

CHAR_AS_UTF8=true

Windows 10

Respaldar:

reg export "HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana" "%USERPROFILE%\Desktop\mi_dsn_hana-backup.reg"

Agregar:

reg add "HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana" /v CHAR_AS_UTF8 /t REG_SZ /d true /f

Comprobar:

reg query "HKLM\SOFTWARE\ODBC\ODBC.INI\mi_dsn_hana" /v CHAR_AS_UTF8

Resultado esperado:

CHAR_AS_UTF8    REG_SZ    true

Configuración final:

CHAR_AS_UTF8=true
EnableArrayFetch=1

🔧 PHP + SAP HANA + ODBC + UTF-8: un pequeño parámetro del driver puede hacer toda la diferencia.

¿Qué es Navidrome y Cómo Instalarlo Nativamente en CachyOS / Arch Linux 🎵

Entrada fija

Si eres amante de la música y prefieres mantener el control de tu propia colección de archivos MP3, FLAC o WAV, seguro te has topado con este dilema: ¿cómo escuchar tu música local en el celular o la laptop sin andar pasando archivos por USB? 📁📲

Aquí es donde entra Navidrome, una de las mejores herramientas de código abierto para transformar tu PC en tu propio servidor de streaming estilo Spotify. 🎧✨

En este artículo te explicamos qué es, para qué sirve y los comandos paso a paso para instalarlo nativamente en CachyOS (o cualquier sistema basado en Arch Linux).

🚀 ¿Qué es Navidrome?

Navidrome es un servidor de medios y reproductor de música de código abierto, ultraligero y muy rápido. Está diseñado para permitirte explorar y escuchar tu colección de música almacenada en tu computadora o servidor desde cualquier lugar a través de un navegador web o aplicaciones móviles. 🌐🎶

Está escrito en Go, lo que significa que consume muy poca memoria RAM y CPU, rindiendo a la perfección tanto en tu PC de escritorio como en una laptop o Raspberry Pi.

💡 ¿Para qué sirve y por qué deberías usarlo?

  • Centralizar tu música: Guardas tu colección en tu disco duro y la escuchas en todos tus dispositivos.
  • Escuchar en el celular sin gastar almacenamiento: Transmites tus canciones por Wi-Fi o internet en lugar de saturar la memoria de tu teléfono. 📱
  • Compatibilidad con apps móviles: Es compatible con la API de Subsonic, lo que te permite usar clientes como Symfonium o Subtracks en Android, y Amperfy en iOS.
  • Privacidad total: Tus hábitos de escucha son 100% privados y ningún servicio te va a eliminar canciones por derechos de autor. 🛡️
  • Transcodificación en tiempo real: Si tienes archivos FLAC pesados, puede convertirlos a MP3 al vuelo para no gastar tus datos móviles. 📶

🛠️ Guía de Instalación Nativa en CachyOS / Arch Linux

Si usas CachyOS, la forma más limpia de tener Navidrome es mediante una instalación nativa con systemd. A continuación tienes el paso a paso en terminal:

1. Instalar Navidrome desde AUR

Usa el helper paru (incluido por defecto en CachyOS) para compilar e instalar el paquete binario:

Bash

paru -S navidrome-bin

2. Crear carpetas y ajustar permisos

Creamos la carpeta donde Navidrome guardará su base de datos y le asignamos los permisos al usuario de sistema navidrome:

Bash

# Crear directorio de datos
sudo mkdir -p /var/lib/navidrome

# Asignar propietario al usuario de navidrome
sudo chown -R navidrome:navidrome /var/lib/navidrome

También debemos dar permisos de lectura para que Navidrome pueda acceder a la carpeta donde guardas tu música (ajusta si la tienes en tu /home):

Bash

chmod o+rx /home/$USER
chmod -R o+rX /home/$USER/Musica

3. Configurar el archivo navidrome.toml

Abre el archivo de configuración con el editor de texto nano:

Bash

sudo nano /etc/navidrome/navidrome.toml

Agrega o modifica los siguientes parámetros (asegúrate de cambiar tu_usuario por tu nombre de usuario real en CachyOS):

Ini, TOML

# Ruta a tu colección de música
MusicFolder = "/home/tu_usuario/Musica"

# Ruta donde se guardará la base de datos
DataFolder = "/var/lib/navidrome"

# Puerto de red predeterminado
Port = 4533

# Escaneo automático de nuevos archivos cada hora
ScanSchedule = "@every 1h"

# Idioma por defecto
DefaultLanguage = "es"

Tip: Guarda los cambios presionando Ctrl + O, confirma con Enter y sal con Ctrl + X.

4. Activar el servicio Systemd

Habilita el servicio para que Navidrome inicie automáticamente con tu sistema operativo:

Bash

sudo systemctl enable --now navidrome

Para verificar que todo está funcionando correctamente:

Bash

sudo systemctl status navidrome

🌐 Primer acceso y configuración inicial

  1. Abre tu navegador e ingresa a: http://localhost:4533
  2. La primera pantalla te pedirá crear una cuenta de administrador (asigna tu usuario y contraseña).
  3. ¡Listo! Navidrome comenzará a escanear tu carpeta de música de forma automática. 🚀

📌 Conclusión

Instalar Navidrome de forma nativa en CachyOS es sumamente rápido y eficiente. Con un consumo de recursos casi nulo y una integración perfecta con systemd, tendrás tu propia plataforma de música privada accesible desde cualquier dispositivo. ¡Toma el control de tus archivos digitales hoy mismo! 🎧🔥

🚀 ¡CACHYOS AGOSTO 2026 YA ESTÁ AQUÍ! La Actualización Máxima de Rendimiento Linux que lo Cambia Todo 🔥

Entrada fija

Meta Descripción SEO: Descubre todas las novedades de la actualización de CachyOS Agosto 2026 (260809). Analizamos la reescritura de Shelly en Zig, el paso a Rust en el Kernel Manager, mejoras en handhelds, soporte experimental para servidores y nuevos entornos de escritorio. ¡La guía más completa en español! 🐧⚡

¡Atención, entusiastas del software libre, gamers de Linux y amantes de la velocidad extrema! 👋🏼

Si pensabas que el equipo de CachyOS se iba a tomar un descanso a mitad de año, estabas muy equivocado. El lanzamiento oficial de CachyOS Agosto 2026 (ISO 260809) acaba de ver la luz, y viene cargado con una cantidad impresionante de optimizaciones, reescrituras de código a lenguajes ultrarrápidos y soporte para nuevo hardware.

CachyOS se ha consolidado como la distribución basada en Arch Linux de mayor rendimiento en el ecosistema, gracias a sus compilaciones de paquetes optimizadas para arquitecturas específicas de CPU (v3, v4, Zen, etc.) y su kernel afinado al milímetro para gaming y multitarea. Pero con la entrega de este mes de agosto, los desarrolladores han ido un paso más allá en cuanto a eficiencia de memoria, herramientas nativas e integración de sistema.

Prepárate tu taza de café ☕, ponte cómodo y acompáñanos a analizar absolutamente todas las novedades de la quinta gran versión del año de CachyOS.

⚡ 1. Shelly se Reconstruye desde Cero: ¡De C# a Zig!

Una de las sorpresas más colosales y esperadas de esta actualización de agosto es la transformación total de Shelly, el gestor de paquetes gráfico por defecto de CachyOS.

  ┌──────────────────────────────────────────────────────────┐
  │                 REVOLUCIÓN EN SHELLY GUI                 │
  ├──────────────────────────────────────────────────────────┤
  │ ⚡ Lenguaje anterior : C# (.NET / Runtime Gestionado)    │
  │ 🚀 Nuevo Lenguaje   : ZIG (Binario Nativo Ultra Puro)   │
  │ 📉 Consumo Memoria  : Reducción masiva de RAM           │
  │ ⏱️ Tiempo de Inicio : Casi Instantáneo                   │
  └──────────────────────────────────────────────────────────┘

¿Por qué el cambio de lenguaje es revolucionario?

En versiones anteriores, Shelly dependía de C# y del entorno de ejecución de .NET, lo que implicaba una carga en memoria y tiempos de inicio aceptables pero no óptimos para el estándar de velocidad de CachyOS.

Al reescribir Shelly completamente en Zig:

  1. Sin runtime pesado: La aplicación ahora es un binario nativo súper ligero.
  2. Consumo de memoria reducido al mínimo: Inicia en un abrir y cerrar de ojos, ideal incluso para hardware con recursos limitados o consolas portátiles.
  3. Nuevas funciones en la Interfaz Gráfica (GUI):
    • Pantalla de bienvenida en el primer inicio.
    • Vista de paquetes en modo lista y cuadrícula.
    • Vista previa de PKGBUILD del AUR con salida de compilación en tiempo real.
    • Pestaña de Utilidades integradas para sincronizar bases de datos, limpiar la caché de paquetes y eliminar paquetes huérfanos con un solo clic.
  4. CLI Repensada: La interfaz de línea de comandos de Shelly ahora permite búsquedas combinadas en repositorios oficiales, AUR, AppImages y Flatpaks, además de importar/exportar copias de seguridad en formato TOML.

🦀 2. La Marea Roja de Rust: Kernel Manager y Cachy-Update

Si Zig fue la estrella para la tienda de aplicaciones, Rust se convierte en el pilar fundamental del corazón del sistema en esta versión de agosto 2026.

Kernel-Manager ahora es 100% Rust

El backend de la herramienta kernel-manager (que te permite cambiar entre kernels optimizados como LTO, BORE, EEVDF o Hardened con total soltura) fue reescrito por completo desde C++ a Rust e integrado directamente en el sistema de detección de hardware chwd-kernel. Esto garantiza cero fugas de memoria y una estabilidad absoluta al instalar o compilar núcleos personalizados.

Cachy-Update Renovado

El applet de la bandeja del sistema para notificar actualizaciones también fue rediseñado:

  • Se rebasó sobre Arch-Update v4.x con su applet reescrito en Rust.
  • Nueva opción --check --enable para activar la comprobación automática e iniciar la bandeja del sistema en un solo comando.
  • Paginación configurable (TrayUpdatesPerPage) para cuando tienes cientos de paquetes por actualizar.
  • El intervalo de verificación por defecto ahora se ajusta inteligentemente a 6 horas para no saturar la red ni la CPU.

🎮 3. Handhelds y Portátiles Gamer: Detección Impecable de Hardware

CachyOS se ha convertido en el sistema operativo favorito para reemplazar SteamOS o Windows en consolas portátiles como la ASUS ROG Ally, Lenovo Legion Go, MSI Claw o la propia Steam Deck.

En la ISO de agosto de 2026, el gestor de controladores chwd introduce un algoritmo mejorado mediante patrones de coincidencia por board_name de la DMI.

  ┌─────────────────────────────────────────────────────────────┐
  │              MEJORAS EN HANDHELDS & HARDWARE                │
  ├─────────────────────────────────────────────────────────────┤
  │ 🎯 Coincidencia exacta por nombre de placa (DMI)            │
  │ 🛠️ Prevención de falsos positivos en computadoras portátiles│
  │ 💻 Manejo elegante de entornos virtuales (VMs)             │
  │ 🎮 Perfiles de controles y frecuencias optimizados        │
  └─────────────────────────────────────────────────────────────┘

Esto resuelve los problemas donde algunas computadoras portátiles gamer se confundían con consolas portátiles, aplicando los perfiles de energía y controladores exactos según tu dispositivo específico.

🖥️ 4. Entornos de Escritorio y Estética: Noctalia, KDE Plasma 6.7 y COSMIC

Para los amantes del personalizar el escritorio (“rice”), CachyOS Agosto 2026 trae una batería de pulido visual y nuevos greeters para iniciar sesión.

┌────────────────────────────────────────────────────────────────────────┐
│                   NOVEDADES EN ESCRITORIOS Y TEMAS                     │
├─────────────────┬──────────────────────────────────────────────────────┤
│ Escritorio      │ Cambio o Mejora Incluida en Agosto 2026              │
├─────────────────┼──────────────────────────────────────────────────────┤
│ Hyprland        │ Adopción de noctalia-greeter y dotfiles Noctalia v5  │
│ Cinnamon        │ Transición a lightdm-slick-greeter                   │
│ COSMIC          │ Adición nativa de cosmic-monitor                     │
│ GNOME           │ Integración de gvfs-dnssd para mejor descubrimiento  │
│ KDE Plasma 6.7  │ Tema Nord actualizado para la nueva suite Plasma     │
│ Mango / Niri    │ Nuevas variantes estéticas Noctalia disponibles      │
└─────────────────┴──────────────────────────────────────────────────────┘

El ascenso de Noctalia

El ecosistema de configuraciones Noctalia cobra aún más fuerza en Hyprland, añadiendo variantes para compositores modernos como Niri y MangoWM, logrando animaciones fluidas como la seda y una gestión de ventanas flotantes sin igual.

🖥️ 5. ¡Sorpresa! Soporte Experimental para CachyOS Server Edition

Aunque CachyOS nació pensado para ser el rey del escritorio y del gaming, el rendimiento de sus núcleos optimizados ha llamado la atención de administradores de sistemas y usuarios de servidores domésticos (Homelabs).

En el instalador de línea de comandos (CLI Installer) de agosto de 2026, se ha agregado soporte experimental para perfiles de instalación Server Edition. Esto permitirá desplegar servidores ultrarrápidos con kernels LTO/BBR, sin interfaz gráfica y con un consumo de recursos en reposo ridículamente bajo.

🛠️ 6. Redes, Red de Espejos y Rendimiento de Audio

No todo son grandes cambios visibles; las mejoras en los cimientos del sistema también son espectaculares:

  1. CachyOS-Welcome con DNS Rework: El test de velocidad para clasificar servidores DNS en la aplicación de bienvenida fue rediseñado. Ahora selecciona con precisión matemática el servidor DNS más rápido para tu zona geográfica.
  2. Rate Mirrors API: cachyos-rate-mirrors utiliza ahora la API oficial de CachyOS, evitando problemas con réplicas desactualizadas o regionales lentas.
  3. Nuevo Espejo Tier 2: Se añade un nuevo servidor espejo en Hungría para mejorar las velocidades de descarga en Europa Central y del Este.
  4. PipeWire Fix: Se añade una sintonización de valores nice en cachyos-settings para resolver de forma definitiva cortes o chasquidos aislados en el servidor de audio PipeWire.

📊 Tabla Comparativa: CachyOS Anterior vs. CachyOS Agosto 2026

ComponenteCachyOS AnteriorCachyOS Agosto 2026 (260809)Ventaja Clave
Shelly (GUI)C# / .NET RuntimeZig NativoCero consumo residual de RAM, inicio instantáneo
Kernel ManagerBackend en C++Reescrito en RustMayor seguridad de memoria e integración con chwd
Cachy-UpdateArch-Update clásicoArch-Update 4.x + Rust AppletVerificaciones cada 6h y paginación en bandeja
Detección HandheldPatrones genéricosFiltro DMI board_nameCero falsos positivos en laptops
Hyprland GreeterSDDM por defectonoctalia-greeterMejor integración visual con temas Noctalia
Perfiles ServerNo disponiblesModo Server (Experimental)Despliegues para Homelabs de alto rendimiento

📖 Guía Paso a Paso: Cómo Actualizar o Instalar CachyOS Agosto 2026

Si ya eres usuario de CachyOS, no necesitas reinstalar el sistema desde cero. Como CachyOS es una distribución de liberación continua (rolling release), estarás al día con un simple comando.

1.1. Actualiza tu Sistema Continuo (Rolling):Para usuarios existentes de CachyOS.

Abre tu terminal favorita (Konsole, Kitty, Alacritty) y ejecuta el comando de actualización global:

Bash

sudo pacman -Syu

Nota: Todo el nuevo ecosistema de Shelly en Zig y las herramientas en Rust se actualizarán automáticamente sin intervención manual.

2.2. Descarga la ISO Fresca de Agosto 2026:Instalación limpia en hardware nuevo o PC limpia.

Si vas a realizar una instalación desde cero, descarga la ISO oficial con fecha 260809 desde la red CDN oficial o espejos de tu región:

  • CDN Global: [https://iso.cachyos.org/desktop/260809/cachyos-desktop-linux-260809.iso](https://iso.cachyos.org/desktop/260809/cachyos-desktop-linux-260809.iso)

3.3. Graba la ISO en un Pendrive USB:Creación del medio de arranque.

Utiliza herramientas recomendadas como Ventoy, BalenaEtcher o el propio comando dd en Linux para flashear tu memoria USB.

4.4. Disfruta de la Nueva Experiencia:Configuración de primera mano.

Inicia la ISO, abre el asistente de bienvenida CachyOS-Welcome, selecciona tu escritorio preferido (Hyprland, KDE, GNOME, Cosmic) y disfruta del rendimiento nativo.

💡 ¿Por Qué CachyOS le está Ganando la Carrera a Otras Distros Arch?

CachyOS no es simplemente “otra distribución con Arch por debajo”. La diferencia radica en su filosofía de optimización desde el compilador:

  • Compilaciones LTO y x86-64-v3 / v4: Mientras que la mayoría de las distribuciones compilan sus paquetes para ser compatibles con procesadores antiguos de hace 15 años, CachyOS ofrece repositorios construidos específicamente para las instrucciones modernas de tus procesadores Intel o AMD.
  • Reescritura activa en lenguajes modernos (Rust & Zig): La decisión de migrar herramientas críticas fuera de runtimes pesados o lenguajes heredados demuestra el compromiso del equipo con la máxima eficiencia energética y velocidad.
  • Atención al mundo Gaming: Con parches como proton-cachyos y ajustes automáticos de memoria virtual, jugar en Linux nunca había sido tan sencillo y rápido.

❓ Preguntas Frecuentes sobre CachyOS Agosto 2026 (FAQ SEO)

¿Tengo que reinstalar CachyOS para tener la versión de Agosto 2026?

No. Si ya tienes CachyOS instalado, solo necesitas ejecutar sudo pacman -Syu en tu terminal. La nueva versión de la ISO sirve únicamente para nuevas instalaciones.

¿Qué pasó con la versión anterior de Shelly en C#?

Ha sido reemplazada por completo por la nueva versión escrita en Zig. Notarás que la aplicación consume mucha menos memoria RAM y abre de forma prácticamente instantánea.

¿Puedo usar CachyOS en consolas como Steam Deck o ROG Ally?

¡Sí, absolutamente! La versión de agosto de 2026 incluye mejoras sustanciales en la herramienta chwd para detectar con precisión el hardware de consolas portátiles y aplicar perfiles de control optimizados.

¿El soporte para servidores ya está listo para entornos de producción?

Actualmente el perfil Server Edition está marcado como experimental en el instalador CLI. Es perfecto para pruebas y Homelabs, pero se sugiere precaución si planeas usarlo en servidores de producción crítica.

🔥 Conclusión: CachyOS Eleva el Listón en Linux

El lanzamiento de CachyOS Agosto 2026 refuerza la posición de esta distribución como el rey indiscutible de la velocidad, la innovación técnica y la elegancia visual en el universo Linux. Reconstruir componentes en Zig y Rust no es solo una moda; es una declaración de intenciones sobre cómo debe construirse un sistema operativo moderno.

Si estabas buscando la excusa perfecta para darle una oportunidad a Arch Linux o llevar el rendimiento de tu PC o handheld al siguiente nivel, esta actualización de agosto es el momento perfecto para dar el salto. 🐧🚀

🎵 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 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.

📦 Cómo Instalar Nextcloud en Linux Mint con Snap (Guía Paso a Paso)

Entrada fija

¿Quieres tener tu propia nube privada en casa o en tu servidor local? Nextcloud es la solución perfecta para almacenar, sincronizar y compartir archivos sin depender de servicios externos como Google Drive o Dropbox.

En esta guía te enseñaré cómo instalar Nextcloud en Linux Mint utilizando Snap, el sistema de paquetes universales que hace que la instalación sea increíblemente sencilla.


📋 Requisitos Previos

  • Linux Mint instalado (cualquier versión reciente)
  • Conexión a internet
  • Acceso de administrador (sudo)
  • Una terminal abierta (Ctrl + Alt + T)

⚠️ Importante: Linux Mint y Snap

Por defecto, Linux Mint bloquea Snap por motivos de política. Así que primero debemos habilitarlo con unos sencillos pasos.


🚀 Pasos de Instalación

1️⃣ Eliminar el bloqueo de Snap

sudo rm /etc/apt/preferences.d/nosnap.pref

2️⃣ Actualizar los repositorios

sudo apt update

3️⃣ Instalar Snap

sudo apt install snapd

4️⃣ Instalar Nextcloud

sudo snap install nextcloud

¡Listo! La instalación tardará unos minutos. Nextcloud incluye automáticamente:

  • ✅ Servidor Apache
  • ✅ PHP 8.1
  • ✅ MySQL 8
  • ✅ Redis para caché

🌐 Acceder a Nextcloud

Una vez instalado, abre tu navegador y visita:

  • Localmente: http://localhost
  • Desde otros dispositivos en tu red: http://tu-ip-local

Para conocer tu IP local:

hostname -I

🔧 Si cambiaste de IP (por DHCP)

Es posible que necesites agregar tu IP como dominio confiable:

sudo nextcloud.occ config:system:set trusted_domains 1 --value=$(hostname -I | awk '{print $1}')

🔑 Crear Cuenta de Administrador

En tu primera visita a Nextcloud, se te pedirá que crees:

  • 👤 Nombre de usuario
  • 🔒 Contraseña de administrador

¡Guarda estos datos en un lugar seguro!


🛠️ Comandos Útiles para la Gestión

ComandoFunción
sudo snap start nextcloudIniciar Nextcloud
sudo snap stop nextcloudDetener Nextcloud
sudo snap restart nextcloudReiniciar Nextcloud
sudo snap services nextcloudVer estado del servicio
sudo snap logs nextcloudVer logs de errores
sudo snap set nextcloud ports.http=8080Cambiar puerto HTTP
sudo nextcloud.enable-httpsHabilitar HTTPS con Let’s Encrypt
sudo nextcloud.occ statusVer estado de Nextcloud

🔐 Restablecer Contraseña de Administrador

Si olvidaste la contraseña de admin:

sudo nextcloud.occ user:resetpassword admin

🖥️ Acceso a Almacenamiento Externo

Si necesitas usar discos externos montados en /media o /mnt:

sudo snap connect nextcloud:removable-media

🎯 Ventajas de Usar Snap para Nextcloud

  • ✅ Instalación sencilla en un solo comando
  • ✅ Actualizaciones automáticas sin complicaciones
  • ✅ Todo incluido (servidor web, base de datos, caché)
  • ✅ Fácil de gestionar con comandos Snap

❓ Solución de Problemas Comunes

No puedo acceder a Nextcloud

  1. Verifica que el servicio esté activo: sudo snap services nextcloud
  2. Comprueba los puertos disponibles: sudo ss -tulpn | grep snap.nextcloud
  3. Revisa los logs en busca de errores: sudo snap logs nextcloud | tail -20

El puerto 80 ya está en uso

Cambia el puerto HTTP:

sudo snap set nextcloud ports.http=8080

La IP cambia constantemente

Agrega el nuevo IP como dominio confiable (como se explicó arriba).


🎉 ¡Listo!

Ahora tienes tu propio servidor de nube privada funcionando en Linux Mint. Puedes:

  • 📁 Almacenar archivos
  • 📱 Sincronizar con el móvil (aplicación Nextcloud)
  • 👥 Compartir carpetas con otros usuarios
  • 🔄 Sincronizar calendarios y contactos

📚 Recursos Adicionales


¿Te ha sido útil esta guía? Déjame tu comentario y compártela con otros usuarios de Linux. ¡La privacidad y el control de tus datos es cosa de todos! 💪


🔖 Etiquetas

#Nextcloud #LinuxMint #Snap #NubePrivada #SelfHosting #Linux #Tecnología #Almacenamiento #SeguridadDigital

🚀 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.

🚀 Implementa tu propio sistema de autorización de comprobantes SAP con CodeIgniter 4 y ODBC (Guía práctica + beneficios)

Entrada fija

📝 Por: julio 101290
Especialista en integraciones SAP – PHP – CodeIgniter

¿Cansado de los atascos en la aprobación de gastos, viáticos y facturas? ¿Los comprobantes se pierden en correos electrónicos o en papeles que nunca llegan? En este artículo te muestro cómo construí un módulo de autorización de comprobantes conectado directamente a SAP HANA usando CodeIgniter 4, ODBC y tecnologías web modernas. Además, te cuento los beneficios reales que obtendrás.


📌 Índice

  1. El problema de siempre: autorización manual
  2. La solución técnica: arquitectura limpia y directa
  3. Beneficios clave (✅ productividad, ✅ seguridad, ✅ movilidad)
  4. Código y componentes principales
  5. Lecciones aprendidas (y errores que evitar)
  6. Mejoras futuras y recomendaciones
  7. Conclusión: ¿por qué deberías implementarlo ya?

1. El problema de siempre: autorización manual 📄❌

Imaginemos el día a día:

  • Un empleado genera un comprobante de gasto en SAP (ej. CV__300000366).
  • El comprobante queda con estado U_Status = 2 (pendiente de autorización).
  • El autorizador recibe un correo, imprime, firma, escanea… o peor, usa un Excel compartido.
  • Contabilidad tarda días en enterarse de la aprobación.
  • No hay trazabilidad: ¿quién aprobó? ¿cuándo? ¿por qué?

🔴 Resultado: retrasos, errores, falta de control y equipos frustrados.


2. La solución técnica: arquitectura limpia y directa 🏗️

Decidí construir una interfaz web que se conecte directamente a las tablas de usuario de SAP (@QSYS_GLO_VOUC y @QSYS_GLO_VODE) usando ODBC. No necesitamos API intermedias ni modificar el núcleo de SAP.

🧱 Stack tecnológico elegido

Componente¿Por qué?
CodeIgniter 4Ligero, rápido, con excelente soporte para ODBC y JSON
ODBCConexión nativa a SAP HANA; sin controladores adicionales complicados
DataTablesTablas dinámicas con búsqueda, ordenamiento y paginación server-side
SweetAlert2Diálogos modernos para confirmar autorizaciones
Bootstrap 4Diseño responsivo (funciona en móvil, tableta y escritorio)
jQuery + AJAXComunicación asíncrona sin recargar la página

🔄 Flujo de trabajo

  1. El autorizador ingresa a la URL /admin/refundsauth.
  2. Se carga una DataTable con todos los comprobantes pendientes (U_Status = 2).
  3. Por cada fila, botones: Autorizar y Detalle.
  4. Al hacer clic en Detalle, se abre un modal responsivo que muestra las líneas del comprobante (tabla VODE).
  5. Al hacer clic en Autorizar, se confirma con SweetAlert y se envía una petición AJAX que actualiza U_Status = 4 directamente en SAP.
  6. La fila desaparece de la tabla y queda registrado en una bitácora local.

Todo en tiempo real, sin papeles, sin correos, sin pérdidas.


3. Beneficios clave (✅ productividad, ✅ seguridad, ✅ movilidad)

🚀 Velocidad y productividad

  • De días a segundos: la autorización se hace con un clic.
  • El autorizador ve solo lo que le corresponde (filtros, búsqueda, orden).
  • Autorización masiva (se puede implementar fácilmente).

🔒 Trazabilidad y auditoría

  • Cada autorización queda registrada en la tabla log con usuario, fecha y detalles.
  • SAP conserva el histórico de U_Status (si se audita, se sabe cuándo cambió a 4).
  • Evita fraudes o aprobaciones sin conocimiento.

📱 Acceso móvil y responsivo

  • El diseño con Bootstrap y DataTables se adapta a cualquier dispositivo.
  • El modal de detalle tiene scroll horizontal (ideal para ver muchas columnas).
  • Los gerentes pueden aprobar gastos desde el móvil mientras viajan.

🧩 Integración sin fricción con SAP

  • No se necesita licencia adicional de Service Layer.
  • Las tablas @... son de usuario → se pueden leer/escribir con ODBC con permisos estándar.
  • La actualización es inmediata y consistente.

🛡️ Seguridad basada en roles

  • Cada usuario del sistema se vincula con un sapuser autorizador (tabla user_sap_link).
  • Solo los usuarios con el permiso adecuado pueden ver y autorizar.

💰 Bajo costo y rápido desarrollo

  • Solución implementada en menos de una semana.
  • Código 100% reutilizable y extensible.
  • No requiere comprar add‑ons caros de terceros.

4. Código y componentes principales (fragmentos clave) 🧩

Aquí te muestro las partes más importantes del controlador RefundsAuthController.php.

📡 Conexión ODBC y consulta de pendientes

$conn = odbc_connect($dataConect['nameODBC'], $dataConect['userODBC'], $dataConect['passwordODBC']);
$tableName = '"' . $dataConect['companyDB'] . '"."@QSYS_GLO_VOUC"';
$sql = "SELECT * FROM $tableName WHERE \"U_Status\" = 2 ORDER BY \"U_Date\" DESC";
$result = odbc_exec($conn, $sql);

✏️ Autorización (update directo)

$sqlUpdate = "UPDATE $tableName SET \"U_Status\" = 4 WHERE \"Code\" = $code";
odbc_exec($conn, $sqlUpdate);

📋 Detalle responsivo (modal con scroll)

$.ajax({
    url: base_url + '/admin/servicelayer/refundsauth/showVoucherDetails',
    data: JSON.stringify({ code: code }),
    success: function(resp) {
        var html = '<div class="table-responsive">' +
                   '<table class="table table-sm table-bordered">' +
                   // ... cabeceras y filas ...
                   '</table></div>';
        $('#modalVoucherDetailsBody').html(html);
    }
});

💡 El código completo lo puedes encontrar en mi repositorio de GitHub (link al final).


5. Lecciones aprendidas (y errores que evitar) 🧠

❌ Error 1: Nombres de tablas con @ sin comillas dobles

Solución: Siempre usar "DBNAME"."@TABLA". HANA es sensible a mayúsculas/minúsculas.

❌ Error 2: Usar LIMIT en ODBC sin ROW_NUMBER()

Solución: Emplear la función analítica ROW_NUMBER() OVER (ORDER BY ...) y filtrar por rn.

❌ Error 3: El modal se quedaba en “Cargando…”

Causa: Los IDs del contenedor en el modal no coincidían con los del JavaScript.
Solución: Sincronizar id="modalVoucherDetailsBody" en el HTML y en el JS.

❌ Error 4: La tabla no hacía scroll en móvil

Solución: Envolver la tabla en <div class="table-responsive"> y dar a la tabla un min-width: 700px mediante CSS.

❌ Error 5: Caracteres extraños en JSON

Solución: Aplicar utf8ize() recursivo a cada fila antes de enviarla.


6. Mejoras futuras y recomendaciones 🧪

Si quieres llevar el sistema al siguiente nivel, considera:

  • Autorización por lotes (seleccionar varios y aprobar con un botón).
  • Notificaciones por correo o WhatsApp cuando llegue un nuevo comprobante.
  • Rechazo con motivo y notificación al empleado.
  • Dashboard de indicadores (tiempo promedio de autorización, montos aprobados, etc.).
  • Firma digital para cumplir normativas.
  • Integración con SAP Business Workflow (si la empresa lo requiere).

7. Conclusión: ¿por qué deberías implementarlo ya? 🎯

La combinación CodeIgniter 4 + ODBC + DataTables permite construir en pocos días un sistema de autorización de comprobantes que:

  • Reduce drásticamente los tiempos de espera.
  • Elimina el papeleo y los correos perdidos.
  • Brinda movilidad a los aprobadores.
  • Aporta transparencia y auditoría.
  • Se integra de forma nativa con SAP sin costes adicionales.

¿Tu empresa sigue aprobando gastos con firmas manuales y hojas de cálculo?
Es hora de dar el salto a la automatización web. Yo ya lo hice para varios clientes, y los resultados han sido increíbles: +80% de agilidad, 0 errores de registro y aprobaciones desde el móvil.


🔗 Recursos adicionales


📢 Comparte este artículo si te ha resultado útil
♻️ ¿Conoces a alguien que todavía autoriza comprobantes en papel? Etiquétalo en los comentarios.

#SAP #CodeIgniter #ODBC #AutorizaciónDeGastos #PHP #DesarrolloWeb #TransformaciónDigital

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

Página 1 de 16

Creado con WordPress & Tema de Anders Norén