基于codo官方源优化与改进实践



  • 部署前简要说明

    本平台是基于开源基础上搭建及二开,官方地址:https://www.opendevops.cn/
    本平台所有部署将实现 本地化 私有化 容器化
    本平台安装与部署全基于官方文档的部署方法,请查阅:http://docs.opendevops.cn/zh/latest/distributed_install.html
    本平台容器化部署使用的是k8s+rancher,如果未使用rancher请慎重参照文档.只能借鉴
    

    gitlab 安装与配置

    运维自用的gitlab代码仓库,如已存在或者能共用,请忽略此章节
    使用物理机部署
    
    ## 安装依赖
    yum install -y curl policycoreutils-python openssh-server postfix
    systemctl restart postfix
    systemctl enable postfix
    
    ## 配置邮件
    
    输入命令vim /etc/postfix/main.cf打开main.cf文件并找到下图内容:
    将这行代码改为inet_interfaces = all,然后按Esc键,然后输入:wq并回车以保存并关闭main.cf文件。
    输入命令sudo systemctl restart postfix启动Postfix服务。
    
    ## 使用官方源安装gitlab
    版本为12
    
    https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-12.1.3-ce.0.el7.x86_64.rpm
    
    curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
    
    wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-12.1.3-ce.0.el7.x86_64.rpm/download.rpm
    
    ## 配置并启动gitlab-ce
    
    gitlab-ctl reconfigure
    
    
    ## 常用命令
    可以使用gitlab-ctl管理gitlab,例如查看gitlab状态:
    
    gitlab-ctl status
    
    run: gitlab-workhorse: (pid 12171) 231s; run: log: (pid 7817) 555s
    run: logrotate: (pid 12175) 230s; run: log: (pid 7832) 548s
    run: nginx: (pid 12181) 230s; run: log: (pid 7823) 549s
    run: postgresql: (pid 12186) 229s; run: log: (pid 7683) 587s
    run: redis: (pid 12194) 229s; run: log: (pid 7600) 592s
    run: sidekiq: (pid 12198) 229s; run: log: (pid 7806) 558s
    run: unicorn: (pid 14967) 6s; run: log: (pid 7774) 560s
    
    关闭gitlab: gitlab-ctl stop
    启动gitlab: gitlab-ctl start
    重启gitlab: gitlab-ctl restart
    
    
    ## 配置备份
    cp /etc/gitlab/gitlab.rb{,.bak}
    
    
    ## 邮箱配置
    [root@gitlab ~]# egrep -v "^$|^#" /etc/gitlab/gitlab.rb
    external_url 'http://10.0.10.78'
    gitlab_rails['time_zone'] = 'Asia/Shanghai'
    gitlab_rails['gitlab_email_enabled'] = true
    gitlab_rails['gitlab_email_from'] = '邮件用户名@163.com'
    gitlab_rails['gitlab_email_display_name'] = 'Gitlab CE'
    gitlab_rails['smtp_enable'] = true
    gitlab_rails['smtp_address'] = "smtp.163.com"
    gitlab_rails['smtp_port'] = 25
    gitlab_rails['smtp_user_name'] = "邮件用户名@163.com"
    gitlab_rails['smtp_password'] = "邮件帐号的密码"
    gitlab_rails['smtp_domain'] = "163.com"
    gitlab_rails['smtp_authentication'] = "login"
    gitlab_rails['smtp_enable_starttls_auto'] = false
    user['git_user_email'] = "邮件用户名@163.com"
    
    ## 控制台测试邮件发送
    gitlab-rails console
    Notify.test_email('37198642@qq.com', 'test', 'test22').deliver_now
    
    ## 配置gitlab 访问地址
    #external_url 'http://gitlab.example.com'
    external_url 'http://ops-gitlab.opendevops.cn'
    
    ## 重新应用gitlab的配置,每次修改/etc/gitlab/gitlab.rb文件之后执行
    gitlab-ctl reconfigure
    
    ## 启动gitlab服务
    gitlab-ctl start
    
    ## 重启gitlab服务
    gitlab-ctl restart
    
    ## 查看gitlab运行状态
    gitlab-ctl status
    
    ## 停止gitlab服务
    gitlab-ctl stop
    
    ## 查看gitlab运行所有日志
    gitlab-ctl tail
    
    ## 查看 nginx 访问日志
    gitlab-ctl tail nginx/gitlab_acces.log
    
    ## 查看 postgresql 日志
    gitlab-ctl tail postgresql
    
    ## 停止相关数据连接服务
    gitlab-ctl stop unicorn
    gitlab-ctl stop sidekiq
    
    ## 系统信息监测
    gitlab-rake gitlab:env:info
    
    
    ## gitlab相关目录
    /var/opt/gitlab/git-data/repositories/root:库默认存储目录
    /opt/gitlab:是gitlab的应用代码和相应的依赖程序
    /var/opt/gitlab:此目录下是运行gitlab-ctl reconfigure命令编译后的应用数据和配置文件,不需要人为修改配置
    /etc/gitlab:此目录下存放了以omnibus-gitlab包安装方式时的配置文件,这里的配置文件才需要管理员手动编译配置
    /var/log/gitlab:此目录下存放了gitlab各个组件产生的日志
    /opt/gitlab/backups/:默认备份文件生成的目录
    

    powerdns 安装与配置

    使用powerdns做dns解析,官方使用的bind做解析,原理都一样,只是工具不同而已
    在物理机部署
    

    mysql 安装与配置

    使用 percona server 5.7,一写一读, 3316 3326
    在物理机部署
    
    ## 参考资料
    https://www.jianshu.com/p/a4c1daaffb58
    

    redis安装与配置

    yum install epel-release
    yum install redis
    service enable redis
    service restartredis
    如果设置redis连接密码,请参考官方文档设置
    
    # rabbitmq安装与配置
    安装erlang
    下载rpm仓库:wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
    
    安装rpm仓库
    rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
    
    安装erlang
    yum -y install erlang
    
    备注:上面可能会出现报错,我安装就出现缺少epel-release包,缺少就安装即可解决。
    安装epel-release
    yum install -y epel-release
    
    下载RabbitMQ包
    wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el6.noarch.rpm
    
    安装RabbitMQ
    yum install rabbitmq-server-3.6.6-1.el6.noarch.rpm -y
    
    启动RabbitMQ
    #service rabbitmq-server start
    #systemctl start rabbitmq-server 
    #systemctl status rabbitmq-server -l
    
    备注:采用rpm包安装的使用systemctl启动,否则启动不成功。
    
    安装插件
    #whereis rabbitmq
    进入bin下,使用下面命令开启管理页面
    ./rabbitmq-plugins enable rabbitmq_management
    创建用户
    #rabbitmqctl add_user root 123456
    #rabbitmqctl set_user_tags root administrator
    
    #然后直接访问http://IP:15672就可以看到相应的管理web界面
    如果要设置密码,请参考官方文档
    

    tengine/nginx 安装与配置

    # 创建指定用户和用户组
    /usr/sbin/groupadd nginx
    /usr/sbin/useradd -g nginx nginx
    
    # 参考资料
    https://www.linuxhub.org/?p=4554
    https://blog.csdn.net/fyhailin/article/details/79430368 # nginx规则
    https://www.jianshu.com/p/595cd4547620 # 服务脚本
    
    
    # nginx站点配置-phpmyadmin
    [prod:latest] [root@ops-middleware-172.20.40.59 site-enabled]# cat ops-phpmyadmin.opendevops.cn.conf
    server {
        listen 80;
        server_name ops-phpmyadmin.opendevops.cn loalhost 127.0.0.1;
        access_log  "pipe:rollback /var/log/nginx/phpmyadmin.opendevops.cn.log interval=1d baknum=7 maxsize=2G" main;
        error_log  "pipe:rollback /var/log/nginx/phpmyadmin.opendevops.cn.log error interval=1d baknum=7 maxsize=2G";
    
        location / {
            root /opt/phpMyAdmin-4.9.0.1-all-languages/;
            index index.php;
        }
    
        location ~ \.php$ {
            root /opt/phpMyAdmin-4.9.0.1-all-languages/;
            fastcgi_pass  127.0.0.1:9000;
            # fastcgi_pass  unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    
        location ~ /\.ht {
            deny all;
        }
    }
    [prod:latest] [root@ops-middleware-172.20.40.59 site-enabled]#
    
    
    # nginx站点配置-powerdnsadmin
    [prod:latest] [root@ops-middleware-172.20.40.59 site-enabled]# cat ops-powerdnsadmin.opendevops.cn.conf
    server {
        listen 80;
        server_name ops-powerdnsadmin.opendevops.cn;
        access_log  "pipe:rollback /var/log/nginx/ops-powerdnsadmin.opendevops.cn.log interval=1d baknum=7 maxsize=2G" main;
        error_log  "pipe:rollback /var/log/nginx/ops-powerdnsadmin.opendevops.cn.log error interval=1d baknum=7 maxsize=2G";
    
        location / {
            root /opt/poweradmin-2.1.7;
            index index.php;
        }
    
        location ~ \.php$ {
            root /opt/poweradmin-2.1.7;
            fastcgi_pass  127.0.0.1:9000;
            # fastcgi_pass  unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    
        location ~ /\.ht {
            deny all;
        }
    }
    [prod:latest] [root@ops-middleware-172.20.40.59 site-enabled]#
    

    php7 安装与配置

    yum install php70w php70w-devel php70w-mcrypt php70w-common php70w-fpm php70w-opcache php70w-gd php70w-mysqlnd php70w-mbstring \
    php70w-api php70w-bz2 php70w-calendar php70w-ctype php70w-curl php70w-date php70w-exif php70w-fileinfo php70w-filter \
    php70w-ftp php70w-gettext php70w-gmp php70w-hash php70w-iconv php70w-json php70w-libxml php70w-openssl php70w-pcre \
    php70w-pecl-Fileinfo php70w-pecl-phar php70w-pecl-zip php70w-reflection php70w-session php70w-shmop php70w-simplexml \
    php70w-sockets php70w-spl php70w-tokenizer php70w-zend-abi php70w-zip php70w-zlib php70w-pecl-redis php70w-pecl-memcached \
    php70w-cli php70w-ldap php70w-mysql php70w-pdo
    
    # 参考资料
    https://blog.csdn.net/sym134/article/details/79829666
    https://www.cnblogs.com/yanqingxu/p/9248849.html
    
    systemctl status php-fpm
    systemctl restart php-fpm
    systemctl enable php-fpm
    

    phpmyadmin 安装与配置

    https://blog.csdn.net/nexttrial/article/details/78686062 # phpmyadmin + nginx 配置
    

    k8s 安装与配置

    使用k8s + rancher 部署
    
    # k8s安装参考资料
    https://github.com/yanghongfei/Kubernetes
    

    harbor 安装与配置

    # 参考资料
    https://blog.csdn.net/weixin_41465338/article/details/80146218
    

    rancher 安装与配置

    使用k8s + rancher 部署
    # rancher 安装参考资料
    https://blog.51cto.com/zero01/2168999
    

    业务模块部署

    请参考官方文档对每个模块部署.这里仅记录在原官方业务部署方法下进行优化改进.
    

    常用安装包本地化

    如 Python-3.6.6.tar.xz 安装包,可以下载下来,在gitlab创建一个项目存放.
    

    sdk本地化

    官方提供的ops sdk项目, 托管在github,克隆很慢,可以下载到本地,在gitlab创建一个项目存放.
    gitlab.opendevops.cn/ops/python-ops-ops-sdk.git
    

    基础镜像构建

    在gitlab创建一个项目,专门管理基础镜像的dockerfile,如:
    

    Dockerfile

    # 基础镜像
    FROM centos:7
    
    # 维护者
    MAINTAINER "女装大佬"
    
    # 设置编码
    ENV LANG en_US.UTF-8
    
    # 设置时区
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    # 指定更新依赖的host
    RUN echo "216.176.179.218 mirrorlist.centos.org" >> /etc/hosts
    
    # 安装基本依赖
    RUN yum update -y && yum install epel-release -y && yum update -y && yum install wget unzip epel-release nginx xz gcc automake zlib-devel openssl-devel supervisor groupinstall development libxslt-devel libxml2-devel libcurl-devel git -y
    #WORKDIR /var/www/
    
    # 从运维仓库下载安装python
    #RUN wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tar.xz
    RUN wget http://ops-gitlab.opendevops.cn/ops/ops-mirrors/blob/master/python/Python-3.6.6.tar.xz
    RUN xz -d Python-3.6.6.tar.xz && tar xvf Python-3.6.6.tar && cd Python-3.6.6 && ./configure && make && make install
    
    # 安装yum依赖
    #pass
    

    构建基础镜像

    基础镜像名字为codo_base
    docker build . -t codo_base
    

    基础镜像使用方法

    后续所有的其他模块都基于此基础镜像,使用方法:
    FROM harbor.opendevops.cn/codo_base
    

    基础镜像上传私有habor仓库

    docker login ops-harbor.opendevops.cn -u admin -p Harbor12345
    docker tag codo_base ops-harbor.opendevops.cn/library/codo_base:latest
    docker push ops-harbor.opendevops.cn/library/codo_base:latest
    

    前端模块部署

    前端模块在官方的基础上实现了容器化部署,如果使用的是 k8s + rancher 部署,请参考,其他模式只能借鉴此文档
    

    Dockerfile(这里由于是之前测试,未使用基础镜像,建议使用此文档部署的同学做成基础镜像,加速编译部署)
    另外这里有一个坑,在容器里面使用淘宝源编译部署超级慢而且容易出错,使用官方的还好.不知道为啥在容器里编译会这样.所以我指定了NPM源地址

    FROM centos:7
    # 设置编码
    ENV LANG en_US.UTF-8
    # 同步时间
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    # 1. 安装基本依赖和nginx
    RUN yum update -y && yum install epel-release -y && yum update -y && yum install wget nginx git -y
    WORKDIR /app
    
    # 2. 准备node
    #RUN wget -q -c https://npm.taobao.org/mirrors/node/v10.16.1/node-v10.16.1-linux-x64.tar.xz && tar xf node-v10.16.1-linux-x64.tar.xz -C /usr/local/
    RUN wget -q -c https://nodejs.org/dist/v10.16.1/node-v10.16.1-linux-x64.tar.xz && tar xf node-v10.16.1-linux-x64.tar.xz -C /usr/local/
    
    RUN rm -rf /usr/local/bin/node && rm -rf /usr/local/bin/npm \
    && ln -s /usr/local/node-v10.16.1-linux-x64/bin/node /usr/local/bin/node \
    && ln -s /usr/local/node-v10.16.1-linux-x64/bin/node /usr/bin/node \
    && ln -s /usr/local/node-v10.16.1-linux-x64/bin/npm /usr/local/bin/npm \
    && ln -s /usr/local/node-v10.16.1-linux-x64/bin/npm /usr/bin/npm
    
    # 4. 复制代码
    RUN mkdir -p /app
    ADD . /app
    
    RUN rm -rf /app/node_modules && npm config set registry https://registry.npmjs.org/ \
    && npm cache clean --force \
    && npm install --ignore-script \
    && npm run build \
    && mkdir -p /var/www/codo && cp -r /app/dist/* /var/www/codo/
    
    # 5. 日志
    VOLUME /var/log/
    
    # 6. 准备文件
    COPY doc/nginx_ops.conf /etc/nginx/conf.d/default.conf
    COPY doc/nginx.conf /etc/nginx/nginx.conf
    
    # 开放端口
    EXPOSE 80
    EXPOSE 443
    
    CMD ["nginx", "-g", "daemon off;"]
    

    网关项目专用基础镜像

    Dockerfile

    FROM openresty/openresty:1.15.8.1-1-centos
    ENV LANG en_US.UTF-8
    # 同步时间
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    COPY . /usr/local/openresty/nginx/
    RUN mkdir -p /var/log/nginx/ && touch /var/log/nginx/gw_access.log && touch /var/log/nginx/gw_error.log
    VOLUME /var/log/
    VOLUME /usr/local/openresty/nginx/logs/
    EXPOSE 80
    CMD ["/usr/bin/openresty", "-g", "daemon off;"]
    

    官方代码目录新增doc目录

    如果项目代码里面有doc目录,则不新增目录,但是要更换目录里面的文件
    新增 nginx.conf 以及 nginx_ops.conf
    
    为啥要新增或优化nginx.conf?
    经过试验得知,容器里yum -y install nginx,会在nginx的主目录生成一个nginx.conf,而这个nginx.conf是官方默认配置,其中配置里有一个default_server,会把所有请求走到这里来.被这个东西坑了3周...
    所以搞了一个标准的nginx.conf模板文件,进行替换.
    同时优化了日志输出格式;
    增加了一些运维常用或者可能会后续改动的参数配置;
    
    为啥要新增或优化nginx_ops.conf?
    按照官方部署文档,前端的域名配置是在网关那个项目里面配置的.如果要把前端独立部署,就需要把放在网关的demo.conf独立到这个项目来.
    
    为啥要优化supervisor_ops.conf?
    想批量管理所有守护的任务,加上官方部署的supervisor根本就用不了.supervisorctl status都不行.
    

    所有项目替换nginx.conf

    在每个项目doc目录里面,都要新增或者更换此文件,相当于此章节的nginx.conf是一个公共模板,都要执行.
    

    nginx.conf

    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log warn;
    pid /run/nginx.pid;
    
    # Load dynamic modules. See /usr/share/nginx/README.dynamic.
    include /usr/share/nginx/modules/*.conf;
    
    events {
        use epoll;
        worker_connections  20480;
    }
    
    
    http {
        include /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '$http_user_agent $http_x_forwarded_for $request_time $upstream_response_time $upstream_addr $upstream_status';
    
        access_log  /var/log/nginx/access.log  main;
    
        include /etc/nginx/conf.d/*.conf;
    
    
        send_timeout 3m;
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        # 这个参数表示http连接超时时间,默认是65s。要是上传文件比较大,在规定时间内没有上传完成,就会自动断开连接!所以适当调大这个时间。
        keepalive_timeout 600s;
        types_hash_max_size 2048;
    
        # 开启gzip模块
        gzip  on;
        gzip_min_length 1100;
        gzip_buffers 4 8k;
        gzip_types text/plain application/x-javascript text/css application/xml;
        output_buffers 1 32k;
        postpone_output 1460;
        server_names_hash_bucket_size 128;
        client_header_timeout 3m;
        client_body_timeout 3m;
        # 限制了上传文件大小
        client_max_body_size 200m;
        #client_body_buffer_size 1024;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 128k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_vary on;
    
    }
    

    所有项目的supervisor_ops.conf 新增以下配置

    [supervisord]
    nodaemon=true
    
    [unix_http_server]
    file=/tmp/supervisor.sock
    
    [rpcinterface:supervisor]
    supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
    
    [inet_http_server]
    port=*:9999
    username=admin
    password=fuckyoutheopendevops
    
    [supervisorctl]
    serverurl=unix:///tmp/supervisor.sock
    
    [include]
    files = /etc/supervisord.d/*.ini
    
    [program:nginx]
    command=/usr/sbin/nginx -g "daemon off;"
    autostart=true
    autorestart=true
    redirect_stderr=true
    stdout_logfile=/var/log/nginx/access.log
    stderr_logfile=/var/log/nginx/error.log
    loglevel=info
    logfile_maxbytes=100MB
    

    前端项目更换doc目录的nginx_ops.conf

    server {
            listen 80;
            server_name  demo.opendevops.cn;
            access_log /var/log/nginx/demo.opendevops.cn.la_access.log;
            error_log  /var/log/nginx/demo.opendevops.cn.la_error.log;
            root /var/www/codo;
    
            location / {
                        root /var/www/codo;
                        index index.html index.htm;
                        try_files $uri $uri/ /index.html;
                        }
    
            location /api {
                    ### ws 支持
                    proxy_http_version 1.1;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "upgrade";
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    add_header 'Access-Control-Allow-Origin' '*';
                    proxy_pass http://gw.opendevops.cn:80;
            }
    
            location ~ /(.svn|.git|admin|manage|.sh|.bash)$ {
                return 403;
            }
    
    }
    

    各模块项目代码所需要的deployment.yml

    注意,以下yml为公共yml模板,格式都一样,只是每个项目代码对应实际业务的参数配置不一样,请对应修改.特别注意containerPort: 80这个配置,与使用原生docker run启动指定的端口有区别。这里是因为我们内部约定所有容器全部走80经过ingress 代理。

    cat deployment.yml

    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: codo-web
      namespace: codo
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: codo-web
        spec:
          containers:
           - name: codo-web
             image: ywharbor.opendevops.cn/codo/codo-web:v2
             imagePullPolicy: Always
             ports:
              - containerPort: 80
    
    

    网关项目各模块的路由配置

    所有的请求要先经过网关,所以有请求路由一说.这个configs.lua配置文件与官方的配置文件有很大差别,原因为通过rancher+k8s部署后,ingress服务作为了一个上层代理,相当于所有的模块都要先经过ingress nginx代理后,再到网关。所以ingress nginx代理的端口是80,那么这个配置文件也需要同步更改

    cat configs.lua

    json = require("cjson")
    
    
    redis_config = {
        host = '10.200.128.17',
        port = 6379,
        auth_pwd = 'cWCVKJ7ZHUK12mVbivUf',
        db = 8,
        alive_time = 3600 * 24 * 7,
        channel = 'gw'
    }
    
    
    token_secret = "pXFb4i%*834gfdh963df718iodGq4dsafsdadg7yI6ImF1999aaG7"
    logs_file = '/var/log/gw.log'
    
    --刷新权限到redis接口
    rewrite_cache_url = 'http://mg.opendevops.cn:80/v2/accounts/verify/'
    rewrite_cache_token = '8b888a62-3edb-4920-b446-697a472b4001'
    
    --并发限流配置
    limit_conf = {
        rate = 10, --限制ip每分钟只能调用n*60次接口
        burst = 10, --桶容量,用于平滑处理,最大接收请求次数
    }
    
    --upstream匹配规则
    gw_domain_name = 'gw.opendevops.cn'
    
    rewrite_conf = {
        [gw_domain_name] = {
            rewrite_urls = {
                {
                    uri = "/dns",
                    rewrite_upstream = "dns.opendevops.cn:80"
                },
                {
                    uri = "/cmdb2",
                    rewrite_upstream = "cmdb2.opendevops.cn:80"
                },
                {
                    uri = "/tools",
                    rewrite_upstream = "tools.opendevops.cn:80"
                },
                {
                    uri = "/kerrigan",
                    rewrite_upstream = "kerrigan.opendevops.cn:80"
                },
                {
                    uri = "/cmdb",
                    rewrite_upstream = "cmdb.opendevops.cn:80"
                },
                {
                    uri = "/k8s",
                    rewrite_upstream = "k8s.opendevops.cn:80"
                },
                {
                    uri = "/task",
                    rewrite_upstream = "task.opendevops.cn:80"
                },
    
                {
                    uri = "/task-sup",
                    rewrite_upstream = "task.opendevops.cn:80"
                },
    
                {
                    uri = "/cron",
                    rewrite_upstream = "cron.opendevops.cn:80"
                },
                {
                    uri = "/mg",
                    rewrite_upstream = "mg.opendevops.cn:80"
                },
                {
                    uri = "/accounts",
                    rewrite_upstream = "mg.opendevops.cn:80"
                },
            }
        }
    }
    
    


  • 棒! .



  • 很不错!!!!!!



  • good practice!





  • @cdy 你是要部署gitlab的yaml还是部署每个项目模块的yaml?


登录后回复