安装和配置GitLab社区版
GitLab是由GitLab Inc.开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能。它由 Ruby 写成。后来,一些部分用 Go 语言重写。
在典型安装下,GitLab使用Nginx或者Apache作为前端,反向代理到GitLab的Unicorn的Web服务器。Nginx和Unicorn之间通过UDS进行通信,分工如下:
- Nginx负责静态资源的处理
 - Unicorn负责处理:
- GitLab动态Web页面
 - GitLab API
 
 
GitLab使用Sidekiq(一个基于Ruby的高效后台任务处理系统)来处理后台任务,并使用Redis作为后台任务的非持久化存储后端。
用户、权限、Issue等元数据存放在MySQL或者PostgreSQL中。
| 组件 | 用途 | 
| Nginx | 作为反向代理 | 
| 
 Unicorn / GitLab Rails) 
  | 
处理Web UI以及GitLab API的请求 | 
| Sidekiq | 后台任务处理器 | 
| Gitaly | 负责处理GitLab发起的所有Git调用的RPC服务 | 
| GitLab Workhorse | 智能反向代理,用于处理巨大的HTTP请求 | 
| GitLab Shell | 处理通过SSH发来的Git请求 | 
| GitLab Pages | 负责Host静态网站 | 
| Registry | 负责存储容器镜像 | 
| Redis | 提供缓存服务 | 
| PostgreSQL | 数据库 | 
| Prometheus Alertmanager Grafana  | 
GitLab的自我监控 | 
| MinIO | 对象存储服务 | 
| Runner | 执行GitLab CI任务 | 
首先安装依赖:
| 
					 1 2 3  | 
						yum install -y curl policycoreutils-python openssh-server systemctl enable sshd systemctl start sshd  | 
					
然后,安装Postfix:
| 
					 1 2 3  | 
						yum install -y postfix systemctl enable postfix systemctl start postfix  | 
					
Postfix是一个邮件服务器,GitLab发送邮件时需要使用它。
最后,安装GitLab:
| 
					 1 2 3  | 
						curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash yum install -y gitlab-ce  | 
					
首先安装依赖:
| 
					 1 2  | 
						sudo apt-get update  sudo apt-get install -y curl openssh-server ca-certificates     | 
					
然后,安装Postfix:
| 
					 1  | 
						sudo apt-get install -y postfix     | 
					
最后,安装GitLab:
| 
					 1 2 3 4 5  | 
						curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash  apt install -y gitlab-ce # 安装指定版本 apt install gitlab-ce=12.0.2-ce.0  | 
					
如果下载缓慢,可以切换为国内源:
| 
					 1  | 
						deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu xenial main  | 
					
按如下步骤进行:
- 修改配置文件: /etc/gitlab/gitlab.rb
 - 执行重配置: gitlab-ctl reconfigure
 - 重新启动GitLab: gitlab-ctl restart
 
默认情况下,GitLab的管理员用户为root,在第一次启动GitLab时会提示你设置其密码。
如果需要更改此密码,登陆到GitLab服务器,然后启动一个Ruby on Rails控制台:
| 
					 1  | 
						gitlab-rails console production  | 
					
然后查找到root用户:
| 
					 1 2 3  | 
						user = User.where(id: 1).first # 或者 user = User.find_by(email: 'admin@local.host')  | 
					
并修改root的密码:
| 
					 1 2  | 
						user.password = 'secret_pass' user.password_confirmation = 'secret_pass'  | 
					
保存修改: user.save!
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40  | 
						# 外部访问GitLab使用的URL external_url 'https://git.gmem.cc' # GitLab发送Webhook HTTP请求后,等待响应的超时 gitlab_rails['webhook_timeout'] = 60 # 设置SSH主机名 gitlab_rails['gitlab_ssh_host'] = 'git.gmem.cc' # 设置时区 gitlab_rails['time_zone'] = 'Asia/Shanghai' # 运行GitLab组件使用的操作系统用户 user['username'] = "gitlab" user['group'] = "gitlab" # 必须匹配Unicorn的监听端口 gitlab_workhorse['auth_backend'] = "http://localhost:2081" # Unicorn是一个Ruby Web服务器,它提高GitLab的Web Interface unicorn['port'] = 2081 # 我们通常会在Unicorn前面加上Nginx作为反向代理 nginx['enable'] = true nginx['client_max_body_size'] = '250m' nginx['redirect_http_to_https'] = true # Nginx的HTTP端口 nginx['redirect_http_to_https_port'] = 2080 # Nginx的HTTPS端口 nginx['listen_port'] = 2443 # TLS Termination配置 nginx['ssl_certificate'] = "/etc/letsencrypt/live/gmem.cc/cert.pem" nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gmem.cc/privkey.pem # 禁止普通用户创建组 gitlab_rails['gitlab_default_can_create_group'] = false # 禁止改变用户名 gitlab_rails['gitlab_username_changing_enabled'] = false  | 
					
