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 系统拓扑
二、配置记录
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
端口,比如2222
,22
端口分配给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 配置预览
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_from
与smtp_user_name
需保持一致性,否则邮件服务端会拒绝。
解决:声明email_from
与smtp_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
表
-
进入数据库终端:
进入容器输入以下命令:
sudo gitlab-rails dbconsole
-
截断
web_hooks
表:TRUNCATE web_hooks CASCADE;