写在前面
鉴于 服务器指令集架构 、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
在同一台服务器,并且个人不希望通过一个域名访问,因此在这里作了区分