部署 芋道 系统 idea 宝塔 docker

593 阅读6分钟

本文章讲部署芋道系统一共分为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…

image.png

image.png

image.png

ssl 证书,参考我的文章 juejin.cn/post/748667…

芋道工程商城 sql 不完整 ,文档 网上找吧 或 联系我 weixing prosoul-love

开始说部署

第一种: idea 安装 docker 插件 ,运行直接把镜像推送到 服务器上

image.png

image.png

编辑配置

image.png

命令预览 docker build -f yudao-server\Dockerfile -t xiyue-server . && docker run -p 48080:48080 --name xiyue-server --network host xiyue-server

直接点击运行,就会创建镜像,推送到服务器,并且服务会启动起来

image.png

下面这个是自建网络,后来改成了和宿主机一个网络比较方便

image.png

下面的方案是在服务器上 创建 镜像包,这里有坑,据说国外把 国内的很多镜像地址都屏蔽了,比如 清华,阿里,腾讯,中科院 等等,所以需要配置一个可用的 加速 URL

参考:zhuanlan.zhihu.com/p/710507502

image.png

第二种:将jar 包推送到 服务器目录中,然后通过ssh 链接到 服务器,执行docke 命令创建镜像,启动服务。

为什么要说第二种呢,因为公司通知电脑上的docker 必须卸载掉,因为docker不允许商业使用

以 后端管理系统的前端工程举个例子:

image.png

image.png

image.png

项目上点击右键

image.png

image.png

image.png

image.png

然后 ,需要执行 docker builder docker run 对吧,可以在 宝塔 终端执行,或是 在 idea执行

下面是idea 执行

image.png

使用命令执行 docker build 和 docker run ....

具体命令参考下面的 deploy.sh 文件里

第三种 : 目前使用的是这种,

比如这是jar 包传上来后,这个目录里上传下 dockfile

利用 IDEA中安装Alibaba Cloud Toolkit插件:blog.csdn.net/zhuocailing…

image.png

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 文件夹,这就是前端页面文件 image.png

image.png

模仿后端java 工程,搞个 dockerfile

image.png


# 使用 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 ,相当于上面提到的的执行,有这一步,上边图里就不用执行了。

image.png

--max_old_space_size=4096 ./node_modules/vite/bin/vite.js build --mode prod

image.png

第二种 把 dist-prod 文件夹 通过 ssh 传到 服务器目录,然后 宝塔里的nginx 做 映射

image.png

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

image.png

需要先 安装 微信开发者工具 ,运行到 微信开发者工具

image.png

微信开发者工具怎么使用,上网学去吧

微信小程序平台 需要配置 域名 才能访问

image.png

坑也是挺多

订单管理需要配置 path

image.png

客户在小程序买了东西,下来订单,在微信小程序平台 也是需要点击发货的

image.png

我把后台管理系统里的 订单 发货 改造了下,点击发货的时候 ,直接调用 微信都接口,进行发货,就不用到微信小程序平台上 点击 发货啦。