一、GitLab簡介
GitLab 是一個用於倉庫管理系統的開源項目。使用Git作為代碼管理工具,並在此基礎上搭建起來的web服務。Github是公共的git倉庫,而Gitlab適合於搭建企業內部私有git倉庫
- 官網:
https://about.gitlab.com/ https://github.com/gitlabhq/gitlabhq
- 截止本文創建時間,GitLab最新版本為v7.4.3
二、組件
7.4.3之前版本,鏡像里包含所有組件,7.4.3版本鏡像里只包含核心組件:nginx、sshd、ruby on rails、sidekiq,sameersbn/gitlab是基於ubuntu鏡像的
前端:Nginx,用於頁面及Git tool走http或https協議
后端:Gitlab服務,采用Ruby on Rails框架,通過unicorn實現后台服務及多進程
SSHD:開啟sshd服務,用於用戶上傳ssh key進行版本克隆及上傳。注:用戶上傳的ssh key是保存到git賬戶中
數據庫:目前僅支持MySQL和PostgreSQL
Redis:用於存儲用戶session和任務,任務包括新建倉庫、發送郵件等等
Sidekiq:Rails框架自帶的,訂閱redis中的任務並執行
三、架構
四、GitLab安裝部署
包含一切的RPM包: https://about.gitlab.com/downloads/ (官方推薦)
個人不推薦,因為RPM包容量太大,200多M,適合於Linux初學者,未嘗試過
- 手動安裝: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md (深入了解)
可以最大程度了解GitLab的組件之間架構,但對於入門並不適合
- 第三方docker鏡像: https://github.com/sameersbn/docker-gitlab (筆者推薦)
鏡像可以快速實現部署並使用,適合於熟悉Docker的人使用,入門很快。而且使用Docker鏡像就使用戶不用過多了解內部細節,通過啟動容器帶上環境變量參數即可實現GitLab參數的配置
4.1、本文主要介紹docker下安裝:
采用docker鏡像安裝GitLab
4.2、下載鏡像
- docker pull sameersbn/gitlab:7.4.3 # 下載gitlab鏡像
- docker pull sameersbn/mysql:latest # 下載gitlab所用到的mysql鏡像
- docker pull sameersbn/redis:latest # 下載gitlab所用到的redis鏡像
4.2.1、啟動redis
- 命令:
docker run \ --name=gitlab_redis \ -tid \ sameersbn/redis:latest
4.2.2. 啟動mysql
- mkdir -p /opt/gitlab/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
4.2.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.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 'LDAP_BIND_DN=test@example.com' \ -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來查看啟動信息。
4.3、總docker-composer.yml文件

