[{"data":1,"prerenderedAt":184},["ShallowReactive",2],{"seo-verification":3,"blog-instalar-apache-airflow-en-un-vps-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-instalar-apache-airflow-en-un-vps-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":29,"intro":32,"sections":33,"ctaTitle":127,"ctaBody":128,"ctaButton":129,"ctaUrl":130,"relatedPosts":131},31,"instalar-apache-airflow-en-un-vps",{"fr":12,"en":13,"ar":14,"es":10},"installer-apache-airflow-vps","installing-apache-airflow-on-a-vps-self-hosted-automation","تثبيت-apache-airflow-على-خادم-vps-أتمتة-ذاتية-الاستضافة","Apache Airflow 3 en un VPS: guía completa y CVE-2026-58076","Despliega Apache Airflow 3 en tu VPS con Docker Compose: DAG en Python, CeleryExecutor, HTTPS — y la actualización 3.3.1 que corrige CVE-2026-58076.",10,0,false,"2026-05-20T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},2,"Automatización","automatisation","bg-brand-action\u002F10 text-brand-action",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Finstaller-apache-airflow-vps-poster.svg","Apache Airflow es la referencia de código abierto para orquestar pipelines de datos en forma de DAG escritos en Python. Con Airflow 3, publicado en abril 2025, la arquitectura se ha rediseñado a fondo: las tareas ya no acceden directamente a la base de metadatos y se comunican mediante una API de ejecución dedicada. Autoalojado en un VPS, Airflow se convierte en tu orquestador central, sin depender de un entorno gestionado facturado por hora.",[34,38,49,52,55,80,83,86,89,92,95],{"type":35,"title":36,"body":37},"h2","Por qué autoalojar Apache Airflow en un VPS","Airflow es la herramienta que eligen los equipos de datos cuando quieren describir sus pipelines en Python puro: cada DAG es un archivo `.py` que define tareas, sus dependencias y su planificación. El ecosistema de providers es inmenso (bases SQL, S3, BigQuery, dbt, Spark…) y la comunidad, enorme. Los servicios gestionados facturan caro el entorno por hora; al autoalojar Airflow en un VPS obtienes el mismo motor por el coste de un servidor, y tus DAG se ejecutan cerca de tus fuentes de datos internas. También es una cuestión de control: versiones de los providers, dependencias Python propias, variables y conexiones, todo queda en tus manos. Airflow 3, versión vigente desde abril 2025 (3.3.0 en julio 2026, 3.3.1 en agosto 2026), aporta una arquitectura orientada a API: los workers ya no acceden a PostgreSQL directamente.",{"type":39,"title":40,"items":41},"ul","Beneficios concretos del autoalojamiento",[42,43,44,45,46,47,48],"DAG en Python puro, versionados en Git, con dependencias y providers bajo control.","Enorme ecosistema de operadores: SQL, cloud, dbt, Spark, HTTP, Kubernetes y más.","Scheduler robusto: cron, dependencias entre tareas, backfill y catchup nativos.","Workers Celery escalables para absorber cientos de tareas en paralelo.","Ejecución cerca de tus bases internas, sin tránsito por una nube de terceros.","Coste de un VPS en lugar de un entorno gestionado facturado por hora.","Control total de las versiones: quédate en Airflow 2.x o migra a 3 a tu ritmo.",{"type":35,"title":50,"body":51},"Airflow 2 o Airflow 3: qué versión elegir en 2026","Airflow 3.0 introdujo rupturas importantes. Se han retirado los atributos `schedule_interval`, los `SubDAGs` y `execution_date`; los providers exigen Airflow 3.1 como mínimo desde mayo 2026. Si empiezas un proyecto nuevo, **instala Airflow 3** directamente: el archivo `docker-compose.yaml` oficial ya está adaptado. Si mantienes DAG existentes que usan `schedule_interval`, `execution_date` o SubDAGs, quédate en la última versión 2.x y planifica la migración: la documentación oficial ofrece una guía de actualización desde Airflow 2.7 como mínimo. La imagen Docker sigue el mismo esquema: `apache\u002Fairflow:3.3.1` para la rama estable actual, `apache\u002Fairflow:2.11.0` para mantenerte en la rama 2.",{"type":35,"title":53,"body":54},"Requisitos técnicos","Airflow es la pila más exigente de esta serie en configuración CeleryExecutor, porque ejecuta a la vez webserver, scheduler, worker(s), triggerer, un servidor de API interno, Redis y PostgreSQL. La documentación oficial recomienda 4 GB de RAM como mínimo, pero en la práctica cuenta con **4 vCPU y 8 GB** para una carga cómoda. Prevé 16 GB si tus DAG cargan pandas o grandes volúmenes. Opta por el **modo LocalExecutor** (sin Celery ni Redis) si empiezas en un VPS de 4 GB: la pila se reduce a la mitad. También necesitarás Docker 24+ y Docker Compose v2 (no el antiguo `docker-compose` v1), 40 GB de disco SSD y un dominio apuntando a tu servidor.",{"type":56,"title":57,"steps":58},"steps","Desplegar Apache Airflow 3 con Docker Compose",[59,62,65,68,71,74,77],{"title":60,"body":61},"Preparar las carpetas y descargar el compose oficial","Crea el directorio de trabajo y descarga el archivo de referencia: `mkdir -p \u002Fopt\u002Fairflow && cd \u002Fopt\u002Fairflow && curl -LfO 'https:\u002F\u002Fairflow.apache.org\u002Fdocs\u002Fapache-airflow\u002Fstable\u002Fdocker-compose.yaml'`. Crea después las subcarpetas que esperan los volúmenes montados: `mkdir -p .\u002Fdags .\u002Flogs .\u002Fplugins .\u002Fconfig`.",{"title":63,"body":64},"Ajustar el UID y los permisos (paso crítico)","Airflow exige que los volúmenes montados pertenezcan al mismo UID que el usuario interno del contenedor. Genera el archivo de entorno: `echo \"AIRFLOW_UID=$(id -u)\" > .env`. **Sin este archivo, el scheduler no puede escribir sus logs** y falla al arrancar.",{"title":66,"body":67},"Inicializar la base de datos","Airflow debe aplicar primero sus migraciones sobre PostgreSQL y crear la cuenta de administrador. Ejecuta: `docker compose up airflow-init`. El contenedor aplica las migraciones, crea el usuario `airflow` con contraseña `airflow` y termina con código `0`. **Espera ese código `0`** antes de continuar.",{"title":69,"body":70},"Arrancar la pila completa","Lanza todos los servicios en segundo plano: `docker compose up -d`. Comprueba el estado con `docker compose ps` — todos los contenedores deben pasar a `healthy` en 1 a 3 minutos. Si uno se queda en `starting`, consulta sus logs: `docker compose logs airflow-scheduler`. El webserver escucha por defecto en el puerto 8080.",{"title":72,"body":73},"Montar el proxy inverso HTTPS","No expongas nunca el puerto 8080 directamente: la interfaz de Airflow muestra conexiones, variables y logs potencialmente sensibles. Instala Caddy: `apt install -y caddy`. Crea `\u002Fetc\u002Fcaddy\u002FCaddyfile` con: `airflow.tudominio.com { reverse_proxy localhost:8080 }`. Recarga: `systemctl reload caddy`.",{"title":75,"body":76},"Desplegar tu primer DAG","Coloca un archivo Python en `.\u002Fdags\u002F`. Un DAG mínimo compatible con Airflow 3 usa `schedule` en lugar de `schedule_interval` (eliminado en 3.0): `from airflow.sdk import DAG, task`, luego `with DAG('hello', schedule='@daily', start_date=datetime(2025, 1, 1), catchup=False)`. El scheduler lo detecta en unos segundos.",{"title":78,"body":79},"Construir una imagen propia para tus dependencias Python","Para providers o bibliotecas propias (pandas, sqlalchemy, boto3…), no las instales en tiempo de ejecución: construye tu propia imagen. Crea un `Dockerfile`: `FROM apache\u002Fairflow:3.3.1`, luego `USER airflow` (obligatorio — los paquetes instalados como `root` son inaccesibles para el usuario airflow) y `RUN pip install --no-cache-dir apache-airflow-providers-amazon==9.0.0 pandas==2.2.0`. En `docker-compose.yaml`, sustituye `image: apache\u002Fairflow:3.3.1` por `build: .`. Reconstruye con `docker compose build && docker compose up -d`.",{"type":35,"title":81,"body":82},"CVE-2026-58076: corregir la RCE de deserialización (Airflow 3.0.0 → 3.3.0)","**Si has seguido los pasos anteriores con una imagen anterior a 3.3.1, estás afectado.** CVE-2026-58076 (CVSS **8.8**) afecta a **Apache Airflow desde 3.0.0 hasta 3.3.0 incluida**; la corrección está en **3.3.1**. La capa de serialización reconstruía los nodos de excepción (`airflow_exc_ser` \u002F `base_exc_ser`) importando una clase cuyo nombre procede del propio blob serializado y luego instanciándola con argumentos de esos mismos datos, sin restricción útil sobre lo que podía importarse. El `executor_config` de un operador alcanza esa ruta: **un autor de DAG puede hacer que se cargue y ejecute un callable arbitrario**. El scheduler pasa por ese código en su bucle normal al reconstruir los DAG serializados; el servidor de API pasa por él en una lectura autenticada, por ejemplo al mostrar el detalle de un DAG. La corrección de 3.3.1 restringe la clase importada a subclases de `BaseException`.\n\n**Para actualizar**: cambia la etiqueta a `apache\u002Fairflow:3.3.1` en tu `docker-compose.yaml` *y* en el `FROM` de tu imagen propia, después `docker compose pull && docker compose up -d`. Verifica con `docker compose exec airflow-apiserver airflow version`.\n\n⚠️ **Una actualización hecha por CVE-2026-33264 no basta**: ese aviso cubría solo la rama `trigger` del mismo deserializador — es un punto de entrada distinto y su corrección no cierra este.\n\n⚠️ **El vector es el autor del DAG, no un visitante anónimo.** Actualizar es necesario; la pregunta añadida es *quién puede dejar un archivo en `.\u002Fdags` y quién tiene cuenta en la interfaz*.",{"type":35,"title":84,"body":85},"Migrar de Airflow 2 a Airflow 3: qué se rompe","Si tienes DAG existentes, revisa estos puntos antes de actualizar la imagen. **`schedule_interval` se ha eliminado**: sustitúyelo por `schedule`. **`execution_date`** ya no está disponible en el contexto de las tareas: usa `logical_date`. **Los SubDAGs se han retirado**: migra a TaskGroups o a dynamic task mapping. **Los XComs en pickle** están desactivados por defecto: tus XComs deben ser tipos serializables en JSON. **El acceso directo a la base de metadatos desde el código de tarea** (vía `Session` o `settings.engine`) ya no funciona: pasa por los hooks oficiales de Airflow. El comando `airflow db upgrade` sustituye a `airflow db init` para actualizar un esquema existente.",{"type":35,"title":87,"body":88},"Solución de problemas: mensajes de error habituales","**`PermissionError: [Errno 13] Permission denied: '\u002Fopt\u002Fairflow\u002Flogs\u002Fscheduler'`** — falta el archivo `.env` o `AIRFLOW_UID` no coincide con el UID del propietario de las carpetas montadas. Corrige con `sudo chown -R $(id -u):0 .\u002Fdags .\u002Flogs .\u002Fplugins .\u002Fconfig` y reinicia. **`The scheduler does not appear to be running`** (banner naranja en la interfaz) — comprueba que el contenedor `airflow-scheduler` está `healthy` (`docker compose ps`); si el banner persiste pero desaparece al recargar, es un falso positivo documentado en el tracker de Airflow, sin impacto funcional. **`error: invalid command 'webserver'`** — una dependencia Python instalada ha introducido un conflicto de importación al arrancar: reconstruye la imagen fijando las versiones.",{"type":90,"title":29,"body":91},"tip","No pongas nunca lógica pesada directamente en el archivo del DAG: el scheduler analiza todos los `.py` a intervalos regulares (`min_file_process_interval`, 30 s por defecto), y un import costoso a nivel de módulo ralentiza todo el orquestador. Mantén ligero el código de parsing y traslada el trabajo a las tareas. Con Airflow 3, prefiere el decorador `@task` (TaskFlow API) a los operadores clásicos: el código es más legible y los XComs se gestionan solos. Activa `catchup=False` en cada DAG en desarrollo para evitar cientos de ejecuciones retroactivas en el primer arranque. Purga con regularidad la carpeta `.\u002Flogs`.",{"type":35,"title":93,"body":94},"Supervisión y mantenimiento de la pila Airflow","Airflow 3 expone de forma nativa trazas **OpenTelemetry**: actívalas con `AIRFLOW__METRICS__OTEL_ON=True` y apunta a tu colector (Grafana Tempo, Jaeger). Para un panel rápido, Airflow también expone métricas Prometheus mediante el plugin `airflow-exporter`. Configura `docker compose` con una política de reinicio (`restart: unless-stopped`) para que la pila vuelva sola tras reiniciar el VPS. Mantén PostgreSQL actualizado por separado. Purga con regularidad los metadatos antiguos con `docker compose exec airflow-scheduler airflow db clean --clean-before-timestamp 2025-01-01` para evitar el crecimiento de la base.",{"type":96,"title":97,"headers":98,"rows":102},"comparison","LocalExecutor frente a CeleryExecutor: cuál elegir",[99,100,101],"Criterio","LocalExecutor","CeleryExecutor",[103,107,111,115,119,123],[104,105,106],"RAM recomendada","4 GB","8 GB (16 GB ideal)",[108,109,110],"Servicios Docker adicionales","Ninguno (+ PostgreSQL)","Redis + worker(s) Celery",[112,113,114],"Paralelismo de tareas","Limitado al VPS","Escalable horizontalmente",[116,117,118],"Adecuado para","Pipelines ligeros, equipos individuales","Cargas grandes, multi-worker",[120,121,122],"Complejidad operativa","Baja","Media",[124,125,126],"Comando para activarlo","`AIRFLOW__CORE__EXECUTOR=LocalExecutor`","Por defecto en el compose oficial","Despliega Airflow en un VPS ServOrbit","VPS con Docker preinstalado, snapshots y ancho de banda incluido: la base adecuada para una pila Airflow en producción.","Ver los VPS","\u002Fvps-cloud",[132,151,168],{"id":133,"slug":134,"slugs":135,"title":139,"excerpt":140,"readTime":141,"views":23,"isPinned":19,"publishedAt":142,"updatedAt":143,"category":144,"categories":145,"featuredImage":29,"bgImage":30,"posterImage":147,"relatedSolution":148},3,"instalar-n8n-en-vps-con-docker",{"fr":136,"en":137,"ar":138,"es":134},"installer-n8n-vps","install-n8n-on-vps-with-docker-complete-2026-guide","تثبيت-n8n-على-vps-مع-docker-دليل-شامل-2026","Instalar n8n en un VPS con Docker: guía completa 2026","Despliegue n8n en VPS con Docker, reverse proxy y HTTPS. Crash V8, 502 nginx, migración de npm a Docker y seguridad de ejecuciones persistidas (advisory agosto 2026).",12,"2026-06-05T00:00:00+00:00","2026-09-08T22:00:02+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[146],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-n8n-vps-poster.svg",{"categorySlug":149,"appSlug":150},"automatizacion","n8n",{"id":152,"slug":153,"slugs":154,"title":158,"excerpt":159,"readTime":160,"views":18,"isPinned":19,"publishedAt":161,"updatedAt":21,"category":162,"categories":163,"featuredImage":29,"bgImage":30,"posterImage":165,"relatedSolution":166},24,"instalar-node-red-en-un-vps",{"fr":155,"en":156,"ar":157,"es":153},"installer-node-red-vps","installing-node-red-on-a-vps-self-hosted-automation","تثبيت-node-red-على-خادم-vps-أتمتة-ذاتية-الاستضافة","Instalar Node-RED en un VPS: automatización self-hosted","Instale Node-RED en un VPS para automatizar sus flujos de trabajo flow-based, conectar sus API y dispositivos IoT, todo self-hosted y seguro.",4,"2026-05-27T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[164],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-node-red-vps-poster.svg",{"categorySlug":149,"appSlug":167},"node-red",{"id":169,"slug":170,"slugs":171,"title":175,"excerpt":176,"readTime":133,"views":18,"isPinned":19,"publishedAt":177,"updatedAt":21,"category":178,"categories":179,"featuredImage":29,"bgImage":30,"posterImage":181,"relatedSolution":182},25,"instalar-huginn-en-un-vps",{"fr":172,"en":173,"ar":174,"es":170},"installer-huginn-vps","installing-huginn-on-a-vps-self-hosted-automation","تثبيت-huginn-على-خادم-vps-أتمتة-ذاتية-الاستضافة","Instalar Huginn en un VPS: automatización self-hosted","Instale Huginn en un VPS para crear agentes que vigilan la web, extraen datos de páginas y disparan acciones, 100% self-hosted.","2026-05-26T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[180],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-huginn-vps-poster.svg",{"categorySlug":149,"appSlug":183},"huginn",1789665021999]