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

相关推荐
姜学迁1 小时前
Rust-枚举
开发语言·后端·rust
爱学习的小健1 小时前
MQTT--Java整合EMQX
后端
北极小狐2 小时前
Java vs JavaScript:类型系统的艺术 - 从 Object 到 any,从静态到动态
后端
【D'accumulation】2 小时前
令牌主动失效机制范例(利用redis)注释分析
java·spring boot·redis·后端
2401_854391082 小时前
高效开发:SpringBoot网上租赁系统实现细节
java·spring boot·后端
Cikiss2 小时前
微服务实战——SpringCache 整合 Redis
java·redis·后端·微服务
Cikiss2 小时前
微服务实战——平台属性
java·数据库·后端·微服务
OEC小胖胖2 小时前
Spring Boot + MyBatis 项目中常用注解详解(万字长篇解读)
java·spring boot·后端·spring·mybatis·web
2401_857617623 小时前
SpringBoot校园资料平台:开发与部署指南
java·spring boot·后端
计算机学姐3 小时前
基于SpringBoot+Vue的在线投票系统
java·vue.js·spring boot·后端·学习·intellij-idea·mybatis