Rocky Linux 9.5 上 Docker 部署 LangFlow 1.7.3 实战指南
2026/9/11 1:44:06 网站建设 项目流程

最近在帮一个团队把大模型应用从开发机往正式服务器迁移,他们指定了 Rocky Linux 9.5 作为系统,又要求所有组件尽量容器化,免得后面环境不一致踩坑。核心的 LLM 工作流编排平台选的是 LangFlow,版本锁定在 1.7.3。这套组合看起来不复杂,但真正动手装的时候,还是有几处小坑需要注意,尤其是 Docker 仓库配置、LangFlow 容器参数和数据持久化这几块,网上的教程大多讲得比较笼统。我把自己完整走通的流程整理出来,给后面要用 Rocky Linux 9.5 部署 LangFlow 的朋友做个参考。

这篇内容适合谁看?想在一台干净的 Rocky Linux 9.5 服务器上快速跑起 LangFlow 的运维,以及刚接触 LLM 工作流编排、需要把可视化流程引擎部署到生产环境的开发者,都可以直接照着操作。我会把从零开始的每一步都拆开讲清楚,包括命令、参数含义、踩坑点,不搞那种"一行命令跑起来"的假教程。

1. 选型逻辑:为什么是 Rocky Linux 9.5 + Docker + LangFlow

很多同学看到"在线使用 Docker 安装"这几个字,第一反应是执行两三条命令就完事了。但实际做部署规划的时候,这套组合的每一层都有选择空间,搞清楚为什么这样选,后面出问题时才知道往哪排查。

1.1 Rocky Linux 9.5 在服务器部署中的角色

Rocky Linux 是 RHEL 的二进制兼容发行版,9.5 是较新的稳定版本,内核基于 5.14,默认使用 dnf 包管理器和 firewalld 防火墙方案。它和 CentOS 7 最大的区别在于:systemd 已经是绝对的初始化系统,SELinux 默认就是 Enforcing 模式,仓库结构也变成了 appstream、baseos 这些模块化仓库。

选择 Rocky Linux 9.5 做宿主机的理由很直接:上游 RHEL 的生命周期管理严格,补丁节奏稳定,不像某些滚动发行版隔三差五给你整个大更新。对于 LangFlow 这种要长期跑在服务器上的 Web 服务来说,宿主机的稳定性直接影响上层容器的运行。可能有人会问 CentOS Stream 行不行?也可以,但如果你没有特殊原因,我更推荐 Rocky Linux,因为它的发布节奏和 RHEL 对齐得更好,不会出现 Stream 那种"走在 RHEL 前面"的尴尬情况。

1.2 Docker 解决的核心问题

LangFlow 本身是一个基于 Python 的 Web 应用,依赖很多 Python 包和 Node 前端构建产物。如果直接装在宿主机上,Python 版本、pip 依赖、Node 版本、系统库全都要自己管,升级一次 LangFlow 就可能牵一发而动全身。用 Docker 容器把 LangFlow 整个运行时环境固化下来,宿主机只需要有 Docker 引擎和足够的内存磁盘,应用掉线了重启容器即可,迁移时导走容器卷就行。

这里要特别说明"在线使用 Docker 安装"的含义:它不是"离线模式"的对应词——在我们的场景里它指的是通过网络拉取 Docker 镜像的方式部署,也就是直接从 Docker Hub 拉取 langflowai/langflow:1.7.3,不像某些内网环境需要提前导入镜像 tar 包。理解了这个,你才能明白后面所有操作都依赖于能正常访问 Docker Hub。

1.3 LangFlow 1.7.3 到底能干什么

LangFlow 是一个可视化的大语言模型应用编排平台,底层构建在 LangChain 生态上。你可以用拖拽的方式把大模型、提示词模板、检索器、工具调用、数据处理节点连接起来,快速搭出"文档问答""Agent 工作流""多模型对比"这类应用,然后通过 API 暴露给外部调用。1.7.x 这个版本在项目节点管理、聊天界面、流程导入导出上已经相当成熟,适合作为稳定基线锁定。

它不是 ChatGLM、通义千问那一类模型服务,它更像一个"大模型应用的 IDE"——模型服务本身需要你自己配置 API Key,LangFlow 负责把各个环节串起来。这一点在部署时要想清楚,安装完 LangFlow 不意味着立刻能对话,还需要在界面上填写模型服务商的 API 地址和密钥。

