gitlab分为gitlab-ce和gitlab-ee,gitlab-ce可以免费使用,因此此处用的是gitlab-ce。

安装系统要求

官方资料: https://docs.gitlab.com/ee/install/requirements.html

硬件要求

CPU

CPU 要求取决于用户数量和预期工作负载。您的确切需求可能更多,具体取决于您的工作量。

  • 4 核是建议的最低核数,最多支持 500 个用户
  • 8 核最多支持 1000 个用户
  • 更多用户?查阅参考架构页面

内存

建议您的服务器上至少有 2 GB 的交换空间,即使您当前有足够的可用 RAM。如果您的可用内存发生变化,交换有助于减少发生错误的可能性。

  • 4 GB RAM是所需的最小内存大小,最多支持 500 个用户
  • 8 GB RAM 支持多达 1000 个用户

软件要求

Redis 版本

GitLab 13.0 及更高版本需要 Redis 5.0 或更高版本。

建议使用 Redis 6.0 或更高版本,因为这是从 GitLab 13.9 开始随附的 Omnibus GitLab软件包。

数据库

GitLab 版本 PostgreSQL 最低版本
13.0 11
14.0 12.7
15.0 12.10
16.0(计划中) 13.6

您还必须确保将以下扩展加载到每个 GitLab 数据库中。

扩展 GitLab 最低版本
pg_trgm 8.6
btree_gist 13.1
plpgsql 11.7

安装

官方文档: https://about.gitlab.com/install/#ubuntu

1.安装依赖

sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates tzdata perl

2.安装 Postfix(或 Sendmail)以发送通知电子邮件

sudo apt-get install -y postfix

在 Postfix 安装期间,可能会出现一个配置屏幕。选择“Internet 站点”并按回车键。使用服务器的外部 DNS 作为“邮件名称”,然后按回车键。如果出现其他屏幕,请继续按 enter 键接受默认设置。 image.png

3.配置防火墙(或者执行:ufw disable 关闭防火墙 )

systemctl start ufw
sudo ufw allow https
sudo ufw allow http
sudo ufw allow ssh
sudo ufw enable
sudo ufw status

4.安装gitlab

##添加GitLab包仓库
curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

##查看可安装版本
apt list |grep gitlab

##安装最新的gitlab-ce版本,并启用HTTPS
#sudo EXTERNAL_URL="https://gitlab.example.com"  apt-get install -y gitlab-ce

