不记得是什么时候,在树莓派上搭建了供个人使用的 Git 仓库,不是 GitLab 或者是其他 Git 管理平台,就是最原生的 Git 服务,也不觉得有什么奇怪,就这样使用了很久 :)

  八天国庆假期,少了往年游玩的激情,也没有其他什么事情,整日宅在自己的小窝里躲避风和雨,省得过于清闲而又浮想翩翩,于是乎想利用树莓派搭建 GIT 管理平台;当下最为流行开源平台为 GitLab 吧,日常工作中几乎每天与其打交道(无外乎最多的就是 pull、push 吧,偶尔配置一二,算不上熟络)。

首先让我们先了解安装 GitLab 的需求

操作系统
  • GitLab 是专为 Unix 操作系统开发的。 GitLab 不可 运行在 Windows 操作系统上,而且近期也没有考虑支持 Windows。可以在 Linux 虚拟机上或者 Docker 上来安装 GitLab。
CPU
  • 1 核心 CPU 最多支持100个用户,所有的 Workers 和后台任务都在同一个核心工作这将导致 GitLab 服务响应会有点缓慢。
  • 2核心 支持500用户,这也是 官方推荐 的最低标准。
    …
Memory
  • 1GB 物理内存 + 3GB 交换分区 是最低的要求,但我们 强烈反对 使用这样的配置。 查看下面 Unicorn Workers 章节获取更多建议。
  • 2GB 物理内存 + 2GB 交换分区 支持100用户,但服务响应会很慢。
  • 4GB 物理内存 支持100用户,也是 官方推荐 的配置。
    …

再来了解 树莓派 配置

系统
CPU
  • 四核 1.2GHz 64位 ARM Cortex-A53 CPU
Memory
  • 1GB RAM
Other
  • BCM43438 无线局域网和蓝牙低功耗(BLE)

GitLab 安装

  嗯,是的,官方推荐的最低配置是 CPU 2核,4G 物理内存,能正常访问 GitLab 而不会太缓慢,这点很重要,在调试过程中也被这个坑了良久;而能运行 GitLab 最低配置是 CPU 1核,内存 1G + 3GB 交换分区 (比 1G 还小的内存估计也不好找了吧),嗯,是的,是能运行,在不考虑性能的前提下,而且也很是考验使用者的耐心,堪比 2G 时代的速度,不多说了,忍,自行体会吧!

  了解了软硬件的需求,接下来按照 官方文档 进行安装 GitLab ,这一步应该没什么问题,要选择对应的系统版本,我的硬件是树莓派,选择的 raspberry-pi-2 版本,安装到最后应该会看到打印的 GitLab 官方 Logo ,此时说明已经安装完成。

如果在安装中下载过慢,可以直接使用迅雷加速下载对应的版本 GitLab 安装文件,然后上传到系统中安装路径中进行安装,如 Debian 文件路径 /var/cache/apt/archives/partial。

GitLab 配置

接下来就对 GitLab 进行必要的配置,访问地址、存储地址等,打开 GitLab 配置文件【官方配置文档】
  sudo nano /etc/gitlab/gitlab.rb

1、配置 GitLab 域名,启用 HTTPS 时,防火墙必须打开端口 443 以允许入站 HTTPS 流量,可以使用 防火墙配置工具 进行管理。
  external_url 'https://192.168.2.222' # 我配置的是 HTTPS 请求,此处换成你对应的域名或 IP 地址

2、将 HTTP 重定向到 HTTPS, 默认情况下,当您以 https 开头指定一个 external_url 时,Nginx 将不再侦听端口 80 上未加密的 HTTP 流量。如果要将所有 HTTP 流量重定向到 HTTPS,您可以使用该 redirect_http_to_https 设置。
  nginx['enable'] = true # 开启代理
  nginx['redirect_http_to_https'] = true # 开启将 HTTP 重定向到 HTTPS
  nginx['redirect_http_to_https_port'] = 80 # 将 HTTP 80 端口重定向到 HTTPS

3、更改 SSL 证书位置,首先你需要有证书,如你是域名或者是公网 IP,很多网友推荐免费的 Let’s Encrypt,不过有效期为90天,过期后需要再次申请,也提供了在线 免费获取HTTPS证书,如果对于生成私钥不熟悉,可以在线生成私钥;由于我是局域网 IP 不能申请免费证书,就使用自签的证书,然后将自签的证书手动安装到电脑根证书中,当然 Chrome 并不承认自签证书有效,而此时 IE 是承认自签证书是有效的。
  nginx['ssl_certificate'] = "/etc/gitlab/ssl/192.168.2.222.crt"
  nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/192.168.2.222.key"

4、GitLab 电子邮件服务器 SMTP 配置,我使用的 QQ 个人邮箱,首先要开启邮件 POP3/SMTP 服务或者是 IMAP/SMTP 服务,并获取 授权码。

  gitlab_rails['smtp_enable'] = true # 开启 smtp
  gitlab_rails['smtp_address'] = "smtp.qq.com" # smtp 服务器地址
  gitlab_rails['smtp_port'] = 465 # smtp 服务器端口
  gitlab_rails['smtp_user_name'] = "demo@qq.com" # 邮箱地址
  gitlab_rails['smtp_password'] = "授权码" # 申请的授权码
  gitlab_rails['smtp_authentication'] = "login"
  gitlab_rails['smtp_enable_starttls_auto'] = true
  gitlab_rails['smtp_tls'] = true # 启用 tls

  gitlab_rails['gitlab_email_enabled'] = true
  gitlab_rails['gitlab_email_from'] = "demo@qq.com" # 发送人地址
  gitlab_rails['gitlab_email_display_name'] = "demo-GitLab" # 邮件发送人
  gitlab_rails['gitlab_email_reply_to'] = "demo@qq.com" # 回复邮件地址
  gitlab_rails['gitlab_email_subject_suffix'] = "demo" # 邮件主题后缀,没有发现在哪里呈现

  • 测试 SMTP 配置,可以验证 GitLab 使用 Rails 控制台正确发送电子邮件的能力。在 GitLab 服务器上,执行 sudo gitlab-ctl reconfigure重新生成配置,再执行gitlab-rails console 进入控制台。然后,可以在控制台提示符下输入以下命令,使 GitLab 发送测试电子邮件 Notify.test_email('demo.test@qq.com', 'Message Subject', 'Message Body').deliver_now。

