部署运维

本文说明如何把服务部署到 Linux 服务器,涵盖一键脚本、手动 systemd 部署、卸载与技术细节。

1. 上传文件

scp -r src package.json scripts deploy .env.example user@server:/opt/dingtalk-notice/

2. 创建环境变量文件

cd /opt/dingtalk-notice
cp .env.example .env
vi .env   # 填入 DINGTALK_WEBHOOK_URL、DINGTALK_SECRET、DINGTALK_API_TOKEN(可选)

3. 一键部署

sudo bash scripts/install.sh

脚本支持两种部署模式:

模式 用途 依赖
模式 1 — 安装推送服务 环境检查 → 安装 systemd 服务 → 启动,本机作为推送服务器 Node.js
模式 2 — 外接推送服务 交互式输入远程 IP / 端口 / Token / 主机名,只装监控脚本,连接已有推送服务器 仅 bash + curl

4. 手动部署(可选)

如果不想用 install.sh,也可以分步操作:

sudo bash scripts/check.sh   # 先检查环境
sudo cp deploy/dingtalk-notice.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now dingtalk-notice

服务由 systemd 托管,配置了 Restart=always, 进程崩溃后 5 秒自动重启(RestartSec=5),开机自启。

卸载

sudo bash /opt/dingtalk-notice/scripts/uninstall.sh

卸载脚本会停止并移除 systemd 服务,但保留项目目录和 Node.js。 cron 定时任务由用户手动设定,卸载后需自行清理:

rm -rf /opt/dingtalk-notice          # 删除项目文件
crontab -e                            # 移除 monitor.sh 的 cron 行

技术细节

  • 零外部依赖:仅使用 Node.js 标准库(httphttpscrypto),无框架、无数据库、无状态
  • Webhook 加签:按 timestamp + "\n" + secret 做 HMAC-SHA256 → Base64 → URL 编码,自动拼接 timestampsign 参数
  • 请求超时:向钉钉 API 请求超时 10 秒,超时返回 502
  • 结构化日志:记录时间戳、IP、方法、路径、状态码、耗时、UA、Body 大小,支持文件写入与 1MB 自动轮转
  • 优雅关闭:收到 SIGTERM / SIGINT 后停止接收新请求,等待在途请求完成再退出,10 秒超时强制退出
  • 安全加固:systemd 单元启用了 NoNewPrivilegesProtectSystem=strictProtectHome 等,进程以 nobody 运行