¿Por qué alojar Dify en un VPS?
Usar la versión cloud de Dify implica confiar sus prompts, sus datos de negocio y sus claves API a un servidor de terceros, con limitaciones en el número de aplicaciones y en los modelos accesibles. Al autoalojar Dify en un VPS, usted elimina esas restricciones: ninguna suscripción mensual ligada al uso, ningún dato sensible transmitido al exterior y la libertad de conectar cualquier proveedor de modelos (OpenAI, Anthropic, Ollama en local, etc.). Es la solución ideal para los equipos que quieren construir pipelines de IA robustos en un entorno bajo su control total.
Lo que puede hacer con Dify
- Crear chatbots y agentes de IA personalizados conectados a sus propias fuentes de datos (RAG)
- Orquestar workflows de varios pasos que combinan varios modelos de lenguaje y herramientas externas
- Conectar Dify a OpenAI, Anthropic Claude, Mistral o un modelo local mediante Ollama
- Exponer sus aplicaciones de IA mediante una API REST o un widget integrable en su sitio
- Gestionar los accesos de su equipo con un sistema de roles y espacios de trabajo
- Seguir los logs de uso, los costos por modelo y el rendimiento de sus pipelines
Requisitos previos: dimensiona bien tu VPS
Dify ejecuta en paralelo una flota de servicios Docker: un servidor API, un worker Celery para embeddings y tareas asíncronas, el frontend web, PostgreSQL (servicio db_postgres), Redis, Weaviate como base vectorial por defecto (VECTOR_STORE=weaviate), un sandbox de ejecución de código, el plugin_daemon, proxies SSRF (Squid) y nginx. Desde la 1.16.0 se suman agent_backend y local_sandbox, que sostienen las aplicaciones Agent.
Mínimo oficial: 2 núcleos de CPU y 4 GiB de RAM, con Docker Compose 2.24.0 o superior (documentación de Dify). Prevé 2 vCPU · 4 GB · 40 GB de SSD para probar las funciones básicas.
Uso real recomendado: 4 vCPU · 8 GB de RAM · 80 GB de almacenamiento. En cuanto indexas documentos voluminosos, varios usuarios consultan a la vez o activas las aplicaciones Agent, los embeddings, la base vectorial y los servicios del agente saturan 4 GB. El plan VPS Power de ServOrbit (4 vCPU, 8 GB) encaja con un uso de equipo sin modelo local.
Con un modelo local (Ollama): suma las necesidades del modelo. Un Llama 3 8B cuantizado (Q4) necesita ~6 GB de VRAM o de RAM dedicada; cuenta con 16 GB de RAM como mínimo para que Dify y Ollama convivan sin swap.
Sistema recomendado: Ubuntu 22.04 LTS.
Instala Dify en tu VPS de ServOrbit
Contrata un VPS Cloud de ServOrbit
Ve a la página /vps-cloud y elige un plan adecuado a tu uso (mínimo 2 vCPU / 4 GB de RAM, recomendado 4 vCPU / 8 GB). Selecciona Ubuntu 22.04 LTS como sistema operativo y finaliza el pedido. Tu VPS se aprovisiona en menos de un minuto.
Clona una versión publicada y copia la configuración
Conéctate por SSH y ejecuta
git clone --branch 1.18.0 https://github.com/langgenius/dify.git,cd dify/dockerycp .env.example .env. Fija una etiqueta de release en lugar de la ramamain, que cambia con cada fusión: la documentación oficial pide clonar la última release.El archivo
.envconcentra la configuración. Antes del primer arranque, sustituye los valores de desarrollo que incluye:DB_PASSWORD(por defectodifyai123456),REDIS_PASSWORD,SANDBOX_API_KEY,PLUGIN_DAEMON_KEY,DIFY_AGENT_API_TOKENyDIFY_AGENT_SERVER_SECRET_KEY. DejaSECRET_KEYvacía para que se genere una clave persistente: cambiarla después desconecta a todos los usuarios y deja ilegibles las credenciales OAuth de los plugins. Por último, genera el token del sandbox del agente conopenssl rand -base64 32y colócalo enDIFY_AGENT_LOCAL_SANDBOX_AUTH_TOKEN: sin él, el Agent backend y su sandbox no arrancan.Arranca la pila Docker Compose
Desde
dify/docker, ejecutadocker compose up -d. Docker descarga las imágenes y arranca los contenedores:api,worker,worker_beat,web,db_postgres,redis,weaviate,sandbox,plugin_daemon,ssrf_proxy,agent_backend,local_sandboxynginx. Comprueba condocker compose psque los servicios esténUpohealthy;init_permissionsaparece comoExited, lo cual es normal. La operación suele durar de 3 a 5 minutos según tu ancho de banda.Crea la cuenta de administrador
Abre
http://[IP-de-tu-VPS]/installen el navegador.Atención: hazlo de inmediato. Mientras no exista la cuenta de administrador, la página
/installestá abierta a cualquiera, y quien llegue primero se convierte en propietario de tu instancia. Si definesINIT_PASSWORDen el.env(30 caracteres como máximo), la página lo pide antes de crear la cuenta.Introduce tu correo electrónico y una contraseña robusta. Esta cuenta es la propietaria del espacio de trabajo por defecto.
Apunta un dominio y activa HTTPS
En producción, asocia un nombre de dominio a la IP del VPS y despliega un certificado TLS. El nginx interno de Dify escucha por defecto en el puerto 80 del host (
EXPOSE_NGINX_PORT=80): si instalas un nginx en el host, ambos chocan. DefineEXPOSE_NGINX_PORT=8080en el.env, instala nginx y Certbot en el host (sudo apt install nginx certbot python3-certbot-nginx -y), crea un vhost que haga proxy a127.0.0.1:8080y ejecutasudo certbot --nginx -d tu-dominio.com.Después asigna
CONSOLE_API_URL,APP_WEB_URL,SERVICE_API_URLyFILES_URLahttps://tu-dominio.com(vacías por defecto):CONSOLE_API_URLsirve a los accesos OAuth y a los plugins,APP_WEB_URLa los enlaces del nodo Human Input, y siFILES_URLyCONSOLE_API_URLsiguen vacías, la vista previa de archivos no funciona. Reinicia condocker compose up -d.
Configuración post-instalación: modelos, API y espacio de trabajo
Una vez conectado, el primer paso es registrar un proveedor de modelos. En ajustes (icono superior derecho) → Proveedores de modelos, añada su clave API de OpenAI, Anthropic, Mistral o cualquier otro proveedor compatible. Para un modelo local, indique la URL de su instancia Ollama (http://[host-IP]:11434).
Dify también expone su propia API REST para integrar sus aplicaciones en pipelines externos. Las claves de API se encuentran en Ajustes → Claves de API. Estas claves permiten consultar sus apps de Dify desde n8n, Zapier o cualquier script Python sin pasar por la interfaz gráfica.
El espacio de trabajo por defecto es el creado en el primer acceso. Invite miembros en Ajustes → Miembros y asígneles los roles Admin, Normal u Operador de dataset.
Plugins offline: sortear el error 500/404 en instancias autoalojadas
Desde noviembre de 2025 (issue de GitHub #27720, abierta con Dify 1.9.2), usuarios autoalojados ven fallar la instalación de plugins desde el marketplace: HTTP 500 para langgenius/perplexity, HTTP 404 para langgenius/anthropic y después Reached maximum retries (3) para langgenius/azure_openai. Los mismos plugins se instalan en Dify Cloud. La issue se cerró como «not planned» el 18 de diciembre de 2025 con la etiqueta cant-reproduce, sin corrección: las soluciones de abajo proceden de un bot del hilo y los mantenedores no las confirmaron.
Solución 1: archivo .difypkg local. Descarga el .difypkg del plugin en una máquina conectada e instálalo con «Instalar desde archivo local». Para un servidor sin acceso saliente, la herramienta dify-plugin-repackaging incluye las dependencias en el paquete. Si el archivo se rechaza por tamaño, sube PLUGIN_MAX_PACKAGE_SIZE (52428800 bytes por defecto) y NGINX_CLIENT_MAX_BODY_SIZE (100M por defecto).
Solución 2: desactivar la verificación de firma. Para instalar plugins sin firmar o desarrollar los tuyos, define FORCE_VERIFYING_SIGNATURE=false (valor por defecto: true) en el .env y ejecuta docker compose restart plugin_daemon.
Atención: desactivar la firma elimina una protección. Reserva este ajuste para desarrollo o plugins cuyo origen controlas; en producción con usuarios externos, prefiere un .difypkg verificado.
Límites conocidos de la instalación Docker: el nodo Agent
Nodo Agent de Chatflow y Workflow en la 1.15.0. En la instalación Docker estándar de la 1.15.0, el nodo «Agent» falla antes de cualquier llamada al modelo con ValueError: base_url is required when creating a real Agent backend client. Exige un servicio «Agent backend» indicado por AGENT_BACKEND_BASE_URL, que el docker-compose.yaml oficial de esa versión no incluía. Las issues #38283 (cerrada como «not planned» el 17 de agosto de 2026) y #39161 (cerrada como duplicada el 23 de octubre de 2026) de langgenius/dify no produjeron corrección alguna; una mejora del mensaje de error sigue en revisión (PR #39878). Circulan dos soluciones y ninguna conviene: AGENT_BACKEND_USE_FAKE=true conecta un cliente falso que devuelve una respuesta fija sin llamar nunca al LLM ni a las herramientas MCP, y desplegar a mano un servicio dify-agent ni está documentado ni es compatible.
Desde la 1.16. El compose oficial incluye ahora agent_backend y local_sandbox, con AGENT_BACKEND_BASE_URL=http://agent_backend:5050 en .env.example, y debes definir DIFY_AGENT_API_TOKEN (que desde la 1.16.1 ha de ser igual a AGENT_BACKEND_API_TOKEN) y DIFY_AGENT_LOCAL_SANDBOX_AUTH_TOKEN. Pero Agent V2 se ocultó en Chatflow ya en la 1.16.1, por falta de contexto multiturno; la petición de restaurarlo (#41269, abierta el 26 de agosto de 2026) no tiene versión objetivo. En Chatflow solo está disponible el nodo Agent heredado. El tipo de aplicación Agent independiente es la alternativa que, según quien abrió #39161, funcionó en la 1.15.0.
Límites conocidos: editar un Chatflow con herramienta MCP en la 1.18.0
La issue #44742 (abierta el 25 de octubre de 2026) informa de que, tras quitar y volver a añadir una herramienta MCP en un nodo Agent de la 1.18.0, el Chatflow deja de ejecutarse: TypeError: object of type 'NoneType' has no len(), lanzado en build_parameters. El YAML exportado muestra allowed_tools, context y files guardados como type: variable con value: null. Otra herramienta MCP intacta en el mismo flujo sigue funcionando. Volver a la 1.17.x no repara un flujo ya dañado, y importar la exportación rota en otra instancia también falla.
Soluciones comunicadas. Editar el YAML para pasar esos tres campos a type: constant con value: [] e importarlo tal cual (reempaquetarlo como .difypkg falla en el control de integridad), o recrear el flujo.
Estado del hilo. La issue se cerró el 26 de octubre de 2026 con la PR #44748, fusionada en main: ya no escribe en el grafo guardado los campos opcionales vaciados. Resuelve #44579 (AgentVariableNotFoundError), pero precisa que los parámetros manuales anidados y la secuencia completa de quitar y volver a añadir una herramienta MCP quedan fuera de su alcance. Ninguna release posterior a la 1.18.0 figuraba en la página de releases el 28 de octubre de 2026. Mientras tanto, exporta el YAML antes de cada edición de un Chatflow con herramienta MCP.
Integración con Ollama y n8n
Dify se vuelve especialmente potente combinado con otras herramientas self-hosted.
Ollama le permite ejecutar un LLM directamente en su VPS o en un servidor de la misma red, sin depender de una API externa. Tras desplegar Ollama, regístrelo en Dify como proveedor de modelos con la URL http://[Ollama-IP]:11434. Toda la generación permanece entonces en su infraestructura — sin filtración de prompts al exterior.
n8n es un orquestador de workflows que puede pilotar Dify mediante su API REST. Cree un nodo HTTP Request en n8n apuntando a https://your-domain.com/v1/chat-messages con su clave de API de Dify en la cabecera Authorization. Puede así activar una conversación Dify desde un formulario web, un correo entrante o un webhook de Slack, y enviar la respuesta de IA a cualquier destino.
Copia del volumen y de la base de datos antes de actualizar
Actualizar Dify afecta al esquema de PostgreSQL (las migraciones se ejecutan al arrancar la API mientras MIGRATION_ENABLED=true), a los datos vectoriales y a las imágenes de la pila del agente. Las notas de la 1.18.0 empiezan por «Back up first»: base de datos, datos del almacén vectorial, archivos subidos, almacenamiento de Agent, secretos y archivos de entorno.
En Docker Compose, casi todo vive en docker/volumes/ (db/data para PostgreSQL, weaviate, redis/data), como montajes de carpeta y no como volúmenes con nombre. Para una copia coherente: docker compose stop, luego tar czf ../dify-backup.tar.gz volumes .env docker-compose.yaml y copia el archivo fuera del VPS. Sin parada completa, sigue siendo posible una exportación lógica: docker compose exec -T db_postgres pg_dump -U postgres dify > dify-dump.sql.
Conserva también, fuera del repositorio, SECRET_KEY y PASSWORD_PEPPER si lo defines: perder la primera deja ilegibles las credenciales cifradas, y modificar el segundo invalida los hashes de contraseña existentes (notas de la 1.18.0). Por último, prevé los pasos: si tu pila aún incluye Weaviate 1.27, las notas de la 1.17.1 exigen una subida por etapas hasta la 1.39, sin saltarse versiones menores.
Actualizar con seguridad: ensayar primero en una copia
Congela el estado actual
Anota la versión en uso (
docker compose images), detén la pila condocker compose stopy haz la copia descrita arriba. Comprueba que el archivo se abre (tar tzf) antes de seguir: una copia que nunca se ha releído no es una copia.Duplica la instancia
Desde la carpeta superior, ejecuta
cp -a dify dify-test. Endify-test/docker/.env, cambiaEXPOSE_NGINX_PORTyEXPOSE_NGINX_SSL_PORT(por ejemplo 8081 y 8444) para no chocar con producción, y deja disco y RAM para una segunda pila. El nombre del proyecto Compose sigue el nombre de la carpeta, lo que separa ambas pilas.Lleva la copia a la versión objetivo
En
dify-test, ejecutagit fetch --tagsy luegogit checkout <etiqueta>. Compara cada.env.examplecon tu.envpara detectar variables nuevas o renombradas, y si modificastedocker-compose.yaml, reaplica tus cambios sobre el archivo de la nueva release en lugar de conservar el antiguo. Ejecutadocker compose pullydocker compose up -d, y siguedocker compose logs -f apihasta que terminen las migraciones. De la 1.17.1 a la 1.18.0, las notas cuentan 22: API, workers, Agent Backend e imágenes de runtime suben juntos.Repite tus flujos sensibles
En la copia, abre cada Chatflow que use un nodo Agent o una herramienta MCP, ejecútalo, edítalo y guárdalo una vez: la edición fue lo que rompió flujos en la 1.18.0. Prueba también una consulta a una base de conocimiento, la llamada a un plugin y una exportación YAML. Después destruye la copia:
docker compose downy borra la carpetadify-test.Cambia producción, o vuelve atrás
Repite los mismos pasos en producción durante una ventana de mantenimiento. Para volver atrás, no basta con cambiar la etiqueta: las migraciones modificaron la base. Ejecuta
docker compose down, restaura el archivo de volúmenes y vuelve a la etiqueta anterior.
Solución de errores: los más frecuentes
Contenedor worker que se reinicia en bucle. El worker Celery depende de Redis y PostgreSQL. Comprueba su estado con docker compose ps db_postgres redis y lee docker compose logs worker --tail=50. Si Redis no estaba listo al arrancar, basta un docker compose restart worker.
plugin_daemon en bucle con la conexión a PostgreSQL. El informe dify-plugin-daemon #729 (Dify 1.14.0) muestra failed to connect to host=db_postgres … lookup db_postgres on 127.0.0.11:53: no such host y después panic: failed to init dify plugin db. El nombre de host debe corresponder a un servicio en marcha: comprueba que db_postgres esté healthy, que DB_HOST del .env lleve ese nombre y que COMPOSE_PROFILES contenga postgresql; luego ejecuta docker compose down y docker compose up -d. Esa issue se cerró sin causa confirmada.
Un servicio no arranca por vm.max_map_count. Este ajuste del kernel afecta a Elasticsearch (perfil elasticsearch), no a Weaviate. Si lo elegiste, la documentación de Elastic pide 1048576 cuando el valor por defecto es menor: sudo sysctl -w vm.max_map_count=1048576, y la misma línea en /etc/sysctl.conf más sudo sysctl --system para hacerlo permanente.
Plugins del marketplace: error 500/404. Consulta la sección «Plugins offline». Si hay un bloqueo de red, prueba la salida 443 desde un contenedor: docker compose exec api curl -I https://marketplace.dify.ai.
WebSocket desconectado tras un proxy inverso. Si el streaming de las respuestas se interrumpe, tu nginx externo no reenvía las cabeceras de upgrade. Añade en location /: proxy_set_header Upgrade $http_upgrade; y proxy_set_header Connection "upgrade";.
Solución de errores: agentes, herramientas MCP y actualizaciones
base_url is required when creating a real Agent backend client. Consulta «Límites conocidos de la instalación Docker: el nodo Agent». En una versión reciente, comprueba que agent_backend esté en marcha y que AGENT_BACKEND_BASE_URL apunte a http://agent_backend:5050.
agent_backend o local_sandbox no arrancan. El valor DIFY_AGENT_LOCAL_SANDBOX_AUTH_TOKEN está vacío: la documentación indica que el Agent backend y su sandbox no arrancan sin él. Genéralo con openssl rand -base64 32, ponlo en docker/.env y reinicia.
TypeError: object of type 'NoneType' has no len(). Chatflow dañado tras editar una herramienta MCP en la 1.18.0 (#44742): consulta la sección dedicada y corrige el YAML antes de importar.
AgentVariableNotFoundError: Variable '' does not exist. Un campo opcional vaciado en el nodo Agent deja un selector vacío en el grafo guardado (#44579, visto en la 1.17.1). Vuelve a poner un valor en el campo o espera una release que incluya la PR #44748.
IP real perdida tras Cloudflare o un balanceador. Desde la 1.18.0, el nginx incluido sustituye X-Forwarded-For: configura la gestión de IP real de confianza.
No puedes iniciar sesión tras una actualización. Un PASSWORD_PEPPER añadido, cambiado o retirado invalida las contraseñas existentes: restaura el valor original.
Haz una instantánea de ServOrbit a demanda desde el área de cliente antes de cada actualización: cubre la carpeta docker/volumes/ (PostgreSQL, Weaviate, Redis) y tus archivos .env. Detén antes la pila con docker compose stop para que la base se copie en un estado coherente. Si una actualización sale mal, el rollback se hace en pocos minutos desde el área de cliente. La instantánea complementa la copia de prueba, no la sustituye.
La documentación oficial
Para la configuración avanzada, la lista completa de variables de entorno y las notas de versión, consulte la documentación oficial de Dify. El docker-compose.yaml del repositorio oficial sigue siendo la fuente de verdad para las versiones de imágenes y las dependencias entre servicios.