Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

安装和配置GitLab社区版

30
Jun
2019

安装和配置GitLab社区版

By Alex
/ in Work
0 Comments
简介

GitLab是由GitLab Inc.开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能。它由 Ruby 写成。后来,一些部分用 Go 语言重写。

架构

在典型安装下,GitLab使用Nginx或者Apache作为前端,反向代理到GitLab的Unicorn的Web服务器。Nginx和Unicorn之间通过UDS进行通信,分工如下:

  1. Nginx负责静态资源的处理
  2. Unicorn负责处理:
    1. GitLab动态Web页面
    2. 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任务
安装
CentOS

首先安装依赖:

Shell
1
2
3
yum install -y curl policycoreutils-python openssh-server
systemctl enable sshd
systemctl start sshd

然后,安装Postfix:

Shell
1
2
3
yum install -y postfix
systemctl enable postfix
systemctl start postfix

Postfix是一个邮件服务器,GitLab发送邮件时需要使用它。

最后,安装GitLab:

Shell
1
2
3
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
 
yum install -y gitlab-ce
Ubuntu

首先安装依赖:

Shell
1
2
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates  

然后,安装Postfix:

Shell
1
sudo apt-get install -y postfix  

最后,安装GitLab:

Shell
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

如果下载缓慢,可以切换为国内源:

/etc/apt/sources.list.d/gitlab_gitlab-ce.list
1
deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu xenial main
配置
如何配置 

按如下步骤进行:

  1. 修改配置文件: /etc/gitlab/gitlab.rb
  2. 执行重配置: gitlab-ctl reconfigure
  3. 重新启动GitLab: gitlab-ctl restart
root密码

默认情况下,GitLab的管理员用户为root,在第一次启动GitLab时会提示你设置其密码。

如果需要更改此密码,登陆到GitLab服务器,然后启动一个Ruby on Rails控制台:

Shell
1
gitlab-rails console production

 然后查找到root用户:

Ruby
1
2
3
user = User.where(id: 1).first
# 或者
user = User.find_by(email: 'admin@local.host')

并修改root的密码:

Ruby
1
2
user.password = 'secret_pass'
user.password_confirmation = 'secret_pass'

保存修改: user.save!

常用配置项
/etc/gitlab/gitlab.rb
Ruby
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
配置主题
邮件服务

设置以下配置项(以腾讯企业邮箱为例):

Ruby
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"

配置并重启: 

Shell
1
2
gitlab-ctl reconfigure
gitlab-ctl restart

打开控制台,发送一封测试邮件:

Ruby
1
Notify.test_email('me@gmem.cc', 'Welcome from Gitlab', 'Hello').deliver_now
gitlab-ctl
子命令 说明
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页面内容。

要执行备份,简单的执行命令:

Shell
1
gitlab-backup create

此外,配置文件需要手工备份:

Shell
1
2
/etc/gitlab/gitlab-secrets.json
/etc/gitlab/gitlab.rb
备份策略

默认的备份策略实际上是从不同位置把数据拷贝,并打包(tar)和压缩(gzip),大部分情况下,这种策略是有效的,除非数据急剧的变化,可能会导致报错。

要解决上述报错,可以改变备份策略为copy:

Shell
1
sudo gitlab-backup create STRATEGY=copy

这种策略的缺点是,备份进程会导致加被的磁盘空间占用。

排除目录

备份时可以指定排除一部分目录:

Shell
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,以下前提条件需要满足:

  1. 备份、恢复时使用的Gitlab版本必须完全一致
  2. 目标Gitlab至少运行过 gitlab-ctl reconfigure一次
  3. 目标Gitlab必须处于启动状态 gitlab-ctl start

恢复的步骤如下:

  1. 把之前的备份文件拷贝到gitlab.rb中配置项 gitlab_rails['backup_path']所指定的路径,默认 /var/opt/gitlab/backups
  2. 停止使用数据库的那些组件:
    Shell
    1
    2
    3
    4
    gitlab-ctl stop unicorn
    gitlab-ctl stop sidekiq
    # Verify
    gitlab-ctl status
  3.  执行恢复,指定备份时间戳:

    Shell
    1
    2
    3
    4
    gitlab-backup restore BACKUP=1493107454_2018_04_25_10.6.4-ce
     
    # 对于 12.1或更老的版本,使用
    gitlab-rake gitlab:backup:restore
  4. 恢复密钥文件 /etc/gitlab/gitlab-secrets.json
  5. 重新配置、重启并检查:
    Shell
    1
    2
    3
    gitlab-ctl reconfigure
    gitlab-ctl restart
    gitlab-rake gitlab:check SANITIZE=true
