7 min read

Gitlab源码仓库系统部署记录

Gitlab源码仓库系统部署记录

前言

  源码仓库是企业内部比较重要的服务系统,目前最成熟的开源应用是gitlab,有着功能全面、稳定等优点,如果说有什么缺点的话,就是偏重量化。如果纠结这点,可以选择更加轻量化的gitea,gogs。

  本文的部署基于阿里云平台。

一、资源列表

1.1 云资源表

序号 产品资源 资源规格 监听端口 备注
01 SLB 负载均衡 性能保障型slb.s1.small 22/TCP、443/TCP
02 ECS云服务器 4C/8G/50G(系统盘) + 300G(数据盘) 22/TCP、80/TCP

要点:

  • HTTPS配置在SLB 负载均衡上
  • HTTPS使用SLB负载均衡的HTTPS负载
  • SSH使用SLB负载均衡的TCP负载
  • ECS应用服务器需要根据SLB传递的HTTP头部来获取客户端直接IP
  • Gitlab容器内的/etc/gitlab目录文件建议持久化,否则运行docker-compose down后某些功能会出现500错误(secret key与证书已重新生成了)
  • 备份时将/etc/gitlab目录下的/etc/gitlab/gitlab-secrets.json文件也要一并备份(最好整个目录)

1.2 系统拓扑

image-20210527094016786

二、配置记录

2.1 系统配置

2.1.1 配置主机名

hostnamectl set-hostname git.xx.com
echo "本机IP    git.xx.com" | tee -a "/etc/hosts"

2.1.2 系统更新及安装软件包:可选

yum -y update && yum -y install git htop tmux wget bash-completion

2.1.3 关闭不必要的服务可选

systemctl disable postfix.service
systemctl stop postfix.service

2.1.4 系统内核参数

cat >/etc/sysctl.d/11-sys.conf<<EOF
net.ipv4.tcp_slow_start_after_idle = 0            # 禁用SSR
net.ipv4.tcp_fastopen = 3                         # 开启TFO
net.ipv4.ip_local_port_range = 1024  65535        # 扩大端口使用范围
EOF

sysctl --system

2.1.5 更改系SSH 端口

将原系统 SSH 主机端口更改为非22端口,比如222222端口分配给gitlab

vim /etc/ssh/sshd_config
Port 2222                 # 17行

sshd -t && systemctl restart sshd

2.1.6 其它安全配置

  • 终端超时锁定

  配置终端超时时间为 20 分钟,即登录终端后20分钟不进行操作终端自动将会话进行中断。

grep 'TMOUT' /etc/profile && sed -i 's/TMOUT.*/TMOUT=1200/' /etc/profile || \
            echo -en '\n# Terminal Timeout\nTMOUT=1200\n' >>/etc/profile

2.2 GitLab 系统部署

2.2.1 目录规划

主机目录 容器目录 用途
/data/gitlab/data /var/opt/gitlab GitLab应用存储目录
/data/gitlab/logs /var/log/gitlab GitLab日志存储目录
/data/gitlab/compose docker-compose 目录

2.2.2 拉取镜像

docker pull gitlab/gitlab-ce:11.10.1-ce.0 

2.2.3 docker 编排

编排目录结构

# tree  /data/compose/gitlab
/data/compose/gitlab                 ------> 编排主目录
├── config                           ------> GitLab 配置主目录
└── docker-compose.yaml              ------> docker-compose 主文件
  • docker-config.yaml
version: '3'
services:
  gitlab:
    image: 'gitlab/gitlab-ce:11.10.1-ce.0'
    restart: always
    hostname: 'gitlab.haid.com.cn'
    ports:
      - "80:80"
      - "22:22"
    volumes:
      - './config:/etc/gitlab:rw'
      - '/data/gitlab/dbs:/var/opt/gitlab:rw'
      - '/data/gitlab/logs:/var/log/gitlab:rw'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://git.xx.com'
        gitlab_rails['gitlab_shell_ssh_port'] = 22

2.2.4 gitlab.rb 配置摘要

# 系统外部URL,按实际填写
external_url 'https://git.xx.com'
# 配置 ssh 主机名,按实际填写
gitlab_rails['gitlab_ssh_host'] = 'git.xx.com'
# 系统时区
gitlab_rails['time_zone'] = 'Asia/Shanghai'
# 将22端口分配给`gitlab`
gitlab_rails['gitlab_shell_ssh_port'] = 22  

