GitLab安装记录
[[../容器相关/Docker/Docker]]安装
拉取gitlab镜像:
docker pull gitlab/gitlab-ce:lastest
# 创建目录
mkdir -p /data/gitlab/config /data/gitlab/logs /data/gitlab/data
##### 配置文件:/data/gitlab/config/gitlab.rb
# 启动容器:官方推荐最低配置2核4G,低于2核服务无法启动。我在这里限制了内存使用量,最高2G,swap也是2G,也就是理论上最高能使用4G内存,
docker run -d -p 81:80 -p 24822:22 -m 2g --memory-swap=2g --name gitlab -v /etc/localtime:/etc/localtime:ro -v /data/gitlab/config:/etc/gitlab -v /data/gitlab/logs:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest
以下为通过yum安装说明
配置gitlab源 到/etc/yum.repos.d目录下新建gitlab-ce.repo文件,
[gitlab-ce]
name=gitlab-ce
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7
repo_gpgcheck=0
gpgcheck=0
enabled=1
gpgkey=https://packages.gitlab.com/gpg.key 安装gitlab
yum makecache
yum install -y gitlab-ce
gitlab-ctl reconfigure服务控制 启动 | 重启 | 停止
gitlab-ctl start | restart | stop启动后CPU 内存占用过高的处理:默认会使用所有CPU核心,正常不需要这么多,可以适当调整 修改/etc/gitlab/gitlab.rb中的unicorn值,取消注释 unicorn[‘worker_processes’] = 2 适当修改CPU核心使用数量,最小值为2 官方文档
配置SMTP发送邮件
我用的是腾讯企业邮箱,注释部分请参考对应邮件系统设置 在/etc/gitlab/gitlab.rb中的smtp段增加如下内容
gitlab_rails[‘smtp_enable’] = true
gitlab_rails[‘smtp_address’] = “smtp.exmail.qq.com”
gitlab_rails[‘smtp_port’] = 465
gitlab_rails[‘smtp_user_name’] = “[email protected]”
gitlab_rails[‘smtp_password’] = “12345678”
gitlab_rails[‘smtp_domain’] = “smtp.exmail.qq.com”
gitlab_rails[‘smtp_authentication’] = “login”
gitlab_rails[‘smtp_enable_starttls_auto’] = true
gitlab_rails[‘smtp_tls’] = false //腾讯企业邮箱没有该功能,所以是false
gitlab_rails[‘smtp_ssl’] = true //腾讯企业邮箱支持SSL,需要开启
gitlab_rails[‘gitlab_email_from’] = ‘[email protected]’ //发送显示名称
gitlab_rails[‘gitlab_email_reply_to’] = ‘[email protected]’//回复显示地址改完配置文件需要关闭服务执行reconfigure命令,然后再重启服务
gitlab-ctl stop
gitlab-ctl reconfigure
gitlab-ctl start可以通过以下命令测试是否配置成功
gitlab-rails console
> Notify.test_email('[email protected]', '邮件标题', '邮件内容').deliver_now配置通过nginx代理访问 因为本身通过yum安装就会一并安装很多服务,而且会自带安装一个nginx服务。如果服务器本身还有其它服务,特别是80端口被占用的情况下,就需要对配置文件进行修改,尽量让外网不添加额外端口 继续修改/etc/gitlab/gitlab.rb配置文件,找到external_url 和nginx[‘listen_port’] =这两个配置,按如下进行设置
external_url 'http://gitlab.zizi.com.cn' //对外访问的URL
nginx['listen_port'] = 5080 //gitlab自带的nginx端口修改
prometheus['enable'] = false # 禁用prometheus监控信息收集,减少空间占用注:如果不想通过nginx再做一次代理,可以不修改nginx[‘listen_port’] = 这个配置,只修改external_url ‘’,例如 external_url 'http://gitlab.zizi.com.cn:5080' //端口号跟其它服务不冲突即可。这样访问就要加端口号 改完配置文件同样需要关闭服务执行reconfigure命令,然后再重启服务
gitlab-ctl stop
gitlab-ctl reconfigure
gitlab-ctl start在用来做外网访问的nginx服务上增如下配置,实现外网访问
server {
listen 80;
server_name gitlab.com
location / {
proxy_pass http://127.0.0.1:5080;
}
}启用SSL
mkdir -p /etc/gitlab/ssl
cd /etc/gitlab/ssl
openssl req -newkey rsa:2048 -x509 -nodes -days 3650 -out gitlab.crt -keyout gitlab.key # 在生成证书的过程中要准确填写域名信息。修改 gitlab.rb
external_url 'https://gitlab.domain.com'
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.key"如果是以docker方式运行,将证书挂载到容器内即可
重新配置并重启服务
gitlab-ctl stop && gitlab-ctl reconfigure && gitlab-ctl restart记录真实IP
修改gitlab.rb配置文件,添加下面内容然后重启
nginx['real_ip_trusted_addresses'] = ['127.0.0.1','172.16.37.0/24']
nginx['real_ip_header'] = 'X-Forwarded-For'
nginx['real_ip_recursive'] = 'on'
...
...
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"
}
Gitlab 创建备份
使用Gitlab一键安装包安装Gitlab非常简单, 同样的备份恢复与迁移也非常简单. 使用一条命令即可创建完整的Gitlab备份: 12.1以及之前的版本用以下命令备份
gitlab-rake gitlab:backup:create12.2以及之后的版本用以下命令备份
gitlab-backup create使用以上命令会在/var/opt/gitlab/backups目录下创建一个名称类似为1519370071_2018_02_23_10.1.0_gitlab_backup.tar的压缩包, 这个压缩包就是Gitlab整个的完整部分. Gitlab 修改备份文件默认目录 你也可以通过修改/etc/gitlab/gitlab.rb来修改默认存放备份文件的目录:
gitlab_rails['backup_path'] = '/mnt/backups'/mnt/backups修改为你想存放备份的目录即可, 修改完成之后使用gitlab-ctl reconfigure命令重载配置文件即可
Gitlab 自动备份
也可以通过crontab使用备份命令实现自动备份:
crontab -e加入以下, 实现每天凌晨2点进行一次自动备份:
0 2 */1 * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create # 版本小于等于12.1
0 2 */1 * * /opt/gitlab/bin/gitlab-backup create # 版本大于等于12.2GitLab备份寿命管理
GitLab自带备份寿命管理,可以在gitlab.rb配置文件中通过如下配置实现:
## Limit backup lifetime to 7 days - 604800 seconds
gitlab_rails['backup_keep_time'] = 604800或者通过定时任务来实现
0 0 * * * find /var/opt/gitlab/backups/ -f -regex ".*.\(tar\)" -mtime +7 -exec rm -rf {} \;Gitlab 恢复
同样, Gitlab的从备份恢复也非常简单: 停止相关数据连接服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
# 从1519370071_2018_02_23_10.1.0编号备份中恢复
gitlab-rake gitlab:backup:restore BACKUP=1519370071_2018_02_23_10.1.0
# 启动Gitlab
gitlab-ctl startGitlab迁移
跟恢复操作差不多,先升级至最新版本,以防新服务器版本过高导致无法恢复。以下操作是基于docker方式部署的迁移操作
docker pull gitlab/gitlab-ce:latest
docker stop gitlab
docker run -d -p 80:80 -p 22:22 -m 2g --memory-swap=2g --name gitlab -v /etc/localtime:/etc/localtime:ro -v /data/gitlab/config:/etc/gitlab -v /data/gitlab/logs:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest 在升级完的容器服务器上执行如下命令,备份gitlab,会将备份放在gitlab/data/backups目录下
docker exec -t gitlab gitlab-rake gitlab:backup:create在新服务器上先创建一个新的容器,保证跟旧服务版本一至,将之前的备份文件放到gitlab/data/backups目录下,然后用
docker exec -it gitlab bash #进入容器
cd /var/opt/gitlab/backups #切换到备份目录
chown git. * #修改备份文件权限退出容器后后执行如下命令,恢复备份
docker exec -it gitlab gitlab-rake gitlab:backup:restore迁移如同备份与恢复的步骤一样, 只需要将老服务器/var/opt/gitlab/backups目录下的备份文件拷贝到新服务器上的/var/opt/gitlab/backups即可(如果你没修改过默认备份目录的话). 但是需要注意的是新服务器上的Gitlab的版本必须与创建备份时的Gitlab版本号相同. 比如新服务器安装的是最新的7.60版本的Gitlab, 那么迁移之前, 最好将老服务器的Gitlab 升级为7.60在进行备份.
修改git 远程仓库地址,如果迁移了gitlab,导致访问地址发生了改变,可以通过如下方法进行修改 1、用命令修改
git remote rm origin
git remote add origin ssh://[email protected]/test.git2、直接修改config文件,修改仓库根目录下.git/config文件,将其中的地址修改为新地址即可
GitLab Docker版本备份脚本
#! /bin/bash
gitlab_name="dev-gitlab"
gitlab_dir=/data/gitlab
backup_dir=/data/gitlab/backups
docker exec -t gitlab gitlab-rake gitlab:backup:create 2>&1 >> ${backup_dir}/$(date +%F-%H-%M-%S).log
cd ${gitlab_dir} && tar czf ${backup_dir}/${gitlab_name}_config_$(date +%F-%H-%M-%S).tar.gz config
find %{backup_dir}/ -type f -regex ".*.\(tar\|gz\|log\)" -mtime +7 -exec rm -rf {} \;gitlab docker版本自动备份并备份到阿里云OSS脚本
**需要有OSS资源 需要安装oss命令行工具,且有相应的访问权限,具体参考文档 https://help.aliyun.com/document_detail/50452.html?spm=5176.11065259.1996646101.searchclickresult.6ee48996ACufMd **
#! /bin/bash
DATE=`date +%F-%H-%M-%S`
# OLDFILE=`ossutil64 ls oss://ser-storage | grep tar | head -n 1 | awk -F ' ' '{print $NF}'`
# 执行gitlab备份命令,并记录下备份过程日志
docker exec -t gitlab gitlab-rake gitlab:backup:create 2>&1 >> /data/gitlab/data/backups/$DATE.log
# 如果备份命令成功,则将备份文件上传至OSS,并检查OSS上备份文件数量是否超过指定值,如果超过,则删除最旧的备份。
if [ $? -eq 0 ];
then
FILENAME=`ls -lt /data/gitlab/data/backups/ | awk -F ' ' ' {print $NF}' | grep "gitlab_backup.tar" | head -n 1`
echo -e "开始上传备份$FILENAME至OSS...\n" >> /data/gitlab/data/backups/$DATE.log
ossutil64 cp /data/gitlab/data/backups/$FILENAME oss://ser-storage/ >> /data/gitlab/data/backups/$DATE.log
echo -e "备份$FILENAME上传至OSS成功!\n" >> /data/gitlab/data/backups/$DATE.log
cd /data/gitlab/data/backups/
LOCALFILE=`ls -l | grep "gitlab_backup.tar" | awk -F ' ' '{print $NF}'`
ls -l | grep "gitlab_backup.tar" | awk -F ' ' '{print $NF}' | xargs rm -rf
echo -e "删除本地备份文件: \n$LOCALFILE" >> /data/gitlab/data/backups/$DATE.log
FILENUMBER=`ossutil64 ls oss://ser-storage | grep "gitlab_backup.tar" | wc -l`
# 检查OSS中的备份文件数量,如果超过5个,则执行下面的删除命令
if [ $FILENUMBER -gt 5 ];
then
echo -e "正在删除旧的OSS备份文件:\n`ossutil64 ls oss://ser-storage | grep "gitlab_backup.tar" | awk -F ' ' '{print $NF}' | head -n -5`" >> /data/gitlab/data/backups/$DATE.log
# 如果过期备份文件数量大于1,则通过for循环删除
if [ `ossutil64 ls oss://ser-storage | grep "gitlab_backup.tar" | awk -F ' ' '{print $NF}' | head -n -5 | wc -l` -gt 1 ];
then
for value in `ossutil64 ls oss://ser-storage | grep "gitlab_backup.tar" | awk -F ' ' '{print $NF}' | head -n -5`
do
ossutil64 rm $value >> /data/gitlab/data/backups/$DATE.log
done
echo -e "\n旧的OSS备份文件删除完成!" >> /data/gitlab/data/backups/$DATE.log
# 否则,直接删除
else
ossutil64 ls oss://ser-storage | grep "gitlab_backup.tar" | awk -F ' ' '{print $NF}' | head -n -5 | xargs ossutil64 rm >> /data/gitlab/data/backups/$DATE.log
fi
# 如果OSS中的备份文件数量少于5个,则记录,没有过期文件需要删除
else
echo -e "\n ################################ \n " >> /data/gitlab/data/backups/$DATE.log
echo -e "备份成功!没有过期备份文件可删除" >> /data/gitlab/data/backups/$DATE.log
fi
# 如果备份命令失败,则写入如下信息以做记录
else
echo -e "\n $DATE 备份失败,请检查备份日志!" >> /data/gitlab/data/backups/$DATE.log
fi
# 保留最近的7份日志文件
# if [ `ls -lt /data/gitlab/data/backups/ | awk -F ' ' ' {print $NF}' | grep log | wc -l ` -gt 7 ];
# then
# ls -lt /data/gitlab/data/backups/ | awk -F ' ' ' {print $NF}' | grep log | tail -n +8 | xargs /usr/bin/rm -rf #
# fi
# 删除七天前的日志文件
if [ `find /data/gitlab/data/backups -mtime +6 | grep log | wc -l` -gt 0 ];
then
echo '删除七天前的日志文件' >> /data/gitlab/data/backups/$DATE.log
find /data/gitlab/data/backups -mtime +6 | grep log >> /data/gitlab/data/backups/$DATE.log
find /data/gitlab/data/backups -mtime +6 | grep log | xargs /usr/bin/rm -rf
else
exit 0
fidocker-compose 编排示例
version: '2.1'
services:
gitlab:
container_name: gitlab
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: 'gitlab.domain.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.domain.com' # 支持https
gitlab_rails['initial_root_password'] = "password" # 初始root用户密码
gitlab_rails['initial_shared_runners_registration_token'] = "p73gTXsPtWjqVLNKn39tRFKbdhPCPvjXLtxNsHj4kzfsM3FtmLTg4kPwcpKpsNsT" #pwgen -Bsv1 64
gitlab_rails['gitlab_shell_ssh_port'] = 2222
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "[email protected]" # 发送邮件通知相关配置
gitlab_rails['smtp_password'] = "emailpassword"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = '[email protected]' # 腾讯企业邮箱可以设置别名
registry_external_url 'http://gitlab.domain.com'
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_host'] = "gitlab.domain.com"
gitlab_rails['time_zone'] = 'Asia/Shanghai'
#nginx['enable'] = true
#nginx['redirect_http_to_https'] = true
#nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.domain.com.crt"
#nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.domain.com.key"
prometheus['enable'] = false
# gitlab 从13升级到14版本时因为从unicorn替换成了puma。所以要在配置文件中注释所有unicorn相关的配置再进行升级,否则会升级失败
#unicorn['worker_processes'] = 4
#gitlab_monitor['enable'] = true
#prometheus_monitoring['enable'] = true
#gitlab_rails['registry_port'] = "5000"
#gitlab_rails['registry_path'] = "/var/opt/gitlab/gitlab-rails/shared/registry"
SET_CONTAINER_TIMEZONE: 'true'
CONTAINER_TIMEZONE: 'Asia/Shanghai'
sysctls:
net.core.somaxconn: 65535
ulimits:
nproc: 131072
nofile:
soft: 131072
hard: 131072
sigpending: 131072
core: 0
ports:
# 启用gitlab_rails['gitlab_shell_ssh_port'] = 2222配置之后,
# 容器内监听的还是22端口,只是对外为2222,
# 所以映射容器内的端口时还是要用22。
- '2222:22'
- '80:80'
#- '443:443'
volumes:
- /data/gitlab/config:/etc/gitlab
- /data/gitlab/log:/var/log/gitlab
- /data/gitlab/backups:/var/opt/gitlab/backups
- /data/gitlab/data:/var/opt/gitlab
- /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro
# gitlab runner 配置
# gitlab-runner:
# container_name: gitlab-runner
# image: 'gitlab/gitlab-runner:latest'
# restart: always
# volumes:
# # - /data/gitlab-runner/config:/etc/gitlab-runner
# - /data/gitlab-runner/.ssh:/home/gitlab-runner/.ssh
# - /var/run/docker.sock:/var/run/docker.sock
# links:
# - gitlab
# sysctls:
# net.core.somaxconn: 65535
# ulimits:
# nproc: 131072
# nofile:
# soft: 131072
# hard: 131072
# sigpending: 131072
# core: 0升级顺序
Gitlab升级不能直接升级到最新版本,有一定的升级顺序,升级顺序可以参考官方文档Upgrading GitLab下的Upgrade paths

使用ssh拉取、推送代码
注意gitlab.rb配置文件中的以下三个要打开,且服务监听地址不能是localhost,这里我用的是非标准端口。
gitlab_rails['gitlab_shell_ssh_port'] = 2222
gitlab_sshd['enable'] = true
gitlab_sshd['listen_address'] = '0.0.0.0:2222'
最后更新于