[Gitlab][docker]自托管代码平台Gitlab | 搭建/使用教程

2024-08-20 17:33:22 浏览数 (2)

本文发布于395天前,最后更新于390天前,其中的信息可能有所发展或是发生改变。

1.前言

GIT(必装):Git – Downloading Package (git-scm.com)。装完以后在目标文件夹右键会有Git Bash HereGit GUI Here两个选项

官网:GitLab.com · GitLab

部署:GitLab下载安装_GitLab最新中文免费版下载安装-极狐GitLab

官方文档:极狐GitLab Docker 镜像 | 极狐GitLab

2.准备

2.1服务器/域名

在开始之前,请设置至少2Gswap

代码语言:javascript复制
wget -O box.sh https://raw.githubusercontent.com/BlueSkyXN/SKY-BOX/main/box.sh && chmod  x box.sh && clear && ./box.sh

硬件需求(要求不低)。省流:4C4G起步上不封顶,硬盘越大越好

2.2存储

必要的硬盘空间在很大程度上取决于您想在极狐GitLab 中存储的仓库的大小,但作为准则,您应该至少拥有与所有仓库组合占用的空间一样多的可用空间。

Omnibus GitLab 软件包需要大约 2.5 GB 的存储空间用于安装。

如果您想在未来灵活增加硬盘空间,请考虑使用逻辑卷管理(LVM)进行挂载,以便您在需要更多硬盘空间时进行添加。

除了本地硬盘,您也可以挂载支持网络文件系统(NFS)协议的卷。卷可能位于文件服务器、网络附加存储(NAS)设备、存储区域网络(SAN)或云提供商的弹性块存储卷上。

如果您有足够的 RAM 和较新的 CPU,极狐GitLab 的速度主要受硬盘驱动器寻道时间的限制。使用高转速(7200 转及以上)或固态驱动器(SSD),可提高极狐GitLab 的响应能力。

由于文件系统性能可能会影响极狐GitLab 的整体性能,我们不建议使用基于云的文件系统进行存储。

Git 仓库的 NFS 存储已废弃。

2.3CPU

CPU 需求取决于用户数量和预期的工作负载,确切需求更多地取决于您的工作负载。您的工作负载受多重因素影响,不限于您的用户活跃程度、您使用的自动化程度、镜像、制品库大小和变更大小。

以下是针对部分用户数量群体,推荐的最低 CPU 硬件要求。

  • 4 核 是推荐的最小核数,支持多达 500 名用户
  • 8 核支持多达 1000 名用户

2.4内存

内存需求取决于用户数量和预期的工作负载,确切需求更多地取决于您的工作负载。您的工作负载受多重因素影响,不限于您的用户活跃程度、您使用的自动化程度、镜像、制品库大小和变更大小。

以下是针对部分用户数量群体,推荐的最低内存硬件要求。

  • 4GB RAM必需的最小内存,支持多达 500 名用户
  • 8GB RAM 支持多达 1000 名用户

除了上述需求之外,我们通常建议您的服务器上至少有 2GB 的 swap 存储空间,即使您已有足够可用的 RAM。如果您的可用内存发生变化,swap 可帮助您减小错误发生的概率。我们也建议您将内核的 swappiness 设置为低值,例如 10,在充分利用 RAM 的同时,使 swap 在需要时可用。

尽管不期望出现会降低性能的过大的 swapping,但它是针对内存不足情况的极其重要的最后手段。在出现意外的系统负载期间,例如同一主机上的操作系统更新或其他服务,峰值内存负载峰值可能远高于平均水平。拥有大量 swapping 有助于避免 Linux OOM killer 不安全地终止潜在的关键进程,例如 PostgreSQL,这可能会产生灾难性的后果。

2.5安装docker和docker-compose

【docker】在服务器上安装docker

3.部署(docker)

3.1创建目录

为gitlab的数据创建一个目录,用来存储gitlab在运行过程中产生的数据。

代码语言:javascript复制
sudo mkdir -p /data/gitlab  #/data/gitlab可以修改成合适的目录
cd /data/gitlab

3.2运行容器

参考文章:5分钟搭建自己的代码托管平台gitlab

