使用Gitlab搭建个人代码仓库

一、准备工作

先下载 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 个月到期,及时申请新的证书更换就可以了。

### 部署和配置企业级 GitLab 代码仓库 #### 使用 Docker 安装 GitLab 为了简化安装过程并确保环境一致性,推荐使用 Docker 来部署 GitLab。这不仅能够加速设置流程,还能减少依赖冲突的可能性[^2]。 ```bash sudo docker run --detach \ --hostname gitlab.example.com \ --publish 443:443 --publish 80:80 --publish 22:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest ``` 这段命令会启动一个名为 `gitlab` 的容器,并将其绑定到主机上的特定端口上运行。同时设置了自动重启策略以及挂载了必要的数据卷来保存配置文件、日志和其他持久化数据。 #### 修改 GitLab 配置 初次启动后可能需要调整一些默认参数以适应实际需求。可以通过编辑 `/mnt/gitlab/etc/gitlab.rb` 文件来进行自定义设置,例如更改外部 URL 或者启用 SMTP 支持等功能[^3]: ```ruby external_url 'http://yourdomain.com' nginx['redirect_http_to_https'] = true gitlab_rails['smtp_enable'] = true ... ``` 完成编辑之后记得执行一次重新加载操作使新设定生效: ```bash sudo docker exec -it gitlab gitlab-ctl reconfigure ``` #### 版本选择注意事项 值得注意的是,在某些情况下较新的 GitLab 发布版可能存在兼容性问题。如果遇到类似 SSH 密钥验证失败的情况,则建议尝试回退至更稳定的旧版本,如通过 YUM 手动指定安装包的方式获取特定历史发行版[^5]: ```bash yum localinstall -y https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-8.10.5-ce.0.el7.x86_64.rpm/download.rpm ``` 以上就是关于如何基于 Docker 技术搭建一套稳定可靠的企业内部源码管理系统——GitLab 的介绍.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值