From 9050a65e02a4ea7ca683c2933ffe5066d6ce7845 Mon Sep 17 00:00:00 2001 From: somunslotus Date: Sat, 14 Sep 2024 15:13:48 +0800 Subject: [PATCH] xx --- k8s/build-java.sh | 0 k8s/build-java.sh.bak | 25 ++++ k8s/build-node.sh | 0 k8s/build-node.sh.bak | 21 +++ k8s/build.sh | 0 k8s/build_and_deploy.sh | 0 k8s/build_and_deploy.sh.bak | 74 +++++++++++ k8s/deploy.sh | 0 k8s/deploy.sh.bak | 162 +++++++++++++++++++++++ k8s/dockerfiles/conf/nginx.conf.20240705 | 64 +++++++++ k8s/dockerfiles/conf/nginx.conf.20240909 | 131 ++++++++++++++++++ k8s/dockerfiles/conf/nginx.conf.bak | 60 +++++++++ k8s/dockerfiles/conf/nginx.conf.bak0719 | 110 +++++++++++++++ k8s/redis.tgz | Bin 0 -> 21044 bytes k8s/vim | 0 15 files changed, 647 insertions(+) mode change 100644 => 100755 k8s/build-java.sh create mode 100644 k8s/build-java.sh.bak mode change 100644 => 100755 k8s/build-node.sh create mode 100644 k8s/build-node.sh.bak mode change 100644 => 100755 k8s/build.sh mode change 100644 => 100755 k8s/build_and_deploy.sh create mode 100644 k8s/build_and_deploy.sh.bak mode change 100644 => 100755 k8s/deploy.sh create mode 100644 k8s/deploy.sh.bak create mode 100644 k8s/dockerfiles/conf/nginx.conf.20240705 create mode 100644 k8s/dockerfiles/conf/nginx.conf.20240909 create mode 100644 k8s/dockerfiles/conf/nginx.conf.bak create mode 100644 k8s/dockerfiles/conf/nginx.conf.bak0719 create mode 100644 k8s/redis.tgz create mode 100644 k8s/vim diff --git a/k8s/build-java.sh b/k8s/build-java.sh old mode 100644 new mode 100755 diff --git a/k8s/build-java.sh.bak b/k8s/build-java.sh.bak new file mode 100644 index 00000000..66ddbecc --- /dev/null +++ b/k8s/build-java.sh.bak @@ -0,0 +1,25 @@ +#!/bin/bash + +baseDir="/home/somuns/ci4s" +#判断$1是否为all,如果是,则编译所有模块,否则只编译management-platform模块 +if [ "$1" == "all" ]; then + buildDir=$baseDir +else + buildDir="$baseDir/ruoyi-modules/management-platform" +fi + +echo "Building $buildDir" +cd $buildDir && mvn clean install + +if [ $? -ne 0 ]; then + echo "Failed to build ruoyi-modules" + exit 1 +fi + + + + + + + + diff --git a/k8s/build-node.sh b/k8s/build-node.sh old mode 100644 new mode 100755 diff --git a/k8s/build-node.sh.bak b/k8s/build-node.sh.bak new file mode 100644 index 00000000..9805d2ca --- /dev/null +++ b/k8s/build-node.sh.bak @@ -0,0 +1,21 @@ +#!/bin/bash + +baseDir="/home/somuns/ci4s" +cd ${baseDir}/react-ui + +npm install + +if [ $? -ne 0 ]; then + echo "Failed to install npm depend package" + exit 1 +fi + + +npm run build +if [ $? -ne 0 ]; then + echo "Failed to build react-ui" + exit 1 +fi + + + diff --git a/k8s/build.sh b/k8s/build.sh old mode 100644 new mode 100755 diff --git a/k8s/build_and_deploy.sh b/k8s/build_and_deploy.sh old mode 100644 new mode 100755 diff --git a/k8s/build_and_deploy.sh.bak b/k8s/build_and_deploy.sh.bak new file mode 100644 index 00000000..eacc9c6b --- /dev/null +++ b/k8s/build_and_deploy.sh.bak @@ -0,0 +1,74 @@ +#!/bin/bash + +#记录开始时间 +startTime=$(date +%s) + +# 登录到目标环境 +baseDir="/home/somuns/ci4s" +cd ${baseDir} + + +#build +# 默认参数 +branch="master" +service="manage-front" +env="dev" + +# +show_help() { + echo "Usage: $0 [-b branch] [-s service] [-e environment]" + echo + echo "Options:" + echo " -b Branch to deploy, default: master" + echo " -s Service to deploy (manage-front, manage, front, all, default: manage-front)" + echo " -e Environment (e.g., dev, test, default: dev)" + echo " -h Show this help message" +} + +# 解析命令行选项 +while getopts "b:s:e:h" opt; do + case $opt in + b) branch=$OPTARG ;; + s) service=$OPTARG ;; + e) env=$OPTARG ;; + h) show_help; exit 0 ;; + \?) echo "Invalid option -$OPTARG" >&2; show_help; exit 1 ;; + esac +done + +valid_services=("manage-front" "manage" "front" "all") +if [[ ! " ${valid_services[@]} " =~ " $service " ]]; then + echo "Invalid service name: $service" >&2 + echo "Valid services are: ${valid_services[*]}" + exit 1 +fi + +valid_envs=("dev" "test") +if [[ ! " ${valid_envs[@]} " =~ " $env " ]]; then + echo "Invalid environment: $env" >&2 + echo "Valid environments are: ${valid_envs[*]}" + exit 1 +fi + +echo "start build" +sh ${baseDir}/k8s/build.sh -b ${branch} -s ${service} +if [ $? -ne 0 ]; then + echo "Build failed" + exit 1 +fi +echo "build success" + +# 部署 +echo "start deploy" +sh ${baseDir}/k8s/deploy.sh -s ${service} -e ${env} +if [ $? -ne 0 ]; then + echo "Deploy failed" + exit 1 +fi +echo "deploy success" + +# 记录结束时间 +endTime=$(date +%s) +# 计算运行时间 +duration=$(( $endTime - $startTime )) +echo "编译发布总耗时: $duration 秒" \ No newline at end of file diff --git a/k8s/deploy.sh b/k8s/deploy.sh old mode 100644 new mode 100755 diff --git a/k8s/deploy.sh.bak b/k8s/deploy.sh.bak new file mode 100644 index 00000000..a9fe57f8 --- /dev/null +++ b/k8s/deploy.sh.bak @@ -0,0 +1,162 @@ +#!/bin/bash + +# 记录开始时间 +start=$(date +%s) +# 默认参数 +service="manage-front" +env="dev" + +show_help() { + echo "Usage: $0 [-s service] [-e environment]" + echo + echo "Options:" + echo " -s Service to deploy (manage-front, manage, front, all default: manage-front)" + echo " -e Environment (e.g., dev, test, default: dev)" + echo " -h Show this help message" +} + +# 解析命令行参数 +while getopts "s:e:h" opt; do + case $opt in + s) service=$OPTARG ;; + e) env=$OPTARG ;; + h) show_help; exit 0 ;; + \?) echo "Invalid option -$OPTARG" >&2; exit 1 ;; + esac +done + +echo "Deploy service: $service, environment: $env" + +valid_services=("manage-front" "manage" "front" "all") +if [[ ! " ${valid_services[@]} " =~ " $service " ]]; then + echo "Invalid service name: $service" >&2 + echo "Valid services are: ${valid_services[*]}" + exit 1 +fi + +valid_envs=("dev" "test") +if [[ ! " ${valid_envs[@]} " =~ " $env " ]]; then + echo "Invalid environment: $env" >&2 + echo "Valid environments are: ${valid_envs[*]}" + exit 1 +fi + +# 根据环境设置 IP 地址 +if [ "$env" == "dev" ]; then + remote_ip="172.20.32.181" +elif [ "$env" == "test" ]; then + remote_ip="172.20.32.185" +else + echo "Invalid environment - $env" + exit 1 +fi + +baseDir=/home/somuns/ci4s +tag=$(date +'%Y%m%d%H%M') +remote_deploy_dir=/home/deploy/manage-platform + +# 构建镜像函数 +build_image() { + local dockerfile=$1 + local image=$2 + cd ${baseDir}/k8s/dockerfiles + docker build -t ${image} -f ${dockerfile} . + if [ $? -ne 0 ]; then + echo "Build ${image} image fail" + exit 1 + fi + docker push ${image} +} + +# 复制和替换 YAML 文件函数 +prepare_yaml() { + local yaml_file=$1 + local image=$2 + + placeholder="\${${yaml_file%.yaml}-image}" + cd ${baseDir}/k8s/template-yaml + cp -rf ${yaml_file} deploy/ + cd deploy/ + sed -i "s|${placeholder}|${image}|g" ${yaml_file} + if [ $? -ne 0 ]; then + echo "Replace ${image} image fail" + exit 1 + fi + + # 建立远程目录并备份文件 + ssh root@$remote_ip "mkdir -p ${remote_deploy_dir} && if [ -f ${remote_deploy_dir}/${yaml_file} ]; then mv ${remote_deploy_dir}/${yaml_file} ${remote_deploy_dir}/${yaml_file}.bak; fi" + if [ $? -ne 0 ]; then + echo "Failed to create remote directory or backup ${yaml_file}" + exit 1 + else + echo "Successfully created remote directory and backup ${yaml_file}" + fi + + scp ${baseDir}/k8s/template-yaml/deploy/${yaml_file} root@$remote_ip:${remote_deploy_dir}/${yaml_file} + if [ $? -ne 0 ]; then + echo "Failed to copy ${yaml_file}" + exit 1 + else + echo "Successfully copied ${yaml_file}" + fi +} + +# 部署服务函数 +deploy_service() { + local yaml_file=$1 + ssh root@$remote_ip "kubectl apply -n argo -f ${remote_deploy_dir}/${yaml_file}" + if [ $? -ne 0 ]; then + echo "Failed to deploy ${yaml_file}" + exit 1 + else + echo "Successfully deployed ${yaml_file}" + fi +} + +deploy_nacos() { + local yaml_file=$1 + scp ${baseDir}/k8s/${yaml_file} root@$remote_ip:${remote_deploy_dir}/${yaml_file} + deploy_service ${yaml_file} +} + +build_and_deploy() { + local dockerfile=$1 + local image=$2 + local yaml_file=$3 + + build_image ${dockerfile} ${image} + prepare_yaml ${yaml_file} ${image} + deploy_service ${yaml_file} +} + +# 构建和部署 manage 服务 +if [ "$service" == "manage-front" ] || [ "$service" == "manage" ]; then + build_and_deploy "managent-dockerfile" "172.20.32.187/ci4s/ci4s-managent:${tag}" "k8s-7management.yaml" +fi + + +# 构建和部署 front 服务 +if [ "$service" == "manage-front" ] || [ "$service" == "front" ]; then + build_and_deploy "nginx-dockerfile" "172.20.32.187/ci4s/ci4s-front:${tag}" "k8s-12front.yaml" +fi + + +if [ "$service" == "all" ]; then + #部署前端 + build_and_deploy "nginx-dockerfile" "172.20.32.187/ci4s/ci4s-front:${tag}" "k8s-12front.yaml" + #部署管理平台 + build_and_deploy "managent-dockerfile" "172.20.32.187/ci4s/ci4s-managent:${tag}" "k8s-7management.yaml" + #部署认证中心 + build_and_deploy "auth-dockerfile" "172.20.32.187/ci4s/ci4s-auth:${tag}" "k8s-5auth.yaml" + #部署网关 + build_and_deploy "gateway-dockerfile" "172.20.32.187/ci4s/ci4s-gateway:${tag}" "k8s-4gateway.yaml" + #部署系统服务 + build_and_deploy "system-dockerfile" "172.20.32.187/ci4s/ci4s-system:${tag}" "k8s-6system.yaml" + #部署配置中心 + deploy_nacos "k8s-3nacos.yaml" +fi + + +# 记录结束时间 +end=$(date +%s) +echo "部署成功, 耗时: $((end-start))秒" diff --git a/k8s/dockerfiles/conf/nginx.conf.20240705 b/k8s/dockerfiles/conf/nginx.conf.20240705 new file mode 100644 index 00000000..bf9f77c4 --- /dev/null +++ b/k8s/dockerfiles/conf/nginx.conf.20240705 @@ -0,0 +1,64 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + client_max_body_size 20480m; + + server { + listen 8000; + server_name localhost; + + location /api/{ +# rewrite ^/prod-api/(.*)$ /$1 break; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass http://ci4s-gateway-service.argo.svc:8082/; + proxy_connect_timeout 500s; # 设置连接超时时间为 120 秒 + proxy_read_timeout 500s; # 设置读取超时时间为 120 秒 + proxy_send_timeout 500s; # 设置发送超时时间为 120 秒 + } + + location /label-studio/ { + # rewrite ^/label-studio/(.*)$ /$1 break; + proxy_pass http://label-studio-service.argo.svc:8080/projects/; + proxy_hide_header X-Frame-Options; + add_header X-Frame-Options ALLOWALL; + } + + location / { + rewrite ^/prod-api/(.*)$ /$1 break; + root /home/ruoyi/projects/ruoyi-ui; + try_files $uri $uri/ /index.html; + index index.html index.htm; + } + + location /api/v1/model/ { + proxy_pass http://pipeline-convert-service.argo.svc:80; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location @router { + rewrite ^.*$ /index.html last; + } + + # 避免actuator暴露 + if ($request_uri ~ "/actuator") { + return 403; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + } +} diff --git a/k8s/dockerfiles/conf/nginx.conf.20240909 b/k8s/dockerfiles/conf/nginx.conf.20240909 new file mode 100644 index 00000000..c23e02c3 --- /dev/null +++ b/k8s/dockerfiles/conf/nginx.conf.20240909 @@ -0,0 +1,131 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + client_max_body_size 20480m; + error_log /var/log/nginx/error.log debug; + server { + listen 8000; + server_name localhost; + + location /api/{ +# rewrite ^/prod-api/(.*)$ /$1 break; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass http://ci4s-gateway-service.argo.svc:8082/; + proxy_connect_timeout 500s; # 设置连接超时时间为 120 秒 + proxy_read_timeout 500s; # 设置读取超时时间为 120 秒 + proxy_send_timeout 500s; # 设置发送超时时间为 120 秒 + } + + location /label-studio/ { + # rewrite ^/label-studio/(.*)$ /$1 break; + proxy_pass http://label-studio-service.argo.svc:8080/projects/; + proxy_hide_header X-Frame-Options; + add_header X-Frame-Options ALLOWALL; + } + + location / { + rewrite ^/prod-api/(.*)$ /$1 break; + root /home/ruoyi/projects/ruoyi-ui; + try_files $uri $uri/ /index.html; + index index.html index.htm; + } + + location /api/v1/model/ { + proxy_pass http://pipeline-convert-service.argo.svc:80; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + # location /api/v1/realtimeStatus { + # proxy_pass http://argo-server.argo.svc:2746/api/v1/workflow-events/argo; + # proxy_set_header REMOTE-HOST $remote_addr; + # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + # } + + + location /api/v1/tensorboard/show { + # 提取查询参数中的 `svc` 值 + set $svc ""; + if ($arg_svc) { + set $svc $arg_svc; + } + + # 将请求转发到动态生成的内部服务地址 + proxy_pass http://$svc.argo.svc:6006; + + # 传递必要的头信息 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # 对于 WebSocket 应用很重要 + proxy_buffering off; + } + + location /api/v1/realtimeStatus { + rewrite ^/api/v1/realtimeStatus(.*)$ /api/v1/workflow-events/argo$1 break; + + proxy_pass https://argo-server.argo.svc:2746; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # 保留查询参数 + proxy_set_header X-Original-URI $request_uri; + + # 禁用缓冲 + proxy_buffering off; + + # 增加超时时间 + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + proxy_connect_timeout 60s; + + # 设置传递的请求头 + # proxy_set_header Connection ''; + # chunked_transfer_encoding off; + + # 如果需要保留自定义头部 + proxy_set_header Accept 'text/event-stream'; + } + + + location /newlog/realtimeLog { + proxy_pass http://loki.loki-log.svc:3100/loki/api/v1/tail; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location @router { + rewrite ^.*$ /index.html last; + } + + # 避免actuator暴露 + if ($request_uri ~ "/actuator") { + return 403; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + } +} diff --git a/k8s/dockerfiles/conf/nginx.conf.bak b/k8s/dockerfiles/conf/nginx.conf.bak new file mode 100644 index 00000000..281ad4f4 --- /dev/null +++ b/k8s/dockerfiles/conf/nginx.conf.bak @@ -0,0 +1,60 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + + server { + listen 8000; + server_name localhost; + + location /api/{ + rewrite ^/prod-api/(.*)$ /$1 break; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass http://ci4s-gateway-service.argo.svc:8082/; + } + + location /label-studio { + rewrite ^/prod-api/(.*)$ /$1 break; + proxy_pass http://label-studio-ls-app.label-data.svc:80/; + proxy_hide_header X-Frame-Options; + add_header X-Frame-Options "ALLOW-FROM http://label-studio-ls-app.label-data.svc:80/"; + } + + location /api/v1/model/ { + proxy_pass http://pipeline-convert-service.argo.svc:80; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location / { + rewrite ^/prod-api/(.*)$ /$1 break; + root /home/ruoyi/projects/ruoyi-ui; + try_files $uri $uri/ /index.html; + index index.html index.htm; + } + + location @router { + rewrite ^.*$ /index.html last; + } + + # 避免actuator暴露 + if ($request_uri ~ "/actuator") { + return 403; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + } +} diff --git a/k8s/dockerfiles/conf/nginx.conf.bak0719 b/k8s/dockerfiles/conf/nginx.conf.bak0719 new file mode 100644 index 00000000..48e45bf0 --- /dev/null +++ b/k8s/dockerfiles/conf/nginx.conf.bak0719 @@ -0,0 +1,110 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + sendfile on; + keepalive_timeout 65; + client_max_body_size 20480m; + error_log /var/log/nginx/error.log debug; + server { + listen 8000; + server_name localhost; + + location /api/{ +# rewrite ^/prod-api/(.*)$ /$1 break; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass http://ci4s-gateway-service.argo.svc:8082/; + proxy_connect_timeout 500s; # 设置连接超时时间为 120 秒 + proxy_read_timeout 500s; # 设置读取超时时间为 120 秒 + proxy_send_timeout 500s; # 设置发送超时时间为 120 秒 + } + + location /label-studio/ { + # rewrite ^/label-studio/(.*)$ /$1 break; + proxy_pass http://label-studio-service.argo.svc:8080/projects/; + proxy_hide_header X-Frame-Options; + add_header X-Frame-Options ALLOWALL; + } + + location / { + rewrite ^/prod-api/(.*)$ /$1 break; + root /home/ruoyi/projects/ruoyi-ui; + try_files $uri $uri/ /index.html; + index index.html index.htm; + } + + location /api/v1/model/ { + proxy_pass http://pipeline-convert-service.argo.svc:80; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + # location /api/v1/realtimeStatus { + # proxy_pass http://argo-server.argo.svc:2746/api/v1/workflow-events/argo; + # proxy_set_header REMOTE-HOST $remote_addr; + # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + # } + + location /api/v1/realtimeStatus { + rewrite ^/api/v1/realtimeStatus(.*)$ /api/v1/workflow-events/argo$1 break; + + proxy_pass https://argo-server.argo.svc:2746; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # 保留查询参数 + proxy_set_header X-Original-URI $request_uri; + + # 禁用缓冲 + proxy_buffering off; + + # 增加超时时间 + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + proxy_connect_timeout 60s; + + # 设置传递的请求头 + # proxy_set_header Connection ''; + # chunked_transfer_encoding off; + + # 如果需要保留自定义头部 + proxy_set_header Accept 'text/event-stream'; + } + + + location /newlog/realtimeLog { + proxy_pass http://loki.loki-log.svc:3100/loki/api/v1/tail; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location @router { + rewrite ^.*$ /index.html last; + } + + # 避免actuator暴露 + if ($request_uri ~ "/actuator") { + return 403; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + } +} diff --git a/k8s/redis.tgz b/k8s/redis.tgz new file mode 100644 index 0000000000000000000000000000000000000000..288e3db7b52dced5148c408333adb77569ce6cc5 GIT binary patch literal 21044 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 literal 0 HcmV?d00001 diff --git a/k8s/vim b/k8s/vim new file mode 100644 index 00000000..e69de29b