tag: git, gitlab, subversion, sameersbn/docker-gitlab
1. 閱讀本文基礎(chǔ)
2. GitLab簡介
2.1. 概述
- GitLab 是一個用于倉庫管理系統(tǒng)的開源項目。使用Git作為代碼管理工具,并在此基礎(chǔ)上搭建起來的web服務(wù)。Github是公共的git倉庫,而Gitlab適合于搭建企業(yè)內(nèi)部私有g(shù)it倉庫
- 官網(wǎng):
https://about./
https://github.com/gitlabhq/gitlabhq
- GIT與SVN的比較:
http://www./wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001374027586935cf69c53637d8458c9aec27dd546a6cd6000
http://www.oschina.net/news/12542/git-and-svn
- 截止本文創(chuàng)建時間,GitLab最新版本為v7.4.3
2.2. 架構(gòu)
- 示意圖:
-
2.3. 組件
- 前端:Nginx,用于頁面及Git tool走h(yuǎn)ttp或https協(xié)議
- 后端:Gitlab服務(wù),采用Ruby on Rails框架,通過unicorn實(shí)現(xiàn)后臺服務(wù)及多進(jìn)程
- SSHD:開啟sshd服務(wù),用于用戶上傳ssh key進(jìn)行版本克隆及上傳。注:用戶上傳的ssh key是保存到git賬戶中
- 數(shù)據(jù)庫:目前僅支持MySQL和PostgreSQL
- Redis:用于存儲用戶session和任務(wù),任務(wù)包括新建倉庫、發(fā)送郵件等等
- Sidekiq:Rails框架自帶的,訂閱redis中的任務(wù)并執(zhí)行
3. GitLab安裝部署
3.1. 官方支持的方式
3.2. 采用docker鏡像安裝GitLab
3.2.1. 簡介
3.2.2. 架構(gòu)圖
3.2.3. 下載鏡像
- docker pull sameersbn/gitlab:7.4.3 # 下載gitlab鏡像
- docker pull sameersbn/mysql:latest # 下載gitlab所用到的mysql鏡像
- docker pull sameersbn/redis:latest # 下載gitlab所用到的redis鏡像
3.2.4. 安裝
3.2.4.1. 啟動redis
3.2.4.2. 啟動mysql
3.2.4.3. 啟動gitlab
- mkdir -p /opt/gitlab/data /opt/gitlab/log
- 命令:
docker run --name='gitlab' -itd --link gitlab_mysql:mysql --link gitlab_redis:redisio -e 'GITLAB_PORT=80' -e 'GITLAB_SSH_PORT=22' -e 'GITLAB_HOST=gitlab.' -v /var/run/docker.sock:/run/docker.sock -v $(which docker):/bin/docker -v /opt/gitlab/data:/home/git/data -v /opt/gitlab/log:/var/log/gitlab sameersbn/gitlab:7.4.3
上述是開啟一個基本gitlab。
完整(包含LDAP、EMAIL):
docker run --name='gitlab' -itd --link gitlab_mysql:mysql --link gitlab_redis:redisio -e 'GITLAB_PORT=80' -e 'GITLAB_SSH_PORT=22' -e 'LDAP_ENABLED=true' -e 'LDAP_HOST=192.168.1.1' -e 'LDAP_PORT=389' -e 'LDAP_UID=sAMAccountName' -e 'LDAP_METHOD=plain' -e 'LDAP_BIND_DN=test@' -e 'LDAP_PASS=passwd' -e 'LDAP_BASE=OU=example_users,DC=example-family,DC=com' -e 'LDAP_ACTIVE_DIRECTORY=true' -e 'LDAP_ALLOW_USERNAME_OR_EMAIL_LOGIN=false' -e 'GITLAB_HOST=gitlab.' -e 'SMTP_ENABLED=true' -e 'SMTP_DOMAIN=' -e 'SMTP_HOST=192.168.1.2' -e 'SMTP_PORT=25' -e 'SMTP_STARTTLS=false' -v /var/run/docker.sock:/run/docker.sock -v $(which docker):/bin/docker -v /opt/gitlab/data:/home/git/data -v /opt/gitlab/log:/var/log/gitlab sameersbn/gitlab:7.4.3
這一步驟會耗時幾分鐘,因?yàn)檫@一步會做一些初始化操作,例如導(dǎo)入數(shù)據(jù)表結(jié)構(gòu)等??梢酝ㄟ^docker logs gitlab來查看安裝過程。同理,mysql、redis容器也可以通過docker logs gitlab_mysql和docker logs gitlab_redis來查看啟動信息。
注意:上面創(chuàng)建的3個容器必須位于同一臺宿主上,因?yàn)楱Clink gitlab_mysql:mysql –link gitlab_redis:redisio就是將同個宿主上的容器做鏈接
- 當(dāng)然,redis和mysql也支持使用ip+端口,不用–link,帶上環(huán)境變量即可,方法是:
完整:
docker run --name='gitlab' -itd --net=none --hostname='gitlab.' -e 'DB_TYPE=mysql' -e 'DB_HOST=192.168.3.1' -e 'DB_PORT=3356' -e 'DB_NAME=gitlabhq_production' -e 'DB_USER=gitlab' -e 'DB_PASS=passwd' -e 'REDIS_HOST=192.168.3.2' -e 'REDIS_PORT=6402' -e 'UNICORN_WORKERS=20' -e 'GITLAB_PORT=80' -e 'GITLAB_SSH_PORT=22' -e 'LDAP_ENABLED=true' -e 'LDAP_HOST=192.168.3.3' -e 'LDAP_PORT=389' -e 'LDAP_UID=sAMAccountName' -e 'LDAP_METHOD=plain' -e 'LDAP_BIND_DN=test@' -e 'LDAP_PASS=passwd' -e 'LDAP_BASE=OU=example_users,DC=example-family,DC=com' -e 'LDAP_ACTIVE_DIRECTORY=true' -e 'LDAP_ALLOW_USERNAME_OR_EMAIL_LOGIN=false' -e 'GITLAB_HOST=gitlab.' -e 'SMTP_ENABLED=true' -e 'SMTP_DOMAIN=' -e 'SMTP_HOST=192.168.3.4' -e 'SMTP_PORT=25' -e 'SMTP_STARTTLS=false' -v /var/run/docker.sock:/run/docker.sock -v $(which docker):/bin/docker -v /opt/gitlab/data:/home/git/data -v /opt/gitlab/log:/var/log/gitlab sameersbn/gitlab:7.4.3
sameersbn/gitlab:7.4.3不支持redis的任何驗(yàn)證,只能無密碼使用
目前發(fā)現(xiàn)sameersbn/gitlab:7.4.3有一個非??拥牡胤剑喝萜鲉涌赡苓B不上數(shù)據(jù)庫,是因?yàn)槿萜鲉訒r會探測數(shù)據(jù)庫是否可用,而探測的方法是mysqladmin連接DB_HOST的3306端口,而不是DB_PORT指定的端口,已提交issue給作者。
3.2.4.4. 給gitlab容器配置IP
- pipework br1 gitlab 192.168.1.1/24@192.168.1.254
在gitlab容器啟動(docker run)時可以加上-p參數(shù)來將容器里的端口映射到宿主上,但個人比較傾向給容器配置一個獨(dú)立IP,因此上述命令沒有采用-p來做端口映射,但是-e ‘GITLAB_PORT=80′ -e ‘GITLAB_SSH_PORT=22′ -e ‘GITLAB_HOST=gitlab.’依然要指定,否則gitlab無法使用
3.2.4.5. 安裝已完成,可以打開頁面
- url: gitlab.
賬戶:root
密碼:5iveL!fe
- 效果:
3.2.4.6. 加入開機(jī)啟動
4. GitLab API wrappers
其他很多git庫的實(shí)現(xiàn)都太底層了,和linux的git命令完全不一樣,一點(diǎn)也不友好。但目前發(fā)現(xiàn)這個模塊上傳下載代碼只支持SSH,不支持HTTP,因此我還是更喜歡使用linux git命令
5. GitLab使用的FAQ
5.1. git代碼發(fā)布支持2種方法:ssh和http(s)
- ssh:必須添加ssh key才能發(fā)布
- http:使用用戶名、密碼,若接入了LDAP,就是LDAP中的賬戶密碼
- https:暫未測試過
5.2. 限制git上傳的單個文件大小
- 若gitlab是通過sameersbn/gitlab:7.4.3鏡像創(chuàng)建的,那么可以通過環(huán)境變量NGINX_MAX_UPLOAD_SIZE進(jìn)行限制
5.3. 通過API進(jìn)行一些操作例如創(chuàng)建Project,得到成功的響應(yīng),但卻沒有立即生效,過了幾秒才生效
- 由于GitLab為異步架構(gòu),Ruby on Rails收到創(chuàng)建Project請求后將該任務(wù)推送到Redis中,但是沒有等待執(zhí)行完畢,而是直接返回成功。后臺Sidekiq從Redis訂閱任務(wù)并實(shí)時執(zhí)行,但由于執(zhí)行需要時間,而API返回很快,因此會造成這種情況發(fā)生。目前沒有其他解決辦法,只能在自己程序邏輯里sleep幾秒進(jìn)行重試
5.4. 頁面上”Profile settings->SSH Keys”與”Project Settings里Deploy Keys”的區(qū)別
- Profile settings->SSH Keys:是用戶全局的Key,具有對該用戶所有項目倉庫進(jìn)行上傳下載(push、clone)的權(quán)限
- Project Settings里Deploy Keys:針對某個項目,具有下載(clone)的權(quán)限,而不具備上傳(push)的權(quán)限
5.5. gitlab默認(rèn)時區(qū)是UTC
- sameersbn/gitlab:7.4.3鏡像無法對時區(qū)進(jìn)行修改,若是手動安裝的gitlab,可以通過修改一個.rb文件來生效,具體沒有測試過,有需要的可以自行百度搜下。
時區(qū)是UTC主要影響的是數(shù)據(jù)庫里關(guān)于時間字段的值(created_at、updated_at等),對用戶git倉庫是不影響的,因?yàn)間it倉庫的創(chuàng)建、代碼更新都是用戶通過git工具自行操作,因此是用戶自己的時區(qū)。
6. GitLab維護(hù)
6.1. 數(shù)據(jù)路徑、日志路徑
- 由于gitlab容器在啟動時已將宿主/opt/gitlab/data、/opt/gitlab/log目錄掛載到容器里,因此可以在宿主上進(jìn)入這2個目錄中查看,另外可以通過docker logs查看。
6.2. 高可用
- 官方有篇關(guān)于GitLab高可用的文章: https://about./high-availability/
有1/3都在講述高可用的利弊以及不同程度的高可用帶來的收益及可能引發(fā)的更多問題,說的挺有道理的。由于筆者也才剛開始使用GitLab,因此暫不測試多機(jī)load balance或failover。
- 2種備份恢復(fù)方式
1. 備份配置、倉庫、數(shù)據(jù)庫。
2. 給文件系統(tǒng)做快照。
官方認(rèn)為第二種方法比起第一種更快,因?yàn)榭梢允∪ト藶榻槿雛estore的麻煩
XFS文件系統(tǒng)支持快照
有2篇文章可以拜讀下:
http://www./blog/gitlab-backup-made-easy 數(shù)據(jù)庫數(shù)據(jù)備份到本地
http://doc./ce/raketasks/backup_restore.html 官方的,和上述其實(shí)一樣
- 我的備份方案:
一. 簡介:每天固定時間備份數(shù)據(jù)(僅備份MySQL和GitLab倉庫重要文件,其他不備份)。若數(shù)據(jù)丟失,需要恢復(fù),則將最近備份的數(shù)據(jù)用來恢復(fù),會將所有數(shù)據(jù),包括本地文件(倉庫等文件)、數(shù)據(jù)庫一同還原回備份時刻。
二. 具體操作:
1. 備份:
docker run --name='gitlab_backup' -it --rm --link gitlab_mysql:mysql --link gitlab_redis:redisio -v /var/run/docker.sock:/run/docker.sock -v $(which docker):/bin/docker -v /opt/gitlab/data:/home/git/data -v /opt/gitlab/log:/var/log/gitlab sameersbn/gitlab:7.4.3 app:rake gitlab:backup:create
過程能在屏幕上看到,備份會自動打成tar包放入/opt/gitlab/data/backups里??梢宰孕袑υ搕ar包做壓縮,例如gzip 時間戳_gitlab_backup.tar。
若$?=0表示備份成功,然后將生成的文件使用gzip壓縮為.tar.gz,然后rsync推到存儲上
通過rsync命令傳到一臺備份存儲上
2. 恢復(fù):
docker run --name='gitlab_restore' -it --rm --link gitlab_mysql:mysql --link gitlab_redis:redisio -v /var/run/docker.sock:/run/docker.sock -v $(which docker):/bin/docker -v /opt/gitlab/data:/home/git/data -v /opt/gitlab/log:/var/log/gitlab sameersbn/gitlab:7.4.3 app:rake gitlab:backup:restore
屏幕上會將/opt/gitlab/data/backups中的所有文件和目錄列出來,復(fù)制粘貼要恢復(fù)的tar包文件名,敲入回車即開始恢復(fù)。
注意:恢復(fù)時會將當(dāng)前數(shù)據(jù)庫中的所有表先刪掉再導(dǎo)入備份tar包的里sql文件,因此此步要小心。
若redis、mysql是使用環(huán)境變量帶入gitlab容器的,備份和恢復(fù)命令也類似,將啟動gitlab的命令復(fù)制過來,修改下--name,添加一個--rm,CMD改為gitlab:backup:create或gitlab:backup:restore即可
三. 注意:
1. 用戶配置的key(即data/.ssh)是保存在數(shù)據(jù)庫里,在gitlab服務(wù)啟動時候會從數(shù)據(jù)庫里加載并導(dǎo)入到.ssh里,被gitlab-shell管理
2. 由于ssh目錄(保存著服務(wù)器sshd服務(wù)啟動時自己生成的ssh_key)不備份,因此還原時候若這個目錄里有文件,則不去重新生成ssh_key,若不存在,則重新生成。若重新生成,用戶使用ssh協(xié)議進(jìn)行g(shù)it push,會報錯告知不合法的認(rèn)證
3. 備份只會備份3個目錄:repositories、db、uploads,然后會額外生成一個backup_information.yml文件
4. gitlab-satellites和tmp都是臨時目錄,因此不參與備份
5. docker run --rm不會影響容器退出狀態(tài)的輸出
6. 還原時候會將數(shù)據(jù)庫里的表先DROP表再創(chuàng)建,因?yàn)閟ql文件在INSERT之前會drop table if exists
7. 還原時候,若存在要恢復(fù)的目錄,則會將原來的目錄mv成.old.時間戳
|