# 采用docker方式安装gitlab代码托管服务器(一)

gitlab是一个代码托管服务器,很多公司都习惯自建有自己的代码服务器,本文主要介绍两种搭建过程中的第一种,下一篇会介绍第二种。

  1. 使用gitlab的docker镜像的全部功能,包括nginx等,适用于直接访问nginx。

  2. 使用gitlab的docker镜像,但是关闭nginx功能,采用已有的nginx转发。

# 一. 初识gitlab的主要目录及重要配置文件

  • gitlab的配置文件目录:/etc/gitlab
  • gitlab的数据目录:/var/opt/gitlab
  • gitlab的日志目录 :/var/log/gitlab
  • gitlab的主要配置文件:/etc/gitlab/gitlab.rb

以上目录由于以后gitlab升级或删除容器时可能要保留,所以要把他们挂载到宿主机上。

# 二. 默认占用端口(容器<-->宿主机)

  • http: 80<-->80

  • https: 443<-->443

  • ssh: 22 <-->222

    由于22端口一般被远程ssh占用,所以我们映射到222端口

# 三. 新建挂载目录

gitlab挂载目录的根目录选择放在/home/docker/base/gitlab-nginx下,分别创建shell脚本目录script,配置文件目录conf,数据目录data,日志目录logs

  • 创建脚本

    mkdir -p /home/docker/base/gitlab-nginx
    cd /home/docker/base/gitlab-nginx
    mkdir script conf data logs
    
  • 创建后的目录树结构

    .
    └── gitlab-nginx
        ├── conf
        ├── data
        ├── logs
        └── script
    

# 四. 创建gitlab的shell脚本run-gitlab.sh

#!/bin/bash
home_dir=/home/docker/base/gitlab-nginx
ver=$1
if [ ! $ver ]; then
	ver='latest'
fi

if [ ! -e "/etc/localtime" ]; then
  ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
fi

if [ ! -e "/etc/timezone" ]; then
   echo Asia/Shanghai > /etc/timezone  
fi

# hostname根据自己的域名修改。
docker run -d \
	--name gitlab-nginx \
	--hostname git.ifar.top \
	-p 80:80 \
	-p 443:443 \
	-p 222:22 \
	-v /etc/localtime:/etc/localtime \
	-v /etc/timezone:/etc/timezone \
	-v $home_dir/conf:/etc/gitlab \
	-v $home_dir/logs:/var/log/gitlab \
    -v $home_dir/data:/var/opt/gitlab \
	gitlab/gitlab-ce:$ver

hostname根据自己的域名修改,在这里使用git.ifar.top来举例

# 五. 运行run-gitlab.sh

#添加执行权限给脚本
chmod +x run-gitlab.sh
#运行脚本
./run-gitlab.sh
#查看运行情况
docker logs -f gitlab

# 六. 修改gitlab.rb配置

