Aldebaran

人生最棒的感觉,就是你做到别人说你做不到的事。

0%

安装docker-gitlab

三田寺円

什么是Git

git是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。

与CVS、Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。git的速度很快,这对于诸如Linux内核这样的大项目来说自然很重要。git最为出色的是它的合并追踪(merge tracing)能力。

关于Git更多的内容可以查看 https://zh.wikipedia.org/wiki/Git

什么是GitLab

GitLab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。

与Github类似,GitLab能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。

它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。

架构图

Gitlab的服务构成

  • Nginx:静态web服务器。

  • gitlab-shell:用于处理Git命令和修改authorized keys列表。

  • gitlab-workhorse: 轻量级的反向代理服务器。

  • logrotate:日志文件管理工具。

  • postgresql:数据库。

  • redis:缓存数据库。

  • sidekiq:用于在后台执行队列任务(异步执行)。

  • unicorn:An HTTP server for Rack applications,GitLab Rails应用是托管在这个服务器上面的。

gitlab架构图

安装之前稍微看一眼gitlab的架构图

01

docker-gitlab架构图

02

准备工作

  • 修改SSH端口

    PS: 默认22端口被系统的SSH进程占用,因此gitlab如果使用该端口,需要将原先的ssh端口修改掉。

    下面是在ubuntu下的操作,其他发行版的Linux如果不确定,则可以直接修改/etc/ssh/sshd_config:

    #修改默认ssh端口为57321
    $ sudo sed -i "s/^Port 22/Port 57321/" /etc/ssh/sshd_config
    #禁用ssh dns,使服务器登陆更快
    $ sudo sed -i "/UsePAM yes/a UseDNS no" /etc/ssh/sshd_config
    # 如果有额外设置iptable或UFW 还应该允许新端口对外
    # 重启本机的ssh
    $ sudo service ssh restart

安装doocker GitLab

通过docker search 我们知道,docker-gitlab目前主要有两个主流的镜像:

03

两个镜像都可以,下面是这两个镜像的安装参数。

  • gitlab/gitlab-ce

    这个是GitLab官方提供的docker-gitlab,本质其实就是Omnibus installations(综合安装,即默认集成了GitLab所需要的所有服务: nginx, redis, postgresql…)

    参考链接: docker-gitlab 1

    参考链接: docker-gitlab 2

    从docker hub上pull一个gitlab/gitlab-ce下来,这里选择的是8.17.4

    $ sudo docker pull gitlab/gitlab-ce:8.17.4-ce.0

    启动gitlab容器

    $ mkdir -pv /data/gitlab/{config,logs,data}
    $ sudo docker run --detach \
      --hostname gitlab.XXXXX.comm \
      --publish 443:443 --publish 80:80 --publish 22:22 \
      --name gitlab \
      --restart always \
      --volume /data/gitlab/config:/etc/gitlab \
      --volume /data/gitlab/logs:/var/log/gitlab \
      --volume /data/gitlab/data:/var/opt/gitlab \
      gitlab/gitlab-ce:8.17.4-ce.0

    PS: 如果服务器上开启selinux,那么需要执行

    $ sudo docker run --detach \
      --hostname gitlab.XXXXX.comm \
      --publish 443:443 --publish 80:80 --publish 22:22 \
      --name gitlab \
      --restart always \
      --volume /data/gitlab/config:/etc/gitlab:Z \
      --volume /data/gitlab/logs:/var/log/gitlab:Z \
      --volume /data/gitlab/data:/var/opt/gitlab:Z \
      gitlab/gitlab-ce:8.17.4-ce.0
  • sameersbn:docker-gitlab

    sameersbn:docker-gitlab早于gitlab/gitlab-ce,其默认将GitLab的各个服务独立开,便于分布式维护。

    参考链接: sameersbn:docker-gitlab 1

    参考链接: sameersbn:docker-gitlab 2

    Step 0 事先建好docker volume的目录

    $ sudo mkdir -pv /srv/docker/gitlab/{postgresql,redis,gitlab}

    Step 1. 启动一个postgresql容器(当然也可以是MySQL,目前GitLab只支持这两种)

    $ sudo docker run --name gitlab-postgresql -d \
        --env 'DB_NAME=gitlabhq_production' \
        --env 'DB_USER=gitlab' --env 'DB_PASS=password' \
        --env 'DB_EXTENSION=pg_trgm' \
        --volume /srv/docker/gitlab/postgresql:/var/lib/postgresql \
        sameersbn/postgresql:9.6-2

    Step 2. 启动一个 redis容器

    $ sudo docker run --name gitlab-redis -d \
        --volume /srv/docker/gitlab/redis:/var/lib/redis \
        sameersbn/redis:latest

    Step 3. 启动一个gitlab容器

    $ sudo docker run --name gitlab -d \
        --link gitlab-postgresql:postgresql --link gitlab-redis:redisio \
        --publish 22:22 --publish 10080:80 \
        --env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \
        --env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \
        --env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string' \
        --env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string' \
        --volume /srv/docker/gitlab/gitlab:/home/git/data \
        sameersbn/gitlab:8.16.6