2. 环境准备与 Docker 安装的细节

在这台服务器上做任何事之前,先检查系统状态,这套操作我每次装新机器都会执行一遍,避免装到一半发现内核太旧或者磁盘不够。

2.1 开始安装前的系统检查

登录 Rocky Linux 9.5 之后,先确认系统版本、内核和内存磁盘情况:

cat /etc/rocky-release uname -r free -h df -h

我遇到过一次低级失误:机器 / 目录只剩 6G 空间,结果 Docker 镜像拉到一半就报 no space left on device。LangFlow 镜像本身大概 1GB 多,加上系统镜像和运行产生的日志,建议给数据盘至少留出 20GB 以上空间。内存方面,LangFlow 的 Python 服务、前端构建产物、数据库进程加在一起,2G 内存勉强能跑,但体验一般,4G 以上会比较舒服。

同时确认 DNS 和网络是否正常。后面要从 Docker Hub 拉镜像,如果服务器是内网环境,可能需要提前配置代理或镜像加速器。检查方式:

ping -c 3 google.com curl -I https://hub.docker.com

如果你的服务器在国内,直接拉 Docker Hub 镜像可能会很慢,这时就看你的网络环境了,cloudflare 或者云服务商提供的加速服务都可以,原则是能稳定拉取到公共镜像。

2.2 配置 Docker 官方仓库

Rocky Linux 9.5 没有内置 Docker 包(它带的是 podman),所以需要手动添加 Docker 官方源。Docker 官方仓库对 RHEL 系用的是 centos 的 repo 文件,因为 Rocky 与 RHEL 二进制兼容,这个 repo 可以直接复用,但要注意版本代号适配到 9。配置命令如下:

sudo dnf install -y dnf-plugins-core sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

这里用的 download.docker.com 是 Docker 官方软件仓库,路径里的 centos 代表 RHEL 兼容系列。添加完可以查看一下 repo 文件内容,确认 baseurl 正确指向了 9 的目录:

cat /etc/yum.repos.d/docker-ce.repo

看到类似https://download.docker.com/linux/centos/9/x86_64/stable的地址就没问题。

2.3 安装 Docker 引擎与 Compose 插件

接下来安装 Docker 本体和常用插件:

sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

注意一定不要漏掉 docker-compose-plugin,后面用 docker compose 启动 LangFlow 就靠它。docker-ce-cli 是你执行 docker 命令的客户端,containerd.io 是容器运行时的底层管理组件,缺了任何一个都会出问题。安装完成之后,把 Docker 服务设为开机自启并立即启动:

sudo systemctl enable --now docker sudo systemctl status docker

如果看到Active: active (running)就说明引擎起来了。接着验证客户端和 Compose 版本:

docker version docker compose version

Docker 版本在 24 以上基本没问题,Compose 插件版本在 v2.20 以上比较稳。

2.4 首次运行前的两个隐患:SELinux 和防火墙

Rocky Linux 9.5 的 SELinux 默认是 Enforcing,这对安全是好事情,但如果容器要挂载宿主机目录,SELinux 上下文没配好就会导致容器内进程无法读写。我常用的做法有两种:一种是给挂载目录设置容器文件上下文标签:

sudo chcon -Rt container_file_t /opt/langflow_data

另一种是临时把 SELinux 切到 Permissive 排查问题,但正式使用不建议关闭 SELinux。

防火墙方面,Rocky 用的是 firewalld。默认 zone 是 public,端口不开放的话外部访问不到 LangFlow 的 Web 界面。用以下命令开放端口:

sudo firewall-cmd --permanent --add-port=7860/tcp sudo firewall-cmd --reload

7860 是 LangFlow 默认的 Web 服务端口,下面会讲到。

3. LangFlow 1.7.3 容器化部署的前置理解

在真正拉镜像启动容器之前,建议先搞清楚 LangFlow 的镜像版本策略、端口分工和数据持久化方式,这样后续排错会轻松很多。

3.1 镜像版本的三个选择:1.7.3 意味着什么

