这篇教程基本就是官方文档的翻译版(意译为主),因为中文 gitlab 配置文档没几个能看的,于是决定结合自己的踩坑经历亲自写个教程
一、开始之前
1. 考虑是否采用一键安装包
GitLab 提供了deb、rpm 打包的一键安装包,包含了 GitLab 所依赖的各个软件(比如 nginx、postgresql redis 等组件),下载地址以及相关文档:https://packages.gitlab.com/gitlab/gitlab-ce
对于线上生产环境来讲,当然不建议这样的傻瓜式配置,除非你想加班。。。
2. 选择需要的版本
如果对于每个版本的异同没什么特殊要求,就不用管了,直接选择最新的 stable 版就好了
3. 一些提示
1) 这篇教程是基于 debian/ubuntu 的,其他发行版有借鉴之处,只是出问题的概率会稍微多点罢了
2) 我们搭建的是生产系统(production),想搭建开发版本(development)的同学请去这里:https://gitlab.com/gitlab-org/gitlab-development-kit
3) 下面的步骤经测试是可行的;如果你偏离以下步骤,自求多福咯 :)
二、步骤预览
1. 基本软件依赖
2. Ruby
3. Go
4. 添加用户
5. 数据库
6. Redis
7. GitLab
8. Nginx
三、开始工作
1. 基本软件依赖
1) 基本开发工具
1 |
apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl openssh-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev logrotate python-docutils pkg-config cmake nodejs |
2) Kerberos
如果你都不知道这是什么鬼,那么你可以假设并不需要这东西
1 |
apt-get install libkrb5-dev |
3) Git
1 |
apt-get install -y git-core |
要求 Git 版本 >= 2.7.4,如果官方源里面的git版本太旧,那么我们来自己编译吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 先卸载刚才安装的 git apt-get remove git-core # 安装依赖 apt-get install -y libcurl4-openssl-dev libexpat1-dev gettext libz-dev libssl-dev build-essential # 下载源码编译 cd /tmp curl -O --progress https://www.kernel.org/pub/software/scm/git/git-2.7.4.tar.gz echo '7104c4f5d948a75b499a954524cb281fe30c6649d8abe20982936f75ec1f275b git-2.7.4.tar.gz' | shasum -a256 -c - && tar -xzf git-2.7.4.tar.gz cd git-2.7.4/ ./configure make prefix=/usr/local all # 安装到目录 /usr/local/bin make prefix=/usr/local install # 如果你像上面这样自己编译安装的git,那么配置gitlab的时候,请将 config/gitlab.yml 里面的git路径修改为 /usr/local/bin/git |
4) sendmail
sendmail 是一个邮件代理程序,简单来说就是一个能往外发邮件的程序。我们将要安装的是 GitLab 推荐的 postfix,安装这个包之后就有sendmail 二进制程序可以用了
1 |
apt-get install -y postfix |
需要补充的是,使用 sendmail 让服务器往外发邮件,需要对域名配置MX记录、TXT记录等,但是依然有很大的可能性被各种邮件服务器认为垃圾邮件,甚至拒收。
同时,如果服务器在“墙”内,那么发往 gmail 等邮箱就无能为力了。。。
所以,我们最终选择了不配置 sendmail,而通过 smtp 使用第三方的邮件服务
2. Ruby
GitLab 当前仅支持 Ruby 2.1.x ,暂时还未支持 2.2 和 2.3。(现在时间为:2016-04-08)
幸运的是,debian 8 官方源里的 ruby 版本为2.1.5,正好符合需求,不幸的同学可以参照下面的方法手动编译
1 2 3 4 5 6 7 8 9 10 11 |
# 先卸载旧版本 apt-get remove ruby # 下载源码编译 mkdir /tmp/ruby && cd /tmp/ruby curl -O --progress https://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.8.tar.gz echo 'c7e50159357afd87b13dc5eaf4ac486a70011149 ruby-2.1.8.tar.gz' | shasum -c - && tar xzf ruby-2.1.8.tar.gz cd ruby-2.1.8 ./configure --disable-install-rdoc make sudo make install |
下面顺便安装一下 Bundler Gem
1 2 3 4 5 6 |
# 先配置一下国内的 RubyGems 源,详细介绍请见:http://blog.stdio.io/?p=661 gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/ # 下面安装 bundler(要求版本 >= 1.5.2)。为了节省时间,我们这里没有安装配套的文档 gem install bundler:1.5.2 --no-ri --no-rdoc |
3. Go
从 GitLab 8.0 以来,HTTP 请求由 gitlab-workhorse 处理。这是一个用 go 写的轻量级守护进程。所以我们需要安装 go 语言的编译器。
(原文档是编译安装的 1.5.3 版本,我们直接使用源里的 1.3.3 二进制包)
1 |
apt-get install golang-go |
4. 添加用户
添加专门用于运行 GitLab 的用户:git
1 |
adduser --disabled-login --gecos 'GitLab' git |
5. 数据库
官方推荐使用 PostgreSQL,但是也支持 Mysql,为了方便,就使用了服务器上面现有的 mysql
(这里我就不给出 PostgreSQL 的配置方式了,需要的同学请查看原文档,链接最后给出)
1 2 3 4 5 6 7 8 9 10 11 |
# 先安装 mysql server 等软件包 apt-get install -y mysql-server mysql-client libmysqlclient-dev # 以 root 登录 mysql 之后,开始新建用户以及数据库 mysql> CREATE DATABASE IF NOT EXISTS 'gitlabhq_production' DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`; mysql> grant all on 'gitlabhq_production'.* to 'git'@'localhost' identified by 'password'; mysql> flush privileges; mysql> exit # 可以使用 git 用户进行登录尝试,密码为上面的 password mysql -u git -D gitlabhq_production -p |
6. Redis
Redis 是一款著名的“Key-Value”存储型数据库,这里要求的最低版本为 Redis 2.8
(debian 8 以及 ubuntu 14.04 官方源的版本都满足要求,其他用户可以看这里:https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/redis.md)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# 首先安装 redis server apt-get install redis-server # 准备 redis 的配置文件 cp /etc/redis/redis.conf /etc/redis/redis.conf.orig # 将监听端口设置为0,这样 redis 就不会监听 tcp 端口了 sed 's/^port .*/port 0/' /etc/redis/redis.conf.orig | tee /etc/redis/redis.conf # 配置 Unix Socket 文件路径 echo 'unixsocket /var/run/redis/redis.sock' | tee -a /etc/redis/redis.conf # 配置 Unix Socket 文件的权限为 770 echo 'unixsocketperm 770' | sudo tee -a /etc/redis/redis.conf # 为 Unix Socket 文件创建目录并设置好权限 mkdir /var/run/redis chown redis:redis /var/run/redis chmod 755 /var/run/redis # 下面这段是为了将该目录持久保存下去,在 debian8 里面不需要这些操作,该目录在 redis 启动后会自动生成 # Persist the directory which contains the socket, if applicable if [ -d /etc/tmpfiles.d ]; then echo 'd /var/run/redis 0755 redis redis 10d -' | sudo tee -a /etc/tmpfiles.d/redis.conf fi |
准备重启服务以及添加 git 用户至相应用户组
1 2 3 4 5 |
# 重启 redis-server 使配置生效 service redis-server restart # 将 git 用户添加至 redis 用户组 usermod -aG redis git |
7. GitLab
下面涉及到各种配置,为了简化权限问题,全部在 git 用户下进行操作 (su - git 即可切换为 git 用户)
1) clone 源码
1 2 3 4 5 |
# 进入 /home/git 目录,然后下载源码 $ cd /home/git # clone 项目代码,这里我们选择最新的stable版本 $ git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 8-7-stable gitlab |
2) 各种配置
主配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 进入 gitlab 安装目录 $ cd /home/git/gitlab # 准备主配置文件 $ cp config/gitlab.yml.example config/gitlab.yml $ vim config/gitlab.yml # 根据文件开头部分的提示,对配置进行个性化修改 # 这里主要需要修改的地方有 # 1. 你的域名,host: xxx.xxx.com # 2. 端口,port:80,这是一个大坑!!! 这只是最终你的web服务器监听的端口,并不是说gitlab会监听这个端口。 # 所以如果需要就上443,不然默认80就好了 # 3. 时区,time_zone: 'Beijing' # 4. 邮件支持,email_enabled:true,这行默认是被注释的,但是默认true # 5. 邮件相关配置,如果后面采用 smtp 服务,请注意 email_from 要设置为对应的邮箱地址。 # 否则部分服务提供商会(比如163)拒绝你的发信的。 # 6. Git 程序的路径,bin_path: /usr/bin/git (之前自己编译git的同学注意下就好) |
一堆文件以及目录权限设置
1 2 3 4 5 6 7 8 9 10 11 |
# 准备 secrets 文件 $ cp config/secrets.yml.example config/secrets.yml $ chmod 0600 config/secrets.yml # 设置 log/ 和 tmp/ 和其他一些目录的权限 $ chown -R git log/ tmp/ $ chmod -R u+rwX tmp builds shared/artifacts $ chmod -R u+rwX,go-w log/ # 新建 uploads 目录并设置权限 $ mkdir public/uploads && chmod 0700 public/uploads |
unicorn 以及 rack attack 配置
1 2 3 4 5 6 7 8 9 10 11 |
# 查看 CPU 核心数 $ nproc # 下面配置 unicorn.rb,可以根据CPU核数设置工作进程数量以及内存分配 # 这里有个需要注意的地方,unicorn 监听的端口,默认为8080,如果该端口已被其他程序占用(对,我说的就是你,tomcat!),请修改为大于1024的其他端口。 # 这里假设我们改为了8090端口 $ cp config/unicorn.rb.example config/unicorn.rb $ vim config/unicorn.rb # 准备 Rack attack 配置文件 $ cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb |
git 客户端配置
1 2 3 4 5 6 |
# 配置 Git 的全局设置 # 因为网页编辑器,需要启用'autocrlf' $ git config --global core.autocrlf input # Disable 'git gc --auto' because GitLab already runs 'git gc' when needed $ git config --global gc.auto 0 |
3) 数据库配置
redis 连接设置
1 2 3 |
# 配置 redis 连接设置, 需要注意的是 redis 的 Unix Socket 文件位置 $ cp config/resque.yml.example config/resque.yml $ vim config/resque.yml |
Mysql 配置 (PostgreSQL 配置请见原文档)
1 2 3 4 5 |
# 还是一样先准备配置文件 $ cp config/database.yml.mysql config/database.yml # 这里需要说明的是,我们只需要修改 'production' 块的配置,也就是第一块那边的配置 # 设置好 mysql 的用户名以及密码就够了 |
4) 安装Gems
提示:下面 bundle install 的时候可以加上参数 -jN, N 为线程数,多线程并发执行,可以节省大量时间
1 2 3 4 5 6 7 8 9 10 11 12 |
# 先配置 bundle 使用的 gem 源,详细请见:http://blog.stdio.io/?p=661 $ bundle config mirror.https://rubygems.org https://ruby.taobao.org # 然后开始安装 $ bundle install --deployment --without development test postgres aws kerberos # 重要说明:在安装过程中,可能发生错误,提示你缺一堆依赖,并给出了安装的命令 sudo gem install... # 然后我的解决办法就是一个一个手动运行那些命令。。。毕竟对 ruby 不熟,不了解啊 # 还出现的诡异现象是,在安装某个依赖的包的时候,又依赖了另一个包,然后后者提示要求 ruby >= 2.2 ... # 这又和 GitLab 仅支持 2.1 矛盾了。。。 # 虽然出错了,但是 gem 似乎已经将这个包标记为已安装,所以继续上面的 bundle install 就可以了 # 然后你肯定想这样会不会有什么副作用。。。我想也是有的。。。没办法了,毕竟没玩过ruby on rails,以后实际使用过程中遇到问题再说了 |
5) 安装 GitLab Shell
1 |
$ bundle exec rake gitlab:shell:install REDIS_URL=unix:/var/run/redis/redis.sock RAILS_ENV=production |
默认情况下,gitlab-shell 的配置文件会根据你的 GitLab 主配置文件自动生成,下面我们修改该配置文件:
1 2 3 4 5 6 |
# 进入对应目录 $ cd /home/git/gitlab-shell $ vim ./config.yml # Notice:如果之前你修改了 unicorn的默认端口(8080),那么这边也需要作出相应的修改 # 比如将 gitlab_url 这行改为 gitlab_url: http://127.0.0.1:8090/ |
6) 安装 gitlab-workhorse
1 2 3 4 5 6 7 8 9 |
# 切换进入对应目录 $ cd /home/git # git clone 项目代码 $ git clone https://gitlab.com/gitlab-org/gitlab-workhorse.git $ cd gitlab-workhorse && git checkout v0.7.1 # 进行编译操作 $ make |
7) 初始化数据库 以及 激活高级特性
1 2 3 4 5 6 7 8 9 |
# 切换进入 gitlab 安装目录 $ cd /home/git/gitlab # 进行初始化操作,提示的时候记得输入'yes' # 当你看到 'Administrator account created....'的时候,就成功完成了初始化 $ bundle exec rake gitlab:setup RAILS_ENV=production # 如果你想在初始化的时候制定管理员密码和邮箱,可以在初始化的时候添加参数 $ bundle exec rake gitlab:setup RAILS_ENV=production GITLAB_ROOT_PASSWORD=yourpassword GITLAB_ROOT_EMAIL=youremail |
8) 安装启动脚本
不要忘了下面几条命令是需要root权限的
1 2 3 4 5 6 7 8 9 10 11 |
# 拷贝启动脚本至特定目录 cp lib/support/init.d/gitlab /etc/init.d/gitlab # 设置开机启动顺序 update-rc.d gitlab defaults 21 # 如果你的安装目录没有按照我们的教程来,你还需要准备并修改下面这个文件 cp lib/support/init.d/gitlab.default.example /etc/default/gitlab # 如果你的安装目录或者用户和教程不同,修改 /etc/default/gitlab 就可以了, # 请不要尝试修改/etc/init.d/gitlab,因为该文件在更新的时候会被更改 |
9) 配置日志轮转
1 2 |
# 这里其实也仅仅是复制一个预先提供的脚本就好了 cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab |
10) 配置 SMTP 邮件服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# 还是先找到目录再说... $ cd /home/git/gitlab/config/initializers/ # 准备配置文件 $ cp smtp_settings.rb.sample smtp_settings.rb $ vim smtp_settings.rb # 需要配置 smtp服务器地址、用户名、密码等,这个根据每个邮箱提供商给的数据进行配置 # 最关键的一点,如果使用 SSL的话,需要再加一行配置:tls:true,这个坑了我半天的时间。。。 # 我使用的是 163域名邮箱,配置如下: if Rails.env.production? Rails.application.config.action_mailer.delivery_method = :smtp ActionMailer::Base.smtp_settings = { tls:true, address: "smtp.ym.163.com", port: 465, password: "yourpassword", domain: "your domain", authentication: :login, enable_starttls_auto: true, openssl_verify_mode: 'none' end |
11) 检查程序状态 并 预编译资源文件
1 2 3 4 5 6 7 |
# 我们来检查一下 Application Status $ cd /home/git/gitlab $ bundle exec rake gitlab:env:info RAILS_ENV=production # 预编译资源文件 $ cd /home/git/gitlab $ bundle exec rake assets:precompile RAILS_ENV=production |
12) 启动服务
终于到这一步了。。。root 权限运行 service gitlab start 即可
8. Nginx
最后,我们需要让 Nginx 反向代理来对用户提供 GitLab 的 web 服务
1 2 3 4 5 6 7 8 |
# 复制 nginx 模板文件,注意要 root 权限 cp /home/git/gitlab/lib/support/nginx/gitlab /etc/nginx/sites-available/gitlab ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab # 编辑站点配置文件,主要需要修改 server_name、 default_server 等配置,因人而异了 # 下面检测nginx配置是否正确,一切ok的话,就可以重启服务试试了 nginx -t && service nginx reload |
四、最后的检查
1. Final check
在上述过程全都成功之后,我们可以检查一下 GitLab 的各个组件是否正常:
1 2 3 |
# 切换目录 $ cd /home/git/gitlab $ bundle exec rake gitlab:check RAILS_ENV=production |
2. 日志查看
日志主要都在 gitlab/log 目录下面,比如 sidekiq.log 就保存了每次发邮件的信息。
五、额外的一些配置
1. 启用 HTTPS 支持
1) 修改 gitlab.yml,片段如下
1 2 |
port: 443 https: true |
2) 重新准备 Nginx 站点配置文件
1 2 3 4 5 6 7 8 9 10 |
# 准备 nginx 站点配置文件 cp /home/git/gitlab/lib/support/nginx/gitlab-ssl /etc/nginx/sites-available/gitlab ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab # 修改如下配置(至于SSL证书,有钱就去买,没钱可以用 Let's encrypt...) # 1. server_name # 2. default_server # 3. ssl_certificate 以及 ssl_certificate_key # 4. 反向代理的部分,增加一行参数: proxy_set_header X-Forwarded-Port 443; # 如果没有这一段,后面配置和GitHub的OmniAuth会报错 “redirect uri not match...” |
3) 重启 Nginx 以及 GitLab
1 2 3 4 5 |
# 先重启一下GitLab service gitlab restart # 当然先得检测一下配置文件有没有错误, 没错误的话就reload nginx -t && service nginx reload |
2. 使用 GitHub 登录以及项目导入功能
这里需要用到的东西叫做:OmniAuth
1) 在你的 GitHub 账户中添加OAuth Applications
官方文档:https://gitlab.com/help/integration/github.md
注意点:a. GitHub 添加应用的具体位置为: OAuth applications -> Developer applications
b. callback URL 填写您的站点URL,和文档中截图一样,而不是文档中说的:'${YOUR_DOMAIN}/import/github/callback'
2) 修改 gitlab.yml,片段如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
## OmniAuth settings omniauth: # Allow login via Twitter, Google, etc. using OmniAuth providers enabled: true # CAUTION! # This allows users to login without having a user account first. Define the allowed providers # using an array, e.g. ["saml", "twitter"], or as true/false to allow all providers or none. # User accounts will be created automatically when authentication was successful. # allow_single_sign_on: ["saml", "twitter"] allow_single_sign_on: true # 这里我们设置了值为 true,这样可以自动创建用户 # Locks down those users until they have been cleared by the admin (default: true). block_auto_created_users: false # 这里,我们的配置为 false,用户通过第三方验证之后直接就可以正常使用 # 下面,我们需要添加从 GitHub 那里取得的 ClientID 和 ClientSecret providers: - { name: 'github', app_id: 'Your ClientID', app_secret: 'Your Client Secret', args: { scope: 'user:email' } } |
3) 重启服务
1 |
service gitlab restart |
参考资料
官方安装文档:https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md
ArchLinux Wiki:https://wiki.archlinux.org/index.php/Gitlab
用docker会简单不少哦
哇,这文章很老了,后来我都是单独开一个虚拟机,然后 apt install 解决的。
用docker的话,还得考虑持久化存储的数据库、文件系统,安全更新也不如apt源来的方便