1.新建流水线,选择部署到阿里云ecs

2.添加流水线源,我的代码在码云,其他默认即可

3.删除Java 代码扫描和Maven 单元测试,删完后测试这一步就没了

4.java构建上传,jdk版本根据自己项目选择,maven尽量选择最新

执行命令如下,多模块打包一定要install

mvn clean install -Dmaven.test.skip=true

上传方式选择公共空间,打包路径根据自己的项目结构修改

项目结构如下

5.主机部署,制品和主机组跟着提示选择或新建

部署脚本如下

cd /home/admin/app && tar zxvf ./package.tgz
cat > Dockerfile << 'EOF'
FROM bellsoft/liberica-openjdk-rocky:17.0.16-cds
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV APP_PATH=/apps
WORKDIR $APP_PATH
ADD *.jar $APP_PATH/app.jar
ENV PARAMS="--spring.profiles.active=prod"
EXPOSE 8090
SHELL ["/bin/bash", "-c"]
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC -jar app.jar ${PARAMS}
EOF
image_name=ez-im-server
id=$(docker ps -a | grep ${image_name} | awk '{print $1}')
if [ -n "$id" ]; then
  docker rm -f $id
fi
id=$(docker images | grep ${image_name} | awk '{print $3}')
if [ -n "$id" ]; then
  docker rmi -f $id
fi
docker build -t ${image_name} .
docker compose -f /docker/docker-compose.yml up -d ${image_name}

这样流水线就搭建好了


成果展示

docker-compose.yml如下

services:
  mysql:
    image: mysql:8.0.42
    container_name: mysql
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      # root 密码
      MYSQL_ROOT_PASSWORD: 123456
    ports:
      - "3306:3306"
    volumes:
      # 数据挂载
      - /docker/mysql/data/:/var/lib/mysql/
      # 配置挂载
      - /docker/mysql/conf/:/etc/mysql/conf.d/
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    privileged: true
    network_mode: "host"

  nginx-web:
    image: nginx:1.23.4
    container_name: nginx-web
    environment:
      # 时区上海
      TZ: Asia/Shanghai
    ports:
      - "80:80"
      - "443:443"
    volumes:
      # 证书映射 - Let's Encrypt证书
      - /docker/certbot/conf:/etc/letsencrypt:ro
      # 配置文件映射
      - /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      # 页面目录
      - /docker/nginx/html:/usr/share/nginx/html
      # 日志目录
      - /docker/nginx/log:/var/log/nginx
      # Certbot验证目录
      - /docker/nginx/webroot:/var/www/certbot:ro
    privileged: true
    network_mode: "host"

  certbot:
    image: certbot/certbot
    container_name: certbot
    volumes:
      # 证书存储(与 Nginx 共享)
      - /docker/certbot/conf:/etc/letsencrypt
      - /docker/nginx/webroot:/var/www/certbot
    profiles:
      - tools

  redis:
    image: redis:7.2.8
    container_name: redis
    ports:
      - "6379:6379"
    environment:
      # 时区上海
      TZ: Asia/Shanghai
    volumes:
      # 配置文件
      - /docker/redis/conf:/redis/config:rw
      # 数据文件
      - /docker/redis/data/:/redis/data/:rw
    command: "redis-server /redis/config/redis.conf"
    privileged: true
    network_mode: "host"

  minio:
    image: minio/minio:RELEASE.2025-04-22T22-12-26Z
    container_name: minio
    ports:
      # api 端口
      - "9000:9000"
      # 控制台端口
      - "9001:9001"
    environment:
      # 时区上海
      TZ: Asia/Shanghai
      # 管理后台用户名
      MINIO_ROOT_USER: ruoyi
      # 管理后台密码,最小8个字符
      MINIO_ROOT_PASSWORD: ruoyi123
      # https需要指定域名
      #MINIO_SERVER_URL: "https://xxx.com:9000"
      #MINIO_BROWSER_REDIRECT_URL: "https://xxx.com:9001"
      # 开启压缩 on 开启 off 关闭
      MINIO_COMPRESS: "off"
      # 扩展名 .pdf,.doc 为空 所有类型均压缩
      MINIO_COMPRESS_EXTENSIONS: ""
      # mime 类型 application/pdf 为空 所有类型均压缩
      MINIO_COMPRESS_MIME_TYPES: ""
    volumes:
      # 映射当前目录下的data目录至容器内/data目录
      - /docker/minio/data:/data
      # 映射配置目录
      - /docker/minio/config:/root/.minio/
    command: server --address ':9000' --console-address ':9001' /data  # 指定容器中的目录 /data
    privileged: true
    network_mode: "host"

  ry-admin:
    image: ry-admin:latest
    container_name: ry-admin
    environment:
      TZ: Asia/Shanghai
      SERVER_PORT: 8080
      SNAIL_PORT: 28080
    volumes:
      - /docker/ry-admin/logs/:/apps/logs/
    privileged: true
    network_mode: "host"

  ry-job:
    image: ry-job:latest
    container_name: ry-job
    environment:
      TZ: Asia/Shanghai
    ports:
      - "8800:8800"
      - "17888:17888"
    volumes:
      - /docker/ry-job/logs/:/apps/logs
    privileged: true
    network_mode: "host"