您可以微调这些目录以满足您的要求。 一旦设置了 GITLAB_HOME 变量,您就可以运行镜像:

代码语言:javascript复制
sudo docker run --detach 
  --hostname gitlab.yemengstar.com 
  --publish 443:443 --publish 80:80 --publish 22:22 
  --name gitlab 
  --restart always 
  --volume /data/gitlab/config:/etc/gitlab 
  --volume /data/gitlab/logs:/var/log/gitlab 
  --volume /data/gitlab/data:/var/opt/gitlab 
  gitlab/gitlab-ce:latest

这将下载并启动极狐GitLab 容器,并发布访问 SSH、HTTP 和 HTTPS 所需的端口。所有极狐GitLab 数据将存储在 $GITLAB_HOME 的子目录中。系统重启后,容器将自动 restart

初始化过程可能需要很长时间。 您可以通过以下方式跟踪此过程:

代码语言:javascript复制
sudo docker logs -f gitlab

您可以使用

代码语言:javascript复制
sudo docker ps -a

查看容器状况,若显示

代码语言:javascript复制
CONTAINER ID   IMAGE                     COMMAND             CREATED       STATUS                 PORTS                                                                                                         NAMES
a6ffada5d2e6   gitlab/gitlab-ce:latest   "/assets/wrapper"   3 hours ago   Up 2 hours (healthy)   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:22->22/tcp, :::22->22/tcp   gitlab

表明容器已经成功启动。

启动容器后,您可以访问 gitlab.example.com。Docker 容器开始响应查询可能需要一段时间。

3.3重置管理员密码

此时gitlab已经成功安装。但是我们还不知道gitlab管理员账号和密码,所以我们回到终端,设置管理员的密码。

代码语言:javascript复制
sudo docker exec -it gitlab /bin/bash

然后用下面命令进入 到gitlab的rails控制台

代码语言:javascript复制
gitlab-rails console #这一步比较慢,大概在1分钟左右,请耐心等待

控制台

代码语言:javascript复制
root@www:/# gitlab-rails console
--------------------------------------------------------------------------------
 Ruby:         ruby 3.0.6p216 (2023-03-30 revision 23a532679b) [x86_64-linux]
 GitLab:       16.1.2 (e60fc11f2d3) FOSS
 GitLab Shell: 14.23.0
 PostgreSQL:   13.11
------------------------------------------------------------[ booted in 49.88s ]
Loading production environment (Rails 6.1.7.2)
irb(main):001:0> 

当打开控制台后依次输入下面命令来重置管理员账号和密码。

输入

代码语言:javascript复制
user=User.find_by_username 'root'

显示

代码语言:javascript复制
=> #<User id:1 @root>

输入

代码语言:javascript复制
user.password="yemeng666"

显示

代码语言:javascript复制
=> "yemeng666"

输入

代码语言:javascript复制
user.save!

显示

代码语言:javascript复制
=> true

密码需要一定长度,否则会在save的时候报错