设置以下配置项(以腾讯企业邮箱为例):
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  | 
						gitlab_rails['gitlab_email_enabled'] = true gitlab_rails['gitlab_email_from'] = 'administrator@git.gmem.cc' gitlab_rails['gitlab_email_display_name'] = 'Git Admin' gitlab_rails['gitlab_email_reply_to'] = 'noreply@git.gmem.cc' gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.exmail.qq.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "administrator@git.gmem.cc" gitlab_rails['smtp_password'] = "..." gitlab_rails['smtp_domain'] = "exmail.qq.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true user['git_user_email'] = "administrator@git.gmem.cc"  | 
					
配置并重启:
| 
					 1 2  | 
						gitlab-ctl reconfigure gitlab-ctl restart  | 
					
打开控制台,发送一封测试邮件:
| 
					 1  | 
						Notify.test_email('me@gmem.cc', 'Welcome from Gitlab', 'Hello').deliver_now  | 
					
| 子命令 | 说明 | 
| check-config | 检查gitlab.rb中是否有已经在指定版本中移除的配置项 | 
| diff-config | 对比用户配置、包可用配置 | 
| prometheus-upgrade | 更新Prometheus数据到最新支持的版本 | 
| remove-accounts | 删除GitLab使用的所有用户和组 | 
| upgrade | 在升级GitLab后进行数据迁移 | 
| cleanse | 清除所有GitLab数据,以便重头开始 | 
| reconfigure | 重新配置GitLab | 
| show-config | 显示reconfigure会生成的配置 | 
| uninstall | 杀死所有组件,卸载进程守护器(Supervisor) | 
| graceful-kill | 优雅的关闭组件 | 
| hup int kill  term usr1 usr2  | 
发送对应的信号给GitLab | 
| once | 如果服务处于停止状态,则启动。但是,不会在其宕掉后自动重启 | 
| restart | 重新启动 | 
| start stop | 启动或停止 | 
| status | 显示所有服务的状态 | 
| service-list | 列出所有服务,其中处于启用状态的,打上*标记 | 
| tail | 显示所有服务的日志 | 
| renew-le-certs | 更新Let's Encrypt证书 | 
Gitlab提供了一个命令行来备份整个系统,备份的内容包括数据库、附件、Git仓库数据、CI/CD日志、CI/CD构件、LFS对象、容器镜像、GitLab页面内容。
要执行备份,简单的执行命令:
| 
					 1  | 
						gitlab-backup create  | 
					
此外,配置文件需要手工备份:
| 
					 1 2  | 
						/etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab.rb  | 
					
默认的备份策略实际上是从不同位置把数据拷贝,并打包(tar)和压缩(gzip),大部分情况下,这种策略是有效的,除非数据急剧的变化,可能会导致报错。
要解决上述报错,可以改变备份策略为copy:
| 
					 1  | 
						sudo gitlab-backup create STRATEGY=copy  | 
					
这种策略的缺点是,备份进程会导致加被的磁盘空间占用。
备份时可以指定排除一部分目录:
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						# db (database) # uploads (attachments) # repositories (Git repositories data) # builds (CI job output logs) # artifacts (CI job artifacts) # lfs (LFS objects) # registry (Container Registry images) # pages (Pages content) gitlab-backup create SKIP=db,uploads  | 
					
可以从指定的备份恢复Gitlab,以下前提条件需要满足:
- 备份、恢复时使用的Gitlab版本必须完全一致
 - 目标Gitlab至少运行过 gitlab-ctl reconfigure一次
 - 目标Gitlab必须处于启动状态 gitlab-ctl start
 
恢复的步骤如下:
- 把之前的备份文件拷贝到gitlab.rb中配置项 gitlab_rails['backup_path']所指定的路径,默认 /var/opt/gitlab/backups
 - 停止使用数据库的那些组件:
1234gitlab-ctl stop unicorngitlab-ctl stop sidekiq# Verifygitlab-ctl status - 
执行恢复,指定备份时间戳:
1234gitlab-backup restore BACKUP=1493107454_2018_04_25_10.6.4-ce# 对于 12.1或更老的版本,使用gitlab-rake gitlab:backup:restore - 恢复密钥文件 /etc/gitlab/gitlab-secrets.json
 - 重新配置、重启并检查:
123gitlab-ctl reconfiguregitlab-ctl restartgitlab-rake gitlab:check SANITIZE=true 
清理后重新配置,出现此问题,可能原因是当前目录已经不存在,切换一下目录即可。
将备份文件的权限都打开即可。
将文件的权限都打开即可:
| 
					 1  | 
						chmod 777  /var/opt/gitlab/.ssh/authorized_keys  | 
					
恢复备份后,重新配置Gitlab此错误。解决办法:
| 
					 1  | 
						chmod -R 777 /var/log/gitlab  | 
					
最好避免改变Gitlab运行帐户,以避免不必要的问题。
            
Leave a Reply