阿里云效流水线部署springboot项目-2026
3.在编写docker run命令的时候要加入这个网络,否则不能访问基础容器,然后就是--link需要的容器。2.基础容器是用docker compose一起启动的,会创建一个默认的网络docker_default。4.java构建上传,jdk版本根据自己项目选择,maven尽量选择最新。因为是用docker部署的,项目的配置文件还有几点要注意的。上传方式选择公共空间,打包路径根据自己的项目结构修
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, 构建成果如下



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