什么是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的架构图
docker-gitlab架构图
准备工作
修改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目前主要有两个主流的镜像:
两个镜像都可以,下面是这两个镜像的安装参数。
gitlab/gitlab-ce
这个是GitLab官方提供的docker-gitlab,本质其实就是Omnibus installations(综合安装,即默认集成了GitLab所需要的所有服务: nginx, redis, postgresql…)
从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.
知道这种问题,那么就有这几种解决方法。
安装sendmail
$ sudo docker exec -it <container name> /bin/bash # apt-get update # apt-get install sendmail # service sendmail restart # exit
postfix
https://docs.gitlab.com/ce/administration/reply_by_email_postfix_setup.html
-
以QQ邮箱为例:
先开通smtp服务.
修改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'] = "xxxx@xx.com" 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'] = 'xxxx@xx.com' 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'] = "1314@qq.com" 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'] = '1314@qq.com' gitlab_rails['smtp_domain'] = "qq.com"
以outlook为例:
先开通smtp服务.(可选:这是在开通POP, smtp默认启用)
修改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'] = "username@outlook.com" 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