私人服务搭建:docker 中搭建 gitlab 并实现 nginx 反向代理和 HTTPS(附带gitlab-runner配置)

写在前面

鉴于 服务器指令集架构 、docker、gitlab、gitlab-runner 等版本环境信息影响

如若遵循本步骤进行安装,记得校验环境和安装版本是否具有参考意义

服务器

采用的是 腾讯云 ,2c8g 的硬件配置,加上 CentOS 7.6 AMD 和 docker-ce 24 的镜像

docker-compose 配置

yml 复制代码
version: '3.6'
services:
  gitlab:
    container_name: 'gitlab'
    image: 'gitlab/gitlab-ce:16.6.2-ce.0'
    restart: always
    hostname: 'gitlab'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.example.com'
      TZ: Asia/Shanghai
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
    shm_size: '256m'
    networks:
      - nginx-proxy

  gitlab-runner:
    container_name: 'gitlab-runner'
    image: 'gitlab/gitlab-runner:v16.6.2'
    hostname: 'gitlab-runner'
    user: root
    restart: always
    volumes:
      - '$GITLAB_RUNNER_HOME/config:/etc/gitlab-runner'
      - '$GITLAB_RUNNER_HOME/logs:/var/log/gitlab-runner'
      - '/var/run/docker.sock:/var/run/docker.sock'
    networks:
      - nginx-proxy
    environment:
      TZ: Asia/Shanghai

  nginx:
    container_name: 'nginx'
    image: nginx
    restart: always
    hostname: 'nginx'
    volumes:
      - '$NGINX_HOME/config/nginx.conf:/etc/nginx/nginx.conf'
      - '$NGINX_HOME/logs:/var/log/nginx'
      - '$NGINX_HOME/website:/usr/share/nginx/html'
      - '$NGINX_HOME/ssl:/etc/nginx/ssl'
    ports:
      - "80:80"
      - "443:443"
    networks:
      - nginx-proxy
    environment:
      TZ: Asia/Shanghai

networks:
  nginx-proxy:
    external: true
  compose-default:
    external: true

在 compose.yml 的配置中,需要注意以下几点

  1. 三个服务使用的均是 nginx-proxy 网络环境,这是我预先创建的一个 bridge 模式的网络

    bash 复制代码
    docker network create nginx-proxy
  2. gitlab-ce 和 gitlab-runner 均采用的是 16.6 版本,因为如果版本差异过大,可能导致配置 CI/CD 环境时出现问题

  3. gitlab-ce 并没有设置对外暴露端口,因为最终效果是 nginx 对 gitlab-ce 进行反向代理,所以不用进行端口映射

  4. gitlab-ce 的 environment.external_url 配置的是 https 地址,如果在 yml 中没有指定的话,后续可以在 gitlab.rb 中进行修改

  5. gitlab 的配置中有一个 hostname 配置,这个配置是为了在 nginx 中方便找到 gitlab 容器的,即便容器的 ip 发生变化,nginx 也能根据 gitlab 的主机名(容器名)准确找到地址

gitlab

gitlab.rb 配置

conf 复制代码
external_url 'https://gitlab.example.com'

nginx['enable'] = true
nginx['redirect_http_to_https'] = true
nginx['redirect_http_to_https_port'] = 80
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.example.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.example.com.key"
nginx['listen_addresses'] = ['*', '[::]']

letsencrypt['enable'] = false
letsencrypt['auto_renew'] = false

由于 gitlab.rb 配置项太多,这里仅列出我修改过的部分

关于为什么这里开启了 gitlab 的 内置 nginx

因为我自己对着 gitlab 的英文官方文档的 ssl 部分翻来覆去搞了很久,还是没有成功让 一个容器中的 nginx 反向代理另一个容器中的 gitlab 并实现 gitlab 的 https

最后采取这种方式配置成功了,没有什么是加一层解决不了的

最后的配置相当于 容器中的 nginx 反向代理了 gitlab 容器,gitlab 容器中的 nginx 又反向代理了 gitlab 本身

解决两个 nginx 之间的代理问题可比解决 nginx 和 gitlab 之间的代理问题好多了

个人感觉难点不是在 nginx 反向代理 gitlab,而是在如何在反向代理之后同时支持 https

