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

相关推荐
2301_8112743115 分钟前
大数据基于Spring Boot的化妆品推荐系统的设计与实现
大数据·spring boot·后端
草莓base1 小时前
【手写一个spring】spring源码的简单实现--容器启动
java·后端·spring
Ljw...1 小时前
表的增删改查(MySQL)
数据库·后端·mysql·表的增删查改
编程重生之路1 小时前
Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常
java·spring boot·后端
薯条不要番茄酱1 小时前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
qq_17448285759 小时前
springboot基于微信小程序的旧衣回收系统的设计与实现
spring boot·后端·微信小程序
锅包肉的九珍10 小时前
Scala的Array数组
开发语言·后端·scala
心仪悦悦10 小时前
Scala的Array(2)
开发语言·后端·scala
2401_8827275710 小时前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架
心仪悦悦11 小时前
Scala中的集合复习(1)
开发语言·后端·scala