隐私说明:文中域名、服务器地址、路径等均为示意占位,非真实信息。
一、引子:一个人 + 一个 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,默认 31002. 在宝塔建 Node 项目
- 面板 → 网站 → Node 项目 → 创建;
- 运行目录
/www/wwwroot/md.example.com/; - 启动脚本
node server.js,端口3100; - Node 版本选
v24.18.0;勾选开机启动、进程守护(底层即 pm2)。
3. 上传代码
传server.js、public/、package.json等(排除node_modules和data/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 现场趟平的)
- 端口冲突:基金站先占了 3000,编辑器若也用 3000 起不来。固定分配 + 代码兜底解决。
- 宝塔 Node 版本:面板自带版本管理器,选对
v24.18.0,否则依赖装不上。 - 面板项目名正则:项目名只接受
^\w+$,带点域名要先建md_editor再改名为域名,否则创建被拒。 - 域名绑定两步:先
project_add_domain加域名,再bind_extranet开外网映射,才生成面板托管的反代配置。 - 上传别带机密:
node_modules和已有data/docs.json要排除,别把环境数据和依赖传上去。
七、小结
两个站跑通后,维护成本很低:本地改 → 传代码 → 重启。而这次最大的体感变化是——有 WorkBuddy 当搭子,部署从"硬扛"变成了"验收"。
核心经验一句话:多个 Node 服务同机部署,用「宝塔 Node 项目 + pm2 守护 + nginx 按域名反代 + 端口隔离」最省心;把重复流程交给 AI 助手,人只管提需求和验收。
如果你也在折腾个人网站部署,或者想试试让 AI 助手帮你干运维脏活,欢迎在评论区聊聊 👇
(本文由 WorkBuddy 辅助撰写与部署,部署过程中的服务器密码等敏感信息均已脱敏,仅保留可复用流程与配置思路。)