gitlab-runner 配置

这块根据官方文档,在 gitlab 15.10 前后 gitlab-runner 注册方式有了区别

一种是 交互式、指令式注册

由于我这里是用的 docker 启动的 gitlab-runner 所以注册 runner 时的命令是

bash 复制代码
docker exec -it gitlab-runner gitlab-runner register

这里提示输入的 registration token 是要从下面图示处获得的,而不是创建 runner 中他给出命令的 token

另一种是 UI 式注册 ,在 group、project中选择创建 runner

使用 UI 注册 的方式,会自动给你生成注册指令

对于我这边的指令就是

bash 复制代码
docker exec -it gitlab-runner gitlab-runner register --url https://gitlab.example.com --token xxxxxx

注册成功后就可以编写 .gitlab.ci.yml 文件去配置相关 CI/CD 功能了

nginx

nginx.conf 配置

conf 复制代码
server {
    listen      80;
    server_name example.com www.example.com;

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

server {
    listen              443 ssl;
    server_name         example.com www.example.com;
    keepalive_timeout   70;

    ssl_session_cache       shared:SSL:10m;
    ssl_session_timeout     10m;
    ssl_certificate         /etc/nginx/ssl/example.com/example.com.crt;
    ssl_certificate_key     /etc/nginx/ssl/example.com/example.com.key;
    ssl_protocols           TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers             HIGH:!aNULL:!MD5;

    location / {
        root    /usr/share/nginx/html/;
        index   index.html index.htm index.php;
    }
}


upstream docker_gitlab_https {
    server gitlab:443;
}

server {
    listen      80;
    server_name gitlab.example.com www.gitlab.example.com;

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

server {
    listen              443 ssl;
    server_name         gitlab.example.com www.gitlab.example.com;
    keepalive_timeout   70;

    ssl_session_cache       shared:SSL:10m;
    ssl_session_timeout     10m;
    ssl_certificate         /etc/nginx/ssl/gitlab.example.com/gitlab.example.com.crt;
    ssl_certificate_key     /etc/nginx/ssl/gitlab.example.com/gitlab.example.com.key;
    ssl_protocols           TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers             HIGH:!aNULL:!MD5;

    location / {
        proxy_pass  https://docker_gitlab_https;
        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;
    }
}

这里仅贴出 http 块 中的相关配置,其余配置均保留自 nginx.conf 默认配置文件

几点说明

  1. 第一个 server 块,是将 http 请求重定向到 https 端口上
  2. 第二个 server 块中的 location 配置,定义了网站静态资源存放的路径,这里的路径是指 nginx 容器中的路径
  3. 这些 server 块都定义了 server_name,这是为了区分域名访问而配置的
  4. upstream 的定义,是为了将请求转发到 gitlab 容器中,根据前文的 gitlab.rb 的配置,内置的 nginx 也会把 http 请求重定向到 https 上,因此这里配置的是直接请求 gitlab 的 443 端口

后续 gitlab 的安装与 nginx 在同一台服务器,并且个人不希望通过一个域名访问,因此在这里作了区分

相关推荐
bigbig_ben22 分钟前
yearning安装docker
运维·docker·容器
沙蒿同学3 小时前
不引 Ghostscript:我用纯 Go 给 PDF 做了一场「压缩手术」
前端·后端·github
前进的李工5 小时前
飞书企业知识库设计+后端高频八股
数据库·redis·后端·mysql·性能优化·飞书·rag
金銀銅鐵7 小时前
[Java] 展示增删元素时 LinkedList 的内部变化
java·后端·ai编程
武子康8 小时前
Vercel Cache Reason:相同 MISS,怎样决定下一步查什么
人工智能·后端·agent
杨文说AI与数字化8 小时前
把模型依赖做成可替换的组件:三层适配 + 一套回归评估
后端
IT_陈寒8 小时前
Vue的这个响应式陷阱我居然现在才发现
前端·人工智能·后端
WL学习笔记9 小时前
使用string类
c++·后端·string类
飞鸟真人9 小时前
IM网关系列(九)单账号流量统计:滑动窗口桶方案设计与Go实现
后端·golang
武子康10 小时前
Embedding 替换怎么评测:把索引成本算进成功任务
人工智能·后端·agent