Volver a publicaciones

Homelab

Jellyfin en un NAS: Docker, transcoding por hardware y la TV que no quería conectar

7 min de lectura

#jellyfin#docker#nas#caddy#transcoding#synology

Portada: logotipo de reproducción sobre fondo oscuro con el título Jellyfin en mi NAS

Puntos clave

  • Jellyfin en Docker con la GPU integrada de Intel (/dev/dri) para convertir vídeo sin fundir la CPU.
  • Puerto publicado solo en 127.0.0.1 y Caddy delante con HTTPS automático.
  • Una TV LG antigua fallaba con error -27: certificado ECDSA y cabecera X-Frame-Options. Se arregla en dos líneas.
  • Un procesador modesto (Celeron J4125) aguanta 4-5 conversiones simultáneas por hardware.

Quería una sola aplicación para ver mis películas y series en la TV del salón, en el móvil y fuera de casa, sin pagar suscripciones ni subir nada a la nube. Jellyfin cumple todo eso: es libre, no tiene cuentas de pago y funciona en casi cualquier dispositivo.

Lo que no esperaba era que el problema más difícil no fuera instalarlo, sino conseguir que una TV LG de hace unos años se conectara. Esta guía cuenta el montaje completo y ese caso, para que no pierdas una tarde como yo.

Qué vas a montar

  • Jellyfin en Docker, con la gráfica integrada de Intel para convertir vídeo (transcoding por hardware).
  • Caddy delante, con HTTPS automático, para entrar desde fuera con un dominio.
  • Un par de ajustes para que clientes lentos o antiguos (TV, Fire TV) vayan fluidos.

Mi equipo es un NAS con un Intel Celeron J4125 (gráfica UHD 600) y 8 GB de RAM. Si tu NAS o miniPC tiene un Intel parecido, todo lo que sigue te sirve tal cual.

Requisitos

  • Docker y Docker Compose en el NAS o servidor.
  • Un procesador Intel con gráfica integrada (Quick Sync). Compruébalo así:
ls -l /dev/dri

Si aparece renderD128, tienes gráfica disponible para Jellyfin.

  • Un dominio apuntando a tu IP pública, si quieres entrar desde fuera (en los ejemplos uso jellyfin.example.com).

Paso 1: el docker-compose.yml

Crea una carpeta para Jellyfin (en Synology, por ejemplo /volume1/docker/jellyfin) y dentro este archivo:

services:
  jellyfin:
    image: jellyfin/jellyfin:latest   # cuando funcione, fija la versión que probaste
    container_name: jellyfin
    user: "1026:100"                  # tu UID:GID (ver abajo)
    group_add:
      - "937"                         # grupo dueño de /dev/dri/renderD128 (ver abajo)
    devices:
      - /dev/dri:/dev/dri             # la gráfica integrada, para transcoding
    ports:
      - "127.0.0.1:8096:8096"         # solo accesible desde el propio servidor
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /volume1/media:/media:ro      # tu biblioteca, en solo lectura
    environment:
      - TZ=Europe/Madrid
      - JELLYFIN_PublishedServerUrl=https://jellyfin.example.com
    restart: unless-stopped

Los dos números que tienes que cambiar:

id                                   # uid=... gid=... de tu usuario -> "user"
stat -c '%g' /dev/dri/renderD128     # grupo de la gráfica -> "group_add"

Arranca y comprueba que el contenedor ve la gráfica:

docker compose up -d
docker exec jellyfin ls -l /dev/dri

El puerto se publica en 127.0.0.1, no en 0.0.0.0. Así Jellyfin no queda abierto en tu red ni en Internet: solo Caddy, en el mismo equipo, llega a él.

Paso 2: activar el transcoding por hardware

Cuando un dispositivo no puede reproducir un vídeo tal cual (formato, resolución o ancho de banda), Jellyfin lo convierte al vuelo. Sin gráfica, eso lo hace la CPU y un J4125 se ahoga con una sola película 4K. Con la gráfica, puede con varias a la vez.

