# 使用docker-compose.yml 安装gitlab服务器
$ wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml
$ docker-compose up
https://about.gitlab.com/
https://github.com/gitlabhq/gitlabhq
个人不推荐,因为RPM包容量太大,200多M,适合于Linux初学者,未尝试过
可以最大程度了解GitLab的组件之间架构,但对于入门并不适合
镜像可以快速实现部署并使用,适合于熟悉Docker的人使用,入门很快。而且使用Docker镜像就使用户不用过多了解内部细节,通过启动容器带上环境变量参数即可实现GitLab参数的配置
3.2.1. 简介
3.2.2. 架构图
3.2.3. 下载镜像
3.2.4. 安装
3.2.4.1. 启动redis
docker run \
--name=gitlab_redis \
-tid \
sameersbn/redis:latest
3.2.4.2. 启动mysql
docker run \
--name=gitlab_mysql \
-tid \
-e 'DB_NAME=gitlabhq_production' \
-e 'DB_USER=gitlab' \
-e 'DB_PASS=password' \
-v /opt/gitlab/mysql:/var/lib/mysql \
sameersbn/mysql:latest
3.2.4.3. 启动gitlab
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.example.com' \
-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 '[email protected]' \
-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.example.com' \
-e 'SMTP_ENABLED=true' \
-e 'SMTP_DOMAIN=example.com' \
-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
这一步骤会耗时几分钟,因为这一步会做一些初始化操作,例如导入数据表结构等。可以通过docker logs gitlab来查看安装过程。同理,mysql、redis容器也可以通过docker logs gitlab_mysql和docker logs gitlab_redis来查看启动信息。
注意:上面创建的3个容器必须位于同一台宿主上,因为–link gitlab_mysql:mysql –link gitlab_redis:redisio就是将同个宿主上的容器做链接
完整:
docker run \
--name='gitlab' \
-itd \
--net=none \
--hostname='gitlab.example.com' \
-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 '[email protected]' \
-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.example.com' \
-e 'SMTP_ENABLED=true' \
-e 'SMTP_DOMAIN=example.com' \
-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的任何验证,只能无密码使用
目前发现sameersbn/gitlab:7.4.3有一个非常坑的地方:容器启动可能连不上数据库,是因为容器启动时会探测数据库是否可用,而探测的方法是mysqladmin连接DB_HOST的3306端口,而不是DB_PORT指定的端口,已提交issue给作者。
3.2.4.4. 给gitlab容器配置IP
在gitlab容器启动(docker run)时可以加上-p参数来将容器里的端口映射到宿主上,但个人比较倾向给容器配置一个独立IP,因此上述命令没有采用-p来做端口映射,但是-e ‘GITLAB_PORT=80′ -e ‘GITLAB_SSH_PORT=22′ -e ‘GITLAB_HOST=gitlab.example.com’依然要指定,否则gitlab无法使用
3.2.4.5. 安装已完成,可以打开页面
3.2.4.6. 加入开机启动
echo 'docker start gitlab_redis' >> /etc/rc.local
echo 'docker start gitlab_mysql' >> /etc/rc.local
echo 'docker start gitlab' >> /etc/rc.local
echo 'pipework br1 gitlab 192.168.1.1/[email protected]' >> /etc/rc.local
基本使用:
pip install pyapi-gitlab
import gitlab
git = gitlab.Gitlab("http://gitlab.example.com", token="EHBLkwhr_WYzn-sXNnNs") # token即在页面上Profile settings->Account里能看到自动生成好的Private token
git.getusers()
其他很多git库的实现都太底层了,和linux的git命令完全不一样,一点也不友好。但目前发现这个模块上传下载代码只支持SSH,不支持HTTP,因此我还是更喜欢使用linux git命令
5.3. 通过API进行一些操作例如创建Project,得到成功的响应,但却没有立即生效,过了几秒才生效
5.4. 页面上”Profile settings->SSH Keys”与”Project Settings里Deploy Keys”的区别
时区是UTC主要影响的是数据库里关于时间字段的值(created_at、updated_at等),对用户git仓库是不影响的,因为git仓库的创建、代码更新都是用户通过git工具自行操作,因此是用户自己的时区。
有1/3都在讲述高可用的利弊以及不同程度的高可用带来的收益及可能引发的更多问题,说的挺有道理的。由于笔者也才刚开始使用GitLab,因此暂不测试多机load balance或failover。
1. 备份配置、仓库、数据库。
2. 给文件系统做快照。
官方认为第二种方法比起第一种更快,因为可以省去人为介入restore的麻烦
XFS文件系统支持快照
有2篇文章可以拜读下:
http://www.icicletech.com/blog/gitlab-backup-made-easy 数据库数据备份到本地
http://doc.gitlab.com/ce/raketasks/backup_restore.html 官方的,和上述其实一样
一. 简介:每天固定时间备份数据(仅备份MySQL和GitLab仓库重要文件,其他不备份)。若数据丢失,需要恢复,则将最近备份的数据用来恢复,会将所有数据,包括本地文件(仓库等文件)、数据库一同还原回备份时刻。
二. 具体操作:
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里。可以自行对该tar包做压缩,例如gzip 时间戳_gitlab_backup.tar。
若$?=0表示备份成功,然后将生成的文件使用gzip压缩为.tar.gz,然后rsync推到存储上
通过rsync命令传到一台备份存储上
2. 恢复:
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中的所有文件和目录列出来,复制粘贴要恢复的tar包文件名,敲入回车即开始恢复。
注意:恢复时会将当前数据库中的所有表先删掉再导入备份tar包的里sql文件,因此此步要小心。
若redis、mysql是使用环境变量带入gitlab容器的,备份和恢复命令也类似,将启动gitlab的命令复制过来,修改下--name,添加一个--rm,CMD改为gitlab:backup:create或gitlab:backup:restore即可
三. 注意:
1. 用户配置的key(即data/.ssh)是保存在数据库里,在gitlab服务启动时候会从数据库里加载并导入到.ssh里,被gitlab-shell管理
2. 由于ssh目录(保存着服务器sshd服务启动时自己生成的ssh_key)不备份,因此还原时候若这个目录里有文件,则不去重新生成ssh_key,若不存在,则重新生成。若重新生成,用户使用ssh协议进行git push,会报错告知不合法的认证
3. 备份只会备份3个目录:repositories、db、uploads,然后会额外生成一个backup_information.yml文件
4. gitlab-satellites和tmp都是临时目录,因此不参与备份
5. docker run --rm不会影响容器退出状态的输出
6. 还原时候会将数据库里的表先DROP表再创建,因为sql文件在INSERT之前会drop table if exists
7. 还原时候,若存在要恢复的目录,则会将原来的目录mv成.old.时间戳
GitLab本地网站截图:
SourceTree(Git的图形化客户端)截图:
参考来源:https://www.linuxidc.com/Linux/2016-05/131886.htm