version: '2' services: redis: restart: always image: sameersbn/redis:latest command: - --loglevel warning volumes: - /srv/docker/gitlab/redis:/var/lib/redis:Z postgresql: restart: always image: sameersbn/postgresql:9.5-1 volumes: - /srv/docker/gitlab/postgresql:/var/lib/postgresql:Z environment: - DB_USER=gitlab - DB_PASS=password - DB_NAME=gitlabhq_production - DB_EXTENSION=pg_trgm gitlab: restart: always image: sameersbn/gitlab:8.11.5 depends_on: - redis - postgresql ports: - "10080:80" - "10022:22" volumes: - /srv/docker/gitlab/gitlab:/home/git/data:Z environment: - DEBUG=false - DB_ADAPTER=postgresql - DB_HOST=postgresql - DB_PORT=5432 - DB_USER=gitlab - DB_PASS=password - DB_NAME=gitlabhq_production - REDIS_HOST=redis - REDIS_PORT=6379 - TZ=Asia/Kolkata - GITLAB_TIMEZONE=Kolkata - GITLAB_HTTPS=false - SSL_SELF_SIGNED=false - GITLAB_HOST=192.168.103.29 - GITLAB_PORT=10080 - GITLAB_SSH_PORT=10022 - GITLAB_RELATIVE_URL_ROOT= - GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string - GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string - GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string - GITLAB_ROOT_PASSWORD= - GITLAB_ROOT_EMAIL= - GITLAB_NOTIFY_ON_BROKEN_BUILDS=true - GITLAB_NOTIFY_PUSHER=false - GITLAB_EMAIL=notifications@example.com - GITLAB_EMAIL_REPLY_TO=noreply@example.com - GITLAB_INCOMING_EMAIL_ADDRESS=reply@example.com - GITLAB_BACKUP_SCHEDULE=daily - GITLAB_BACKUP_TIME=01:00 - SMTP_ENABLED=false - SMTP_DOMAIN=www.example.com - SMTP_HOST=smtp.gmail.com - SMTP_PORT=587 - SMTP_USER=mailer@example.com - SMTP_PASS=password - SMTP_STARTTLS=true - SMTP_AUTHENTICATION=login - IMAP_ENABLED=false - IMAP_HOST=imap.gmail.com - IMAP_PORT=993 - IMAP_USER=mailer@example.com - IMAP_PASS=password - IMAP_SSL=true - IMAP_STARTTLS=false - OAUTH_ENABLED=false - OAUTH_AUTO_SIGN_IN_WITH_PROVIDER= - OAUTH_ALLOW_SSO= - OAUTH_BLOCK_AUTO_CREATED_USERS=true - OAUTH_AUTO_LINK_LDAP_USER=false - OAUTH_AUTO_LINK_SAML_USER=false - OAUTH_EXTERNAL_PROVIDERS= - OAUTH_CAS3_LABEL=cas3 - OAUTH_CAS3_SERVER= - OAUTH_CAS3_DISABLE_SSL_VERIFICATION=false - OAUTH_CAS3_LOGIN_URL=/cas/login - OAUTH_CAS3_VALIDATE_URL=/cas/p3/serviceValidate - OAUTH_CAS3_LOGOUT_URL=/cas/logout - OAUTH_GOOGLE_API_KEY= - OAUTH_GOOGLE_APP_SECRET= - OAUTH_GOOGLE_RESTRICT_DOMAIN= - OAUTH_FACEBOOK_API_KEY= - OAUTH_FACEBOOK_APP_SECRET= - OAUTH_TWITTER_API_KEY= - OAUTH_TWITTER_APP_SECRET= - OAUTH_GITHUB_API_KEY= - OAUTH_GITHUB_APP_SECRET= - OAUTH_GITHUB_URL= - OAUTH_GITHUB_VERIFY_SSL= - OAUTH_GITLAB_API_KEY= - OAUTH_GITLAB_APP_SECRET= - OAUTH_BITBUCKET_API_KEY= - OAUTH_BITBUCKET_APP_SECRET= - OAUTH_SAML_ASSERTION_CONSUMER_SERVICE_URL= - OAUTH_SAML_IDP_CERT_FINGERPRINT= - OAUTH_SAML_IDP_SSO_TARGET_URL= - OAUTH_SAML_ISSUER= - OAUTH_SAML_LABEL="Our SAML Provider" - OAUTH_SAML_NAME_IDENTIFIER_FORMAT=urn:oasis:names:tc:SAML:2.0:nameid-format:transient - OAUTH_SAML_GROUPS_ATTRIBUTE= - OAUTH_SAML_EXTERNAL_GROUPS= - OAUTH_SAML_ATTRIBUTE_STATEMENTS_EMAIL= - OAUTH_SAML_ATTRIBUTE_STATEMENTS_NAME= - OAUTH_SAML_ATTRIBUTE_STATEMENTS_FIRST_NAME= - OAUTH_SAML_ATTRIBUTE_STATEMENTS_LAST_NAME= - OAUTH_CROWD_SERVER_URL= - OAUTH_CROWD_APP_NAME= - OAUTH_CROWD_APP_PASSWORD= - OAUTH_AUTH0_CLIENT_ID= - OAUTH_AUTH0_CLIENT_SECRET= - OAUTH_AUTH0_DOMAIN= - OAUTH_AZURE_API_KEY= - OAUTH_AZURE_API_SECRET= - OAUTH_AZURE_TENANT_ID=
啟動:docker-copose -f docker-composer.yml up -d
備注:docker-compose安裝
五、GitLab維護
由於gitlab容器在啟動時已將宿主/opt/gitlab/data、/opt/gitlab/log目錄掛載到容器里,因此可以在宿主上進入這2個目錄中查看,另外可以通過docker logs查看
總體docker-compose中數據在/srv/docker/gitlab/gitlab/backups下
備份只會備份3個目錄:repositories、db、uploads,然后會額外生成一個backup_information.yml文件
sameersbn/gitlab是基於ubuntu鏡像的
遷移實現方式:
可以使用gitlab備份與恢復的命令,實現數據的遷移
備份:
bundle exec rake gitlab:backup:create RAILS_ENV=production
該備份命令會備份本地gitlab的所有項目的倉庫以及mysql數據。
恢復:
bundle exec rake gitlab:backup:restore RAILS_ENV=production BACKUP=543143575
該恢復命令會導入備份中的mysql數據和項目倉庫目錄,並可以根據需要,從mysql庫中的數據中重構~/.ssh/authorized_keys身份驗證文件
注意:必須到容器里面 到git用戶下,到/home/git/gitlab/下執行,不是data目錄,不然會沒有項目
要把getlab的地址改成本地的地址,端口改成對外的端口10080和10022,不然沒辦法push。
第一個yes 第二個no
注意:gitlab可以直接刪除重啟再起一個數據還是有的。
出處說明:
文章多摘抄:http://www.linuxidc.com/Linux/2016-05/131886.htm
下載地址;wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml
出處;
https://github.com/sameersbn/docker-gitlab#postgresql
http://www.tuicool.com/articles/bYbi2mJ
出;http://www.mamicode.com/info-detail-1149868.html