写在前面
鉴于 服务器指令集架构 、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 的配置中,需要注意以下几点
-
三个服务使用的均是
nginx-proxy网络环境,这是我预先创建的一个bridge模式的网络bashdocker network create nginx-proxy -
gitlab-ce和gitlab-runner均采用的是16.6版本,因为如果版本差异过大,可能导致配置CI/CD环境时出现问题 -
gitlab-ce并没有设置对外暴露端口,因为最终效果是nginx对gitlab-ce进行反向代理,所以不用进行端口映射 -
gitlab-ce的environment.external_url配置的是https地址,如果在yml中没有指定的话,后续可以在gitlab.rb中进行修改 -
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 默认配置文件
几点说明
- 第一个
server块,是将http请求重定向到https端口上 - 第二个
server块中的location配置,定义了网站静态资源存放的路径,这里的路径是指nginx容器中的路径 - 这些
server块都定义了server_name,这是为了区分域名访问而配置的 upstream的定义,是为了将请求转发到gitlab容器中,根据前文的gitlab.rb的配置,内置的nginx也会把http请求重定向到https上,因此这里配置的是直接请求gitlab的443端口
后续
gitlab的安装与nginx在同一台服务器,并且个人不希望通过一个域名访问,因此在这里作了区分