CentOS 6.5にGitLab 6.8をインストールとSSL導入

#CentOS 6.5にGitLab 6.8をインストールしてSSL導入

環境は2014/4/25時点で全て最新のものを使用。
CentOS:6.5
GitLab:6.8
GIt:1.9.2
Ruby:2.1.0
nginx:1.6.0

以下のサイトを参考にさせて頂きました。
ありがとうございました。
<b>gitlabhq/gitlabhq</b>
https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md
<b>$web->{note}; GitLab 5.0 を CentOS 6.4 にインストールする</b>
http://n8.hatenablog.com/entry/2013/04/24/230340
<b>dogmap.jp nginx で ssl 設定をする</b>
http://dogmap.jp/2011/05/10/nginx-ssl/

##Gitインストール

yumでも入れられるが最新版を欲しいのでsrcビルド。

```
# cd /tmp
# wget https://www.kernel.org/pub/software/scm/git/git-1.9.2.tar.gz
# tar zxvf git-1.9.2.tar.gz
# cd git-1.9.2
# ./configure --prefix=/usr/local
# make
# sudo make install
```

Gitの設定。

```
# git config --global user.name  "GitLab"
# git config --global user.email "gitlab@git.example.jp"
```

##Rubyインストール

```
# cd /tmp
# wget http://ftp.ruby-lang.org/pub/ruby/ruby-2.1.0.tar.gz
# tar zxvf ruby-2.1.0.tar.gz
# cd ruby-2.1.0
# ./configure
# make
# sudo make install
# gem install bundler
# gem install charlock_holmes --version '0.6.9'
```

##実行ユーザー作成

```
# useradd -c 'GitLab' -s /bin/bash git
```

GitLabから各ユーザーが登録する鍵はgitユーザのauthorized_keysに書き込まれる。
あらかじめ作成しておく必要がある。

```
# su - git
$ cd /home/git
$ mkdir .ssh
$ touch .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
$ chmod 700 .ssh
```

##GitLab shellのインストール

```
$ cd /home/git
$ git clone https://github.com/gitlabhq/gitlab-shell.git
$ cd gitlab-shell/
$ git checkout v1.9.4
$ git checkout -b v1.9.4
$ cp config.yml.example config.yml
$ vi config.yml
```

```
$ diff config.yml{.example,}
5c5
< gitlab_url: "http://localhost/"
---
> gitlab_url: "http://git.example.jp/"
```

```
$ ./bin/install
```

##データベース作成

```
# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# yum --enablerepo=remi install mysql mysql-server mysql-devel mysql-libs
```

MySQLの設定変更。
外部からはDBにログインできないように設定。

```
# vi /etc/my.cnf

[mysqld]
bind-address = 127.0.0.1
```

```
# /etc/init.d/mysqld start
# chkconfig mysqld on
```


Gitlab用のDBを作成。

```
# mysql

>CREATE USER 'gitlab'@'localhost' IDENTIFIED BY 'パスワード';
>CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
>GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'gitlab'@'localhost';
>\q
```

接続出来ることを確認。

```
# mysql -u gitlab -p -D gitlabhq_production
```

##Redisのインストール

```
# yum install redis
# /etc/init.d/redis start
# chkconfig redis on
```

##GitLabのインストール

```
# su - git
$ cd /home/git
```

srcの取得。

```
$ git clone https://github.com/gitlabhq/gitlabhq.git gitlab
$ cd gitlab
$ git checkout 6-8-stable
```

設定ファイルの変更。

```
$ cp config/gitlab.yml.example config/gitlab.yml
$ vi config/gitlab.yml

$ diff config/gitlab.yml{.example,}
18c18
<     host: localhost
---
>     host: git.example.jp
30c30
<     email_from: gitlab@localhost
---
>     email_from: gitlab@git.example.jp
```

レポジトリの場所と、SSHポートを変更したい場合もここで変更。

```
$ diff config/gitlab.yml{.example,}
219c219
<     repos_path: /home/git/repositories/
---
>     repos_path: new path
227c227
<     # ssh_port: 22
---
>     ssh_port: new port
```

必要なディレクトリを作成。

```
$ chown -R git log/
$ chown -R git tmp/
$ chmod -R u+rwX  log/
$ chmod -R u+rwX  tmp/
```

```
$ mkdir /home/git/gitlab-satellites
```

```
$ mkdir tmp/pids/
$ chmod -R u+rwX  tmp/pids/
```

```
$ cp config/unicorn.rb.example config/unicorn.rb
```

##GitLabのDB設定

```
$ cp config/database.yml.mysql config/database.yml
$ vi config/database.yml

$ diff config/database.yml{.mysql,}
10,11c10,11
<   username: root
<   password: "secure password"
---
>   username: gitlab
>   password: "MySQLのパスワード"
24,25c24,25
<   username: root
<   password: "secure password"
---
>   username: gitlab
>   password: "MySQLのパスワード"
37,38c37,38
<   username: root
<   password:
---
>   username: gitlab
>   password: "MySQLのパスワード"
```

##Gemsのインストール

長いので待ち続ける（Log出ないので注意）
```
$ cd /home/git/gitlab
$ bundle install --deployment --without development test postgres
```

##DBの初期化とセットアップ

```
$ bundle exec rake gitlab:setup RAILS_ENV=production
```

