From 6a54ba34eaa4e1651b4a75761c08c1570e498522 Mon Sep 17 00:00:00 2001 From: huanglinhuan Date: Thu, 15 Jan 2026 15:38:35 +0800 Subject: [PATCH] init commit --- README.md | 167 +++++++++++++++++++++++++++++++++++++++++ department-api.service | 17 +++++ deploy.sh | 12 +++ 3 files changed, 196 insertions(+) create mode 100644 README.md create mode 100644 department-api.service create mode 100644 deploy.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..f56598e --- /dev/null +++ b/README.md @@ -0,0 +1,167 @@ +# 通信技术部前后端一键部署说明 + +本仓库包含两个子工程: + +- `department-api`:Node.js + Express 后端,提供 API 与静态资源 +- `department-web`:React 前端,构建后由后端托管 + +已提供一键部署脚本 `deploy.sh` 和 systemd 服务 `department-api.service`,用于实现: + +- 一键安装依赖 + 构建前端 + 安装/更新服务 +- 服务后台常驻运行 +- 开机自启与异常自动重启 + +## 环境要求 + +- 操作系统:常见 Linux 发行版(支持 systemd,如 Ubuntu / CentOS 7+) +- 已安装: + - Node.js(建议 16+) + - npm + - bash + - systemd(默认存在于大多数现代 Linux) +- 拥有 sudo 权限的用户 + +## 首次部署步骤 + +1. 克隆或拷贝本项目到服务器,例如: + +```bash +cd /media/media_14t_sda1 +git clone web # 若已存在则略过 +cd web +``` + +2. 检查并按需修改 systemd 服务配置(可选但推荐): + +- 文件:`department-api.service` +- 重点字段: + - `WorkingDirectory`:后端目录,默认 `/media/media_14t_sda1/web/department-api` + - `Environment=PORT=3001`:服务端口 + - `Environment=JWT_SECRET=change-me`:JWT 密钥(生产环境务必改成强随机字符串) + +3. 运行一键部署脚本: + +```bash +cd /media/media_14t_sda1/web +bash deploy.sh +``` + +脚本主要做的事情: + +- 安装后端依赖:`department-api` +- 安装并构建前端:`department-web` → `department-web/build` +- 将 `department-api.service` 拷贝到 `/etc/systemd/system/` +- 执行: + - `sudo systemctl daemon-reload` + - `sudo systemctl enable department-api.service`(设置开机自启) + - `sudo systemctl restart department-api.service`(启动/重启服务) + +> 运行过程中会需要输入 sudo 密码,这是正常的。 + +4. 验证服务状态: + +```bash +sudo systemctl status department-api.service +``` + +如果看到 `Active: active (running)`,表示服务已在后台运行。 + +5. 访问地址: + +- 前端页面与 API 统一入口: + - `http://<服务器IP>:3001` +- 常见路径: + - 前端 SPA:根路径 `/` + - API:`/api/...` + - 静态资料:`/uploads/...` + +## 日常更新代码的流程 + +### 场景一:有前端改动(推荐统一用一键脚本) + +1. 在服务器上更新代码,例如: + +```bash +cd /media/media_14t_sda1/web +git pull # 或者其他同步方式 +``` + +2. 重新一键部署(重新安装依赖 + 构建前端 + 重启服务): + +```bash +cd /media/media_14t_sda1/web +bash deploy.sh +``` + +执行完成后: + +- 新版本前端构建产物会覆盖旧的 `department-web/build` +- systemd 服务会自动重启,加载最新代码 + +### 场景二:仅后端小改动(无需重建前端) + +如果只改了后端逻辑,且不想每次都重新 npm install / build,可以: + +1. 同步代码后,直接重启服务: + +```bash +sudo systemctl restart department-api.service +``` + +2. 查看状态确认: + +```bash +sudo systemctl status department-api.service +``` + +## 查看日志与排错 + +查看最近 100 行日志: + +```bash +sudo journalctl -u department-api.service -n 100 +``` + +实时滚动查看日志: + +```bash +sudo journalctl -u department-api.service -f +``` + +若服务未能启动,可重点检查: + +- Node.js 是否安装、版本是否太旧 +- `department-api.service` 中的 `WorkingDirectory` 路径是否与你实际部署路径一致 +- 端口是否被占用(如已有其他服务占用 3001) +- `JWT_SECRET` 是否为空或包含非法字符(推荐使用简单的字母数字组合) + +## 停止服务与取消开机自启 + +- 停止服务(临时): + +```bash +sudo systemctl stop department-api.service +``` + +- 取消开机自启: + +```bash +sudo systemctl disable department-api.service +``` + +## 访问入口总结 + +- 后端 + 前端统一服务:`department-api`(systemd 管理) +- 默认端口:`3001` +- 部署 / 更新统一命令: + +```bash +cd /media/media_14t_sda1/web +bash deploy.sh +``` + +如果后续你调整了目录或端口,只需要同步修改: + +- `department-api.service` 中的 `WorkingDirectory`、`PORT` 等环境变量 +- 如有需要,也可以把服务名从 `department-api.service` 改成公司内部标准命名。 + diff --git a/department-api.service b/department-api.service new file mode 100644 index 0000000..bcb19e8 --- /dev/null +++ b/department-api.service @@ -0,0 +1,17 @@ +[Unit] +Description=Department API and Web +After=network.target + +[Service] +Type=simple +WorkingDirectory=/media/media_14t_sda1/web/department-api +ExecStart=/usr/bin/env node server.js +Restart=always +RestartSec=5 +Environment=NODE_ENV=production +Environment=PORT=3001 +Environment=JWT_SECRET=change-me + +[Install] +WantedBy=multi-user.target + diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..26c9cce --- /dev/null +++ b/deploy.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +set -e +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$ROOT_DIR/department-api" +npm install +cd "$ROOT_DIR/department-web" +npm install +npm run build +sudo cp "$ROOT_DIR/department-api.service" /etc/systemd/system/department-api.service +sudo systemctl daemon-reload +sudo systemctl enable department-api.service +sudo systemctl restart department-api.service