Volver a publicaciones

Redes y seguridad

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

8 min de lectura

#adguard-home#dns#docker#privacidad#homelab

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

Puntos clave

  • AdGuard Home en Docker con red de host y el panel en el puerto 3100.
  • Pocas listas de bloqueo bien elegidas: más listas significa más falsos positivos.
  • DNS de subida cifrado (DoH/DoT) y caché para que la navegación vaya más rápida.
  • Una reescritura comodín resuelve tus subdominios hacia el NAS y evita el problema del hairpin NAT.
  • Ojo con Firefox y su DNS over HTTPS propio: se salta AdGuard si no lo desactivas.

Durante un tiempo usé Pi-hole para quitar la publicidad de la red de casa. Funcionaba, pero cuando empecé a publicar servicios con mi propio dominio necesitaba algo más: DNS cifrado hacia fuera y una forma sencilla de resolver mis subdominios dentro de casa. AdGuard Home trae las dos cosas de serie, así que lo sustituí.

Lo mejor no fue el bloqueo de anuncios. Fue que, gracias a una sola regla, mis subdominios empezaron a funcionar dentro de casa igual que desde fuera. Te cuento cómo.

Qué vas a montar

  • AdGuard Home en Docker, como servidor DNS de toda la casa.
  • Listas de bloqueo, DNS de subida cifrado y caché.
  • Una reescritura DNS comodín para que tus subdominios apunten al NAS.
  • El panel de administración solo accesible desde casa o la VPN, detrás de Caddy.

Requisitos

  • Docker y Docker Compose en el NAS.
  • El puerto 53 libre en el NAS (es el puerto del DNS).
  • Acceso a la configuración DHCP de tu router.

En los ejemplos, 192.168.1.10 es la IP de tu NAS. Es un valor de ejemplo: usa la tuya. Y dale al NAS una IP fija (reserva DHCP en el router): si cambia, toda la casa se queda sin DNS.

Paso 1: el docker-compose.yml

Crea una carpeta para AdGuard Home y dentro este archivo:

services:
  adguardhome:
    image: adguard/adguardhome:v0.107.52   # fija una versión v0.107.x concreta
    container_name: adguardhome
    network_mode: host                     # ve las IP reales de cada dispositivo
    command:
      - "--no-check-update"                # las actualizaciones, cambiando la imagen
      - "-c"
      - "/opt/adguardhome/conf/AdGuardHome.yaml"
      - "-w"
      - "/opt/adguardhome/work"
      - "--web-addr"
      - "0.0.0.0:3100"                     # el 3000 suele estar ocupado
    volumes:
      - ./work:/opt/adguardhome/work       # estadísticas y registro de consultas
      - ./conf:/opt/adguardhome/conf       # configuración (AdGuardHome.yaml)
    restart: unless-stopped

Por qué así:

  • network_mode: host. El DNS usa el puerto 53 por UDP y TCP. Con red de host no hay que publicar puertos y, además, AdGuard ve la IP real de cada dispositivo. Así las estadísticas dicen “el móvil” y no “el contenedor”.
  • --web-addr 0.0.0.0:3100. El panel usa por defecto el 3000, que en mi NAS ya estaba ocupado. Lo muevo al 3100.
  • Repito -c y -w. Al definir command sustituyes los argumentos por defecto de la imagen. Si solo pones --web-addr, la configuración se guardaría fuera de los volúmenes y la perderías al recrear el contenedor.

Arranca el contenedor:

docker compose up -d
docker logs --tail 20 adguardhome

Paso 2: el asistente inicial

Abre http://192.168.1.10:3100 en el navegador. La primera vez aparece un asistente de pocos pasos:

  1. Interfaces y puertos. Deja el panel en el puerto 3100 y el DNS en el 53, escuchando en todas las interfaces.
  2. Usuario y contraseña del panel. Usa una contraseña fuerte y única.
  3. Configurar dispositivos. Te enseña cómo apuntar los equipos al nuevo DNS. Lo haremos para toda la casa en el paso 4.
  4. Termina y entra al panel.

Paso 3: listas, DNS cifrado y caché

Listas de bloqueo

La lista AdGuard DNS filter viene activada y cubre lo principal. Yo añado una o dos más desde la lista integrada de la sección de filtros (por ejemplo, una de las de HaGeZi u OISD). No te pases: cada lista extra añade falsos positivos, y acabarás con webs de bancos o tiendas que no cargan sin saber por qué.

DNS de subida cifrado

AdGuard necesita preguntar a otro servidor lo que no sabe. Por defecto lo hace sin cifrar, y tu proveedor de Internet puede ver cada dominio que visitas. En la configuración DNS, en los servidores de subida, uso DNS over HTTPS (DoH) o DNS over TLS (DoT):

