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

写在前面

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

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

服务器

采用的是 腾讯云2c8g 的硬件配置,加上 CentOS 7.6 AMDdocker-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-cegitlab-runner 均采用的是 16.6 版本,因为如果版本差异过大,可能导致配置 CI/CD 环境时出现问题

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

  4. gitlab-ceenvironment.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 并实现 gitlabhttps

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

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

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

个人感觉难点不是在 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 式注册 ,在 groupproject中选择创建 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 上,因此这里配置的是直接请求 gitlab443 端口

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

相关推荐
数据知道34 分钟前
容器化部署:用Docker封装机器翻译模型与服务详解
docker·容器·机器翻译
uzong2 小时前
技术故障复盘模版
后端
GetcharZp3 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程3 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研3 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi4 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
阿华的代码王国5 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy5 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
AntBlack5 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt
bobz9656 小时前
pip install 已经不再安全
后端