docker compose 安装GitLab

Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。

推荐使用这种方式来安装和维护GitLab。

  • Step 0. 事先建好docker volume的目录

    $ sudo mkdir -pv /data/gitlab/{config,logs,data}
  • Step 1. 创建docker-compose.yml文件

    一个简单的docker-compose.yml的内容应该为:

    version: "3.0"
    services:
        gitlab:
        image: 'gitlab/gitlab-ce:latest'
        restart: always
        hostname: 'gitlab.XXXXX.comm'
        ports:
            - '9090:9090'
            - '80:80'
            - '443:443'
            - '22:22'
        volumes:
            - '/data/gitlab/config:/etc/gitlab'
            - '/data/gitlab/logs:/var/log/gitlab'
            - '/data/gitlab/data:/var/opt/gitlab'

    如果需要配置更加详细可以参考:

    version: "3.6"
    services:
    gitlab:
        image: gitlab/gitlab-ce:latest
        ports:
        - "22:22"
        - "80:80"
        - "443:443"
        volumes:
        - /srv/gitlab/data:/var/opt/gitlab
        - /srv/gitlab/logs:/var/log/gitlab
        - /srv/gitlab/config:/etc/gitlab
        environment:
        GITLAB_OMNIBUS_CONFIG: "from_file('/omnibus_config.rb')"
        configs:
        - source: gitlab
            target: /omnibus_config.rb
        secrets:
        - gitlab_root_password
    gitlab-runner:
        image: gitlab/gitlab-runner:alpine
        deploy:
        mode: replicated
        replicas: 4
    configs:
    gitlab:
        file: ./gitlab.rb
    secrets:
    gitlab_root_password:
        file: ./root_password.txt
  • Step 2. 运行

    直接在docker-compose.ym目录下,运行docker-compose up就可以了

    $ sudo docker-compose -p silentlive up -d

    运行结果如下:

    gitlab_1  | Thank you for using GitLab Docker Image!
    gitlab_1  | Current version: gitlab-ce=8.17.4-ce.0
    gitlab_1  |
    gitlab_1  | Configure GitLab for your system by editing /etc/gitlab/gitlab.rb file
    gitlab_1  | And restart this container to reload settings.
    gitlab_1  | To do it use docker exec:
    gitlab_1  |
    gitlab_1  |   docker exec -it gitlab vim /etc/gitlab/gitlab.rb
    gitlab_1  |   docker restart gitlab
    gitlab_1  |
    gitlab_1  | For a comprehensive list of configuration options please see the Omnibus GitLab readme
    gitlab_1  | https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md
    gitlab_1  |
    gitlab_1  | If this container fails to start due to permission problems try to fix it by executing:
    gitlab_1  |
    gitlab_1  |   docker exec -it gitlab update-permissions
    gitlab_1  |   docker restart gitlab
    ......
  • Step 3. 使用docker-compose ps 查看

    $ sudo docker-compose -p silentlive ps
        Name              Command       State                                          Ports
    -------------------------------------------------------------------------------------------------------------------------------------
    silentlive_gitlab_1   /assets/wrapper   Up      0.0.0.0:22->22/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:9090->9090/tcp

    PS: 如果需要调试则可以使用下面命令

    $ sudo docker-compose config
    $ sudo docker-compose --verbose up

docker GitLab设置

启用TLS

默认情况下,ogitlab不使用HTTPS。 如果要为gitlab启用HTTPS,请将以下语句添加到/etc/gitlab/gitlab.rb

# note the 'https' below
external_url "https://gitlab.XXXXX.comm"
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.XXXXX.comm.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.XXXXX.comm.key"
# 禁用SSLv3
nginx['ssl_protocols'] = "TLSv1 TLSv1.1 TLSv1.2"
# 兼容旧设备,防止出现**gnutls_handshake() failed: Handshake failed**
nginx['ssl_ciphers'] = "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS"

因为我们示例中的主机名是“gitlab.XXXXX.comm”,gitlab会查找名为/etc/gitlab/ssl/gitlab.XXXXX.comm.key和/etc/gitlab/ssl/gitlab.XXXXX.comm.crt的证书公钥。

创建/etc/gitlab/ssl目录,然后复制你的密钥和证书。例如:

$ sudo docker exec -t <container name> mkdir -p /etc/gitlab/ssl
$ sudo docker exec -t <container name> chmod 700 /etc/gitlab/ssl
$ sudo docker exec -t <container name> cp gitlab.XXXXX.comm.key gitlab.XXXXX.comm.crt /etc/gitlab/ssl/

现在运行:

$ sudo docker exec -t <container name> gitlab-ctl reconfigure

默认情况下,当您以“https”开头指定一个external_url时,Nginx将不再监听端口80上未加密的HTTP流量。如果要将所有HTTP流量重定向到HTTPS,您可以使用redirect_http_to_https设置。

external_url "https://gitlab.example.com"
nginx['redirect_http_to_https'] = true

