一、准备工作
先下载 gitlab 的社区镜像(别下载最新的,最新的安装不成功):
docker pull --platform=linux/amd64 gitlab/gitlab-ce:17.7.0-ce.0
在服务器上准备一个 gitlab 的数据目录,挂载配置、日志和数据信息,避免容器删除后数据全部丢失。
mkdir -p gitlab-home/{config,logs,data}
二、安装 gitlab
接着我们启动容器,命令如下:
sudo docker run -d \
--hostname 192.168.31.107 \
--publish 9080:80 --publish 9022:22 \
--name gitlab \
--restart always \
--volume $(pwd)/gitlab-home/config:/etc/gitlab \
--volume $(pwd)/gitlab-home/logs:/var/log/gitlab \
--volume $(pwd)/gitlab-home/data:/var/opt/gitlab \
--shm-size 512m \
gitlab/gitlab-ce:17.7.0-ce.0
等待一会儿, 获取初始密码就可以登录系统了。
docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
接着访问:http://192.168.31.107:9080,使用 root 账号,密码就是上面我们获取到了。
三、精简配置
接着我们精简下一些我们用不到的监控组件。首先查看 gitlab 默认安装了哪些组件。
docker exec -it gitlab gitlab-ctl status
# 下面就是安装启动的组件
run: alertmanager: (pid 1388) 1066s; run: log: (pid 1209) 1093s
run: gitaly: (pid 1350) 1068s; run: log: (pid 546) 1199s
run: gitlab-exporter: (pid 1359) 1068s; run: log: (pid 979) 1110s
run: gitlab-kas: (pid 742) 1188s; run: log: (pid 759) 1187s
run: gitlab-workhorse: (pid 1322) 1069s; run: log: (pid 899) 1123s
run: logrotate: (pid 484) 1212s; run: log: (pid 492) 1211s
run: nginx: (pid 1338) 1068s; run: log: (pid 964) 1116s
run: postgres-exporter: (pid 1402) 1066s; run: log: (pid 1277) 1085s
run: postgresql: (pid 570) 1194s; run: log: (pid 581) 1193s
run: prometheus: (pid 1369) 1067s; run: log: (pid 1181) 1099s
run: puma: (pid 811) 1137s; run: log: (pid 818) 1136s
run: redis: (pid 500) 1206s; run: log: (pid 509) 1205s
run: redis-exporter: (pid 1361) 1068s; run: log: (pid 1133) 1104s
run: sidekiq: (pid 830) 1131s; run: log: (pid 847) 1128s
run: sshd: (pid 35) 1222s; run: log: (pid 34) 1222s
接着我们修改 gitlab 的配置文件:$(pwd)/gitlab-home/config/gitlab.rb 文件。
3.1. 关闭邮件功能
个人使用不需要邮件功能,可以默认禁用
gitlab_rails['smtp_enable'] = false # 100行左右
gitlab_rails['gitlab_email_enabled'] = false # 120行左右
gitlab_rails['incoming_email_enabled'] = false # 298 行左右
3.2. 关闭监控和性能基准相关功能
个人使用场景,由于没有复杂负载压力,做好备份即可保障数据安全,所以监控和性能基准相关的功能都可以直接禁用。
gitlab_rails['usage_ping_enabled'] = false # 523行
sidekiq['metrics_enabled'] = false # 1331行左右
alertmanager['enable'] = false # 2439行左右
node_exporter['enable'] = false # 2463行左右
redis_exporter['enable'] = false # 2488行左右
postgres_exporter['enable'] = false # 2521行左右
gitlab_exporter['enable'] = false # 2552行左右
prometheus_monitoring['enable'] = false # 2591行左右
sentinel['enable'] = false # 2982行
3.3. 关闭容器仓库功能
GitLab 默认提供了软件包仓库、容器仓库、软件依赖管理,可以使用 Nexus 进行替代。
# 容器仓库功能
gitlab_rails['gitlab_default_projects_features_container_registry'] = false # 164行左右
gitlab_rails['registry_enabled'] = false # 983行
registry['enable'] = false # 1000行
# 包仓库和依赖管理
gitlab_rails['packages_enabled'] = false # 2930行
gitlab_rails['dependency_proxy_enabled'] = false # 2952行
3.4. 其他的一些功能
个人使用聊天功能也不需要,如果默认没有关闭,就设置为 false 将其关闭,还有Kerberos 加强认证的组件也可以关闭,另外还有和 k8s 集成的组件。
# 加强认证
gitlab_rails['kerberos_enabled'] = false # 2917行
# 聊天
mattermost['enable'] = false
mattermost_nginx['enable'] = false
# GitLab Kubernetes 集成的组件
gitlab_kas['enable'] = false # 2159行
3.5. 重置配置
上面修改完成之后,就可以重置配置文件,让其生效。
# 重置配置
docker exec -it gitlab gitlab-ctl reconfigure
稍等一会,重置完成之后,我们看下现在启动组件:
docker exec -it gitlab gitlab-ctl status
run: gitaly: (pid 1350) 3905s; run: log: (pid 546) 4036s
run: gitlab-workhorse: (pid 1322) 3906s; run: log: (pid 899) 3960s
run: logrotate: (pid 3328) 449s; run: log: (pid 492) 4048s
run: nginx: (pid 4101) 70s; run: log: (pid 964) 3953s
run: postgresql: (pid 570) 4031s; run: log: (pid 581) 4030s
run: puma: (pid 4063) 82s; run: log: (pid 818) 3973s
run: redis: (pid 500) 4043s; run: log: (pid 509) 4042s
run: sidekiq: (pid 4036) 89s; run: log: (pid 847) 3965s
run: sshd: (pid 35) 4059s; run: log: (pid 34) 4059s
这样 gitlab 的资源占用会降低很大。
四、使用外部的数据库
4.1. 替换外部的 Redis 数据库
这里连接外部的 Redis,避免 Gitlab 内部启动 Redis 外部也有一个 Redis,造成服务浪费,Redis 还可以给其他服务使用。修改配置也很简单。
gitlab_rails['redis_host'] = "192.168.31.107" # 822行
gitlab_rails['redis_port'] = 6379 # 823行
gitlab_rails['redis_password'] = "123456" # 825行
gitlab_rails['redis_database'] = 15 # 826行
# 停用内部的Redis
redis['enable'] = false # 1576行
接着重置配置,等待生效。查看 key 已经写入了,替换完成。
4.2. 替换外部的 PostgreSQL 数据库
替换 PG 库也是一样道理,直接修改配置。
postgresql['enable'] = false # 1420行
gitlab_rails['db_adapter'] = "postgresql" # 774
gitlab_rails['db_database'] = "gitlabhq_production" # 777
gitlab_rails['db_username'] = "gitlab" # 778
gitlab_rails['db_password'] = "123456" # 779
gitlab_rails['db_host'] = "192.168.31.107" # 780
gitlab_rails['db_port'] = 5432 # 781
接着重置配置,等待生效,重置之后发现登录页面密码错误无法登录,这个简单我们仅需要修改密码就可以了。
long@nuc:~/server/gitlab$ docker exec -it gitlab bash
root@192:/# gitlab-rails console
--------------------------------------------------------------------------------
Ruby: ruby 3.2.5 (2024-07-26 revision 31d0f1a2e7) [x86_64-linux]
GitLab: 17.7.0 (eedc7c560c9) FOSS
GitLab Shell: 14.39.0
PostgreSQL: 17.4
------------------------------------------------------------[ booted in 20.00s ]
Loading production environment (Rails 7.0.8.6)
irb(main):001:0> user=User.where(username:'root').first
=> #<User id:1 @root>
irb(main):002:0> user.password='要修改的密码'
=> "要修改的密码"
irb(main):003:0> user.save!
=> true
irb(main):004:0> quit
再次登录就可以了。上面我们就安装完成了 gitlab,并对个人使用做了精简化配置。
long@nuc:~/server/gitlab$ podman exec -it gitlab gitlab-ctl status
run: gitaly: (pid 1350) 6863s; run: log: (pid 546) 6994s
run: gitlab-workhorse: (pid 4891) 1567s; run: log: (pid 899) 6918s
run: logrotate: (pid 3328) 3407s; run: log: (pid 492) 7006s
run: nginx: (pid 4101) 3028s; run: log: (pid 964) 6911s
run: puma: (pid 5500) 765s; run: log: (pid 818) 6931s
run: sidekiq: (pid 5504) 764s; run: log: (pid 847) 6923s
run: sshd: (pid 35) 7017s; run: log: (pid 34) 7017s
查看资源占用情况。降低了一半的资源占用。
4.3. 收尾
最后我们配置完成之后,修改下访问的地址缺失端口的问题,这里大家可以试着创建一个项目,会发现 http 的地址是没有端口,这个问题很简单。
我们先修改:$(pwd)/gitlab-home/config/gitlab.rb 文件,修改:
# external_url 'GENERATED_EXTERNAL_URL'
# 改成,不要加端口
external_url 'http://192.168.31.107'
修改了之后,我们重置配置:
docker exec -it gitlab gitlab-ctl reconfigure
然后进入 gitlab 的容器内,修改另一个配置文件:/opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
# 将里面的port改成我们对外映射的端口:9080
production: &base
#
# 1. GitLab app settings
# ==========================
## GitLab settings
gitlab:
## Web server settings (note: host is the FQDN, do not include http://)
host: 192.168.31.107
port: 9080
https: false
最后重启配置 gitlab 文件就可以了(但不是重启容器)。
docker exec -it gitlab gitlab-ctl restart
五、域名访问
5.1. 配置 http 服务
这里我们接着请出内网穿透神器:frp,通过 frp 将我们内网的 gitlab 开放出去,可以通过域名访问(这里我们需要一台云服务器或者有独立 IP 的网络)。
先配置 frps 的服务端,增加一个 http 转发的端口。
# 服务端和客户端通信端口
bindPort = 7001
# http的配置
vhostHTTPPort = 8002
# 服务端使用TLS链接
transport.tls.force = true
# 身份令牌,frps和frpc一致
auth.token = "xxxxxxx"
然后重启 frps
# 重启
sudo systemctl restart frps
# 查看重启状态,如果发现端口占用就改一个端口
sudo systemctl status frps
接着需要在云服务上配置,防火墙开放 8002 和 7001 端口(谨记)。
接下来配置 frpc 客户端,增加一个代理配置,重启本地的 frpc 就可以。
[[proxies]]
name = "nuc-gitlab"
type = "http"
localIP = "127.0.0.1"
localPort = 9080
customDomains = ["gitlab.xxxx.xxx"]
这里的gitlab.xxxx.xxx 解析到的是你云服务器地址,然后访问:http://gitlab.xxxx.xxx:8002,就可以访问到内网的 gitlab 服务了。
5.2. 配置 https 服务
现在云服务器厂商会提供一个 90 天的 https 证书。申请证书,云服务会自动配置解析,很简单。
接着我们将我们下载的 https 证书,拷贝到服务器上的/etc/nginx/cert 文件夹下。
然后在/etc/nginx/conf.d 中添加一个 gitlab.conf 配置文件,配置如下:
server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名
server_name gitlab.xxxxx.xxx;
#请填写证书文件的相对路径或绝对路径
ssl_certificate /etc/nginx/cert/gitlab.xxxxx.xxx/gitlab.xxxxx.xxx_bundle.crt;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key /etc/nginx/cert/gitlab.xxxxx.xxx/gitlab.xxxxx.xxx.key;
ssl_session_timeout 5m;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# root /data/web/webclose;
location / {
proxy_pass http://gitlab.xxxxx.xxx:8002;
expires off;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
#请填写绑定证书的域名
server_name gitlab.xxxxx.xxx
#把http的域名请求转成https
return 301 https://$host$request_uri;
}
重启 nginx 让其配置生效。
sudo systemctl restart nginx
接着访问 https://gitlab.xxxx.xxx,就可以到我们的内网的 gitlab 了,是不是很简单。
接下来我们创建一个仓库,测试一下代码提交。
六、测试使用
先创建一个测试得代码仓库。
这里大家可能有点纳闷,我配置了 https 为什么还是内网的 IP 地址。这个不要慌,只需要将内网的地址替换成刚才配置的 https 就可以了。
这里的http://192.168.31.107:9080/rust/test1.git,自己替换成 https://gitlab.xxxx.xxx/rust/test1.git 就可以了。
接着创建一个访问令牌就可以了,配置到编辑器中,后续就不需要添加账号密码进行访问了。
最后拉去、提交就没什么问题了。但是需要注意证书 3 个月到期,及时申请新的证书更换就可以了。