一、目标架构

部署一个具备以下能力的自动化系统:

  • Docker Compose 部署
  • PostgreSQL 数据库
  • 反向代理 + HTTPS
  • 自定义域名访问
  • 与本地 LLM 服务互通
  • 数据持久化
  • 支持未来扩展

整体逻辑结构如下:

浏览器
   ↓
HTTPS 反向代理
   ↓
主机端口映射
   ↓
n8n 容器
   ↓
PostgreSQL 容器

并额外接入:

n8n 容器
   ↓
Docker 外部网络
   ↓
LLM 容器

二、数据库初始化陷阱

问题表现

  • 修改数据库密码后启动失败
  • 日志提示数据库目录已存在
  • 认证错误

原因

PostgreSQL 在首次启动时会根据环境变量初始化数据库。

之后即使修改密码,容器也不会重新初始化。

解决方式

删除数据库数据卷后重新启动。

关键原则:

数据库初始化仅进行一次。


三、数据库角色冲突问题

错误示例:

role already exists

产生原因:

  • 管理员用户与应用用户设置为同一名称
  • 初始化脚本重复创建角色

正确结构:

  • 一个 root 初始化用户
  • 一个应用专用用户

两者必须分离。


四、反向代理导致的两个典型问题

1️⃣ 邀请链接错误指向 localhost

现象:

新用户邀请链接使用 localhost

原因:

未正确设置外部访问环境变量。

必须显式配置:

  • 主机名
  • 协议
  • Webhook 基址
  • 编辑器基址

否则系统默认生成本地地址。


2️⃣ X-Forwarded-For 报错

日志示例:

The 'X-Forwarded-For' header is set but trust proxy is false

原因:

反向代理转发了客户端 IP
但应用未信任代理

解决方式:

设置 trusted proxies。

是否可以忽略?

  • 个人使用可以暂时忽略
  • 生产环境不建议忽略

五、浏览器安全提示差异

现象:

  • 多数浏览器访问正常
  • 某旧版本浏览器提示“危险网站”

分析:

  • 证书有效
  • HTTPS 正常
  • 其他浏览器无异常

结论:

多半为浏览器本地安全数据库或版本问题。

更新浏览器即可解决。


六、容器间网络通信(LLM 接入)

LLM 服务运行在独立 Docker 网络中。

为使自动化系统访问 LLM:

  1. 将自动化容器加入该网络
  2. 声明为 external 网络
  3. 通过容器名访问

无需暴露额外公网端口。


七、Python Task Runner 警告

日志提示:

Failed to start Python task runner

说明:

  • 容器中未安装 Python
  • 内部调试 runner 启动失败

影响:

  • 不影响核心功能
  • JS runner 正常运行

生产环境推荐 external runner。


八、健康部署判断标准

系统正常应满足:

  • 数据库 healthy
  • Migration 全部完成
  • 无认证错误
  • HTTPS 正常
  • 邀请链接不再使用 localhost
  • 容器网络互通

九、架构思考

本次部署暴露出三个重要原则:

1️⃣ 容器初始化不可逆

数据库环境变量仅在首次启动生效。


2️⃣ 反向代理必须显式信任

现代 Web 框架默认不信任代理头。


3️⃣ 预留扩展空间,但避免过度工程化

  • 外部网络能力
  • Worker 扩展能力
  • LLM 接入能力

提前预留,但不提前复杂化。


十、最终系统特征

当前系统具备:

  • HTTPS 访问
  • 独立数据库
  • 反向代理隔离
  • LLM 可接入
  • 数据持久化
  • 可横向扩展

属于稳定、可长期运行架构。

Leave a Reply

Your email address will not be published. Required fields are marked *