一个简单的Node.js后端服务,提供返回"hello"的echo接口。
- Node.js v20.19.0
- Express.js
- PM2 (进程管理)
echo/
├── package.json # 项目配置文件
├── .nvmrc # 指定Node.js版本
├── ecosystem.config.js # PM2配置文件
├── src/ # 源代码目录
│ ├── index.js # 主入口文件
│ ├── routes/ # 路由目录
│ │ └── echo.js # echo接口路由
│ └── controllers/ # 控制器目录
│ └── echoController.js # echo接口控制器
├── deploy/ # 部署相关文件
│ ├── echo.service # systemd服务文件
│ └── deploy.sh # 部署脚本
├── Dockerfile # Docker容器配置文件
└── .dockerignore # Docker忽略文件
确保您的系统上安装了Node.js v20.19.0:
# 使用nvm安装指定版本的Node.js
nvm install 20.19.0
nvm use 20.19.0安装依赖并启动开发服务器:
npm install
npm run dev服务将在 http://localhost:3000 上运行。
确保您有root权限,然后执行:
# 确保脚本有执行权限
chmod +x deploy/deploy.sh
# 执行部署脚本
sudo ./deploy/deploy.sh这将把服务部署到 /root/www/echo 目录,并使用PM2和systemd进行管理。
构建Docker镜像:
docker build -t echo-service .运行容器:
docker run -d -p 3000:3000 --name echo-service echo-service返回一个包含"hello"消息的JSON响应。
请求示例:
GET http://localhost:3000/echo
响应示例:
{
"message": "hello"
}# 查看应用状态
pm2 status
# 查看日志
pm2 logs echo-service
# 重启应用
pm2 restart echo-service
# 停止应用
pm2 stop echo-service
# 删除应用
pm2 delete echo-service在Ubuntu 20.04服务器上,该服务部署在 /root/www/echo 目录下。
以下是几种将本地工程上传到远程Ubuntu 20.04服务器的方法:
# 上传整个项目,自动排除不必要文件
rsync -avz --exclude 'node_modules' --exclude '.git' --exclude '.DS_Store' /Users/fancyliu/echo/ username@server_ip:/root/www/echo/
# 如果需要显示详细进度
rsync -avz --progress --exclude 'node_modules' --exclude '.git' /Users/fancyliu/echo/ username@server_ip:/root/www/echo/# 先临时删除不必要的目录(推荐先备份)
rm -rf /Users/fancyliu/echo/node_modules
# 上传项目
scp -r /Users/fancyliu/echo username@server_ip:/root/www/
# 恢复本地依赖
cd /Users/fancyliu/echo && npm install# 在本地打包(排除不必要文件)
cd /Users/fancyliu
tar -czf echo.tar.gz --exclude='echo/node_modules' --exclude='echo/.git' --exclude='echo/.DS_Store' echo
# 上传tar包
scp echo.tar.gz username@server_ip:/root/www/
# 在远程服务器解压
ssh username@server_ip "cd /root/www && tar -xzf echo.tar.gz && rm echo.tar.gz"# 在本地将项目推送到Git仓库
cd /Users/fancyliu/echo
git init
git add .
git commit -m "Initial commit"
git remote add origin git@github.com:flanliulf/echo.git
git push -u origin main # 使用main作为默认分支
# 在远程服务器上克隆仓库
ssh username@server_ip "cd /root/www && git clone git@github.com:flanliulf/echo.git echo"项目GitHub仓库地址:https://github.com/flanliulf/echo
如果您想克隆此仓库,可以使用以下命令:
# 克隆仓库
git clone git@github.com:flanliulf/echo.git
# 进入项目目录
cd echo
# 确保您在main分支上
git checkout main# 在本地构建Docker镜像并推送到Docker Hub
cd /Users/fancyliu/echo
docker build -t your_dockerhub_username/echo-service .
docker push your_dockerhub_username/echo-service
# 在远程服务器上拉取并运行Docker镜像
ssh username@server_ip "docker pull your_dockerhub_username/echo-service && docker run -d -p 3000:3000 --name echo-service your_dockerhub_username/echo-service"无论使用哪种方法上传,上传完成后都需要在远程服务器上执行以下步骤:
-
安装依赖:
cd /root/www/echo npm install --production -
安装PM2(如果尚未安装):
npm install -g pm2
-
启动服务:
# 使用PM2启动 pm2 start ecosystem.config.js --env production # 或使用部署脚本(推荐) chmod +x deploy/deploy.sh sudo ./deploy/deploy.sh
-
设置PM2开机自启:
pm2 startup pm2 save
-
验证服务是否正常运行:
curl http://localhost:3000/echo
注意:上述命令中的username@server_ip需要替换为实际的服务器用户名和IP地址。
项目包含了增强的部署脚本,提供了更好的错误检查和状态验证:
# 部署服务
sudo ./deploy/deploy.sh
# 卸载服务
sudo ./deploy/undeploy.sh# 检查PM2状态
pm2 status
# 查看服务日志
pm2 logs echo-service
# 检查systemd服务状态
systemctl status echo.service
# 测试API端点
curl http://localhost:3000/echo当需要更新服务时,可以重新运行部署脚本:
# 上传新版本的代码后
sudo ./deploy/deploy.sh部署脚本会自动:
- 备份现有部署
- 停止旧服务
- 安装新依赖
- 启动新服务
- 验证服务状态
如果需要完全移除Echo服务:
sudo ./deploy/undeploy.sh卸载脚本将:
- 停止并删除PM2中的服务
- 禁用并删除systemd服务
- 可选择删除部署目录和备份
-
端口冲突:如果3000端口被占用,请检查是否有其他服务在使用该端口
sudo netstat -tlnp | grep :3000 -
权限问题:确保以root权限运行部署脚本
sudo ./deploy/deploy.sh
-
Node.js版本不匹配:确保服务器上安装了正确的Node.js版本
node --version # 应该是 v20.19.0 -
PM2服务无法启动:检查PM2日志
pm2 logs echo-service
- PM2日志:
~/.pm2/logs/ - systemd日志:
journalctl -u echo.service
如果您想为这个项目做出贡献,请按照以下步骤操作:
- Fork这个仓库
- 创建您的特性分支:
git checkout -b feature/amazing-feature - 提交您的更改:
git commit -m '添加一些很棒的功能' - 推送到分支:
git push origin feature/amazing-feature - 提交Pull Request
- 遵循JavaScript Standard Style代码风格
- 确保所有测试通过
- 为新功能添加适当的测试
- 更新文档以反映任何更改
如果您发现任何问题或有改进建议,请在GitHub仓库中创建一个Issue。