私人服务搭建: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 在同一台服务器,并且个人不希望通过一个域名访问,因此在这里作了区分

相关推荐
子兮曰4 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝4 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码4 天前
别再前后端各写一套表单校验了
java·后端
分布式存储与RustFS4 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
大勇前进4 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu4 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile4 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白804 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端
二月龙4 天前
PHP 接口返回统一响应封装,让前后端对接更省心
后端