### SMTP 配置
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "mail.xx.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "gitlab@xx.com"
gitlab_rails['smtp_password'] = "password"
gitlab_rails['smtp_domain'] = "mail.xx.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['gitlab_email_from'] = "gitlab@xx.com"
gitlab_rails['gitlab_email_reply_to'] = "noreply@xx.com"
gitlab_rails['smtp_openssl_verify_mode'] = 'none'
gitlab_rails['smtp_ca_path'] = "/etc/ssl/certs"
gitlab_rails['smtp_ca_file'] = "/etc/ssl/certs/ca-bundle.trust.crt"

### nginx 配置
nginx['enable'] = true
nginx['client_max_body_size'] = '250m'
nginx['redirect_http_to_https'] = true
nginx['gzip_enabled'] = true
nginx['listen_port'] = 80
nginx['listen_https'] = false

# 从SLB上面获取真实源IP
nginx['real_ip_trusted_addresses'] = ["100.0.0.0/8"]
nginx['real_ip_header'] = 'X-Forwarded-For'
nginx['real_ip_recursive'] = 'on'

# 将真实源IP传输到应用后端
nginx['proxy_set_headers'] = {
  "Host" = "$http_host_with_default",
  "X-Real-IP" = "$remote_addr",
  "X-Forwarded-For" = "$proxy_add_x_forwarded_for",
  "X-Forwarded-Proto" = "https",
  "X-Forwarded-Ssl" = "on",
  "Upgrade" = "$http_upgrade",
  "Connection" = "$connection_upgrade"
}

配置参考

2.2.4 配置启动

cd /data/compose/gitlab
docker-compose up -d

三、 SLB负载均衡配置

3.1 SLB配置策略

序号 负载协议 负载端口 后端协议 后端端口 备注
01 HTTPS 443 HTTP 80 HTTPS协议访问
02 TCP 22 TCP TCP SSH协议访问

3.2 配置预览

image-20210526174213413

Tips: HTTPS 配置到SLB负载均衡上,后续无需在gitlab 服务器上维护证书。

四、运维备忘

4.1 账号备忘

  • web 超级管理员用户: gitlabadm
  • web 超级管理员邮件:待补充

4.2 常用命令

  • 检查配置文件是否合法
$ docker exec -it gitlab_gitlab_1 gitlab-ctl check-config
  • 更改配置文件后使其生效
$ docker exec -it gitlab_gitlab_1 gitlab-ctl reconfigure

配置文件指: /etc/gitlab/gitlab.rb,实际上该命令调用了 chef 自动化工具,使其重新渲染gitlab系统配置再重新启动服务。故而所有的配置建议都在该文件中进行配置

  • 停止服务
cd /data/compose/gitlab && docker-compose down
  • 当前系统运行了哪些服务
$ docker exec -it gitlab_gitlab_1  gitlab-ctl service-list
  • 检查服务运行状态
$ docker exec -it gitlab_gitlab_1  gitlab-ctl status
  • 查看系统日志
$ docker logs gitlab_gitlab_1

4.3 gitlab备份还原

4.3.1 备份

$ docker exec -t <container name> gitlab-rake gitlab:backup:create

或者接文件名

$ docker exec -t <container name> gitlab-rake gitlab:backup:create BACKUP=gitlab-haid

以上备份不会备份以下文件--需手动备份:

对于综合:

  • /etc/gitlab/gitlab-secrets.json
  • /etc/gitlab/gitlab.rb

4.3.2 还原

$ docker exec -it <name of container> gitlab-rake gitlab:backup:restore

4.4 官网文档手册

五、故障记录

5.1 邮件无法正常投递

  邮件无法正常投递,并提示邮件服务器证书不匹配,错误信息提示如下:

OpenSSL::SSL::SSLError: hostname "mail.haid.com.cn" does not match the server certificate

原因:C/S 连接协商不匹配。

解决:邮件服务器使用的 STARTTLS 连接,声明即可,同时取消 关于SMTP_TLS 配置。

gitlab_rails['smtp_enable_starttls_auto'] = true

5.2 此发件人无权限发送邮件

  报错信息如下:

Net::SMTPFatalError: 550 5.7.60 SMTP; Client does not have permissions to send as this sender

原因:email_fromsmtp_user_name需保持一致性,否则邮件服务端会拒绝。

解决:声明email_fromsmtp_user_name一致即可。

gitlab_rails['gitlab_email_from'] = "haid-gitlab@haid.com.cn"

5.3 证书校验失败

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed (self signed certificate)

解决:关闭SMTP的证书校验。

gitlab_rails['smtp_openssl_verify_mode'] = 'none'

5.4 修复仓库integrations报500错误

修复方法是截断web_hooks

  1. 进入数据库终端:

    进入容器输入以下命令:

    sudo gitlab-rails dbconsole
    
  2. 截断web_hooks表:

    TRUNCATE web_hooks CASCADE;