Langflow 适合想把 Prompt、模型、工具和数据处理步骤拖成一条可执行工作流的人。它不是本地大模型,也不会凭空省掉模型费用;普通 VPS 负责运行可视化编辑器、API 和数据库,真正的推理由 OpenAI、Anthropic、OpenRouter、LiteLLM 或另一台 Ollama 服务器完成。
这篇按 2026 年 7 月 28 日发布的稳定版 v1.11.1 部署。最终结构是 Langflow + PostgreSQL + Caddy,7860 和 5432 都不直接暴露公网。目标不是临时打开一个演示页面,而是把登录、HTTPS、Flow API、升级和备份一起配好。
先说配置结论:
- 单人做流程和低频 API 调用:2 核 4GB、40GB SSD 可以起步;
- 3–10 人共用,或者流程里有较重的文档处理:建议 4 核 8GB、80GB SSD;
- 普通 CPU VPS 不适合在本机跑大模型,尤其不要把 4GB 内存同时分给 Langflow、PostgreSQL 和 Ollama;
- 只想试用十分钟,可以用单容器和 SQLite;准备长期使用,直接上 PostgreSQL。
这三个工具有重叠,但使用重点不一样:
| 工具 | 更适合 | 部署特点 |
|---|---|---|
| Langflow | 用节点快速拼 Agent、模型链和可调用 API | Python 生态,组件多,Flow 调试直观 |
| Dify | 做带知识库、运营后台和终端用户界面的 AI 应用 | 服务更多,完整部署更吃资源 |
| Flowise | 熟悉 LangChain、想快速搭聊天流程 | Node.js 生态,上手直接 |
如果重点是 RAG 应用和运营管理,可以看 Dify 私有知识库部署教程。偏 Node.js 和 LangChain 的读者,可以对比 Flowise 可视化 AI 工作流教程。本文只解决 Langflow 的单机生产部署。
Langflow 自身不是最吃资源的部分。流程加载组件、解析文件和等待多个模型响应时,内存会明显上涨;PostgreSQL、系统缓存和 Docker 也要留空间。
| 使用方式 | 建议配置 | 说明 |
|---|---|---|
| 个人学习、少量 Flow | 2 核 4GB | 一次运行少量流程,不在本机推理 |
| 小团队、文档处理较多 | 4 核 8GB | 给数据库和并发任务留余量 |
| 多 Worker、高并发 API | 8GB 起,增加 Redis | 已超出本文的轻量单机范围 |
| 本地模型推理 | 独立 GPU 机器 | Langflow 只连接模型 API |
还没决定买多大配置,可以先看 VPS 配置怎么选。2 核 4GB 是起点,不是并发承诺。
这套结构只有 Caddy 对公网开放:
浏览器 / API 客户端
│ HTTPS 443
▼
Caddy
│ 127.0.0.1:7860
▼
Langflow ──────► OpenAI / Anthropic / OpenRouter / LiteLLM
│
│ Docker 内部网络
▼
PostgreSQL:5432
PostgreSQL 没有宿主机端口映射。Langflow 只绑定 127.0.0.1:7860,即使 UFW 配错,也不会直接把编辑器暴露在公网 IP 上。
本文使用 Ubuntu 24.04,先把 langflow.example.com 的 A/AAAA 记录指向 VPS。把示例域名换成自己的,别原样复制。
安装基础工具:
sudo apt update
sudo apt install -y ca-certificates curl openssl ufw
安装 Docker 官方仓库版本:
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
防火墙只放行 SSH、HTTP 和 HTTPS:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status
远程操作时一定先放行 OpenSSH,再启用 UFW。不要开放 7860 和 5432。
sudo mkdir -p /opt/langflow
sudo chown "$USER":"$USER" /opt/langflow
cd /opt/langflow
先生成三项随机值:数据库密码、管理员密码和加密密钥。下面的命令只写入当前终端变量,不会自动保存到历史文件:
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))')"
创建 .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
把管理员密码放进密码管理器,然后清理终端变量:
unset langflow_db_password langflow_admin_password langflow_secret_key
LANGFLOW_SECRET_KEY 用来加密数据库里的 Credential。它丢了,数据库即使还在,已经保存的模型密钥也可能无法解密,所以 .env 必须跟数据库一起备份。
创建 /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:
这里使用官方 v1.11.1 镜像和 postgres:16-trixie。官方示例说明,固定 PostgreSQL 的 Debian 基础版本可以避免底层系统悄悄变化后出现 glibc collation 警告。
先渲染 Compose 配置:
chmod 600 .env docker-compose.yml
sudo docker compose config --quiet
sudo docker compose config --images
不要把完整的 docker compose config 输出贴到论坛或工单,它会展开数据库和管理员密码。
想了解 healthcheck、日志轮转和重启策略为什么这样配,可以接着看 Docker Compose 生产环境配置清单。
cd /opt/langflow
sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps
第一次启动要创建数据库表并加载组件,时间会比普通静态站长。持续看日志:
sudo docker compose logs -f --tail=200 langflow postgres
看到服务正常后按 Ctrl+C 退出日志,再检查健康接口:
curl -fsS http://127.0.0.1:7860/health_check
sudo docker compose ps
sudo ss -lntp | grep -E ':7860|:5432'
健康接口应该返回数据库和聊天服务状态。监听列表里,7860 只能是 127.0.0.1:7860;5432 不应出现在宿主机监听端口中。
安装 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
编辑 /etc/caddy/Caddyfile:
langflow.example.com {
encode zstd gzip
reverse_proxy 127.0.0.1:7860 {
transport http {
read_timeout 10m
}
}
}
较长的 Flow 可能等待模型或工具执行,所以这里把反向代理读取超时调到 10 分钟。保存后校验并重载:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
curl -I https://langflow.example.com
证书申请失败时,先确认 DNS 已指向当前 VPS,80/443 没被其他程序占用。完整排错步骤在 Caddy 反向代理与自动 HTTPS 教程。
打开 https://langflow.example.com,使用 .env 里的 LANGFLOW_SUPERUSER 和管理员密码登录。不要把自动登录重新改成 True,公网编辑器没有登录保护,很快就会被扫描到。
进入后先完成四件事:
- 新建一个项目,避免后续 Flow 全堆在默认目录;
- 创建最小聊天 Flow,可以从 Basic Prompting 模板开始;
- 在模型组件里新建 Credential,填入 OpenAI、Anthropic 或 OpenRouter Key;
- 在 Playground 发送一句测试消息,确认输入、模型和输出节点都能跑通。
模型 Key 存在 Langflow 全局变量或 Credential 中,并由 LANGFLOW_SECRET_KEY 加密。不要把真实 Key 直接写进导出的 Flow JSON,也不要把 Key 硬编码进教程里的 Compose。
如果团队已经有统一模型入口,可以连接 LiteLLM。这样能集中做虚拟 Key、预算和模型路由,部署方法见 LiteLLM 统一 LLM API 网关教程。
Flow 在 Playground 能跑通后,打开 Flow 的 API 面板,复制 Flow ID。再到个人设置的 API Keys 页面创建一枚 Langflow API Key。
在调用机器上设置变量:
export LANGFLOW_SERVER_URL="https://langflow.example.com"
export LANGFLOW_API_KEY="粘贴刚创建的 Langflow API Key"
export LANGFLOW_FLOW_ID="粘贴 Flow ID"
调用 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"
}'
真实 Flow 如果需要 tweaks,以 API 面板自动生成的代码为准。不同组件的节点 ID 不一样,不要从别人的示例里硬抄。
Langflow API Key 只应该放在服务端、CI Secret 或安全的自动化平台里。写进浏览器 JavaScript 后,任何访客都能在开发者工具里拿走它。
生产环境不要用 latest。升级前先看新版本 Release Notes,确认数据库迁移和环境变量变化,再做下一节的完整备份。
查看当前镜像:
cd /opt/langflow
sudo docker compose images
把 docker-compose.yml 中的 v1.11.1 改为已经确认的新稳定版,然后:
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
如果升级涉及数据库迁移,单纯把镜像 tag 改回 v1.11.1 不一定能回滚。稳妥做法是同时恢复升级前的 PostgreSQL dump、配置目录和旧镜像版本。
完整备份至少包含:
- PostgreSQL 数据库;
langflow-dataVolume;.env和docker-compose.yml;- Caddyfile;
- 当前 Langflow 镜像版本。
创建备份目录并导出 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"
短暂停止 Langflow 写入,再打包配置 Volume:
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
把备份同步到另一台机器或对象存储。同一块 VPS 磁盘上的备份,只能防误删,防不了整机损坏。更完整的异地方案可以参考 VPS 备份恢复演练。
恢复要先在测试 VPS 演练。准备好相同版本的 .env 和 Compose,启动 PostgreSQL 后恢复:
cat langflow-postgres.dump |
sudo docker compose exec -T postgres sh -c \
'pg_restore -U "$POSTGRES_USER" -d "$POSTGRES_DB" --clean --if-exists'
再还原 langflow-data,最后启动 Langflow。密钥和数据库必须配套,不能只恢复其中一个。
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
本机 7860 正常、域名打不开,问题通常在 DNS、Caddy 或防火墙。本机也不通,再查 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"'
重点检查数据库密码是否含有手工加入的 URI 特殊字符、Compose 渲染后的服务名是否是 postgres,以及旧 Volume 是否保留了另一套密码。本文用十六进制随机密码,能避开连接字符串转义问题。
确认 .env 中四项变量存在,但不要输出它们的值:
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
本文的 LANGFLOW_AUTO_LOGIN 写在 Compose 里,不在 .env。因此第一项应从渲染配置确认:
sudo docker compose config | grep 'LANGFLOW_AUTO_LOGIN: "False"'
管理员账号只在初始化阶段创建。旧数据库已经存在时,改 .env 不等于自动重置已有用户密码,别反复删除容器碰运气,更不要删除数据库 Volume。
检查请求头是不是 x-api-key,值是否为 Langflow API Key,而不是 OpenAI Key。还要确认 API Key 没有多复制空格:
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
如果日志显示模型 API 超时,先查模型提供商和出站网络;如果容器被 OOM Kill,升级内存或减少同时运行的流程。不要一上来就把 Caddy 超时改成一小时,那只会把真正的错误藏得更久。
- Langflow 固定在 v1.11.1,没有使用
latest; -
LANGFLOW_AUTO_LOGIN=False,管理员密码足够长; -
LANGFLOW_SECRET_KEY和 PostgreSQL 一起备份; - 7860 只绑定
127.0.0.1,5432 没有宿主机端口; -
https://langflow.example.com证书正常; - Playground 能完成一次真实模型调用;
- 带
x-api-key的 Flow API 请求成功; - 数据库、配置 Volume、
.env、Caddyfile 都有异地备份; - 升级前记录镜像版本,并做过测试恢复。
Langflow 最适合放在“模型 API 前面”:普通 VPS 跑编辑器、流程和数据库,GPU 或商业模型放在另一端。2 核 4GB 足够个人起步,但小团队别省这 4GB 内存差价。真正决定能不能长期用的,不是节点拖得多漂亮,而是登录、密钥、数据库和恢复流程有没有做好。