En Jellyfin: Panel de control → Reproducción → Transcodificación:

  1. Aceleración por hardware: Intel QuickSync (QSV).
  2. Decodificación por hardware: marca H264, HEVC, HEVC 10bit, VP9 y MPEG2. No marques AV1 si tu gráfica no lo soporta (la UHD 600 no).
  3. Guarda.

Para comprobarlo, reproduce en el móvil una película forzando una calidad baja (por ejemplo 720p) y mira Panel de control → Actividad. La sesión debe indicar que transcodifica y el uso de CPU debe quedarse bajo.

En un J4125 he llegado a 4-5 conversiones simultáneas. Más allá, empiezan los cortes.

Paso 3: publicarlo con Caddy

Caddy consigue y renueva los certificados HTTPS solo. Este es el bloque mínimo para Jellyfin:

jellyfin.example.com {
    reverse_proxy localhost:8096 {
        flush_interval -1                  # streaming sin buffer
        transport http {
            response_header_timeout 0      # las películas largas no se cortan
        }
    }
}

Recarga Caddy y entra en https://jellyfin.example.com. En el móvil, el navegador y la mayoría de apps, esto ya funciona.

El caso de la TV que no quería conectar

La app de Jellyfin en mi TV LG (webOS de hace unos años) daba error -27 y no cargaba. Mientras, el móvil, el iPad y la Fire TV iban perfectos. El problema resultó ser doble.

Causa 1: el certificado

Caddy genera por defecto certificados ECDSA, que Let’s Encrypt firma con una cadena que termina en una raíz nueva. Muchas TV antiguas no tienen esa raíz y rechazan la conexión. Con un certificado RSA, la cadena acaba en la raíz clásica (ISRG Root X1), que sí conocen.

jellyfin.example.com {
    tls {
        key_type rsa2048
    }
    # ...resto igual
}

Solo lo aplico a Jellyfin. El resto de servicios sigue con ECDSA, que es más ligero.

Causa 2: la cabecera que bloquea la app

La app de webOS carga la web de Jellyfin dentro de un marco (iframe). Si tu proxy añade X-Frame-Options: DENY o una CSP con frame-ancestors 'self' (cabeceras de seguridad muy habituales), la TV no puede mostrarla y falla con el mismo error. Para Jellyfin, quita esas dos cabeceras y conserva el resto:

    header {
        -Server
        -X-Frame-Options
        -Content-Security-Policy
        X-Content-Type-Options "nosniff"
        Referrer-Policy "strict-origin-when-cross-origin"
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
    }

Con estos dos cambios, la TV conectó a la primera.

Paso 4 (opcional): que vaya fluido en clientes lentos

