月500円な自分専用Gitlabを構築する


# はじめに
自分専用のGitサーバがあれば便利ですよね。
今回は[IDCFクラウド](https://idcfcloud.com/)の500円VMに[Gitlab](https://about.gitlab.com/)を構築する方法を紹介します。

# やること
IDCFクラウドのVMにGitlabを構築します。
ついでにバックアップをIDCFクラウドのオブジェクトストレージにとるようにします。
また、GitlabにはGithubのアカウントでシングルサインオンできるようにします。

* IDCFクラウドでVM作成
* クラウドのネットワーク設定
* オブジェクトストレージAPIキー取得
* Githubのアプリケーション登録
* Itamaeでプロビジョニング

# 準備
次のものを用意しておいてください。

* IDCFクラウドのアカウント
* Rubyが実行できる環境

IDCFクラウドのアカウント登録等は[めちゃ楽ガイド](http://www.idcf.jp/cloud/pdf/IDCFCloud_installation_guide.pdf)というのがわかりやすいらしいです。

RubyはGitlabの構築に[Itamae](http://itamae.kitchen/)を使うので必要になります。

他にも以下のものがあるとGoodです。

* Githubのアカウント
* SSL証明書
* ドメイン

今回、SSL証明書は[StartSSL](https://www.startssl.com/)の無料のものを使用しました。

参考: [無料のSSL証明書StartSSLを活用する](http://qiita.com/k-shogo/items/870b6d3939dd08da2de4)

# 仮想マシン作成
では早速、仮想マシンを作成します。

IDCFクラウドのWebコンソールにログインして、GUIでポチポチ進めていきます。

![p01.png](https://qiita-image-store.s3.amazonaws.com/0/43208/1cd8511c-7e96-4fa6-4fdb-85fda84ac182.png "p01.png")

今回は以下のVMを作成します。

* VMタイプ: light.S1
* イメージ: CentOS 7.0 64-bit
* ボリューム: Root 15G
* SSH鍵: 適当なログインできるもの
* VM name: 適当に

しばらく待つとVMができます。

# ネットワーク設定
ネットワーク設定を行います。
今回は無料のソースIPを使用します。

左メニューの「IPアドレス」をクリックして、VMを作成したゾーンと同じゾーンのソースIPをクリックします。

![p02.png](https://qiita-image-store.s3.amazonaws.com/0/43208/d9b99602-9bf8-2147-2c06-e0b76c331592.png "p02.png")

IPの設定画面が出てくるので、まずはファイアウォールを設定します。
SSHとHTTPSのポートを解放しましょう。HTTPSを使わない方は、HTTP（80番）を解放してください。

![p03.png](https://qiita-image-store.s3.amazonaws.com/0/43208/d68f6ab2-87ff-96dc-c3b7-29ea420c790e.png "p03.png")

次に、ポートフォワードを設定します。
先ほど解放したSSHとHTTPSのポートを、Gitlab用VMへ転送するように設定します。

HTTPS、SSHともに任意のポートで構いませんが、次のことに気をつけてください

* HTTPSはプライベートポートとパブリックポートが一致するように
* SSHのプライベートポートは必ず22番に

![p04.png](https://qiita-image-store.s3.amazonaws.com/0/43208/a2d09523-e7c5-7e29-2f6a-47f7c03d0c10.png "p04.png")

# オブジェクトストレージAPIキー取得
では次にバックアップ用をオブジェクトストレージにとるため、オブストのAPIキーを取得します。

左上のメニューから「オブジェクトストレージ」をクリックしてください。

![p05.png](https://qiita-image-store.s3.amazonaws.com/0/43208/6af4a165-f5f3-bbac-2b0c-85469ebc2b9d.png "p05.png")

初めての方は契約画面っぽいのが出てくると思いますが、従量（10Tパックじゃない方）を選択してください。
50GBまでは無料になります。

まずは「APIユーザー追加」をクリックします。

![P06.png](https://qiita-image-store.s3.amazonaws.com/0/43208/2c66a374-eace-66e4-398d-605c1ca214fc.png "P06.png")

適当なユーザ名を入力して、「OK」をクリックしてください。

![p07.png](https://qiita-image-store.s3.amazonaws.com/0/43208/ca5d0afb-00e9-b313-1517-95d65a4a8284.png "p07.png")

そうするとAPIキーとシークレットキーが表示されます。
この2つのキーはあとで使います。

![p08.png](https://qiita-image-store.s3.amazonaws.com/0/43208/2a76d6df-4cd4-d0a6-4b0f-ed9e967d71fa.png "p08.png")

# Githubのアプリケーション登録
ここでは、GithubのアカウントでGitlabにシングルサインオンできるようにGithubへアプリケーションの登録を行います。
シングルサインオンが必要ない場合はスキップしてください。

まず、GithubにログインしてSettingsのApplicationsに行きます。
そして、「Register new application」をクリックしてください。

![p09.png](https://qiita-image-store.s3.amazonaws.com/0/43208/7f81994d-0441-007c-8901-26a2ed5ef927.png "p09.png")

登録フォームのHomepage URLとAuthentication callback URLにGitlabのURLを入力してください。
特にドメインなどなければ、`https://210.xxx.xxx.xxx/`のようなIPアドレスでも構いません。
この場合、ネットワーク設定で設定したIPがここに入ります。

![p10.png](https://qiita-image-store.s3.amazonaws.com/0/43208/0cada005-7a95-9897-f02e-4b9fbe4f5482.png "p10.png")

登録が完了したら、このようにClient IDとClient Secretが表示されます。
これらはあとで使います。

![p11.png](https://qiita-image-store.s3.amazonaws.com/0/43208/d3c3a118-b5f0-17cf-d62d-f9af66812868.png "p11.png")

# Itamaeでプロビジョニング
ではでは、いよいよGitlabの構築を行います。
ここからはコマンドでの操作になります。

まず、Gitlab用のレシピをGithubからクローンします。

```bash
git clone https://github.com/nownabe-infra/gitlab.git
```

次に、bundle installします。

```bash
cd gitlab
bundle install --path vendor/bundle
```

`node.yml`に色々と設定を書いていきます。
まずはサンプルファイルをコピーしましょう。

```bash
cp node.yml.sample node.yml
```

`node.yml`を編集します。

```yaml:node.yml
base:
  users:
    nownabe: # CentOSに作成するユーザ名
      github_user: nownabe # Githubのユーザ名（公開鍵を取得する）
      groups: wheel        # sudoできるように
      password: $6$...     # パスワードハッシュ（作り方は後述）

  mailto:
    root: nownabe@foobar.baz # rootユーザ宛のメールを転送するアドレス

gitlab:
  external_url: https://gitlab.foobar.baz  # GitlabのURL。HTTPSを使わない場合はhttp://にする
  gitlab_rails:
    time_zone: "Asia/Tokyo"
    omniauth_enabled: true                   # omniauthはシングルサインオンのための設定です
    omniauth_allow_single_sign_on: true      # 必要ない場合はまるっと削除してください
    omniauth_block_auto_created_users: true  # サンプルではGithub連携になっています
    omniauth_providers:                      # GoogleやTwitterとも連携できるようになってます。
      -                                      # https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/omniauth.md
        name: github
        app_id: YOUR_CLIENT_ID         # Githubで取得したClient ID
        app_secret: YOUR_CLIENT_SECRET # Githubで取得したClient Secret
        url: https://github.com/
        args: { scope: "user:email" }
  nginx:
    redirect_http_to_https: true    # HTTPSを使わない場合は削除
    redirect_http_to_https_port: 80 # HTTPSを使わない場合は削除
  backup:
    access_key: YOUR_API_KEY    # オブジェクトストレージのAPIキー
    secret_key: YOUR_SECRET_KEY # オブジェクトストレージのシークレットキー
    bucket: YOUR_BUCKET         # バックアップを保存するバケット名
    exipre: 7                   # バックアップを保存する日数
```

パスワードハッシュは、次のコマンドで生成できます。

```bash
bundle exec rake itamae:mkpasswd
```

HTTPSを使用する場合、証明書と秘密鍵をそれぞれ、`ssl/gitlab.crt`と`ssl/gitlab.key`に置いてください。

`node.yml`の準備ができたら、まずはDry runします。
IPには設定したソースIP、ポートは設定したSSHのポートを指定します。

```bash
bundle exec itamae ssh -h ${YOUR_IP} -p ${YOUR_PORT} -u root -y node.yml recipe.rb --dry-run
```

問題がなさそうなら、実際にItamaeでプロビジョンします。

```bash
bundle exec itamae ssh -h ${YOUR_IP} -p ${YOUR_PORT} -u root -y node.yml recipe.rb
```

# Gitlabログイン
プロビジョニングが終わりGitlabのURLにアクセスすると、こんな画面が出てきます。

![p12.png](https://qiita-image-store.s3.amazonaws.com/0/43208/d3828272-d8c9-3e0b-3a29-9980eb1ac728.png "p12.png")

Sign inしろってことなので、Sign in with Githubをクリックして、Githubのアカウントでサインインします。
すると、次はこんなメッセージが表示されます。

![スクリーンショット 2015-05-03 13.28.22.png](https://qiita-image-store.s3.amazonaws.com/0/43208/f74cba90-5172-0174-5f78-179d02eed22a.png "スクリーンショット 2015-05-03 13.28.22.png")

誰かが勝手にアカウントを作成してサインインできないように、Gitlabにサインインするには管理者での有効化が必要になっています。
なので、管理者でサインインして有効化しましょう。
管理者のアカウントは、

* Username: root
* Password: 5iveL!fe

です。
初期パスワードを変更して再度サインインを求められるので、ユーザ名rootと新しいパスワードでサインインし直します。

サインインできたら、右上の「Admin Area」、左メニューの「Users」、「Blocked」と辿ります。
するとGithubでシングルサインオンしたユーザが表示されるので、「Unblock」をクリックしてください。

![p13.png](https://qiita-image-store.s3.amazonaws.com/0/43208/bc7f69fc-99af-35fa-bada-59bb28342ff3.png "p13.png")

これでアカウントが有効化されたので、rootユーザはサインアウトして、もう1度Sign in with Githubしてみましょう。

無事にサインインできたでしょうか？

これで500円Gitlabの完成です！

![p14.png](https://qiita-image-store.s3.amazonaws.com/0/43208/293179a2-144c-c1c3-1408-b3c9fb5abc34.png "p14.png")

# おまけ
バックアップも問題なければとれていると思います。
オブストのコンパネで確認してみてください。

![p15.png](https://qiita-image-store.s3.amazonaws.com/0/43208/98b7b1cb-5eae-6534-4b44-89562f0ba316.png "p15.png")