https://dns.quad9.net/dns-query
tls://dns.quad9.net
https://cloudflare-dns.com/dns-query

Con eso, desde tu casa hacia fuera todas las consultas DNS van cifradas.

Caché

En la misma pantalla está la caché de DNS. Actívala (viene activa) y dale un tamaño razonable. Las respuestas repetidas salen del NAS en milisegundos, sin volver a preguntar fuera.

Paso 4: que lo use toda la casa

Hay dos formas:

  • Toda la red (recomendado). En el router, en la configuración DHCP, pon la IP del NAS (192.168.1.10) como servidor DNS. Cada dispositivo que se conecte recibirá ese DNS sin configurar nada. Puede que tengas que reconectar los equipos para que lo cojan.
  • Por dispositivo. Cambias el DNS a mano en cada equipo. Útil para probar antes de aplicarlo a todos.

El compromiso del DNS secundario

Si el NAS se apaga, la red se queda sin DNS: nada carga. La tentación es poner un DNS secundario público en el router. Pero los dispositivos no usan el secundario solo como reserva: muchos reparten las consultas entre los dos. Parte del tráfico se saltará el bloqueo.

Mis opciones: aceptar ese compromiso (menos bloqueo, más tolerancia a fallos) o montar una segunda instancia de AdGuard Home en otro equipo y poner las dos.

El truco que me arregló los subdominios: reescrituras DNS

Este es el problema que me costó tiempo. Desde fuera de casa, app.example.com funcionaba. Desde dentro, no cargaba.

La causa es el hairpin NAT: el dominio apunta a tu IP pública, y muchos routers no permiten que un dispositivo de dentro salga hacia la IP pública y vuelva a entrar a la propia red.

La solución fue una sola regla en AdGuard. En la sección Reescrituras DNS añado:

Dominio Respuesta
*.example.com 192.168.1.10
example.com 192.168.1.10

El comodín cubre todos los subdominios; el dominio raíz necesita su propia línea. Desde ese momento, dentro de casa y por la VPN (si tu VPN usa AdGuard como DNS), los subdominios resuelven directamente a la IP del NAS y llegan al proxy sin salir a Internet. Más rápido y sin depender del router.

Ojo: para que funcione, el proxy tiene que responder en el puerto 443 de esa IP. Si tu proxy escucha en otro puerto (como el 8443 del capítulo anterior), revisa cómo llega el tráfico interno a él.

Trampas que conviene conocer

Firefox se salta AdGuard

Firefox puede usar su propio DNS over HTTPS, directamente contra un proveedor externo. Si lo tiene activo, ni ve tus bloqueos ni tus reescrituras. Para desactivarlo, escribe about:config en la barra de direcciones y cambia:

network.trr.mode = 5

El valor 5 significa “DoH desactivado por decisión del usuario”. Otros navegadores y algunos dispositivos tienen una opción parecida de “DNS seguro”: revísala si un equipo se salta el bloqueo.

El panel, solo desde casa

El panel de AdGuard controla el DNS de toda tu red: no debe estar en Internet. Lo publico detrás de Caddy con el snippet internal_only del capítulo anterior:

adguard.example.com {
    import internal_only
    import security_headers
    reverse_proxy localhost:3100
}

Dos cosas más: cambia la contraseña si usaste una débil en el asistente, y no subas AdGuardHome.yaml a un repositorio público. Contiene el hash de tu contraseña.

Cómo comprobar que funciona

Desde cualquier ordenador de casa, pregunta por un dominio de publicidad conocido:

nslookup doubleclick.net 192.168.1.10

Si la respuesta es 0.0.0.0, AdGuard lo está bloqueando. Prueba también uno de tus subdominios:

nslookup app.example.com 192.168.1.10

Debe devolver la IP del NAS. Después, en el panel:

  • El registro de consultas muestra cada petición, qué dispositivo la hizo y si se bloqueó.
  • La pantalla principal muestra el porcentaje de consultas bloqueadas. En una casa normal es fácil ver un porcentaje de dos cifras.

El compose completo

services:
  adguardhome:
    image: adguard/adguardhome:v0.107.52
    container_name: adguardhome
    network_mode: host
    command:
      - "--no-check-update"
      - "-c"
      - "/opt/adguardhome/conf/AdGuardHome.yaml"
      - "-w"
      - "/opt/adguardhome/work"
      - "--web-addr"
      - "0.0.0.0:3100"
    volumes:
      - ./work:/opt/adguardhome/work
      - ./conf:/opt/adguardhome/conf
    restart: unless-stopped

Problemas frecuentes