La TV conectaba, pero la pantalla de inicio tardaba mucho. Dos ajustes en Caddy lo mejoraron:

  • Caché agresiva de lo que no cambia. Las imágenes y los archivos de la web de Jellyfin llevan una huella en la URL: si cambian, cambia la URL. Se pueden guardar un año sin riesgo.
  • Comprimir solo texto. Comprimir vídeo o imágenes gasta CPU y no reduce nada.
    @immutable path_regexp ^/(Items/[^/]+/Images/|web/.+\.[0-9a-f]{8,}\.(js|css|woff2?|png|jpg|svg))
    header @immutable Cache-Control "public, max-age=31536000, immutable"

    encode zstd gzip {
        match {
            header Content-Type text/*
            header Content-Type application/json*
            header Content-Type application/javascript*
        }
    }

Y como es un servidor privado, no una web, bloqueo a los robots:

    respond /robots.txt <<TXT
        User-agent: *
        Disallow: /
        TXT 200

El Caddyfile completo

Junta todo lo anterior. Copia, cambia el dominio y listo:

jellyfin.example.com {
    tls {
        key_type rsa2048                   # compatibilidad con TV antiguas
    }

    header {
        -Server
        -X-Frame-Options                   # la app de webOS usa un iframe
        -Content-Security-Policy
        X-Content-Type-Options "nosniff"
        Referrer-Policy "strict-origin-when-cross-origin"
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
    }

    respond /robots.txt <<TXT
        User-agent: *
        Disallow: /
        TXT 200

    @immutable path_regexp ^/(Items/[^/]+/Images/|web/.+\.[0-9a-f]{8,}\.(js|css|woff2?|png|jpg|svg))
    header @immutable Cache-Control "public, max-age=31536000, immutable"

    encode zstd gzip {
        match {
            header Content-Type text/*
            header Content-Type application/json*
            header Content-Type application/javascript*
        }
    }

    reverse_proxy localhost:8096 {
        flush_interval -1
        transport http {
            response_header_timeout 0
        }
    }
}

Problemas frecuentes

Síntoma Causa probable Solución
La reproducción usa 100 % de CPU El contenedor no ve la gráfica Revisa devices y group_add; docker exec jellyfin ls -l /dev/dri
Error al transcodificar tras activar QSV Códec marcado que la gráfica no soporta Desmarca AV1 o HEVC 10bit y prueba de nuevo
La TV da error -27 Certificado ECDSA o X-Frame-Options Sección “El caso de la TV”
Películas largas se cortan Tiempo máximo de respuesta del proxy response_header_timeout 0 y flush_interval -1
No encuentra los archivos Permisos de la carpeta de medios El UID de user debe poder leer /volume1/media

Conclusión

Jellyfin en Docker con la gráfica integrada es una de las cosas más útiles que he montado en el NAS: un Netflix propio que funciona en todos los dispositivos de casa. La parte difícil no fue Jellyfin, sino los clientes antiguos. Si algo falla solo en un dispositivo, sospecha primero del certificado y de las cabeceras del proxy.

En el próximo capítulo de la serie contaré cómo protejo todo lo que publico (Caddy, CrowdSec y qué dejo solo para la VPN).

I wanted a single app to watch my movies and shows on the living-room TV, on my phone and away from home, without subscriptions or uploading anything to the cloud. Jellyfin does all of that: it is free software, has no paid accounts and runs on almost any device.

What I did not expect was that the hardest part would not be installing it, but getting an LG TV from a few years ago to connect. This guide covers the full setup and that case, so you do not lose an afternoon like I did.

What you will build

  • Jellyfin in Docker, using the Intel integrated GPU to convert video (hardware transcoding).
  • Caddy in front, with automatic HTTPS, to reach it from outside with a domain.
  • A couple of tweaks so slow or old clients (TVs, Fire TV) stay smooth.

My box is a NAS with an Intel Celeron J4125 (UHD 600 graphics) and 8 GB of RAM. If your NAS or mini PC has a similar Intel chip, everything below applies as is.

Requirements

  • Docker and Docker Compose on the NAS or server.
  • An Intel CPU with integrated graphics (Quick Sync). Check it like this:
ls -l /dev/dri

If renderD128 shows up, there is a GPU available for Jellyfin.

  • A domain pointing to your public IP, if you want access from outside (the examples use jellyfin.example.com).

Step 1: the docker-compose.yml

Create a folder for Jellyfin (on Synology, for example /volume1/docker/jellyfin) with this file:

services:
  jellyfin:
    image: jellyfin/jellyfin:latest   # once it works, pin the version you tested
    container_name: jellyfin
    user: "1026:100"                  # your UID:GID (see below)
    group_add:
      - "937"                         # group that owns /dev/dri/renderD128 (see below)
    devices:
      - /dev/dri:/dev/dri             # the integrated GPU, for transcoding
    ports:
      - "127.0.0.1:8096:8096"         # reachable only from the server itself
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /volume1/media:/media:ro      # your library, read-only
    environment:
      - TZ=Europe/Madrid
      - JELLYFIN_PublishedServerUrl=https://jellyfin.example.com
    restart: unless-stopped

The two numbers you must change:

id                                   # uid=... gid=... of your user -> "user"
stat -c '%g' /dev/dri/renderD128     # GPU group -> "group_add"

Start it and check that the container sees the GPU:

docker compose up -d
docker exec jellyfin ls -l /dev/dri

The port is published on 127.0.0.1, not 0.0.0.0. That way Jellyfin is not open on your network or the Internet: only Caddy, on the same machine, can reach it.

Step 2: enable hardware transcoding

When a device cannot play a video as is (format, resolution or bandwidth), Jellyfin converts it on the fly. Without a GPU the CPU does it, and a J4125 chokes on a single 4K movie. With the GPU, it handles several at once.

In Jellyfin: Dashboard → Playback → Transcoding:

  1. Hardware acceleration: Intel QuickSync (QSV).
  2. Hardware decoding: tick H264, HEVC, HEVC 10bit, VP9 and MPEG2. Do not tick AV1 if your GPU does not support it (the UHD 600 does not).
  3. Save.

To check it, play a movie on your phone forcing a low quality (for example 720p) and look at Dashboard → Activity. The session should say it is transcoding and CPU usage should stay low.

On a J4125 I have reached 4-5 simultaneous transcodes. Beyond that, stuttering starts.

Step 3: publish it with Caddy

Caddy obtains and renews HTTPS certificates on its own. This is the minimal block for Jellyfin:

jellyfin.example.com {
    reverse_proxy localhost:8096 {
        flush_interval -1                  # unbuffered streaming
        transport http {
            response_header_timeout 0      # long movies are not cut off
        }
    }
}

Reload Caddy and open https://jellyfin.example.com. On phones, browsers and most apps, this already works.

The TV that refused to connect

The Jellyfin app on my LG TV (webOS from a few years ago) showed error -27 and would not load. Meanwhile the phone, the iPad and the Fire TV worked perfectly. The problem turned out to be twofold.

Cause 1: the certificate

By default Caddy issues ECDSA certificates, which Let’s Encrypt signs with a chain ending in a newer root. Many older TVs do not have that root and reject the connection. With an RSA certificate, the chain ends in the classic root (ISRG Root X1), which they do know.

jellyfin.example.com {
    tls {
        key_type rsa2048
    }
    # ...rest unchanged
}

I only apply it to Jellyfin. Every other service keeps ECDSA, which is lighter.

Cause 2: the header that blocks the app

The webOS app loads the Jellyfin web client inside a frame (iframe). If your proxy adds X-Frame-Options: DENY or a CSP with frame-ancestors 'self' (very common security headers), the TV cannot display it and fails with the same error. For Jellyfin, remove those two headers and keep the rest:

    header {
        -Server
        -X-Frame-Options
        -Content-Security-Policy
        X-Content-Type-Options "nosniff"
        Referrer-Policy "strict-origin-when-cross-origin"
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
    }

With these two changes, the TV connected on the first try.

Step 4 (optional): smooth on slow clients

The TV connected, but the home screen took ages. Two Caddy tweaks improved it:

  • Aggressive caching of what never changes. Jellyfin images and web files carry a fingerprint in the URL: if they change, the URL changes. They can be cached for a year safely.
  • Compress text only. Compressing video or images burns CPU and saves nothing.
    @immutable path_regexp ^/(Items/[^/]+/Images/|web/.+\.[0-9a-f]{8,}\.(js|css|woff2?|png|jpg|svg))
    header @immutable Cache-Control "public, max-age=31536000, immutable"

    encode zstd gzip {
        match {
            header Content-Type text/*
            header Content-Type application/json*
            header Content-Type application/javascript*
        }
    }

And since it is a private server, not a website, I block robots:

    respond /robots.txt <<TXT
        User-agent: *
        Disallow: /
        TXT 200

The complete Caddyfile

Everything above together. Copy it, change the domain and you are done:

jellyfin.example.com {
    tls {
        key_type rsa2048                   # compatibility with old TVs
    }

    header {
        -Server
        -X-Frame-Options                   # the webOS app uses an iframe
        -Content-Security-Policy
        X-Content-Type-Options "nosniff"
        Referrer-Policy "strict-origin-when-cross-origin"
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
    }

    respond /robots.txt <<TXT
        User-agent: *
        Disallow: /
        TXT 200

    @immutable path_regexp ^/(Items/[^/]+/Images/|web/.+\.[0-9a-f]{8,}\.(js|css|woff2?|png|jpg|svg))
    header @immutable Cache-Control "public, max-age=31536000, immutable"

    encode zstd gzip {
        match {
            header Content-Type text/*
            header Content-Type application/json*
            header Content-Type application/javascript*
        }
    }

    reverse_proxy localhost:8096 {
        flush_interval -1
        transport http {
            response_header_timeout 0
        }
    }
}

Troubleshooting

Symptom Likely cause Fix
Playback uses 100 % CPU The container does not see the GPU Check devices and group_add; docker exec jellyfin ls -l /dev/dri
Transcoding error after enabling QSV A codec is ticked that the GPU does not support Untick AV1 or HEVC 10bit and try again
The TV shows error -27 ECDSA certificate or X-Frame-Options See “The TV that refused to connect”
Long movies get cut off Proxy response timeout response_header_timeout 0 and flush_interval -1
Files are not found Media folder permissions The user UID must be able to read /volume1/media

Conclusion

Jellyfin in Docker with the integrated GPU is one of the most useful things I run on the NAS: my own Netflix that works on every device at home. The hard part was not Jellyfin but the old clients. If something fails on only one device, suspect the certificate and the proxy headers first.

In the next chapter of the series I will cover how I protect everything I publish (Caddy, CrowdSec and what I keep VPN-only).

Preguntas frecuentes

¿Necesito una GPU dedicada?

No. Casi cualquier Intel con gráfica integrada desde 2016 (Quick Sync) convierte vídeo por hardware. En un Celeron J4125 aguanta 4-5 reproducciones convertidas a la vez.

¿Es seguro exponer Jellyfin a Internet?

Con cuidado: HTTPS, contraseñas fuertes, sin cuenta de administrador para el día a día y, si puedes, detrás de una VPN o de un sistema que bloquee IPs abusivas (por ejemplo CrowdSec).

¿Por qué mi TV muestra error -27 y el móvil funciona?

Normalmente por la cadena del certificado (las TV antiguas no confían en la raíz nueva de los certificados ECDSA) o por cabeceras que impiden cargar la web dentro de la app. Mira la sección de la TV.

Fuentes

Proyecto relacionado

Infraestructura Pesoz

Homelab self-hosted en producción 24/7: un NAS Synology con ~30 servicios en Docker tras Caddy + CrowdSec y un portátil con GPU como servidor de IA y observabilidad en k3s. VPN WireGuard, GitOps con Forgejo y estado en vivo con Uptime Kuma.

Compartir:LinkedInX
ivanjonasfc@dev: ~ — zshsesión en vivo

❯ neofetch

Perfilivanjonasfc@dev

Iván Jonás Fernández Correa
user
ivanjonasfc@dev
role
Full-Stack & DevOps
loc
Gijón, Asturias
títulos
DAM + ASIR
stack
Java · Python · TS · Docker · Linux · IA
busco
Full-Stack · DevOps · Sistemas
status
Disponible para trabajar

❯ uptime --human

Años en tecnología
6+
Proyectos en producción
6
Proyectos entregados
10+
Servicios self-hosted
~30

❯ figlet "Iván Jonás"

# Hola, soyIván Jonás

Desarrollador Full-Stack & DevOpsFull-Stack Developer & DevOps

Desarrollador Full-Stack & DevOps · Gijón, Asturias · ● Disponible para trabajar

↓ desliza, toca o escribe para abrir la sesión

❯ cat about.md

Desarrollo aplicaciones web y móviles de principio a fin (Java/Spring Boot, Python/FastAPI, TypeScript/React y Flutter) y me ocupo de su puesta en producción y operación con Docker, Linux, CI/CD y monitorización. Actualmente administro la infraestructura IT de una pyme y mantengo un homelab de unos 30 servicios en el que evalúo nuevas tecnologías, incluida IA local y privada (Ollama, RAG, MCP). Técnico Superior en DAM y ASIR.

❯ ls ~

Iván en números

Mi actividad en GitHub, mi trayectoria y mi infraestructura · datos en vivo.

Community

0

followers

followerfollowerfollowerfollowerfollower+8

Lenguajes

TypeScript32%
Dart14%
Python12%
HTML7%
SCSS5%

Tech Stack

Frontend

React
Next.js
Angular
Astro
Ionic
Flutter
TypeScript
Tailwind
shadcn/ui
React
Next.js
Angular
Astro
Ionic
Flutter
TypeScript
Tailwind
shadcn/ui

Backend

NestJS
FastAPI
Spring Boot
Python
Java
PostgreSQL
Redis
Qdrant
pgvector
MCP
RAG
LLMs
NestJS
FastAPI
Spring Boot
Python
Java
PostgreSQL
Redis
Qdrant
pgvector
MCP
RAG
LLMs

Tools

Docker
Linux
Nginx
Cloudflare
Forgejo
n8n
WireGuard
Prometheus
Grafana
Git
Windows Server
Active Directory
Loki
Tempo
Docker
Linux
Nginx
Cloudflare
Forgejo
n8n
WireGuard
Prometheus
Grafana
Git
Windows Server
Active Directory
Loki
Tempo

Proyectos Destacados

Soluciones reales a problemas reales. Una selección de mis trabajos más recientes.

Web Rutas Raíces
Cliente real

Web Rutas Raíces

Web de senderismo para cliente real en Asturias. Astro 7 + React 19 + Tailwind 4, mapas Leaflet con perfil de elevación a partir de GPX y versión bilingüe ES/EN. Alta de rutas automatizada con n8n + IA; WebP, CSP y cumplimiento RGPD.

AstroReactLeafletn8n
Infraestructura IT para una pyme
Cliente real

Infraestructura IT para una pyme

Diseño, implantación y soporte continuo de la infraestructura IT de una pequeña empresa que trabajaba desde un único portátil: NAS en RAID 1 con Btrfs y snapshots, permisos por grupos sobre SMB, puestos Windows 11 y una capa Docker para gestión documental, automatización y monitorización.

NASRAID 1BtrfsWindows 11DockerPaperless-ngx
OposApp
TFG

OposApp

Mi Trabajo de Fin de Grado (DAM): app móvil en Flutter que automatiza el seguimiento de convocatorias del BOPA y genera tests de práctica con IA local (Ollama), con privacidad total por diseño.

FlutterSpring BootIA Local (Ollama)PostgreSQLRGPD
English Brain — Tu coach de entrevistas en inglés con IA, autoalojado
Open Source · Activo

English Brain — Tu coach de entrevistas en inglés con IA, autoalojado

Una plataforma privada y autoalojada para preparar entrevistas técnicas en inglés hablando, no escribiendo. Tocas un orbe, hablas, y el coach te transcribe, te corrige la pronunciación fonema a fonema y te programa el repaso con repetición espaciada (py-fsrs). Toda la IA —el modelo de lenguaje, el reconocimiento de voz y la síntesis— corre en tu propio hardware: tu voz y tus respuestas nunca salen de tu red. Por dentro: cliente Flutter (Android, Web y Windows), orquestador FastAPI y una arquitectura GPU híbrida sobre Docker + Caddy.

IA localVozFlutterFastAPISelf-hostedPronunciación
QuantumSec — Kompliance
FCT 2025

QuantumSec — Kompliance

Prácticas FCT en remoto en una empresa de ciberseguridad (plataforma de cumplimiento Kompliance). Llevé su gestor de auditorías de Supabase a una API propia self-hosted con FastAPI: multitenancy validado por JWT, secretos cifrados, logs de auditoría inmutables y un gestor de contraseñas con claves de un solo uso cifradas.

FastAPIReactTypeScriptPostgreSQLSeguridad
DozeForge — Control total de tu Android por ADB (sin root)
Open Source · Beta 1

DozeForge — Control total de tu Android por ADB (sin root)

App de escritorio que te da el control real de tu Android desde el PC, sin rootear. La conectas por ADB y optimizas batería, memoria, red y decenas de ajustes del sistema desde un solo sitio: caza las apps que te drenan la batería (aunque se escondan tras Google Play Services), quita bloatware de fábrica y aplica perfiles de un clic — y todo es reversible con rollback atómico. Por dentro: Tauri 2 + Rust + SvelteKit 5, telemetría real (dumpsys/sysfs) y primitivas públicas de Android.

Android sin rootOptimizaciónTauri 2RustSvelteKit
SubsForge — Subtítulos con IA, 100% en local
Open Source

SubsForge — Subtítulos con IA, 100% en local

App de escritorio para traducir, generar, sincronizar, fusionar, limpiar, doblar, resumir e incrustar subtítulos de vídeo con IA — sin servicios de terceros y funcionando 100% en tu máquina. Nueve herramientas en una: traducción por lotes (nube u Ollama local), transcripción con Whisper, sincronización por detección de voz (VAD), doblaje con voces TTS, hardsub y limpieza de audio. Por dentro: Tauri 2 + Rust como puente y un sidecar de Python (faster-whisper, FFmpeg, ffsubsync, edge-tts) que hace el trabajo pesado sin bloquear nunca la interfaz.

Subtítulos IAWhisperTauri 2RustPython100% local
OrquestaGit — Tu DevOps senior local con IA
Open Source · En desarrollo

OrquestaGit — Tu DevOps senior local con IA

Una app de escritorio que automatiza el trabajo repetitivo de DevOps sobre tus repositorios: escanea su estado, bloquea secretos antes de cada commit, genera pipelines de CI/CD y audita dependencias, todo desde un único panel de control. La IA corre en local con Ollama, así que tu código nunca sale de tu equipo. Construida con Tauri 2 y un motor de orquestación en Python.

DevOpsIA localSeguridadTauri 2PythonCI/CD
Job-radar · Empleo CRM
Open Source

Job-radar · Empleo CRM

CRM web self-hosted que automatiza y centraliza mi búsqueda de empleo: reúne las ofertas, las puntúa con IA (Groq/Gemini/Ollama), genera carta y ajustes de CV, y las sigue en un kanban. Astro SSR + React + PostgreSQL, todo configurable desde la web y replicable con un comando.

Astro SSRReactPostgreSQLIA · LLMsn8nDocker
LifeOS — Suite familiar con IA
En desarrollo

LifeOS — Suite familiar con IA

Suite SaaS familiar autohospedada con IA propia ("Lito"). Backend NestJS + PostgreSQL + BullMQ y app Angular 18 + Ionic. RAG sobre pgvector/Qdrant y LLMs vía Model Context Protocol (MCP). Módulos de chat, gastos con splits en tiempo real, calendario, nube y notas.

NestJSAngularIA / RAGMCPDocker
Infraestructura Pesoz
En Producción

Infraestructura Pesoz

Homelab self-hosted en producción 24/7: un NAS Synology con ~30 servicios en Docker tras Caddy + CrowdSec y un portátil con GPU como servidor de IA y observabilidad en k3s. VPN WireGuard, GitOps con Forgejo y estado en vivo con Uptime Kuma.

Dockerk3sCaddyWireGuardCI/CDObservabilidad
Hooklab
Nuevo

Hooklab

Constructor, firmador y verificador de webhooks 100% en el navegador: crea payloads con variables simuladas, firma y verifica HMAC (GitHub, Stripe, Shopify, Slack), genera con IA local y dispara un POST. Zero-backend, con el estado compartible en la URL.

AstroZero-backendWeb CryptoIA local
Acopio de Código
Nuevo

Acopio de Código

Página web interactiva con snippets de código de varios lenguajes: busca, copia y ten todo a mano. Autohospedada en mi propia infraestructura.

ReactSnippetsSelf-hosted
Vagabond Battery Saver
Open Source

Vagabond Battery Saver

Módulo Magisk para Android root. Optimización agresiva de batería mediante gestión de governors de CPU y perfiles de energía al bloquear la pantalla.

AndroidShell ScriptMagisk
Happines&CO
Educativo

Happines&CO

Sitio web corporativo para empresa de eventos, desarrollado durante el ciclo de DAM. Diseño responsive y estructura semántica limpia.

HTML5CSS3JavaScript
Portfolio Web
Meta

Portfolio Web

Este mismo sitio. Astro 7 + React (islas) + Tailwind, self-hosted con Docker y Caddy. Cada proyecto es una carpeta con su contenido y se da de alta con un script (npm run proyecto:add).

AstroReactTailwindSelf-hosted

Últimas publicaciones

Guías prácticas probadas en mi propia infraestructura.

Portada: escudo con símbolo de prohibido sobre fondo oscuro con el título AdGuard Home
Redes y seguridad

AdGuard Home en Docker: sin publicidad en toda la casa y tus subdominios en local

Monto AdGuard Home en Docker para bloquear publicidad en toda la red, usar DNS cifrado y resolver mis subdominios en casa sin depender del router.

8 min de lectura

#adguard-home#dns#docker#privacidad#homelab
Leer
Portada: candado con flechas de entrada sobre fondo oscuro con el título Caddy como puerta de entrada
Redes y seguridad

Caddy como puerta de entrada del homelab: HTTPS, cabeceras seguras y CrowdSec

Cómo uso Caddy en Docker como única entrada a mi NAS: HTTPS por DNS de Cloudflare, snippets de seguridad, paneles solo LAN y CrowdSec contra IPs abusivas.

11 min de lectura

#caddy#https#docker#crowdsec#seguridad#cloudflare
Leer
Portada: una caja de contenedor con una campana de aviso y un avión de papel sobre fondo oscuro con el título Diun y Telegram
Automatización

Diun y alertas en Telegram: entérate de las imágenes nuevas sin actualizar a ciegas

Uso Diun para saber cuándo hay imágenes Docker nuevas y un único bot de Telegram para recibir los avisos de Diun, CrowdSec y Uptime Kuma.

7 min de lectura

#diun#docker#telegram#alertas#observabilidad
Leer
Portada: ramas de Git que se unen en una marca de verificación sobre fondo oscuro con el título Forgejo y GitHub Actions
Automatización

Forgejo y GitHub Actions: tu infraestructura en Git y un repo público profesional

Monto Forgejo en casa como fuente de verdad de mi infraestructura, protejo los secretos y preparo un repo público con CI, Dependabot y plantillas.

13 min de lectura

#git#forgejo#github-actions#ci#gitops#buenas-practicas
Leer
Portada: logotipo de reproducción sobre fondo oscuro con el título Jellyfin en mi NAS
Homelab

Jellyfin en un NAS: Docker, transcoding por hardware y la TV que no quería conectar

Cómo monto Jellyfin en un NAS con Intel, activo el transcoding por GPU, lo publico con Caddy y arreglo el error -27 de las TV LG antiguas.

7 min de lectura

#jellyfin#docker#nas#caddy#transcoding#synology
Leer
Portada: gráfica de líneas y barras de un panel de métricas sobre fondo oscuro con el título Observabilidad en casa
Homelab

Observabilidad en casa: Grafana, Prometheus y Loki sin ahogar el NAS

Monto métricas, logs y alertas con Prometheus, Grafana y Loki, y cuento por qué acabé moviendo el stack del NAS a un portátil con k3s.

11 min de lectura

#grafana#prometheus#loki#observabilidad#docker#kubernetes
Leer
Portada: línea de latido y barras de disponibilidad sobre fondo oscuro con el título Uptime Kuma
Homelab

Uptime Kuma: vigila tus servicios y enseña su estado en vivo en tu CV

Monto Uptime Kuma en Docker, configuro monitores y avisos útiles, publico solo la página de estado y la muestro en mi portfolio con un widget en JS.

8 min de lectura

#uptime-kuma#monitorizacion#docker#caddy#portfolio
Leer

Trabajemos juntos

¿Buscas un perfil full-stack / DevOps, un colaborador o un freelance? Cuéntame qué necesitas y te respondo en menos de 24 h.

ivanjonasfc@dev:~/contacto

# ¿Qué te trae por aquí?

↳
↳
↳

Sin spam. Tus datos solo se usan para responderte.

Terminal interactiva