.net+vue+oracle21xe部署教程
Vue + .NET + Oracle 项目部署教程(宝塔 + Docker)
本教程介绍如何将前后端分离项目部署到 Linux 服务器,包含数据库、后端、前端三部分。
环境说明
| 组件 | 版本 |
|---|---|
| 操作系统 | Linux(Ubuntu/CentOS) |
| 面板 | 宝塔面板 |
| 数据库 | Oracle 21c XE(Docker 部署) |
| 后端 | .NET 6(独立部署) |
| 前端 | Vue 2 + Ant Design Vue |
| 容器工具 | Docker |
一、部署数据库(Oracle)
1.1 拉取 Oracle 镜像
由于 Docker Hub 在国内访问不稳定,需要使用镜像加速服务。
推荐:轩辕镜像(10 元可用很久,稳定快速)
官网:https://docker.xuanyuan.run
注册后会获得一个专属镜像域名,格式类似:xxxx.xuanyuan.run
# 使用轩辕镜像拉取dockerpull<你的轩辕镜像域名>/gvenzl/oracle-xe:21-slim1.2 启动 Oracle 容器
# 创建数据目录sudomkdir-p/opt/oracle/datasudochmod777/opt/oracle/data# 启动容器dockerrun-d\--nameoracle-xe\-p1521:1521\-eORACLE_PASSWORD=<你的密码>\-v/opt/oracle/data:/opt/oracle/oradata\<你的镜像域名>/gvenzl/oracle-xe:21-slim1.3 等待初始化
# 查看日志,等待出现 "DATABASE IS READY TO USE!"dockerlogs-foracle-xe初始化大约需要 1-2 分钟,看到DATABASE IS READY TO USE!表示成功。
1.4 创建用户和表空间
# 进入容器dockerexec-itoracle-xe sqlplus / as sysdba在 SQL*Plus 中执行:
-- 切换到 PDB 数据库(Oracle 21c 必须执行)ALTERSESSIONSETCONTAINER=XEPDB1;-- 创建表空间CREATETABLESPACE<表空间名>DATAFILE'/opt/oracle/oradata/XE/XEPDB1/<表空间名>.dbf'SIZE500M AUTOEXTENDONNEXT100M MAXSIZE UNLIMITED;-- 创建用户CREATEUSER<用户名>IDENTIFIEDBY<密码>DEFAULTTABLESPACE<表空间名>TEMPORARYTABLESPACEtemp;-- 授权GRANTCONNECT,RESOURCE,DBATO<用户名>;-- 退出EXIT;1.5 导入数据
将 SQL 文件上传到服务器,然后导入:
# 把 SQL 文件复制到容器内dockercp/path/to/your/sql_files oracle-xe:/opt/oracle/oradata/# 进入容器dockerexec-itoracle-xebash# 批量导入cd/opt/oracle/oradata/sql_filesforfin*.sql;doecho"Importing$f..."echo"EXIT"|sqlplus-S<用户名>/<密码>@localhost:1521/XEPDB1 @"$f"done# 退出容器exit1.6 验证连接
使用 DataGrip 或其他数据库工具连接:
| 字段 | 值 |
|---|---|
| 类型 | Oracle |
| 主机 | 服务器 IP |
| 端口 | 1521 |
| 连接类型 | Service Name |
| 服务名 | XEPDB1 |
| 用户名 | 你创建的用户名 |
| 密码 | 你设置的密码 |
二、部署后端(.NET 6)
2.1 本地发布(独立部署)
在本地项目目录执行:
cdwebapi# 独立部署方式发布(服务器无需安装 .NET)dotnet publish Simple.WebApi/Simple.WebApi.csproj-cRelease-rlinux-x64 --self-containedtrue-o./publish2.2 修改配置文件
编辑publish/appsettings.json,修改以下内容:
数据库连接(修改 HOST 为 localhost):
"DatabaseConfig":{"DataSource":"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XEPDB1)))","UserId":"<你的用户名>","Password":"<你的密码>"}跨域配置(添加你的服务器 IP):
"AllowCors":["http://localhost:81","http://<你的服务器IP>"]2.3 上传到服务器
将publish目录上传到服务器:
# 在服务器上创建目录sudomkdir-p/opt/项目名/webapi# 上传 publish 目录到 /opt/项目名/webapi/2.4 使用 tmux 后台运行
# 创建 tmux 会话tmux new-s<会话名># 进入项目目录并运行cd/opt/项目名/webapi/publishchmod+x Simple.WebApi ./Simple.WebApi# 分离会话:先按 Ctrl+B,松开后再按 D2.5 验证后端
访问http://<服务器IP>:5216/swagger,能看到 Swagger 文档表示成功。
三、部署前端(Vue)
3.1 修改 API 地址
编辑项目根目录的.env文件:
NODE_ENV=production VUE_APP_PREVIEW=true VUE_APP_API_BASE_URL=http://<服务器IP>:5216/api3.2 安装依赖并构建
cdweb# 安装依赖(使用淘宝镜像)npminstall--registry=https://registry.npmmirror.com --legacy-peer-deps# 构建npmrun build构建完成后会生成dist目录。
3.3 通过宝塔部署
- 登录宝塔面板
- 点击网站→添加站点
- 填写信息:
- 域名:填写服务器 IP
- 根目录:
/www/wwwroot/项目名 - PHP 版本:选纯静态
- 点击提交
3.4 上传前端文件
将本地web/dist目录里的所有文件上传到宝塔创建的站点根目录。
3.5 配置 Nginx
在宝塔中点击站点的设置→配置文件,添加以下配置:
# Vue Router history 模式(放在 root 配置下面) location / { try_files $uri $uri/ /index.html; } # API 反向代理(放在 server 块内) location /api/ { proxy_pass http://127.0.0.1:5216/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; }保存后重启站点或 Nginx。
四、验证部署
| 项目 | 访问地址 |
|---|---|
| 前端页面 | http://<服务器IP>:端口 |
| 后端 API | http://<服务器IP>:5216/api/ |
| Swagger 文档 | http://<服务器IP>:5216/swagger |
五、常见问题
Docker 拉取镜像超时
国内访问 Docker Hub 不稳定,使用镜像加速:
# 配置镜像加速(需要 sudo 权限)sudomkdir-p/etc/dockersudotee/etc/docker/daemon.json<<-'EOF' { "registry-mirrors": ["https://你的镜像域名"] } EOFsudosystemctl daemon-reloadsudosystemctl restartdockernpm install 依赖冲突
使用--legacy-peer-deps参数:
npminstall--registry=https://registry.npmmirror.com --legacy-peer-depsOracle 21c 创建用户报 ORA-65096
Oracle 21c XE 是容器数据库,需要先切换到 PDB:
ALTERSESSIONSETCONTAINER=XEPDB1;CREATEUSER<用户名>IDENTIFIEDBY<密码>DEFAULTTABLESPACE<表空间名>;后端无法连接数据库
检查appsettings.json中的HOST是否为localhost,SERVICE_NAME是否为XEPDB1。
前端页面刷新 404
确保 Nginx 配置了try_files $uri $uri/ /index.html;。
六、tmux 常用命令
# 查看所有会话tmuxls# 进入会话tmux attach-t<会话名># 分离会话# 先按 Ctrl+B,松开后再按 D# 结束会话tmux kill-session-t<会话名>