用 WorkBuddy 把两个 Node 网站搬上云:基金导航站 + Markdown 编辑器,宝塔托管实战复盘

隐私说明:文中域名、服务器地址、路径等均为示意占位,非真实信息。


一、引子:一个人 + 一个 AI 助手

最早这两个站都是"借壳"跑的------一个挂在 Coze 发布页里,一个用现成模板凑合。能用,但有两个痛点:

  • 数据不在自己手里:编辑器的文档存别人家,想导出、想加功能都不自由;
  • 想加后端能力时被卡住:基金站要聚合多个数据源、做缓存,纯静态壳搞不定。

于是我决定:自己写后端、自己部署。但说实话,一个人既要写代码、又要配服务器、还要和宝塔面板较劲,体力活不少。这趟我换了个打法------让 WorkBuddy 当我的"部署搭子",从写代码到 SSH 上线,大部分脏活交给它。


二、技术选型

两个站都用 Node.js + Express 做后端,前端是普通静态资源,由 Express 直接托管。

站点 域名 后端 端口 特点
基金数据导航站 fund.example.com Node 服务(pm2: fund-app 3000 聚合基金数据、导航
Markdown 在线编辑器 md.example.com Express + markdown-it + DOMPurify + highlight.js 3100 编辑/预览、文档存 data/docs.json

编辑器这块我提了体验要求,WorkBuddy 照着实现了:深色顶/底栏、浅色编辑区、编辑/预览一键切换、标签页、字数/段落统计、状态徽章。渲染用 markdown-it,防 XSS 用 DOMPurify,代码高亮用 highlight.js


三、WorkBuddy 是怎么帮我落地的

这部分是本文重点。部署不是"写篇文章"那么简单,它拆成了四块,WorkBuddy 各管一摊:

1. 写代码

Express 服务(server.js)、编辑器前端 UI、/api/docs 增删改查、渲染管线(markdown-it + DOMPurify + highlight.js)------这些它直接产出,我负责提需求和验收。

2. 写部署脚本

它生成了 deploy_md.py:用 Python 的 paramiko 走 SSH,自动完成"连服务器 → 上传代码 → npm install → pm2 启动 → 写 nginx 反代 → 健康检查"一条龙。以后改完代码,跑一下脚本就上线。

3. 干上线的脏活

SSH 连进服务器、装依赖、配 pm2 守护、写 nginx 反向代理、申请 HTTPS------这些重复且容易手抖的步骤,交给它执行比我自己敲更稳。

4. 排雷并沉淀成技能

宝塔面板的「Node 项目」注册有不少暗坑(下面详述),WorkBuddy 现场一个个趟平,还顺手把整套"SSH 部署 + 面板原生 Node 项目注册"沉淀成了一个可复用技能 baota-ssh-deploy。下次换台服务器,直接调技能就行。

一句话:我是"产品经理 + 验收员",WorkBuddy 是"全栈工程师 + 运维"。分工清楚了,效率就上来了。


四、部署流程(以编辑器为例)

1. 本地能跑通

复制代码
npm install
npm start          # server.js 监听 PORT,默认 3100

2. 在宝塔建 Node 项目

  • 面板 → 网站 → Node 项目 → 创建;
  • 运行目录 /www/wwwroot/md.example.com/
  • 启动脚本 node server.js,端口 3100
  • Node 版本选 v24.18.0;勾选开机启动、进程守护(底层即 pm2)。

3. 上传代码

server.jspublic/package.json 等(排除 node_modulesdata/docs.json ),面板自动跑 npm install

4. 域名 + 反向代理

  • 域名 A 记录解析到服务器公网 IP;
  • Node 项目里「绑定域名」,宝塔自动生成反代:md.example.com:80 → 127.0.0.1:3100
  • 申请 Let's Encrypt 证书,强制 HTTPS。

5. 验证

访问 https://md.example.com/healthz 返回 200 即可。基金站流程一致,端口 3000、域名 fund.example.com


五、两个站的差异与同机要点

  • 端口隔离:同机多 Node 服务,各自占不同端口(3000 / 3100),nginx 按域名反代,避免抢端口。
  • 存储目录属主 :编辑器 data/ 由 root 写入,运行用户设为 root;基金站用 www,权限隔离、互不影响。
  • 端口兜底server.js 写成 PORT = parseInt(process.env.PORT) || 3100------宝塔启动脚本不一定注入 PORT,留默认端口能避免和已占用的 3000 冲突。

六、踩过的坑(WorkBuddy 现场趟平的)

  1. 端口冲突:基金站先占了 3000,编辑器若也用 3000 起不来。固定分配 + 代码兜底解决。
  2. 宝塔 Node 版本 :面板自带版本管理器,选对 v24.18.0,否则依赖装不上。
  3. 面板项目名正则 :项目名只接受 ^\w+$,带点域名要先建 md_editor 再改名为域名,否则创建被拒。
  4. 域名绑定两步 :先 project_add_domain 加域名,再 bind_extranet 开外网映射,才生成面板托管的反代配置。
  5. 上传别带机密node_modules 和已有 data/docs.json 要排除,别把环境数据和依赖传上去。

七、小结

两个站跑通后,维护成本很低:本地改 → 传代码 → 重启。而这次最大的体感变化是------有 WorkBuddy 当搭子,部署从"硬扛"变成了"验收"

核心经验一句话:多个 Node 服务同机部署,用「宝塔 Node 项目 + pm2 守护 + nginx 按域名反代 + 端口隔离」最省心;把重复流程交给 AI 助手,人只管提需求和验收。

如果你也在折腾个人网站部署,或者想试试让 AI 助手帮你干运维脏活,欢迎在评论区聊聊 👇


(本文由 WorkBuddy 辅助撰写与部署,部署过程中的服务器密码等敏感信息均已脱敏,仅保留可复用流程与配置思路。)

相关推荐
龙虾PRO1 小时前
AI 产业三大发展主线同步爆发,香港企业依托智能工具落地合规化应用方案
人工智能
B8017913Y1 小时前
上课记笔记写不完不会整理?2026学习笔记生成使用场景该怎么选
人工智能·笔记·学习
武子康1 小时前
调查研究-221 KV Cache:LLM 推理服务真正的显存黑洞
人工智能·llm·agent
小猴子下山1231 小时前
2026年无锡干细胞领域企业发展观察:聚焦细胞生物技术与大健康管理
人工智能·精选
IT_陈寒1 小时前
React useEffect依赖数组把我坑惨了,这次搞明白了
前端·人工智能·后端
环境栈笔记1 小时前
AI 浏览器任务失败怎么排查:Context、Session、Page State 和 Task Log 检查清单
前端·人工智能·后端·自动化
Be-real1 小时前
机器学习:欠拟合、过拟合、偏差方差超全详解
人工智能·机器学习·过拟合·欠拟合
饼干哥哥1 小时前
Lovart真的帮大忙了,一键直出品牌视觉套件和个人IP封面Skill
人工智能·代码规范·设计
私人珍藏库1 小时前
[Android] Npatch-免Root框架+可内置模块
android·人工智能·智能手机·工具·软件
147API2 小时前
Claude 的 Microsoft 365 connector 能写入了,技术接入别跳过权限验收
人工智能·microsoft·claude