更多TLS配置可以查看 参考链接

邮件回复

默认情况下,使用docker-gitlab 是无法发送邮件的,这种由于引用的ubuntu镜像默认没有安装sendmail/postfix.

知道这种问题,那么就有这几种解决方法。

  1. 安装sendmail

    $ sudo docker exec -it <container name> /bin/bash
    # apt-get update
    # apt-get install sendmail
    # service sendmail restart
    # exit
  2. postfix

    https://docs.gitlab.com/ce/administration/reply_by_email_postfix_setup.html

  3. smtp

    以QQ邮箱为例:

    • 先开通smtp服务.

      04
      05

    • 修改gitlab.rb

      如果是QQ企业邮箱那么是:

      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'] = "password"
      gitlab_rails['smtp_authentication'] = "login"
      gitlab_rails['smtp_enable_starttls_auto'] = true
      gitlab_rails['smtp_tls'] = true
      gitlab_rails['gitlab_email_from'] = '[email protected]'
      gitlab_rails['smtp_domain'] = "exmail.qq.com"

      如果是一般的QQ邮箱

      gitlab_rails['smtp_enable'] = true
      gitlab_rails['smtp_address'] = "smtp.qq.com"
      gitlab_rails['smtp_port'] = 465
      gitlab_rails['smtp_user_name'] = "[email protected]"
      gitlab_rails['smtp_password'] = "cjjcibreazjxdgbg"
      gitlab_rails['smtp_authentication'] = "login"
      gitlab_rails['smtp_enable_starttls_auto'] = true
      gitlab_rails['smtp_tls'] = true
      gitlab_rails['gitlab_email_from'] = '[email protected]'
      gitlab_rails['smtp_domain'] = "qq.com"

      以outlook为例:

      • 先开通smtp服务.(可选:这是在开通POP, smtp默认启用)

        06

      • 修改gitlab.rb

        gitlab_rails['smtp_enable'] = true
        gitlab_rails['smtp_address'] = "smtp-mail.outlook.com"
        gitlab_rails['smtp_port'] = 587
        gitlab_rails['smtp_user_name'] = "[email protected]"
        gitlab_rails['smtp_password'] = "password"
        gitlab_rails['smtp_domain'] = "smtp-mail.outlook.com"
        gitlab_rails['smtp_authentication'] = "login"
        gitlab_rails['smtp_enable_starttls_auto'] = true
        gitlab_rails['smtp_openssl_verify_mode'] = 'peer'

      其他邮箱可以参考:https://docs.gitlab.com/omnibus/settings/smtp.html

    PS: 邮件有可能会延迟,请耐心等候。

Git LFS

  • 前提

    Git LFS(Large File Storage,简称LFS)的目标是更好地把“大型二进制文件,比如音频文件、数据集、图像和视频”集成到Git的工作流中。

    众所周知,Git在存储二进制文件时效率不高,因为:Git默认会压缩并存储二进制文件的所有完整版本,如果二进制文件很多,这种做法显然不是最优。因此,在Git仓库处理大量的二进制文件似乎是很多Git用户的瓶颈。由于Git的分散性,这意味着每个开发人员对文件的操作是变化的,对二进制文件的更改导致Git仓库文件不断变化增长。

    当数据文件需要恢复的时候,这就变成一个很难操作的问题。存储虚拟机映像的快照,改变其状态,并存储新的状态到Git仓库将与各自的快照的大小约为成长库的大小。如果这是你的团队每天的日常运作,你可能已经感受到来自过度肿胀Git仓库的痛苦。

  • 最低要求

    • Git LFS 是在GitaLab 8.2的时候开始支持的。因此GitLab 版本应该不低于8.2
    • Git LFS的客户端 版本不能低于1.0.1
  • Configuration

    Git LFS objects的大小可能很大。默认情况下,它们会存储在服务器GitLab上。

    有两个配置选项来帮助GitLab服务器的管理员:

    • 启用/禁用Git LFS支持

    • 更改LFS对象存储的位置

      vim /etc/gitlab/gitlab.rb
      
      gitlab_rails['lfs_enabled'] = false
      
      # Optionally, change the storage path location. Defaults to
      # `#{gitlab_rails['shared_path']}/lfs-objects`. Which evaluates to
      # `/var/opt/gitlab/gitlab-rails/shared/lfs-objects` by default.
      gitlab_rails['lfs_storage_path'] = "/mnt/storage/lfs-objects"
  • Known limitations

    • 目前(2017-7-15 1:37:26),不支持在非本地存储(如AWS S3)上存储GitLab Git LFS objects
    • 在8.14之后添加了删除未引用的LFS对象的支持。
    • 使用GitLab 8.12添加了通过SSH的LFS认证
    • 仅与GitLFS客户端版本1.1.0及以上版本兼容,或1.0.2。
    • 存储统计信息当前对与其链接的每个项目进行多次计数每个LFS对象

更多Git LFS配置可以查看 参考链接

参考文档

https://docs.gitlab.com/omnibus/docker/#install-gitlab-using-docker-compose