Síntoma Causa probable Solución
El contenedor no arranca: puerto 53 en uso Otro servicio DNS en el NAS Detén ese servicio o cambia su puerto
El panel no abre en el 3100 command sin --web-addr o puerto ocupado Revisa docker logs adguardhome
La configuración se pierde al recrear command sin -c ni -w Usa el command completo del compose
Un equipo sigue viendo anuncios DNS propio del navegador o del dispositivo network.trr.mode = 5 en Firefox; revisa el “DNS seguro”
Una web legítima no carga Falso positivo de una lista Registro de consultas → desbloquear ese dominio
Mis subdominios no cargan dentro de casa Hairpin NAT Reescritura *.example.com → IP del NAS

Conclusión

AdGuard Home es de lo que más se nota en casa: menos anuncios, menos rastreo y DNS cifrado hacia fuera. Pero lo que más me ha servido es la reescritura comodín: con una regla, todos mis servicios funcionan igual dentro y fuera de casa.

En el próximo capítulo monto Uptime Kuma para vigilar que todo esto sigue en pie y enseñar su estado en tiempo real en mi portfolio.

For a while I used Pi-hole to strip ads from my home network. It worked, but when I started publishing services under my own domain I needed more: encrypted DNS going out and a simple way to resolve my subdomains inside the house. AdGuard Home ships both out of the box, so I replaced it.

The best part was not the ad blocking. It was that, thanks to a single rule, my subdomains started working at home exactly as they do from outside. Here is how.

What you will build

  • AdGuard Home in Docker, as the DNS server for the whole house.
  • Blocklists, encrypted upstream DNS and caching.
  • A wildcard DNS rewrite so your subdomains point to the NAS.
  • The admin panel reachable only from home or the VPN, behind Caddy.

Requirements

  • Docker and Docker Compose on the NAS.
  • Port 53 free on the NAS (the DNS port).
  • Access to your router’s DHCP settings.

In the examples, 192.168.1.10 is your NAS IP. It is an example value: use yours. And give the NAS a fixed IP (a DHCP reservation on the router): if it changes, the whole house loses DNS.

Step 1: the docker-compose.yml

Create a folder for AdGuard Home with this file:

services:
  adguardhome:
    image: adguard/adguardhome:v0.107.52   # pin a specific v0.107.x version
    container_name: adguardhome
    network_mode: host                     # sees the real IP of every device
    command:
      - "--no-check-update"                # update by changing the image
      - "-c"
      - "/opt/adguardhome/conf/AdGuardHome.yaml"
      - "-w"
      - "/opt/adguardhome/work"
      - "--web-addr"
      - "0.0.0.0:3100"                     # 3000 is often taken
    volumes:
      - ./work:/opt/adguardhome/work       # statistics and query log
      - ./conf:/opt/adguardhome/conf       # configuration (AdGuardHome.yaml)
    restart: unless-stopped

Why like this:

  • network_mode: host. DNS uses port 53 over UDP and TCP. With host networking there are no ports to publish and, on top of that, AdGuard sees each device’s real IP. So the statistics say “the phone” instead of “the container”.
  • --web-addr 0.0.0.0:3100. The panel uses port 3000 by default, which was already taken on my NAS. I move it to 3100.
  • I repeat -c and -w. Defining command replaces the image’s default arguments. If you only set --web-addr, the configuration would be saved outside the volumes and you would lose it when recreating the container.

Start the container:

docker compose up -d
docker logs --tail 20 adguardhome

Step 2: the setup wizard

Open http://192.168.1.10:3100 in the browser. The first time, a short wizard appears:

  1. Interfaces and ports. Keep the panel on port 3100 and DNS on 53, listening on all interfaces.
  2. Username and password for the panel. Use a strong, unique password.
  3. Configure devices. It shows how to point devices at the new DNS. We will do it for the whole house in step 4.
  4. Finish and log into the panel.

Step 3: lists, encrypted DNS and cache

Blocklists

The AdGuard DNS filter list comes enabled and covers the essentials. I add one or two more from the built-in list in the filters section (for example, one of the HaGeZi or OISD lists). Do not overdo it: every extra list adds false positives, and you will end up with bank or shop websites that do not load without knowing why.

Encrypted upstream DNS

AdGuard has to ask another server for what it does not know. By default it does so unencrypted, and your ISP can see every domain you visit. In the DNS settings, under upstream servers, I use DNS over HTTPS (DoH) or DNS over TLS (DoT):

https://dns.quad9.net/dns-query
tls://dns.quad9.net
https://cloudflare-dns.com/dns-query

With that, every DNS query leaving your home is encrypted.

Cache

The DNS cache is on the same screen. Enable it (it is on by default) and give it a reasonable size. Repeated answers come from the NAS in milliseconds, without asking outside again.

Step 4: make the whole house use it