実行時にGemのパッケージが無いとかbundleのUpdateとか言われるかも。
その場合は導入して再度実行。成功するまで繰り返し。

##InitScriptのインストール

```
# cp lib/support/init.d/gitlab /etc/init.d/gitlab
# cp lib/support/init.d/gitlab.default.example /etc/default/gitlab
```

```
# chmod +x /etc/init.d/gitlab
# vi /etc/init.d/gitlab
# diff /etc/init.d/gitlab
?c?
< NAME=git
---
> NAME=gitlab
```

##ローテンションログの設定

```
# cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab
```

##状態チェック

```
# bundle exec rake gitlab:env:info RAILS_ENV=production
```

##Assetsのビルド

```
# bundle exec rake assets:precompile RAILS_ENV=production
```

## 起動とサービス登録

```
# /etc/init.d/gitlab restart
# chkconfig gitlab on
```

## 状態チェック

gitlab:checkを実行すると正常にインストール出来るかチェックされる。
エラー時は赤文字が出るので修正する。
修正にどのコマンドを実行するばいいか教えてくれるのでその通りにする。

```
$ bundle exec rake gitlab:check RAILS_ENV=production
```

はまり点としてはGitLabのファイル群に所有者がrootのものがあった。
なので、全てgitに変更した。

```
$ cd /home/git/gitlab
$ chown -R git:git .
```

## Nginxのインストール

```
# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# yum install nginx
```

起動とサービス登録。

```
# chkconfig nginx on
# /etc/init.d/nginx start
```

GitLabの設定ファイルを配置。

```
# cp lib/support/nginx/gitlab /etc/nginx/conf/gitlab
```

## SSLを導入

サーバー証明書持ってないのでオレオレ証明書を作成。

```
# mkdir /etc/nginx/cert
# cd /etc/nginx/cert
# openssl genrsa -des3 -out server.key 1024
# openssl req -new -key server.key -out server.csr
# cp server.key server.key.org
# openssl rsa -in server.key.org -out server.key
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
```

設定ファイルを変更。

```
# vi/etc/nginx/conf/gitlab
```

以下全容を記述。

```
upstream gitlab {
  server unix:/home/git/gitlab/tmp/sockets/gitlab.socket;
}

server {
#  listen *:80 default_server;         # e.g., listen 192.168.1.1:80; In most cases *:80 is a good idea
#  server_name YOUR_SERVER_FQDN;     # e.g., server_name source.example.com;
  server_name 127.0.0.1;
  server_tokens off;     # don't show the version number, a security best practice
  root /home/git/gitlab/public;

  listen 443 default ssl;
  ssl on;
  ssl_certificate /etc/nginx/cert/server.crt;
  ssl_certificate_key /etc/nginx/cert/server.key;

  # Increase this if you want to upload large attachments
  # Or if you want to accept large git objects over http
  client_max_body_size 20m;

  # individual nginx logs for this gitlab vhost
  #access_log  /var/log/nginx/gitlab_access.log;
  #error_log   /var/log/nginx/gitlab_error.log;

  #auth_basic  "Restricted";
  #auth_basic_user_file "/etc/nginx/.htpasswd";

  location / {
    # serve static files from defined root folder;.
    # @gitlab is a named location for the upstream fallback, see below
    try_files $uri $uri/index.html $uri.html @gitlab;
  }

  # if a file, which is not found in the root folder is requested,
  # then the proxy pass the request to the upsteam (gitlab unicorn)
  location @gitlab {
    # If you use https make sure you disable gzip compression 
    # to be safe against BREACH attack
    # gzip off;

    proxy_read_timeout 300; # Some requests take more than 30 seconds.
    proxy_connect_timeout 300; # Some requests take more than 30 seconds.
    proxy_redirect     off;

    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_set_header   Host              $http_host;
    proxy_set_header   X-Real-IP         $remote_addr;
    proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;

    proxy_pass         http://gitlab;
    #proxy_redirect     http:// https://;

    access_log  /var/log/nginx/gitlab_access.log;
    error_log   /var/log/nginx/gitlab_error.log;
  }

  # Enable gzip compression as per rails guide: http://guides.rubyonrails.org/asset_pipeline.html#gzip-compression
  location ~ ^/(assets)/  {
    root /home/git/gitlab/public;
    gzip_static on; # to serve pre-gzipped version
    expires max;
    add_header Cache-Control public;
  }

  error_page 502 /502.html;
}
```

再起動。

```
# /etc/init.d/nginx restart
```

##GitLabへアクセス

以下のURLでGitLabのログイン画面が表示される。

```
https://IPアドレス
```

初期のIDとパスは以下。

```
ID:root
PASS:5iveL!fe
```

## 再起動時にMySQLより早く起動してしまう問題

再起動した際に、GitLabよりMySQLサービスが早く立ち上がり以下のエラーが発生。

```
# Can't connect to local MySQL server through socket
```

起動スクリプトに起動順序の指定が無いのが原因のため以下を追加する。

```
# vi /etc/init.d/gitlab
# diff /etc/init.d/gitlab
15c15
< # chkconfig: - 75 25
```

再度サービス登録。

```
# chkconfig --delete gitlab
# chkconfig gitlab on
# chkconfig --list gitlab
gitlab         0:off   1:off   2:on    3:on    4:on    5:on    6:off
```