常见问题
安装配置
No such file or directory - getcwd

清理后重新配置,出现此问题,可能原因是当前目录已经不存在,切换一下目录即可。

备份恢复
Unpacking backup ..  Cannot open: Permission denied

将备份文件的权限都打开即可。

Errno::EACCES: Permission denied @ rb_sysopen - /var/opt/gitlab/.ssh/authorized_keys

将文件的权限都打开即可:

Shell
1
chmod 777  /var/opt/gitlab/.ssh/authorized_keys
gitlab-keys check-permissions  Permission denied

恢复备份后,重新配置Gitlab此错误。解决办法:

Shell
1
chmod -R 777 /var/log/gitlab

最好避免改变Gitlab运行帐户,以避免不必要的问题。 

← 如何申请Let's Encrypt免费证书
Maven原型系统 →

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • 编程语言知识集锦
  • YAML快速参考
  • SVN知识集锦
  • 基于Kurento搭建WebRTC服务器
  • 背诵营笔记

Recent Posts

  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
  • A Comprehensive Study of Kotlin for Java Developers
  • 背诵营笔记
  • 利用LangChain和语言模型交互
  • 享学营笔记
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京。目前供职于腾讯云,专注容器方向。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
    In this blog post, I will walk ...
  • A Comprehensive Study of Kotlin for Java Developers
    Introduction Purpose of the Study Understanding the Mo ...
  • 背诵营笔记
    Day 1 Find Your Greatness 原文 Greatness. It’s just ...
  • 利用LangChain和语言模型交互
    LangChain是什么 从名字上可以看出来,LangChain可以用来构建自然语言处理能力的链条。它是一个库 ...
  • 享学营笔记
    Unit 1 At home Lesson 1 In the ...
  • K8S集群跨云迁移
    要将K8S集群从一个云服务商迁移到另外一个,需要解决以下问题: 各种K8S资源的迁移 工作负载所挂载的数 ...
  • Terraform快速参考
    简介 Terraform用于实现基础设施即代码(infrastructure as code)—— 通过代码( ...
  • 草缸2021
    经过四个多月的努力,我的小小荷兰景到达极致了状态。

  • 编写Kubernetes风格的APIServer
    背景 前段时间接到一个需求做一个工具,工具将在K8S中运行。需求很适合用控制器模式实现,很自然的就基于kube ...
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • eBPF学习笔记
    简介 BPF,即Berkeley Packet Filter,是一个古老的网络封包过滤机制。它允许从用户空间注 ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 杨梅坑 6 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 90 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • Bazel学习笔记 38 people like this
  • 基于Kurento搭建WebRTC服务器 38 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • Ceph学习笔记 27 people like this
  • 基于Calico的CNI 27 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker eBPF Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • qg on Istio中的透明代理问题
  • heao on 基于本地gRPC的Go插件系统
  • 黄豆豆 on Ginkgo学习笔记
  • cloud on OpenStack学习笔记
  • 5dragoncon on Cilium学习笔记
  • Archeb on 重温iptables
  • C/C++编程:WebSocketpp(Linux + Clion + boostAsio) – 源码巴士 on 基于C/C++的WebSocket库
  • jerbin on eBPF学习笔记
  • point on Istio中的透明代理问题
  • G on Istio中的透明代理问题
  • 绿色记忆:Go语言单元测试和仿冒 on Ginkgo学习笔记
  • point on Istio中的透明代理问题
  • 【Maven】maven插件开发实战 – IT汇 on Maven插件开发
  • chenlx on eBPF学习笔记
  • Alex on eBPF学习笔记
  • CFC4N on eBPF学习笔记
  • 李运田 on 念爷爷
  • yongman on 记录一次KeyDB缓慢的定位过程
  • Alex on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • haolipeng on 基于本地gRPC的Go插件系统
  • 吴杰 on 基于C/C++的WebSocket库
©2005-2025 Gmem.cc | Powered by WordPress | 京ICP备18007345号-2