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

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

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

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

# 一. gitlab的主要目录

请参照上一篇

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

  • workhorse: 8013<->8013

  • ssh: 22<->222

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

# 三. 新建挂载目录

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

  • 创建脚本

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

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

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

  • 直接运行脚本即可生成并启动gitlab容器

    #!/bin/bash
    home_dir=/home/docker/base/gitlab
    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 \
    	--hostname git.ifar.top \
    	-p 8013:8013 \
    	-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)
  • 邮箱配置
  • 信任代理地址(git.ifar.top)
  • 备份配置
  • clone的ssh链接地址端口(222)
  • 邮箱服务器配置
  • workhorse配置
  • 外部运行nginx用户
  • 关闭内置nginx
  • 完整的gitlab.rb配置文件

    external_url "https://git.ifar.top"
    
    gitlab_rails['time_zone'] = 'Asia/Shanghai'
    
    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代码服务"
    
    gitlab_rails['trusted_proxies'] = ["git.ifar.top"]
    
    #秒为单位,7天前的备份删除
    gitlab_rails['backup_keep_time'] = 604800
    
    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_workhorse['enable'] = true
    gitlab_workhorse['listen_network'] = "tcp"
    #这里IP不能直接用127.0.0.1,可以用git.ifar.top或容器IP
    gitlab_workhorse['listen_addr'] = "git.ifar.top:8013"
    
    user['git_user_email'] = "ifar@163.com"
    
    web_server['external_users'] = ["root"]
    
    nginx['enable'] = false
    

# 七. 重启gitlab容器

  • 重启gitlab容器重新加载配置

    docker restart gitlab
    

# 八. 测试配置

  • 测试邮箱是否配置正确

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

    #在运行nginx的服务器执行以下命令
    nc -zv 宿主机 8013
    nc -zv 宿主机 222
    

# 九. 配置外部的nginx并访问

  • nginx的配置增加

    upstream git_ifar_top_gitlab{
            server <宿主机IP>:8013;
    }
    
    server {
       listen       *:443 ssl http2;
       server_name  git.ifar.top;
       server_tokens off;
       client_max_body_size 0;
       ssl_certificate      ssl/ifar/git.ifar.top.crt;
       ssl_certificate_key  ssl/ifar/git.ifar.top.key;
       ssl_session_timeout  5m;
       ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
       ssl_ciphers HIGH:!aNULL:!MD5;
       ssl_prefer_server_ciphers   on;
       fastcgi_intercept_errors on;
      location / {
            proxy_cache off;
    		proxy_request_buffering off;
            proxy_pass    http://git_ifar_top_gitlab/;
       }
     }
    
    
  • 查看root的初始密码

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

    https://git.ifar.top
    

<------以上已经完成基本的安装,想要学习备份还原的继续向下看--------->

# 十. 备份配置和数据

  • 手动备份配置

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

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

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

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

# 十一. 还原配置和数据

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

    #进入容器
    docker exec -it gitlab /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 gitlab-backup restore BACKUP=1650621321_2022_04_22_14.6.1