代码语言:javascript复制
/opt/gitlab/embedded/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/validations.rb:80:in `raise_validation_error': Validation failed: Password is too short (minimum is 8 characters) (ActiveRecord::RecordInvalid)

如果你想退出容器,请输入exit

3.4登录

密码设置成功以后,就可以返回到gitlab登录页面登录了。

用户名为root

密码为你设置的密码

下面是登录成功的页面

4.部署(推荐docker-compose)

本方法有点小问题,如果你想自己折腾的话可以接着看下去,如果不想折腾只想安安静静使用Gitlab的话直接看问题-方式二的配置文件。

代码语言:javascript复制
mkdir -p /data/docker_data/gitlab
cd /data/docker_data/gitlab
vim docker-compose.yml

docker-compose.yml文件如下:

代码语言:javascript复制
version: '3.6'
services:
  web:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'yourDomain.com(yemengstar.com)'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://yourDomain.com(yemengstar.com)'
    ports:
      - '80:80'
      - '443:443'
      - '23:22'
    volumes:
      - '/data/docker_data/gitlab/config:/etc/gitlab'
      - '/data/docker_data/gitlab/logs:/var/log/gitlab'
      - '/data/docker_data/gitlab/data:/var/opt/gitlab'
    shm_size: '128m'

启动

代码语言:javascript复制
docker-compose up -d

你可以通过

代码语言:javascript复制
docker ps -a

查看容器ID

代码语言:javascript复制
CONTAINER ID   IMAGE                                         COMMAND             CREATED       STATUS                 PORTS                                                                                                         NAMES
c5b91e12743e   registry.gitlab.cn/omnibus/gitlab-jh:latest   "/assets/wrapper"   3 hours ago   Up 3 hours (healthy)   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:23->22/tcp, :::23->22/tcp   data_web_1

通过

代码语言:javascript复制
sudo docker exec -it <CONTAINER ID> grep 'Password:' /etc/gitlab/initial_root_password

查看初始密码

代码语言:javascript复制
Password: yourPassword

然后你可以通过

root/yourPassword登录Gitlab

如果你想退出容器,请输入exit

5.升级

5.1docker升级

要升级使用 Docker Engine 安装的极狐GitLab:

1.进行备份,作为最低要求,备份数据库和极狐GitLab secrets 文件。

2.停止正在运行的容器:

代码语言:javascript复制
sudo docker stop gitlab

3.移除现有容器:

代码语言:javascript复制
sudo docker rm gitlab

4.拉取新镜像:

代码语言:javascript复制
sudo docker pull gitlab/gitlab-ce:latest

5.确保 GITLAB_HOME 环境变量是已定义的:

代码语言:javascript复制
echo $GITLAB_HOME

6.使用先前指定的选项再次创建容器:

代码语言:javascript复制
sudo docker run --detach 
  --hostname gitlab.yemengstar.com 
  --publish 443:443 --publish 80:80 --publish 22:22 
  --name gitlab 
  --restart always 
  --volume /data/gitlab/config:/etc/gitlab 
  --volume /data/gitlab/logs:/var/log/gitlab 
  --volume /data/gitlab/data:/var/opt/gitlab 
  gitlab/gitlab-ce:latest

在第一次运行时,极狐GitLab 将重新配置并升级自身。

5.2docker-compose升级

要升级使用 Docker Compose 安装的极狐GitLab:

1.进行备份,作为最低要求,备份数据库和极狐GitLab secrets 文件。

2.下载最新版本并升级您的极狐GitLab 实例:

代码语言:javascript复制
docker compose pull 
docker compose up -d 

如果您使用标签代替,则需要先编辑 docker-compose.yml

6.配置

你可以通过

代码语言:javascript复制
docker ps -a

查看容器ID

代码语言:javascript复制
CONTAINER ID   IMAGE                                         COMMAND             CREATED       STATUS                 PORTS                                                                                                         NAMES
c5b91e12743e   registry.gitlab.cn/omnibus/gitlab-jh:latest   "/assets/wrapper"   3 hours ago   Up 3 hours (healthy)   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:23->22/tcp, :::23->22/tcp   data_web_1

要访问极狐GitLab 配置文件,您可以在正在运行的容器的上下文中启动 shell 会话。这将允许您浏览所有目录并使用您喜欢的文本编辑器:

代码语言:javascript复制
sudo docker exec -it <CONTAINER ID> /bin/bash

您也可以只编辑/etc/gitlab/gitlab.rb

代码语言:javascript复制
sudo docker exec -it <CONTAINER ID> editor /etc/gitlab/gitlab.rb

打开 /etc/gitlab/gitlab.rb 后,请确保将 external_url 设置为指向有效 URL。

要从极狐GitLab 接收电子邮件,您必须配置 SMTP 设置,因为极狐GitLab Docker 镜像没有安装 SMTP 服务器。您可能还对启用 HTTPS 感兴趣。

完成所需的所有更改后,您需要重新启动容器以重新配置极狐GitLab:

代码语言:javascript复制
sudo docker restart gitlab

每当容器启动时,极狐GitLab 都会重新配置自身。 有关配置极狐GitLab 的更多选项,请查看配置文档。

如果你想退出容器,请输入exit

7.问题

7.1问题一

7.1.1问题描述

本部分参考文档:

  • gitLab—docker部署时ssh更改端口完美解决方案_gitlab修改ssh端口
  • gitlab配置ssh key后,还是需要输入密码,git clone http可以
  • Docker-Gitlab 与主机共用 ssh 的 22 端口 · Zs’s Blog
  • Docker 图形化工具 Portainer,必须推荐给你

推荐配合 Portainer 使用。

在新建完成仓库以后,你可以通过HTTP协议clone至本地。

但是,如果你尝试使用SSH协议进行操作,多半会提示输入密码。

7.1.2方式一

这时需要我们在配置中修改SSH端口。具体操作如下:

进入容器

代码语言:javascript复制
sudo docker exec -it <CONTAINER ID> /bin/bash

进入配置文件夹

代码语言:javascript复制
cd /etc/gitlab

安装vim编辑器

代码语言:javascript复制
apt-get update -y
apt-get install vim -y
vi -v 

编辑配置文件

代码语言:javascript复制
vim gitlab.rb

代码语言:javascript复制
gitlab_rails['gitlab_shell_ssh_port'] = 22

修改为

代码语言:javascript复制
gitlab_rails['gitlab_shell_ssh_port'] = 222  #222可以改为未占用的端口

然后将docker-compose.yml中的

代码语言:javascript复制
ports:
      - '80:80'
      - '443:443'
      - '23:22'

修改为

代码语言:javascript复制
ports:
      - '80:80'
      - '443:443'
      - '23:222'

如果我们修改gitlab.rb配置文件,情况可能出乎我们的意料。此时你会发现复制ssh地址时是完整且正确的,但是却无法克隆git会告诉我们连接被拒绝。你会惊奇的发现当前ssh监听端口依然为22并没有因为配置文件的修改而改变。这里我们换需要手动修改容器ssh端口,根据如下操作将默认端口改为我们设定的端口。

代码语言:javascript复制
docker exec -it <CONTAINER ID> /bin/sh
vim /assets/sshd_config
代码语言:javascript复制
service ssh restart # 重启ssh服务 ,注意是重启容器里的ssh

你也可以在修改完成以后重启容器

代码语言:javascript复制
sudo docker restart <CONTAINER ID>
7.1.3方式二

当然,你可以直接修改docker-compose.yml文件

代码语言:javascript复制
version: '3.6'
services:
  web:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'yourDomain.com(yemengstar.com)'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://yourDomain.com(yemengstar.com)'
        gitlab_rails['gitlab_shell_ssh_port'] = 222
    ports:
      - '80:80'
      - '443:443'
      - '222:22'
    volumes:
      - '/data/docker_data/gitlab/config:/etc/gitlab'
      - '/data/docker_data/gitlab/logs:/var/log/gitlab'
      - '/data/docker_data/gitlab/data:/var/opt/gitlab'
    shm_size: '128m'

然后重启docker容器即可

代码语言:javascript复制
sudo docker restart <CONTAINER ID>
7.1.4方式二讲解

下面是另一个 docker-compose.yml 示例,其中极狐GitLab 在自定义 HTTP 和 SSH 端口上运行。注意 GITLAB_OMNIBUS_CONFIG 变量如何匹配 ports 部分:

代码语言:javascript复制
version: '3.6'
services:
  web:
    image: 'registry.gitlab.cn/omnibus/gitlab-jh:latest'
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.example.com:8929'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
    ports:
      - '8929:8929'
      - '2224:22'
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
    shm_size: '256m'
7.1.5结果

修改前git地址:git@yourDomain.com:User/R.git

修改后git地址:ssh://git@yourDomain.com:222/User/R.git

7.2问题二

如果提示:

代码语言:javascript复制
git@xxx.com: Permission denied (publickey).
fatal: Could not read from remote repository.

说明SSH公私钥不匹配,重新生成后上传即可。

7.3问题三

页面502报错

gitlab未能完全启动,请稍等片刻。也有可能是炸内存了,建议到终端看看情况。

8.优化

gitlab一启动就占用了不少内存了,如果使用的人再多一点就真的要爆内存了。

代码语言:javascript复制
               total        used        free      shared  buff/cache   available
Mem:           16000        4207       10449         155        1343       11315
Swap:           4095           0        4095

但是夜梦的机器配置就这么点,怎么办呢?

这里我们需要修改配置文件,减少gitlab对内存的消耗。

参考文章:低配置服务器安装GitLab_gitlab最低配置

我们先进入容器:

代码语言:javascript复制
sudo docker exec -it <CONTAINER ID> /bin/bash

然后修改配置文件:

代码语言:javascript复制
vi /etc/gitlab/gitlab.rb

删除#号取消以下设置的注释,并修改参数 tip:vi编译器中搜索的方法: 命令模式下,输入/字符串,按下回车,得到搜索的结果,按n键切换搜索结果

1、减少进程数,修改worker_processes,官方建议CPU核心数加一,最小值是2

代码语言:javascript复制
unicorn['worker_processes'] = 2

2、减少数据库缓存,可适当改小

代码语言:javascript复制
postgresql['shared_buffers'] = "256MB"

3、减少数据库并发数,可适当改小

代码语言:javascript复制
postgresql['max_worker_processes'] = 8

4、减少sidekiq并发数,可适当改小

代码语言:javascript复制
sidekiq['concurrency'] = 25

总体优化完毕以后的docker-compose.yml文件如下:

代码语言:javascript复制
version: '3.6'
services:
  web:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'yourDomain.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://yourDomain.com'
        gitlab_rails['gitlab_shell_ssh_port'] = 222

        # 数据库降低
        unicorn['worker_processes'] = 2
        postgresql['shared_buffers'] = "128MB"
        postgresql['max_worker_processes'] = 8
        sidekiq['concurrency'] = 25
    ports:
      - '80:80'
      - '443:443'
      - '222:22'
    volumes:
      - '/data/docker_data/gitlab/config:/etc/gitlab'
      - '/data/docker_data/gitlab/logs:/var/log/gitlab'
      - '/data/docker_data/gitlab/data:/var/opt/gitlab'
    shm_size: '128m'

你可以补充以下内容

代码语言:javascript复制
        # 关闭电子邮件相关功能
        gitlab_rails['smtp_enable'] = false
        gitlab_rails['gitlab_email_enabled'] = false
        gitlab_rails['incoming_email_enabled'] = false

        # Terraform
        gitlab_rails['terraform_state_enabled'] = false

        # Usage Statistics
        gitlab_rails['usage_ping_enabled'] = false
        gitlab_rails['sentry_enabled'] = false
        grafana['reporting_enabled'] = false

        # 关闭容器仓库功能
        gitlab_rails['gitlab_default_projects_features_container_registry'] = false
        gitlab_rails['registry_enabled'] = false
        registry['enable'] = false
        registry_nginx['enable'] = false

        # 包仓库
        gitlab_rails['packages_enabled'] = false
        gitlab_rails['dependency_proxy_enabled'] = false

        # GitLab KAS
        gitlab_kas['enable'] = false
        gitlab_rails['gitlab_kas_enabled'] = false

        # Mattermost
        mattermost['enable'] = false
        mattermost_nginx['enable'] = false

        # Kerberos
        gitlab_rails['kerberos_enabled'] = false
        sentinel['enable'] = false

        # GitLab Pages
        gitlab_pages['enable'] = false
        pages_nginx['enable'] = false

        # 禁用 PUMA 集群模式
        puma['worker_processes'] = 0
        puma['min_threads'] = 1
        puma['max_threads'] = 2

        # 降低后台守护进程并发数
        sidekiq['max_concurrency'] = 5

        gitlab_ci['gitlab_ci_all_broken_builds'] = false
        gitlab_ci['gitlab_ci_add_pusher'] = false

        # 关闭监控
        prometheus_monitoring['enable'] = false
        alertmanager['enable'] = false
        node_exporter['enable'] = false
        redis_exporter['enable'] = false
        postgres_exporter['enable'] = false
        pgbouncer_exporter['enable'] = false
        gitlab_exporter['enable'] = false
        grafana['enable'] = false
        sidekiq['metrics_enabled'] = false

内存占用如下:

代码语言:javascript复制
               total        used        free      shared  buff/cache   available
Mem:            1680         298         691           2         689        1218
Swap:           4095           0        4095

0 人点赞