Novedades
63 versiones publicadas. Las dos últimas van abiertas; el resto
se despliegan.
1.27.22026-08-16
La versión anterior dejó puesto el mecanismo para actualizarse sin acceso al código, pero nadie lo llamaba: el botón del panel seguía sabiendo solo de git. Esto lo termina, y con ello cierra el agujero de fondo — hasta hoy, el único que podía actualizar su NAS era quien escribió el programa.
Actualizarse sin acceso al código
- El botón «Actualizar ahora» funciona sin repositorio. Pregunta al servidor de versiones cuál es la última, se la descarga, comprueba su SHA-256 y la instala. Sin cuenta, sin token y sin git: solo salida a internet.
- La pantalla ya no manda a reinstalar el NAS. Sin git decía «esta instalación no viene de un checkout, reinstala con git clone». Era el mensaje que se encontraba TODO el que instalaba desde la ISO, sin tener nada roto. Ahora enseña la versión publicada si hay una, «está al día» si no la hay, y el error de git solo cuando de verdad hay un repositorio averiado que mirar.
- El automático también. Avisar (y aplicar solo) miraba únicamente los commits pendientes de git, que en una instalación normal valen cero para siempre: podían publicarse diez versiones y no enterarse de ninguna. Y los interruptores del automático estaban dentro de la parte de git, así que quien instalaba desde la ISO ni siquiera podía activarlos.
- Si no se sabe qué versión hay instalada, se dice. Sin el archivo
VERSION no hay con qué comparar, y de no poder comparar salía «estás al día» — la mentira más difícil de detectar de todas. Ahora lo cuenta con esas palabras.
- El paquete descargado se comprueba dos veces, una en el panel y otra en el instalador, porque entre las dos hay un cambio de proceso y de usuario. Si no cuadra, no se toca nada y el mensaje distingue «lo que llegó no es lo que el servidor anunció» de «falló la descarga». Un paquete que ni se puede leer también para el proceso, en vez de colarse como «no he visto nada raro».
- Y el actualizador se relanza desde la versión nueva. La actualización la dirige el código que se está instalando —con sus migraciones y sus pasos—, no el viejo, que es el que estaba corriendo.
La ISO deja de caducar
- La ISO ya no ofrece instalar un Debian pelado. Las entradas de LGM-OS se añadían ENCIMA de las de Debian en vez de sustituirlas, así que debajo seguían estando «Install Debian 12», «Graphical install», «Advanced options» y «Rescue mode». Elegir la primera de esas —cosa que pasó— deja el equipo formateado y SIN el producto, que es la peor manera posible de terminar una instalación. Ahora el menú tiene exactamente dos entradas, las dos de LGM-OS: red automática o IP fija. Y la construcción de la imagen se para si alguna vez vuelve a colarse una de Debian.
- Se pregunta también la contraseña de root, además del nombre del equipo y del usuario y contraseña de consola. Y como Debian solo mete al primer usuario en el grupo «sudo» cuando root está deshabilitado, ahora lo hace el instalador: sin eso, quien acaba de instalar el NAS no podría ni ejecutar «sudo lgm update» en su propio equipo.
- La imagen se puede construir aunque Debian tenga los listados caídos. La búsqueda de la netinst leía un índice HTML; el día que ese servidor contesta «500 Internal Server Error» —pasó— la construcción moría con un «¿sin red?» teniendo red de sobra. Ahora, si el listado falla, se prueban las direcciones directamente; y
LGM_DEBIAN_ISO_URL salta la búsqueda entera.
- El resumen SHA-256 de la ISO ya no se queda viejo. Estaba en una variable escrita a mano, que conserva el valor de la imagen ANTERIOR en cuanto publicas una nueva: quien comparase su descarga con él concluiría que está corrupta. Ahora se lee del archivo
.sha256 que se sube junto a la imagen.
- La imagen ya no lleva el sistema dentro. Lleva cincuenta líneas que, al primer arranque, descargan la última versión publicada y la instalan. Una ISO grabada hoy instalará la versión que haya dentro de dos años, y no hay que volver a subirla en cada publicación. El precio, dicho claro: el primer arranque necesita red; sin ella el equipo queda como un Debian normal y lo reintenta solo cada minuto.
- Sin tope de reintentos. La unidad de primer arranque se rendía PARA SIEMPRE tras tres intentos en media hora. Con la imagen anterior se aguantaba porque el código venía dentro; con esta, encender el equipo mientras el router se reinicia lo dejaba en un Debian pelado sin que nadie supiera por qué.
- Instalar sin git ya copia el código. El instalador solo ponía
/opt/nas/src cuando el origen era un checkout de git. Desde la ISO nueva no lo es, así que el equipo terminaba instalado pero sin saber ni qué versión tenía ni cómo actualizarse. Y el aviso rojo del final —«la actualización desde el panel no estará disponible»— era la última frase que leía quien acababa de instalar, además de ser falsa.
- El NAS pregunta al portal que le grabó su ISO. El primer arranque lo deja escrito en
/etc/lgm-portal y no lo leía nadie: una imagen construida para otro dominio instalaba un equipo que, nada más terminar, se ponía a hablar con un portal distinto del suyo. Todo el mecanismo de «la ISO le dice al equipo de dónde viene» era decorativo.
- Y de fábrica va al dominio propio, no al que regala la plataforma de alojamiento. Con el subdominio del proveedor grabado, el día que el portal se mude todos los equipos ya instalados se quedan sin actualizaciones y sin licencia — y sin forma de avisarles, porque el canal del aviso es justo el que se rompe.
- El panel ya no se contradice a sí mismo. Enseñaba arriba «hay una versión nueva: LGM-OS 1.27.2» y justo debajo un botón «Reinstalar esta versión» y un diálogo que empezaba con «No hay cambios nuevos». Medía las novedades solo por el camino de git, que en una instalación normal vale cero siempre.
- Instalar sin git no arrastra la basura de compilación. La copia se llevaba
node_modules —unos 400 MiB que npm rehace solo— al disco del sistema, que es el pequeño.
- El portal no acepta como versión cualquier cosa. Un byte suelto con la cabecera correcta se guardaba y se anunciaba como «la última versión de LGM-OS»: un equipo recién instalado se lo habría descargado, no habría podido descomprimirlo y se habría quedado reintentando para siempre. Ahora se comprueba que sea un
.tar.gz con el instalador dentro.
- «Publicada» solo si el portal dijo que sí.
curl termina con 0 aunque el servidor contestara 401, así que el publicador imprimía el error del portal y a renglón seguido «Publicada. TODOS los NAS pueden actualizarse ya».
- `empaquetar.sh --publicar` funciona. El ejemplo que trae el propio script tomaba
--publicar como carpeta de salida y moría con mkdir: unknown option.
- La ISO publicada no se sustituye por una copia vieja. Con la ruta de la imagen configurada y vacía, la web caía a buscarla en el árbol de código y servía la que hubiera quedado ahí, con el nombre y el aspecto de la nueva. Configurar la ruta es decir dónde está: si ahí no hay nada, no hay ISO publicada.
- La portada de un álbum borrado deja de ser un hueco gris. Al mandar a la papelera la foto que hacía de portada, la tarjeta del álbum se quedaba enseñando el sitio vacío para siempre.
- Documentadas las tres variables del canal (
PORTAL_RELEASE_TOKEN, PORTAL_RELEASES_DIR, PORTAL_ISO_PATH): existían y no estaban en ninguna parte, así que publicar una versión desde la consola era un camino que solo conocía quien lo escribió.
- El paquete de una versión no llevaba las aplicaciones. El actualizador copia las plantillas del Centro de Paquetes desde el código que descarga, y esa carpeta se quedó fuera del paquete. Y no fallaba: la copia se salta sola cuando la carpeta no está, así que un NAS actualizado por el canal nuevo —el que acaba de estrenarse— no habría vuelto a recibir una aplicación nueva jamás, sin un solo error por el que tirar del hilo. Queda una comprobación que compara lo que el actualizador busca en el árbol con lo que el paquete lleva dentro, para que no vuelva a quedarse nada fuera en silencio.
- Y el paquete no lleva ya la basura del equipo de quien empaqueta: se colaban la caché de pytest —150 KB con las rutas locales de quien lanzó las pruebas— y los informes de Playwright con sus capturas, porque esto se arma del árbol tal y como está.
- Publicar una versión no era publicarla: era subirla. Si el repositorio donde se sube es privado —y el del código lo es—, sus archivos solo se descargan con token: todos los NAS a la vez se quedarían con un 404 al actualizarse, y quien publica no se enteraría jamás, porque su comprobación va con su sesión abierta y le sale bien. Ahora, después de subir, se prueba una descarga SIN credenciales, que es como la hará cada equipo; si no se puede, se dice con todas las letras y no se anuncia como publicada.
1.27.12026-08-16
Versión de reparaciones. Salió de una actualización que falló en un NAS de verdad y se revirtió sola: tirando de ese hilo aparecieron el resto, casi todas en el mismo sitio —lo que el panel te dice cuando algo no ha salido bien— y en el móvil. <details> <summary><b>Los 62 arreglos, uno por uno</b> (clic para abrir)</summary>
Actualizar sin sustos
- Una actualización buena ya no se deshace por un aviso. El bloque que explica al final quién no puede entrar al panel moría en cualquier NAS que no tuviera ninguna dirección bloqueada: un
grep sin coincidencias devuelve 1, pipefail lo sube a la asignación y set -e mataba el script —con la versión nueva ya instalada y funcionando—, así que el actualizador la deshacía entera. Ahora todo ese diagnóstico corre aislado: pase lo que pase ahí dentro, la actualización está hecha y no se toca.
- Y si falla, dice DÓNDE. Antes: «La actualización falló (código 1)». Ahora: la fase, la línea de
update.sh y la orden exacta que murió.
- El motivo del fallo llega al registro, no solo a la salida de error. Lanzado por systemd, eso último es el journal: ni
lgm update ni el panel lo veían jamás, así que una actualización revertida se leía como una actualización terminada.
- `lgm update` ya no da por buena una reversión. Terminaba siempre con «Terminado. Versión instalada: X» —y esa X era la versión VIEJA—. Ahora lee el veredicto que deja el actualizador, lo cuenta y sale con error.
- Una interfaz a medias no se instala. Comprobar que existe
index.html no bastaba: cada app del panel viaja en su propio archivo, así que una compilación incompleta —lo típico es que el disco se llene mientras se escribe— arranca perfectamente y falla al abrir cada app. Ahora se comprueban todos los archivos antes de promover nada.
- El primer arranque desde la ISO podía morir sin decir nada. El script que instala LGM-OS en un equipo recién instalado lee del portal la última versión con un
grep. Si el portal contesta cualquier otra cosa —un error, un proxy por medio, un campo que cambia de nombre—, ese grep no encuentra nada, devuelve 1 y, dentro de una asignación con set -e, mata el script AHÍ MISMO: el mensaje claro que hay tres líneas más abajo («El portal no anunció ninguna versión utilizable») no se leía nunca, y el equipo se quedaba instalado sin LGM-OS y sin explicación. Es el mismo fallo que revirtió tu actualización, en un script nuevo; lo cazó la comprobación que quedó puesta entonces.
- El generador de la ISO vuelve a funcionar. Buscaba la Debian 12 más reciente en «current», que ya publica la 13; el respaldo al archivo histórico estaba escrito pero era inalcanzable por el mismo fallo de
grep de arriba, y el instalador decía «¿sin red?» teniendo red.
El móvil, por fin
- El panel abre un 10 % más ligero. Cada app viaja en su propio archivo y se descarga al abrirla… menos Cámaras, que viajaba entera —dos mil novecientas líneas— dentro del archivo principal que descarga todo el mundo nada más entrar. La culpa era de una línea: la pantalla del muro de cámaras (
?camaras=1) se importaba de golpe, y eso arrastra el módulo entero. Ahora se carga aparte, como la consola de las máquinas virtuales. De paso se explica por qué Cámaras era la única app que abría en tu móvil cuando las demás fallaban: no viajaba en su propio archivo, viajaba en el principal.
- El NAS anunciaba una dirección a la que el móvil no puede llegar. El QR de
lgm url, el «Panel web» de la consola y el mensaje final del instalador salían de hostname -I, que devuelve todas las direcciones en el orden que decide el núcleo: en un NAS con Docker la primera suele ser 172.17.0.1, y con máquinas virtuales 192.168.122.1 —direcciones que solo existen dentro del servidor—. Ahora manda la del camino por defecto, y los puentes de Docker, las VM y los túneles quedan fuera.
- «TypeError: Importing a module script failed» en todas las apps. Eran dos fallos encadenados: el
index.html se servía sin Cache-Control, así que el navegador se quedaba con uno viejo que pedía trozos de otra compilación; y un trozo que no existía se contestaba con 200 y la página dentro, de modo que el navegador recibía HTML donde esperaba JavaScript. Ahora el HTML se revalida siempre, los trozos con hash se guardan un año (el panel abre bastante más rápido en el móvil) y un archivo que falta es un 404 honesto.
- El panel sobrevive a su propia actualización. Si al abrir una app el trozo ya no existe —porque el panel se actualizó por debajo—, recarga una vez para coger la versión nueva en lugar de enseñar un error que no dice nada.
- La caché del navegador ya no se puede envenenar. Con el fallo anterior, el service worker se guardaba ese HTML bajo el nombre del trozo y lo servía antes que a la red: el error se volvía permanente y no se curaba ni arreglando el servidor. Ahora comprueba que lo que guarda cuadra con la dirección, tira las copias envenenadas de antes y pide la página siempre a la red.
- «Returned response is null». Cuando el NAS no contestaba y aún no había copia guardada, el service worker devolvía
undefined: eso no es un error de red —que el navegador sabe enseñar y reintentar— sino un error suyo, con un mensaje incomprensible.
- Volver a la app y encontrarla en blanco. Cuando el móvil necesita memoria se lleva por delante la página que está de fondo; al volver, la ventana sigue abierta pero vacía y nadie la recarga. Sin barra de direcciones no había salida. Ahora, si al volver no quedó nada pintado, se recarga sola.
- Al volver, los datos en vivo vuelven contigo. El móvil cierra los WebSockets al irse a segundo plano y la espera entre reintentos crecía hasta 30 segundos: el panel se veía quieto, que es justo lo que parece un cuelgue.
- Con el móvil bloqueado, el panel deja de trabajar. De 25 refrescos automáticos solo uno miraba si había alguien delante. Con varias apps abiertas eran varias peticiones por segundo toda la noche: batería, datos y memoria —la misma cuya falta hace que el sistema mate la página—. Ahora se paran y, al volver, se ponen al día antes de esperar su turno.
- Las ventanas tapadas también. El Monitor mantenía su WebSocket recibiendo una medida por segundo con la ventana minimizada. Cada app sabe ahora si se la está viendo.
- El icono de la pantalla de inicio de iOS, como pide Apple: cuadrado y opaco. El anterior llevaba las esquinas transparentes y el sistema redondeaba lo ya redondeado.
El panel no puede mentir
- «La aplicación ha fallado por dentro» mientras el NAS se actualiza. El panel corre sin privilegios: todo lo que toca el sistema se lo pide a un ayudante que se reinicia con cada actualización. En esa ventana de unos segundos, 38 de las 94 pantallas contestaban un error interno pelado —el mismo mensaje que si el panel tuviera un fallo de verdad—. Las que ejecutan órdenes ya lo traducían; las que leen un archivo del sistema directamente, no. Ahora todas dicen lo que pasa, y distinguen las dos cosas que pueden pasar: si el ayudante no contesta —se está reiniciando— invitan a reintentar en unos segundos; si contesta que no puede hacer algo, enseñan su motivo y no sugieren esperar, porque esperar no arreglaría nada.
- Un ajuste editado a mano por SSH podía tumbar el escritorio. Los ajustes se guardan como archivos JSON y un administrador los abre alguna vez. Si uno quedaba siendo válido pero con otra forma —una lista, un texto o un
null donde va un objeto—, la comprobación de archivos dañados no saltaba (el JSON era correcto) y el código se estrellaba al leerlo: doce sitios se caían así, el escritorio y el Asesor de seguridad entre ellos. Ahora un ajuste con la forma equivocada se aparta igual que uno roto, se sigue con los valores por defecto y queda dicho en el registro y en los avisos, con su archivo guardado al lado por si hay que recuperarlo. Aparte, el archivo de cuentas se lee en CADA petición: si le faltaba su lista de usuarios, el panel entero contestaba «KeyError: users» en las 94 pantallas sin decir de dónde salía. Lo mismo con la lista de sesiones cerradas, que se consulta al validar CADA petición: ahora los cuatro caminos que tocan esos dos archivos (leer cuentas, guardar una, borrarla, revocar una sesión) pasan por la misma puerta, en vez de salvarse solo porque otro los leyera antes.
- Una contraseña con un carácter imposible tumbaba la pantalla de acceso. bcrypt se niega a mirar un texto que lleve un byte nulo dentro, y lo dice levantando un error. Nadie lo recogía: escribir (o pegar) eso en la casilla de la contraseña de un usuario QUE EXISTE devolvía un error interno en vez de «usuario o contraseña incorrectos», y esos intentos además no contaban para el bloqueo automático, porque el contador se quedaba sin ejecutar.
- Y un NAS con las cuentas apartadas ya no se ofrece al primero que pase. Sin cuentas, el panel abre el asistente del primer arranque —correcto en un equipo nuevo, y muy malo en uno que ya tenía dueño y acaba de perder su archivo de cuentas: quien llegara primero se quedaba con él—. Ahora esa puerta no se abre, y quien intente entrar lee lo que pasa de verdad: que el archivo de cuentas no se pudo leer, dónde ha quedado su copia y que se recupera por SSH. Antes eran unos «usuario o contraseña incorrectos» que no llevaban a ninguna parte.
- «Fallo interno del panel» cuando lo que está lleno es el disco. Los ajustes del NAS —usuarios, carpetas, trabajos— se guardan en el disco del sistema. Cuando ese disco se llena, guardar cualquier cosa fallaba con un error interno rematado con un «[Errno 28]»: el mensaje culpaba al panel y no decía qué hacer. Ahora lo dice: no queda espacio, y por dónde empezar a liberarlo. Igual si el disco se ha quedado en solo lectura, que es lo que hace Linux cuando detecta corrupción.
- Una tarea que muere ya no se queda girando para siempre. Borrar un disco, restaurar una copia, reemplazar un disco del volumen, comprimir una carpeta, actualizar el sistema: veinte trabajos de fondo se lanzaban sin la red que los cierra si mueren por sorpresa. Cada uno recoge los fallos que espera —una orden que devuelve error, un disco lleno—, pero bastaba uno que no estuviera en su lista para que el trabajo muriera en silencio: la barra de progreso se quedaba clavada, no se podía descartar, y quien la miraba creía que su disco se estaba borrando cuando hacía media hora que no. Ahora todas terminan diciendo qué pasó, aunque lo que pase no estuviera previsto. La red existía desde hacía tiempo, pero solo la usaban las aplicaciones; ahora hay una prueba que recorre el código y no deja añadir un trabajo sin ella.
- Probar un puerto de un nombre que no existe. En esa casilla se escribe a mano, así que fallar es lo normal: una errata, un equipo apagado que ya no está en el DNS, el propio NAS sin DNS. Salía un error interno pelado. Y contestar «cerrado» habría sido peor, porque no se ha llegado a preguntar a nadie: ahora dice que no se pudo resolver ese nombre.
- Un disco que se marcó para borrar y no llegó a borrarse. Entre marcar el disco y lanzar el borrado se escribía en la auditoría; si esa escritura fallaba —un NAS con el disco del sistema lleno, que es justo cuando uno va a borrar un disco—, ese disco se quedaba «borrándose» hasta reiniciar el servicio, sin ningún botón que lo arreglara.
- Quitar el acceso a las carpetas compartidas se comprueba. Si
smbpasswd -d fallaba, esa persona seguía entrando y el panel la enseñaba revocada. Igual al eliminar a alguien: cuando userdel falla —lo normal es que tenga sesión abierta—, la cuenta de Unix sobrevive con su SSH y su SFTP mientras el panel decía «usuario eliminado».
- Unirse al dominio ya no apaga la entrada al panel. Ese ajuste vive en el mismo documento y se escribía entero, así que volver a unir el equipo lo borraba en silencio: un día, las cuentas del dominio dejaban de poder entrar.
- Guardar una tarea programada ya no retrasa la «última ejecución» de las demás. La pantalla devolvía la lista tal y como la cargó y pisaba las marcas que el planificador había sellado entretanto: una tarea recién ejecutada aparecía como si no hubiera corrido nunca.
- «No hay discos aptos» cuando lo que falla es la petición. Quien va a crear o ampliar un volumen se iba a mirar cables por un error de red.
- Lo que te mandan por un enlace de pedido ya sale al buscarlo. Tres caminos creaban archivos sin avisar al índice —los que recibe un pedido, la versión anterior que se restaura y un texto guardado con un nombre nuevo—, así que no aparecían en el buscador hasta la siguiente pasada. «Lo he recibido y el buscador dice que no existe» es justo la duda que un índice no puede sembrar.
- El buscador ya no dice que no existe lo que no ha podido mirar. Un fallo de la búsqueda se leía como «nada con ese nombre», y quien busca una factura concluye que ya no está.
- La subida por enlace de pedido —la única que puede hacer alguien sin cuenta— respeta ahora la reserva del sistema y escribe en un hilo aparte: antes, un desconocido subiendo medio giga dejaba el panel entero sin responder mientras duraba.
- Los avisos al móvil salen a la vez para todos los dispositivos. Cada envío espera hasta 15 segundos a que conteste el relevo (Google, Apple, Mozilla), así que en fila india un móvil apagado retrasaba a los demás: con cuatro dispositivos, el último se enteraba casi un minuto después. Por ese canal llega «un disco se está muriendo».
- Un ajuste dañado ya no desaparece en silencio. Si el archivo de una configuración se vuelve ilegible —un corte de corriente en el momento justo, el disco del sistema lleno—, el panel lo aparta y sigue con los valores por defecto: eso está bien, mejor arrancar que no arrancar. Lo que no estaba bien es que no lo dijera nadie, y quien entraba se encontraba sus carpetas compartidas vacías o sus cámaras desaparecidas pensando que el NAS se había borrado solo. Ahora sale un aviso con el nombre del archivo apartado, que se puede recuperar a mano.
- Una salida rara de `ip` o de `smartctl` ya no tumba una pantalla. Esos programas cambian su salida entre versiones y distribuciones, y bastaba con que una interfaz sin dirección omitiera un campo (o que la temperatura llegara como texto) para que la pantalla de Red o la de Salud contestaran un 500 — justo cuando estás intentando averiguar qué le pasa al NAS. Ahora se lee lo que se entienda y lo demás es «no se sabe». Salió de pasarles a los analizadores medio millar de entradas raras: cuatro reventaban.
- Una regla estropeada ya no deja el NAS sin cortafuegos. Las reglas guardadas se validaban todas de golpe: una sola de una versión anterior, o editada a mano, lanzaba y se llevaba por delante la lista entera —y con ella la pantalla de Seguridad y la aplicación del cortafuegos al arrancar—. Ahora la rota se salta y se apunta; las demás siguen protegiendo.
- Un vigilante que no puede mirar lo dice. Las revisiones que avisan de un volumen degradado o un disco muriéndose se tragaban cualquier error y volvían en silencio: si
zpool o smartctl dejaban de funcionar, no volvían a avisar nunca. Y en un NAS el silencio del vigilante se lee como «todo bien». Con un matiz: que falte la herramienta —un NAS sin smartmontools— no es una avería, así que eso se apunta en el registro y no se convierte en una alarma cada seis horas; un aviso que sale siempre se acaba ignorando, y este es justo el que no puede ignorarse.
- Limitar el panel a ciertas redes ya no te deja fuera sin avisar. Se comprueba antes de aplicar si la lista excluye al equipo desde el que se está escribiendo —lo que dejaba el panel irrecuperable salvo por SSH— y se dice con la dirección delante.
- La lista de marcas de cámara dice si no se pudo cargar, en vez de dejar el desplegable vacío como si el NAS no conociera ninguna.
Que no se pierda nada
- Las cámaras ya no pueden llenar el volumen hasta cero. La limpieza miraba dos topes POR CÁMARA —los días y los gigas— pero el volumen es uno solo, con Docker y las máquinas virtuales dentro: cuatro cámaras con 200 GB de tope cada una llenan un disco de 1 TB sin que ninguna se pase de lo suyo. Y el grabador escribe con ffmpeg por su cuenta, así que la reserva del sistema —la que corta subidas y copias— nunca lo tocaba. Ahora hay un suelo: por debajo de la reserva se van las grabaciones más antiguas de todas las cámaras, y se dice en Notificaciones cuántas y por qué. Nunca lo protegido a mano ni lo que se está grabando en ese momento; y si no queda nada que borrar, el aviso lo dice tal cual.
- La reserva del sistema cubre ya todo lo que escribe. Subir, copiar un elemento y extraer se cortaban antes de comerse los últimos gigas del volumen —donde viven Docker y las máquinas virtuales—, pero comprimir y «Copiar a» no miraban nada: un zip de una carpeta de fotos, o cuatro mil fotos copiadas de golpe, llenaban el volumen hasta cero. Mover dentro del mismo disco sigue sin pedir sitio, porque no ocupa nada: sería impedir justo la operación con la que se hace hueco.
- Una subida cortada ya no se lleva por delante el archivo que había. El endpoint de subida múltiple escribía directo sobre el nombre bueno: eso deja a cero, en el primer byte, lo que ya estuviera ahí, y si la conexión se corta a mitad —el wifi de un móvil con un vídeo de 5 GB— no queda ni el viejo ni el nuevo. Ahora escribe a un temporal y publica de golpe al terminar, como ya hacía la subida del panel.
Que no te quedes fuera
- «Volver al DNS automático» contestaba con un error interno. Para reconstruir la configuración se le pregunta a
resolvectl qué DNS anuncia el enlace, pero ese programa no está en la lista blanca del ayudante privilegiado: la orden ni se ejecuta, se rechaza antes y el panel devolvía un 500. Justo el botón que se pulsa para deshacer un DNS manual que no funciona — el peor momento para quedarse sin respuesta. Ahora ese dato es lo que siempre debió ser: un extra que quizá no se pueda saber.
- Borrar la configuración de una interfaz también daba un 500 pelado si el ayudante rechazaba la ruta; ahora dice qué pasó, como ya hacía su vecina al guardar.
- Guardar una regla del cortafuegos con el ayudante caído. Solo se recogía el fallo de
nft: si lo que fallaba era el ayudante privilegiado —parado, o negándose a escribir el archivo—, salía un error interno sin explicación. En el cortafuegos es el peor sitio para eso, porque quien lo lee no sabe si su regla quedó puesta o no.
- Un cambio de red que deja el NAS mudo se deshace solo. Es la forma clásica de perder un servidor sin pantalla: una dirección estática mal escrita, un bond con los esclavos cambiados, un DHCP donde no hay servidor… y el panel no vuelve, así que toca ir a buscar un teclado y un monitor. Ahora se guarda la configuración anterior antes de tocar nada y, si alguna interfaz que pedía dirección se queda sin ninguna, se repone lo que había y se explica qué pasó. Se espera de verdad a que el DHCP conteste (hasta 15 s) para no deshacer un cambio que estaba a punto de funcionar, y no se juzga si la dirección es «la buena» —eso no se puede saber desde dentro—: solo si la interfaz se quedó muda.
Que no se congele
- La vigilancia de SSH pedía el diario del sistema sin tope. Cada 30 segundos lee los intentos fallidos para bloquear a quien insiste. Normalmente son cuatro renglones, pero justo cuando importa —un barrido de fuerza bruta, o el panel parado un rato— son cientos de miles: el proceso privilegiado, que es root, los montaba enteros en memoria para que luego el panel los rechazara por tamaño, y como así el punto de lectura no avanzaba, a la vuelta siguiente era todavía más grande. Ahora lee de tanda en tanda.
- Borrar gigabytes ya no congela el panel entero. El backend atiende a todo el mundo con un solo hilo, y ahí dentro se borraban las imágenes de disco de una máquina virtual y los datos de una aplicación al desinstalarla con «borrar también sus datos». Mientras duraba, el panel no respondía a nadie.
En inglés también
- Las alertas del NAS ya salen en inglés. Todo lo que el panel responde pasa por su tabla de traducción, pero las notificaciones se habían quedado casi enteras fuera: quien usa el panel en inglés recibía «Disco /dev/sda fallando», «Pool tank casi lleno» o «Copia de seguridad fallida» en español — y justo en el peor momento para ponerse a traducir. Son 74 textos —el título y el cuerpo de 37 avisos— sobre discos, pools, servicios caídos, cámaras, copias, snapshots, máquinas virtuales, certificados y los archivos que te mandan por un enlace: hoy los tienen todos. Con una comprobación que mira el árbol sintáctico y no deja pasar la alerta nueva que se escriba mañana.
Detalles
- La Galería aguanta un número imposible. Pidiéndole la página que empieza en un número de trescientas cifras, la consulta llegaba entera hasta la base de datos y reventaba ahí («Python int too large»). Ahora se contesta que ese número no es un sitio.
- La configuración de cada cámara ya no promete lo que no hace. Llevaba escrito un
LGM_CAM_DIAS=7 que no leía nadie: la retención la aplica el panel desde su propio estado, no el grabador. Quien abría ese archivo por SSH para entender por qué se borra —o por qué no se borra— lo grabado, leía justo lo contrario.
- Guardar una cámara ya no corta su grabación. El grabador se reiniciaba siempre al guardar, y reiniciar corta el trozo en curso: renombrar una cámara, subir los días de retención o cambiar el tope de gigas dejaba un salto en el vídeo — con cuatro cámaras, cuatro saltos por cada retoque. De todo lo que se guarda, el grabador solo usa la dirección y la carpeta; ahora solo se reinicia si cambia una de esas dos (o si la cámara no estaba grabando y hay que ponerla en marcha).
- El aspa del visor de la Galería sigue el ajuste de lado, como el resto de ventanas y diálogos.
- Nueve tonos de aviso que en modo oscuro se quedaban como parches claros (las variantes de opacidad y los textos naranja, violeta y celeste que no estaban traducidos al tema).
Debajo del capó
- El paquete de una versión no puede traer una puerta de atrás. El canal de versiones nuevo descarga un paquete y lo descomprime como root. Ya comprobaba lo importante —que el SHA-256 cuadre y que nada escriba fuera de su carpeta—, pero al extraer como root los permisos se conservan tal cual: un ejecutable con el bit setuid dentro del paquete dejaría a cualquier usuario del NAS hacerse root con solo lanzarlo. Python lo limpia solo a partir de la 3.12 y el Debian del NAS trae la 3.11, así que se comprueba a mano. Tampoco se aceptan ya nodos de dispositivo ni tuberías: un paquete nuestro son archivos, carpetas y algún enlace.
- El panel se prueba ahora en un móvil, app por app. La avería que te encontraste —todas las apps con «TypeError: Importing a module script failed» menos Cámaras— no se ve abriendo el panel en un ordenador: hay que abrir cada app, en un navegador de móvil, y mirar cuál se rompe. Eso es ahora una prueba automática: entra en el panel con un móvil táctil, abre las doce apps una por una y falla si alguna no abre o si aparece un error de JavaScript. Y las pruebas del panel pasaron a ir de una en una: comparten un solo NAS de prueba, así que en paralelo se pisaban entre ellas y el resultado dependía de cuántos núcleos tuviera el equipo que las lanzara.
- La prueba de humo del panel dejó de mentir. Le daba cinco segundos al asistente del primer arranque y, si el equipo iba cargado y tardaba un poco más, se iba por la rama de «iniciar sesión»: rellenaba usuario y contraseña —que el asistente también tiene— y se quedaba esperando un botón «Entrar» que ahí no existe, hasta agotar el minuto. El panel estaba perfecto y la prueba moría en otra línea contando otra cosa. Ahora espera a que salga una de las dos pantallas y entonces elige.
- El humo de extremo a extremo vuelve a servir para algo: una de sus pruebas se aprobaba a sí misma —cerraba la sesión en vez de la ventana, y daba por bueno que la ventana se cerraba porque desaparecía el escritorio entero—, y a la de métricas en vivo le faltaba la variable sin la cual ningún WebSocket funciona detrás del servidor de desarrollo.
- Y otro que comprueba que ningún WebSocket deja entrar sin sesión. Por esos cinco canales van las métricas, las tareas, el terminal —que se puede elevar a root—, la consola de las máquinas virtuales y el directo de las cámaras. Son la puerta más fácil de olvidar: no se ven como una pantalla y su autenticación se hace a mano en cada uno. Uno abierto no daría ningún error visible; simplemente entregaría datos a quien no debía.
- Un barrido que llama a las 111 pantallas de lectura del panel con una sesión de verdad y exige que ninguna conteste con un error interno. Barre las rutas que el panel registra, no una lista escrita a mano, así que la pantalla que se añada mañana entra sola. Y lleva su propia guarda contra el test que se aprueba solo: si casi ninguna llamada llegara a contestar 200, la prueba falla en vez de dar el visto bueno sin haber probado.
- Comprobaciones nuevas que vigilan por su cuenta: que ninguna tubería de los scripts de despliegue pueda matar una actualización, que ningún borrado grande se haga en el hilo del panel, que el service worker no devuelva nunca
null y que un archivo que falta no se disfrace de página.
1.27.02026-08-15
La Fototeca, ya como una app de verdad
- Los vídeos entran en la Fototeca. Estaban en las mismas carpetas y de la misma tarde que las fotos, y había que salir a Archivos para verlos. Ahora se indexan igual, su miniatura es un fotograma (del segundo 1: el primero de casi cualquier vídeo es negro) y se reproducen en el visor por trozos, sin descargar el archivo entero — un vídeo de 3 GB ya no llena la memoria del móvil ni impide saltar a un minuto concreto.
- Álbumes de verdad, no solo carpetas. Se crean con nombre, se les añaden fotos desde la selección, se renombran, se descargan en un zip y se borran sin tocar un solo archivo del disco. Una foto puede estar en varios álbumes a la vez.
- Favoritas, y un filtro para verlas solas. La estrella se marca desde el visor sin perder el sitio en la lista.
- Visor como debe ser: flechas para pasar de una a otra (y las teclas ← →), girar, acercar, pantalla completa, descargar y un panel con la ruta, la fecha y el tamaño.
- Borrar desde la Fototeca, a la papelera del NAS: lo borrado se recupera desde Archivos.
- Subir fotos y vídeos desde la propia app, a la carpeta que ya está indexada.
- Buscador de duplicados: agrupa lo repetido (mismo tamaño y mismo principio de archivo) y deja borrar las copias, nunca la última que queda.
Que nada se llene ni se pierda
- El espacio vuelve al vaciar la papelera. En Btrfs, borrar deja el hueco dentro de trozos ya reservados: se vaciaban siete gigas y el volumen seguía diciendo que estaba lleno. Ahora se compacta solo, en segundo plano y solo cuando de verdad va apretado.
- Reserva del sistema. Subir, copiar o extraer se cortan con una explicación antes de comerse los últimos gigas: dentro del volumen viven Docker y las máquinas virtuales, y un volumen a cero significa contenedores que no arrancan y un Btrfs que no puede ni borrar.
- El actualizador ya no deja nada caído. Apunta qué servicios estaban en marcha antes (Docker, libvirt, Samba, NFS…) y los devuelve a la vida al terminar; si alguno no vuelve, lo dice con su nombre y el comando para mirarlo.
El panel deja de mentir cuando una orden falla
- La lista manda sobre el código de salida.
lsblk puede terminar con error habiendo impreso todos los discos, smartctl usa un mapa de bits y btrfs falla por un disco raro después de listar todo. El panel tiraba esas salidas buenas y enseñaba «no se pudieron leer los discos», «smartctl no disponible» —seguido del JSON con los discos dentro— o, peor, «no hay pools todavía» con el botón de crear una encima de un volumen lleno de datos.
- «No se pudo comprobar» ya no se pinta como «no hay nada». La pantalla de Almacenamiento lo dice con su motivo y no invita a formatear.
- La versión instalada se ve siempre, y el botón de actualizar también, aunque el panel no consiga comprobar si hay algo nuevo.
- Las carpetas del sistema (
docker, vm) salen en el Panel de control aunque falle el listado de volúmenes: las dos pantallas tienen que coincidir.
El Centro de Paquetes trae más tienda
- Cuatro catálogos públicos, elegibles de un clic, con lo que trae cada uno y lo que pesa la descarga escrito al lado: Community Applications (Unraid, ~2.000 apps), la tienda oficial de CasaOS, Big Bear y CasaOS Play. Antes había que conocer la dirección exacta del feed de otro proyecto y pegarla a mano.
- Big Bear entra de serie (menos de un mega para ~250 recetas más). Las tiendas pesadas se quedan a un clic, que es donde toca preguntar antes de bajar 150 MB.
- La lista de catálogos la manda el servidor, así que deja de estar escrita dos veces —una en el backend y otra en la interfaz— y de despistarse entre las dos.
Iconos y vista previa
- Cinco iconos redibujados: Almacenamiento (compartía el azul de Docker), Copias de seguridad (el escudo con un visto decía «antivirus»), Cámaras (la cúpula parecía un robot aspirador), Panel de control (gris sobre gris siendo la app que más se abre) y Galería (la montaña casi negra se comía el marco).
- La vista previa ya es una ventana: se arrastra por su barra, se estira por la esquina y recuerda tamaño y sitio. Con un vídeo, un diálogo de tamaño fijo no vale para nada.
- En Archivos se ve la foto, no un icono de foto: miniaturas reales de imágenes y vídeos (mismo caché que la Fototeca, pedidas solo al acercarse a la pantalla).
Detalles
- Las pestañas de Archivos se llaman como la carpeta que tienen abierta.
- El Bloc de notas avisa antes de cerrar la ventana con notas sin guardar, no pisa lo que otro haya escrito por SMB (y ofrece guardar de todas formas), respeta los saltos de línea de Windows y ya no se cuelga con un
.md lleno de corchetes.
- Dos avisos que en modo oscuro se veían como barras blancas con el texto invisible.
1.26.02026-08-15
Equipos remotos e imágenes de disco, como una carpeta más
- La carpeta compartida de otro equipo se monta en el NAS. En Archivos, la sección «Equipos remotos» conecta por SMB (un PC con Windows, otro NAS) o NFS: se teclea el equipo, la carpeta y —si las pide— las credenciales, y aparece como una carpeta más del NAS. El Explorador la recorre, el buscador entra y las copias de seguridad pueden usarla de origen: traer los datos del NAS viejo ya no pide SSH. El interruptor de cada conexión la monta y desmonta al vuelo, y sobrevive a los reinicios.
- Las imágenes de disco se abren con un clic. Clic derecho sobre una .iso (o .img) → «Abrir como disco»: se monta de solo lectura y se navega como una carpeta. Se expulsa desde la misma sección de Equipos remotos.
- Las contraseñas de los equipos remotos viven en su archivo con permisos 600, fuera del estado del panel: viajan a la copia de configuración los equipos y carpetas conectados, nunca sus credenciales.
Correcciones de la revisión (pasadas 2 y 3: experiencia y seguridad)
- Soltar un archivo del PC sobre el escritorio ya no se lleva el panel por delante. El navegador interpretaba el gesto como «abrir el archivo aquí» y sustituía el panel entero, con las ventanas y el trabajo a medias.
- El visor de la Fototeca se cierra como todo lo demás. Escape y el clic en el fondo negro ahora cierran (antes solo el aspa); si la imagen grande no llega, se dice en vez de dejar la ruleta girando para siempre; y un mes que falla al cargar ofrece reintentar en vez de mostrar una cuadrícula vacía.
- Activar los avisos en el móvil ya no se puede quedar «Activando…» eternamente. Con un certificado autofirmado sin aceptar, el navegador rechaza el aviso de fondo en silencio; ahora el panel lo detecta y explica qué falta, en vez de colgarse el botón.
- Una contraseña mal escrita ya no bloquea el enlace de pedido. La página pública reenviaba la contraseña errónea una vez por archivo: seis fotos y un typo agotaban los intentos y bloqueaban el enlace diez minutos para todos. Ahora para al primer fallo. La página además va en castellano de verdad (con tildes) y reenviar no duplica las filas.
- La búsqueda (Ctrl+K) responde al teclado siempre. Escape y las flechas seguían solo mientras el foco estaba en el campo; ahora funcionan aunque hayas pinchado una fila, la selección se mantiene a la vista al bajar, y la lista de carpetas se refresca en vez de quedarse con la de la sesión anterior. Con un diálogo abierto, Ctrl+K ya no abre la paleta debajo del velo.
- Los errores se ven y los botones no se doble-pulsan. «Versiones anteriores» ya no disfraza un fallo de red de «no tienes snapshots» (ofrece reintentar); el asistente de copias de equipos explica si la lista de usuarios no cargó (y al Mac le enseña la ruta smb://, no la de Windows); copiar un enlace funciona también en paneles servidos por http; el tope en MB del pedido se puede teclear con calma; y revocar (pedidos y dispositivos) se deshabilita mientras trabaja.
- Seguridad reforzada en las superficies nuevas. Un pedido corta a los 1.000 archivos recibidos (el tope por archivo solo no impedía llenar el disco a base de cantidad); su página pública lleva ahora una política de contenido estricta (nada externo, sin incrustarla en otros sitios); y quedó verificado que todo lo nuevo cuelga del árbol autenticado, respeta la frontera de carpetas compartidas y acota sus entradas.
Correcciones de la revisión (pasada 1: fiabilidad)
- Recibir archivos por un pedido ya no puede pisar nada, ni en el peor caso. Dos personas subiendo a la vez un archivo con el mismo nombre elegían el mismo destino y la segunda subida machacaba la primera en silencio; ahora el nombre se reclama en exclusiva al publicar y quien llega segundo pasa a «nombre (2)».
- Un fallo puntual al entrar ya no puede borrar tu escritorio. Si el panel no conseguía cargar el escritorio guardado (un microcorte, un reinicio del NAS), cualquier cambio posterior guardaba encima el escritorio «de fábrica»: iconos, fondo y ventanas perdidos. Ahora nunca se guarda encima de lo que no llegó a cargarse, y la carga se reintenta sola.
- La cuota del asistente de copias de equipos ahora se aplica de verdad. Se enviaba el punto de montaje donde el sistema esperaba el nombre del volumen: el tope de espacio fallaba siempre, en silencio.
- El vigilante de máquinas virtuales ya no se deja engañar. Un tropiezo de virsh (libvirtd reiniciándose) parecía «ninguna máquina pausada» y disparaba un falso «vuelve a funcionar»; y una máquina que recaía tras reanudarla quedaba silenciada horas por el antirruido. Sin datos no se concluye nada, y una recaída vuelve a sonar al momento.
- El aviso de «la cámara se corta sin parar» ahora dispara de verdad. El cosido automático de cada hora se llevaba los trozos que el recuento contaba: una cámara reiniciándose cada tres minutos nunca llegaba al umbral. Lo cosido se apunta y el recuento del día ya no se pone a cero cada hora (también en la chapa del panel).
- La Fototeca indexa bibliotecas grandes enteras. El tope por pasada contaba también lo ya indexado: más allá de las primeras 20.000 entradas no se pasaba jamás. Y una carpeta ilegible un momento (disco desmontado) ya no vacía su parte del índice.
- Miniaturas y fondos sin procesos fantasma. Un ffmpeg que se atascaba con una imagen corrupta quedaba vivo para siempre (y otro más en cada reintento); ahora se mata al vencer su tiempo. Dos peticiones de la misma miniatura tampoco pueden corromperse entre sí.
- Los avisos al móvil aguantan un dispositivo problemático. Un fallo de red o una suscripción rota cortaba el reparto a los dispositivos restantes; ahora cada envío falla solo, y una suscripción sin claves de cifrado se rechaza al darse de alta.
- Detalles que engañaban. Revocar los avisos de este mismo navegador dejaba el botón clavado en «ya está» sin poder reactivar; la búsqueda podía pintar resultados de una consulta anterior si respondía tarde; «Ver más» de un mes con más de mil fotos se quedaba muerto; una ventana restaurada maximizada olvidaba su tamaño al des-maximizar; los iconos del escritorio no se podían arrastrar en Firefox; y la página pública de un pedido pintaba el nombre de la carpeta sin escapar (XSS). Todo corregido, con pruebas.
Copias y almacenamiento a prueba de sorpresas
- Un pool cifrado ya no se lleva Docker dentro. Al crear un pool cifrado, los datos de Docker y de las máquinas virtuales se movían dentro de él; tras reiniciar, el pool queda bloqueado esperando la contraseña, así que Docker, las aplicaciones y las máquinas dejaban de arrancar hasta desbloquearlo. Ahora se quedan en el disco del sistema y se explica por qué.
- Una copia no se hace de un disco que no está montado. Si el origen es un pool sin desbloquear o un disco externo desenchufado, su carpeta está vacía y la copia habría guardado una versión de cero archivos —que la limpieza podía luego dejar como única copia, borrando la buena—. Ahora se cancela con un aviso claro.
- «Comprobar» una copia ahora lee de verdad su contenido. La comprobación comparaba nombres, tamaños y fechas pero no abría los archivos: una copia en un disco con sectores ilegibles pasaba como correcta. Ahora se lee todo el contenido, así que un disco de backup que empieza a fallar se detecta.
- Borrar un usuario le quita también sus permisos. Antes solo avisaba de que seguía con permisos en algunas carpetas; ahora se los retira de verdad, para que un identificador que el sistema reasigne a otra persona no herede su acceso.
- Restaurar la configuración no reabre sesiones ya cerradas. Restaurar una copia antigua podía revalidar tokens que se habían revocado después (al cerrar todas las sesiones o cambiar una contraseña). Ahora una restauración nunca rebaja la seguridad de sesión.
- Deshacer un cambio de red no deja restos. Quitar un bond o una VLAN dejaba su configuración huérfana, que volvía a aplicarse en el siguiente reinicio; ahora se limpia.
- Apagar SMB cierra también sus puertos de descubrimiento. El interruptor dejaba abiertos los puertos por los que el NAS se anuncia en la red; ahora abre y cierra el juego completo.
Seguridad reforzada
- El Centro de paquetes no puede publicar todo el disco por SMB. Un campo interno de las carpetas compartidas (los directorios «vetados») no se validaba y permitía colar directivas en la configuración de Samba —incluida una que serviría la raíz del sistema entero—, saltándose la restricción a
/mnt y /srv. Ahora se valida, igual que el resto.
- Una regla del cortafuegos para un servicio de Docker ya respeta su origen. Una regla del tipo «aceptar solo desde la red local» sobre un puerto publicado por un contenedor se aplicaba a todo internet: el filtrado ignoraba el origen para los puertos de Docker. Ahora lo respeta, como hace con los servicios del propio NAS.
- «Cerrar todas las sesiones» ya no se puede deshacer solo. Una carrera en el inicio de sesión de una cuenta con la contraseña caducada podía revertir un cierre de sesiones o un cambio de contraseña que ocurriera justo a la vez, dejando válidos tokens que se creían revocados. Cerrado.
- Ampliar un pool ZFS ya no destruye la redundancia en silencio. Añadir un disco con una disposición que dejara el pool sin protección se forzaba sin avisar; ahora se rechaza con un motivo, que es lo que evita perder los datos al fallar ese disco.
- Copiar un archivo ya no puede escribir fuera de tus carpetas. «Copiar» comprobaba el choque de nombres de una forma que un enlace simbólico roto en el destino esquivaba, y entonces escribía A TRAVÉS del enlace, fuera de las carpetas compartidas. Ahora un enlace en el destino cuenta como ocupado y se rechaza, igual que ya hacía «Mover a».
- Un usuario de solo-panel ya no recibe acceso a los archivos por red sin querer. A quien entraba por primera vez se le creaba una cuenta de red (SMB) con acceso de lectura y escritura a todas las carpetas abiertas solo por tener el servicio SMB encendido, aunque nadie se lo hubiera concedido. Ahora solo se le da si de verdad se le marcó.
- Las nubes de las copias no se pueden montar como carpeta. El remoto de un destino de copia (y su capa que descifra) se podía montar desde «Nubes» y dejaba navegable el contenido descifrado de las copias de todos. Ahora ni se listan ahí ni se dejan montar: se gestionan solo desde Copias de seguridad, como ya pasaba al desconectarlas.
- Dos cambios a la vez en el cortafuegos ya no se pisan. Añadir una regla (p. ej. bloquear a alguien) justo cuando se guardaba un servicio podía hacer que una de las dos se perdiera sin aviso. Ahora esos cambios van en serie.
- El editor de «Puertos y volúmenes» de una app ya no puede montar el sistema. Con una ruta escrita de forma relativa (
../../…) se podía saltar la restricción a los datos del NAS y montar /etc o la raíz del anfitrión dentro de un contenedor. Ahora solo se admiten un volumen con nombre o una ruta absoluta dentro de los datos, como en el editor de texto.
- Cerrar dos sesiones a la vez ya no deja una sin revocar. Dos cierres simultáneos podían pisarse y dejar uno de los tokens todavía válido —justo el que se quería anular—. Cerrado.
- Una app de un catálogo de terceros ya no puede montar el sistema con una variable. Una receta podía usar una variable como carpeta de un volumen (
${RUTA} valiendo /) y colar así un montaje de la raíz del anfitrión, saltándose el filtro que solo mira el texto. Ahora, al instalar, la ruta se valida con la variable ya resuelta.
- Un certificado comodín ya no pisa el del dominio principal. Emitir
*.midominio.com reemplazaba el certificado de midominio.com (comparten carpeta en Let's Encrypt) y, al renovar, rompía el https del panel sin avisar. Ahora cada uno va en su carpeta y conviven.
- Más barreras: el asistente de primer arranque ya no gasta recursos en un equipo ya configurado, la activación de licencia envía la prueba de posesión completa, el token de DNS del certificado se valida contra inyección, y un test SMART no se lanza contra un dispositivo sin comprobar.
El Centro de paquetes abre rápido
- Abrir la tienda ya no tarda. Su portada pide siete páginas del catálogo casi a la vez, y cada una preguntaba a Docker por todos los contenedores —una ida y vuelta al daemon multiplicada por siete—. Ahora esa ráfaga comparte una sola consulta, así que la tienda aparece al momento.
Grabaciones que se ven al instante y un Monitor que no se cuelga
- Reproducir una grabación ya no tarda ni se queda en negro. Al abrir un trozo, el servidor reescribía el archivo entero para ponerle el índice ANTES de contestar —cientos de megas, y encima haciendo cola con las tareas de mantenimiento—: en un NAS ocupado eran decenas de segundos de rectángulo negro. Ahora el vídeo se sirve tal cual y se reproduce desde el primer fragmento; el índice se prepara por detrás para afinar el salto a un minuto exacto la próxima vez. Y mientras llega el primer fotograma sale «Preparando la grabación…» con su ruleta, en vez de un negro indistinguible de un fallo.
- La tabla de «Procesos» del Monitor ya no se queda en «Cargando…» para siempre. Resolvía el nombre de usuario de CADA proceso del sistema, y en un NAS unido a un dominio cada nombre pasa por el directorio (LDAP/AD): con el directorio lento, los cientos de procesos colgaban la tabla sin fin. Ahora el nombre se busca solo para los que salen en la lista, y un usuario que no se pueda resolver deja esa fila sin nombre en vez de tumbarla.
- Reanudar una máquina virtual en pausa. «Arrancar» sobre una máquina en pausa contestaba el críptico «Domain is already active» y no la despertaba nadie. Ahora el botón dice «Reanudar» y la máquina sigue donde estaba.
- El menú de aplicaciones abre al instante. Cada apertura empezaba de cero y las aplicaciones de Docker aparecían con retraso mientras el NAS contestaba; se leía como «mis apps han desaparecido». Ahora se pinta lo último conocido al momento y la consulta de fondo corrige lo que haya cambiado; un tropiezo puntual de Docker ya no borra los iconos.
- La línea de tiempo de las cámaras se lee mejor. Las horas van más claras y con sombra para leerse tanto sobre el fondo oscuro como sobre la barra, y lo grabado usa un azul más vivo que ya no se confunde con el fondo.
El panel abre rápido y ya no se cuelga esperando
- Nada vuelve a quedarse girando para siempre. El cliente que habla con el NAS no ponía tiempo límite a ninguna petición: un endpoint que aceptaba la conexión y no contestaba —el NAS saturado, un disco dormido, la nube que no responde— dejaba la ruleta girando sin fin y sin nada que pulsar. Ahora corta a los 30 segundos y lo convierte en un aviso normal que se puede reintentar.
- El menú de aplicaciones ya no tarda «un millón de años» en enseñar las de Docker. Pedía al daemon una consulta por cada contenedor solo para resolver el nombre de su imagen, que ya venía en la lista. Eliminado.
- Copias de seguridad abre sin esperas. Consultaba la nube de cada trabajo uno tras otro; con un destino lento, la pantalla se quedaba pensando. Ahora los consulta a la vez, así que tarda lo que el más lento y no la suma de todos.
- Salud (SMART), Resumen, Máquinas virtuales, Almacenamiento y Nubes, más ágiles. Todos hacían su trabajo en fila —disco a disco, máquina a máquina, consulta a consulta— y cualquiera lento retrasaba el resto; ahora va en paralelo. Además, las comprobaciones de disco (montajes, espacio) llevan tope de tiempo: un montaje colgado ya no congela el panel entero, y leer los discos SMART pasa de poder tardar minutos a segundos.
- Menos trabajo repetido en segundo plano. Listar una carpeta con miles de archivos hace ahora una consulta al sistema por archivo en vez de tres; el aviso del almacén de Docker deja de recalcular su tamaño cada 15 segundos; y los paneles que se refrescan solos ya no apilan peticiones cuando el NAS va lento.
Aguanta encendido semanas sin degradarse
- Fugas de memoria en el freno de intrusos, cerradas. El limitador de intentos de acceso y el bloqueo automático guardaban una entrada por cada IP que tocaba el login y no la soltaban nunca; un NAS expuesto a internet recibe intentos de decenas de miles de IP distintas, así que la memoria (y el archivo de bloqueos, que se reescribía entero en cada intento) crecían sin parar hasta poder tumbar el equipo. Ahora se podan las entradas ya inertes.
- El directo de una cámara ya no deja procesos colgados. Si el navegador se cerraba justo al abrir el directo, el
ffmpeg que lo servía podía quedarse encendido para nadie. Ahora se apaga siempre.
- Editar cámaras es a prueba de carreras. Mover el joystick de una cámara mientras se borraba o editaba otra podía hacer reaparecer una cámara borrada —fantasma que no grababa ni se dejaba quitar— o perder una de la configuración. Los cambios se aplican ahora de forma indivisible.
- El panel gasta menos mientras está abierto. El listado de archivos deja de reordenarse entero en cada tecla del buscador; el visor de registros no crea un formateador de fecha por fila; la lista de tareas en curso poda las ya terminadas en vez de acumularlas toda la sesión; y el monitor de discos ya no deja procesos sueltos si se reinicia.
La papelera, con buscador
- Buscar dentro de lo borrado. Con cientos de elementos, encontrar «las fotos que borré ayer» era bajar leyendo. Ahora hay un buscador —por nombre o por dónde estaba la cosa, sin distinguir tildes— que aparece solo cuando de verdad hace falta. Vaciar la papelera sigue vaciándola entera, no solo lo que el filtro deja a la vista.
Menos formas de perder datos o quedarse colgado
- Mover con «sobrescribir» ya no borra lo que ibas a mover. En un caso concreto —mover una carpeta a otra que contiene una con su mismo nombre, siendo el destino un antecesor del origen— el paso previo de sustituir borraba el propio origen, sin papelera. Ahora se detecta y se deja intacto.
- Copiar una carpeta dentro de sí misma se rechaza. Antes empezaba a copiarse sin fin, anidándose cada vez más hondo hasta llenar el disco. Ahora avisa, como ya hacía «Mover a».
- Un enlace compartido recién creado ya no desaparece. Al limpiar los enlaces caducados, si justo entonces se creaba otro, la limpieza lo borraba por una carrera. Ahora la limpieza es atómica, como el alta y la revocación.
- Los volúmenes que se pueden recuperar vuelven a recuperarse. Un volumen creado en otro equipo o degradado (con guion o punto en el nombre) salía como «recuperable», pero al pulsar «Recuperar» daba «nombre inválido». Ahora se acepta: el nombre que descubre el sistema es el que vale.
- Destruir un volumen ZFS deja los discos listos para reutilizarse. Antes quedaban marcados «miembro de un pool ZFS» y ni se podían usar para un volumen nuevo ni borrar desde el panel —había que entrar por SSH—. Ahora se limpian sus firmas, como ya se hacía con Btrfs.
- Una creación de volumen cifrado que falla a mitad ya no deja discos inservibles. Si el cifrado se cortaba con varios discos, los ya tocados quedaban «cifrados» e inelegibles. Ahora se deshace lo hecho y los discos vuelven a estar disponibles para reintentar.
- Un disco colgado ya no congela Almacenamiento. Una consulta de espacio de un volumen Btrfs cuyo disco dejó de responder bloqueaba el panel entero; ahora tiene tope de tiempo, como las demás.
- Mover o borrar mucho ya no dice «servidor offline» a los 30 segundos. Esas operaciones pueden durar minutos y el panel las cortaba a los 30 s con un error de «no se puede contactar», aunque por detrás terminaban —y daban ganas de repetirlas, duplicando la copia—. Ahora esperan lo que haga falta y su avance se ve en la barra de tareas.
- El Resumen muestra bien el DNS, el DHCP y el «Acceso exterior». Salían siempre apagados aunque estuvieran funcionando, porque se miraba el sitio equivocado. Ahora reflejan su estado real.
- La copia de la configuración ya no se descarga vacía. En algún navegador el archivo se liberaba antes de tiempo y salía de 0 bytes —una copia de recuperación que no servía—. Ahora se libera cuando toca. Lo mismo se ha corregido en la descarga de la configuración de un cliente VPN (que lleva su clave privada, imposible de recuperar) y en la exportación de registros.
- Crear o borrar clientes de VPN, o publicar reglas de acceso exterior, a la vez ya no se pisa. Dos operaciones simultáneas podían asignar la misma dirección a dos clientes, perder uno, resucitar un cliente ya revocado o borrar una regla recién creada. Ahora van en serie.
- La tabla de «Procesos» del Monitor ya no apila peticiones. Si una consulta tardaba más de los 3 s del refresco (NAS lento o por VPN), se lanzaba otra encima; ahora espera a que la anterior termine, como el resto de pantallas que se refrescan solas.
- El Launchpad muestra todas las apps de Docker, y mejor. Faltaban: un contenedor sin interfaz web desaparecía al arrancar, y una app instalada cuya receta ya no estaba en el catálogo no salía por ningún lado. Ahora se ven todas —agrupadas por app, un icono cada una, con su logo real aunque el contenedor se llame «algo-server»— y el que no tiene web se abre en Docker. Además: Enter abre el primer resultado, el Launchpad se cierra al abrir cualquier app, buscar encuentra también por imagen, y los textos están traducidos.
- Las notificaciones se limpian de verdad. El botón de la papelera solo borraba las ya leídas, así que con todo sin leer no quitaba nada y parecía roto; ahora vacía la lista entera (y «Marcar todo como leído» sigue al lado para conservar lo no visto).
- El resumen de avisos por email no se pierde si el envío falla. Si el correo estaba caído a la hora del resumen, los avisos del día se borraban igual; ahora se conservan y se reintentan, y solo se quita lo que de verdad se ha enviado.
- Las marcas de hora de la línea de tiempo de cámaras cuadran también en el cambio de hora. Los dos días al año que duran 23 o 25 h, las etiquetas se desviaban de lo grabado; ahora se colocan en su instante real.
Correcciones de lo añadido estos días
- Archivos — «Sustituir» ya no puede tragarse tus datos. Pegar una carpeta sobre sí misma con «sobrescribir» la borraba (y no iba a la papelera); sobrescribir podía vaciar la raíz de otra carpeta compartida anidada, saltándose la protección que sí tenía el borrado; un enlace roto en el destino hacía que se escribiera a través de él; y una subida «sobrescribir» cortada a mitad se llevaba por delante el archivo que ya estaba. Los cuatro casos están cerrados: nada se destruye sin pasar por donde debe, y una subida a medias deja intacto lo que había.
- Cámaras — «guardada» y «marcado» solo cuando de verdad se guardó. Proteger una grabación o poner un marcador confirmaba aunque el disco hubiera rechazado la escritura; la retención se habría llevado el vídeo igual. Ahora, si no se guarda, se dice. Además: la foto del directo lleva la hora local en el nombre (antes iba dos horas desviada), marcar un instante cerca de otro ya no borra el anterior sin avisar, en el móvil tocar una chincheta salta a su momento, «Ver grabaciones» abre la cámara en su último día grabado (y no clavada en un día viejo), y el resumen de todas las cámaras enseña el nombre actual tras renombrar.
- Panel de control — las carpetas del sistema, más a prueba. «docker» solo se comparte por SMB (NFS y WebDAV no pueden ocultar su almacén interno); una carpeta llamada «Docker» con mayúscula ya no fabrica una «del sistema» falsa e imborrable; una carpeta normal llamada «vm» en el disco del sistema ya no se reclasifica sola; y al dar permisos a una carpeta del sistema no se hereda una ACL que rompía los permisos de cada aplicación instalada después.
- Archivos — los vídeos se abren al instante, y una nube apagada no estorba. Un vídeo de vigilancia (grabado a prueba de cortes de luz, sin índice para saltar dentro) tardaba una eternidad en abrirse desde el Explorador: el navegador tenía que escanear casi todo el archivo antes de pintar el primer fotograma. Ahora se sirve remuxado al vuelo —sin recodificar, misma calidad— y arranca al momento. Y una carpeta de nube (Nextcloud, Drive…) que está APAGADA ya no aparece arriba entre las carpetas compartidas: solo sale cuando está montada de verdad, así que se acabó la carpeta que «no conecta» y no enseña nada.
- Cámaras — más arreglos finos. Las miniaturas de las grabaciones dejan de volver a descargarse enteras cada veinte minutos, al renovarse el vale de acceso, que hacía parpadear la rejilla y saturaba la conexión; el reproductor se recupera solo si el vale caduca en mitad de un vídeo largo, sin perder el punto que se estaba analizando; «Buscar movimiento» en una cámara que está grabando ya no se queda en «(1)» eterno lanzando un análisis que no hacía nada; un día largo ya no se marca por error «sin movimiento» cuando el análisis se queda sin tiempo (y se reintenta); y la contraseña de una cámara ya no puede colarse en los registros al probar una dirección —tampoco la de las cámaras HTTP/MJPEG, que la llevan dentro de la propia dirección— mientras dos canales del mismo grabador siguen distinguiéndose por la suya.
Crear una máquina virtual sin pelearse con la ISO
- La imagen de instalación se descarga sola desde la web. Hasta ahora, para instalar un sistema en una máquina virtual había que bajar la ISO al PC y volver a subirla al NAS —«un palo»—. Ahora, en el diálogo de crear, se pega la dirección de la imagen
.iso y el NAS la descarga él mismo a su almacén (con barra de progreso en Tareas: cuánto lleva, a qué velocidad); al terminar aparece elegida en el desplegable, lista para instalar. Se guarda a un temporal y se publica de una pieza, así que una descarga cortada no deja una imagen a medias en la lista; solo se aceptan direcciones http/https de la web pública —no de la red interna del NAS, ni saltando a ella por una redirección—; y la descarga se corta si fuera a llenar el disco. Dos descargas del mismo nombre a la vez ya no se pisan.
La interfaz cabe y se lee mejor
- Nada se sale por los lados. En varias pantallas, un texto largo sin espacios —una ruta, una URL, el nombre de una cámara o una máquina virtual, la huella de una clave, un error de actualización— estiraba su tarjeta o su fila más allá del borde y aparecía una barra de desplazamiento horizontal (o se cortaba el contenido en el móvil). Repasado en la tienda de aplicaciones, los contenedores, las máquinas virtuales, las cámaras, el almacenamiento, los servicios de archivos, el informe de espacio, las copias, los widgets y las pantallas de acceso: ahora todo parte o se recorta y se queda dentro.
- Los botones azules se leen mejor en modo oscuro. Su texto va en blanco, como en el resto del sistema, en vez del azul oscuro que quedaba apagado encima del botón.
Discos vigilados de verdad
- Un scrub de Btrfs con errores ya no se anuncia «sin errores». La comprobación de integridad de un volumen Btrfs informa los fallos de otra forma que ZFS (los resume aparte), y el vigilante solo entendía el formato de ZFS: un scrub que encontraba datos dañados salía con cero errores y avisaba de «todo correcto», justo lo contrario de lo que pasaba. Ahora se lee su resumen; si aún no está listo, se sigue esperando en vez de dar un falso «sin errores».
- La salud SMART se vigila en TODOS los discos. El repaso periódico solo miraba los dieciséis primeros; en un equipo con muchas bahías, los discos a partir del decimoséptimo quedaban sin vigilar y un fallo suyo pasaba desapercibido. Ahora se revisan todos (de ocho en ocho para no saturar), así que ninguno se queda fuera.
- El monitor de enchufado de discos ya no puede disparar la CPU. Si el proceso que escucha los conexiones/desconexiones de udev se cerraba solo (sin dar error), se relanzaba sin descanso: un bucle en caliente que fijaba un núcleo al 100 %. Ahora, pase lo que pase, espera antes de reintentar.
El servidor DNS dice por qué no arranca, y sabe convivir
- Cuando el servidor DNS del NAS no arranca, el panel dice el motivo real. Antes, si dnsmasq no llegaba a levantarse, el aviso remitía a «mira los logs» —inútil desde el navegador—. Casi siempre el motivo es que otro proceso ya tiene el puerto 53: systemd-resolved o, muy a menudo, un contenedor de DNS (Pi-hole, AdGuard). Ahora el aviso nombra a ese proceso y trae la línea exacta del registro de dnsmasq, así que se sabe qué apagar sin salir del panel.
- El DNS del NAS puede escuchar en otro puerto y convivir con esa app. Si el 53 ya lo ocupa un Pi-hole o AdGuard y no quieres tocarlo, ahora el DNS del panel tiene un «puerto de escucha» (p. ej. 5335): el cortafuegos abre ese puerto, el archivo generado lo usa, y el panel explica la consecuencia —los equipos solo preguntan al 53 por sí solos, así que es la app del 53 quien debe reenviar los nombres locales al NAS— con el «dig» exacto para probarlo. Y si el DHCP del NAS está encendido con el DNS fuera del 53, exige decir qué DNS se anuncia a los equipos: sin eso, toda la casa se quedaría sin resolver nombres.
Cámaras: el directo va fino y dejar de grabar se anuncia
- El directo abre en ~1 segundo en vez de en varios. ffmpeg se pasaba hasta 5 segundos «estudiando» el flujo de la cámara (sus valores de fábrica) antes de soltar el primer byte: eran los segundos de negro de cada apertura. Ahora se le pone un límite de sondeo y sin buffering interno, tanto al directo bueno (MSE) como al de respaldo (MJPEG).
- Un parpadeo de la cámara ya no condena el directo a la recodificación. Si el vídeo se cortaba un instante (la cámara se reinicia, la wifi da un tirón), la ventana caía al modo de respaldo —que recodifica en el NAS, gasta CPU que le roba al grabador y va a 8 imágenes por segundo— y se quedaba ahí PARA SIEMPRE. Ahora se reintenta el directo bueno con una pequeña cuesta y solo tras varios fallos seguidos se queda el respaldo; el botón «Reintentar» también vuelve a probar el directo bueno.
- Mirar el directo un buen rato ya no lo degrada. El reproductor acumulaba TODO el vídeo emitido; a la media hora se llenaba la memoria del navegador y el directo se pasaba al modo de respaldo en silencio. Ahora se poda lo ya visto y solo se conserva el último medio minuto.
- Un espectador con la red justa ya no ve el pasado. La cola por espectador permitía acumular hasta 30 segundos de retraso y presentarlos como «directo»; ahora el tope son ~12 y a partir de ahí se salta a lo de ahora.
- Una cámara que enmudece ya no deja el directo congelado. Al ffmpeg del modo de respaldo le faltaba el tope de espera que ya tenían los demás: una cámara que dejaba de emitir sin cerrar la conexión lo dejaba clavado para siempre, con la imagen helada como si fuera actual.
- La rejilla no molesta al directo ni trabaja para nadie. Con el visor abierto, la rejilla de miniaturas seguía pidiendo fotos cada 8 segundos a la MISMA cámara cuyo flujo sujeta el directo (las que solo admiten una conexión daban tirones justo al mirarlas), y con la pestaña en segundo plano seguía lanzando un ffmpeg por cámara toda la noche. Ahora se pausa en ambos casos.
- Dejar de grabar ya no es un secreto. Una cámara con el grabador en marcha pero sin vídeo nuevo solo se veía como una chapa ámbar dentro de la app: si no la abrías, no te enterabas hasta ir a buscar un vídeo que no existía. Ahora salta una notificación (y el aviso por email/Telegram si están configurados) a los pocos minutos de pararse, y otra cuando vuelve, para saber cuánto duró el hueco.
- La grabación ya no puede acabar en el disco del sistema. Si el volumen de datos aún no estaba montado (arranque, pool cifrada esperando la contraseña), el grabador creaba la carpeta en el disco del sistema y grababa ahí: lo llenaba y ese vídeo quedaba tapado al montarse el volumen encima. Ahora espera a que el volumen esté montado de verdad.
- Una cámara Dahua/Amcrest/Imou ya no se queda sin grabar por su dirección. La configuración del grabador se lee como un archivo de shell, y una dirección con «&» (el
?channel=1&subtype=0 de esas marcas) o una contraseña con caracteres especiales la partía por la mitad: la cámara moría al instante con «configuración incompleta» y no grababa NUNCA. Ahora los valores van entrecomillados —probado contra un shell de verdad— y las configuraciones ya escritas se migran solas.
- Un tropiezo pasajero del disco ya no mata la grabación para siempre. Un disco lleno (que la limpieza por antigüedad iba a resolver sola) o un volumen en solo-lectura un momento hacían salir al grabador con el código de «configuración rota», que a propósito no se reintenta: la cámara quedaba parada hasta volver a guardarla a mano. Ahora esos fallos se reintentan cada dos segundos hasta que el disco vuelve.
- Una grabadora parada se rearranca sola. El reconciliador de horarios solo vigilaba las cámaras con rejilla semanal: una de «grabar siempre» cuya unidad muriera (el propio código lo admitía en un comentario) se quedaba parada para siempre. Ahora reconcilia TODAS las encendidas: si debe grabar y no lo hace, se rearranca en menos de 30 segundos.
- La cámara que se corta sin parar también avisa. Cientos de trozos diminutos al día (los vídeos «de 2 segundos») son una cámara desconectándose y volviendo — casi siempre wifi o alimentación. Además de la chapa del muro, ahora llega una notificación con la explicación.
- Dos altas a la vez ya no fabrican un éxito falso. Si dos cámaras con el mismo nombre se creaban a la vez, la que perdía la carrera respondía «creada» sin estar en la lista (y dejaba su configuración huérfana). Ahora contesta «ya hay una cámara llamada así» y limpia.
- Un directo sustituido ya no deja su ffmpeg huérfano. Al reabrir un directo cuyo lector había muerto con el proceso aún vivo, el viejo quedaba sujetando la única conexión que admite la cámara y el nuevo salía con «la cámara no responde». Ahora se apaga al sustituirlo.
El móvil se siente como una app
- Deslizar desde el borde izquierdo vuelve al inicio, con la app siguiendo al dedo, como en cualquier teléfono; abrir y minimizar una app desliza en vez de aparecer de golpe.
- El inicio dice cómo está el NAS de un vistazo: almacenamiento (con su barra y su porcentaje), salud de los discos y qué hay en marcha, encima de los iconos; cada tarjeta abre su app.
- El conmutador de apps abiertas es un carrusel de tarjetas que encajan al soltar, con su aspa para cerrar. Y tocar una app minimizada ahora la trae de verdad (antes no hacía nada).
- Detalles de app nativa: un toque háptico corto en las acciones clave, la barra de estado del móvil se tiñe del tema elegido (no del que tenga el sistema), y todo respeta la opción de «menos movimiento» del sistema.
La Fototeca: tus fotos en una linea de tiempo
- App nueva: Fototeca. Tus fotos mes a mes, de la mas nueva a la mas vieja, con miniaturas y visor. Es un INDICE, nunca un almacen: escanea las carpetas que elijas (de fabrica, las compartidas que suenan a fotos), no toca ni mueve un solo original, y si el indice se borra se regenera. El escaneo corre como tarea en segundo plano, reanudable y con tope por pasada —cuarenta mil fotos se indexan la primera noche, no el primer minuto—; las miniaturas las hace ffmpeg y se cachean. Cada foto se abre en grande y con «Ver en Archivos» saltas a su carpeta. Las fechas son las del archivo, y se dice.
Los avisos te siguen al bolsillo (push sin terceros)
- Avisos push en el movil y el ordenador, aunque el panel este cerrado. En Panel de control → Alertas, «Recibir avisos en este dispositivo»: desde ahi, los criticos y las advertencias (disco con fallo, camara sin grabar, copia fallida, maquina en pausa) llegan como notificacion del sistema. Sin cuentas de terceros: las claves las genera tu NAS (VAPID) y el mensaje viaja cifrado de extremo a extremo — el relevo de Google/Mozilla solo ve bytes. Cada dispositivo sale en una lista y se revoca con un toque, como las sesiones; un dispositivo que desaparece (app desinstalada) se poda solo. Necesita HTTPS de verdad y, en iPhone, el panel instalado como app (iOS 16.4+): cuando falta algo, el panel lo dice.
Cada archivo con su historia (versiones anteriores)
- Clic derecho sobre un archivo → «Versiones anteriores…»: las copias que YA guardan los snapshots del volumen (ZFS y Btrfs), navegables sin SSH. Solo se enseñan versiones DISTINTAS de la actual, y «Restaurar como copia» deja la version AL LADO del archivo, con su fecha en el nombre: restaurar nunca puede ser la segunda forma de perder el bueno. Sin snapshots programados, el dialogo lo dice y te manda a programarlos, no finge.
Tus equipos copiandose al NAS, en un paso
- «Preparar sitio para un equipo…» (Copias de seguridad → Destinos): crea en un paso la carpeta de copia de un portatil o PC —solo para su usuario, sin papelera—, pone el tope de espacio (cuota) para que un portatil no se coma el NAS, y en un Mac deja Time Machine ya anunciado. Al terminar te dice exactamente que pulsar en ese equipo (Time Machine en el Mac, Historial de archivos en Windows, o la carpeta SMB para lo demas). Sin protocolos inventados: son las piezas del NAS que ya existian, juntas.
Que te envien archivos sin darles cuenta (pedidos de subida)
- El enlace inverso al de compartir. En Archivos, clic derecho sobre una carpeta → «Pedir archivos aqui…»: se crea un enlace (con caducidad, contraseña opcional y tope por archivo) que abre una pagina minima de subida, sin cuenta y sin ver nada del NAS. Lo que suban cae en esa carpeta SIN pisar nada (nunca se sobrescribe: «informe (2).pdf») y te llega una notificacion al recibir. Con el mismo freno de contraseña y la misma poda atomica que los enlaces de descarga, y los pedidos viajan en la copia de configuracion.
Buscar en todo el NAS con Ctrl+K
- Una búsqueda para todo, como Spotlight. Ctrl+K (o la lupa de la barra) abre una paleta que encuentra aplicaciones, secciones del Panel de control (escribe «dns» y estás allí), carpetas compartidas y archivos por nombre —sin distinguir tildes—; lo local sale al instante y los archivos llegan detrás. Flechas y Enter para navegar; cada resultado abre su sitio de verdad (un archivo abre el Explorador EN su carpeta).
- Y dentro de los archivos, a la orden. La fila «Buscar dentro de los archivos» lanza la búsqueda profunda del servidor —abre y lee los formatos de texto, con sus topes— una sola vez, en vez de castigar el NAS a cada tecla.
El escritorio, vivo: fondo propio, iconos y memoria
- Fondo de pantalla con tu foto. Además de los cuatro degradados, ahora puedes subir una imagen (Panel de control → Regional y aspecto) o, desde Archivos, clic derecho sobre una foto del NAS → «Usar como fondo». El NAS la guarda POR USUARIO y redimensionada en su disco de sistema —el fondo te sigue de un equipo a otro, no depende de que la pool esté despierta y no se paga una foto de 20 MB en cada carga—, y el escritorio le pone solo un velo suave (más denso en modo oscuro) para que iconos y ventanas se lean encima. También se ve en el móvil; la pantalla de acceso se queda con el degradado.
- Iconos en el escritorio. Accesos directos a aplicaciones, a carpetas compartidas (abren Archivos en esa carpeta) y a secciones del Panel de control (p. ej. «DNS» a doble clic), en rejilla imantada: arrastrar reordena, doble clic abre, clic derecho sobre uno lo quita. Se guardan por usuario en el NAS.
- Como en Windows: arrastra del Launchpad al escritorio. Cualquier app del lanzador —las del sistema y las de Docker con web— se puede arrastrar y soltar en el escritorio para crearle un acceso directo; el lanzador se aparta mientras arrastras para que veas dónde lo sueltas. Un clic marca un icono (y Supr lo quita), doble clic abre, y el clic derecho sobre un icono tiene su Quitar de siempre.
- Clic derecho en el fondo, tres opciones y ya: añadir un acceso directo (con un diálogo que lista apps, carpetas y secciones), ordenar por nombre y «Cambiar el fondo…» con su diálogo ahí mismo —degradados, subir imagen y quitar—, sin ningún viaje al Panel de control (el selector del panel y este son el mismo).
- El escritorio te recuerda. Las ventanas abiertas —cuáles, dónde y de qué tamaño— se guardan por usuario y por tamaño de pantalla (lo del monitor grande no se le impone al portátil) y se restauran al volver a entrar. Una app que ya no exista se ignora sin ruido.
- Escritorio LIBRE, como Windows. Cada icono se puede dejar donde se quiera —el centro, abajo a la derecha— arrastrándolo a su celda (con imán: libertad sin iconos perdidos por píxeles). Los que no se han colocado fluyen en columnas desde arriba a la izquierda; «Ordenar por nombre» recoloca todo en ese flujo. Las posiciones se guardan por usuario y, en una pantalla más pequeña, lo dejado fuera del tablero se recorta hacia dentro en vez de desaparecer.
- Los anillos azules de selección, arreglados en todo el sistema. El resalte de «esto es lo elegido» se dibujaba por FUERA del elemento y cualquier contenedor con scroll se lo recortaba (llevaba así «desde la 1.0»); además, en modo oscuro el hueco del anillo del foco se pintaba blanco. Ahora el anillo va por dentro: entero siempre, en las siete pantallas que lo usaban.
La máquina virtual que se pausa sola, explicada
- Si algo pausa una máquina, ahora te enteras y sabes por qué. qemu congela una máquina cuando su disco falla al escribir —casi siempre el volumen SIN ESPACIO— y no lo contaba nadie: te la encontrabas pausada, la reanudabas y recaía. Ahora un vigilante lo anuncia en Notificaciones con el motivo en cristiano y qué hacer, y avisa al recuperarse.
- «Reanudar» ya no miente. Si la máquina recae en pausa nada más reanudarla (el disco sigue lleno), el panel lo dice con su porqué en vez de un «reanudada» falso.
La «Atención necesaria» dice qué pasa y te lleva allí
- El widget de salud explicaba el susto pero no el motivo. Salía «Atención necesaria» en rojo encima de cuatro filas en verde —el motivo real solían ser avisos críticos sin leer, que el widget ni enseñaba— y pincharla no hacía nada. Ahora la chapa se convierte en un botón POR CADA motivo («2 avisos críticos sin leer — tocar para leerlos», «un disco con fallo SMART — tocar para verlo»): tocar los avisos abre la lista de notificaciones y tocar lo del disco o el volumen abre Almacenamiento, cerrando antes el panel de widgets para no tapar el destino.
Una app que falla ya no tumba el panel entero
- Red de seguridad por ventana. Un error de render dentro de una app (una respuesta con una forma inesperada, un dato que falta) desmontaba el panel COMPLETO: pantalla en blanco, escritorio y móvil por igual, con recargar como única salida. Ahora la app rota enseña qué pasó con su «Reintentar» y las demás ventanas ni se enteran. De paso, el historial del Monitor tolera una respuesta sin datos en vez de romperse.
El panel entero, también en inglés
- Textos que se quedaban en español con el panel en inglés. La pantalla de «el NAS no responde» durante un reinicio, los botones por defecto de los diálogos (Cancelar / Entendido / Aceptar), el aspa de descartar un aviso, el error genérico al iniciar sesión y varias etiquetas de Copias de seguridad (los sufijos «(opcional)» y «— no disponible», «Reconectando» y su error) estaban escritos fijos. Ahora pasan por el traductor, así que un usuario en inglés ya no se encuentra frases sueltas en español.
1.25.02026-08-08
Cacería de bugs: el resto del sistema
- Un disco averiado ya se puede reemplazar desde el panel. Cuando el disco muere del todo, el sistema lo retira y su nodo desaparece: el panel exigía que existiera, así que el caso principal del reemplazo —el único que importa— no se podía ejecutar y el volumen se quedaba degradado hasta entrar por SSH. Además, el reemplazo ahora se VIGILA hasta que la copia de datos termina de verdad, con aviso al acabar: antes se daba por completado al arrancar (ZFS) o se marcaba como fallido a la hora mientras el sistema seguía copiando (Btrfs).
- Un volumen que está en los discos vuelve a poder recuperarse. Una pool Btrfs presente pero no montada nunca aparecía como «adoptable»: se enseñaba como tarjeta vacía cuyo único botón era Destruir, que es exactamente cómo se formatea sin querer un disco lleno de datos. Y crear una pool con el nombre de otra que ya está en los discos ahora se rechaza.
- Destruir un volumen ocupado ya no miente. Si algo lo está usando (Docker, una máquina virtual), el desmontaje falla: antes se respondía «eliminado» igualmente, con los datos intactos y sin su unidad de montaje — irrecuperable tras el siguiente arranque. Ahora se explica qué lo está usando y no se toca nada.
- Con un volumen desmontado, las carpetas compartidas ya no se recrean en el disco del sistema. Windows las veía vacías y lo que escribieran ahí quedaba tapado (y el espacio perdido) al volver a montar el volumen.
- Una carpeta con todos los permisos en «ninguno» ya no queda abierta a todo el mundo, y una descripción larga no tumba el guardado con un error 500 dejando un directorio huérfano. Dos altas de carpeta a la vez tampoco se pisan.
- El cortafuegos deja de olvidar a quién limita el panel. Cualquier cambio de reglas automático (encender la VPN, activar SMB, guardar el DNS, instalar una app) borraba la restricción de redes del panel y el filtrado de los puertos de Docker, en silencio.
- La VPN vuelve a funcionar sola tras un reinicio. Las reglas que dejan pasar su tráfico por la cadena de Docker vivían solo en memoria: tras reiniciar el NAS —o Docker— los clientes conectaban sin llegar a ningún sitio hasta que alguien volviera a guardar la VPN.
- Activar o desactivar la verificación en dos pasos ya no puede deshacer un cambio de contraseña ni resucitar sesiones cerradas; el freno de intentos de acceso ya no crece sin límite en memoria; y tras «cerrar todas las sesiones» el panel deja de mostrar como conectado a quien acaba de ser expulsado.
- Los avisos importantes llegan aunque el disco esté lleno (que es justo cuando hacen falta): antes un fallo al guardarlos los silenciaba seis horas en todos los canales, incluidos los que no tocan el disco. El resumen diario ya no se corta a media frase borrando lo que no cabía. Y una pool cifrada esperando su contraseña deja de mandar una alarma crítica cada seis horas: no es una avería.
- El cosido de las grabaciones ya no congela el planificador. Podía comerse horas de la pasada y con ellas las tareas programadas que vencieran entre medias, que se saltaban sin dejar rastro.
- Detalles con consecuencias: guardar el DNS y el DHCP a la vez ya no se pisan; una configuración de VPN que falla a medias no deja el archivo cambiado; el proxy inverso deshace lo escrito si falla a mitad; apagar los servicios de red ya no detiene un dnsmasq que el panel nunca configuró; cambiar de proveedor de DNS dinámico publica de verdad el registro nuevo; una base de métricas corrupta se regenera sola; la copia de configuración solo aparece en el destino cuando está completa; los snapshots programados aceptan los nombres de volumen reales y avisan si no pudieron borrar los antiguos; el analizador de espacio no cuenta dos veces los enlaces duros ni los ofrece como «recuperables», y solo corre uno a la vez; el aviso de fin de una tarea ya no se esfuma si el reloj del PC va adelantado; un segundo dedo en la tableta no secuestra el arrastre de una ventana; y detener un contenedor o una máquina refresca su estado al momento.
1.24.02026-08-08
Archivos: los nombres repetidos ya no se resuelven solos
- Al pegar, mover, arrastrar o subir algo que ya existe, se pregunta. Una sola vez por operación y solo cuando de verdad hay repetidos, con los nombres delante y la consecuencia de cada salida escrita debajo: Quedarme con los dos (lo nuevo entra como «nombre (2)»), Dejarlo como está (esos no se tocan; el resto sí) o Sustituir (lo que hay se pierde, y se dice que no pasa por la papelera). Antes cada camino decidía por su cuenta: pegar duplicaba siempre y una subida pisaba en silencio.
- Copiar y mover muchos elementos enseña su progreso. La misma barra que ya tenía el borrado masivo: «1.200 de 5.837», visible desde cualquier pantalla del panel. Y lo omitido se cuenta al terminar («30 movidos · 2 sin tocar»), porque un «hecho» a secas habría sido mentira.
- Carpetas fijadas. Cualquier carpeta se fija arriba de la barra lateral desde su menú contextual (o el de la zona vacía, para la carpeta abierta) y se quita desde ahí mismo. Son de quien mira —viven en el navegador—, así que cada uno tiene sus atajos.
- Todos los enlaces compartidos, en una lista. Un botón en el lateral —solo cuando hay algo publicado, con el número al lado— abre todo lo que ahora mismo puede abrir cualquiera que tenga la dirección: qué es, dónde está, cuándo caduca y cuántas descargas lleva. Desde cada fila se va a la carpeta o se corta el enlace. Hasta ahora solo se veían los de la carpeta abierta, y responder «¿qué tengo publicado?» era pasearse por todas.
Cámaras: lo importante no se borra, y lo encontrado no se pierde
- Guardar una grabación. El candado de cada casilla la deja fuera de la limpieza por días y por gigas, para siempre, hasta que se suelte. El vídeo del día que pasó algo es justo el que la retención borra sola mientras se decide qué hacer con él. Mientras está guardada tampoco se consolida con las de su día: el archivo queda exactamente como está. La marca viaja con la carpeta de la cámara, así que sobrevive a llevarse el disco a otro equipo.
- Marcadores en la línea de tiempo. El momento que costó encontrar se guarda con su nombre («el paquete») y queda como una chincheta en la barra: un clic y se vuelve a él, hoy o dentro de un mes. El botón es uno y dice lo que toca —marcar o quitar— según dónde esté la aguja.
- Todas las cámaras de un vistazo. Con más de una cámara, la pestaña «Todas» de Grabaciones enseña qué días tienen vídeo y cuánto grabó cada cámara ese día; cada pastilla lleva a esa cámara ya abierta en ese día.
- Foto del directo. Un botón sobre el vídeo guarda el fotograma que se está viendo —exactamente ese, no el siguiente—, con el nombre de la cámara y la hora en el archivo.
Panel de control: las carpetas del sistema se comparten como las demás
- «docker» y «vm» aparecen en Carpetas compartidas. Las crea el propio sistema al preparar la pool y hasta ahora eran invisibles ahí: compartir los datos de las aplicaciones por SMB era imposible sin SSH. Ahora salen en la lista con su distintivo «Sistema» y se les enciende SMB, NFS o WebDAV, papelera y permisos como a cualquiera; lo que no se puede es renombrarlas, moverlas ni borrarlas, porque sus datos los usan las aplicaciones y las máquinas virtuales. «Eliminar» una del sistema solo deja de compartirla: la carpeta y sus datos siguen donde estaban.
- El almacén interno de Docker ni se ve ni se toca desde la red. Al compartir «docker» por SMB,
.engine —las imágenes y capas de los contenedores— queda vetado: borrarlo desde un equipo conectado rompería todas las aplicaciones. Y al aplicar permisos sobre una carpeta del sistema no se recorren sus archivos por dentro: los permisos que puso cada aplicación se quedan como están, que es lo que evita que un contenedor deje de arrancar por un cambio de permisos que él comprueba.
1.23.02026-08-06
Copias de seguridad: se puede mirar dentro de una copia
- Explorar una versión como si fuera una carpeta. Hasta ahora una versión era una fecha y dos cifras; para saber si «la carpeta de la boda» estaba dentro había que restaurar la versión entera y mirar. El botón Explorar abre cualquier versión y se navega por ella —archivos, tamaños, fechas— eligiendo la fecha en una línea de tiempo. No hay órdenes nuevas que permitir: en disco y por SSH lista el mismo rsync de las copias en modo solo lectura, y en la nube
rclone lsjson.
- Y restaurar solo lo que se marca, hasta un archivo suelto. Lo que se ve en el explorador lleva su ruta original, que es exactamente lo que la restauración acepta: se marcan tres archivos, «Restaurar lo marcado», y a una carpeta nueva. El motor ya sabía hacerlo; el panel no dejaba pedirlo.
- En la nube, el explorador dice la verdad incómoda. Una versión antigua en la nube no es una foto completa de ese día (guarda solo lo que cambió después); al entrar en ella lo dice, y una carpeta que no cambió desde entonces explica que su contenido sigue íntegro en la copia más reciente, en vez de enseñarse vacía como si se hubiera perdido.
La retención que casi todo el mundo quiere y nadie quiere configurar
- Retención inteligente, la de fábrica para los trabajos nuevos. Todas las copias de las últimas 24 horas, una al día durante 7 días, una a la semana durante 4 semanas y una al mes durante 12 meses. Sin números que elegir: recientes de sobra para el susto de hoy y un año de profundidad para lo que se descubre tarde. Cuenta «los últimos N periodos con copias», como restic: si el NAS pasó unos meses apagado, lo anterior al hueco no se tira solo por viejo — borrar datos porque hubo un hueco es el modo de fallo contrario al que quiere una copia. Los modos por versiones y por días siguen ahí, y los trabajos ya guardados no cambian solos.
«¿Está de verdad mi copia?» ahora tiene un botón
- Comprobar lee la copia entera del destino, sin mover un byte. En disco y por SSH recorre la versión más reciente y carea archivos y tamaño con lo que se apuntó al copiarla; en la nube pesa el espejo y lo compara con el origen. El resultado queda en la tarjeta («Comprobada hace 3 días») y en el historial, y si no cuadra el NAS avisa igual que con una copia fallida — porque una copia que no se puede leer entera no va a estar el día que haga falta. Cada copia apunta desde ahora el tamaño total de su versión, precisamente para que la comprobación tenga con qué carear.
Cifrado de extremo a extremo hacia la nube
- La nube ya no puede leer tus copias. Al crear un destino de nube se puede activar el cifrado (viene propuesto): los nombres y el contenido se cifran en el NAS antes de subir nada y el proveedor solo ve datos ilegibles. La clave la genera el NAS y se enseña una sola vez como frase de recuperación —seis grupos de cinco letras, para un papel o un gestor de contraseñas—: con ella y cualquier rclone la copia se lee desde cualquier equipo; sin ella, nadie. Quien no la apuntó puede volver a verla desde el destino (solo administradores, y queda en la auditoría).
- Solo en la nube, y no es pereza. En disco y por SSH cada versión se construye con enlaces duros contra la anterior, y un cifrado por archivo cambia el contenido en cada pasada: rompería justo lo que hace baratas las versiones y posible restaurar un archivo suelto. En la nube no hay enlaces duros que perder, así que ahí sí. El panel lo explica en el mismo sitio donde antes explicaba por qué no existía.
La copia dice a qué velocidad va y cuánto le queda
- Velocidad y tiempo restante en vivo, en números. rclone lo decía diez veces por minuto y se tiraba al parsear; rsync daba para calcularlo y no se calculaba. Ahora las tareas de copia llevan bytes hechos, bytes totales, velocidad y tiempo estimado junto a la barra de progreso, venga la copia del botón, del planificador o de otra pestaña.
Y de paso
- Las exclusiones, en el asistente. El campo existía en el motor desde el principio (
*.tmp, node_modules…) y ninguna pantalla dejaba escribirlo.
- «Copiar también a otro destino» en cada trabajo: abre el asistente con las mismas carpetas, horario y retención, y solo pide el destino nuevo y un nombre. Es la regla 3-2-1 sin rellenar nada dos veces.
- El historial distingue las comprobaciones de las copias y restauraciones, y en ellas la cifra es lo leído, no lo transferido (que siempre es cero).
- Listar el contenido de una versión sin rsync instalado (o sin rclone) contesta con el motivo y la orden para arreglarlo, no con un error 500.
Repaso a fondo: puertas que no se veían
- Una cuenta del panel ya no puede llamarse «root». Se podía crear un usuario del panel con el nombre de una cuenta del sistema (
root, www-data, nas…) y, al entrar por primera vez, la sincronización de identidad le ponía ESA contraseña a la cuenta de Unix y le abría SMB. O sea: root del equipo dando de alta un usuario, saltándose la ceremonia de contraseña y 2FA que pide el terminal para elevarse. Ahora se rechaza al crearlo, también en el asistente de primer arranque.
- Una receta de la tienda ya no puede pedir el mando del NAS. El filtro que veta montar el socket de Docker o
/etc solo miraba las rutas que empiezan por /, así que una ruta RELATIVA (../../../../var/run/docker.sock) —que Docker resuelve igual— pasaba como si fuera un volumen con nombre. Importa porque las recetas de los catálogos de otros (CasaOS, Unraid) son de gente que no conocemos: son justo lo que este filtro existe para parar.
- El código de dos pasos ya no vale dos veces. Un código dura 30 segundos y se aceptaba durante toda su ventana, así que quien lo viera por encima del hombro podía usarlo detrás. Ahora se quema al usarlo, en las cuatro puertas que lo piden: entrar al panel, activar el 2FA, desactivarlo y elevarse a root en el terminal.
- «Cerrar todas las sesiones» ahora las cierra de verdad. Si coincidía con un cambio de contraseña, los dos cambios se escribían encima del mismo archivo y el que llegaba tarde borraba al otro: se podía creer que se había echado a alguien de todas sus sesiones sin haber revocado nada. Y borrar una cuenta y volver a crearla con el mismo nombre resucitaba las sesiones de la anterior —que puede ser otra persona—; ahora no.
- El vale de las cámaras ya se puede revocar. El permiso temporal que el panel usa para pedir imagen y vídeo no estaba atado a nadie: sobrevivía a cambiar la contraseña y hasta a borrar la cuenta. Ahora lleva dentro de quién es, así que cambiar la contraseña, borrar la cuenta o «cerrar todas las sesiones» lo tumban al momento. Cerrar sesión en un navegador no lo tumba: para eso está la media hora que dura.
- La copia de la configuración ya no se lleva la comunidad SNMP. Es la contraseña de lectura de las métricas del NAS y viajaba en claro dentro de un
.tar.gz que se descarga y se guarda en cualquier sitio, igual que ya se quedaban fuera el token del DDNS o la del proxy. El resto de los ajustes de SNMP se siguen guardando; solo hay que volver a escribirla al restaurar.
Cámaras: lo que se rompía sin avisar
- Un puerto mal escrito ya no deja «Cámaras» en blanco. Una errata al dar de alta (
…:99999) se guardaba, y a partir de ahí la lista entera fallaba cada vez que se pedía: la app quedaba inservible y no había forma de arreglarlo desde el panel. Ahora se rechaza al escribirlo, que es cuando se puede corregir.
- La limpieza por espacio ya no se lleva la hora que se está grabando. Con un tope pequeño y una cámara de mucha calidad podía borrar el archivo abierto: el espacio no se liberaba hasta la hora siguiente, esa hora se perdía entera y el registro decía que había liberado un espacio que seguía ocupado.
- El trozo que se está grabando ya no se analiza a medias. Se analizaba con los pocos minutos que llevara escritos y ese veredicto se quedaba para siempre: lo que pasara el resto de la hora no aparecía nunca en el filtro «solo movimiento». Ahora se queda fuera y lo coge la siguiente vez que se pide el análisis, ya con la hora cerrada.
- La noche del cambio de horario de octubre. Esa hora ocurre dos veces, y el cosido de trozos podía darla por cerrada mientras la cámara seguía grabando en ella. Ahora esa hora concreta se deja para la consolidación del día siguiente.
- Buscar cámaras en la red aguanta una respuesta malformada. Un aparato que anunciara un puerto imposible tumbaba el barrido ENTERO y se perdían todas las cámaras encontradas; ahora se descarta solo ese.
- Un atasco de consolidación ya no se come una copia programada. Las revisiones de fondo van una detrás de otra: la primera noche tras actualizar, coser varios días de golpe podía tardar tanto que un backup nocturno se pasaba de su margen y se saltaba sin dejar rastro. Ahora se cose poco a poco, en varias pasadas.
- El reloj de los vigilantes. Las revisiones de fondo medían el tiempo con la hora civil, así que si el NAS arrancaba con la hora adelantada y NTP la corregía hacia atrás, se quedaban congeladas hasta que el reloj alcanzara la marca — incluida la limpieza de grabaciones, con el disco llenándose y ni un aviso. Ahora las que solo miden «cuánto hace» usan el tiempo encendido, que no da saltos; las que tienen que dispararse a una hora concreta —los trabajos programados, los horarios de las cámaras, el resumen diario— siguen con la hora civil, que es la que les toca.
Copias de seguridad: que no mientan
- «Comprobar» ya no da verde cuando no tiene con qué comparar. En las copias a la nube, si el origen no se podía medir —la pool sin montar, la carpeta que ya no está— la comprobación se daba por buena aunque en la nube no hubiera nada, y encima añadía «la clave de cifrado también vale» sin haber comparado un solo archivo. Ahora lo dice: no se puede confirmar.
- Una copia a un disco que falla a medias ya no deja basura para siempre. La carpeta a medio escribir no la reclamaba nadie —ni la retención, ni la reconciliación de arranque— así que cada noche que fallara dejaba otra, llenando el disco que probablemente ya estaba lleno. En los destinos en disco se retira sola, con tres comprobaciones para que jamás pueda llevarse una versión buena; en los destinos por SSH sigue habiendo que retirarla a mano.
- Las versiones antiguas ya no desaparecen del panel. El historial guarda 300 ejecuciones pero la lista de versiones solo miraba las 200 últimas: con suficiente actividad, las copias mensuales de hace meses dejaban de listarse, no se podían restaurar («no está en el historial») y la retención tampoco las veía, así que se quedaban ocupando disco. Justo la profundidad de un año que promete la retención inteligente.
- Y ya no se pierde el registro de una copia recién lanzada, que con el historial lleno podía descartarse nada más apuntarla: la copia se hacía, escribía su carpeta, y no existía para el panel.
- Un destino de nube ya cifrado no se puede descifrar por accidente. Cambiarle la carpeta dejaba el panel enseñando una ruta y las copias yendo a otra; y quitarle el cifrado desde fuera del panel habría subido lo siguiente en claro dejando ilegible todo lo anterior. El cifrado se decide al crear el destino, y ahora eso se cumple de verdad.
- Las frases de cifrado y las contraseñas de la nube ya no viajan en claro a los registros ni al mensaje de error que se enseña al fallar: la orden que se enseña va con los secretos tapados.
Archivos: la papelera y los comprimidos
- Restaurar lo que había dentro de una carpeta con «::» en el nombre. Si el archivo colgaba de una subcarpeta borrada desde Windows cuyo nombre llevaba «::», su identificador se partía por donde no era y ese elemento no se podía restaurar ni borrar nunca: se quedaba en la papelera para siempre.
- Vaciar la papelera cuenta la verdad. Si algo no se podía borrar, decía «eliminado» igualmente y encima retiraba su ficha, con lo que el elemento perdía su nombre y su ruta original y ya no había forma de devolverlo a su sitio.
- Un ZIP ya no puede escribir fuera de la carpeta al extraerse. Un enlace colocado antes dentro de la carpeta podía desviar la escritura a cualquier sitio del sistema; y comprimir sin elegir destino dejaba el ZIP en la raíz del volumen, entre las tripas internas del NAS.
- Una subida cortada a medias ya no se hace pasar por buena. Si se caía la conexión con una ISO de varios gigas, quedaba un archivo truncado con el nombre definitivo, indistinguible de uno completo en el listado, por SMB y dentro de la copia de seguridad.
- Copiar ya no sigue los enlaces fuera de la carpeta compartida (mover ya lo hacía bien), y listar una carpeta con millones de archivos ya no se come la memoria del NAS: el listado se corta en 20 000 elementos y lo que falte se encuentra con el buscador.
Carpetas compartidas: lo que se desmarca, se deja de publicar
- Quitarle WebDAV a una carpeta ahora la retira de verdad. La publicación se regeneraba leyendo la lista ANTERIOR, así que una carpeta desmarcada —o borrada— seguía sirviéndose por la web mientras el panel decía que ya no existía. Y al revés: marcar una nueva no la publicaba aunque el panel dijera «WebDAV aplicado».
- Editar una carpeta ya no borra los ajustes de SMB. Tocar cualquier carpeta compartida reescribía la configuración de Samba perdiendo el nombre del equipo en la red, el grupo de trabajo y la compatibilidad con equipos antiguos: la impresora y el televisor que solo hablan SMB2 dejaban de conectar, y el NAS cambiaba de nombre en «Red» de Windows.
Instalación y actualización
- El paso que activa «contrib» ya hace algo, y de él depende ZFS. No funcionaba en Debian 12 —solo tocaba las líneas terminadas en «main», y ahí terminan en «main non-free-firmware»— pero anunciaba «añadido» igualmente: uno se enteraba mucho después, al ver que ZFS no estaba, y nada lo relacionaba con este paso. Ahora se añade en los dos formatos de lista que puede haber, solo en las entradas de Debian, se comprueba que apt sigue pudiendo actualizar sus listas y, si no, se deshace y se avisa: quedarse sin ZFS es mucho menos grave que quedarse sin poder instalar nada.
- Un Docker que no arranca ya no aborta la instalación entera dejando el equipo sin panel; avisa y sigue.
- Revertir una actualización fallida devuelve también la configuración. Se restauraban el código y las dependencias, pero no el estado, aunque la copia previa se estaba haciendo y no se usaba jamás: el día que una migración cambie algo a fondo, esa reversión «segura» habría dejado el panel sin levantar.
- Node ya no se instala pasándole a root un script sin comprobar. Cada instalación y cada actualización descargaban «setup_20.x» de NodeSource y se lo daban a bash como root, en silencio. Ahora se pone a mano lo único que ese script hacía —la clave de firma del repositorio y la entrada de apt— y el paquete se instala por apt, firmado y comprobado. Y la clave privada del certificado del panel nace con sus permisos puestos, en vez de arreglarlos un instante después.
El panel dice la verdad
- «Enviar prueba» de las alertas responde. Con el correo mal configurado no pasaba absolutamente nada al pulsarlo: ni un aviso, ni un error. Se descubría el día que fallaba un disco y el aviso no llegaba.
- El asesor de seguridad ya no enseña una comprobación que no podía saltar nunca (buscaba una contraseña de fábrica que este producto no crea), que es peor que no enseñarla: daba tranquilidad sin haber mirado nada.
- Y el reproductor de grabaciones abre el principio del día al cambiar de día con las flechas, en vez de un trozo cualquiera con la aguja fuera de sitio.
Cámaras: cuatro de cada cinco horas no se estaban grabando
- Volver a grabar tras una caída tarda ahora un segundo, y no de diez a dieciocho. La cámara se caía y volvía cada 22 segundos; de esos, 10 se iban esperando a que systemd relanzara el grabador y hasta 8 más en una comprobación previa que no aportaba nada (y que, al abrir una segunda conexión, podía ser justo lo que dejaba la cámara ocupada). Entre las dos, hasta 19,3 horas al día en negro. Ahora el propio grabador reintenta al momento cuando la cámara vuelve enseguida, y va esperando cada vez más —hasta 8 segundos— solo cuando de verdad no está.
- Y sabe distinguir una cosa de otra mirando el disco. Decidirlo por el reloj no vale: a una cámara apagada, ffmpeg tarda entre 3 y 8 segundos en rendirse sin escribir un byte, y eso se habría tomado por «estaba grabando». Ahora se comprueba si el intento dejó un archivo con vídeo dentro. De paso, cada intento que se queda sin imagen se lleva por delante la basura que acaba de dejar: ese trozo de unos cientos de bytes que el panel lista como una grabación que no se puede abrir. (Los que ya estaban en el disco siguen ahí.)
- El NAS te dice que la cámara está rota. Antes no se enteraba:
systemctl da por «activa» una unidad que se relanza cada 20 segundos, así que el diagnóstico salía en verde. Ahora cuenta los reinicios del día y lo dice en la tarjeta de la cámara, en Grabaciones y en Comprobación del sistema: «esta cámara se ha reiniciado 3.868 veces hoy… mientras siga así, no te fíes de tener grabado todo lo que pasó», con qué mirar (el wifi, el cable, el alimentador). Con un umbral para que un microcorte suelto no dé la brasa.
Cámaras: la línea de tiempo enseña lo que FALTA
- Los huecos sin grabación se ven. La barra pintaba azul donde había vídeo y dejaba el resto del color del fondo, así que un hueco de dos horas —la cámara desenchufada, el NAS apagado— se veía igual que la parte de la noche que aún no ha llegado: nada. Ahora salen rayados en la barra, y su hora y su duración («sin grabación · 03:12 – 05:40») y el total del día aparecen al poner el ratón encima. En una grabadora lo que hay que ver de un vistazo no es lo que grabó, que se da por supuesto, sino lo que le falta.
- Y la barra va fina con miles de trozos: lo contiguo se cose en una sola pieza (las 24 horas de un día sano son ahora un solo rectángulo, no 24) y la rejilla de Grabaciones ya no pinta miles de casillas de golpe.
- Las miniaturas salen aunque el trozo no tenga índice todavía. Se pedía el fotograma con una búsqueda dentro del archivo, y eso necesita un índice que el NAS pone después y en segundo plano: con miles de trozos esperando turno, la rejilla entera decía «sin imagen» con el vídeo perfectamente ahí. Ahora, si la búsqueda falla, se saca decodificando desde el principio. Y del trozo del que no sale fotograma se recuerda un rato que no sale, en vez de volver a intentarlo en cada visita.
Cámaras: y lo que se descubrió mirando el resto
- La retención podía borrar un día entero de vídeo que aún estaba en plazo. Condenaba por la hora a la que EMPIEZA un archivo, y desde que existe la consolidación un archivo puede ser un día completo (con el nombre de su primer trozo). Con 7 días guardados, el archivo del día 1 se borraba entero el día 8 a las 00:00, llevándose por delante las horas que todavía se podían ver. Ahora se mira por dónde ACABA.
- Poner el índice a un trozo ya no puede pisar la hora recién cosida. Reparar es leer y reescribir el archivo entero, y puede llevar minutos; al terminar se sustituía sin comprobar que siguiera siendo el mismo archivo, así que podía escribir la copia vieja de una pieza encima de la hora completa. Ahora se compara antes y, si cambió, no se toca.
- Al borrar lo viejo se va también su miniatura y su marca de movimiento. Se quedaban en una carpeta oculta que nadie limpiaba, creciendo dentro del mismo volumen que la retención existe para no llenar — y en una grabadora el disco lleno es dejar de grabar.
- Exportar un tramo que cruza un hueco ya no se trae una hora de más, y el corte se hace saltando por el archivo en vez de recorriéndolo entero (con un día consolidado, eso era esperar sin motivo).
- Una carpeta de grabaciones que no se puede leer ya no se pierde en el silencio. Permisos cambiados, un error del disco: se veía exactamente igual que una carpeta vacía y no quedaba ni una línea en ningún sitio, mientras la limpieza no borraba nada y el disco se seguía llenando. Ahora queda dicho en el registro del sistema (una vez, no en cada consulta).
- Y un trabajo programado que deja de valer ya no se borra solo. Al descartarlo para que no tumbara a los demás, la siguiente vez que se tocaba cualquier otra tarea desaparecía del disco para siempre. Ahora se conserva.
El Panel de Control: lo que se toca sin querer
- Quitarle el acceso a la última persona de una carpeta la deja abierta a todo el mundo, y ahora se avisa antes de guardar. Para Samba una lista de permitidos vacía significa «que entre cualquiera», así que el gesto hace exactamente lo contrario de lo que parece. El comportamiento de Samba no cambia; lo que cambia es que ya no se hace sin enterarse.
- Liberar una tarjeta de red pedía confirmación con un texto que no existía. Salía el nombre interno del mensaje en lugar de la explicación — justo en la pantalla donde equivocarse deja el NAS sin red y hay que ir con un teclado. Se ha escrito lo que hace de verdad. (Y se han repasado las 2.628 claves de texto de la aplicación una a una: había nueve usadas sin definir, todas saliendo en pantalla como su nombre interno. Hoy no queda ninguna.)
- El aviso de restaurar la configuración ahora dice algo útil. Era «Sobrescribirá el estado actual del sistema. ¿Continuar?», y con eso no hay forma de decidir. Ahora explica qué se sobrescribe, que los datos de los discos no se tocan, que lo de ahora no se guarda antes — y qué pasa con las claves: las de las cuentas sí viajan en la copia (guardadas como resumen, no en claro), y los secretos de los servicios no, así que hay que volver a escribirlos.
- La clave privada de un cliente de VPN ya no se puede perder por un clic fuera. Ese diálogo tiene la ÚNICA copia que existe, y se cerraba con Escape o pulsando el fondo.
- Apagar un servicio ya no arrastra el formulario a medio escribir. Pasaba en WebDAV, en el DHCP, en el DNS y en la VPN: el interruptor mandaba de propina lo que hubiera sin guardar. Y WebDAV con una ruta heredada que ya no vale se puede volver a apagar, que antes se quedaba bloqueado sin ningún campo que corregir.
- Las pantallas ya no dicen «aquí no hay nada» cuando lo que pasa es que no lo saben. Si falla la consulta —NFS, cuotas, tareas programadas— se dice que ha fallado, en vez de enseñar una lista vacía que invita a crear lo que ya existe. En cuotas y en tareas programadas, además, con un botón para volver a pedirlo.
- Y la orden de ejemplo de rsync se compone con lo que tiene el servidor, no con lo que hay escrito en el formulario: enseñaba un usuario y una carpeta que aún no existían, y al copiarla al otro equipo respondía «auth failed» o «unknown module».
Archivos: borrar muchos de una vez, con su barra
- Se acabó el «como mucho 200». Seleccionar una carpeta entera y darle a borrar es lo más normal del mundo, y con más de doscientos elementos el NAS lo rechazaba ENTERO —sin borrar nada— con el mensaje crudo de validación en inglés: «List should have at most 200 items after validation, not 5837». Quien lo veía no tenía forma de saber que la salida era ir seleccionando de doscientos en doscientos. Ahora se aceptan hasta veinte mil de una vez.
- Y mientras borra, lo dice. Borrar unos miles lleva su rato, y antes la pantalla se quedaba quieta sin señal de si avanzaba o se había colgado. Ahora sale la misma barra de progreso que ya usan comprimir o exportar, contando de verdad («1.200 de 5.837»). Aparece a partir de cincuenta elementos: para cuatro archivos, un aviso que aparece y desaparece de golpe es ruido. Si algo falla a mitad, la barra se cierra diciendo qué pasó en vez de quedarse girando para siempre.
- Comprimir sigue con su tope, y ahora se entiende por qué. Ahí no se puede trocear: serían varios zips sueltos en vez del que se pidió. Si te pasas, lo dice en cristiano y con la salida —«mételos en una carpeta y comprime la carpeta»— en lugar del mensaje de validación.
1.22.02026-08-02
El NAS no salía en «Red» de Windows. Nunca
- Y no era cosa de la red de nadie: era una ruta mal escrita. El servicio que anuncia el NAS a Windows (wsdd) se configuraba con
ExecStart=/usr/bin/wsdd, y Debian instala ese programa en /usr/sbin/wsdd. systemd no puede arrancar lo que no existe, así que la unidad moría con 203/EXEC en cada intento. Como el anuncio se aplica sin comprobar nada —a propósito: que falte no puede impedir compartir carpetas—, el resultado era un NAS que servía archivos perfectamente y no aparecía jamás en «Red». La ruta ahora se busca en el disco en vez de darla por sabida, y se corrige sola al arrancar tras esta actualización.
- El panel además echaba la culpa a quien no era. Decía «Falta wsdd… se instala con la próxima actualización del sistema», y el programa estaba instalado: lo que fallaba era la unidad. Quien leyera eso se quedaba esperando una actualización que ya tenía. Ahora dice lo que pasa —«el servicio wsdd no está funcionando»— sin inventarse la causa.
Cámaras
- Toda cámara que no arrancaba decía lo mismo: «la cámara no respondió». Daba igual que fuera una contraseña equivocada, una dirección mal puesta o la cámara desenchufada, porque lo que ffmpeg explica por su salida de error se estaba tirando a la basura. Ahora se lee y se traduce: «la cámara rechaza el usuario o la contraseña», «no hay nadie escuchando en ese puerto», «la ruta de la dirección no existe en esa cámara».
- Y en la rejilla no decía nada en absoluto. Un directo que fallaba devolvía un flujo válido y vacío: el navegador pintaba el icono de imagen rota y ahí se acababa la información. Ahora, si el directo se cae nada más abrirlo, se contesta con el motivo.
- La grabación podía pararse en silencio y para siempre. Al grabar faltaba el tiempo de espera, así que una cámara que deja de emitir sin cerrar la conexión —wifi flojo, la cámara se cuelga: lo normal en las baratas— dejaba a ffmpeg esperando indefinidamente. Y un proceso vivo pero parado no lo reinicia nadie: el reinicio automático solo actúa cuando el proceso termina. Se descubría el día que hacía falta el vídeo.
- Un corte de luz se llevaba el último tramo entero. Los tramos se guardaban con el índice al final, que es lo que hace que un MP4 a medias no se pueda abrir: hasta diez minutos ilegibles, y justo los del momento en que pasó algo. Ahora cada tramo se reproduce aunque esté cortado por la mitad.
- Abrir la app tardaba una eternidad, con el NAS perfectamente sano. La lista de cámaras —que el panel pide al abrir y cada pocos segundos— pagaba POR CADA cámara una resolución completa del almacenamiento (zpool status, btrfs usage… y la búsqueda de pools sin importar, que sondea todos los discos) más un viaje a systemd, todo en fila: con tres cámaras, cuatro escaneos completos por visita. Ahora el punto de montaje se resuelve una vez y se recuerda (validado en microsegundos), los grabadores se preguntan a systemd en UNA llamada y las cámaras se consultan en paralelo: la app abre al instante. De paso, la misma miniatura sirve a todos los que miran durante unos segundos: la rejilla, el Resumen y el móvil abiertos a la vez lanzaban cada uno su conexión contra una cámara que solo admite una, y por eso las casillas caían en «sin imagen».
- La línea de tiempo tardaba una eternidad en cada salto. El índice de un trozo se ponía la primera vez que alguien lo REPRODUCÍA: leer y reescribir un archivo de una hora —en fila, con la grabación corriendo de fondo— mientras el vídeo se quedaba en negro hasta el minuto largo. Ahora el índice lo pone el NAS en segundo plano al poco de cerrarse cada trozo, de uno en uno y empezando por lo recién grabado, que es lo que se abre; pinchar una hora en la línea de tiempo carga al momento. La reproducción solo repara como último recurso (un trozo de hace un rato que el goteo aún no alcanzó).
- La carpeta seguía llenándose de trozos aunque el troceado fuera de una hora. Cada vez que la cámara se cae y vuelve —wifi flojo, un corte: lo normal en las baratas— el grabador abre un archivo NUEVO, así que una mala tarde picaba la hora en un montón de trozos; y los de HOY no se cosían hasta la consolidación del día siguiente. Ahora, al rato de cerrarse cada hora, sus trozos —los que sean— se cosen en UN archivo con su índice puesto, en segundo plano y empezando por lo recién grabado; la consolidación nocturna sigue dejando después un archivo por día. Un archivo por hora de hoy y uno por día cerrado, pase lo que pase con la wifi.
Almacenamiento: los discos avisan antes de morirse
- Los contadores SMART, en cristiano. Salían tal cual los da smartctl («Reallocated_Sector_Ct: 0») y solo los entendía quien ya supiera leerlos. Ahora un disco sano dice una sola cosa clara —«Sin señales de desgaste»— y, cuando algo asoma, se dice lo que es («12 sectores dañados apartados») en ámbar o rojo y con su explicación al pasar el ratón.
- Y el NAS los lee él solo. Sectores que se apartan, otros pendientes de comprobar, celdas de SSD gastadas: ahora generan un aviso aunque SMART siga dando el disco por bueno, porque cuando deja de darlo ya suele ser tarde para sacar los datos. Además cada disco pasa una revisión corta una vez al mes, sin configurar nada; el resultado solo aparece si es malo.
- Borrar un disco del todo antes de venderlo o tirarlo. Botón derecho sobre el disco → «Borrar del todo…»: descarte de celdas en los SSD y una pasada de ceros en los mecánicos, con su progreso, su velocidad y su aviso al terminar. Se niega en seco con el disco del sistema, con los montados y con los que están dentro de una pool, y mientras dura el disco no se ofrece para nada más.
- La visión general empieza por lo que importa: cuánto cabe, cuánto hay ocupado y cuánto queda, sumando todas las pools. Y cada disco dice en qué pool está —en limpio, en azul— en vez de un candado ámbar con «miembro de un pool ZFS».
- Las pools pueden nacer cifradas. Una casilla en el asistente y una contraseña: nada más. Protege lo guardado si roban el NAS o si un disco sale de casa (garantía, venta, avería). La contraseña no se guarda en ningún sitio —por eso protege—, así que tras cada arranque la pool espera, con su candado y a la vista, a que se escriba en su propia tarjeta; los datos están intactos y todo vuelve a su sitio al momento. El asistente lo avisa sin rodeos: quien la olvide no recupera los datos, nadie puede. Por debajo: cifrado nativo de ZFS o LUKS2 bajo cada disco Btrfs, con la clave viajando siempre por stdin (jamás visible en la lista de procesos ni en los registros).
El Resumen: hovers rotos en oscuro y tarjetas que no decían la verdad
- Pasar el ratón por una tarjeta en tema oscuro la convertía en un tarjetón gris lavado con el texto ilegible: el realce era un velo BLANCO al 55 % pensado para el tema claro, y el remapeo oscuro cubría todas las variantes menos justo esa (y la del Launchpad). Ahora las dos están remapeadas —el arreglo vale para todo el sistema, no solo el Resumen—, el carril de los anillos de CPU/memoria ya no es un aro claro chillón, y además el realce lleva un anillo azul de acento que se ve igual de bien en los dos temas.
- La tarjeta de Cámaras decía «Videovigilancia» pasara lo que pasara. Un rótulo fijo no es un estado. Ahora dice la verdad: cuántas están grabando, «2 cámaras sin señal» en ámbar (el fallo que se descubre el día que hace falta el vídeo), o «Ninguna configurada».
- La de Copias de seguridad decía «Cortafuegos y respaldos» —el cortafuegos no vive ahí— y mezclaba los avisos globales del sistema. Ahora contesta a lo único que se le pregunta: cómo acabó la última copia (correcta, fallida, copiando ahora), y «Sin copias configuradas» en ámbar, porque ni el RAID ni los snapshots salvan de un incendio.
- Una pool cifrada bloqueada hacía decir al Resumen «Sin pools todavía». Mide 0 bytes hasta que se desbloquea, y la tarjeta y el widget la trataban como inexistente o como avería en rojo. Ahora dicen lo que es: «1 pool esperando su contraseña», en ámbar y con su candado.
- Y si el NAS no contesta a una consulta, se dice («Sin respuesta ahora mismo») en vez de enseñar el identificador interno del texto, que es lo que salía al fallar la de máquinas virtuales.
El diagnóstico de las copias decía justo lo contrario de lo que pasaba
- «fallo al subir …: Skipped copy as --dry-run is set». Cuando una subida falla sin dejar rastro, el panel repite la misma orden en seco para ver qué dice rclone. Pero si esa prueba funciona, lo que rclone escribe («se salta la copia porque es una prueba en seco», y detrás el recuento con un flamante «100%») es la prueba de que todo va bien —leyó el origen, llegó al destino, supo qué copiar—, no la explicación de nada. Se estaba enseñando como causa del fallo, que es peor que no decir nada: parece una explicación, ocupa el sitio de la de verdad y manda a buscar donde no hay nada.
- Ahora, cuando la prueba en seco pasa, se dice lo que eso descarta, que no es poco: configuración, conexión, credenciales y lectura del origen. Y si el destino es Nextcloud/ownCloud y el rclone instalado no sabe trocear, se apunta al sospechoso número uno —el tamaño del archivo— con la orden para actualizarlo. Ese caso en seco no se reproduce jamás, porque en seco no se manda un solo byte.
- Y el consejo ya no llega partido por la mitad. El motivo se recortaba a 400 caracteres y el recorte caía justo en la orden del final: se llegó a ver un «Actualízalo:
sudo -v &&» cortado en seco, con la única parte accionable de todo el mensaje a medias.
- Recordatorio de dónde estaba el fallo de verdad: Debian 12 trae rclone 1.60 y las subidas troceadas a Nextcloud llegaron en la 1.63, así que un archivo de varios GB iba en un solo envío y lo cortaba el propio servidor. La actualización del sistema ya instala un rclone ≥ 1.63 (verificando su suma), así que esto se arregla al actualizar el NAS.
Tu nube personal no es donde guardas las copias
Las nubes, como una carpeta más del NAS
Cámaras: muro, pantalla completa, captura y un menú de verdad
Docker y las máquinas ya se pueden copiar
Cámaras: una ventana como una grabadora de verdad
Cámaras: se acabaron los dos mil archivos
Cámaras: horario de grabación semanal
Cámaras: se acabó el borroso que poníamos nosotros
Grabaciones ya no se atasca al abrir
Cámaras: reproductor forense, calendario, exportar tramos y PTZ
La copia se comprueba pesando los dos lados
Las grabaciones ya se pueden recorrer
La previsualización de la rejilla, por el flujo bueno
La ventana del directo se redimensiona de verdad
El NAS iba lentísimo por culpa de las miniaturas
El directo ya no choca con la grabación
La tienda ya no viaja en el paquete de arranque
«0 archivos» ya no puede querer decir dos cosas
Una versión con «0 archivos» no está vacía
La carpeta de las cámaras, dentro de la pool y accesible
Buscar una grabación por fecha y por hora
Una copia en marcha ya dice si avanza o se ha colgado
La contraseña de la cámara, fuera de los mensajes de error
Por qué el directo fallaba con «Operation not permitted»
Miniaturas de las grabaciones
El panel abre casi el doble de rápido desde fuera
- Un solo archivo de 1 MB antes de ver nada. Todas las apps viajaban en el mismo paquete —1.010 kB, 267 comprimidos— que había que descargar ENTERO para llegar al escritorio, aunque solo fueras a mirar el resumen. En la red de casa no se nota; por la VPN desde el móvil son varios segundos en blanco. Ahora cada app se descarga al abrirla: el arranque pasa de 267 kB a 162 kB y Monitor pesa 2,5 kB, Cámaras 6,9 y Archivos 15.
- El andamiaje ya estaba puesto —las ventanas envuelven su contenido en un
Suspense desde que el Terminal se cargaba así por xterm—, solo faltaba usarlo. Mientras llega su trozo se ve «Cargando…» dentro de la ventana, que ya está abierta con su marco y su título.
Un usuario «wsdd» que no se podía borrar
La actualización del sistema, con tres fallos que solo se veían ejecutándola
- Un nombre de paquete equivocado dejaba el NAS sin instalar NADA. La lista traía
sssd-winbind-idmap, que es el nombre que usa Fedora y no existe en Debian: apt abortaba el lote entero con «E: No se ha podido localizar el paquete» y ni Samba, ni ffmpeg, ni ninguno de los otros sesenta llegaban a instalarse. Se ha quitado (en Debian ese puente lo trae sssd-ad, que ya estaba) y, sobre todo, el instalador ya no es todo o nada: si el lote falla, se instala paquete a paquete y se dice por su nombre lo que haya faltado.
- rclone no se podía descargar nunca: la versión salía con el nombre pegado. El fichero
version.txt de rclone no contiene «v1.75.0» sino «rclone v1.75.0», y el código borraba las uves y los espacios: quedaba rclone1.75.0, la dirección salía …/vrclone1.75.0/rclone-vrclone1.75.0-linux-amd64.zip y daba 404 siempre. Comprobado contra el servidor de rclone: la dirección vieja da 404 y la nueva 200. Este fallo estaba escondido detrás del byte corrupto de la comprobación de versión — arreglado aquel, apareció este.
- El registro se contradecía: decía «no se pudo activar unattended-upgrades» y, en la línea siguiente, «Parches de seguridad automáticos activados». El segundo mensaje se escribía siempre, hubiera funcionado o no.
Copias de seguridad: la pantalla ya no miente
- «Este equipo no tiene ninguna copia de seguridad» cuando lo que pasaba es que no se pudieron leer. Si la carga fallaba (backend reiniciándose, red caída), la lista se rellenaba con un vacío inventado y la app afirmaba que no había trabajos — la peor mentira posible justo en la app que existe para no mentir. Ahora lo que falla se queda como estaba, se enseña el error con su botón de reintentar, y la pantalla se recupera sola cuando el backend vuelve.
- El cartel verde «Copias al día» junto a «Última copia correcta: nunca». Un trabajo copiando por primera vez no caía en ningún grupo y la app daba todo por bien hecho. Ahora hay un estado propio «copiando ahora» y el cartel verde exige que no haya nada en marcha y que exista al menos una copia correcta de verdad.
- La prueba verde del destino sobrevivía a editarlo. Cambiabas el servidor, el usuario o la carpeta y la tarjeta seguía enseñando el «conexión correcta» de la configuración anterior. Ahora editar el destino (o cualquier campo del formulario) descarta la prueba.
- El registro de un fallo que no se podía leer se enseñaba como «no hay registro guardado (el fallo es anterior…)» — una causa inventada. Ahora el error de lectura se enseña como lo que es, con reintento.
- El fallo al listar versiones se disfrazaba de «todavía no hay versiones», diciéndole a quien iba a restaurar que no había nada que restaurar. Ahora el error se ve y se puede reintentar.
- Los refrescos ya no se pisan: contador de generación, así la respuesta vieja no machaca a la nueva cuando el intervalo de 30 s coincide con una acción.
Y otros 37 arreglos del mismo barrido, en las demás apps
Botones y desplegables rotos
- El interruptor de «Espejo exacto del origen» salía deformado. El componente no llevaba
shrink-0, y como el texto de ayuda de esa opción tiene 233 caracteres, flexbox le comía el ancho: el carril pasaba de 48 px a 23,7 px y la bolita blanca se salía 22 px por la derecha, flotando fuera de la píldora. Justo el único interruptor peligroso del asistente. Arreglado en el componente, así que se corrigen de paso los cinco del proxy y cualquier otra fila de etiqueta larga + interruptor.
- 63 botones ignoraban su tamaño de letra y los de borrar salían grises. Las clases
.btn-* estaban fuera de toda capa de Tailwind, o sea que se escribían DESPUÉS de las utilidades y les ganaban por orden de aparición: un btn-ghost text-xs salía a 14 px y un btn-ghost text-red-600 salía gris en tema claro —el botón de borrar no parecía peligroso—. Metidas en @layer components, que es donde debían estar.
- Dos desplegables se salían de la pantalla en el móvil. El centro de notificaciones (384 px fijos) y la bandeja de subidas (320 px) van anclados a la derecha: en una pantalla de 375 px su borde izquierdo caía en −61 px y −69 px, y como el cuerpo no tiene desplazamiento, ese trozo no se podía recuperar de ninguna manera. Ahora tienen tope de viewport.
Actualizar rclone desde el panel, sin entrar por SSH
- El aviso terminaba en un callejón. El panel detecta perfectamente que el rclone de Debian no sabe trocear las subidas a Nextcloud… y lo único que sabía ofrecer era «abre un terminal y pega este
curl». Para quien no entra por SSH —que es la mayoría de quien compra un NAS— eso es el final del camino: sus archivos de más de un giga no se copian y no hay nada que pueda hacer desde el panel. Ahora hay un botón justo debajo del aviso, en Copias → probar destino.
- Sin abrir ningún agujero. La API no ejecuta nada que venga de la web: solo arranca una unidad de systemd ya instalada (
lgm-rclone.service), igual que hace la actualización del sistema. Esa unidad corre el guion del propio repositorio, que reutiliza la misma función que ya se ejecuta en cada actualización y que comprueba el SHA-256 antes de instalar nada. No se le pasa ni un argumento.
- Si no cuaja, el motivo llega a la pantalla: el guion lo escribe en
/var/nas/rclone-update.log y el panel enseña las últimas líneas, en vez de un «no se pudo» a secas.
«Opciones regionales» pasa a llamarse «Región y apariencia»
Fondos del escritorio
- Tres fondos nuevos, y el de siempre por defecto. Astur Neon Cyber (azul eléctrico con destellos neón en las esquinas), Monolithic Lines (rejilla de pistas de circuito) y Liquid Aurora (manchas pastel fundidas), en Panel de control → Opciones regionales → Apariencia, junto al lado de los controles y los efectos.
- Pintados con gradientes: ni una imagen, ni un SVG, ni una animación. En un NAS eso no es estética sino ingeniería: el escritorio vive permanentemente bajo varias superficies con
backdrop-filter y se recompone con cada ventana que se mueve. El CSS del panel crece 1,2 kB comprimidos y el servidor no se entera de nada: la preferencia vive en el navegador, como el tema y el idioma.
- «Original» no es un fondo más: es la ausencia de fondo. Al elegirlo se BORRA el atributo del documento en vez de escribir uno, así que no queda ninguna regla sobrescribiendo nada y el CSS nativo claro/oscuro pinta exactamente igual que antes de que esto existiera.
- La miniatura del selector es el mismo gradiente que el escritorio, declarado una sola vez y reutilizado. Es lo que evita el fallo clásico de estos selectores: que la muestra enseñe un fondo y se aplique otro el día que alguien retoca un color y se olvida del otro.
- Los cuatro responden al claro/oscuro. Un fondo que ignorase el tema dejaría el cristal claro de las ventanas sobre un fondo negro.
La documentación en el móvil: ilegible por dos motivos
- Se salía media pantalla, y no era culpa del diseño. En CSS Grid,
1fr significa minmax(auto, 1fr), y ese auto deja que el contenido imponga su ancho mínimo. Con una tabla dentro —y las guías van llenas—, la columna del texto se estiraba hasta los 881 px de la tabla, el índice lateral se estiraba con ella hasta 942, y la guía de Copias se salía 587 px de la pantalla de un móvil. El envoltorio con desplazamiento estaba puesto desde el principio y no servía de nada, porque nunca llegaba a tener un ancho que respetar. La regla de escritorio lo hacía bien; la del móvil se había quedado a medias.
- Y los bloques de órdenes salían en una sola línea, con la palabra `bash` delante. Las vallas
` sangradas dentro de una lista numerada no se reconocían, así que el bloque caía en el párrafo siguiente y acababa como un código en línea con todos los saltos perdidos. En una guía de pasos casi todos los bloques van dentro de una lista: eran órdenes imposibles de leer y de copiar, y de paso una línea de 1300 px que se llevaba la página por delante.
- Un `código` en línea largo —una ruta como
/etc/letsencrypt/live/…/— tampoco puede empujar la página: en pantalla estrecha se parte antes que desbordar.
rclone no se actualizaba nunca, por un byte
- La comprobación de versión estaba rota de una forma difícil de ver: donde debía ir
\1 —la referencia al número capturado— había un byte de control colado en el archivo. sed devolvía ese byte en vez de la versión, sort -V lo consideraba más moderno que 1.63, y la actualización concluía «rclone suficiente» y se saltaba la descarga. En todas las actualizaciones, desde siempre. De ahí que un NAS actualizado siguiera con el rclone 1.60 de Debian y las copias grandes a Nextcloud siguieran fallando. Reparado, y comprobado el repositorio entero: no queda ningún otro byte así.
- Y si la descarga falla, ahora se dice lo que cuesta. El aviso era «no se pudo descargar rclone», que no le dice a nadie que sus copias de más de 1 GB van a fallar. Ahora lo explica y da la orden para ponerlo a mano. Además se reintenta por IPv4, que es el mismo motivo por el que se caía npm.
El Centro de Paquetes: ocho AdGuard Home
- La tienda deduplicaba por NOMBRE. El feed de Community Applications trae la misma imagen publicada por varias personas con nombres distintos —«AdGuard-Home», «AdGuardHome», «AdGuard Home»…—, y cada grafía entraba como una aplicación diferente. Ahora se deduplica por imagen, que es lo que identifica a un programa de verdad, y entre las repetidas se queda la más completa: la que trae puertos, rutas y variables bien puestos es la mantenida; la que llega pelada es justo la que se instala y no arranca.
- Lo mismo entre fuentes distintas. La misma aplicación llegaba por Community Applications y por CasaOS, y como cada fuente se escribe por su lado, salían las dos.
- Y ya no se ofrece lo retirado. Se descartaban las entradas marcadas como
Plugin y Deprecated, pero no las marcadas Blacklist, Removed u Obsolete: eran imágenes que ya no existen en el registro y que al instalarlas fallan con un «manifest unknown» incomprensible desde el panel.
Almacenamiento moría con un error interno si lsblk fallaba
- El listado de discos se pedía sin controlar el fallo del programa que los lee. Si
lsblk no contestaba —un disco retirado en mitad del recorrido, una controladora que no responde—, la excepción subía tal cual y la pantalla entera moría con un error interno y una traza en el registro, en vez de decir que no se pudieron leer los discos. Se probó llamando a las 92 rutas de la API: era la única que reventaba así.
Pantallas que se quedaban en blanco por una consulta secundaria
- Estado de los discos: se pedían SMART y el estado del scrub a la vez, y si fallaba el segundo —en un NAS sin pool, por ejemplo— desaparecía también la salud y la marca de los discos, que se habían leído perfectamente.
- Instantáneas: los datasets son cosa de ZFS, así que un NAS de Btrfs se quedaba sin ver ninguna instantánea.
- Carpetas compartidas: cuatro consultas, y un fallo en la de grupos dejaba la pantalla sin ninguna carpeta.
- Copias de seguridad: un destino que diera error escondía todas las tareas, que es justo lo que hay que poder mirar cuando algo va mal.
La actualización se caía por IPv6
- `npm error errno ENETUNREACH`, y el NAS con internet perfectamente. Al compilar el panel, node prefiere la dirección IPv6 de
registry.npmjs.org. Si el router reparte IPv6 pero no hay salida real por ahí —lo normal cuando el IPv6 está a medias—, la conexión muere al instante y la actualización entera se aborta. Ahora se resuelve IPv4 primero, que es lo que funciona en esas redes.
- Y si aun así falla la red, se dice que es la red. El guion ya distinguía «me quedé sin memoria» de «no compila», pero un corte de internet caía en un genérico «no se pudieron descargar las dependencias» que no decía ni dónde mirar. Además ahora reintenta con esperas crecientes: que se caiga la wifi dos segundos ya no aborta una actualización.
Lo que se hace solo
- Una revisión rota dejaba sin hacer todas las siguientes. El planificador repasa once cosas cada treinta segundos y las once estaban dentro del mismo bloque de error: la primera que fallara se llevaba por delante al resto de esa vuelta. Como estos fallos son constantes —un
smartctl que no entiende una controladora falla igual cada treinta segundos—, no se perdía una vuelta: se perdían para siempre la sincronización de la tienda de aplicaciones, la limpieza de lo grabado por las cámaras, el aviso de actualizaciones y el resumen de notificaciones. Cada revisión va ahora por su cuenta.
Aplicaciones
- Instalar una aplicación grande fallaba por reloj. Descargar la imagen y arrancarla compartían un único límite de diez minutos, y una aplicación de varios gigas por una conexión de casa se lo come sin despeinarse: el panel daba la instalación por fallida mientras Docker seguía descargando por detrás, y la aplicación acababa instalándose después de que el panel dijera que no. La descarga va ahora aparte, con su propio tiempo y avisando de que puede tardar.
1.21.02026-08-01
Copias a Nextcloud: los archivos grandes
- Un archivo grande no subía, con la cuenta medio vacía. rclone lo mandaba en un solo
PUT, y Nextcloud es PHP sobre Apache: lo corta el upload_max_filesize de PHP (128 M en muchas instalaciones), el LimitRequestBody del Apache de delante o sencillamente el tiempo. Nada de eso tiene que ver con el espacio libre, así que el fallo aparecía con 500 GB disponibles y no había por dónde cogerlo. Ahora la subida va troceada (10 MiB), y la opción viaja en la línea de órdenes: las conexiones que ya tengas quedan arregladas sin rehacerlas.
- Y la dirección identifica al servidor. El desplegable «Tipo de servidor» era opcional, y dejarlo vacío no era un detalle estético: sin él rclone trata el destino como un WebDAV cualquiera y no trocea. Quien pega la dirección que le da el propio Nextcloud (
…/remote.php/dav/files/ana/) no tiene por qué saber que además hay que elegir la marca en una lista: esa ruta solo la sirven Nextcloud y ownCloud, así que ya se deduce.
- El aviso del fallo se cortaba justo donde decía dónde mirar. Se guardaba acotado a 400 caracteres y la orden completa se comía el final — el «Registro completo: /var/nas/backups/…», que es la única línea accionable. Ahora la orden se omite cuando hay registro guardado (ya va en su cabecera) y el límite da de sobra.
La web, entera en web/ — y las licencias, de un solo uso
- La web de venta y el portal de licencias eran dos carpetas (
web/ con el generador de la documentación y portal/ con la aplicación) para lo que un visitante ve como una sola web. Ahora todo vive en `web/`: landing, compra con Stripe, cuentas, licencias y documentación. El Dockerfile se queda en la raíz a propósito, porque la documentación se genera del README, del CHANGELOG y de docs/.
- Cada clave vale para UN solo NAS. Al activarla, el equipo la reserva en el servidor con una huella suya (un hash del
machine-id; no viaja nada personal). El mismo equipo puede reactivarla siempre —reinstalar no puede castigar a quien pagó—; otro recibe un «ya está activada en otro equipo». Al quitarla del panel se suelta sola, y desde /admin se puede liberar cuando a un cliente se le rompe un disco. Con margen: sin internet, la licencia se activa igual. Un NAS en un armario sin red no puede quedarse sin su producto por no poder llamar a casa, y quien quisiera saltárselo solo tendría que desenchufar el cable.
- Emitir una licencia a mano desde `/admin`, ligada a un correo. Para lo que no pasa por la tienda: una factura, un regalo, tus propias máquinas o reponerle la clave a quien la perdió. Antes la única forma de emitir una era cobrando, así que todo eso obligaba a entrar en la base de datos.
- El cliente da de baja su propio NAS, desde su cuenta. Cada clave vale para un equipo, así que sin esto cambiar de máquina —o que se rompa un disco— obligaba a escribirte y esperar respuesta. Es su licencia: puede moverla cuando quiera. El mensaje que ve en el NAS cuando la clave está en otro equipo ya le dice justamente eso.
- Una clave que no consta emitida no se activa. La firma la comprueba el NAS por su cuenta, pero una licencia que no está en la base de datos no la has vendido tú. Es lo que convierte esto en una lista de clientes de verdad y no en un contador.
- Licencia gratis al registrarse, con su interruptor en
/admin. Para una campaña, una beta o una feria: quien crea una cuenta sale con su clave emitida. No es el modo gratuito — cada uno tiene su licencia, con su correo dentro y para un solo equipo—, y al apagarlo las que ya diste siguen valiendo.
- PostgreSQL de verdad:
psycopg entra en las dependencias. Estaba documentado como «cambia una línea del .env», pero sin el driver ese cambio fallaba al arrancar — el peor momento para descubrirlo.
1.20.02026-08-01
Repaso del Panel de Control con el panel abierto delante
- El primer arranque no entraba. «Crear y entrar» creaba la cuenta de administrador y devolvía a la pantalla de acceso, sin un mensaje: el asistente mandaba el token en el cuerpo de la respuesta, pero la sesión vive en una cookie desde hace dos versiones y el panel ya no guarda ese token. Lo primero que hace cualquiera con LGM-OS recién instalado parecía roto.
- Un fallo del servidor llegaba como «Error HTTP 500» a secas. Cualquier excepción que se escapara de un endpoint salía con el cuerpo de texto plano de Starlette, y el panel —que espera
{"detail": …}— no encontraba nada que enseñar. Desde el otro lado es indistinguible de que el botón no haga nada. Ahora todo 500 llega con el motivo escrito; el rastreo completo sigue yendo al registro, que es donde se investiga.
- El diálogo de usuarios se comía el error. Una contraseña que no cumplía la regla, o un nombre repetido: el servidor lo rechazaba, el aviso se pintaba en la pantalla de detrás y el propio diálogo lo tapaba. Pulsabas «Guardar» y no pasaba nada. El aviso va dentro.
- Falta una carpeta de configuración y el panel no lo decía. Escribir en un directorio de «drop-in» que el paquete aún no ha creado (
/etc/ssh/sshd_config.d, por ejemplo) reventaba con un 500 mudo. Se crea si falta, y si aun así falla se explica cuál era.
- DNS y DHCP repetían el mismo párrafo dos veces. «dnsmasq no está instalado…» viajaba a la vez en
hint y en warnings, y el panel pinta los dos, uno debajo del otro.
- Comprobación del sistema repetía el consejo de cada fallo. El resumen de cada grupo era literalmente el consejo de su primera comprobación fallida, y esa comprobación aparecía tres líneas más abajo con el mismo texto. Ahora la cabecera dice QUÉ falla y el consejo se queda donde sirve.
- Comprobación del sistema, entera en castellano dentro del panel en inglés. Esa pantalla la escribe toda el servidor —nombres de servicio, resultados y consejos— y no había ni una frase en el catálogo: 70 entradas nuevas, más los «falta el paquete» de certbot, dnsmasq, WireGuard, ffmpeg y rclone, que son lo primero que se lee en un NAS recién instalado.
- Otros dos restos en castellano en el panel inglés: la zona horaria cuando no se puede leer («desconocida») y la etiqueta «· minimizada» de la barra de tareas.
- «Programar» salía apagado sin decir por qué. En Tareas programadas el botón depende de un campo cuyo texto solo está en el placeholder. Ahora se dice qué falta.
- El SAI guardaba en silencio. «Aplicar cambios» guardaba bien y no cambiaba nada en pantalla: no había forma de distinguirlo de un botón que no hace nada.
- Red, sin ninguna tarjeta, no decía nada. La sección quedaba con el aviso amarillo y el vacío. Y es justo la pantalla a la que se viene cuando el NAS ha perdido la red.
- El pie de la pestaña rsync era el de NFS. Mandaba a elegir las carpetas en «Carpetas compartidas» cuando se marcan ahí mismo, unas líneas más arriba.
- Copias: el motivo del fallo podía ser «\<5\>NOTICE:». El prefijo de syslog que rclone escribe en cada línea se colaba donde va la explicación. Parece una explicación, ocupa su sitio y manda a buscar por donde no es.
Copias de seguridad
- El motivo de un fallo podía ser una línea de «todo va bien». Cuando una copia a la nube falla sin explicarse, el panel relanza la misma orden en seco (
--dry-run) para ver qué pasa. Las líneas de ese ensayo —«ISOS/ubuntu.iso: Skipped copy as --dry-run is set»— acababan ocupando el sitio del motivo: son justo lo contrario de un error, la prueba de que rclone leyó el origen y supo qué copiar. Ahora se descartan, con su etiqueta de nivel («NOTICE:») delante o sin ella.
- Y el código 1 acusaba al panel de un fallo que no era suyo. Se traducía por «error de sintaxis (un fallo del panel, no tuyo: repórtalo)», que es lo que dice la documentación de rclone; en la práctica rclone devuelve 1 para casi cualquier cosa que salga mal durante la transferencia. Una copia que había listado archivos y fallado a mitad llegaba anunciada como un error nuestro, y mandaba a buscar donde no había nada. Ahora dice lo único cierto: que el motivo está en el registro completo.
- El aviso de «todavía no disponible» empezaba a media frase. El texto de cada capacidad hacía dos trabajos a la vez: describir la función (y se lee detrás de su nombre) y explicar por qué no está. Donde el panel lo enseña solo —el aviso del destino que has elegido— salía «copias incrementales con enlaces duros. Falta rsync…»: una frase sin principio, en minúscula y sin sujeto. Ahora son dos campos: qué hace y por qué no está, cada uno donde sirve.
- Y lo mismo con el cifrado, en el último paso del asistente: bajo un título que ya decía «Todavía no disponible» venía «el cifrado de la copia todavía no está disponible: …», repitiendo el título y empezando en minúscula.
- «Crear la copia» salía en gris sin decir qué faltaba. Es el último paso de un asistente de cuatro: se ha recorrido todo y parece que la aplicación se ha atascado. Ahora dice cuál de las tres cosas falta.
Y el resto del escritorio, recorrido igual
- El terminal se quedaba en negro sin decir nada. Cuando el servidor no puede abrir una sesión manda el motivo y cierra acto seguido; ese texto se escribía dentro de xterm, que en ese caso no ha llegado a pintar un solo fotograma. Lo que quedaba era un rectángulo vacío con un «Desconectado» al lado. El motivo se enseña fuera del terminal.
- La tienda tenía la misma categoría dos veces, una en inglés. «Networking (24)» junto a «Red (16)», un «Home» que era Domótica, y «Finance» y «Social» sueltas: las tiendas de CasaOS no se llaman igual entre ellas y lo que no estaba en la tabla se colaba con su nombre original. Ahora lo desconocido va a «Otros», como ya hacía la fuente de Unraid.
- «Analizar» del Informe de espacio, apagado sin decir por qué. En un NAS recién instalado no hay volumen del que proponer carpetas, el campo sale vacío y el botón en gris no contaba nada.
- Cada carpeta compartida enseña sus TRES protocolos, no dos. WebDAV faltaba en la fila —solo estaban SMB y NFS— aunque el editor de la carpeta sí lo ofrece: la lista decía «va por SMB y no por NFS» y se callaba justo lo que hace falta para llegar a ella desde fuera de casa. Va con su color, el mismo turquesa que WebDAV ya tiene en «Usuario y grupo», y como los otros dos es su propio interruptor.
1.19.02026-08-01
Puesta a punto para producción
- SMB3 con cifrado obligatorio. Estaba fijo en SMB2 con «cifra si el cliente quiere»: bastaba con que no quisiera para que las contraseñas y los archivos viajaran en claro por la red local. Hay un interruptor —«Admitir equipos antiguos»— para quien tenga Windows 7, algún Android TV o impresoras que solo hablan SMB2, con su aviso de lo que cuesta.
- El panel se puede acotar por red. Era la única regla del cortafuegos que no se podía restringir: la administración del NAS estaba siempre abierta a quien llegara al equipo. Ahora se indican las redes desde las que se abre (Seguridad → Cortafuegos). Vacío = como hasta ahora, para que nadie se quede fuera al actualizar.
- La caducidad de contraseñas se aplica de verdad. Se guardaba y se enseñaba en el panel, y al cumplirse el plazo no pasaba nada: un control que aparentaba existir. Ahora, al entrar, una contraseña vencida obliga a cambiarla. Las que nunca tuvieron fecha no caducan de golpe: se les pone la de hoy y el plazo cuenta desde ahí.
- El asesor de seguridad avisa de los contenedores expuestos. Los puertos que publica un contenedor no pasan por el cortafuegos del NAS (Docker filtra en otra cadena del sistema), así que instalar una aplicación abría un puerto a toda la red sin que nada lo dijera. Ahora se dice, con el arreglo: publicar en «127.0.0.1» y sacarla por el proxy inverso.
1.18.12026-08-01
Auditoría de seguridad: 33 fallos confirmados, 24 corregidos
- Un usuario de «solo ver» podía cambiar la contraseña de root del NAS. La contraseña nueva viajaba sin filtrar al
chpasswd del proceso privilegiado, y ese programa lee una cuenta por línea: bastaba con meter un salto de línea y una segunda línea «root:…». Cambiarse la propia contraseña no exige ser administrador, así que lo alcanzaba cualquiera. Cortado en el modelo, en la política y en el propio sincronizador.
- El proceso root aceptaba cualquier variable de entorno del panel. Con
LD_PRELOAD o PATH se ejecutaba código ajeno dentro de él, lo que anulaba entera la lista blanca de órdenes. Ahora hay una lista blanca cerrada de variables, con el valor validado.
- Las recetas del catálogo comunitario se revisan antes de instalarse: se rechazan
privileged, el socket de Docker, montar carpetas del sistema, los dispositivos y las capacidades con las que se sale del contenedor. Lo que el validador no sabe leer, se rechaza. Por eso salen del catálogo propio Portainer (su función —gestionar Docker— ya está en el panel, y exige el socket que da root) y la capacidad SYS_MODULE de wg-easy (innecesaria: Debian 12 trae WireGuard en el núcleo).
- Un «solo ver» podía leer el `.env` de cualquier app instalada, con las contraseñas que escribió el administrador. Ahora es solo para administradores.
- Las URL de webhook y de Discord de las alertas se ocultan como los demás secretos: en esos canales la URL es la credencial.
- El zip de un enlace público a una carpeta incluía su papelera: quien recibía el enlace se llevaba todo lo borrado.
- Restaurar de la papelera confiaba en la ruta guardada dentro de ella: quien pudiera escribir ahí elegía dónde aterrizaba el archivo. Ahora nunca sale de su carpeta.
- El límite de intentos se saltaba inventando una cabecera: se añade un límite por cuenta, que no depende del origen.
- Cambiar la contraseña cierra las sesiones abiertas (antes una cookie robada seguía valiendo 30 días).
- Una persona, una contraseña — ahora también en WebDAV. Marcar «Acceso web a los archivos» a alguien que ya existía pedía su contraseña al administrador, que no la sabe. Se apunta y se completa sola en cuanto esa persona entra al panel. De paso: sin contraseña ya no se crea una cuenta de WebDAV vacía.
- Cambiar la contraseña de otro usuario cierra sus sesiones: antes no había forma de echar a una cuenta comprometida salvo borrarla.
- Un usuario de «solo ver» ya puede descargar y previsualizar archivos.
- La papelera respeta que la hayas desactivado en una carpeta compartida.
- Restaurar dos veces el mismo nombre ya no machaca lo restaurado antes.
- La restauración desde la nube ya no le cambia el dueño a toda la carpeta destino, solo a lo restaurado.
- Un fallo pasajero al leer la clave SSH ya no regenera el par, que dejaba fuera de servicio todos los destinos remotos a la vez.
- Panel: el terminal root vuelve a poder elevarse con 2FA, el análisis de espacio ya no se queda en «Analizando…» al escribir, el formulario del SAI no se pisa solo cada diez segundos, subir dos veces el mismo archivo funciona, y las cámaras dicen cuándo no hay permiso para ver la imagen en vez de girar para siempre.
- Emitir un segundo certificado borra del vhost del desafío los dominios ya emitidos, y su renovación automática empieza a fallar en silencio (
services/certs.py:378).
- Un certificado comodín no se puede usar en ninguna publicación del proxy inverso: el linaje se busca por el dominio exacto de la regla (
api/external.py:638).
- El DDNS de Cloudflare fuerza `proxied=false` y desactiva el proxy naranja, dejando la IP del domicilio a la vista (
api/external.py:231).
- La regla de WebSockets del proxy casa el prefijo sin exigir separador y puede capturar las conexiones de otra publicación del mismo dominio (
services/proxy.py:83).
- Los puertos que publica un contenedor no pasan por el cortafuegos (Docker filtra en la cadena
forward). Sin arreglar a propósito: hacerlo mal tumba la VPN y la salida a internet de todos los contenedores, y no se puede probar sin nftables delante. El asesor de seguridad ya avisa de qué contenedores están expuestos.
- La descarga de catálogos solo comprueba el esquema de la URL inicial: una redirección puede acabar bajando el catálogo por HTTP en claro (
api/apps.py:717).
- Nada comprueba que el destino local esté montado: la copia se escribe en el disco del sistema y se da por buena (
services/backup_engine.py:633).
- La revocación por devolución nunca se dispara: DEPLOY.md manda registrar en Stripe solo los dos eventos de checkout, sin los de reembolso.
- El registro del portal delata qué correos tienen cuenta, justo lo que el login evita a propósito con su hash señuelo (
portal/app/routes/web.py:78).
1.18.02026-08-01
Identidad de empresa, servicios que faltaban y una tanda de seguridad
- Un solo botón Editar por persona, con cuatro pestañas: Información (contraseña y acceso al panel), Aplicaciones (qué servicios usa), Grupos y Permisos (la matriz de carpetas). Antes había dos botones que abrían casi lo mismo.
- La pestaña de permisos refleja los grupos que acabas de marcar, no los que tenía al abrir el diálogo.
- Unir el NAS a un dominio que ya exista (realmd/sssd): sus usuarios pasan a existir en el equipo y se les dan permisos en las carpetas. La contraseña del alta viaja por stdin, nunca en la línea de órdenes.
- Opcional y apagado de fábrica: que las carpetas compartidas acepten cuentas del dominio (winbind con los mismos uid que sssd) y que esas cuentas entren al panel, siempre como «solo ver».
- rsync como servidor: otro NAS deja aquí sus copias, con su usuario y contraseña propios y solo en las carpetas que marques. Puerto 873 atado al interruptor en el cortafuegos.
- Red: rutas estáticas, DNS manual del propio NAS (lo que pide unirse a un dominio) y proxy de salida para las descargas del NAS y de Docker.
- El servidor habla inglés: los mensajes que redacta el backend se traducen en la frontera HTTP, incluidos los compuestos («fallo al subir X: rclone terminó con el código 1 (…)»).
- Un fallo con «código 1» y ni una línea de explicación era el panel diciendo que no sabía nada: con
--log-file, rclone manda todo a su registro y si muere antes de abrirlo el motivo no queda escrito en ninguna parte. Ahora se comprueba la conexión antes de subir (que ya no esté en la configuración es justo lo que produce ese código), y si aun así falla mudo, la subida se repite en seco sin registro para que rclone hable. Como última red, el mensaje incluye la orden exacta que lanzó el panel.
- Una cuenta del dominio llamada «root» podía entrar al panel y, peor, la reposición automática de SMB le reescribía la contraseña de root del NAS. Las cuentas del sistema quedan excluidas del camino del dominio, la contraseña del dominio ya no se copia al equipo, y el ticket de Kerberos se comprueba contra la clave de máquina del keytab (
kvno -k): un KDC falso en la red ya no cuela.
- La contraseña del proxy de salida se escribía en archivos legibles por todos: ahora 0600.
- El servidor rsync escribe como root, así que lo que entra pierde setuid/setgid: sin eso, quien tuviera la contraseña podía dejar un programa con poderes en una carpeta compartida.
- Las credenciales del alta al dominio se barren al arrancar si un corte las dejó a medias.
- Vaciar el DNS manual restaura de verdad el anterior (antes el NAS seguía preguntando a los servidores viejos mientras el panel decía «automático»).
- Reconfigurar la IP de un bond o una VLAN ya no lo deshace.
- El grupo de administradores del panel se ve en la pestaña de grupos (antes decía «no hay grupos todavía» en un NAS que sí los tenía).
- El cortafuegos abre y cierra los puertos de todos los servicios, también al arrancar.
1.17.02026-07-30
Gran revisión: que funcione todo lo que está implementado
- Probar conexión (Diagnóstico):
ping no estaba en la lista de órdenes permitidas y la prueba devolvía un error seco. Ahora funciona (y el paquete se instala en equipos que no lo traigan).
- La barra de progreso al actualizar LGM-OS: el panel no tenía permiso para leer el registro del actualizador y se quedaba muda justo en la parte larga. Ahora se ve fase, porcentaje y registro en vivo.
- Crear usuarios con SMB/SSH: el proceso privilegiado tenía
/home en solo lectura y el alta fallaba con un error 500. La jaula SFTP ahora se crea de verdad.
- El candado de los snapshots por fin se ve:
zfs holds se invocaba sin argumentos (falla siempre) y ningún snapshot aparecía como protegido aunque lo estuviera. La protección anti-ransomware ahora se muestra tal cual está en ZFS.
- La elección de widgets ya viaja con tu cuenta: se guardaba contra una ruta que no existía (404 silenciado) y cada navegador volvía a los widgets de fábrica.
- «Esta sesión» en Usuarios conectados: nunca se marcaba (buscaba la sesión en una cabecera que ya no se usa); ahora tu navegador aparece señalado.
- La ISO arranca también por BIOS desde USB (faltaba el código de arranque del MBR), y el instalador ya no muestra «paso 16/15».
- Probar alertas decía «enviada» aunque el SMTP estuviera mal: ahora envía por cada canal configurado, se salta el resumen diario, y dice qué canales salieron y cuáles fallaron.
- El SAI decía «configurado» con el driver caído: ahora explica por qué no responde (con el último error del sistema) en el propio panel.
- Fallos de red visibles en todo el panel: NFS, WebDAV, permisos de usuario, redes/ISO de una máquina virtual, la pantalla del servidor y los widgets ya no fingen «no hay nada» cuando lo que pasa es que una petición falló. Y si el backend se está reiniciando, el panel dice «reintentando…» en vez de expulsarte al login con tus credenciales «malas».
- Las copias en la nube y los pagos, más honestos: un destino Nextcloud mal escrito ahora se autocompleta (la dirección WebDAV de verdad se construye sola) y el error 405 se traduce a qué tocar.
- Tareas programadas: se pueden pausar y reanudar sin borrarlas, y una tarea pausada se ve claramente distinta (antes eran idénticas y creías tener snapshots que no corrían).
- 2FA con código QR, como la VPN: se escanea con la cámara en vez de teclear 32 caracteres.
- Los discos de la visión general ya no fingen ser botones, el asistente de crear pool no pierde lo elegido si algo falla, la tienda no deja instalar sin los campos obligatorios, y el interruptor de registros dice «Pausado» cuando está pausado.
- Ventanas y diálogos: botones unificados a la IZQUIERDA (cerrar, minimizar, maximizar), con ajuste «Izquierda/Derecha» en Panel de control → Opciones regionales → Apariencia.
- La pantalla del propio servidor iba al 97 % de CPU: Chromium arrancaba sin aceleración gráfica y el desenfoque del cristal se repintaba por software. Ahora los controladores de la GPU (Intel/AMD/NVIDIA) se detectan e instalan solos —también al actualizar—, Chromium arranca con la GPU activada y el quiosco usa el nuevo modo de efectos ligeros (sin desenfoque, superficies opacas), que cualquiera puede elegir también en Apariencia.
- ZFS también se reintenta en cada actualización si la instalación se quedó sin él.
- No se puede cobrar lo que no se puede entregar: la venta solo se ofrece con TODAS las piezas configuradas (Stripe + secreto del webhook + clave de firma), y en producción el portal se niega a arrancar a medias.
- Ningún pago se entierra: un pago que no se pueda atribuir responde error a Stripe para que lo reintente y lo marque en rojo (antes se «procesaba» y desaparecía). Las devoluciones y disputas revocan la licencia automáticamente (reversible desde admin).
- La página de «gracias» se actualiza sola hasta que aparece la clave; la sesión caducada vuelve al login en vez de enseñar un JSON; el admin tiene buscador por correo/licencia y el contador dice el total real; la base de datos vive en
/data (sobrevive al redeploy) y el límite de intentos de login distingue las IP reales detrás del proxy.
1.16.02026-07-30
El panel, de verdad cómodo en el móvil
- El panel se siente como una app en iOS y Android, no como una web encogida. Los campos ya no provocan el zoom brusco de Safari al tocarlos (16 px), los botones y campos son lo bastante grandes para el pulgar, desaparece el destello gris al tocar y hay un pequeño hundido al pulsar. El scroll lleva inercia y no arrastra la página por detrás.
- Los diálogos suben desde abajo (hoja inferior a todo el ancho, con las esquinas redondeadas y respetando el área de la muesca y el indicador de inicio), que es el gesto que todo el mundo reconoce en el móvil. Todo esto es global: mejora TODO el panel de una vez.
Revisión de seguridad del portal de licencias (antes de comercializar)
- Se cierra un fallo crítico: el portal ya NO arranca en producción con la clave de sesión de fábrica (estaba en el repositorio, y con ella se podía falsificar la cookie de un administrador). Ahora exige una clave propia o se niega a arrancar.
- Una compra solo la ve su dueño: la página de «gracias» comprobaba únicamente el identificador de la sesión de pago; ahora exige haber iniciado sesión y ser el titular, así que nadie ve la clave de la compra de otro.
- Login a prueba de fuerza bruta: límite de intentos por IP y comprobación en tiempo constante (no se puede averiguar qué correos tienen cuenta midiendo el tiempo de respuesta).
- Cabeceras anti-secuestro de clic para que ninguna web pueda enmarcar el panel de administración, pagos diferidos (SEPA) que ahora sí emiten la licencia al confirmarse el cobro, y varios endurecimientos más (límites de tamaño, comprobación de licencias solo por https). El webhook de Stripe ya era sólido y así se confirma.
1.15.02026-07-30
Saber en qué se va el disco y cómo ha ido el equipo
- Informe de espacio. Analiza una carpeta y enseña, de un vistazo, en qué se está gastando el disco: las carpetas más grandes (con su barra), los archivos más grandes y los archivos duplicados que se podrían borrar, con cuánto se liberaría. Los duplicados se detectan por CONTENIDO, no solo por tamaño —dos archivos del mismo tamaño no bastan—, así que no invita a borrar algo que en realidad es distinto. El análisis corre en segundo plano (no bloquea el panel) y está acotado para no ponerse a leer terabytes. En Panel de control → Sistema.
- Historial de métricas. El monitor en vivo ya no se olvida de todo al cerrarlo: CPU, memoria, red y disco se guardan en una serie temporal ligera (una muestra por minuto, en su propio SQLite) y se pueden ver por hora, día, semana o mes. Los rangos largos se agregan para que la gráfica pese lo mismo tanto para una hora como para un mes.
Menos toquetear el sistema a mano
- Editor visual de puertos y carpetas de las apps. Cambiar por qué puerto sale una app o qué carpeta ve ya no obliga a editar el docker-compose a mano: hay un formulario con filas (puerto del NAS → puerto del contenedor, carpeta → carpeta). Lo que no se puede poner en un formulario —una sintaxis avanzada— se respeta tal cual, y un volumen no puede montar el sistema (las rutas tienen que estar dentro de los datos del NAS). Al aplicar, la app se recrea y, si no levanta, se restaura sola la configuración anterior.
- Los discos aparecen al enchufarlos. Conectar o quitar un disco actualiza la lista del panel al instante, sin recargar, y avisa. Se escucha el flujo de eventos de udev sin privilegios y sin instalar ninguna regla en el sistema.
Licencia vitalicia, sin candados sobre tus datos
- LGM-OS pasa a ser de pago único y para siempre. Se compra una vez —con las actualizaciones incluidas— y se activa pegando la clave en Panel de control → Sistema → Licencia. Sin suscripción, sin cuotas y sin caducidad.
- Se comprueba en el propio equipo, sin internet. La clave va firmada (Ed25519) y el NAS la verifica él solo: no depende de estar conectado a ningún servidor. Si hay conexión, de vez en cuando comprueba que la licencia no se haya dado de baja, pero perder la red no cambia nada.
- El NAS NUNCA se bloquea por la licencia. Sin licencia, con la licencia revocada o sin internet, tus archivos, tus copias y todos los servicios siguen funcionando con normalidad. La licencia habilita el producto; jamás es un candado sobre lo que es tuyo. Un NAS que se apaga solo porque no llega a un servidor sería una forma de perder los datos de la gente, y eso no pasa aquí.
- Vinculada a ti, no a la máquina. Si el equipo se estropea, montas otro, pegas la misma clave y sigues donde lo dejaste. Sin llamar a nadie y sin límite de activaciones.
- Interruptor de «modo gratuito». Un ajuste global que, en «no», libera el producto: todos los NAS dejan de pedir licencia. Pensado para el día en que se decida dejarlo gratis. Nunca se libera por un fallo de red: hace falta decirlo expresamente.
- Portal web de licencias (aplicación aparte, en
portal/): registro, compra con Stripe y descarga de la clave. El cobro es a prueba de trampas —la licencia se emite solo con el webhook de Stripe firmado y verificado, nunca desde la página de vuelta, y es idempotente— y el portal no ve ninguna tarjeta (la pantalla de pago la aloja Stripe). Con SQLite por defecto y listo para PostgreSQL cambiando una línea.
- La web lo cuenta claro y toda la documentación se lee sin registrarse ni iniciar sesión: no hace falta estar conectado a nada para mirar antes de comprar.
1.13.02026-07-30
El corte de luz ya no corrompe datos
- Apagado ordenado por el SAI. Antes, al agotarse la batería, se hacía un «apagar» a secas y systemd lo paraba todo a la vez: si una máquina virtual o un contenedor seguían escribiendo cuando se desmontaba su disco, el sistema de archivos quedaba a medias. Ahora hay un orden: se cierran las máquinas virtuales (y a las que no obedecen se les corta la corriente), se paran los contenedores, se vuelca todo a disco y solo entonces se apaga. Cada paso con su tiempo de gracia, y el apagado final es incondicional: la batería no espera.
- El panel enseña qué se apagaría en un corte ahora mismo —tus máquinas y contenedores en marcha—, para que el apagado no sea una caja negra.
SFTP enjaulado: dar acceso a los archivos sin dar una consola
- Nueva capacidad de usuario «Copia de archivos remota (SFTP)». El usuario entra por SFTP encerrado en su carpeta, sin terminal, sin túneles y sin ver el resto del sistema. Es la forma segura de dar acceso remoto a alguien que solo necesita subir y bajar archivos, sin entregarle una consola de la máquina. La «Consola completa (SSH)» sigue existiendo para quien administra, y las dos son excluyentes.
Agregar tarjetas de red (bond)
- Unir dos o más tarjetas de red en una sola conexión, desde el panel. El backend ya sabía hacerlo, pero no había forma de pedirlo sin editar archivos de systemd-networkd a mano —así que el «bond» que prometía el README no se podía usar—. Ahora hay un formulario: eliges las tarjetas, el modo (tolerancia a fallos, más velocidad por LACP, o reparto por turnos) y su dirección, cada modo explicado por lo que hace y no por su nombre técnico.
NFS: quién puede montar cada carpeta
- Clientes NFS autorizados por IP. Antes, exportar una carpeta por NFS la abría a cualquier equipo de la red con permiso de escritura —y NFS no pide contraseña, así que no había barrera ninguna—. Ahora se puede limitar a las IP o redes que tú digas: para conectar Proxmox o ESXi, pones su IP y solo ese equipo la monta. Dejarlo vacío mantiene el comportamiento de antes (abierta a la red).
root_squash sigue siempre puesto: root del cliente nunca es root del NAS.
Certificados sin abrir ningún puerto
- Validación por DNS (DNS-01), además de la de siempre por HTTP. Antes, para un certificado de Let's Encrypt había que abrir el puerto 80 en el router; detrás de CGNAT eso era imposible. Ahora se puede validar creando un registro en el DNS —con el token de la API de Cloudflare— sin abrir nada. Y es el único modo que permite certificados comodín (
*.tudominio), que cubren todos los subdominios de una vez. El token se guarda cifrado en el NAS y la renovación automática sigue funcionando igual.
1.12.02026-07-30
La VPN se configura sola
- La dirección pública se detecta sin preguntar. Antes había que escribir el dominio o la IP a mano, y quien no lo hacía se llevaba una configuración que solo funcionaba dentro de casa. Ahora el orden es: lo que hayas escrito, el dominio del DNS dinámico si lo tienes, la IP pública real preguntada a internet y, en último caso, la IP local (diciéndolo).
- Redes de casa configurables, que es lo que de verdad decide si un cliente llega a algo. El NAS detecta UNA red —la de su tarjeta—; aquí se añaden las demás, como una VLAN de cámaras o una segunda subred.
- Se avisa si un cliente no va a llegar a nada. En túnel dividido sin red local detectada se entregaba en silencio una configuración que conecta, pone «conectado» y no alcanza ningún dispositivo: el fallo más difícil de diagnosticar de una VPN. Ahora se dice al crearlo, con la solución dentro.
- El DNS se propone solo: si el NAS ya sirve DNS o DHCP, se ofrece su propia dirección del túnel en vez de dejarte averiguarla.
Avisos que te enteras (y que no te despiertan sin motivo)
- Telegram, Discord y ntfy, cada uno con su formulario. No valía apuntarles el webhook genérico: cada uno espera su propio formato de mensaje, y descubrirlo lleva una tarde.
- Cada nivel elige por dónde sale. Un disco fallando puede sonar en el móvil de madrugada y «hay una actualización de un contenedor» esperar al resumen diario, que agrupa lo no urgente en un solo aviso. Lo que no sale por ningún canal sigue en el panel: no interrumpir no es perderlo.
- Avisos nuevos: CPU al tope de forma sostenida (con un «durante» configurable, para que no chille cada vez que arranca una copia) y temperatura de disco — SMART no da un disco por averiado porque se caliente, pero el calor es lo que acorta su vida.
El NAS aparece solo en Windows y en el Mac
- WS-Discovery y Bonjour, encendidos con las carpetas compartidas. Desde que Microsoft retiró SMB1, un NAS que no habla WS-Discovery no sale en «Red» de Windows y hay que escribirse la IP de memoria; macOS mira mDNS, que es otro protocolo distinto.
- Nombre, descripción y grupo de trabajo configurables, aplicados a la vez en los tres sitios que tienen que decir lo mismo (smb.conf, Avahi y wsdd). Un nombre que Windows no aceptaría se rechaza al guardarlo, no cuando no encuentras tu NAS.
Seguridad
- El bloqueo automático vale ya para SSH. Antes solo contaba los intentos del formulario del panel: un NAS con SSH abierto recibía miles de intentos al día sin que nada los parara. Ahora se leen del diario del sistema y el bloqueo lo aplica el cortafuegos, que es lo único que sshd respeta. Comparte umbral y lista blanca con el del panel, así que quien ataque por los dos sitios no tiene el doble de oportunidades.
- Copias en la nube con Object Lock (S3, Wasabi, MinIO): cada archivo subido queda bloqueado el tiempo que digas y ni la propia cuenta puede borrarlo antes. Es la diferencia entre una copia y una defensa contra el ransomware. Requiere activar Object Lock en el cubo desde el proveedor: está avisado en el propio campo.
Herramientas de diagnóstico y automatización
- Pruebas de red que salen de verdad: ping, comprobar un puerto de cualquier equipo y medir la velocidad de bajada real. Hasta ahora la comprobación del sistema solo miraba hacia dentro.
- Tres automatizaciones nuevas en las tareas programadas: limpiar temporales, organizar descargas por tipo y ordenar series en
Serie/Season NN/. Las tres solo tocan lo que reconocen con certeza: nunca inventan una categoría, nunca sobrescriben y nunca salen de la carpeta indicada.
- Descargar el registro que se está viendo, ya filtrado, desde el Centro de registros.
El Centro de registros dice la verdad
- «Máquinas virtuales» no funcionaba, y nunca lo había hecho. Estaba en el desplegable de orígenes pero no en la lista blanca del servidor, así que elegirlo daba siempre un error con los identificadores internos en inglés en pantalla. Ahora hay un test que compara las dos listas para que no vuelvan a desfasarse.
- El arranque de Samba ya no sale en rojo. Samba traduce su nivel de depuración 0 —que significa «imprimir siempre», no «algo falla»— a prioridad de error, así que el filtro «Solo errores» sobre las carpetas compartidas enseñaba el arranque del servicio en vez de los fallos. Se degrada solo lo que se reconoce como rutina, una a una: un fallo de verdad de Samba sigue llegando en rojo.
- La mitad de las filas eran rutas del código fuente de Samba. Samba escribe cada mensaje en dos entradas del diario —una cabecera con el archivo y la función, y el mensaje—; ahora se unen, y el sitio del código queda en gris detrás del texto, donde no estorba.
Detalles
- La consola de una máquina virtual se abre en una pestaña, no en una ventana emergente.
- Las ventanas y los diálogos recuerdan el tamaño al que los dejaste.
- Arreglado: el almacén de notificaciones compartía un objeto entre llamadas y el módulo iba acumulando avisos fantasma que ya no estaban en disco.
1.11.02026-07-26
El panel, en el móvil, con forma de aplicación
- En pantallas estrechas ya no hay escritorio. Por debajo de 820 px el panel cambia de forma: pantalla de inicio con la rejilla de aplicaciones, la app abierta ocupando toda la pantalla y una barra abajo con Inicio, Abiertas y Widgets. No es el escritorio encogido — las ventanas no caben en seis pulgadas y las asas de redimensionar miden dos milímetros.
- Volver al inicio no cierra nada: las aplicaciones siguen cargadas y se salta entre ellas desde «Abiertas», como en cualquier teléfono.
- Se respeta la muesca: barras arriba y abajo apartadas de las áreas seguras, y la pantalla completa aprovechada de verdad.
- El corte va por ANCHO, no por «¿es un móvil?»: una tableta en horizontal se maneja bien como escritorio y en vertical no.
- Instalable como app también en iPhone. El icono de la pantalla de inicio era un SVG y iOS no los admite ahí: ponía una miniatura de la página en vez del logo. Ahora hay iconos PNG de 192, 512 y 180 px, y el panel se abre sin la barra del navegador.
Una sola puerta: la app Sistema se va al Panel de control
- Centro de registros, en Panel de control → Administración. Antes era una lista pelada dentro de Sistema: elegías un servicio y salían trescientas líneas en gris. Ahora los registros de los servicios y la auditoría del panel —quién hizo qué y desde dónde— se miran en el mismo sitio, con filtro por gravedad, búsqueda de texto y modo en vivo para dejarlo abierto mientras reproduces el fallo. Y dice cuántas líneas estás viendo de cuántas hay.
- La app Sistema desaparece del escritorio. Tenía las mismas cosas que el Panel de control y en dos sitios distintos: quien buscaba «alertas» no sabía en cuál mirar. Sus secciones son las MISMAS —no se ha reescrito nada— y ahora viven donde se buscan: Información del equipo, Red, Comprobación, Actualizar LGM-OS, Tareas programadas, Alertas, Copia de la configuración y Apagar y reiniciar.
- Los textos y las guías que mandaban a «Sistema → algo» apuntan ya al Panel de control: una instrucción que nombra un icono que no existe es peor que no tenerla.
Acceso: decir lo que pasa de verdad
- La contraseña incorrecta ya no dice «Sesión expirada». Todos los errores 401 se traducían igual, así que el «usuario o contraseña incorrectos» que manda el servidor no llegaba nunca a la pantalla. Peor: el código de doble factor también se pide con un 401, así que con 2FA activo no había forma de entrar.
- El usuario ya no viene con «admin» escrito. El nombre del administrador lo elige quien instala; sugerir uno hacía que se intentara entrar con una cuenta que no existe. Los dos campos llevan ahora un marcador que dice qué va en cada uno.
Seguridad
- Los WebSockets comprueban de dónde vienen. No pueden llevar la cabecera del panel, así que lo único que impedía que una web cualquiera abriera un terminal contra el NAS de quien la visitaba era que el navegador respetase la cookie. Ahora se valida el origen en el terminal, la consola de las máquinas, el directo de las cámaras y las métricas.
- El panel ya no se puede meter en un iframe ajeno (clickjacking), no se adivina el tipo de los archivos servidos y la dirección no se cuenta fuera en la cabecera «Referer», que es por donde se escapaba el vale de las cámaras.
- El CORS de desarrollo ya no se instala en los NAS: iba escrito en el código y permitía que cualquier cosa servida desde localhost:5173 hablara con la API. Ahora se enciende con una variable de entorno, y solo hace falta al desarrollar.
- El nombre de una carpeta compartida por enlace ya no se cuela en la cabecera de descarga: una carpeta llamada
factura".exe rompía las comillas y el archivo se guardaba con otro nombre.
Cámaras: una sola conexión, y directo de verdad
- Una conexión por cámara, repartida entre todos los que miran. Antes cada pestaña abierta lanzaba su propio ffmpeg contra la cámara; muchas cámaras domésticas aceptan una sola conexión de vídeo y a la segunda contestan mal. Al irse el último espectador se apaga con unos segundos de gracia, así que recargar la página no cuesta una negociación nueva.
- El directo va sin recodificar, copiando el vídeo tal cual y troceándolo para el navegador: menos de un segundo de retraso y prácticamente cero procesador. Las cámaras en H.265, que ningún navegador pinta así, se pasan solas a MJPEG y se avisa en pantalla.
- La miniatura de la rejilla sale gratis del directo si ya hay alguien mirando esa cámara.
Máquinas virtuales
- El CD se quita solo cuando la máquina ya está instalada, como en VMware. El instalador siempre reinicia al terminar y, con el CD puesto y mandando en el arranque, volvía a salir el instalador: desde fuera parecía que la máquina no se apagaba.
- Ajustes avanzados: firmware BIOS o UEFI con arranque seguro, chip TPM 2.0, procesador del equipo o genérico, tarjeta gráfica y de dónde arrancar. Con eso ya se puede instalar Windows 11. Lo que este NAS no puede ofrecer se enseña apagado y explicado.
- Forzar apagado para cuando la máquina no obedece, y tableta USB en las máquinas nuevas: sin ella el ratón de la consola va descolocado.
Almacenamiento: las cifras cuadran
- Btrfs no se puede medir con la regla de un disco normal.
df daba el total contando los discos enteros y lo libre ya descontada la copia del espejo: «7,5 GB usados de 45» con «6,6 GB libres» al lado, dos cifras ciertas de cosas distintas. Ahora las tres salen de la contabilidad propia de btrfs y suman, y los discos se dicen aparte con su perfil.
Documentación y web
- Web pública generada desde el propio repositorio: presentación con lo que sabe hacer, página de descarga, novedades y las guías en HTML, con capturas de las apps de verdad.
1.10.02026-07-26
La actualización dice por dónde va, y por qué falla
- Barra de progreso real, del 1 % hasta el reinicio. El actualizador escribe en su registro la fase en la que está, y el panel la convierte en un porcentaje: copia previa, paquetes del sistema, compilar la interfaz, backend, promoción, reinicio y comprobación. Dentro de cada fase avanza contando las líneas que va soltando, así que no se queda clavado cuatro minutos en el mismo número. La barra nunca retrocede y sobrevive al reinicio del propio panel, que es justo cuando antes se quedaba muda.
- Si falla, el error se ve sin salir del panel. El aviso rojo trae las últimas líneas del registro —que es donde está el error de verdad— y el registro completo se abre por el final, no por el principio, que solo contaba lo que había ido bien.
- Quedarse sin memoria ya no se confunde con un error de compilación. Cuando el kernel mata a node, npm dice «signal SIGKILL» y no «Killed», así que el mensaje genérico se llevaba también ese caso. Ahora se distinguen quedarse sin memoria, sin espacio y un fallo del código, cada uno con su explicación.
El gestor de archivos, rehecho por dentro y por fuera
- Una barra de herramientas en vez de dos. Había once botones y nueve estaban apagados casi siempre, esperando a que seleccionaras algo. Arriba queda lo que siempre hace falta —navegar, la ruta, buscar y lista/cuadrícula— y las acciones sobre lo seleccionado aparecen abajo, flotando, solo cuando hay algo marcado y sin mover la lista.
- Se reconoce el tipo de archivo de un vistazo: cada icono va en una pastilla de su color, las filas respiran y los atajos de cada fila salen al pasar por encima en lugar de una columna de enlaces azules.
- Las carpetas de Docker y de las máquinas virtuales ya se ven. Son lo que más ocupa en un NAS con aplicaciones y no había forma de mirarlas sin entrar por SSH. Lo que sigue oculto es el almacén interno de Docker: ahí no hay nada tuyo y borrarlo rompe todos los contenedores.
- La fila seleccionada se ve. El resalte iba en el
<tr> y con la cabecera fija —que necesita la tabla en modo «separate»— ese fondo no llega a pintarse.
Contra el secuestro de datos: candado en los snapshots
- Almacenamiento → Snapshots → Proteger. Un snapshot protegido (
zfs hold) no lo borra nadie: ni el botón de eliminar, ni la limpieza automática por antigüedad, ni zfs destroy como root. Es lo primero que hace quien secuestra un NAS —borrar las copias— y lo único que de verdad lo impide. Se quita a mano desde el panel, a propósito.
- El estado del candado se pregunta a ZFS, no se guarda en el panel: un candado que el panel «cree» tener pero no está sería peor que no tenerlo.
- Btrfs no sabe hacer esto y la interfaz lo dice en lugar de fingir que sí.
- Guía nueva: docs/ransomware.md, con qué protege de verdad, qué no y qué hacer en los primeros diez minutos si ya ha pasado.
Cámaras: el sondeo encuentra las que antes no aparecían
- También se pregunta sin filtro de tipo. Media industria (Reolink, Tapo y casi todo lo genérico) ignora el sondeo por «NetworkVideoTransmitter» y solo contesta al abierto: esas cámaras no salían nunca y parecía que no tenían ONVIF.
- Manda la dirección desde la que contestó de verdad. Muchas cámaras anuncian su IPv6 de enlace local, un
0.0.0.0 o la IP que tenían la semana pasada; el paquete ha llegado desde una dirección concreta y esa funciona seguro.
- Un grabador con varios canales sale entero: se leen todas las respuestas del mensaje, no solo la primera. Y lo que no es una cámara —impresoras, televisores— se descarta.
- Guía nueva: docs/cameras.md.
El anillo del foco
- Cambiaba la forma del elemento al enfocarlo (forzaba esquinas de 8 px), se sumaba al anillo propio de los campos hasta hacer un borde azul de tres o cuatro píxeles, y lo llevaba
*, así que el cuerpo de un diálogo o una fila entera se dibujaban de azul. Ahora es un contorno, por dentro, con la forma que ya tenga el elemento y solo en lo que se puede usar con el teclado.
- En el tema oscuro, enfocar un campo no hacía nada: la regla clara pedía blanco y la oscura ganaba por ir después.
1.9.12026-07-26
Dos falsos positivos de la comprobación, y el sondeo de cámaras por todas las redes
- «El panel tiene SSH apagado pero ssh está en marcha». La contradicción era del diagnóstico, no del sistema:
SshConfig viene con enabled = True de fábrica y en la comprobación yo había escrito a mano un False. En un NAS donde nadie ha tocado ese interruptor no hay archivo de estado, así que el panel usaba el valor bueno y la comprobación se inventaba otro. Ahora lee el estado con el mismo modelo que usa cada servicio, así que los valores por defecto no pueden volver a separarse.
- «Sin nas-helper el panel no puede tocar el sistema». Se comprobaba intentando leer
/etc/hostname, que no está entre las rutas que la política permite tocar: el rechazo de la política se confundía con un ayudante caído, y salía una avería inexistente mientras el resto de esa misma pantalla usaba el ayudante sin problema. Ahora se le manda una orden de verdad, y el texto explica qué es nas-helper en lugar de nombrarlo a secas.
- El sondeo de cámaras sale ahora por todas las redes del NAS. Un multicast se va por una única interfaz —la que elija el kernel—, y un NAS con Docker tiene al menos dos (la de casa y la de los contenedores, 172.17.0.1). Si el sondeo se iba por esa, no llegaba a ninguna cámara y el panel decía «ninguna ha contestado», que parece un problema de la cámara y era del NAS.
1.9.02026-07-26
La actualización cuenta por dónde va, y por qué falla
- Mientras actualiza se ve el progreso. Hasta ahora la pantalla se quedaba muda justo en los dos pasos largos —instalar paquetes y compilar la interfaz, varios minutos cada uno— porque actualizar reinicia el propio panel y con él se muere la barra. Ahora se lee el registro que el actualizador va escribiendo: sale la fase en la que está y las últimas líneas, en directo.
- El reinicio del panel deja de parecer un cuelgue. Durante los segundos en que el backend no responde, la tarjeta dice que se está reiniciando y que es parte del proceso, en vez de un error rojo. Cuando vuelve, sigue contando por dónde iba.
- Al fallar se ve el motivo. El actualizador ya guardaba las últimas cuarenta líneas de su registro, pero el panel las descartaba por no declararlas en su modelo: el botón «Ver el detalle» no llegaba a aparecer nunca y solo quedaba la fase. Ahora está el registro entero de la parte que reventó, además de la versión desde la que se venía.
1.8.32026-07-26
El foco ya no se lo come el borde
- En los diálogos —se veía clarísimo en el campo Memoria de «Nueva máquina virtual»— el anillo azul del campo enfocado salía cortado por el borde de la ventana. El anillo se dibujaba POR FUERA del campo, y el cuerpo del diálogo tiene scroll: todo contenedor con scroll recorta lo que sobresale. Ahora el anillo va por dentro, así que no hay nada que recortar y se ve igual esté donde esté.
- Los diálogos dan además cuatro píxeles de holgura a cada lado sin cambiar de ancho, para que tampoco se corte lo que se dibuje pegado al borde (el realce de una fila al pasar el ratón, por ejemplo).
1.8.22026-07-26
La comprobación se creía el «apagado» del panel
- Decía «Consola remota (SSH): apagado» mientras había una sesión SSH abierta en ese mismo momento. El fallo era mío y del tipo que este módulo existe para cazar: para un servicio que el panel cree apagado, me limitaba a repetir lo que decía el archivo de estado, sin mirar el sistema. Dar por bueno el «apagado» guardado es el mismo error que dar por bueno el «encendido».
- Ahora, cuando el panel cree que un servicio está apagado, se comprueba igual: si la unidad está en marcha o el puerto escucha, sale en ámbar diciendo exactamente eso —«el panel lo tiene apagado, pero ssh está en marcha y escuchando en el puerto 22»— con las dos salidas: encenderlo en el panel para gestionarlo desde aquí, o pararlo de verdad. Vale para SMB, NFS, WebDAV y SSH.
- La pantalla dice a qué hora se comprobó. No se refresca sola —una comprobación cuesta varios sondeos— y un informe de hace media hora no cuenta nada de lo que pasa ahora.
1.8.12026-07-26
Fuera lo que fingía funcionar
- «Almacenamiento S3 — no disponible». Era mentira desde que existen las copias a la nube: S3, Wasabi, MinIO y Backblaze B2 funcionan de verdad, por rclone. El tipo de destino «s3» desaparece —con sus cinco campos muertos, que se guardaban sin significar nada— y esas nubes se conectan donde corresponde: en Nube.
- «No hay actualizaciones pendientes». El asesor de seguridad leía un dato que ya no escribe nadie desde que el panel dejó de actualizar Debian: siempre decía que estaba todo al día sin haberlo mirado. Ahora informa de lo que este equipo sí sabe: si hay una versión nueva de LGM-OS, contada con git, y si no puede saberlo, lo dice.
- «El cortafuegos está activado». Se afirmaba leyendo la intención guardada en un archivo, no las reglas cargadas en el sistema. Son dos cosas distintas y pueden no coincidir. Ahora se comprueba nftables de verdad, y si el panel lo tiene activado pero las reglas no están cargadas, sale en rojo: no está filtrando nada.
- Cifrado de la copia. El trabajo tenía una casilla
encrypted que solo sabía dar error. Fuera el campo; el aviso honesto de que las copias no van cifradas se queda, que eso sí es información útil.
- «Volver a conectar la cuenta» de una nube: el texto y el endpoint existían, pero no había ningún botón. Ahora está y funciona — hace falta el día que la nube revoque el permiso y la copia empiece a fallar cada noche.
1.8.02026-07-26
Comprobación de todos los servicios
- Samba en marcha con un `smb.conf` que no tiene tu carpeta, porque el guardado falló y solo dejó un aviso. El panel la enseñaba y Windows no la veía.
- AppArmor confinando a Samba sin la lista de rutas compartidas: el servicio arranca pero no puede leer nada de la pool, y el error que llega es un «acceso denegado» que no apunta a ningún sitio. (Si AppArmor no confina a Samba, los avisos de
apparmor que salen en el registro son ruido, y ahora lo dice.)
- Una exportación NFS cuya carpeta ya no existe: tumba
exportfs entero y se cae también lo que sí funcionaba.
- WebDAV activado con Apache parado, o sin nadie con acceso web concedido.
- Docker con su almacén en el disco del sistema, llenándolo hasta que la actualización deja de caber.
- Poco espacio en el disco del sistema, un volumen sin montar, o una cámara cuya unidad reintenta cada diez segundos sin llegar a grabar.
1.7.22026-07-26
Las subidas, arriba y a la vista
- Subir era una sola petición con todos los archivos dentro: el panel se quedaba mudo hasta el final y con doscientas fotos eso son minutos sin saber si va o se ha colgado. Ahora cada archivo es su propia subida, con su barra, y la cuenta va bajando: «Subiendo 37 archivos · 62 %».
- La cola vive en la barra superior, no dentro de la ventana de Archivos: se puede cerrar esa ventana, irse a otra app y la subida sigue. Se despliega para ver cuál va y cuál ha fallado.
- Si un archivo falla, los demás siguen. Antes se caía la tanda entera.
Una carpeta compartida, tres formas de servirla
- WebDAV se marca en la carpeta, como SMB y NFS, y se publica en
https://<nas>:<puerto>/<nombre>. Antes tenía su propia ruta escrita a mano en su pantalla, así que WebDAV podía estar sirviendo algo distinto de lo que decían los otros dos servicios sobre la misma máquina.
- NFS y WebDAV dejan de pedir rutas. Sus pantallas ya solo tienen el interruptor (y el puerto, en WebDAV) y la lista de lo que publican, que sale de Carpetas compartidas. Todo queda dentro del volumen por construcción: no hay dónde escribir una ruta suelta.
- Las exportaciones NFS sueltas de versiones anteriores se siguen viendo, marcadas como tales, para poder quitarlas. No se pueden añadir más.
Diseño
- Las etiquetas de permisos («Consola», «Panel · admin», «Carpetas») se leían como pegatinas luminosas en modo oscuro: eran pastel pensado solo para el tema claro. Ahora el color lo pone el texto sobre un velo del mismo tono, y se leen igual en los dos temas.
1.7.12026-07-26
Cámaras: ONVIF y rutas por marca
- Buscar cámaras (ONVIF). El NAS sondea la red local y lista las cámaras que contesten, con su nombre y su modelo. Se elige una, se escriben el usuario y la contraseña de la cámara, y es ella la que dice su dirección de vídeo: se pide su lista de perfiles y se coge el de más resolución, que es el que se graba.
- Rutas conocidas por marca, para las que no traen ONVIF o lo traen apagado de fábrica: Hikvision/HiLook, Dahua/Amcrest/Imou, Reolink, TP-Link Tapo/VIGI, Foscam, Axis y EZVIZ. Se elige la marca, se pone la IP y sale la dirección para probarla.
- La contraseña de la cámara no viaja en claro hacia ella: ONVIF autentica con un resumen SHA1 sobre un número de un solo uso, que es lo que esperan estas cámaras.
- Sin dependencias nuevas: el sondeo y las consultas van con la biblioteca estándar.
1.7.02026-07-26
Cuotas por usuario
- En Panel de control → Usuario y grupo → Cuotas: cuánto ocupa cada persona en cada volumen, con su barra, y el tope que se le quiera poner.
- Lo aplica el sistema de archivos, no el panel. Una cuota que comprobara la web se la saltaría cualquiera copiando por SMB; con
userquota de ZFS la hace cumplir el kernel y la escritura falla venga por donde venga.
- Solo en volúmenes ZFS, y se dice por qué en los demás. Btrfs no sabe limitar por persona —sus qgroups miden subvolúmenes—, así que ahí el panel explica la alternativa en vez de enseñar un número que nadie haría cumplir.
- Quien tenía cuenta y ya no la tiene sigue apareciendo con su número: sus archivos ocupan y hay que poder verlo.
1.6.12026-07-25
La sesión ya no vive donde cualquier XSS podría cogerla
- La sesión pasa a una cookie `HttpOnly`, que el JavaScript de la página no puede leer ni por error. Antes estaba en
localStorage: si algún día entrara un XSS en el panel, se llevaba la sesión entera y seguía sirviendo al día siguiente.
- El precio de una cookie es el CSRF —el navegador la manda sola, también cuando la petición la dispara otra web—, y contra eso hay dos barreras:
SameSite=Strict y una cabecera propia obligatoria en todo lo que modifica algo, que una web ajena no puede añadir sin un preflight de CORS que este NAS no le aprueba.
- La cabecera
Authorization: Bearer se sigue aceptando para scripts contra la API: ningún navegador la manda solo, así que no reabre la puerta que se acaba de cerrar.
- La sesión caduca por inactividad (media hora), no a las doce horas. Trabajando se renueva sola en cada respuesta; un panel abierto y olvidado se cierra.
La contraseña de un enlace compartido deja de viajar en la dirección
- Antes iba en la URL (
?password=…), y ahí acaba en el registro del servidor, en el historial del navegador y en cualquier proxy de en medio. Ahora quien abre el enlace ve una pantalla que la pide y la manda por POST.
- Esa pantalla no enseña ni el nombre del archivo antes de acertar.
- Cinco intentos por enlace y a esperar diez minutos. El bloqueo automático solo cubría los inicios de sesión, así que la contraseña de un enlace se podía probar sin límite.
1.6.02026-07-25
App nueva: Cámaras
- Se añade una cámara con su dirección RTSP —la del manual o la de su app— y se prueba antes de guardarla: la prueba dice si responde, con qué códec y a qué resolución, y avisa si el vídeo va en H.265 (se graba igual, pero el navegador no sabe pintarlo).
- Graba systemd, no el panel. Cada cámara tiene su unidad, con reinicio automático: si la cámara se cae, si se va la red o si el panel se reinicia para actualizarse, la grabación vuelve sola. Una grabadora que deja de grabar en silencio no sirve de nada.
- Se graba copiando el vídeo, sin recodificar, en trozos de diez minutos. El coste de procesador es prácticamente cero, un corte de luz se lleva como mucho el último trozo y encontrar una hora concreta es abrir un archivo, no rebobinar.
- Directo sin reproductor ni retardo: la imagen llega en MJPEG dentro de una etiqueta
<img>. La rejilla enseña una miniatura de cada cámara que se refresca sola, y al abrir una se ve en vivo; el ffmpeg del servidor solo existe mientras alguien mira.
- Se limpia sola: cada cámara guarda N días o N GB, lo que antes llegue, y una vez por hora se borra lo que sobra empezando por lo más viejo. Es lo que impide que la vigilancia se coma el volumen entero en unas semanas.
- Todo en la pool, en
<pool>/camaras/<cámara>, como el resto de lo que ocupa.
- La contraseña de la cámara viaja dentro de su dirección RTSP, así que no sale del NAS: el panel siempre la enseña tapada y la lista de cámaras queda fuera de la copia de la configuración, que es un archivo que se descarga.
Ventanas emergentes arrastrables
- Los registros, el editor, la papelera y todo lo que abre un diálogo se mueven arrastrando su barra de título y se quedan donde se suelten; doble clic los centra. Un diálogo clavado en el centro tapa justo lo que se está mirando.
1.5.12026-07-25
El panel se apagaba solo un segundo después de arrancar
nas-backend.service declaraba Requires=docker.socket, y systemd propaga la parada: cualquier systemctl stop docker —incluido el que hace el propio panel para mudar el almacén de Docker a la pool— se llevaba por delante al backend. El resultado era un bucle: arrancaba, empezaba la mudanza, se mataba a sí mismo, y a la siguiente vuelta otra vez. Ahora es Wants: el panel sigue en pie con Docker parado, que además es la única forma de poder arreglar un Docker caído desde la web.
- La mudanza del almacén de Docker se rinde al tercer intento seguido fallido y lo dice, en vez de reintentarla en cada arranque para siempre.
El actualizador ya no depende de tu sesión SSH
lgm update lanza la actualización por systemd (lgm-update.service) y se queda enseñando el registro. Cerrar la consola, un corte de red o un Ctrl+C ya no pueden matar el proceso justo entre «parar el panel» y «poner la versión nueva», que era la forma de quedarse sin web y sin nadie que la levantara.
- Si el NAS quedó en una rama que el repositorio no tiene —el caso real:
master contra un repositorio que publica main—, tanto lgm update como el botón del panel se pasan solos a la rama principal en vez de morir con un «revisión desconocida» de git.
1.5.02026-07-25
Las copias ya salen a la nube: Drive, OneDrive, Dropbox, S3…
- Nubes que se pueden conectar: Google Drive, OneDrive, Dropbox, Box, pCloud, Nextcloud/ownCloud (o cualquier WebDAV), Amazon S3, Wasabi, MinIO, Backblaze B2 y MEGA.
- Conectar la cuenta no obliga a instalar nada en tu ordenador. El permiso que devuelve Google (o quien sea) va a una dirección del NAS, así que al aceptar desde otro equipo el navegador acaba en una página que no carga. En vez de pedirte que instales rclone también ahí —que es lo que hay que hacer normalmente—, el panel te pide que copies esa dirección: con ella, el NAS recoge el permiso él mismo. Dos pasos y ya está.
- Las credenciales no se guardan en el panel. Viven en
/etc/nas/rclone.conf, que es de root, y no vuelven a salir de ahí por ninguna vía: ni la API las devuelve ni aparecen en la configuración exportada.
- Cómo funcionan las versiones en una nube, dicho claramente porque no es igual que en un disco: allí no hay enlaces duros, así que «actual» es un espejo de tus carpetas —se ve y se restaura tal cual— y lo que cada copia reemplaza o borra se aparta en una carpeta con la fecha de la copia anterior. No se pierde nada, pero una versión antigua solo tiene los archivos que cambiaron después de aquel día.
- El destino se prueba antes de guardarlo: si la cuenta no responde o no se puede escribir en la carpeta, no se guarda. Un destino que falla la primera noche, cuando ya nadie mira, es peor que no tenerlo.
- iCloud Drive aparece en la lista, pero desactivado y con el motivo: Apple no publica una API, lo que existe es ingeniería inversa que pide el código del móvil cada pocos días. Para guardar un Mac, lo que sí funciona es al revés: una carpeta del NAS marcada como Time Machine.
1.4.02026-07-25
Almacenamiento y Copias de seguridad volvían a cerrarse al abrirlas
- Las dos aplicaciones se quedaban en negro nada más cargar sus datos. La causa: la reposición del scroll se pedía después de los «si todavía no hay datos, enseña la ruedecita», así que el primer dibujado hacía una llamada menos que el siguiente y React aborta el componente entero cuando eso pasa. Se pide siempre, antes de nada.
Centro de Paquetes: cada pestaña empieza por el principio
- Cambiar de pestaña, de categoría o buscar dejaba la lista nueva a la altura a la que se había quedado la anterior. Ahora vuelve arriba, como el resto del sistema.
Docker vive en la pool, y no se pregunta
- Desaparece el botón «Mover a la pool»: el almacén de Docker se muda solo al crear el volumen y en cada arranque del panel. Donde estaba el botón queda solo el aviso de que la mudanza está en marcha —o de que falló y hay que mirar las notificaciones—.
SMB: por qué Windows no entra
- La comprobación de SMB termina diciendo la dirección exacta que hay que escribir en el Explorador (
\\192.168.1.x\Carpeta). El NAS no se anuncia en «Red», así que no aparece solo por mucho que todo esté bien, y teclear el nombre del equipo no vale.
- Un usuario mal escrito ya no se convierte en invitado. Windows 10 y 11 rechazan las sesiones de invitado por política y el mensaje que enseñaban —«no puede obtener acceso a la carpeta compartida»— parecía un fallo del NAS; ahora dice lo que pasa de verdad: contraseña o usuario incorrectos. El modo invitado solo se activa si de verdad hay alguna carpeta abierta a invitados.
Barras de desplazamiento a juego con las ventanas
- La del marco de ventana era la de fábrica del navegador —gris, ancha, con sus flechas— y dentro de una ventana translúcida cantaba muchísimo. Ahora son finas y redondeadas, sin fondo, separadas del contenido, y se marcan un poco al pasar el ratón. En modo oscuro cambian solas.
Archivos: la ruta arriba y los botones debajo
- La ruta ocupa su propia línea, entera. Antes iba espachurrada entre los botones y el buscador, con su propia barra de scroll horizontal en cuanto entrabas en la segunda carpeta: no se leía nada. Si la ruta es muy larga se pliega por el medio —«Carpetas compartidas › … › carpeta › actual»—, que es la parte que menos importa, y cada trozo sigue llevando a su carpeta.
- Los botones, en una fila propia debajo, siempre los mismos y en el mismo sitio: los que necesitan algo seleccionado se desactivan en vez de aparecer y desaparecer, que movía toda la fila cada vez que pulsabas en un archivo. Se añade Comprimir ahí mismo.
- El buscador cierra esa fila, alineado a la derecha, con la papelera al lado.
1.3.42026-07-25
- Los dos pasos largos del actualizador —instalar paquetes y compilar la interfaz— avisan de que tardan varios minutos y de cómo seguirlos con
tail -f. Mandan su salida al registro para no llenar la pantalla, y sin decirlo parecían colgados.
1.3.32026-07-25
La actualización moría en la primera fase de una instalación recién hecha
ls -1t /var/nas/pre-update-*.tar.gz no encuentra nada en un equipo recién instalado, sale con código 2 y, con set -euo pipefail, se llevaba por delante toda la actualización antes siquiera de mirar el disco. Lo introduje al añadir la limpieza previa y solo se dispara donde no hay copias anteriores: precisamente en el primer intento tras instalar. Reproducido con el actualizador de verdad sobre un /opt/nas simulado, y arreglado.
- La misma clase de trampa en el cálculo del espacio libre: si
df no contesta, la aritmética recibía una cadena vacía y eso, con set -e, también abortaba.
1.3.22026-07-25
Actualizar desde la consola, en un comando
- `sudo lgm update`: descarga los cambios y lanza el actualizador. Si el repositorio es privado, reutiliza el token que ya guardaste en el panel y se lo pasa a git por una variable de entorno con un credential helper — nunca dentro de la URL, donde acabaría escrito en
.git/config y en cualquier mensaje de error. Sin token guardado lo intenta igual, que es lo que necesita un repositorio público.
- Dice claramente qué falta cuando no puede: sin checkout de git, sin repositorio de origen o sin permisos.
1.3.12026-07-25
Sin volumen no se instala nada, y se dice
Se retiran las acciones de GitHub
- El repositorio es privado y sus minutos se cobran, así que
.github/workflows/ sale del proyecto. En su lugar queda `verificar.sh`, que hace lo mismo en tu equipo: ruff, pytest, tipos, build y sintaxis de los scripts de despliegue, con un resumen al final. Conviene pasarlo antes de construir la ISO; si tienes WSL, ejecútalo dentro, porque hay comprobaciones que solo fallan en Linux.
1.3.02026-07-25
Todo lo gordo vive en la pool
- Al crear la pool se prepara sola: aparecen
docker/ (aplicaciones), vm/ (discos de las máquinas virtuales) y appstore/ (el catálogo), con los permisos que necesita el panel para desplegar sin privilegios.
- El almacén de Docker se muda a la pool en ese momento, como tarea con progreso y aviso al terminar. La copia conserva enlaces duros (overlay2 los usa a mansalva: sin eso puede triplicar lo que ocupa) y no empieza si no cabe. Si algo falla,
daemon.json vuelve a como estaba y Docker arranca igual: es preferible seguir gastando disco del sistema a quedarse sin contenedores. Cuando sale bien, se libera el disco del sistema.
- El catálogo de aplicaciones también se va a la pool, dejando un enlace en su sitio.
- Para un NAS al que le pusieron la pool después, la app Docker avisa de que sus datos siguen en el disco del sistema, dice cuánto ocupan y los mueve con un botón.
- Permiso de borrado del almacén viejo: esa ruta exacta y ninguna otra; ni
/var/lib, ni subcarpetas suyas.
1.2.72026-07-25
El CI vuelve a estar verde (llevaba semanas rojo)
- Los tests dependían del helper privilegiado. Fuera de root,
run() manda todo por el socket de nas-helper, que en una máquina de pruebas no existe: dieciséis pruebas morían con «no se puede conectar con el helper». No se veía porque en Windows os.geteuid no existe (se asume root) y quien lo ejecutaba en Linux solía ser root. El CI corre como usuario normal. Ahora los comandos se lanzan en el propio proceso; el cruce del límite de privilegio tiene sus propias pruebas.
- Un test de la VPN leía el `/proc/sys/net/ipv4/ip_forward` real de la máquina donde corría. En Windows ese archivo no existe y el test pasaba; en Linux existe y vale 0 mientras nadie active el reenvío, así que fallaba siempre — y con él la publicación de la ISO, que solo sale de código verificado. Ahora el test controla ese valor, como ya hacía con todo lo demás, y hay uno nuevo para el caso contrario: si el reenvío se queda apagado, la VPN no arranca y el panel dice qué ejecutar.
1.2.52026-07-25
La interfaz se compila donde hay sitio
npm ci se traía sus ~400 MiB de dependencias dentro de `/opt/nas/src`, es decir, en el disco del sistema: en un equipo con el sistema en un disco pequeño (lo normal cuando los datos van a un pool aparte) la actualización no cabía por mucho que se limpiara. Ahora se compila en el sitio con espacio de verdad —un volumen del NAS, /var/tmp, y como último recurso /opt/nas—, solo vuelve lo compilado (un par de MiB) y la zona de trabajo se borra entera, también si algo falla.
- Con eso, sobre el disco del sistema hacen falta 400 MiB en vez de 1 GiB.
- La limpieza previa borra además el
node_modules de un intento anterior, que son otros 400 MiB que npm vuelve a crear él solo.
- El README dice ahora lo que hace falta de verdad: 4 GB de RAM y 32 GB de disco de sistema (50 GB para ir sobrado).
1.2.42026-07-25
El actualizador ya no se atasca por falta de espacio
- Limpia lo suyo antes de medir el disco. Cada intento dejaba una copia del backend, otra del frontend, otra del entorno de Python y un tar del estado, y nadie los retiraba: bastaban unos cuantos intentos fallidos para que el siguiente muriera con «espacio insuficiente», sin que el motivo real —los restos de los anteriores— apareciera por ningún lado. Ahora se borran primero (son exactamente los que el propio script borra más adelante), se conservan las tres últimas copias del estado y se vacía el caché de apt.
- Si aun así falta espacio, dice qué lo está ocupando y qué suele sobrar.
La consola del servidor nunca desaparece
- El modo quiosco pasa al terminal 7: el inicio de sesión de siempre se queda en el 1. Si la pantalla se rompe, Ctrl+Alt+F1 da una consola de verdad y Ctrl+Alt+F7 vuelve al panel. Antes ocupaba el terminal 1 y, si X no arrancaba, el equipo se quedaba sin ninguna forma de entrar desde su propio teclado.
- `lgm kiosk` desde la consola:
on, off, restart y log. Y la pantalla de bienvenida recuerda las dos combinaciones de teclas.
1.2.32026-07-25
La pantalla del servidor se enciende al actualizar
- El modo quiosco arranca en el momento, no en el siguiente reinicio: al terminar la actualización —y ya con el panel respondiendo— la pantalla del servidor muestra la web. Si el equipo no lo tenía y tiene pantalla (también la consola de una máquina virtual), se instala y se enciende ahí mismo. Si lo apagaste desde el panel, sigue apagado.
- Los drivers que faltaban. Se instalaba
xserver-xorg sin recomendados, y así no viene ningún driver: X arrancaba y moría con «no screens found», o pintaba la pantalla sin responder al teclado. Ahora se declaran los de vídeo (fbdev, vesa y qxl, que es la pantalla emulada de QEMU/Proxmox/VirtualBox) y el de entrada (libinput).
- Si X no puede arrancar, la unidad se rinde tras cinco intentos en vez de reintentar para siempre llenando el diario, y deja el motivo escrito.
1.2.22026-07-25
«Actualizo y me sigue diciendo 1.1.1»
- El panel dice ahora cómo fue la última actualización. El actualizador reinicia el propio proceso que lo lanzó, así que deja el desenlace escrito en el estado… y nadie lo leía. Una actualización que fallaba y revertía dejaba la pantalla idéntica —misma versión y el mismo «hay N actualizaciones»—, indistinguible de una que ni se había intentado. Ahora sale en verde de qué versión a cuál se pasó, o en rojo en qué fase falló, con el motivo y el final del registro desplegable.
1.2.12026-07-25
Panel de control: cada cosa en su categoría
- Los usuarios salen de los servicios de archivos. SMB y WebDAV tenían su propia lista de usuarios, así que la misma persona acababa con cuentas distintas según por dónde se la creara. Ahora cada servicio solo dice quién tiene acceso y enlaza a Usuario y grupo.
- «Usuario y grupo» es una sola entrada, con pestañas de Usuarios, Grupos y Conectados, y tiene categoría propia junto a la cuenta y el 2FA: las personas y sus permisos no son «una cosa de SMB».
- SNMP pasa a Conectividad, que es lo que es, y Seguridad se queda con lo que protege el equipo (asesor, cortafuegos y bloqueo de IPs).
Terminal
- Botón de reconectar cuando se cae la conexión, sin cerrar y volver a abrir la app.
- 10.000 líneas de historial (antes 1.000): un
journalctl se iba muy por encima y lo primero que se busca suele ser el principio.
- En sesión root, el marco entero se tiñe de rojo: se ve sin leer nada dónde estás.
1.2.02026-07-25
Máquinas virtuales
- App «VM»: crea, arranca, para y elimina máquinas virtuales sobre KVM/libvirt, con su pantalla dentro del propio panel. Se elige nombre, memoria, procesadores, disco y de qué imagen .iso instalar —las que haya en tus carpetas compartidas—; el resto lo pone LGM-OS. Los discos van al volumen, en
<pool>/vm, y crecen según se usan.
- La pantalla de cada máquina (VNC) escucha solo dentro del equipo: se ve por un puente del panel que exige sesión de administrador, nunca abierta en la red.
- Si el equipo no tiene libvirt o no ofrece virtualización por hardware, la app lo dice y explica qué falta en vez de fallar sin más.
Se arregla
- El scroll heredado al cambiar de sección. Cada aplicación vive dentro del marco de ventana, que tiene su propio contenedor con scroll: reponer el del panel no servía de nada porque el que guardaba la posición era el marco. Ahora se reponen todos, y vale igual en el Panel de control, en Sistema, en Almacenamiento y en Copias de seguridad.
- El modo quiosco no se instalaba en máquinas virtuales. Se miraba solo si había un conector de pantalla en DRM, y una tarjeta emulada (QEMU, Proxmox, VirtualBox, Hyper-V) no siempre publica uno; ahora vale también la tarjeta de vídeo del bus PCI o un framebuffer, que es lo que tienen esos equipos. Y si un equipo no lo tiene instalado, el panel lo dice en Sistema en vez de no enseñar nada.
1.1.42026-07-25
Se arregla lo del catálogo con 177 aplicaciones
- Una fuente que falla ya no borra lo que trajo antes. Al sincronizar se retiraban las recetas de todas las fuentes salvo las que hubieran contestado ESA vez, así que bastaba un fallo de Community Applications (un 403 de su CDN, un corte de red) para que sus ~3200 aplicaciones desaparecieran de golpe y la tienda se quedara con las de la otra fuente, sin explicación. Ahora solo se retira lo de las fuentes que han respondido.
- La hoja de fuentes dice qué trajo cada una y cuál falló, con la fecha de la última sincronización y cuántas recetas hay en el equipo ahora mismo.
Panel de control ordenado
- Portada con las secciones agrupadas en rejilla (Uso compartido de archivos, Conectividad, Seguridad, Sistema), con buscador y vuelta atrás, en vez de una lista lateral de veinte entradas siempre a la vista.
«Windows no puede obtener acceso a \NAS»
- Botón Comprobar en SMB: recorre en orden servicio encendido, Samba en marcha, puerto 445 escuchando, regla del cortafuegos, carpetas publicadas y usuarios dados de alta, y dice cuál falla y qué hacer. Si todo está bien, explica cómo distinguir si el problema es del PC. Avisa además de las carpetas abiertas a invitados: Windows 10 y 11 no se conectan como invitado y dan exactamente ese mismo error.
1.1.32026-07-25
El servidor deja de ser una caja con una consola negra, el gestor de archivos hace lo que se espera de uno, y hay repaso de seguridad.
El servidor, en su propia pantalla
- Modo quiosco. Si el equipo tiene un monitor conectado, arranca enseñando el panel a pantalla completa, como cualquier sistema operativo. Se sigue entrando igual desde el resto de la red. Solo se instala cuando hay pantalla —en un servidor sin ella, X y un navegador serían cientos de megas para nada— y se apaga desde Sistema → Información.
Gestor de archivos
- Comprimir y extraer (ZIP, TAR, tar.gz, tar.bz2, tar.xz) con su progreso como tarea. Extraer crea una carpeta con el nombre del comprimido, en vez de vaciar cien archivos sueltos encima de la carpeta actual.
- Compartir con enlace: una URL pública para un archivo o una carpeta —que se descarga comprimida al vuelo—, con caducidad y contraseña opcional. La lista de enlaces activos está en el mismo sitio, con su contador de descargas y su botón de revocar.
- Copiar y mover en bloque en una sola operación: los nombres repetidos pasan a «x (2)» en vez de fallar a medias.
- Búsqueda de verdad: la lupa (o Intro) recorre todas las subcarpetas en el servidor, sin distinguir mayúsculas ni tildes, y cada resultado enseña en qué carpeta está y lleva hasta ella. Antes solo se filtraba lo que ya estaba en pantalla.
- Vista previa de fotos, vídeo, audio, PDF y texto sin descargar nada. El archivo se sirve con un sandbox, porque lo ha subido alguien y podría llevar scripts dentro.
- Copiar a… y Mover a… con selector de carpeta: no hay que escribir ninguna ruta.
- Menú contextual completo, al estilo File Station.
Seguridad
- El identificador de una aplicación se valida antes de construir una ruta con él. Llega en la URL y un «..» suelto apuntaba fuera del catálogo.
- Una cuenta con la contraseña sin estrenar ya no abre el terminal. El resto de la API lo impedía, pero el WebSocket no pasa por esa comprobación, y el terminal es justo lo más peligroso del panel.
- La descripción de una carpeta compartida no puede llevar saltos de línea: acaba dentro de smb.conf y ahí una línea nueva son directivas nuevas.
- Al extraer un comprimido se descartan las entradas que apuntan fuera de la carpeta («zip slip») y los enlaces simbólicos, que convierten la siguiente escritura en una escritura en cualquier sitio.
Se retira
- Las actualizaciones del sistema operativo por apt. Un
apt upgrade desatendido puede reiniciar servicios o dejarlos a medias sin nadie delante; quien quiera hacerlo tiene la consola. apt sale también de la lista de programas que el proceso privilegiado puede ejecutar. Lo que sí se sigue actualizando desde el panel es LGM-OS.
1.1.22026-07-25
Los servicios de archivos dejan de ser tres paneles sueltos y los permisos se pueden leer también por persona, que es como se preguntan de verdad.
- Un solo sitio para SMB, NFS y WebDAV, con pestañas. Antes estaban repartidos por el menú lateral como si fueran cosas distintas, y compartir una carpeta obligaba a recorrer los tres.
- Los distintivos SMB y NFS de cada carpeta ahora se pulsan. Encender o apagar un protocolo en una carpeta es lo que más se hace y obligaba a abrir el editor entero.
- Permisos por persona. En el usuario hay una pestaña «Carpetas» con todas las carpetas y tres columnas: sin acceso, lectura y escritura, o solo lectura. Enseña además el permiso que le llega por sus grupos, que es lo que explica los accesos que uno no recuerda haber dado.
- Una persona, una cuenta. Entrar al panel es ahora una capacidad más de la misma ficha, con la misma contraseña, junto a las carpetas, el acceso web y la consola. Había dos sitios donde crear personas y la misma acababa con dos cuentas y dos contraseñas que se desparejaban; en Seguridad solo queda la lista de quién entra. El panel no se queda sin administrador: ni quitándoselo uno mismo, ni degradando al último que queda.
- Al cambiar de pestaña dentro de un panel, la vista vuelve arriba en vez de quedarse donde estaba la anterior.
Se arregla
- Los registros de «Panel» y «Servicio privilegiado» daban error 500 y los de smbd o ssh no. La respuesta del servicio privilegiado viaja en una sola línea y el lector traía 64 KiB de tope, que las unidades más habladoras pasan de sobra. El mismo límite rompía cualquier fichero grande leído o escrito por esa vía.
- Una línea del diario que no es UTF-8 válido ya no tumba la lista entera de registros.
- Los registros se eligen por su nombre de siempre («Carpetas compartidas» y no «smbd»), con lo interno del panel aparte y al final.
1.1.12026-07-25
Tanda centrada en que el panel no mienta y en quitarle opciones de encima al usuario.
Se arreglan cosas que decían lo contrario de lo que pasaba
- «LGM-OS está al día» sin haber mirado nada. El checkout de la ISO se quedaba sin repositorio de origen y, sin remoto, el contador de commits pendientes daba 0. Ahora se distingue «no se puede comprobar» de «al día», y el origen se configura desde el panel.
- WebDAV seguía «Activo» con el interruptor apagado. Su estado salía de si Apache estaba vivo, y Apache también es el proxy inverso y quien renueva los certificados.
- «UPS activado pero detenido» en cualquier equipo. Debian deja
nut-monitor habilitado al instalar el paquete; sin un SAI configurado no puede arrancar.
- SMB corriendo con el puerto cerrado. Los servicios de archivos no daban de alta sus reglas de cortafuegos: Windows respondía «no puede obtener acceso a \\NAS» sin más pista.
- La sesión root del terminal moría al abrirse. Usaba
sudo desde un servicio con NoNewPrivileges=yes, que lo impide por diseño; ahora la crea el helper privilegiado.
- Los diálogos y el menú contextual salían fuera de sitio. Las ventanas se posicionan con
transform, que convierte al marco en el origen de los hijos fixed.
Menos opciones, mejor puestas
- Compartir una carpeta pide el nombre; la ruta la calcula el sistema.
- Los usuarios se gestionan en un único sitio y valen para todos los servicios.
- Permisos por persona en cada carpeta: sin acceso, lectura, o lectura y escritura.
- El panel de actualizaciones enseña la versión y poco más; el resto queda plegado.
- Cortafuegos encendido de fábrica, con las reglas de los servicios siempre al día.
Novedades
- Tienda de aplicaciones estilo App Store, con catálogos comunitarios (Unraid, CasaOS), buscador por relevancia, categorías y carga por páginas.
- Iconos propios de las aplicaciones nativas.
- Test SMART y scrub con progreso y aviso del resultado.
- La interfaz se recarga sola cuando el sistema se actualiza.
1.1.02026-07-25
Deja de ser un NAS que sólo se usa desde casa: se publica hacia fuera, guarda copias de verdad y da servicios de red a la propia LAN. Antes, además, se arreglan cuatro cosas que rompían la instalación desde ISO.
Críticos de despliegue
- La ISO produce equipos actualizables. Empaquetaba una copia del árbol de trabajo sin `.git`, así que
install.sh nunca creaba /opt/nas/src y la actualización desde el panel estaba muerta en toda instalación hecha desde ISO. Ahora viaja un clon de git real con su origin reescrito a la URL del repositorio; de paso, node_modules y dist dejan de colarse en la imagen porque sólo viaja lo confirmado.
- El primer arranque se puede reintentar: el progreso se marca en
/var/nas/.install-done. Si el instalador moría a mitad, el equipo se quedaba bloqueado para siempre en «instalando» sin forma de recuperarlo.
- Actualización atómica con reversión automática: se compila y valida en un área aparte, se promociona con
mv conservando la versión anterior y, si el panel no responde tras reiniciar, se vuelve solo a la anterior. El desenlace real queda en lgm_update_result.json, de modo que la UI ya no puede cantar un éxito que no ocurrió.
- La copia de configuración pasa de lista blanca a lista negra: se llevaba sólo lo que alguien se acordó de apuntar, y por eso perdía las carpetas compartidas (y SNMP, portal de acceso, UPS y bloqueo de IPs). Un test falla si aparece estado nuevo sin clasificar, así que el olvido no se puede repetir.
- Papelera `#recycle` dentro de cada carpeta compartida, como en Synology y visible también por Samba. La papelera anterior vivía en el disco de sistema: borrar un archivo grande de un pool lo copiaba entre discos y podía llenar el sistema. Se purga por antigüedad desde el planificador.
- Scripts de despliegue unificados en
deploy/common.sh y la netinst de Debian se verifica por SHA256 antes de remasterizarla (no se construye una ISO sobre una descarga corrupta o manipulada).
Acceso externo
- DDNS para duckdns, no-ip y cloudflare. Resuelve la IP pública y sólo llama al proveedor si ha cambiado, porque repetir la llamada sin cambios cuenta como abuso y acaba en bloqueo. El token vive en un documento de estado aparte: así la configuración viaja en la copia de seguridad y el secreto no, y se redacta de cualquier mensaje de error.
- Certificados Let's Encrypt con certbot y desafío webroot servido por un vhost propio. El material se copia al TLS del panel y se resincroniza a diario, de modo que una renovación automática llega también al panel en vez de dejarlo con el certificado viejo.
- Proxy inverso con Apache: un vhost por dominio y reglas ordenadas de ruta más específica a menos, validando con
apachectl configtest antes de recargar y restaurando la configuración anterior si falla. Los destinos se restringen a IP privada literal: un nombre lo resolvería Apache en cada petición, y eso convierte el proxy en abierto. El vhost de texto plano conserva el alias de ACME, sin el cual renovar el certificado de un dominio ya publicado sería imposible.
- Guía
docs/external-access.md con qué puertos abrir y por qué el 5000 no es uno de ellos.
Copias de seguridad de datos
- Aplicación nueva de primer nivel. Copias incrementales con rsync y
--link-dest contra la última versión correcta: cada versión se ve entera al abrirla pero sólo ocupa lo que cambió.
- Cada origen se guarda con su ruta completa, así que dos carpetas que se llaman igual no se pisan y al restaurar se ve de dónde salió cada cosa.
- Destinos en disco local o servidor remoto por SSH, con par de claves en
/etc/nas/ssh que el proceso web no puede leer ni queriendo. La prueba de conexión distingue host inalcanzable, clave no autorizada, huella cambiada, carpeta inexistente y sin permiso de escritura, en vez de un «no se pudo conectar» que no dice qué arreglar.
- Retención que sólo purga tras una copia correcta y que jamás borra la última que queda: un fallo repetido no puede dejarte sin ninguna copia.
- Restaurar recrea la ruta original dentro de la carpeta que elijas, de modo que por defecto no machaca los datos vivos.
- S3 y el cifrado en reposo se declaran no disponibles, con su motivo, en vez de fingir que funcionan: cifrar obligaría a empaquetar cada versión entera y eso rompería los incrementales y la restauración de archivos sueltos.
- El límite de tiempo del helper sube a 6 h, porque una primera copia legítima dura horas y antes se cortaba sola.
Servicios de red
- VPN WireGuard integrada. La clave del servidor se genera en
/etc/wireguard con permisos 0600 y la API no la devuelve nunca (el parser de wg show dump la descarta explícitamente, con test que lo comprueba). La clave privada de cada cliente se enseña una sola vez, al crearlo, dentro de su configuración y de un QR generado en el propio NAS para que no pase por un servicio de terceros; del cliente sólo se guarda la pública.
- Las direcciones se asignan a la primera libre y se reutilizan al borrar un cliente. Añadir o quitar clientes usa
wg syncconf, que no corta los túneles abiertos.
- El reenvío y el NAT se integran en el cortafuegos que ya existe en vez de montar un mecanismo paralelo que se pisara con él, y el puerto UDP se abre como regla del propio cortafuegos porque su cadena de entrada descarta por defecto.
- DNS y DHCP con dnsmasq: registros locales nombre→IP, reenviadores, rango de concesión y reservas por MAC. La configuración se valida con
dnsmasq --test antes de instalarla y se restaura el archivo anterior si el servicio no arranca, así que un ajuste mal puesto no deja la red sin DNS.
- Activar el DHCP exige confirmación explícita y avisa si detecta que la dirección del propio NAS se la dio otro DHCP (dos servidores en la misma LAN es una avería difícil de diagnosticar). El instalador deja dnsmasq instalado pero apagado hasta que se active desde el panel.
Integración continua y publicación
- El CI comprueba ahora también que todos los scripts de despliegue pasan `bash -n` (incluido
deploy/lgm, que no tiene extensión), además de ruff, pytest, tsc y el build del frontend. La comprobación de tipos se hace fuera del modo build para que no pueda darse por buena apoyándose en el tsconfig.tsbuildinfo versionado.
- Publicación automática de la ISO: al empujar una etiqueta
vX.Y.Z se verifica todo el repositorio, se construye la imagen con deploy/build-iso.sh y se adjunta a la release de GitHub junto a su SHA256, con las notas sacadas de este mismo fichero. La imagen se construye desde la rama por defecto, no desde una rama efímera, porque el clon que viaja dentro hereda su seguimiento y una rama inexistente en el remoto dejaría al equipo instalado sin poder buscar actualizaciones.
- 249 tests, ruff/tsc/build en verde.
1.0.0 «Estreno»2026-07-25
Primera versión pública, renumerada a 1.0 (la historia interna 2.x sigue abajo). Primera instalación real completada en una VM de Unraid desde la ISO propia.
- Instalador con 4 elecciones: nombre del servidor, red (DHCP o IP estática), usuario de consola y disco del sistema (lista si hay varios). Tema oscuro, menú de arranque LGM-OS y cero preguntas sueltas de Debian.
- Consola estilo XPenology: pantalla con logo, IP y URL que durante el primer arranque muestra una barra de progreso en vivo (paso N/13, %) y al terminar «✔ LGM-OS listo»; CLI
lgm (info, URL con QR, IP estática, lgm progress).
- Asistente de primer acceso web: sin admin/nas-admin de fábrica; la primera visita crea tu administrador (fuera del rate-limit, 409 si ya hay usuarios).
- PWA: el panel se instala como aplicación (manifest + iconos + service worker conservador que jamás cachea /api).
- Sistema muestra «LGM-OS x.y.z · Debian 12» y la versión se resuelve también en instalaciones desde ISO (/opt/nas-src) y en /opt/nas/VERSION.
- Arreglos de campo de la VM real: docker compose v2 garantizado (binario oficial si apt no lo trae) y validación SSH que creaba /run/sshd antes de
sshd -t.
2.9.02026-07-24
Arrastre de ventanas arreglado de raíz
- Adiós react-rnd: el arrastre y el redimensionado de ventanas ahora son propios, con Pointer Events (ratón, táctil y lápiz). Ocho asas de redimensionado invisibles, límites dentro del escritorio y sin re-render por movimiento (fluido). Verificado de punta a punta. El bundle baja ~33 kB y StrictMode vuelve a estar activo.
Panel de widgets (estilo DSM)
- Panel lateral derecho anclable con pila de widgets en vivo: Salud del sistema, Monitor de recursos (CPU/RAM + gráfica de red), Almacenamiento, Usuarios conectados, Tareas programadas y Registros recientes.
- Menú «+» para activar/desactivar widgets, anclar (o cierre al hacer clic fuera), plegar, reordenar y persistencia de la configuración. Botón conmutador en la barra superior. Sustituye a los widgets flotantes.
Marca
- Logo LGM-OS de verdad (SVG: torre NAS con bahías y LEDs sobre degradado): en el login (sin el texto «LGM-OS», solo la marca), en la barra superior y como favicon.
- El botón «Cancelar» y demás botones secundarios recuperan su estilo (clase
btn-secondary que faltaba en CSS, con variante para modo oscuro).
2.8.02026-07-24
Panel de Control estilo DSM (todo funcional)
- Carpetas compartidas: una sola definición crea la carpeta en el volumen, aplica permisos por usuario y grupo (lectura/escritura, solo lectura, sin acceso) con ACLs de sistema (
setfacl + herencia), la publica por SMB (valid users / write list) y la exporta por NFS — como en Synology.
- Usuario y grupo: grupos reales del sistema gestionados desde el panel (crear, eliminar, miembros), usables en permisos (
@grupo) y ACLs.
- Usuarios conectados: sesiones web en vivo (con IP y «esta sesión»), conexiones SMB (
smbstatus) y sesiones SSH/consola (who); pestaña en el panel + widget en el escritorio.
- Asesor de seguridad: análisis con puntuación (contraseña de fábrica, 2FA de administradores, endurecimiento SSH, cortafuegos, actualizaciones pendientes, bloqueo automático) y consejos de corrección.
- Bloqueo automático de IPs: tras N intentos fallidos en una ventana configurable la IP queda bloqueada (persistente, con lista blanca CIDR, desbloqueo desde la UI); se aplica en el login antes que nada.
- Opciones regionales: zona horaria y NTP vía
timedatectl, con estado de sincronización.
- SNMP: agente v2c de solo lectura (comunidad, ubicación, contacto) con
snmpd.conf gestionado.
- Portal de acceso: título, subtítulo y mensaje personalizables que se muestran en la pantalla de login (endpoint público solo cosmético).
- Dispositivos externos: discos USB/extraíbles con montar / desmontar / expulsar seguro (montados bajo
/mnt/usb-*, visibles en Archivos).
Escritorio
- Widgets de escritorio arrastrables con posición recordada: Sistema (anillos CPU/RAM + carga), Red (velocidades + gráfica), Almacenamiento (ocupación de pools) y Usuarios conectados.
- Launchpad solo en el dock (como macOS) con icono degradado distintivo; barra superior más limpia.
- Arreglo del arrastre de ventanas en desarrollo (React StrictMode dejaba obsoleta la referencia interna de react-draggable; en producción no ocurría).
Correcciones
- Rutas POSIX de configuración generadas con
as_posix() (en Windows str(Path) produce barras invertidas que la allowlist rechaza — /api/users devolvía 500 en desarrollo).
- Variable de entorno del terminal corregida (
LGM_OS, antes LMS_OS).
- 118 rutas API, 72 tests en verde.
2.7.02026-07-24
Diseño coherente e intuitivo
- Componentes compartidos mejorados:
Section con icono y descripción, EmptyState consistente, y un SidebarNav reutilizable con navegación agrupada.
- Menús reorganizados por grupos lógicos: el Panel de Control ahora agrupa en «Compartición de archivos», «Acceso remoto», «Seguridad» y «Energía»; Sistema agrupa en «Equipo», «Actualizaciones», «Automatización» y «Mantenimiento» — todo en posiciones con sentido para encontrar cada ajuste de un vistazo.
2.6.02026-07-24
Gestor de archivos (estilo Explorador de Windows)
- Panel lateral de acceso rápido (Equipo, raíces de almacenamiento, Papelera).
- Cortar / Copiar / Pegar, mover arrastrando archivos entre carpetas, subida por arrastrar y soltar, nuevo archivo/carpeta.
- Selección múltiple (clic, Ctrl+clic, Mayús+rango, Ctrl+A) y atajos de teclado (F2 renombrar, Supr a papelera, Ctrl+C/X/V, Enter abrir, Retroceso subir).
- Ordenar por nombre/tipo/tamaño/fecha, vista lista y cuadrícula, buscar en la carpeta, barra de direcciones editable, breadcrumb relativo a la raíz, barra de estado (nº elementos, selección, tamaño), diálogo de Propiedades y menú contextual completo (clic derecho).
Menús más avanzados
- Monitor: tabla de procesos en vivo (top por CPU/memoria, con PID y usuario).
- Menú contextual (clic derecho) en contenedores Docker (logs/abrir/iniciar/detener/ reiniciar/eliminar) y en pools de almacenamiento (scrub/copiar montaje/eliminar).
- Componente reutilizable de menú contextual accesible.
2.5.02026-07-24
Diseño y accesibilidad
- Modales accesibles: nuevo componente con
role="dialog", aria-modal, foco atrapado y restaurado, y cierre con Escape/backdrop. La papelera y los diálogos lo usan.
- Diálogos y toasts propios: se sustituyen todos los
window.alert/confirm/prompt nativos por diálogos con la estética Liquid Glass y avisos tipo toast.
- Respeto a `prefers-reduced-motion` (desactiva animaciones) y anillos de foco visibles solo por teclado (
focus-visible). Dock con aria-label y desplazable.
- Gestor de archivos: arrastrar y soltar para subir + menú contextual (clic derecho).
Funciones nuevas
- Información del equipo (nueva pestaña en Sistema): CPU (modelo, núcleos, frecuencia), RAM/swap, OS, kernel, arquitectura, discos, versión de Docker/ZFS y carga.
- Actualización de LGM-OS desde git (pestaña en Sistema): comprueba el repo remoto, muestra commits pendientes y aplica la actualización (git pull + recompilación/reinicio vía unidad systemd dedicada). Soporta repositorios privados con token de GitHub (guardado de forma segura, nunca en argv) o clave SSH de despliegue; git nunca se cuelga esperando credenciales.
Marca
- Rebrand completo a LGM-OS (pestaña del navegador, login, barra superior).
- 91 rutas API, 65 tests en verde.
2.4.02026-07-24
Instalador
- Instalador LGM-OS rediseñado: logo en color, pasos numerados, marcadores ✔/⚠, trap de errores y pantalla final. Interfaz web rebrandeada a LGM-OS.
Correcciones funcionales (revisión adversarial de comandos Debian)
- ROMPÍA: el firewall no se podía activar nunca (
/etc/nftables.d faltaba en los prefijos de mkdir de la allowlist → PolicyViolation no capturada → 500).
- ROMPÍA: crear un pool Btrfs con guion en el nombre generaba una unidad systemd
.mount inválida (falta de escape) → los nombres de pool se restringen a [A-Za-z0-9_].
- ROMPÍA: el instalador no compilaba el módulo de kernel de ZFS →
zpool create fallaba. Ahora instala zfs-dkms + cabeceras y hace modprobe zfs.
- Instalación resiliente del plugin
docker compose (nombre de paquete variable en bookworm); WebDAV no duplica Listen en 80/443 (Apache no arrancaba); el driver NUT se reinicia al cambiar la config; userdel limpia la cuenta Unix al borrar usuario SMB; aviso en la UI del firewall de que SMB/NFS/WebDAV quedan bloqueados hasta abrir puertos.
2.3.02026-07-24
Funciones nuevas
- Launchpad: menú a pantalla completa (estilo macOS) con todas las aplicaciones del sistema y las apps del catálogo Docker instaladas (abre su interfaz web), con buscador en vivo. Accesible desde el dock y la barra superior; se cierra con Escape o al elegir.
2.2.02026-07-24
Funciones nuevas
- Terminal web (LGM-OS): PTY real por WebSocket con xterm.js, solo para administradores; banner ASCII LGM-OS al abrir. El shell corre como el usuario del servicio (sin privilegios), no como root. Banner LGM-OS también en el instalador.
- Reemplazo de disco y ampliación de pool desde la UI (ZFS/Btrfs): sustituir un disco fallido y añadir discos a un pool con reequilibrado en segundo plano.
Seguridad (hallazgos de revisión adversarial)
- CRÍTICO: el backup de configuración ya no incluye la clave JWT y exige rol admin; antes un usuario
viewer podía descargarla y falsificar tokens de admin.
- 2FA: comparación de OTP con longitud fija de 6 dígitos + validación en el login; antes un OTP de 1 dígito permitía adivinar el segundo factor.
- Contraseña por defecto: se bloquean las acciones del servidor hasta que se rota (antes
must_change_password era solo informativo).
- Rutas de compartición (SMB/NFS/WebDAV) restringidas a /mnt y /srv (evita exportar
/).
- Límites de prefijo de la allowlist en frontera de separador; regex de snapshot sin
...
Correcciones
- Papelera: restauración por elemento sin abortar el lote; nombrado con uuid (evita sobrescritura); prune de snapshots btrfs anidados; subida sin seguir symlinks.
- Carrera en el store de tareas programadas (escrituras atómicas); parser de
zpool status que no confunde cache/log/spare con datos; throttle del vigilante de pools; reconexión de WebSocket con backoff y sin martillear tras fallo de auth; referencias fuertes a tareas asyncio en segundo plano.
Interfaz / rendimiento
- Ventana con foco resaltada; xterm cargado de forma diferida (chunk aparte).
- 87 rutas API, 60 tests en verde.
2.1.02026-07-24
Interfaz
- Iconografía Lucide en toda la UI (adiós a los emojis).
- Dock rediseñado con estados diferenciados: app activa (pastilla azul), abierta en segundo plano (punto), minimizada (punto hueco) e hover con realce; la ventana con foco se resalta y las inactivas se atenúan. Clic en el dock trae al frente / minimiza según el foco.
Funciones nuevas
- App Resumen (dashboard): salud y ocupación de pools, estado de servicios, CPU/RAM, uptime, resumen SMART, contenedores y notificaciones en una vista.
- Papelera de reciclaje en el gestor de archivos: borrado suave a
.recycle por raíz con listar / restaurar / vaciar (y opción de borrado permanente).
- Self-tests SMART (corto/largo) por disco desde la pestaña Salud.
- SAI/UPS vía NUT: apagado seguro configurable por umbral de batería; panel con estado en vivo (red/batería, carga, porcentaje) en el Panel de Control.
Backend
- +7 rutas (dashboard, papelera x3, smart/test, ups x2) — 85 en total.
- Tests 48 → 53 (papelera end-to-end, dashboard, render NUT, anti-inyección de driver).
2.0.02026-07-24
Seguridad (Fase 0)
- TLS obligatorio: certificado autofirmado generado en el primer arranque (
app/tls_bootstrap.py), reemplazable en /etc/nas/tls/.
- Separación de privilegios: API como usuario
nas sin privilegios + demonio nas-helper (root) con allowlist cerrada de comandos y rutas.
- Autenticación WebSocket por subprotocolo (el token deja de viajar en la URL).
- Rate-limiting por IP, bloqueo de cuenta tras 5 fallos y registro de auditoría.
- Revocación de tokens (logout real, logout global, revocación al cambiar contraseña).
- 2FA TOTP (RFC 6238) y roles admin/viewer con usuarios del panel.
- Estado versionado con migraciones automáticas al arrancar.
Núcleo NAS (Fase 2)
- Gestor de archivos web (listar, subir, descargar con token firmado, renombrar, copiar, eliminar).
- Usuarios de archivos unificados (SMB + WebDAV con contraseña única).
- Datasets ZFS / subvolúmenes Btrfs con cuotas y compresión.
- Snapshots manuales y programados con retención y restauración.
- SMART (smartctl JSON) + scrubs bajo demanda y programados.
- Motor de alertas: email SMTP, webhook, umbral de ocupación, vigilancia de pools, servicios caídos y SMART; centro de notificaciones en la UI.
- Servidor NFS; papelera de red y Time Machine (vfs fruit) en Samba.
- Copia/restauración de la configuración (descarga y tarea programada).
Sistema (Fase 3)
- Configuración de red vía systemd-networkd (DHCP/estática, VLAN, bond).
- Actualizaciones apt desde la UI con progreso.
- Logs y estadísticas de contenedores; actualización de apps instaladas.
- Catálogo remoto de aplicaciones con verificación sha256.
- Programador de tareas integrado (snapshot/scrub/backup).
- Apagado/reinicio desde la UI y visor de journald.
UX (Fase 4)
- Tema oscuro Liquid Glass con conmutador y detección del sistema.
- Infraestructura i18n es/en (shell traducido; apps de dominio en curso).
- Centro de notificaciones persistente con eventos en vivo.
- Login con OTP y panel de seguridad (2FA, sesiones, usuarios del panel).
Calidad (Fase 1)
- 48 tests (parsers con fixtures reales, auth/TOTP/lockout, estado/migraciones, allowlist, API con TestClient).
- CI de GitHub Actions (ruff + pytest + build del frontend + e2e Playwright).
- Specs e2e de Playwright (login, métricas en vivo, ventanas).
Distribución (Fase 5)
- Instalador actualizado (usuario de servicio, TLS, NFS, smartmontools, Node 20).
deploy/update.sh con copia previa del estado.
- Preseed +
build-iso.sh para ISO de instalación desatendida.
- Guía de administración y de recuperación de desastres.
1.0.02026-07-24
Versión inicial: pools ZFS/Btrfs, SMB/SSH/WebDAV, firewall nftables, orquestador Docker + App Store, escritorio web Liquid Glass con métricas en tiempo real.