GitLab環境爆速準備(Ubuntu Server 12.04 LTS + Docker)

GitLab環境爆速準備(Ubuntu Server 12.04 LTS + Docker)
===========================
明日からチーム内に開発用リポジトリが必要となったので、Dockerのgitlab公開コンテナを利用して楽してさくっと準備する設定メモ


Ubuntu Server Precise 12.04 LTS
--------------------------
2017年4月まではサポートされてるので、[Download Ubuntu Server](http://www.ubuntu.com/download/server)からUbuntu Server 12.04 LTS 64-bitのisoイメージをダウンロードしてCD作って、社内で調達したラップトップにガイダンスに従いインストール

* Radtekの無線ネットワークのファームウェア(802.11g)がないのでインストールするかどうかの問いかけに対しては「いいえ」を選択


Docker
------
Docker公式の[Ubuntu Precise用のInstallation](http://docs.docker.io/en/latest/installation/ubuntulinux/#ubuntu-precise)に従いインストール。基本的に公式そのままだけどproxy必須環境だったので設定

### proxy設定
`http_proxy`と`https_proxy`を設定

    $ export http_proxy="http://社内proxyサーバ"
    $ export https_proxy="http://社内proxyサーバ"

sudo時にも利用できるように`/etc/sudoers`に`env_keep`を指定

    $ sudo visudo
     + Defaults env_keep="http_proxy"
     + Defaults env_keep="https_proxy"
    
### Dockerインストール
公式の手順通りに対応。LXCのバグが原因でDockerはカーネルが3.8がいいけど、Ubuntu Preciseのカーネルは3.2なのでバックポートされたカーネルをインストールってことらしい

    $ sudo apt-get update
    $ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring

再起動

    $ sudo reboot
    
鍵追加

    $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

`sudo apt-get update`や`sudo apt-get install lxc-docker`など行ってくれるスクリプト実行

    $ curl -s https://get.docker.io/ubuntu/ | sudo sh

インストール確認

    $ docker help

* [公式ドキュメント](http://docs.docker.io/en/latest/examples/hello_world/#check-your-docker-install)によるとインストール確認は`$ sudo docker info`で行うみたい
* さらに[Hello World](http://docs.docker.io/en/latest/examples/hello_world/#hello-world)もすればよいが省略

バージョン確認

    $ sudo docker version
    Client version: 0.9.1
    Go version (client): go1.2.1
    Git commit (client): 3600720
    Server version: 0.9.1
    Go version (server): go1.2.1
    Git commit (server): 3600720
    Last stable version: 0.9.1


### GitLabインストール
[docker index](https://index.docker.io/)で[GitLabのコンテナを探す](https://index.docker.io/search?q=gitlab)といろいろ見つかったけど、trusted repositoryでスターも多くてしっかりとしたドキュメントの[sameersbn/gitlab](https://index.docker.io/u/sameersbn/gitlab/)を使うことにする。

バージョンにこだわりないので、ドキュメントに従いまず最新のコンテナをpull

    $ sodo docker pull sameersbn/gitlab:latest

`--name`オプションはgitlabにして`docker run`

    $ sudo docker run --name gitlab -d sameersbn/gitlab:latest

gitlabが登録後に起動確認

    $ GITLAB_IP=$(sudo docker inspect gitlab | grep IPAddres | awk -F'"' '{print $4}')

* `docker inspect gitlab`の結果からgrepとawk使ってipを`GITLAB_IP`に設定

テキストブラウザで確認しようと思ったら入ってなかったので入れてから確認

    $ sudo apt-get install xbg-utils
    $ xdg-open "http://${GITLAB_IP}"
    
ログイン画面が表示されたのでホストマシンからは疎通確認完了。はやい!ありがとうDockerとsameersbn!!

### 参考資料
* [Installation on Ubuntu - Docker Documentation](http://docs.docker.io/en/latest/installation/ubuntulinux/)
* [Hello world example - Docker Documentation](http://docs.docker.io/en/latest/examples/hello_world/)
* [sameersbn/gitlab Repository | Docker Index](https://index.docker.io/u/sameersbn/gitlab/)


リバースプロキシ
--------------
Docker上のGitLabコンテナにメンバの端末からアクセスしたいのでUbuntu Server上にリバースプロキシをnginxで準備

構成

    GitLab(Docker)---Ubuntu Server---メンバの各端末

### Nginxインストール
公式ドキュメント[nginx: Linux packages](http://nginx.org/en/linux_packages.html)に従いインストール

鍵をダウンロードして追加

    $ curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -

`sources.list`に追記

    $ sudo vim /etc/apt/sources.list
     + deb http://nginx.org/packages/ubuntu/ precise nginx
     + deb-src http://nginx.org/packages/ubuntu/ precise nginx
     
インストール

    $ sudo apt-get update
    $ sudo apt-get install nginx

確認

    $ nginx -h
    nginx version: nginx/1.4.7

### リバースプロキシ設定
とりあえずコンテナに疎通できればいいので`proxy_pass`だけ設定する

設定ファイルのパス確認

    $ nginx -V

* `--conf-path`を確認して大本の設定ファイル特定

設定ファイル参照して

    $ cat /etc/nginx/nginx.conf
    
* `include /etc/nginx/conf.d/*.conf`を発見

デフォルトの設定ファイル`default.conf`を編集

    $ ls /etc/nginx/conf.d/
    default.conf	example_ssl.conf
    $ sudo vim /etc/nginx/conf.d/default.conf
     - location / {
     -     root	/usr/share/nginx/html;
     -     index	index.html index.htm;
     - }
     + location / {
     +     proxy_pass	http;//さっき疎通確信したのGITLAB_IP;
     + }

nginx再起動

    sudo nginx -s reload

Ubuntu Serverから疎通確認

    $ xdg-open "http://localhost"

* 確認完了

メンバ端末から疎通確認

    $ xdg-open "http://Ubuntu Serverのip"

* 確認完了

はやい!終わった!nginxありがとう!!アカウントとかは明日作るし帰る


### 参考資料
* [nginx: Linux packages](http://nginx.org/en/linux_packages.html)
* [apt-getでnginx-1.2.4 stableをubuntu 11.10にインストール](http://qiita.com/foloinfo/items/3c5d3c13df65fb8e581d)
* [O'Reilly Japan - マスタリングNginx](http://www.oreilly.co.jp/books/9784873116457/)p.57の4.3.1単一の上位サーバ

## その他
もっといい方法や不備等あれば教えていただけるとさいわいです＞＜

導入後の運用・トラブルシューティング
==============================
一週間ほど動かしてみて出てきた問題等についてメモ

リモートリポジトリへのアクセス
-------------------------
* httpしかプロキシ用意してないのでgitプロトコルが使えない
  * => gitプロトコル用の設定が大変そうだったので、リモートのurlはhttpを利用するという極めて雑な運用に落ち着く

リクエストボディの上限値引き上げ
---------------------------
* ちょっと大きいリポジトリをpushしたら413エラー発生
  * => httpリクエストボディの上限を引き上げて対処

エラーメッセージ例

    error: RPC failed; result=22, HTTP code = 413
    fatal: The remote end hung up unexpectedly

### リバースプロキシの設定変更

リバースプロキシとしてUbuntu Serverに立てている、nginxの`client_max_body_size`ディレクティブを指定し上限値をデフォルトの1MBから引き上げる

    $ sudo vim /etc/nginx/conf.d/default.conf
    server {
        listen       80;
        server_name  localhost;
    +     client_max_body_size 500M;
    # 以降は変更なしのため省略

設定の再読み込み

    $ sudo nginx -s reload

### Dockerコンテナの設定変更
Dockerコンテナ側の上限値も変更するため、コンテナにログイン

    # Dockerコンテナのユーザ名、パスワード取得してログイン
    $ sudo docker logs gitlab 2>&1 | grep '^User: ' | tail -n1
    $ ssh -l root GITLAB_IP

gitlabの設定ファイルである`config/gitlab.yml`の`git_max_size`を変更し上限値を引き上げ

    $ vim /home/git/gitlab/config/gitlab.yml
    # ....略....
      git:
        bin_path: /usr/bin/git
        # The next value is the maximum memory size grit can use
        # Given in number of bytes per git object (e.g. a commit)
        # This value can be increased if you have very large commits
    -     max_size: 5242880 # 5.megabytes
    +     max_size: 524288000 # 500.megabytes
        # Git timeout to read a commit, in seconds
        timeout: 10
    # ....略....

gitlabの再起動

    $ /etc/init.d/gitlab restart
    

Dockerコンテナ側にあるgitlab用のnginx設定ファイルである`/etc/nginx/sites-available/gitlab `内の`client_max_body_size`ディレクティブを指定し上限値を20MBから引き上げる

    $ vim /etc/nginx/sites-available/gitlab 
    # ....略....
    server {
      listen *:80 default_server;         # e.g., listen 192.168.1.1:80; In most cases *:80 is a good idea
      server_name localhost;     # e.g., server_name source.example.com;
      server_tokens off;     # don't show the version number, a security best practice
      root /home/git/gitlab/public;

      # 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;
    +   client_max_body_size 500m;
    # ....略....

設定の再読み込み

    $ nginx -s reload


#### 参考資料

* [nginxで"client intended to send too large body"が発生した時の対策方法](http://qiita.com/notanota/items/4816ad71b90a9967fa18)
* [HttpCoreModule - Nginx Community](http://wiki.nginx.org/HttpCoreModule#client_max_body_size)
* [nginx error – 413 Request Entity Too Large と出る場合は最大ファイルサイズを変更する](http://weble.org/2012/05/28/nginx-error-413-request-entity-too-large-%E3%81%A8%E5%87%BA%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E6%9C%80%E5%A4%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92)
* [https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md](https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md)