主要包括以下配置:

  • 外部url链接(http(s)😕/git.ifar.top)
  • 时区配置(Asia/Shanghai)
  • clone的ssh链接地址端口(222)
  • 邮箱服务器配置
  • 邮箱配置
  • 备份配置
  • 完整的https版的gitlab.rb配置文件

    external_url "https://git.ifar.top"
    #访问http协议自动重定向到https
    nginx['redirect_http_to_https'] = true
    
    gitlab_rails['time_zone'] = 'Asia/Shanghai'
    
    gitlab_rails['gitlab_shell_ssh_port'] = 222
    #https域名对应的ssl文件
    nginx['ssl_certificate'] = "/etc/gitlab/ssl/git.ifar.top.crt"
    nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/git.ifar.top.key"
    
    gitlab_rails['smtp_enable'] = true
    gitlab_rails['smtp_address'] = "smtp.163.com"
    gitlab_rails['smtp_port'] = 465
    gitlab_rails['smtp_user_name'] = "ifar@163.com"
    #开启smtp生成的密钥串
    gitlab_rails['smtp_password'] = "VMEZGFVLSXFWKAL"
    gitlab_rails['smtp_domain'] = "163.com"
    gitlab_rails['smtp_authentication'] = "login"
    gitlab_rails['smtp_enable_starttls_auto'] = true
    gitlab_rails['smtp_tls'] = true
    
    gitlab_rails['gitlab_email_from'] = "ifar@163.com"
    gitlab_rails['gitlab_email_display_name'] = "默远代码服务"
    gitlab_rails['gitlab_email_reply_to'] = "ifar@163.com"
    gitlab_rails['gitlab_email_subject_suffix'] = "gitlab代码服务"
    
    user['git_user_email'] = "ifar@163.com"
    
    #秒为单位,7天前的备份删除
    gitlab_rails['backup_keep_time'] = 604800
    
    
  • 完整的http版的gitlab.rb配置文件

    external_url "http://git.ifar.top"
    
    gitlab_rails['time_zone'] = 'Asia/Shanghai'
    
    gitlab_rails['gitlab_shell_ssh_port'] = 222
    
    gitlab_rails['smtp_enable'] = true
    gitlab_rails['smtp_address'] = "smtp.163.com"
    gitlab_rails['smtp_port'] = 465
    gitlab_rails['smtp_user_name'] = "ifar@163.com"
    #开启smtp生成的密钥串
    gitlab_rails['smtp_password'] = "VMEZGFVLSXFWKAL"
    gitlab_rails['smtp_domain'] = "163.com"
    gitlab_rails['smtp_authentication'] = "login"
    gitlab_rails['smtp_enable_starttls_auto'] = true
    gitlab_rails['smtp_tls'] = true
    
    gitlab_rails['gitlab_email_from'] = 'ifar@163.com'
    gitlab_rails['gitlab_email_display_name'] = '默远代码服务'
    gitlab_rails['gitlab_email_reply_to'] = 'ifar@163.com'
    gitlab_rails['gitlab_email_subject_suffix'] = 'gitlab代码服务'
    
    user['git_user_email'] = "ifar@163.com"
    
    #秒为单位,7天前的备份删除
    gitlab_rails['backup_keep_time'] = 604800
    

# 七. 重启gitlab容器

  • 重启gitlab容器

    docker restart gitlab-nginx
    

# 八. 测试邮箱配置

  • 测试邮箱是否配置正确

    docker exec -it gitlab-nginx /bin/bash
    #进入控制台
    gitlab-rails console
    #验证邮箱服务配置是否正确
    Notify.test_email('soul0328@qq.com', '测试gitlab邮箱服务器配置是否正确', '当你看到这条信息,表明配置正确了').deliver_now
    quit
    exit
    

# 九. 访问并修改管理员密码

  • 查看root的初始密码

    cat /home/docker/base/gitlab-nginx/conf/initial_root_password
    
  • 在浏览器访问登录后并修改密码

    https://git.ifar.top
    

# 十. 备份配置和数据

  • 手动备份配置

    docker exec -t gitlab-nginx gitlab-ctl backup-etc
    
  • 定时备份配置

    crontab -e
    > o
    13 0 * * * docker exec -t gitlab-nginx gitlab-ctl backup-etc
    > esc
    > :wq
    #或
    mkdir -p /var/spool/cron && echo "13 0 * * * docker exec -t gitlab-nginx gitlab-ctl backup-etc" >> /var/spool/cron/root
    #或
    echo "13 0 * * * root docker exec -t gitlab-nginx gitlab-ctl backup-etc" >> /etc/crontab
    
  • 手动备份数据

    docker exec -t gitlab-nginx gitlab-backup
    
  • 定时备份数据

    > crontab -e
    > o
    13 3 * * * docker exec -t gitlab-nginx gitlab-backup
    > esc
    > :wq
    #或
    mkdir -p /var/spool/cron && echo "13 3 * * * docker exec -t gitlab-nginx gitlab-backup" >> /var/spool/cron/root
    #或
    echo "13 3 * * * root docker exec -t gitlab-nginx gitlab-backup" >> /etc/crontab
    

# 十一. 还原配置和数据

  • 还原配置(直接解压替换)

    #进入容器
    docker exec -it gitlab-nginx /bin/bash
    #备份现有的配置
    cp -r /etc/gitlab /etc/gitlab_$(date +%s)
    #找到备份配置,解压到/目录即可
    tar -xf gitlab_config_1650770402_2022_04_24.tar -C /
    
  • 还原数据(使用restore命令)

    #还原1650621321_2022_04_22_14.6.1_gitlab_backup.tar
    docker exec -it gitlab-nginx gitlab-backup restore BACKUP=1650621321_2022_04_22_14.6.1