Tutoriales de VPS
Desplegar Langflow en un VPS (2026): tutorial completo de Docker Compose, PostgreSQL, inicio de sesión, API y HTTPS
Este tutorial sigue el método de despliegue oficial actual de Langflow y explica la configuración del VPS, Docker Compose, PostgreSQL, el inicio de sesión, HTTPS, la Flow API, las actualizaciones y las copias de seguridad.

Langflow es para quienes quieren arrastrar prompts, modelos, herramientas y pasos de procesamiento de datos para formar un flujo de trabajo ejecutable. No es un modelo de lenguaje local y no elimina por arte de magia los costes de los modelos; un VPS normal ejecuta el editor visual, la API y la base de datos, mientras que la inferencia real la realizan OpenAI, Anthropic, OpenRouter, LiteLLM u otro servidor Ollama.
Esta guía despliega la versión estable v1.11.1 publicada el 28 de julio de 2026. La arquitectura final es Langflow + PostgreSQL + Caddy, sin exponer directamente 7860 ni 5432 a Internet. El objetivo no es abrir una página de demostración de forma temporal, sino configurar juntos el inicio de sesión, HTTPS, la Flow API, las actualizaciones y las copias de seguridad.
Primero, las conclusiones sobre la configuración:
- Una persona creando flujos con llamadas API de baja frecuencia: 2 núcleos, 4 GB y un SSD de 40 GB sirven para empezar;
- Uso compartido entre 3 y 10 personas, o flujos con procesamiento de documentos más pesado: se recomiendan 4 núcleos, 8 GB y un SSD de 80 GB;
- Un VPS normal con CPU no es adecuado para ejecutar modelos grandes localmente; en particular, no reparta 4 GB de memoria entre Langflow, PostgreSQL y Ollama al mismo tiempo;
- Si solo quiere probarlo durante diez minutos, puede usar un único contenedor con SQLite; si va a usarlo a largo plazo, pase directamente a PostgreSQL.
Estas tres herramientas se solapan, pero su enfoque es distinto:
| Herramienta | Más adecuada para | Características del despliegue |
|---|---|---|
| Langflow | Montar rápidamente Agentes, cadenas de modelos y API invocables con nodos | Ecosistema Python, muchos componentes, depuración de Flows intuitiva |
| Dify | Crear aplicaciones de IA con base de conocimiento, panel de administración e interfaz para el usuario final | Más servicios, un despliegue completo consume más recursos |
| Flowise | Quienes conocen LangChain y quieren crear flujos de chat rápidamente | Ecosistema Node.js, inicio directo |
Si su prioridad son las aplicaciones RAG y la gestión operativa, consulte el tutorial de despliegue de la base de conocimiento privada de Dify. Los lectores que prefieran Node.js y LangChain pueden comparar el tutorial de flujos de trabajo visuales de IA con Flowise. Este artículo solo cubre el despliegue de producción de Langflow en una sola máquina.
Langflow en sí no es la parte que más recursos consume. La memoria sube notablemente cuando los flujos cargan componentes, analizan archivos y esperan varias respuestas de modelos; PostgreSQL, la caché del sistema y Docker también necesitan espacio.
| Uso | Configuración recomendada | Notas |
|---|---|---|
| Aprendizaje personal, pocos Flows | 2 núcleos, 4 GB | Ejecutar pocos flujos a la vez, sin inferencia local |
| Equipo pequeño, más procesamiento de documentos | 4 núcleos, 8 GB | Dejar margen para la base de datos y las tareas concurrentes |
| Varios Workers, API de alta concurrencia | 8 GB o más, añadir Redis | Fuera del alcance ligero de una sola máquina de este artículo |
| Inferencia de modelos local | Una máquina GPU independiente | Langflow solo se conecta a las API de modelos |
Si aún no ha decidido el tamaño, consulte Cómo elegir la configuración de un VPS. 2 núcleos y 4 GB es un punto de partida, no una promesa de concurrencia.
En esta arquitectura, solo Caddy está expuesto a Internet:
浏览器 / API 客户端
│ HTTPS 443
▼
Caddy
│ 127.0.0.1:7860
▼
Langflow ──────► OpenAI / Anthropic / OpenRouter / LiteLLM
│
│ Docker 内部网络
▼
PostgreSQL:5432
PostgreSQL no tiene mapeo de puertos en el host. Langflow solo se enlaza a 127.0.0.1:7860, así que incluso si UFW está mal configurado, el editor no quedará expuesto directamente en la IP pública.
Este artículo usa Ubuntu 24.04. Primero apunte los registros A/AAAA de langflow.example.com al VPS. Sustituya el dominio de ejemplo por el suyo; no lo copie tal cual.
Instale las herramientas básicas:
sudo apt update
sudo apt install -y ca-certificates curl openssl ufw
Instale Docker desde el repositorio oficial:
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" |
sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo docker version
sudo docker compose version
El cortafuegos solo permite SSH, HTTP y HTTPS:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status
Cuando trabaje de forma remota, permita siempre OpenSSH antes de activar UFW. No abra 7860 ni 5432.
sudo mkdir -p /opt/langflow
sudo chown "$USER":"$USER" /opt/langflow
cd /opt/langflow
Primero genere tres valores aleatorios: la contraseña de la base de datos, la contraseña del administrador y la clave de cifrado. Los comandos siguientes solo escriben en variables del terminal actual y no se guardan automáticamente en un archivo de historial:
langflow_db_password="$(openssl rand -hex 24)"
langflow_admin_password="$(openssl rand -hex 24)"
langflow_secret_key="$(python3 -c 'from secrets import token_urlsafe; print(token_urlsafe(32))')"
Cree .env:
umask 077
cat >.env <<EOF
POSTGRES_USER=langflow
POSTGRES_PASSWORD=${langflow_db_password}
POSTGRES_DB=langflow
LANGFLOW_SUPERUSER=admin
LANGFLOW_SUPERUSER_PASSWORD=${langflow_admin_password}
LANGFLOW_SECRET_KEY=${langflow_secret_key}
EOF
chmod 600 .env
Guarde la contraseña del administrador en su gestor de contraseñas y luego borre las variables del terminal:
unset langflow_db_password langflow_admin_password langflow_secret_key
LANGFLOW_SECRET_KEY se usa para cifrar las Credential de la base de datos. Si se pierde, aunque la base de datos siga existiendo, es posible que las claves de modelo ya guardadas no se puedan descifrar, así que .env debe respaldarse junto con la base de datos.
Cree /opt/langflow/docker-compose.yml:
services:
postgres:
image: postgres:16-trixie
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- langflow-postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 10
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
langflow:
image: langflowai/langflow:v1.11.1
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
ports:
- "127.0.0.1:7860:7860"
environment:
LANGFLOW_DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}
LANGFLOW_CONFIG_DIR: /app/langflow
LANGFLOW_AUTO_LOGIN: "False"
LANGFLOW_SUPERUSER: ${LANGFLOW_SUPERUSER}
LANGFLOW_SUPERUSER_PASSWORD: ${LANGFLOW_SUPERUSER_PASSWORD}
LANGFLOW_SECRET_KEY: ${LANGFLOW_SECRET_KEY}
LANGFLOW_OPEN_BROWSER: "False"
LANGFLOW_LOG_LEVEL: INFO
DO_NOT_TRACK: "True"
volumes:
- langflow-data:/app/langflow
healthcheck:
test:
- CMD-SHELL
- >-
python -c "import urllib.request;
urllib.request.urlopen('http://127.0.0.1:7860/health_check', timeout=5)"
interval: 30s
timeout: 10s
retries: 10
start_period: 90s
logging:
driver: json-file
options:
max-size: "20m"
max-file: "3"
volumes:
langflow-postgres:
langflow-data:
Aquí se usa la imagen oficial v1.11.1 y postgres:16-trixie. El ejemplo oficial indica que fijar la versión base Debian de PostgreSQL evita advertencias de collation de glibc cuando el sistema subyacente cambia en silencio.
Primero renderice la configuración de Compose:
chmod 600 .env docker-compose.yml
sudo docker compose config --quiet
sudo docker compose config --images
No pegue la salida completa de docker compose config en foros o tickets; expande las contraseñas de la base de datos y del administrador.
Para entender por qué se configuran así los healthchecks, la rotación de logs y las políticas de reinicio, continúe con la lista de verificación de configuración de Docker Compose para producción.
cd /opt/langflow
sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps
El primer arranque debe crear las tablas de la base de datos y cargar los componentes, así que tarda más que un sitio estático normal. Siga viendo los logs:
sudo docker compose logs -f --tail=200 langflow postgres
Cuando el servicio parezca correcto, pulse Ctrl+C para salir de los logs y luego compruebe el endpoint de salud:
curl -fsS http://127.0.0.1:7860/health_check
sudo docker compose ps
sudo ss -lntp | grep -E ':7860|:5432'
El endpoint de salud debe devolver el estado de la base de datos y del servicio de chat. En la lista de escucha, 7860 solo debe ser 127.0.0.1:7860; 5432 no debe aparecer entre los puertos de escucha del host.
Instale Caddy:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf https://dl.cloudsmith.io/public/caddy/stable/gpg.key |
sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt |
sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy
Edite /etc/caddy/Caddyfile:
langflow.example.com {
encode zstd gzip
reverse_proxy 127.0.0.1:7860 {
transport http {
read_timeout 10m
}
}
}
Los flujos más largos pueden esperar a que se ejecuten modelos o herramientas, así que aquí el tiempo de espera de lectura del proxy inverso se eleva a 10 minutos. Tras guardar, valide y recargue:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
curl -I https://langflow.example.com
Si falla la emisión del certificado, primero confirme que el DNS apunta al VPS actual y que 80/443 no están ocupados por otro programa. Los pasos completos de solución de problemas están en el tutorial de proxy inverso Caddy y HTTPS automático.
Abra https://langflow.example.com e inicie sesión con el LANGFLOW_SUPERUSER de .env y la contraseña del administrador. No vuelva a poner el inicio de sesión automático en True; un editor público sin protección de inicio de sesión será encontrado rápidamente por los escáneres.
Una vez dentro, complete primero cuatro cosas:
- Cree un proyecto nuevo para que los Flows posteriores no se acumulen todos en el directorio predeterminado;
- Cree un Flow de chat mínimo, empezando por la plantilla Basic Prompting;
- Cree una nueva Credential en el componente de modelo e introduzca una Key de OpenAI, Anthropic u OpenRouter;
- Envíe un mensaje de prueba en el Playground para confirmar que los nodos de entrada, modelo y salida funcionan.
Las Keys de modelo se guardan en las variables globales o Credentials de Langflow y se cifran con LANGFLOW_SECRET_KEY. No escriba Keys reales directamente en el JSON del Flow exportado ni codifique Keys directamente en el Compose de un tutorial.
Si su equipo ya tiene una puerta de enlace de modelos unificada, puede conectar LiteLLM. Así centraliza Keys virtuales, presupuestos y enrutamiento de modelos; consulte el tutorial de puerta de enlace API LLM unificada con LiteLLM para el despliegue.
Cuando el Flow funcione en el Playground, abra el panel API del Flow y copie el Flow ID. Luego vaya a la página API Keys de la configuración personal y cree una Langflow API Key.
Configure las variables en la máquina que realiza la llamada:
export LANGFLOW_SERVER_URL="https://langflow.example.com"
export LANGFLOW_API_KEY="粘贴刚创建的 Langflow API Key"
export LANGFLOW_FLOW_ID="粘贴 Flow ID"
Llame a la v1 Flow API:
curl --request POST \
--url "${LANGFLOW_SERVER_URL}/api/v1/run/${LANGFLOW_FLOW_ID}?stream=false" \
--header "Content-Type: application/json" \
--header "x-api-key: ${LANGFLOW_API_KEY}" \
--data '{
"input_value": "用三句话解释什么是 VPS",
"output_type": "chat",
"input_type": "chat"
}'
Si el Flow real necesita tweaks, use el código generado automáticamente por el panel API. Los ID de nodo varían entre componentes, así que no los copie a ciegas del ejemplo de otra persona.
Una Langflow API Key solo debe colocarse en el lado del servidor, en CI Secrets o en una plataforma de automatización segura. Si se escribe en JavaScript del navegador, cualquier visitante puede tomarla desde las herramientas de desarrollador.
No use latest en producción. Antes de actualizar, lea las Release Notes de la nueva versión, confirme los cambios de migración de la base de datos y de variables de entorno, y luego haga la copia de seguridad completa de la siguiente sección.
Compruebe la imagen actual:
cd /opt/langflow
sudo docker compose images
Cambie v1.11.1 en docker-compose.yml por la nueva versión estable que haya confirmado y luego:
sudo docker compose pull langflow
sudo docker compose up -d langflow
sudo docker compose logs --tail=300 langflow postgres
curl -fsS http://127.0.0.1:7860/health_check
Si la actualización implica una migración de la base de datos, simplemente volver a poner la etiqueta de imagen en v1.11.1 puede no revertirla. Lo seguro es restaurar juntos el dump de PostgreSQL previo a la actualización, el directorio de configuración y la versión de imagen antigua.
Una copia de seguridad completa incluye al menos:
- La base de datos PostgreSQL;
- El Volume
langflow-data; .envydocker-compose.yml;- El Caddyfile;
- La versión actual de la imagen de Langflow.
Cree un directorio de copias de seguridad y exporte PostgreSQL:
cd /opt/langflow
backup_dir="backups/$(date +%F-%H%M%S)"
mkdir -p "$backup_dir"
sudo docker compose exec -T postgres sh -c \
'pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" -Fc' \
>"$backup_dir/langflow-postgres.dump"
cp .env docker-compose.yml "$backup_dir/"
sudo cp /etc/caddy/Caddyfile "$backup_dir/Caddyfile"
sudo chown -R "$USER":"$USER" "$backup_dir"
chmod 600 "$backup_dir/.env"
sudo docker compose images >"$backup_dir/docker-images.txt"
Detenga brevemente las escrituras de Langflow y luego empaquete el Volume de configuración:
sudo docker compose stop langflow
langflow_data_volume="$(sudo docker volume ls --format '{{.Name}}' | grep '_langflow-data$' | head -1)"
test -n "$langflow_data_volume"
sudo docker run --rm \
-v "${langflow_data_volume}:/source:ro" \
-v "$PWD/$backup_dir:/backup" \
alpine tar -czf /backup/langflow-data.tar.gz -C /source .
sudo docker compose up -d langflow
Sincronice la copia de seguridad con otra máquina o con almacenamiento de objetos. Una copia en el mismo disco del VPS solo protege contra borrados accidentales, no contra la avería de toda la máquina. Para un plan externo más completo, consulte Simulacro de copia de seguridad y restauración de VPS.
Ensayé la restauración primero en un VPS de prueba. Prepare la misma versión de .env y Compose, inicie PostgreSQL y luego restaure:
cat langflow-postgres.dump |
sudo docker compose exec -T postgres sh -c \
'pg_restore -U "$POSTGRES_USER" -d "$POSTGRES_DB" --clean --if-exists'
Después restaure langflow-data y, por último, inicie Langflow. La clave y la base de datos deben ir juntas; no se puede restaurar solo una de ellas.
sudo docker compose ps
curl -v http://127.0.0.1:7860/health_check
sudo systemctl status caddy --no-pager
sudo journalctl -u caddy -n 100 --no-pager
Si el puerto 7860 funciona localmente pero el dominio no abre, el problema suele estar en DNS, Caddy o el cortafuegos. Si tampoco funciona localmente, revise los logs de Langflow.
sudo docker compose ps postgres
sudo docker compose logs --tail=200 postgres langflow
sudo docker compose exec postgres sh -c \
'pg_isready -U "$POSTGRES_USER" -d "$POSTGRES_DB"'
Compruebe especialmente si la contraseña de la base de datos contiene caracteres especiales de URI añadidos manualmente, si el nombre del servicio tras renderizar Compose es postgres y si un Volume antiguo conservó otra contraseña. Este artículo usa contraseñas aleatorias hexadecimales, lo que evita problemas de escape en la cadena de conexión.
Confirme que las cuatro variables existen en .env, pero no muestre sus valores:
for variable_name in \
LANGFLOW_AUTO_LOGIN LANGFLOW_SUPERUSER LANGFLOW_SUPERUSER_PASSWORD LANGFLOW_SECRET_KEY; do
sudo docker compose exec -T langflow sh -c \
'test -n "$(printenv "$1")"' sh "$variable_name" &&
echo "$variable_name 已设置"
done
En este artículo LANGFLOW_AUTO_LOGIN está escrito en Compose, no en .env. Por eso el primer elemento debe confirmarse desde la configuración renderizada:
sudo docker compose config | grep 'LANGFLOW_AUTO_LOGIN: "False"'
La cuenta de administrador solo se crea durante la inicialización. Cuando ya existe una base de datos antigua, cambiar .env no restablece automáticamente la contraseña de un usuario existente; no borre contenedores repetidamente a la espera de suerte y, sobre todo, no borre el Volume de la base de datos.
Compruebe si la cabecera de la petición es x-api-key y si el valor es la Langflow API Key en lugar de una OpenAI Key. Confirme también que la API Key no tiene espacios copiados de más:
test -n "$LANGFLOW_API_KEY" && echo "LANGFLOW_API_KEY 已设置"
curl -i "${LANGFLOW_SERVER_URL}/api/v1/version" \
-H "x-api-key: ${LANGFLOW_API_KEY}"
sudo docker compose logs -f --tail=200 langflow
free -h
sudo docker stats --no-stream
Si los logs muestran un tiempo de espera agotado de la API del modelo, revise primero el proveedor del modelo y la red de salida; si el contenedor fue OOM Killed, amplíe la memoria o reduzca los flujos que se ejecutan a la vez. No suba el tiempo de espera de Caddy a una hora de inmediato; eso solo oculta el error real durante más tiempo.
- Langflow está fijado en v1.11.1 y no usa
latest; -
LANGFLOW_AUTO_LOGIN=False, y la contraseña del administrador es suficientemente larga; -
LANGFLOW_SECRET_KEYse respalda junto con PostgreSQL; - 7860 solo se enlaza a
127.0.0.1, y 5432 no tiene puerto en el host; - El certificado de
https://langflow.example.comes válido; - El Playground puede completar una llamada real al modelo;
- Una petición a la Flow API con
x-api-keytiene éxito; - La base de datos, el Volume de configuración,
.envy el Caddyfile tienen copias de seguridad externas; - Se registra la versión de la imagen antes de actualizar y se ha hecho una restauración de prueba.
Langflow encaja mejor "delante de la API del modelo": un VPS normal ejecuta el editor, los flujos y la base de datos, mientras que la GPU o los modelos comerciales están en el otro extremo. 2 núcleos y 4 GB bastan para que una persona empiece, pero los equipos pequeños no deberían escatimar en esos 4 GB de memoria. Lo que realmente determina si puede usarlo a largo plazo no es lo bonitos que queden los nodos, sino si el inicio de sesión, las claves, la base de datos y el proceso de recuperación están bien hechos.