本文章讲部署芋道系统一共分为3个工程: 1、 java 后端服务工程 2、后端管理系统的前端工程 3、商城微信小程序
也会讲到遇到的坑
第一 部署 java 后端服务工程
买的三丰云,三年1500不到,挺合适
遇到的坑是:
1、服务器在哪里,就在哪里备案,比如我在阿里云买了域名,还是要在三丰云备案,找客服备案
2、三丰云备案客服,态度不好,而且效率非常慢,没有实时提醒功能,每次需要自己去平台看,需要自己催促,备案不如阿里云方便
三丰云服务器有宝塔,直接打开宝塔 免费版
我的是 9.4.0
软件商店 安装 mysql redis docker 这些没什么好说的
提一下网络:java 服务需要链接 mysql redis , 可以网上搜下 一般有2种常用的,一种是自己建立一套网络,让 java redis mysql 宿主机 在同一个网络下,另一种是直接使用 宿主机网络。自己百度吧,这个不难。
本地电脑要链接mysql, 为了安全,端口要做转发,这里有坑 参考 我的文章 juejin.cn/post/748820…
ssl 证书,参考我的文章 juejin.cn/post/748667…
芋道工程商城 sql 不完整 ,文档 网上找吧 或 联系我 weixing prosoul-love
开始说部署
第一种: idea 安装 docker 插件 ,运行直接把镜像推送到 服务器上
编辑配置
命令预览 docker build -f yudao-server\Dockerfile -t xiyue-server . && docker run -p 48080:48080 --name xiyue-server --network host xiyue-server
直接点击运行,就会创建镜像,推送到服务器,并且服务会启动起来
下面这个是自建网络,后来改成了和宿主机一个网络比较方便
下面的方案是在服务器上 创建 镜像包,这里有坑,据说国外把 国内的很多镜像地址都屏蔽了,比如 清华,阿里,腾讯,中科院 等等,所以需要配置一个可用的 加速 URL
参考:zhuanlan.zhihu.com/p/710507502
第二种:将jar 包推送到 服务器目录中,然后通过ssh 链接到 服务器,执行docke 命令创建镜像,启动服务。
为什么要说第二种呢,因为公司通知电脑上的docker 必须卸载掉,因为docker不允许商业使用
以 后端管理系统的前端工程举个例子:
项目上点击右键
然后 ,需要执行 docker builder docker run 对吧,可以在 宝塔 终端执行,或是 在 idea执行
下面是idea 执行
使用命令执行 docker build 和 docker run ....
具体命令参考下面的 deploy.sh 文件里
第三种 : 目前使用的是这种,
比如这是jar 包传上来后,这个目录里上传下 dockfile
利用 IDEA中安装Alibaba Cloud Toolkit插件:blog.csdn.net/zhuocailing…
deploy.sh 文件 主要估计是 ,停止 服务,删除服务,把之前的镜像包改名备份,基于新上传的 代码 jar 包 进行 创建新的镜像包,然后启动,如果报错,就回滚,正常情况下最后要清理下历史镜像包和错误的镜像包,只保留最近的5个包。
#!/bin/bash
# 部署路径与日志配置
PORT=48090
APP_NAME="xiyue-server-t"
LOG_DIR="/www/wwwroot/xiyue-server/logs"
# 仅在目录不存在时创建并设置权限
if [ ! -d "$LOG_DIR" ]; then
mkdir -p "$LOG_DIR"
chmod 755 "$LOG_DIR"
echo "已创建日志目录并设置权限: $LOG_DIR"
else
echo "日志目录已存在: $LOG_DIR"
fi
# 停止并删除旧容器
docker stop $APP_NAME 2>/dev/null && echo "服务已停止" || echo "服务未运行"
docker rm -f $APP_NAME 2>/dev/null && echo "容器已删除"
# 备份旧镜像(精确到分钟)
timestamp=$(date +%Y%m%d-%H%M)
docker tag $APP_NAME:latest $APP_NAME-$timestamp:backup 2>/dev/null
echo "旧镜像已备份为 $APP_NAME-$timestamp:backup"
# 构建新镜像(强制禁用缓存)
if ! docker build --no-cache --progress=plain -t $APP_NAME:new .; then
echo "=== 构建失败,执行回滚 ==="
docker rmi $APP_NAME:new 2>/dev/null
docker tag $APP_NAME-$timestamp:backup $APP_NAME:latest
# 启动旧版本服务
docker run -d --name $APP_NAME -p $PORT:$PORT -v $LOG_DIR:/app/logs --network host $APP_NAME:latest
docker logs -f $APP_NAME
exit 1
fi
# 启动新容器并挂载日志目录
container_id=$(docker run -d --name $APP_NAME -p $PORT:$PORT -v $LOG_DIR:/app/logs --network host $APP_NAME:new)
timeout 130s docker logs -f $container_id
# 验证容器状态
if [ $(docker inspect -f '{{.State.ExitCode}}' $container_id) -ne 0 ]; then
echo "=== 新容器运行失败,执行回滚 ==="
docker tag $APP_NAME:new $APP_NAME:error
docker rm -f $APP_NAME
docker tag $APP_NAME-$timestamp:backup $APP_NAME:latest
docker run -d --name $APP_NAME -p $PORT:$PORT -v $LOG_DIR:/app/logs --network host $APP_NAME:latest
docker logs -f $APP_NAME
else
echo "=== 新镜像运行成功,更新标签 ==="
docker tag $APP_NAME:new $APP_NAME:latest
docker rmi $APP_NAME:new 2>/dev/null
fi
# 清理旧备份(保留最近5个)
docker images --format "{{.ID}} {{.Repository}}:{{.Tag}} {{.CreatedAt}}" \
| grep "$APP_NAME.*backup" \
| sort -k3 -r \
| awk 'NR>5 {print $1}' \
| xargs docker rmi --force 2>/dev/null
# 清理错误标签镜像
docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}" | grep "$APP_NAME:error") 2>/dev/null
也可以参考下 blog.csdn.net/m0_73794235…
接着说说前端工程的部署 , 后台管理系统前端页面工程
先运行下图的命令 build:prod,生成一个 dist-prod 文件夹,这就是前端页面文件
模仿后端java 工程,搞个 dockerfile
# 使用 Nginx 镜像作为部署阶段
FROM nginx:alpine
# 设置时区
ENV TZ=Asia/Shanghai
# 创建 SSL 证书目录
RUN mkdir -p /etc/nginx/ssl
# 复制 Nginx 配置文件
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
# 复制 SSL 证书文件
COPY sharehealthlife.top.pem /etc/nginx/ssl/
COPY sharehealthlife.top.key /etc/nginx/ssl/
COPY xy.sharehealthlife.top.pem /etc/nginx/ssl/
COPY xy.sharehealthlife.top.key /etc/nginx/ssl/
# 从构建阶段复制构建好的静态文件到 Nginx 的静态文件目录
#COPY --from=build-stage /admin/dist-prod /usr/share/nginx/html
COPY dist-prod /usr/share/nginx/html
# 暴露端口
EXPOSE 80 443
这种方式就是 在 docker 里 启动一个 nginx ,和 宝塔安装的 nginx 会有冲突,只可用一种。我开始用的这种,后来改了。
部署也是两种方式
第一种 dokcer 启动
注意:红框里就是执行了build:prod ,相当于上面提到的的执行,有这一步,上边图里就不用执行了。
--max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode prod
第二种 把 dist-prod 文件夹 通过 ssh 传到 服务器目录,然后 宝塔里的nginx 做 映射
nginx.conf 配置
location / { ## 前端项目
root /www/wwwroot/xiyue-admin/;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /admin-api/ { ## 后端项目 - 管理后台
proxy_pass http://127.0.0.1:48080/admin-api/; ## xiyue-server 是--network=my-network模式使用 需要设置为后端项目所在服务器的 IP
# proxy_pass http://xiyue-server:48080/admin-api/; ## xiyue-server 是--network=my-network模式使用 需要设置为后端项目所在服务器的 IP
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /app-api/ { ## 后端项目 - 微信小程序访问
proxy_pass http://127.0.0.1:48080/app-api/; ## 重要!!!proxy_pass 需要设置为后端项目所在服务器的 IP
# proxy_pass http://xiyue-server:48080/app-api/; ## 重要!!!proxy_pass 需要设置为后端项目所在服务器的 IP
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
127.0.0.1 之所以能用这个,是因为使用了 宿主机网络
这个是芋道 websocket的配置
location /infra/ws {
proxy_pass http://127.0.0.1:48080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
下面说 芋道 商城 小程序 :
下载下来代码后,通过 hbuilder 打开, 修改 appid
需要先 安装 微信开发者工具 ,运行到 微信开发者工具
微信开发者工具怎么使用,上网学去吧
微信小程序平台 需要配置 域名 才能访问
坑也是挺多
订单管理需要配置 path
客户在小程序买了东西,下来订单,在微信小程序平台 也是需要点击发货的
我把后台管理系统里的 订单 发货 改造了下,点击发货的时候 ,直接调用 微信都接口,进行发货,就不用到微信小程序平台上 点击 发货啦。