LangFlow 官方镜像仓库是 langflowai/langflow,公开可拉取。版本标签有很多,简单的有 latest,具体的有 1.7.3、1.7.2 等。我推荐在生产环境锁定具体版本号,原因很简单:latest 会跟着官方更新变动,可能你今天部署的时候还能跑,过两周因为镜像更新而出现不兼容,排查起来非常头疼。

锁定 1.7.3 还有一个好处:当你需要回滚时,只需要重新 pull 旧的镜像标签再启动容器即可,不需要重新配置任何环境。镜像标签格式如下:

langflowai/langflow:1.7.3

如果你有升级需求,官方仓库还维护了像1.7.3-python3.12这种带 Python 版本后缀的标签,但默认不指定的话就是官方自带的 Python 版本,我用默认标签实测下来很稳。

3.2 端口与环境变量的关键信息

LangFlow 的 Web 服务默认监听容器内的 7860 端口,所以宿主机映射通常写成-p 7860:7860。如果你宿主机 7860 已被占用,可以换成其他端口,比如-p 8080:7860,后面访问就是 http://服务器IP:8080。

环境变量是部署时的重头戏。LangFlow 1.7.x 支持的环境变量很多,但最核心的是这几个:

  • LANGFLOW_DATABASE_URL:指定元数据存储的数据库连接串,默认是 SQLite,生产建议用 PostgreSQL。
  • LANGFLOW_AUTO_LOGIN:默认是 false,设为 true 时会自动跳转到一个临时用户,适合个人测试。
  • LANGFLOW_SUPERUSER/LANGFLOW_SUPERUSER_PASSWORD:创建超级管理员用户的用户名和密码。
  • LANGFLOW_CONFIG_DIR:LangFlow 配置文件的存储目录,容器内默认是 /app/langflow。
  • LANGFLOW_HOSTLANGFLOW_PORT:默认分别是 0.0.0.0 和 7860,一般不用改。

第一次启动如果没设置超级用户,LangFlow 会要求你在页面上创建一个管理员账号。如果你想跳过页面初始化,直接在环境变量里指定超级用户,体验会清爽很多。

3.3 用 docker run 还是 docker compose?

很多博客给的方案是一大串 docker run 命令,参数多到让人眼花。我更推荐用 docker compose 定义服务,好处是配置声明式、可版本管理、升级改参数方便。docker-compose.yml 写清楚之后,一条docker compose up -d就能完成启动,后面维护时也不用翻历史命令。

不过也有人更喜欢 docker run 的直接感,我两种都给出,你按自己的操作习惯选就行。唯一要提醒的是:如果你是重新部署或升级版本,注意不要创建多个同名容器导致冲突,先docker rm -f langflow再启动。

3.4 数据持久化:容器可以被销毁,数据不能丢

LangFlow 的流程配置、API Key 配置、用户信息都存在数据库里。默认 SQLite 模式下,数据文件在容器内的/app/langflow/langflow.db(不同版本路径可能略有差异,但 /app/langflow 是配置根目录)。如果不挂载宿主机目录,容器一删,所有流程和数据全没了。

所以挂载一个宿主机目录到/app/langflow是必须操作。我习惯放在/opt/langflow_data,你可以按自己的规划来,但挂载目录的权限要确保容器内用户可写。前面提到的 SELinux 标签配置也在这里起作用。

4. 实际部署:拉取镜像、启动容器、登录验证

前置准备做完,下面进入实际操作。我以一台全新 Rocky Linux 9.5 服务器为例,假设你已经在宿主机上安装好了 Docker 并开通了 7860 端口。

4.1 拉取镜像时的网络问题与加速方案

先执行:

docker pull langflowai/langflow:1.7.3

这个命令会从 Docker Hub 拉取镜像。如果你的网络状况不理想,可能在拉取时卡在等待层数据。此时我在国内服务器上通常会配置 registry mirror,在/etc/docker/daemon.json中添加:

{ "registry-mirrors": ["https://docker.m.daocloud.io"] }

然后重启 Docker:

sudo systemctl restart docker

注意,如果你配置了加速地址后发现拉取失败,先确认这个加速地址是否可用,不要盲目依赖某一个。拉取的时候可以观察镜像层的下载进度,镜像是分层结构,总大小约 1GB,耐心等它下载完成。看到Status: Downloaded newer image for langflowai/langflow:1.7.3就说明成功。

4.2 使用 docker run 一键启动

