安装和配置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