GCPにBitbucket Serverを立ててみた


## 構成
- GCE (CentOS7)
- Cloud SQL(Postgresql)
- HTTPロードバランサ
- SendGrid (メール配信)

## 手順

### GCEインスタンスを作成し、Bitbucket Serverをインストールする
1. GCEインスタンスを作成する。以下のスペックで作成。
   - CentOS 7
   - n1-standard-1(vCPU*1, メモリ3.75GB)
2. gitをソースビルドする。CentOSデフォルトのgitはバージョンが低いのでソースからビルドする。

    ```shell
    # yum install -y zlib-devel perl-devel gettext gcc curl-devel
    # wget https://www.kernel.org/pub/software/scm/git/git-2.7.4.tar.gz
    # tar xvfz git-2.7.4.tar.gz
    # cd git-2.7.4
    # ./configure
    # make
    # make install
    ```
   
3. nginxをインストールする。

    ```shell
    # rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
    # vim /etc/yum.repos.d/nginx.repo
    enable = 0
    # yum install --enablerepo=nginx nginx
    ```

4. デフォルトで7990ポートを使うのでリバースプロキシを設定する。

    ```shell
   # vim /etc/nginx/conf.d/stash.conf
   proxy_cache_path   /var/run/nginx-cache levels=1:2 keys_zone=nginx-cache:50m max_size=50m inactive=1440m;
   proxy_temp_path    /var/run/nginx-cache/tmp;
   server {
        server_name stash.example.com;

        fastcgi_connect_timeout 300s;
        fastcgi_send_timeout 300s;
        fastcgi_read_timeout 300s;
        send_timeout 180;

        location / {
                proxy_set_header        Host $host;
                proxy_set_header        X-Forwarded-Host $host;
                proxy_set_header        X-Forwarded-Server $host;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Real-IP  $remote_addr;
                proxy_pass              http://127.0.0.1:7990;

                set $do_not_cache 0;

                if ($request_uri ~* ^(/secure/admin|/plugins|/secure/project)) {
                        set $do_not_cache 1;
                }

                proxy_cache             nginx-cache;
                proxy_cache_key         "$scheme://$host$request_uri";
                proxy_cache_bypass      $do_not_cache;
                proxy_cache_valid       1440m;
                proxy_cache_min_uses    1;

                proxy_read_timeout 300;
                proxy_send_timeout 300;
        }
   }
    ```

5. Javaを更新する

    ```shell
    # yum install java-1.8.0-openjdk-devel
    ```
   
6. Bitbucket Serverをダウンロードする。

    ```shell
    # wget https://www.atlassian.com/software/stash/downloads/binary/atlassian-bitbucket-5.2.2-x64.bin
    # chmod +x atlassian-bitbucket-5.2.2-x64.bin
    # ./atlassian-bitbucket-5.2.2-x64.bin
    ```

### ファイアウォール設定を行う
7990ポートでHTTP通信、7999ポートでSSH通信を行うため、ファイアウォールを設定する。

1. GCPの「VPCネットワーク」>「ファイアウォールルール」を開く。
2. 以下の設定でファイアウォールを作成する。(7990のみ掲載。)

    | 項目名                | 設定値                |
    |----------------------|----------------------|
    | 名前                  | http-bitbucket-rule  |
    | ネットワーク           | default              |
    | 優先度                | 1000                 |
    | トラフィックの方向      | 上り                  |
    | 一致したときのアクション | 許可                  |
    | ターゲットタグ         | http-bitbucket-server |
    | ソースフィルタ          | IP範囲                |
    | ソースIPの範囲         | 0.0.0.0/0             |
    | プロトコルとポート      | tcp:7990              |
   
3. GCEにターゲットタグの設定を行う。

### HTTPロードバランサの設定を行う
この手順は無くてもいいのですが、ドメインの後ろにポート指定するのが面倒なので設定します。

1. 「ネットワークサービス」>「負荷分散」を開く。
2. 「HTTPロードバランサ」を作成する。
    1. バックエンドを作成する。
       - Bitbucketをインストールしたインスタンスを含むインスタンスグループにポート7990を設定
    2. フロントエンドを作成する。
       - プロトコルHTTPでポート80を設定

### Bitbucketの初期設定を行う
1. http://{HTTPロードバランサのIP}/　にアクセスして初期設定を行う。

### CloudSQLの設定を行う
1. 「SQL」を開きPostgresqlインスタンスを立てる。
2. 作成したPostgresqlにアクセスし、 ユーザーとデータベースを作成する。

    ```sql
    CREATE ROLE bitbucketuser WITH LOGIN PASSWORD 'jellyfish' VALID UNTIL 'infinity';
    CREATE DATABASE bitbucket WITH ENCODING='UTF8' OWNER=bitbucketuser CONNECTION LIMIT=-1;
    ```

### データベース設定を行う
1. BitbucketServerにログインし、右上の歯車ボタンを押し設定画面を開く。
2. 「データベース」を押しデータベース設定を開く。
3. データベース移行を押し、データベースの設定を行う。

    | 項目名                | 設定値                |
    |----------------------|----------------------|
    | データベースタイプ      | PostgreSQL           |
    | ホスト名              | データベースのIP        |
    | ポート                | 5432                 |
    | データベース名          | 前の項目で設定したデータベース名|
    | データベースユーザー名   | 前の項目で設定したユーザー名    |
    | データベースパスワード   | 前の項目で設定したパスワード    |

### メール設定を行う
GCEはメールで使用するポートを使うことができない仕様のため、Sendgridを用いてメールを送信する。

1. BitbucketServerにログインし、右上の歯車ボタンを押し設定画面を開く。
2. 「メールサーバー」を押しメールサーバー設定を開く。
3. メールサーバーの設定を行う。

    | 項目名|設定値|
    |----------------------|----------------------|
    | ホスト名| smtp.sendgrid.net    |
    | ポート| 2525 |
    | ユーザー名| SendgridのログインID |
    | パスワード| Sendgridのパスワード |
    | プロトコル| SMTP |
    | メール送信者| 適当に|