大家好呀,我是那个在AI部署道路上越挫越勇的小白部署不输!

相关服务:香港大带宽服务器

这周去折腾了一个新奇又强大的的玩意儿——n8n!如果你还没听说过n8n,可以把它想象成一个开源的、可以自己部署的、AI赋能的“超级自动化工作流”引擎。它能帮你连接各种应用和服务,创造出不可思议的自动化流程。

关于n8n工作流的强大之处,我们后面会专门开篇细聊。今天,这篇博客的目标只有一个:记录我如何从零开始,在云主机上成功部署这个应用,并为它配上HTTPS安全小锁的全过程。

这趟旅程,充满了各种意想不到的“Boss战”和“隐藏关卡”。如果你也想拥有一个属于自己的云端AI应用,那么,请泡好你的茶或咖啡,这份详尽的“通关攻略”,希望能为你照亮前路!

在这里插入图片描述

🎯 我们的“作战地图”

虽然在本地电脑上运行很酷,但真正的乐趣在于让全世界都能访问我们的应用。所以,云端部署是唯一的选择。

我为这次“远征”绘制了一张清晰的作战地图:
在插入图片描述

接下来,我们就将严格按照这张地图,一步步攻克每一个堡垒。


第一幕:战前准备 (Prerequisites)

兵马未动,粮草先行。在开始部署之前,我们需要准备好几样关键“物资”:

  • 一台云主机: 我这次选择的是香港区域的服务器,并安装了Ubuntu 22.04系统。它自带一个公网IP,是我们所有工作的“根据地”。
  • 一个域名: 我使用的是myn8napp.7xontop.dpdns.org。拥有一个自己的域名,是让网站显得专业的关键。
  • DNS服务商: 我选择了强大的 Cloudflare 来管理我的域名解析。
  • SSL证书: 我们的目标是获取由 Let’s Encrypt 提供的免费SSL证书,开启HTTPS。

第二幕:正式部署的“四重关卡”

准备工作就绪,我们正式开始“攻城”!

第一关:基础环境搭建

这一步的目标是把我们的“根据地”(云主机)打造成一个坚固的前线阵地。

  1. 拉取项目代码:我们首先从GitHub上把self-hosted-ai-starter-kit这个项目克隆到服务器上。
    git clone https://github.com/n8n-io/self-hosted-ai-starter-kit.git
    cd self-hosted-ai-starter-kit
    
  2. 配置防火墙(UFW):这是我们遇到的第一个经典“把自己锁在门外”的陷阱!

    💡血泪教训 #1:永远先给SSH开门!
    在运行sudo ufw enable之前,请务-必、一定、百分之百要先运行sudo ufw allow ssh!我们还为Web服务预先打开了80和443端口。

第二关:Docker环境的安装与配置

这是整个部署的核心。我们需要为应用安装并配置好“集装箱码头”——Docker。

  1. 安装Docker: 我们直接使用阿里云的镜像源来安装Docker,这在国内服务器环境中是最高效、最稳妥的选择。
  2. 解决权限问题: 安装成功后,运行docker ps却提示permission denied。

    💡血泪教训 #2:别忘了重新登录!
    这个问题是因为当前用户不在docker用户组里。用sudo usermod -aG docker $USER将用户添加进去后,必须退出SSH,然后重新登录,权限才会生效!

  3. 配置镜像加速: 为了让后续拉取应用镜像时快如闪电,我们为Docker服务也配置了阿里云的镜像加速器(通过修改/etc/docker/daemon.json)。
第三关:启动应用容器

环境就绪,我们运行docker compose --profile cpu up -d,期待着所有服务一飞冲天。然而,一系列更深层次的“连环”问题接踵而-至。