##因某墙的原因请勿启用HTTPS,安装指定版本的gitlab-ce
sudo EXTERNAL_URL="http://gitlab.example.com"  apt-get install -y gitlab-ce=15.8.3-ce.0
  • GitLab 默认安装路径: /var/opt/gitlab
  • 默认情况下,不启用 HTTPS。如果external_url 配置使用 HTTPS 协议且未配置其他证书,则默认 [启用Let's Encrypt](https://docs.gitlab.com/omnibus/settings/ssl/index.html)

5.配置并启动GitLab

# 首次启动也需要以下命令加载配置,完成初始化
sudo gitlab-ctl reconfigure

#启动gitlab
sudo gitlab-ctl restart
sudo gitlab-ctl status

##设置GitLab开机自启
systemctl enable gitlab-runsvdir.service

6.访问GitLab Web界面

打开Web浏览器,访问 https://gitlab.example.com

默认使用root 用户名登录,除非您在安装过程中提供了自定义密码,否则将在 /etc/gitlab/initial_root_password 中随机生成一个密码存储 24 小时 .

GitLab配置更改

官方文档: https://docs.gitlab.com/omnibus/settings/configuration.html

当gitlab安装完成后,根据自己的环境,要修改配置。如:

  • gitlab修改nginx端口,绑定IP等
  • gitlab修改ssh端口
  • gitlab修改访问url等
  • gitlab修改数据库类型(这个没必要,因为这里的数据库只存储些用户名,gitlab代码放在/var/opt/gitlab/git-data/下)
  • gitlab修改redis,gunicorn配置等等

所有的配置在/etc/gitlab/gitlab.rb中修改,修改完配置后执行gitlab-ctl reconfigure生效

基本配置

1. 编辑/etc/gitlab/gitlab.rb

# 修改成你的url地址
external_url "http://gitlab.example.com"

### GitLab Shell settings for GitLab
gitlab_rails['gitlab_shell_ssh_port'] = 22
gitlab_rails['gitlab_shell_git_timeout'] = 800

#停止非必要组件,节约系统资源
logrotate['enable'] = false
prometheus['enable'] = false
grafana['enable'] = false
alertmanager['enable'] = false
node_exporter['enable'] = false

2. 重新配置 GitLab:

sudo gitlab-ctl reconfigure

修改默认存储位置

默认情况下,GitLab 将 Git 存储库数据存储在 /var/opt/gitlab/git-data. 存储库存储在名为 repositories.

1. 创建gitlab 数据目录并授权

mkdir -p /data/gitlab/git-data
chown -R git:git /data/gitlab
chmod -R +x /data

2. 编辑/etc/gitlab/gitlab.rb:

##要更改父目录的位置git-data:
git_data_dirs({ "default" => { "path" => "/data/gitlab/git-data" } })

##你也可以添加多个 Git 数据目录,目标目录及其任何子路径都不能是符号链接
git_data_dirs({
  "default" => { "path" => "/data/gitlab/git-data" },
  "alternative" => { "path" => "/data/nas/git-data" }
})

##可选,将存储库同步到新位置。注意后面没有斜杠 repositories,但是后面有一个斜杠git-data:
#sudo rsync -av --delete /data/gitlab/git-data/repositories /data/nas/git-data/

3. 重新配置 GitLab:

##停止当前gitlab,重新加载配置
sudo gitlab-ctl stop
sudo gitlab-ctl reconfigure

##重新加载后,会发现在/data/gitlab/git-data 目录下多出一个repositories目录
##最后启动gitlab即可
sudo gitlab-ctl restart

修改备份文件默认目录

官方文档: https://docs.gitlab.com/omnibus/settings/backups.html

1. 创建gitlab 数据目录并授权

mkdir -p /data/backup/gitlab

# 赋予目录权限,否则重新加载配置会报权限错误
chmod -R 0644 /data/backup/gitlab
chmod -R +x /data/

2. 修改/etc/gitlab/gitlab.rb来修改默认存放备份文件的目录:

gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/data/backup/gitlab"
gitlab_rails['backup_archive_permissions'] = 0644

##将备份生存期限制为 7 天 - 604800 秒
gitlab_rails['backup_keep_time'] = 604800

3. 重新加载配置,并重启服务

sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart

配置外部数据库

1. 数据库环境配置

我使用的云数据库,部署步骤忽略

##为 GitLab 创建数据库用户
sudo -u postgres psql -d template1 -c "CREATE USER git CREATEDB;"

##修改用户密码
sudo -u postgres psql -d template1 -c "alter user git with password '12345.com';"

###创建pg_trgm扩展
sudo -u postgres psql -d template1 -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;"

##创建btree_gist扩展 (required for GitLab 13.1+):
sudo -u postgres psql -d template1 -c "CREATE EXTENSION IF NOT EXISTS btree_gist;"

##创建plpgsql扩展
sudo -u postgres psql -d template1 -c "CREATE EXTENSION IF NOT EXISTS plpgsql;"

##创建 GitLab 生产数据库并授予对数据库的所有权限:
sudo -u postgres psql -d template1 -c "CREATE DATABASE gitlabhq_production OWNER git;"
  • 验证测试
##尝试使用新用户连接到新数据库:
sudo -u git -H psql -d gitlabhq_production

##检查是否启用了pg_trgm扩展:
SELECT true AS enabled
FROM pg_available_extensions
WHERE name = 'pg_trgm'
AND installed_version IS NOT NULL;

##如果启用扩展,这将生成以下输出:
enabled
---------
 t
(1 row)

##检查是否启用了btree_gist扩展:
SELECT true AS enabled
FROM pg_available_extensions
WHERE name = 'btree_gist'
AND installed_version IS NOT NULL;

##如果启用扩展,这将生成以下输出:
enabled
---------
 t
(1 row)

##检查是否启用了 plpgsql 扩展:
SELECT true AS enabled
FROM pg_available_extensions
WHERE name = 'plpgsql'
AND installed_version IS NOT NULL;

##如果启用扩展,这将生成以下输出:
enabled
---------
 t
(1 row)

Quit the database session:

gitlabhq_production> \q

2. 编辑/etc/gitlab/gitlab.rb:

# Disable the built-in Postgres
postgresql['enable'] = false

# Fill in the connection details for database.yml
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_encoding'] = 'utf8'
gitlab_rails['db_host'] = '127.0.0.1'
gitlab_rails['db_port'] = 5432
gitlab_rails['db_username'] = 'git' #上面创建的数据库用户
gitlab_rails['db_password'] = '12345.com' #上面创建的数据库用户密码

注意:

  • /etc/gitlab/gitlab.rb应该具有文件权限,0600因为它包含纯文本密码。 PostgreSQL 允许监听多个地址 如果您在 , 中使用多个地址gitlab_rails['db_host'],以逗号分隔,列表中的第一个地址将用于连接。

3. 重新配置 GitLab以使更改生效

sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart

重置密码

官方文档:https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password. Rake 任务可以将用户名作为参数。例如,要为root用户重置密码 :

sudo gitlab-rake "gitlab:password:reset[root]"

邮箱设置

官方文档: https://docs.gitlab.com/omnibus/settings/smtp.html

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "xxx@163.com"
gitlab_rails['smtp_password'] = "xxxxxxxxxxx"  #授权码
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = 'xxx@163.com'

SSL 配置

官方文档: https://docs.gitlab.com/omnibus/settings/ssl/

启用 Let's Encrypt

  1. 编辑/etc/gitlab/gitlab.rb和添加或更改以下条目:
## GitLab instance
external_url "https://gitlab.example.com"         # Must use https protocol
letsencrypt['contact_emails'] = ['foo@email.com'] # Optional

## Container Registry (optional), must use https protocol
registry_external_url "https://registry.example.com"
#registry_nginx['ssl_certificate'] = "path/to/cert"      # Must be absent or commented out

## Mattermost (optional), must use https protocol
mattermost_external_url "https://mattermost.example.com"
  • 证书每 90 天过期一次。您指定的电子邮件地址会contact_emails在到期日期临近时收到警报。
  • GitLab 实例是证书上的主域名。Container Registry 等附加服务作为备用域名添加到同一证书中。在上面的示例中,主域是gitlab.example.com,Container Registry 域是registry.example.com. 您无需设置通配符证书。
  1. 重新配置 GitLab:
sudo gitlab-ctl reconfigure

自动更新证书

默认安装计划在每个月的第 4 天午夜后更新。分钟由 external_url 中的值确定,以帮助在上游 Let's Encrypt 服务器上分配负载。 要明确设置续订时间:

  1. 编辑/etc/gitlab/gitlab.rb:
# Renew every 7th day of the month at 12:30
letsencrypt['auto_renew_hour'] = "12"
letsencrypt['auto_renew_minute'] = "30"
letsencrypt['auto_renew_day_of_month'] = "*/7"
  1. 重新配置 GitLab:
sudo gitlab-ctl reconfigure

仅当证书在 30 天后到期时才会更新证书。例如,如果您将其设置为每月 1 日 00:00 续订,证书在 31 日到期,则证书将在续订前过期。

禁用自动续订:

  1. 编辑/etc/gitlab/gitlab.rb:
letsencrypt['auto_renew'] = false
  1. 重新配置 GitLab:
sudo gitlab-ctl reconfigure

手动更新证书

使用以下任一命令手动更新 Let's Encrypt 证书:

sudo gitlab-ctl reconfigure
sudo gitlab-ctl renew-le-certs

前面的命令仅在证书即将到期时生成更新。

运维操作

##启动所有 gitlab 组件:
sudo gitlab-ctl start

##停止所有 gitlab 组件:
sudo gitlab-ctl stop

##重启所有 gitlab 组件:
sudo gitlab-ctl restart

##查看服务状态
sudo gitlab-ctl status

##启动服务
sudo gitlab-ctl reconfigure

##修改默认的配置文件
sudo vim /etc/gitlab/gitlab.rb

##查看版本
sudo cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

##系统内核调优
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl -p
echo never > /sys/kernel/mm/transparent_hugepage/enabled

##检查gitlab
gitlab-rake gitlab:check SANITIZE=true --trace

##查看日志
sudo gitlab-ctl tail 

GitLab汉化

image.png

备份恢复

官方文档:https://docs.gitlab.com/15.8/ee/raketasks/backup_gitlab.html

备份

  • GitLab 12.2 或更高版本:
sudo gitlab-backup create
  • GitLab 12.1 及更早版本:
gitlab-rake gitlab:backup:create
  • 如果您从源代码安装 GitLab,请使用以下命令:
sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production

确认存档可以传输

为确保生成的存档可由 rsync 传输,您可以设置该GZIP_RSYNCABLE=yes 选项。这会将--rsyncable选项设置为,这仅在与设置备份文件名选项gzip结合使用时才有用。

sudo gitlab-backup create BACKUP=dump GZIP_RSYNCABLE=yes

GitLab 12.1 及更早版本的用户应改用该命令gitlab-rake gitlab:backup:create。

跳过 tar 创建

使用对象存储进行备份时,无法跳过 tar 创建。 添加tar到SKIP变量中会将包含备份的文件和目录保留在用于中间文件的目录中。创建新备份时会覆盖这些文件,因此您应确保将它们复制到别处,因为系统上只能有一个备份。

sudo gitlab-backup create SKIP=tar

备份策略选项

默认备份策略基本上是使用 Linux 命令将数据从各个数据位置流式传输到备份tar。gzip这在大多数情况下工作正常,但当数据快速变化时可能会导致问题。 当tar读取数据时数据发生变化,file changed as we read it可能会发生错误,并导致备份过程失败。为了解决这个问题,8.17 引入了一种名为copy. tar该策略在调用and之前将数据文件复制到临时位置gzip,从而避免了错误。

sudo gitlab-backup create STRATEGY=copy

GitLab 12.1 及更早版本的用户应改用该命令gitlab-rake gitlab:backup:create。

增量备份

增量存储库备份可能比完整存储库备份更快,因为它们仅将自上次备份以来的更改打包到每个存储库的备份包中。增量备份存档没有相互链接:每个存档都是实例的独立备份。必须有一个现有备份才能从以下位置创建增量备份:

在 GitLab 14.9 和 14.10 中,使用BACKUP=<timestamp_of_backup>选项选择要使用的备份。所选的先前备份将被覆盖。 在 GitLab 15.0 及更高版本中,使用PREVIOUS_BACKUP=<timestamp_of_backup>选项选择要使用的备份。默认情况下,会按照备份时间戳部分中的说明创建备份文件。您可以通过设置环境变量[TIMESTAMP]来覆盖文件名部分 。 BACKUP

要创建增量备份,请运行:

sudo gitlab-backup create INCREMENTAL=yes PREVIOUS_BACKUP=<timestamp_of_backup>

要从已压缩的备份创建未压缩的增量备份,请使用SKIP=tar:

sudo gitlab-backup create INCREMENTAL=yes SKIP=tar

上传到本地挂载的共享

您可以使用 Fog Local 存储提供程序将备份发送到本地装载的共享(例如 NFS、CIFS 或 SMB)。

为此,您必须设置以下配置键:

  • backup_upload_connection.local_root: 备份复制到的安装目录。

  • backup_upload_remote_directory: backup_upload_connection.local_root 目录的子目录。如果它不存在,则会创建它。如果要将压缩包复制到挂载目录的根目录,请使用 ..

  • 配置上传到本地安装的共​​享

##编辑/etc/gitlab/gitlab.rb:

gitlab_rails['backup_upload_connection'] = {
  :provider => 'Local',
  :local_root => '/mnt/backups'
}

# The directory inside the mounted folder to copy backups to
# Use '.' to store them in the root directory
gitlab_rails['backup_upload_remote_directory'] = 'gitlab_backups'
  • 对于源安装:
##编辑home/git/gitlab/config/gitlab.yml:

backup:
  upload:
    # Fog storage connection settings, see https://fog.io/storage/ .
    connection:
      provider: Local
      local_root: '/mnt/backups'
    # The directory inside the mounted folder to copy backups to
    # Use '.' to store them in the root directory
    remote_directory: 'gitlab_backups'

重新启动 GitLab 以使更改生效。

备份定时任务

1. 为用户编辑 crontab root:

sudo su -
crontab -e

2. 在那里,添加以下行以安排每天凌晨 2 点进行备份:

0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1

GitLab 12.1 及更早版本的用户应改用该命令gitlab-rake gitlab:backup:create。

卸载

要卸载 Linux 软件包,您可以选择保留数据(存储库、数据库、配置)或全部删除:

1. 可选的,在删除 GitLab 包之前删除 由 Omnibus GitLab 创建的所有用户和组apt(使用或yum):

sudo gitlab-ctl stop && sudo gitlab-ctl remove-accounts

如果您在删除帐户或组时遇到问题,请运行userdel或groupdel手动删除它们,您可能还想从 /home/ 中手动删除剩余的用户主目录。

2. 选择是保留数据还是全部删除数据:

  • 要保留您的数据(存储库、数据库、配置),请停止 GitLab 并删除其监督进程:
sudo systemctl stop gitlab-runsvdir
sudo systemctl disable gitlab-runsvdir
sudo rm /usr/lib/systemd/system/gitlab-runsvdir.service
sudo systemctl daemon-reload
sudo gitlab-ctl uninstall
  • 要删除所有数据:
sudo gitlab-ctl cleanse && sudo rm -r /opt/gitlab

3. 卸载软件包:

# Debian/Ubuntu
sudo apt remove gitlab-ce

# RedHat/CentOS
sudo yum remove gitlab-ce

升级

官方文档:https://docs.gitlab.com/14.0/ee/update/

迁移

把备份文件拷贝到gitlab的备份目录下,根据上面gitlab恢复步骤即可。