Ky10-aarch64内网环境部署RPA程序及前后端(Ruoyi-vue3-FastApi)记录和总结
一、环境说明与核心挑战
- 环境特点:目标服务器为Ky10-aarch64(麒麟+arm64架构),开发者本地为Windows(amd64架构),存在架构差异导致的依赖兼容性问题。
- 核心挑战:
- arm64架构下Chrome/Chromium适配困难,需替换为Firefox
- 跨架构Docker镜像构建及迁移(Windows无法直接拉取arm64依赖)
- 内网环境需提前准备镜像及依赖包
二、RPA 程序部署试错过程
1. 第一阶段:Windows 直接打包方案(失败)
- 尝试操作 1:在 Windows 环境用 Docker 直接打包 RPA 程序,计划将镜像转移到服务器加载
- 问题:RPA 依赖浏览器,服务器(Ky10-aarch64)无法安装 Chrome/Chromium(无适配 arm64 的版本)
- 结论:Chrome/Chromium 在目标架构下不可用
- 尝试操作 2:改为在 Docker 容器内安装浏览器,绕过服务器直接安装
- 问题:Windows 为 amd64 架构,无法拉取 / 安装 arm64 架构的浏览器依赖(容器内架构与宿主机关联)
- 结论:跨架构直接安装依赖不可行
- 尝试操作 3:使用
docker-buildx构建 arm64 架构镜像,强制指定架构 - 问题:
- 虽能拉取 arm64 基础镜像,但 Python 依赖包仍需从 PyPI 下载 arm64 版本,Windows 环境下无法正常获取(PyPI 会根据宿主机架构返回包)
- 每次打包都需重新安装依赖,开发效率极低
- 结论:
docker-buildx无法解决跨架构依赖下载问题
2. 第二阶段:虚拟机中转方案(逐步解决)
- 尝试操作 1:在 Windows 部署 Ky10-aarch64 虚拟机(模拟目标环境),验证 Chromium 兼容性
- 问题:虚拟机内测试仍无法安装 Chromium(无适配 rpm 包,编译源码依赖缺失)
- 调整:放弃 Chromium,改用 Firefox
- 尝试操作 2:虚拟机内用 Docker 打包 RPA(基于
openeuler/openeuler:20.03-lts-sp3基础镜像),依赖 Docker 自动安装 Firefox - 问题:Docker 拉取的 Firefox 版本过高,与 Selenium/geckodriver 不兼容(启动报错 “browser version not supported”)
- 调整:手动下载适配的 Firefox rpm 包及依赖(需匹配 geckodriver 版本),在 Dockerfile 中手动安装
- 尝试操作 3:手动安装 Firefox 后打包镜像,执行
docker run测试 - 问题:运行时提示缺少 libstdc++ 等系统依赖(rpm 包未包含完整依赖链)
- 调整:梳理依赖关系,补充下载
libxcb、libx11等基础库 rpm 包,在 Dockerfile 中依次安装 - 最终结果:经过 3 次 Dockerfile 修改(调整依赖安装顺序、补充缺失库),镜像运行成功,RPA 脚本可正常调用 Firefox 执行任务
三、总结RPA程序部署(分阶段优化)
1. 关键依赖替换
- 浏览器选择:放弃Chrome/Chromium,改用适配arm64的Firefox(需提前准备对应rpm包及依赖)
- 驱动匹配:使用geckodriver作为Selenium驱动,确保与Firefox版本兼容
2. 镜像构建流程(基于虚拟机中转)
- 中转环境:在Windows部署可连外网的Ky10-aarch64虚拟机(模拟目标环境)
- 基础镜像:采用
openeuler/openeuler:20.03-lts-sp3(适配arm64) - 构建步骤:
- 将RPA程序拷贝至虚拟机
- 准备Python3环境、geckodriver、Firefox rpm包及依赖
- 编写Dockerfile(重点:手动指定Firefox版本,避免自动拉取过高版本)
- 构建镜像:
docker build -t rpa-app:v1.0 . - 测试运行:
docker run --rm rpa-app:v1.0(验证RPA脚本执行成功) - 保存镜像:
docker save -o rpa_app_arm64.tar rpa-app:v1.0(用于内网迁移)
三、前后端(Ruoyi-vue3-FastApi)部署全流程
1. 前期准备:镜像下载与迁移(关键:arm64架构)
| 镜像用途 | 镜像名称及标签 | 拉取命令(Windows执行) | 保存命令 |
|---|---|---|---|
| Redis缓存 | redis:7.2-alpine | docker pull --platform linux/arm64 redis:7.2-alpine | docker save -o redis_7.2_arm64.tar redis:7.2-alpine |
| MySQL数据库 | arm64v8/mysql:lts | docker pull arm64v8/mysql:lts | docker save -o mysql_lts_arm64.tar arm64v8/mysql:lts |
| Nginx服务 | nginx:alpine | docker pull --platform linux/arm64 nginx:alpine | docker save -o nginx_alpine_arm64.tar nginx:alpine |
| 后端基础环境 | python:3.10.10-bullseye | docker pull --platform linux/arm64 python:3.10.10-bullseye | docker save -o python_3.10_arm64.tar python:3.10.10-bullseye |
-
镜像导入(服务器/虚拟机执行):
▼bash复制代码docker load -i redis_7.2_arm64.tar docker load -i mysql_lts_arm64.tar docker load -i nginx_alpine_arm64.tar docker load -i python_3.10_arm64.tar
2. 基础服务部署(Redis+MySQL)
(1)Redis启动(带持久化)
▼bash复制代码docker run -d \ --name redis \ -p 6379:6379 \ -v redis-data:/data \ # 数据卷持久化,避免容器删除后数据丢失 --restart=always \ redis:7.2-alpine \ redis-server --appendonly yes # 开启AOF持久化(数据更可靠)
(2)MySQL部署(含配置优化)
-
前置目录准备:
▼bash复制代码mkdir -p /opt/mysql/{data,conf.d,logs} # 数据、配置、日志分离 chmod -R 777 /opt/mysql # 解决容器内权限不足问题(生产环境可按需调整权限) -
性能配置文件:
▼bash复制代码cat > /opt/mysql/conf.d/custom.cnf << 'EOF' [mysqld] character-set-server = utf8mb4 # 支持emoji collation-server = utf8mb4_unicode_ci max_connections = 1000 # 提高连接数 default-time-zone = '+8:00' # 时区同步 slow_query_log = 1 # 开启慢查询日志 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 # 慢查询阈值(秒) EOF -
启动容器:
▼bash复制代码docker run -d \ --name mysql \ -p 3306:3306 \ -v /opt/mysql/data:/var/lib/mysql \ -v /opt/mysql/conf.d:/etc/mysql/conf.d \ -v /opt/mysql/logs:/var/log/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -e MYSQL_DATABASE=ruoyi_vue3 \ # 预创建数据库 --restart=always \ arm64v8/mysql:lts
3. 应用配置调整(本地修改后上传)
(1)后端配置(.env.prod)
▼ini复制代码# 数据库连接(容器名作为主机名,需与启动命令一致) mysql_host=mysql mysql_port=3306 mysql_user=root mysql_password=root mysql_db=ruoyi_vue3 # Redis连接 redis_host=redis redis_port=6379
-
端口解析兼容(
env.py):▼python复制代码@field_validator('redis_port', mode='before') def parse_redis_port(cls, value): if isinstance(value, str) and '://' in value: # 处理Docker网络格式如'tcp://172.17.0.3:6379' return int(value.split(':')[-1]) return int(value) if str(value).isdigit() else value
(2)前端配置(nginx.conf)
▼nginx复制代码server { listen 8080; # 与前端容器端口一致 location / { root /usr/share/nginx/html; index index.html; } # API请求转发到后端容器 location /api/ { proxy_pass http://ruoyi-backend:9099/; proxy_set_header Host $host; } }
4. 前后端镜像构建与启动
(1)文件上传
将以下文件传到服务器同一目录:
- 前端:
dist文件夹、前端Dockerfile(基于nginx:alpine)、nginx.conf - 后端:项目代码、后端
Dockerfile(基于python:3.10.10-bullseye)
(2)构建镜像
▼bash复制代码# 前端镜像 cd 前端目录 docker build -t ruoyi-frontend:v1.0 . # 后端镜像(首次构建依赖安装较慢) cd 后端目录 docker build -t ruoyi-backend:v1.0 .
(3)启动服务
-
初始化数据库:
▼bash复制代码# 导入初始化SQL(需提前上传ruoyi-fastapi.sql) docker exec -i mysql mysql -u root -p'root' ruoyi_vue3 < ruoyi-fastapi.sql -
启动后端:
▼bash复制代码docker run -d \ --name ruoyi-backend \ -p 9099:9099 \ --link mysql:mysql \ # 与MySQL容器网络互通(或使用自定义网络) --link redis:redis \ --restart=always \ ruoyi-backend:v1.0 -
启动前端(推荐方案二):
-
方案一(适合频繁更新静态文件):
▼bash复制代码# 复制前端产物到宿主机 docker run --rm --name temp-frontend ruoyi-frontend:v1.0 docker cp temp-frontend:/usr/share/nginx/html/. /opt/nginx/html/ docker stop temp-frontend # 启动Nginx docker run -d --name nginx -p 8080:8080 -v /opt/nginx/html:/usr/share/nginx/html --restart=always nginx:alpine -
方案二(内置Nginx,快速部署):
▼bash复制代码docker run -d \ --name ruoyi-frontend \ -p 8080:8080 \ --restart=always \ ruoyi-frontend:v1.0
-
5. 内网最终部署(迁移步骤)
-
镜像迁移:将虚拟机中构建的镜像(RPA、前后端、基础镜像)通过
docker save导出,传输至内网服务器后用docker load -i 镜像.tar导入。 -
服务启动:按上述步骤依次启动Redis、MySQL、初始化数据库、启动前后端及RPA容器。
-
验证:
▼bash复制代码docker ps # 检查所有容器状态 docker logs ruoyi-backend # 查看后端日志(排查启动错误) curl http://localhost:8080 # 验证前端访问
四、部署清单与注意事项
1. 必备镜像清单
| 镜像名称 | 标签 | 架构 | 来源 |
|---|---|---|---|
| ruoyi-backend | v1.0 | arm64 | 自定义构建 |
| ruoyi-frontend | v1.0 | arm64 | 自定义构建 |
| rpa-app | v1.0 | arm64 | 自定义构建 |
| arm64v8/mysql | lts | arm64 | 官方镜像 |
| redis | 7.2-alpine | arm64 | 官方镜像 |
| nginx | alpine | arm64 | 官方镜像 |
| python | 3.10.10-bullseye | arm64 | 官方镜像 |
2. 注意事项
- 所有镜像必须指定
arm64架构,避免与amd64混淆 - 容器间通信优先使用
--link或自定义网络(docker network create) - 敏感配置(如密码)建议通过环境变量注入,避免硬编码
- 首次部署后建议备份MySQL数据卷和关键镜像
通过以上优化,流程更清晰,关键步骤补充了注意事项和兼容性处理,便于在Ky10-aarch64内网环境快速复现部署。
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