There are two ways:

  • Whole network (recommended). On the router, in the DHCP settings, set the NAS IP (192.168.1.10) as the DNS server. Every device that connects will get that DNS without configuring anything. You may need to reconnect devices so they pick it up.
  • Per device. You change the DNS by hand on each device. Useful to test before applying it to everyone.

The secondary DNS trade-off

If the NAS goes down, the network has no DNS: nothing loads. The temptation is to set a public secondary DNS on the router. But devices do not use the secondary only as a fallback: many split queries between both. Part of the traffic will skip the blocking.

My options: accept that trade-off (less blocking, more fault tolerance) or run a second instance of AdGuard Home on another machine and set both.

The trick that fixed my subdomains: DNS rewrites

This is the problem that cost me time. From outside the house, app.example.com worked. From inside, it did not load.

The cause is hairpin NAT: the domain points to your public IP, and many routers do not let a device inside go out to the public IP and come back into the same network.

The fix was a single rule in AdGuard. In the DNS rewrites section I add:

Domain Answer
*.example.com 192.168.1.10
example.com 192.168.1.10

The wildcard covers every subdomain; the root domain needs its own line. From then on, at home and over the VPN (if your VPN uses AdGuard as its DNS), subdomains resolve straight to the NAS IP and reach the proxy without leaving for the Internet. Faster, and without depending on the router.

Note: for this to work, the proxy has to answer on port 443 of that IP. If your proxy listens on another port (like the 8443 from the previous chapter), check how internal traffic reaches it.

Traps worth knowing

Firefox bypasses AdGuard

Firefox can use its own DNS over HTTPS, straight to an external provider. If it is active, it sees neither your blocks nor your rewrites. To disable it, type about:config in the address bar and change:

network.trr.mode = 5

Value 5 means “DoH turned off by the user’s choice”. Other browsers and some devices have a similar “secure DNS” option: check it if a device skips the blocking.

The panel, from home only

The AdGuard panel controls DNS for your whole network: it must not be on the Internet. I publish it behind Caddy with the internal_only snippet from the previous chapter:

adguard.example.com {
    import internal_only
    import security_headers
    reverse_proxy localhost:3100
}

Two more things: change the password if you used a weak one in the wizard, and do not commit AdGuardHome.yaml to a public repository. It contains your password hash.

How to check it works

From any computer at home, ask for a well-known ad domain:

nslookup doubleclick.net 192.168.1.10

If the answer is 0.0.0.0, AdGuard is blocking it. Also try one of your subdomains:

nslookup app.example.com 192.168.1.10

It should return the NAS IP. Then, in the panel:

  • The query log shows every request, which device made it and whether it was blocked.
  • The main screen shows the percentage of blocked queries. In a normal household it is easy to see a double-digit percentage.

The complete compose file

services:
  adguardhome:
    image: adguard/adguardhome:v0.107.52
    container_name: adguardhome
    network_mode: host
    command:
      - "--no-check-update"
      - "-c"
      - "/opt/adguardhome/conf/AdGuardHome.yaml"
      - "-w"
      - "/opt/adguardhome/work"
      - "--web-addr"
      - "0.0.0.0:3100"
    volumes:
      - ./work:/opt/adguardhome/work
      - ./conf:/opt/adguardhome/conf
    restart: unless-stopped

Common problems

Symptom Likely cause Fix
The container will not start: port 53 in use Another DNS service on the NAS Stop that service or change its port
The panel does not open on 3100 command without --web-addr or port taken Check docker logs adguardhome
Configuration is lost on recreate command without -c and -w Use the full command from the compose file
A device still sees ads The browser’s or device’s own DNS network.trr.mode = 5 in Firefox; check “secure DNS”
A legitimate website does not load False positive from a list Query log → unblock that domain
My subdomains do not load at home Hairpin NAT Rewrite *.example.com → NAS IP

Conclusion

AdGuard Home is one of the things you notice most at home: fewer ads, less tracking and encrypted DNS going out. But what has helped me most is the wildcard rewrite: with one rule, all my services work the same inside and outside the house.

In the next chapter I set up Uptime Kuma to keep an eye on all of this and show its live status on my portfolio.

Preguntas frecuentes

¿AdGuard Home o Pi-hole?

Los dos cumplen. Yo cambié a AdGuard Home porque trae DNS cifrado de subida, reescrituras DNS y una interfaz cómoda sin instalar nada más.

¿Qué pasa si se apaga el NAS?

Si AdGuard es el único DNS, la red se queda sin resolver nombres. Puedes poner un DNS secundario en el router, sabiendo que parte del tráfico se saltará el bloqueo, o montar una segunda instancia.

¿Bloquea la publicidad de YouTube?

No de forma fiable. YouTube sirve los anuncios desde los mismos dominios que los vídeos, así que un bloqueador DNS no puede separarlos.

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