Windows 部署
Windows Server / 专业版 单机裸机 单体部署(一屏通读,右侧「本页目录」定位)。VM + Linux 微服务请改用 微服务部署。完成后看 上线文档。
00 部署方案
目标访问
- PC:
http://<CLIENT_IP>/web/ - H5:
http://<CLIENT_IP>/app/ - API:Nginx 反代,不直接暴露
48080
资源建议
| 项目 | 最低 | 推荐 |
|---|---|---|
| CPU | 4 核 | 8 核 |
| 内存 | 8 GB | 16 GB |
| 磁盘 | 100 GB | 200 GB+ SSD |
| 系统 | Win10/11 专业版或 Server 2019+ | Server 2022 |
推荐在开发机构建产物,只拷贝到客户机。
目录规划
New-Item -ItemType Directory -Force C:\ruoyi-office\app\backend
New-Item -ItemType Directory -Force C:\ruoyi-office\app\web
New-Item -ItemType Directory -Force C:\ruoyi-office\app\app
New-Item -ItemType Directory -Force C:\ruoyi-office\conf,C:\ruoyi-office\logs,C:\ruoyi-office\upload,C:\ruoyi-office\backup,C:\ruoyi-office\sql,C:\ruoyi-office\soft| 目录 | 用途 |
|---|---|
app\backend | JAR |
app\web / app\app | PC / H5 静态 |
conf | 外部 application-prod.yaml |
upload | 本地文件存储 |
sql | 初始化与增量 SQL |
安装包清单
| 软件 | 用途 | 下载 |
|---|---|---|
| JDK 17/21 | 运行后端 | https://adoptium.net/temurin/releases/ |
| MySQL 8.0 | 数据库 | https://dev.mysql.com/downloads/installer/ |
| Memurai 或 Redis for Windows | 缓存 | Memurai / tporadowski/redis |
| Nginx Windows Stable | 入口 | https://nginx.org/en/download.html |
| NSSM | 注册 Windows 服务 | https://nssm.cc/download |
| DBeaver(可选) | 导库 | https://dbeaver.io/download/ |
JDK
安装 MSI,勾选 JAVA_HOME 与 PATH。验证:
java -versionMySQL
- Installer 选 Server;端口
3306;强密码加密;服务名MySQL80开机自启。 my.ini的[mysqld]增加bind-address=127.0.0.1,然后Restart-Service MySQL80。- 不要对防火墙开放
3306。
Redis / Memurai
- 绑定
127.0.0.1,设置requirepass,不开放6379。 - Memurai:
Get-Service *memurai* - Redis for Windows:按官方文档
--service-install,redis-cli -a <密码> ping期望PONG。
Nginx
解压到 C:\nginx,确认存在 nginx.exe 与 conf\nginx.conf:
cd C:\nginx
.\nginx.exe -t
.\nginx.exe浏览器访问 http://127.0.0.1 见欢迎页后 .\nginx.exe -s stop。
建库
CREATE DATABASE IF NOT EXISTS `ruoyi-office`
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;导入
将 ruoyi-office-db/dump/latest 的 schema / static_data(或交付的等价文件)放到 C:\ruoyi-office\sql\。
cmd /c '"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -uroot -p ruoyi-office < "C:\ruoyi-office\sql\schema.sql"'
cmd /c '"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -uroot -p ruoyi-office < "C:\ruoyi-office\sql\static_data.sql"'验证:
& "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -uroot -p -e "USE ``ruoyi-office``; SHOW TABLES;"预期:可见 system_users、system_role、infra_file_config 等。
DBeaver 连接时 Host=127.0.0.1,驱动属性 allowPublicKeyRetrieval=true。
构建机产物
mvn clean package "-Dmaven.test.skip=true" "-Dskip.repackage=true" -pl yudao-server -am -Pboot
cd ruoyi-office-vben && pnpm install
pnpm -r --filter "./packages/**" --filter "./internal/**" build
cd apps/web-antd && pnpm build
cd ruoyi-office-uniapp && pnpm install && pnpm build:h5拷贝到客户机:
C:\ruoyi-office\app\backend\yudao-server.jar
C:\ruoyi-office\app\web\ ← dist 内文件(直接含 index.html)
C:\ruoyi-office\app\app\ ← H5 构建产物内文件客户构建务必 VITE_GLOB_DEMO_ENABLE=false(见上线文档)。
外部配置
新建 C:\ruoyi-office\conf\application-prod.yaml(密码换成现场值):
server:
port: 48080
spring:
datasource:
dynamic:
datasource:
master:
url: jdbc:mysql://127.0.0.1:3306/ruoyi-office?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: root
password: <DB_PASSWORD>
data:
redis:
host: 127.0.0.1
port: 6379
password: <REDIS_PASSWORD>
logging:
file:
name: C:/ruoyi-office/logs/yudao-server.log
management:
endpoints:
web:
exposure:
include: health,info
yudao:
demo: false手动冒烟
cd C:\ruoyi-office\app\backend
java -Xms1024m -Xmx4096m -jar yudao-server.jar --spring.profiles.active=prod --spring.config.additional-location=file:C:/ruoyi-office/conf/另开窗口:
Invoke-WebRequest http://127.0.0.1:48080/actuator/health预期:UP。通过后 Ctrl+C 停止,再用 NSSM 托管。
NSSM 注册后端
C:\nssm\win64\nssm.exe install YuQingBackend| 字段 | 值 |
|---|---|
| Path | ...\jdk-...\bin\java.exe |
| Startup directory | C:\ruoyi-office\app\backend |
| Arguments | -Xms512m -Xmx2048m -jar yudao-server.jar --spring.profiles.active=prod --spring.config.additional-location=file:C:/ruoyi-office/conf/ |
| Output / Error | C:\ruoyi-office\logs\backend-service.*.log |
Start-Service YuQingBackend
Get-Service YuQingBackend配置
备份后编辑 C:\nginx\conf\nginx.conf,server_name 改为 <CLIENT_IP>:
worker_processes 1;
events { worker_connections 1024; }
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
client_max_body_size 200m;
server {
listen 80;
server_name <CLIENT_IP>;
charset utf-8;
location = /web { return 301 /web/; }
location /web/ {
alias C:/ruoyi-office/app/web/;
index index.html;
try_files $uri $uri/ /web/index.html;
}
location = /app { return 301 /app/; }
location ^~ /app/ {
root C:/ruoyi-office/app;
index index.html;
try_files $uri $uri/ /app/index.html;
}
location /admin-api/ {
proxy_pass http://127.0.0.1:48080/admin-api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location = / { return 302 /web/; }
}
}cd C:\nginx
.\nginx.exe -t
.\nginx.exe用 NSSM 注册 YuQingNginx(Path=C:\nginx\nginx.exe,Startup=C:\nginx),Start-Service YuQingNginx。
本地文件存储
- 确认
C:\ruoyi-office\upload可写 - 登录后:基础设施 → 文件管理 → 文件配置
- 存储器=本地;
basePath=C:\ruoyi-office\upload;domain=http://<CLIENT_IP>;设为主配置 - 上传小文件验证目录落盘且可预览
防火墙
New-NetFirewallRule -DisplayName "YuQing HTTP 80" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
New-NetFirewallRule -DisplayName "Block YuQing Backend 48080" -Direction Inbound -Protocol TCP -LocalPort 48080 -Action Block
New-NetFirewallRule -DisplayName "Block MySQL 3306" -Direction Inbound -Protocol TCP -LocalPort 3306 -Action Block
New-NetFirewallRule -DisplayName "Block Redis 6379" -Direction Inbound -Protocol TCP -LocalPort 6379 -Action Block启停顺序
- MySQL → 2. Redis/Memurai → 3.
YuQingBackend→ 4.YuQingNginx
可选:XXL-Job
需要定时任务(考勤生成、订单过期等)时再装。原则与 Linux 单体相同:
- MySQL 建独立库:导入
xxl_job_schema.sql+xxl_job_init_oa.sql(或init_all) - 本机 Docker Desktop 仅当客户允许时跑
xxl-job-admin;许多 Windows 现场无 Docker,可改用解压版 XXL-Job 或把 Admin 部署在旁路 Linux - 后端
xxl.job.enabled=true,addresses指向 Admin 9090不对局域网其它机器以外暴露;改 Admin 默认密码
详步骤仍以 Docker 部署 XXL-Job 为准(命令在 Windows 上把路径/Docker 语法按现场调整)。
验收
- [ ]
http://127.0.0.1/web/、/app/可开 - [ ] 局域网
http://<CLIENT_IP>/web/可登录 - [ ] health UP;上传落入
upload - [ ] 刷新 SPA 子路由不 404
- [ ] 执行 上线文档(演示开关、改密、品牌)
常见问题
| 现象 | 处理 |
|---|---|
/web/ /app/ 404 | Test-Path ...\index.html;alias/root 路径与末尾 /;nginx -t |
| 页面开、接口 502 | Get-Service YuQingBackend;health;查 MySQL/Redis 密码;netstat -ano | findstr :48080 |
| 数据库连接失败 | MySQL80 是否运行;库名;application-prod.yaml 密码;bind-address |
| Redis 连接失败 | 服务名;requirepass 与配置一致;仅 127.0.0.1 |
| 上传失败 | 本地主配置、basePath、目录权限、client_max_body_size |
| 上传成功无法预览 | domain 必须是客户可访问的 http://<CLIENT_IP>,不要写 127.0.0.1:48080 |
| 局域网访问不了 | 防火墙 80;IP;Nginx 是否运行 |
日常更新
后端:备份 JAR → Stop-Service YuQingBackend → 替换 JAR → Start-Service。
前端/H5:备份 zip → 清空目录 → 拷新 dist → nginx -s reload。
库:先 mysqldump 再导增量,必要时重启后端。
备份
& "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqldump.exe" -uroot -p"<DB_PASSWORD>" --single-transaction --routines --triggers ruoyi-office > C:\ruoyi-office\backup\ruoyi-office-$(Get-Date -Format yyyyMMddHHmmss).sql
Compress-Archive C:\ruoyi-office\upload\* C:\ruoyi-office\backup\upload-$(Get-Date -Format yyyyMMddHHmmss).zip建议任务计划每日执行,并拷到异地盘。
交付记录表
| 项目 | 内容 |
|---|---|
| PC / H5 地址 | http://____/web/ · /app/ |
| 服务器 IP | |
| MySQL / Redis 密码 | (密封交接,不进 Git) |
| 管理员账号密码 | 上线立即改密 |
| 服务名 | YuQingBackend / YuQingNginx |
| 上传目录 | C:\ruoyi-office\upload |
| 部署日期 / 人员 |