如果只是测试环境,想快速跑起来,用 docker run 最直接:

sudo mkdir -p /opt/langflow_data && sudo chcon -Rt container_file_t /opt/langflow_data sudo docker run -d \ --name langflow \ -p 7860:7860 \ -v /opt/langflow_data:/app/langflow \ -e LANGFLOW_AUTO_LOGIN=true \ -e LANGFLOW_SUPERUSER=admin \ -e LANGFLOW_SUPERUSER_PASSWORD=your_strong_password \ langflowai/langflow:1.7.3

逐条解释一下参数:

  • -d:后台运行,不占用当前终端。
  • --name langflow:给容器起名字,方便后续停止和删除。
  • -p 7860:7860:将宿主机 7860 端口映射到容器内 7860 端口。
  • -v /opt/langflow_data:/app/langflow:把宿主机数据目录挂载到容器配置目录,持久化数据库和配置文件。
  • -e LANGFLOW_AUTO_LOGIN=true:开启自动登录,测试时方便直接进入界面。
  • 超级用户环境变量:首次启动时自动创建管理员账号。

启动之后,用docker logs -f langflow观察启动日志,看到类似Application startup completeUvicorn running on http://0.0.0.0:7860的日志就说明启动成功。

然后打开浏览器访问http://服务器IP:7860,看到 LangFlow 的欢迎界面就成功了。

4.3 更推荐的方式:docker compose 管理

如果你和我一样,后面会频繁改环境变量或升级镜像,那用 docker-compose.yml 会更顺手。创建/opt/langflow/docker-compose.yml

services: langflow: image: langflowai/langflow:1.7.3 container_name: langflow restart: unless-stopped ports: - "7860:7860" volumes: - /opt/langflow_data:/app/langflow environment: LANGFLOW_AUTO_LOGIN: "true" LANGFLOW_SUPERUSER: "admin" LANGFLOW_SUPERUSER_PASSWORD: "your_strong_password" LANGFLOW_CONFIG_DIR: "/app/langflow"

然后在/opt/langflow目录下执行:

sudo docker compose up -d

docker compose 的好处是容器挂了会自动重启(restart: unless-stopped),你不用手工去docker start。查看状态用:

sudo docker compose ps sudo docker compose logs -f langflow

更新版本时只需要改镜像标签,然后:

sudo docker compose down sudo docker compose up -d

整个过程非常干净。

4.4 首次登录:创建第一个 Flow

启动成功后,进入界面会看到项目列表页。如果设置了 LANGFLOW_AUTO_LOGIN=true,会自动跳转到一个默认用户;如果你设置了超级用户环境变量,页面登录时输入 admin 和对应的密码即可。

登录进去后,你需要先到右上角的设置里配置大模型提供商。这里是最容易卡住的地方:LangFlow 本身不带模型,你需要填入 OpenAI、通义千问、智谱或者本地 Ollama 等服务的 API Key。以 OpenAI 为例,在 Settings -> API Keys 里填入sk-xxx。如果你用的是国内模型服务,通常在 LangFlow 的模型节点里选择自定义 provider,填入对应的 base_url 和 api_key。

配置完模型,拖一个 LLM 节点到画布上,连接一个 Prompt 输入框,再连一个输出节点,就可以开始对话测试了。

4.5 反向代理与 HTTPS 配置(有域名时)

生产环境肯定不想直接用 IP+端口访问,一般会用 Nginx 反向代理。在 Rocky Linux 上安装 Nginx:

sudo dnf install -y nginx

然后增加一个 server 配置:

server { listen 443 ssl; server_name your.domain.com; ssl_certificate /etc/nginx/cert/server.crt; ssl_certificate_key /etc/nginx/cert/server.key; location / { proxy_pass http://127.0.0.1:7860; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }

注意最后四行是给 WebSocket 用的,LangFlow 界面和模型之间的实时交互依赖 WebSocket,漏掉的话聊天功能可能出问题。配置完sudo systemctl restart nginx

5. 部署后的运维要点与常见问题排查

装好只是开始,真正考验人的是后续的运维。这里我把踩过的坑和排查思路整理成清单,希望能帮你少走弯路。

5.1 日志怎么看、容器重启了怎么处理

LangFlow 日志里如果出现错误,第一步永远是:

sudo docker logs --tail 200 langflow

这个命令能让你快速看到最近 200 行日志。如果容器因为异常退出,可以用docker ps -a查看容器状态。我遇到过一次容器不断重启的情况,日志里显示数据库文件锁定,原因是宿主机目录和容器内目录的权限不匹配。解决方案很简单,把挂载目录赋权给容器内用户:

sudo chown -R 1000:1000 /opt/langflow_data

LangFlow 容器内部默认使用 uid 1000 运行。很多新手上来会直接 chmod 777,虽然能跑但隐患很大,不建议这样干。

5.2 PostgreSQL 替代 SQLite:流程数据多了以后

LangFlow 默认使用 SQLite,小规模使用没问题,一旦流程数量激增、并发访问上来,SQLite 的写锁会成为瓶颈。生产环境建议切换 PostgreSQL。方式是在 docker-compose.yml 里增加一个 postgres 服务,然后设置 LANGFLOW_DATABASE_URL:

services: postgres: image: postgres:16 environment: POSTGRES_USER: langflow POSTGRES_PASSWORD: langflow_pass POSTGRES_DB: langflow volumes: - /opt/langflow_pgdata:/var/lib/postgresql/data restart: unless-stopped langflow: image: langflowai/langflow:1.7.3 depends_on: - postgres environment: LANGFLOW_DATABASE_URL: "postgresql://langflow:langflow_pass@postgres:5432/langflow" ...

切换数据库前记得备份 SQLite 数据,LangFlow 本身没有自动迁移工具,简单的方法是在界面里把流程导出成 json 文件,换库后再导入,这个我实测是最省心的方式。

5.3 端口占用和防火墙导致的访问不了

打开浏览器访问服务器 IP:7860 没反应,先按顺序排查:

  1. 宿主机端口监听:ss -tlnp | grep 7860
  2. 容器状态:docker ps -a,STATUS 是否 Up
  3. 防火墙:firewall-cmd --list-ports,看 7860/tcp 是否已放行
  4. 云安全组:如果服务器在云上,安全组入方向规则也要放行对应端口

这四步能解决九成以上的"外部访问不到"问题。

5.4 升级 LangFlow 版本的正确姿势

从 1.7.3 升到更高版本,不要直接 pull 新的 latest 然后docker restart。我的标准流程是:

# 在 /opt/langflow 目录下 sudo docker compose down # 修改 docker-compose.yml 中的 image 标签 sudo docker pull langflowai/langflow:1.8.0 sudo docker compose up -d

启动前建议先把整个 /opt/langflow_data 目录做一个 tar 备份:

sudo tar -czf /opt/langflow_backup_20250101.tar.gz /opt/langflow_data

这样即使升级后出现数据迁移问题,也能随时回滚。

6. 从部署到日常维护:我个人的几个经验

整套部署跑完,有几个细节想单独拎出来说说。

先说说为什么我一直强调锁定版本。LangFlow 迭代速度比传统企业软件快得多,镜像更新往往伴随数据库结构变化或者前端接口调整。我见过不止一个团队用 latest 部署,某天重启容器后整个界面都变了,原有流程虽然还在,但节点配置对不上新版本,排查了一个下午。锁定版本号不是不进步,而是把"是否升级"这个决定权掌握在自己手里。

再说说资源规划。LangFlow 虽然只是一个编排平台,但它在加载大型流程、处理对话上下文时还是比较吃内存的。我建议宿主机内存至少 4GB,Docker 数据目录所在磁盘至少 30GB。如果你的流程重度依赖向量检索,可能还要额外部署向量数据库容器,那内存和磁盘预算要再往上加。

关于账户安全,LANGFLOW_SUPERUSER_PASSWORD 不要用弱密码,LangFlow 界面能访问到的话,很多流程配置都会暴露模型服务商的信息,这相当于把 API Key 放在门口。建议在 Nginx 层加 Basic Auth 或者用更严肃的认证方案。

最后一个建议:把 docker-compose.yml 和部署说明文档化,放进 Git 仓库。下次重新部署或者换服务器时,一条git clonedocker compose up -d就能全部恢复,不用靠脑子回忆当时到底配置了什么环境变量。这套流程我实践数次,整体非常稳定。如果你在部署中碰到别的问题,欢迎在评论区把现象和日志贴出来,大家一起排查。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询