5、可选项,配置非默认目录来存储 Git 数据
默认的文件路径为:/var/opt/gitlab/git-data/repositories

1
2
3
4
5
git_data_dirs({
"default": {
"path": "/home/git/code" # 此换成你的地址, git 数据会保存在该地址 repositories 文件夹中
}
})

6、可选项,如果需要调整Unicorn超时或工作人员数量
  unicorn['worker_processes'] = 2 # 最低要求 worker_processes 为2,以便网页编辑器正常工作
  unicorn['worker_timeout'] = 80 # 超时 80s,即使这样,还是时常 502,知道有多慢了吧


目前为止所有前期工作已准备完毕,可以愉快的访问了 GtiLab 了 ^_^

提示:操作 Git 代码库,可以直接使用 GitLab 提供的 SSH git@192.168.2.222:rpi/raspberry.git 和 HTTPS https://192.168.2.222/rpi/raspberry.git。
另一种,直接访问 Git 服务,此方式支持外网直接访问,但需要对路由器做端口转发配置,非默认端口访问方式 ssh://git@公网IP:22200/home/git/code/repositories/rpi/raspberry.git


维护命令

  • 修改任何配置文件后都要输入如下命令使配置生效(或者是修复权限设置):
    sudo gitlab-ctl reconfigure
  • 页面缓存清除:
    sudo gitlab-rake cache:clear RAILS_ENV=production
  • GtiLab 各组件启动:
    sudo gitlab-ctl start
  • GtiLab 各组件停止:
    sudo gitlab-ctl stop
  • GtiLab 各组件重启:
    sudo gitlab-ctl restart
  • 禁用 GtiLab 开机自启动:
    sudo systemctl disable gitlab-runsvdir
  • 启用 GtiLab 开机自启动:
    sudo systemctl enable gitlab-runsvdir
  • 查看 GtiLab 运行状态:
    sudo gitlab-ctl status

遇到的问题

1、Unicorn 默认端口为 8080,若有端口冲突,调整 Unicorn 端口。

  unicorn['listen'] = '127.0.0.1'
  unicorn['port'] = 8082
  gitlab_workhorse['auth_backend'] = "http://localhost:8082" # 这里是否需要调整,有些不太确定了

2、502网关错误,这个问题排查了良久,后来发现内存不足,导致 GitLab 相关组件启动缓慢,或者启动后树莓派出现假死状态。

  • 症状:访问 GitLab 未等待就直接返回 502,或者请求处理等待无响应,同时对树莓派发出的指令也无响应,树莓派处于假死状态,只好断电重启,就这样弄了 n 次。

  • 解决方案:对于个体用户来说,GitLab 显得有些臃肿,同时硬件也是硬伤,只能软件上来解决,在文章上半部分有提到 GitLab 对硬件最低要求是 1GB 物理内存 + 3GB 交换分区,查看树莓派的当前的交换分区只有 100M 完全不满足最低要求,然后就创建 4G 的交换分区,嗯,真的好了,GitLab 可以正常访问,并且树莓派也再未出现假死状态。

  • 创建交换分区

    • 用dd命令创建一个 4G 的文件,它将在 /var/swapfile 路径创建一个名为 swapfile 、大小为 4G 的分区文件,该分区文件拥有1024000个扇区(block),每个扇区大小为 4K 。
      sudo dd if=/dev/zero of=/var/swapfile bs=4k count=1000k

    • 将新创建的文件创建为 Linux Swap 交换区文件:
      sudo mkswap /var/swapfile

    • 把新建的交换区加入的交换内存:
      sudo swapon /var/swapfile

    • 确认交换分区是否挂载成功:
      sudo swapon -s # 查看交换分区
      free -h # 当前内存使用情况

    • 如果需要每次启动时激活当前交换分区,编辑 sudo nano /etc/fstab,添加一行命令:
      /var/swapfile swap swap defaults 0 0

  • SWAP 分区即虚拟内存,它可以突破物理内存的限制,增加运行内存,也就是我们平时所说的 RAM,Swappiness 是一个 Linux 内核参数, 它控制了换出运行时内存的相对权重,默认值是60,可以的取值范围是0-100,建议修改10(不过,没有感觉到有什么不同)

    • 查看你的系统里面的 swappiness:
      sudo cat /proc/sys/vm/swappiness # 不出意外的话,你应该看到是 60

    • 修改 swappiness 值为 10:
      sudo sysctl vm.swappiness=10

    • 即时生效:
      sudo sysctl -p

    • 重启保留当前配置,编辑配置文件 sudo nano /etc/sysctl.conf 添加一行命令:
      vm.swappiness=30

  • 最后,重启树莓派查看配置是否正常:
    sudo restart

 
居然感冒了,上次应该是去年的时候吧,嗯,天气冷了,注意保暖 ^_^