💡血泪教训 #3:警惕“幽灵”容器与“心急”的服务!

  • 问题:报错Container name is already in use或database "n8n" does not exist。
  • 原因:上一次失败的up命令,会留下“幽灵”容器占据名字;或者n8n-import服务启动太快,而数据库还没初始化好。
  • 破局之法:使用sudo docker compose down --volumes可以彻底清理掉容器和数据卷。并在docker-compose.yml中,为n8n-import添加对n8n和postgres的depends_on与condition: service_healthy,强制它们按顺序、健康地启动。
第四关:Nginx反向代理与HTTPS证书

当所有容器终于能在后台健康运行时,我们迎来了最后的、也是最磨人的挑战:配置Nginx,并获取SSL证书。

  1. 配置Nginx:我们编写了一个简单的Nginx配置,将所有发往我们域名的80端口流量,反向代理到内部运行的n8n容器(127.0.0.1:5678)。

  2. 获取证书的“叹息之墙”:

    💡血泪教训 #4:云服务器的HTTP验证极其不可靠!
    无论我如何配置安全组、禁用ufw,甚至敞开所有端口,使用--nginx或--standalone模式的HTTP验证,都始终被云服务商更高层级的网络策略以Connection reset by peer粗暴地拒绝。

  3. DNS验证的“曙光”:

    💡血泪教呈 #5:免费DNS ≠ 功能齐全!
    切换到certbot certonly --manual --preferred-challenges dns这条路后,我们又发现,之前尝试的多个免费DNS服务商(DuckDNS, FreeDNS等)都因为功能限制(不支持添加_开头的TXT记录),导致验证无法完成。
    最终方案:我选择了 Cloudflare 的免费DNS服务,配合一个我自己注册的域名。这才是最专业、最稳妥的方案。

  4. 最终Nginx配置:在Cloudflare的帮助下,我们成功获取了证书!最后,我用一份最终版的Nginx配置,将所有80端口的HTTP请求,强制301重定向到HTTPS;并让443端口负责监听、配置SSL证书,并将所有安全的HTTPS流量,反向代理到n8n容器。

    server {
        listen 80;
        server_name myn8napp.7xontop.dpdns.org;
        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl http2;
        server_name myappn8n.7xontop.dpdns.org;

        ssl_certificate /etc/letsencrypt/live/myappn8n.7xontop.dpdns.org/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/myappn8n.7xontop.dpdns.org/privkey.pem;
        # ... 其他SSL安全配置 ...

        location / {
            proxy_pass http://127.0.0.1:5678;
            # ... 其他proxy配置 ...
        }
    }

旅程的终点,也是新的起点

在经历了无数次的permission denied, connection timed out, 502 Bad Gateway和cannot open shared object file之后,当我终于在浏览器地址栏输入https://myn8napp.7xontop.dpdns.org看到安全小锁,并成功进入n8n的设置页面时,我知道,这场漫长的部署之旅,终于画上了一个圆满的句号。
在这里插入图片描述

这段经历,远比任何教科书都更深刻。它教会我,部署工作不仅仅是执行命令,它更是一门关于网络、安全、权限、依赖管理和系统化调试的综合艺术。

我是小白部署不输,一个热爱分享、在AI工程化道路上不断前行的探索者。希望我这份详尽的“踩坑”实录,能为你未来的部署工作带来一丝光亮。

还没看够?更硬核的保姆级教程,即将上线!

你可能想问:“这篇博客太棒了,但里面提到的每一行代码、每一个步骤,能再拆解得更细致一些吗?”

当然可以!

这篇“作战日志”,只是我们旅程的开篇。在接下来的几周里,我将把这次部署的每一个阶段、每一行代码、每一个配置文件,都整理成独立的、超详细的“保姆级”教程,发布在我的微信公众号上。

如果你也想亲手从0到1,完整复现这次部署,或者想深入了解每一个“坑”背后的技术原理,欢迎扫描下方的二维码,关注我的公众号 小白部署不输,让我们在技术的道路上,继续结伴而行!

我们的探索,未完待续…
在这里插入图片描述