欢迎留言讨论


附: 前端构建过程, 以plus-ui为例

修改应用访问路径 '/' -> '/ry/' ,因为我们会部署到nginx/html/ry目录, 推送代码到仓库

1.创建node流水线

2.选择仓库和分支

3.删除JavaScript 代码扫描 和 Node.js 单元测试

4.nodejs构建, 注意选择前端匹配的node版本

执行命令

npm install --registry=https://registry.npmmirror.com
npm run build:prod

构建物上传

5.主机部署

tar zxvf /home/admin/app/ry/ry-ui/package.tgz -C /docker/nginx/html/ry/

6.修改nginx配置, 添加/ry转发规则

worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    # 可以根据业务并发量适当调高
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    # 高效传输文件
    sendfile        on;
    # 长连接超时时间
    keepalive_timeout  65;
    # 单连接最大请求数,提高长连接复用率
    keepalive_requests 100000;
    # 限制body大小
    client_max_body_size 100m;
    client_header_buffer_size 32k;
    client_body_buffer_size   512k;
    # 开启静态资源压缩
    gzip_static on;
    # 连接数限制 (防御类配置) 10m 一般够用了,能存储上万 IP 的计数
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name zone=perserver:10m;
    # 隐藏 nginx 版本号,防止暴露版本信息
    server_tokens off;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    upstream ry-admin {
        server 127.0.0.1:8080;
    }

    upstream ry-job {
        server 127.0.0.1:8800;
    }

    server {
          listen 443 ssl http2;
          server_name  jlstu.vip www.jlstu.vip;

          # SSL证书 - Let's Encrypt
          ssl_certificate /etc/letsencrypt/live/jlstu.vip/fullchain.pem;
          ssl_certificate_key /etc/letsencrypt/live/jlstu.vip/privkey.pem;

          # SSL配置
          ssl_session_timeout 1d;
          ssl_session_cache shared:SSL:50m;
          ssl_session_tickets off;
          ssl_protocols TLSv1.2 TLSv1.3;
          ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
          ssl_prefer_server_ciphers off;

          add_header Strict-Transport-Security "max-age=63072000" always;

        location /ry {
            root   /usr/share/nginx/html; # docker映射路径 不允许更改
            try_files $uri $uri/ /ry/index.html;
            index  index.html index.htm;
        }

        location / {
            root   /usr/share/nginx/html; # docker映射路径 不允许更改
            try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }

        location /prod-api/ {
            # 设置客户端请求头中的 Host 信息(保持原始 Host)
            proxy_set_header Host $http_host;
            # 获取客户端真实 IP
            proxy_set_header X-Real-IP $remote_addr;
            # 自定义头 REMOTE-HOST,记录客户端 IP
            proxy_set_header REMOTE-HOST $remote_addr;
            # 获取完整的客户端 IP 链(经过多级代理时)
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # 设置后端响应超时时间(这里是 24 小时,适合长连接/SSE)
            proxy_read_timeout 86400s;
            # SSE (Server-Sent Events) 与 WebSocket 支持参数
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            # 禁用代理缓冲,数据直接传给客户端
            proxy_buffering off;
            # 禁用代理缓存
            proxy_cache off;
            # 按 IP 限制连接数(防 CC 攻击) 小型站:10~20 就够 中型站:50~100
            limit_conn perip 20;

            # 按 Server 限制总并发连接数 根据服务器的最大并发处理能力来定 太小会限制合法用户访问,太大会占满服务器资源
            limit_conn perserver 500;
            proxy_pass http://ry-admin/;
        }

        location /snail-job/ {
            # 设置客户端请求头中的 Host 信息(保持原始 Host)
            proxy_set_header Host $http_host;
            # 获取客户端真实 IP
            proxy_set_header X-Real-IP $remote_addr;
            # 自定义头 REMOTE-HOST,记录客户端 IP
            proxy_set_header REMOTE-HOST $remote_addr;
            # 获取完整的客户端 IP 链(经过多级代理时)
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # SSE (Server-Sent Events) 与 WebSocket 支持参数
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            # 禁用代理缓冲,直接传输给客户端
            proxy_buffering off;
            # 禁用代理缓存
            proxy_cache off;
            proxy_pass http://ry-job/snail-job/;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }


      # HTTP - 重定向到HTTPS
      server {
          listen 80;
          server_name jlstu.vip www.jlstu.vip;

          location /.well-known/acme-challenge/ {
              root /var/www/certbot;
          }

          location / {
              return 301 https://$host$request_uri;
          }
      }
}

执行构建, 重启nginx, 构建成果如下

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