目录
- 〇、迁移来源盘点
- 一、购买资源(具体配置)
- 二、网络与安全组(先做,省得后面连不上)
- 三、初始化 RDS(建账号、建库、导数据)
- 四、初始化 ECS1(装环境 + 部署前后端)
- 五、复制到 ECS2
- 六、配置 SLB
- 七、配置 SLS 日志(替代 ELK)
- 八、验收清单(5 条标准,逐条给出证据)
- 九、收尾
📌 摘要
本文档完整记录将本地 Docker 部署的若依系统(RuoYi-Vue 3.9.1)迁移至阿里云高可用架构的实施过程:两台 ECS 分别承载 Nginx 前端与 SpringBoot 后端,公网 CLB 提供负载均衡与 HTTP 健康检查,MySQL 5.7 整库迁移至 RDS,缓存切换云 Redis,ELK 日志方案由 SLS 替代(Logtail 采集、保留 30 天)。RDS 与云 Redis 仅内网可达,通过安全组与白名单实现最小授权,停止任意一台 ECS 业务不中断。
若依项目上云迁移实施文档(阿里云)
目的:把本地虚拟机 192.168.64.56 上 Docker 部署的若依(RuoYi-Vue 3.9.1)迁移到阿里云,
架构升级为:2 台 ECS + SLB 负载均衡 + RDS MySQL + 云 Redis + SLS 日志服务,全内网通信。
〇、迁移来源盘点
本地 192.168.64.56(CentOS 7.9,Docker 环境)上的若依栈:
| 组件 | 本地现状 | 迁移去向 |
|---|---|---|
| 前端 Nginx | 容器 ruoyi-web(nginx:1.25.3,宿主机 8888 端口) | ECS 上 yum 安装 Nginx |
| 后端 | 容器 java.server(ruoyi-java 镜像,8080) | ECS 上 java -jar 直接运行 |
| MySQL | 容器 mysql.server(mysql:5.7,数据卷 /opt/mysql-data4) | 阿里云 RDS MySQL 5.7 |
| Redis | 容器 redis.server(无密码,仅 18 个缓存键) | 阿里云云 Redis(缓存无需迁数据) |
| ELK | 容器 es/logstash/kibana/filebeat(已停) | 阿里云 SLS(Logtail 采集) |
| 数据库 | 库名 ry-vue(注意带横线),utf8mb4,30 张表,2 个用户 | 整库导出→导入 RDS |
四份物料我已从 .56 导出,放在 Mac 桌面若依上云迁移/物料/ 目录,直接用:
| 文件 | 说明 |
|---|---|
| ruoyi-admin.jar(85M) | 后端成品包(2026-08-20 构建,无需重新 mvn 打包) |
| dist/(7M) | 前端成品(已含 /prod-api 前缀,无需重新 npm build) |
| ry-vue-mysql57.sql(62K) | 全库导出(30 张表,已去掉建库语句,专供 RDS 导入) |
| application-cloud.yml | 云上外置配置模板(连 RDS/云 Redis,替换占位符即可) |
| nginx.conf | ECS 上 Nginx 的完整配置(前端 + /prod-api 反代 8080) |
| start-ruoyi.sh | 后端启动脚本 |
| ruoyi-backend.service | systemd 开机自启服务文件 |
核心思路(记这一句):jar 和 dist 都是现成的,不在云上重新编译;数据库/Redis 地址用外置 application-cloud.yml 覆盖(Spring 的 cloud profile 优先级高于 jar 内配置),所以 jar 一个字节都不用改。
图 1
图 2
一、购买资源(具体配置)
总原则:同一地域(推荐华东1-杭州)、同一 VPC、全部按量付费(做完就释放省钱)。
打开阿里云官网,在搜索框里输入ecs
图 3
图 4
图 5
1.1 两台 ECS
控制台 → 云服务器 ECS → 创建实例,买 2 台(可以先买 1 台,配置好后再"更换系统盘/复制配置",但实验直接买 2 台最省事):
| 配置项 | 选择 |
|---|---|
| 计费模式 | 按量付费 |
| 地域 | 华东 1(杭州)⭐ 所有资源必须同地域 |
| 可用区 | 随机/任意(讲究高可用可两台分属两个可用区) |
| 实例规格 | 2 vCPU / 4 GiB(如 ecs.e-c1m2.large 或 ecs.s6-c1m2.large,经济型即可) |
| 镜像 | CentOS 7.9 64 位 |
| 系统盘 | 40 GiB,高效云盘/ESSD |
| 带宽 | 分配公网 IPv4,按使用流量,峰值 5 Mbps(仅为传输文件用,正式流量走 SLB) |
| 安全组 | 新建,名字 ruoyi-sg(规则见第二节) |
| 登录凭证 | 自定义密码(记牢,下面用 <root 密码 > 代称) |
图 6
点击立即购买
图 7
按量付费对于实验来说比较便宜。
图 8
图 9
这里的话我们创建一个专有网络
图 10
图 11
图 12
图 13
图 14
图 15
图 16
图 17
图 18
没有密钥对的创建一个
图 19
图 20
图 21
图 22
图 23
图 24
图 25
图 26
图 27
图 28
图 29
图 30
1.2 RDS MySQL(内网)
控制台 → 云数据库 RDS → 创建实例:
| 配置项 | 选择 |
|---|---|
| 计费 | 按量付费 |
| 地域/可用区 | 华东 1(杭州),与 ECS 相同 VPC |
| 数据库类型/版本 | MySQL 5.7(与本地 5.7 对齐) |
| 系列 | 基础系列(实验够用;预算够选高可用系列更符合"生产"话术) |
| 规格 | 通用型 1 核 2 GiB(入门最小规格) |
| 存储 | 20 GiB ESSD |
| 网络 | VPC 内网(不放公网 IP) |
兜底:若控制台里 MySQL 5.7 已停售/无货,直接选 MySQL 8.0 基础系列,其余配置不变——若依 3.9.1 的数据库驱动兼容 8.0,后面导入和连接步骤完全一样。
图 31
图 32
图 33
图 34
图 35
图 36
因为是实验环境目的主要是做实验,所以选个最便宜的就行了,我这个P L零最便宜,所以选这个
图 37
图 38
图 39
图 40
1.3 云 Redis(内网)
控制台 → 云数据库 Redis 版 → 创建实例:
| 配置项 | 选择 |
|---|---|
| 计费 | 按量付费 |
| 地域 | 华东 1(杭州),同 VPC |
| 版本 | Redis 6.0(社区版),兼容性没问题 |
| 架构/规格 | 标准版(主从),1 GiB |
| 网络 | VPC 内网 |
| 密码 | 创建时设置(记牢,下面用 < 云 Redis 密码 > 代称) |
图 41
图 42
图 43
图 44
图 45
图 46
图 47
图 48
1.4 SLB 负载均衡
控制台 → 负载均衡 CLB → 创建实例:
| 配置项 | 选择 |
|---|---|
| 计费 | 按量付费 |
| 地域 | 华东 1(杭州) |
| 实例类型 | 公网(会自动分配一个公网 IP,即用户访问入口 <SLB 公网 IP>) |
| 规格 | 性能保障型 slb.s1.small(最小规格) |
图 49
图 50
图 51
图 52
图 53
图 54
图 55
图 56
1.5 SLS 日志服务
控制台 → 日志服务 SLS:
费用预估(按量,做完即释放)
全部按量计费:做完立刻释放的话一般就几块钱(大头是少量流量费);挂着不管一天约 30~60 元。部署完成后记得把资源全部释放,尤其 RDS/Redis 按量计费挂着就扣钱。
图 57
图 58
图 59
图 60
图 61
图 62
然后点击进入控制台
图 63
图 64
图 65
图 66
点击创建logstore
点这个进去,
图 67
图 68
图 69
图 70
图 71
点这个➕可以创建logstore
二、网络与安全组(先做,省得后面连不上)
2.1 ECS 安全组 ruoyi-sg(两台 ECS 都用这个)
入方向规则:
| 协议 | 端口 | 授权对象 | 说明 |
|---|---|---|---|
| TCP | 22 | 你 Mac 的公网 IP/32(查询:百度搜"我的IP") | SSH 运维,别开 0.0.0.0/0 |
| TCP | 80 | 0.0.0.0/0 | 给 SLB 转发 + 健康检查 |
| TCP | 443 | 0.0.0.0/0 | 预留 HTTPS |
| TCP | 8080 | VPC 网段(如 172.16.0.0/12,控制台能选) | 后端仅内网可访问 |
图 72
图 73
图 74
这个加一条80和443
图 75
图 76
图 77
图 78
2.2 RDS 白名单
RDS 实例详情 → 白名单与安全组 → 白名单设置 → default 分组:添加两台 ECS 的内网 IP(精确到 /32 两条)。购买时选择“加入白名单:是”的,default 分组已自动包含 VPC 网段。
不申请外网地址——这就是"数据库无公网"的验收点。
图 79
图 80
2.3 云 Redis 白名单
同样操作:白名单加两台 ECS 内网 IP,不开外网。
购买完在 ECS 控制台记下:<ECS1公网IP>、<ECS1内网IP>、<ECS2公网IP>、<ECS2内网IP>,以及 RDS/Redis 控制台里的内网连接地址 <RDS内网地址>(形如 rm-xxxxx.mysql.rds.aliyuncs.com)、<云Redis内网地址>(形如 r-xxxxx.redis.rds.aliyuncs.com)。下文占位符都换成这些值。
图 81
这个就算好了
图 82
三、初始化 RDS(建账号、建库、导数据)
兜底:若控制台建库时不接受带横线的库名,在 ECS1 装好 mysql 客户端后用命令建(高权限账号有权限):
图 83
图 84
图 85
图 86
图 87
mysql -h <RDS内网地址> -u ruoyi -p'你的RDS密码' -e "CREATE DATABASE \`ry-vue\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
# 在 Mac 上:把 SQL 传到 ECS1
cd ~/Desktop/若依上云迁移/物料 scp ry-vue-mysql57.sql root@<ECS1公网IP>:/root/
# 在 ECS1 上:导入 RDS
mysql -h <RDS内网地址> -u ruoyi -p'RDS账号密码' ry-vue < /root/ry-vue-mysql57.sql
# 验证:30 张表、2 个用户
mysql -h <RDS内网地址> -u ruoyi -p'RDS账号密码' -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='ry-vue'; SELECT user_name FROM \`ry-vue\`.sys_user;"
四、初始化 ECS1(装环境 + 部署前后端)
SSH 登录:ssh root@<ECS1公网IP>
密钥对登陆也行
ssh -i 密钥地址 root@ip
# 1. 第一次用先改权限(只需一次)
chmod 400 ~/Desktop/test1.pem
# 2. 登录 ECS(IP 换成你的公网 IP)
ssh -i ~/Desktop/test1.pem root@<ECS公网IP>
图 88
4.1 装基础软件
# 关掉系统防火墙(端口管控交给安全组,避免双重拦截)
systemctl stop firewalld && systemctl disable firewalld
# Nginx + JDK8 + mysql 客户端
yum install -y epel-release yum install -y nginx java-1.8.0-openjdk java-1.8.0-openjdk-devel mariadb vim wget systemctl enable nginx
# 关键:允许 Nginx 反代后端 8080(本地部署时踩过 SELinux 这个坑)
setsebool -P httpd_can_network_connect 1
万一 yum 报源错误(CentOS 7 已停止官方维护),换阿里云源再装:curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum clean all && yum makecache
图 89
图 90
图 91
图 92
4.2 建目录、传文件
mkdir -p /opt/ruoyi/logs /usr/share/nginx/html
在 Mac 上传物料(两条都执行):
cd ~/Desktop/若依上云迁移/物料
# 后端 jar + 配置文件
scp -i ~/Desktop/test1.pem ruoyi-admin.jar application-cloud.yml start-ruoyi.sh ruoyi-backend.service nginx.conf root@<ECS1公网IP>:/opt/ruoyi/ scp -r dist root@<ECS1公网IP>:/opt/ruoyi/
图 93
图 94
图 95
图 96
图 97
4.3 改外置配置(整个迁移唯一要动脑的一步)
在 ECS1 上编辑 /opt/ruoyi/application-cloud.yml,把 4 个占位符换成真实值:
<RDS内网地址>、<RDS账号密码>、<云Redis内网地址>、<云Redis密码>。
顺便把文件末尾加一行(原配置里上传路径是 Windows 风格的 D:/ 盘符,云上改成 Linux 路径):
ruoyi:
profile: /opt/ruoyi/uploadPath
图 98
图 99
图 100
图 101
4.4 部署前端 + Nginx
rm -rf /usr/share/nginx/html/* cp -r /opt/ruoyi/dist/* /usr/share/nginx/html/ cp /opt/ruoyi/nginx.conf /etc/nginx/nginx.conf nginx -t && systemctl restart nginx
(物料里的 nginx.conf 内容:location / 指向 /usr/share/nginx/html,location /prod-api/ 反代 http://127.0.0.1:8080/——即 Nginx 和后端同机。)
图 102
图 103
4.5 启动后端(二选一)
方式 A——脚本(调试用):
chmod +x /opt/ruoyi/start-ruoyi.sh && /opt/ruoyi/start-ruoyi.sh
方式 B——systemd(推荐,宕机自动拉起、开机自启):
cp /opt/ruoyi/ruoyi-backend.service /etc/systemd/system/ systemctl daemon-reload systemctl enable --now ruoyi-backend
图 104
图 105
4.6 单机自检(不过关别往下走)
# 后端起来了(8080 在监听)
netstat -lntp | grep 8080
# 验证码接口直连 200
curl -i http://127.0.0.1:8080/captchaImage
# 走 Nginx 也 200(前端页面 + 反代都通)
curl -I http://127.0.0.1/ curl -i http://127.0.0.1/prod-api/captchaImage
任何一步不对,看日志:
journalctl -u ruoyi-backend -n 50 # 后端启动日志 tail -50 /home/ruoyi/logs/sys-error.log # 应用错误日志 tail -20 /var/log/nginx/error.log # Nginx 错误
排障顺序(本地踩过的坑照搬):页面没验证码 → 先 curl 127.0.0.1:8080/captchaImage(不通是后端/Redis 连不上),再 curl 127.0.0.1/prod-api/captchaImage(不通是 SELinux 或 Nginx 反代),别一上来就怀疑 Redis。
这里前面做错了,ecs和rds云redis不是同一个vpc
图 106
补救一下,添加一个新的交换机
Rds更换一下
图 107
图 108
然后是redis
图 109
图 110
图 111
图 112
4.7 RDS 导入
回到第三节第 3 步执行导入和验证。
# 在 Mac 上:把 SQL 传到 ECS1
图 113
cd ~/Desktop/若依上云迁移/物料 scp ry-vue-mysql57.sql root@<ECS1公网IP>:/root/
# 在 ECS1 上:导入 RDS
mysql -h <RDS内网地址> -u ruoyi -p'RDS账号密码' ry-vue < /root/ry-vue-mysql57.sql
# 验证:30 张表、2 个用户
mysql -h <RDS内网地址> -u ruoyi -p'RDS账号密码' -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='ry-vue'; SELECT user_name FROM \`ry-vue\`.sys_user;" cd ~/Desktop/若依上云迁移/物料 scp -i ~/Desktop/test1.pem ry-vue-mysql57.sql root@120.26.180.40:/root/
在 ECS 上执行导入(密码回车后交互输入,填你 application-cloud.yml 里那个数据库密码):RuoYi@2026
mysql -h rm-bp194kr55nwqwcu7p.mysql.rds.aliyuncs.com -u ruoyi -p --default-character-set=utf8mb4 ry-vue < /root/ry-vue-mysql57.sql
验证(应该看到表数 30、用户 admin 和 ry):
mysql -h rm-bp194kr55nwqwcu7p.mysql.rds.aliyuncs.com -u ruoyi -p -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='ry-vue'; SELECT user_name FROM \`ry-vue\`.sys_user;"
导完不用手动重启——systemd 每 5 秒自动重拉后端,表一在它就能起来。等半分钟再跑一遍:
netstat -lntp | grep 8080
curl -i http://127.0.0.1:8080/captchaImage curl -i http://127.0.0.1/prod-api/captchaImage
出 200 + JSON 就通了。到那一步整个单机部署就完成了
图 114
图 115
systemctl restart ruoyi-backend
# 等 40 秒左右,然后:
netstat -lntp | grep 8080
curl -i http://127.0.0.1/prod-api/captchaImage
图 116
图 117
图 118
五、复制到 ECS2
对 ECS2 重复第四节的 4.1~4.6(Mac 上把 scp 目标换成 <ECS2公网IP> 即可)。
RDS 只需导入一次,ECS2 跳过第三节。
偷懒法(可选):ECS1 配好后"实例→创建自定义镜像",再用该镜像开 ECS2。实验场景直接重复 scp 更直观。
这次我们采用自定义镜像(克隆实例)的方式创建第二台 ECS:
图 119
图 120
图 121
图 122
新实例出现后,先改 RDS/Redis 白名单 → test1 分组改成 172.16.0.0/12,再启动/验证
图 123
图 124
六、配置 SLB
CLB 控制台 → 实例 <SLB公网IP>:
配置完约 10 秒生效,验证:
curl -I http://<SLB公网IP>/ # 期待 200 curl -i http://<SLB公网IP>/prod-api/captchaImage # 期待 200 + JSON
浏览器访问 http://<SLB公网IP>,登录 admin / admin123。
图 125
图 126
图 127
图 128
图 129
图 130
图 131
图 132
图 133
图 134
图 135
图 136
图 137
图 138
七、配置 SLS 日志(替代 ELK)
7.1 两台 ECS 各装一次 Logtail
wget http://logtail-release-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/linux64/logtail.sh -O logtail.sh chmod 755 logtail.sh
./logtail.sh install cn-hangzhou
地域换了就把 cn-hangzhou 对应替换(控制台接入数据 → Logtail 有一键安装命令可直接复制)。
图 139
图 140
图 141
7.2 控制台配置采集
SLS 控制台 → Project ruoyi-prod:
nginx-access nginx-log
| 采集配置名 | Logstore | 日志路径设置 |
|---|---|---|
| nginx-access | nginx-log | 日志路径 /var/log/nginx,文件名 *.log(access 和 error 一起收) |
| ruoyi-app | ruoyi-app | 日志路径 /home/ruoyi/logs,文件名 *.log(sys-info/sys-error/sys-user 全收) |
一个采集配置只能填一个"目录 + 文件名",文件名支持 * 通配;/home/ruoyi/logs 下只有若依的日志,*.log 一条配置全收。
(后端 logback 输出在 /home/ruoyi/logs/,jar 内置配置,目录自动创建,和本地容器里的路径一致。)
图 142
图 143
图 144
图 145
图 146
图 147
图 148
图 149
图 150
然后ruoyiapp的
图 151
图 152
图 153
图 154
图 155
八、验收清单(5 条标准,逐条给出证据)
| # | 验收项 | 怎么验 |
|---|---|---|
| 1 | SLB 公网 IP 访问若依正常 | 浏览器开 http://<SLB 公网 IP>,出验证码、admin/admin123 能登 |
| 2 | RDS/Redis 只有内网能连 | Mac 上 nc -vz <RDS 内网地址 > 3306 不通(它压根没公网地址);ECS 上 mysql -h <RDS 内网地址 > -u ruoyi -p 能连。Redis 同理 |
| 3 | SLS 能查到日志 | SLS 控制台查询 nginx-log:刷新几次页面再搜,有 access 记录;登录一次系统,ruoyi-app 里出现 sys-user 日志 |
| 4 | 停一台 ECS 业务不中断 | 控制台把 ECS1 停机 → SLB 健康检查约 10~30 秒摘除它 → 浏览器持续刷新 http://<SLB 公网 IP> 全程可用;再开机恢复双机 |
截图清单(验收素材):资源列表全景(ECS×2/RDS/Redis/CLB/SLS 同地域)、SLB 监听+健康检查状态为"正常"、SLS 查询命中页面、ECS1 停机期间页面正常访问的录屏/截图、架构图(见架构图.html)。
停止一台 ECS 停机验收(停机期间页面正常访问):
图 156
图 157
图 158
图 159
图 160
图 161
图 162
图 163
图 164
刷新一下,能正常访问
九、收尾
附:一页总结(发布口径)
本地 LVS+Nginx+SpringBoot+MySQL+Redis+ELK 的若依环境,迁移为阿里云高可用架构:2 台 ECS(CentOS 7.9,Nginx+jar 前后端同机部署)挂载公网 CLB,MySQL 5.7 整库迁移至 RDS,缓存切换云 Redis,ELK 以 SLS(Logtail 采集,保留 30 天)替代。RDS/Redis 仅内网可达,ECS 业务端口受安全组收敛,停任意一台 ECS 服务不中断,实现全内网、同地域、高可用的上云迁移。