GitlabのOmnibus版をインストールしてApacheで運用してみる(ついでにSSLと自動バックアップも)

調べるとこんな記事が結構あったけど、もう古くなったバージョンだったり、情報が散らばってたりするので、最新バージョンでやってみた場合のメモ。
もしかしたら不要な設定があるかもしれないけど、とりあえずこれで動作確認はOK。
以下に設定ファイル含めた全貌を記載。

# インストール環境
* サーバ
    * CentOS 6.5
    * メモリはとりあえずgitlab推奨の2GB

# Gitlab Omnibusパッケージのインストール
[GitlabのHP](https://about.gitlab.com/downloads/)から対象のOSを選択するとインストール方法が出てくる。
Gitlab本体のインストールは上記の通りやっていけばすんなりと完了する(ほんとに２分で終わる)

今回はGitLab Community Edition 8.7.0の最新版をインストールした。

Omnibusパッケージだとpostgresもnginxもすべて必要なものをインストール、設定してくれるため非常に楽だが、すでにインストールしているpostgresやnginxを使う場合は自分で設定する必要があるためやや敷居が高くなる。

# Apacheで運用する
GitlabはnginxをWebサーバとして動作するが、すでに使用しているサーバがあり、Apacheを使用して80番ポートでアクセスさせたい場合は、少し一手間を加える必要になるようである。

そこで、リバースプロキシを利用して、Apacheで受けたリクエストをnginxに転送することで実現させる。

## gitlabの設定変更(SSLも対応)
今回リクエストの受け口となるURLをhttps://git.xxxxx.com とする

* /etc/gitlab/gitlab.rb

```
external_url = 'https://git.xxxxx.com' # urlの設定。今回はhttps
・・・
nginx['listen_addresses'] = ["0.0.0.0", "[::]"]
nginx['listen_port'] = 4080 # nginxをポート4080で受けるように設定
・・・
nginx['ssl_certificate'] = "path_to_cert" # これいらないかも？
nginx['ssl_certificate_key'] = "path_to_key" # これも
・・・
# あとはsmptのところでメール送信のセットアップを行う
```
※ インストール当初、external_urlの部分に"="がついていなかったけど、どうやら記載しないと行けない模様

* /var/opt/gitlab/nginx/conf/gitlab-http.conf

```
server {
  listen 0.0.0.0:4080;
  listen [::]:4080;
  server_name git.xxxxx.com; # ここを追記
```

* /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

```
  gitlab:
    ## Web server settings (note: host is the FQDN, do not include http://)
    # host:
    host: 'git.xxxxx.com'
    port: 443
    https: true

    # Uncommment this line below if your ssh host is different from HTTP/HTTPS one
    # (you'd obviously need to replace ssh.host_example.com with your own host).
    # Otherwise, ssh host will be set to the `host:` value above
    ssh_host:  'git.xxxxx.com'
    url: https://git.xxxxx.com
```

最後に```gitlab-ctl reconfigre```で設定を読み込み、```gitlab-ctl restart```で再起動。

## Apacheの設定
### 80番ポート側(HTTP)
HTTPSへリダイレクト

```
<VirtualHost *:80>
    ServerName git.xxxxx.com
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI} [R]
</VirtualHost>
```

### 443番ポート側(HTTPS)
いろいろ省略してます

```
<VirtualHost *:443>
    ServerName git.xxxxx.com:443
    SSLEngine on
    SSLCertificateFile path_to_cert
    SSLCertificateKeyFile path_to_key
    SSLCertificateChainFile path_to_chain # 中間証明があれば
    SSLProxyEngine On
    ProxyRequests off
    ProxyPass / http://127.0.0.1:4080/
    ProxyPassReverse / http://127.0.0.1:4080/
    ProxyPass /assets http://127.0.0.1:4080/assets
    ProxyPassReverse /assets http://127.0.0.1:4080/assets
</VirtualHost>
```

```
/etc/init.d/httpd restart
# sslのpassを入力
```

これでhttps://git.xxxxx.com

# 自動バックアップの設定
gitlabのバックアップはコマンド１行で取得できる。

```
/opt/gitlab/bin/gitlab-rake gitlab:backup:create
```
これで、/var/opt/gitlab/backupsにtarでバックアップが作成される。
詳しくは[ここ](http://doc.gitlab.com/omnibus/settings/backups.html)に記載されている通り。

## バックアップの保存期間を設定する
再び、/etc/gitlab/gitlab.rbに設定する部分があるため下記の通り設定

```
gitlab_rails['backup_keep_time'] = 604800 # 7日間分保存する
```

cronで１日１回深夜2時にバックアップをする

```
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1
```

## リモートサーバにバックアップ
svnであればsvnsyncなど便利なものがあったけど、あまり思いつかないのでrsyncを使用してリモートサーバにtarファイルをディレクトリごとバックアップ。

```
rsync -avz --delete /var/opt/gitlab/backups/ [remoteのIP]::gitlab
```

gitlabのバックアップのタスクと一緒にスクリプトを組んでおけばバックアップしてからリモートに保存することが出来る。ただ、これだとバックアップが取れない日々が続いた場合に全部消えてしまうのでファイルごとにバックアップするほうがよさそう。

リモートサーバ側の設定
rsyncをインストールして、下記の通り設定。

* /etc/rsyncd.conf

```
[gitlab] # ここは上記の[remoteのIP]::gitlabの"gitlab"と同じ命名にする
path = /path/to/backup
hosts allow = [バックアップ元サーバのIP]
hosts deny = *
list = true
uid = root
gid = root
read only = false
```

# 備考
```https://git.xxxxx.com/gitlab``` のように、サブディレクトリで運用しようとしたけど、最新版の8.7.0ではバグがあるようで、レイアウト崩れが発生していた。
サブディレクトリ運用する場合はそれより低いバージョンであれば、問題なく設定が出来た。(設定がもう少し面倒くさい)