You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI/CD部署后获取自定义子域名的方案咨询

解决方案思路

一、自动DNS配置方案

解决子域名解析的核心是要么自动添加DNS记录,要么用通配符批量覆盖:

  • 动态DNS更新:搭建本地DNS服务器(Bind9/CoreDNS),允许GitLab Runner通过脚本动态添加A记录。比如用Bind9时,配置允许服务器B的IP进行动态更新,CI流水线中执行以下脚本提交记录:
    nsupdate -k /path/to/dns-key.conf << EOF
    server dns.domain.my
    update add ${PROJECT_SLUG}-${BRANCH_SLUG}.git.domain.my 300 A 192.168.1.100
    send
    EOF
    
    用CoreDNS可结合etcd做后端,CI脚本往etcd写入DNS记录后,CoreDNS自动同步生效。
  • 通配符DNS记录:直接在域名服务商处配置*.git.domain.my指向服务器B的IP,所有符合格式的子域名都会解析到目标服务器,无需逐个添加记录(适合快速验证,缺点是无法区分同IP上的过期资源,需配合后续清理机制)。

二、反向代理自动适配(Docker/K8s通用)

1. Docker部署场景

  • 手动生成Nginx配置:在CI流水线中部署应用容器后,自动生成对应子域名的Nginx server配置,然后重载Nginx:
    # 生成配置文件
    cat > /etc/nginx/conf.d/${SUB_DOMAIN}.conf << EOF
    server {
        server_name ${SUB_DOMAIN};
        location / {
            proxy_pass http://${APP_CONTAINER_IP}:8080;
            proxy_set_header Host \$host;
            proxy_set_header X-Real-IP \$remote_addr;
        }
    }
    EOF
    # 重载Nginx
    nginx -s reload
    
  • 自动反向代理工具:用jwilder/nginx-proxy镜像,它监听Docker事件,当启动带VIRTUAL_HOST环境变量的应用容器时,自动生成Nginx配置并重载:
    # 启动代理容器
    docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
    # 启动应用容器时指定子域名
    docker run -d -e VIRTUAL_HOST=${SUB_DOMAIN} your-app-image:${BRANCH_NAME}
    

2. Kubernetes部署场景

用Nginx Ingress Controller实现动态路由:

  • 在CI流水线中动态生成Ingress资源YAML,通过kubectl提交到集群:
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ${PROJECT_SLUG}-${BRANCH_SLUG}-ingress
    spec:
      rules:
      - host: ${SUB_DOMAIN}
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: ${PROJECT_SLUG}-${BRANCH_SLUG}-service
                port:
                  number: 80
    
    提交后Ingress Controller会自动配置反向代理规则,无需手动修改Nginx配置。

三、CI/CD流水线核心细节

  • 子域名规范化:利用GitLab预定义变量生成合规子域名,替换分支名中的特殊字符:
    BRANCH_SLUG=$(echo $CI_COMMIT_BRANCH | tr '/_' '-')
    SUB_DOMAIN="${CI_PROJECT_NAME}-${BRANCH_SLUG}.git.domain.my"
    
  • 资源清理:添加分支删除/合并触发的流水线任务,清理对应DNS记录、Nginx配置、Docker容器或K8s资源,避免资源冗余。

四、备选方案:静态应用用GitLab Pages

如果是静态Web应用,可直接用GitLab Pages,配置通配符DNS指向GitLab Pages服务器后,就能通过${PROJECT_NAME}-${BRANCH_NAME}.git.domain.my访问,无需额外部署反向代理。

内容的提问来源于stack exchange,提问作者Luca Octavian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:33:24