GCP上にオンラインメモ帳をつくる

手数をかけずにオンラインメモ帳環境をつくってみる。

## 環境

- インフラ
    - GCE(GCP)
    - docker-compose
- アプリケーション
    - HackMD
    - PostgreSQL（MySQLも可）

今回はGCPの無料枠でやってみるので[GCP公式の手順](https://cloud.google.com/community/tutorials/docker-compose-on-container-optimized-os)に沿って実施する。

## GCEインスタンスの作成

GUIでポチポチしていくだけなのでかんたん。

左上のメニュー「≡」からCompute Engineを選択し、VMインスタンスを作成する。
![スクリーンショット 2019-11-09 15.32.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35884/2d30e984-f27c-6fae-b03e-068f277fb2af.png)

今回は無料枠なのでMicroを選択。

![スクリーンショット 2019-11-09 15.35.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35884/f6af7498-f167-1503-8555-a5b8164ece7f.png)

ブートディスクはContainer-Optimized OSのstableで~~一番新しいものを選択する。~~
=> なぜかうまく行かなかったので**Container-Optimized OS, 69-10895.385.0 stable**で作り直した。

![スクリーンショット 2019-11-09 15.35.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35884/9c607f5d-9f20-e980-974b-e8c6fb489e86.png)

## SSHでログインしDockerの起動

作成後、ターミナルからSSHでログインする。
ログイン情報は以下から確認できる。
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_35884_d1dea3e4-69c3-698e-1873-32da56d70c46.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35884/4cb60d31-d78e-e07d-29fd-418964c56dda.jpeg)

SSHでログイン後、docker-composeをセットアップ。

```bash
docker run docker/compose:1.24.0 version
```

HackMDのdockerリポジトリをclone。

```bash
git clone https://github.com/hackmdio/docker-hackmd.git
cd docker-hackmd/
```

80番ポートで接続できるようにdockerホストの80ポートをコンテナの3000ポートにフォワード。

```yml:docker-compose.yml
  ~略~
  app:
    ports:
      # 3000を80に変更
      # - "3000:3000"
      - "80:3000"
  ~略~
```

docker-composeコマンドのエイリアスを作成する。

```bash
echo alias docker-compose="'"'docker run --rm \
     -v /var/run/docker.sock:/var/run/docker.sock \
     -v "$PWD:$PWD" \
     -w="$PWD" \
     docker/compose:1.24.0'"'" >> ~/.bashrc
```

反映。

```bash
$ source ~/.bashrc
```

docker-composeで起動。

```bash
$ docker-compose up -d
Starting docker-hackmd_database_1 ... done
Starting docker-hackmd_app_1      ... done
```

これで以下のURLにアクセスすればCodiMDのページが！

http://インスタンスの外部IP/
![スクリーンショット 2019-11-09 17.28.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35884/23001dee-0a92-7d93-dd4c-6a5616e43eb8.png)

### （番外編）ポートの穴あけ

あえてdocker-compose.ymlを編集せずに3000番ポートに穴をあけてみるパターンも試してみた。（試してみたかっただけ）

インスタンスの「ネットワーク詳細を表示」を選択。

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_35884_44cc243a-3922-f01a-9efe-e85519b71204.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35884/9da61f5a-683a-cd8e-ec1a-e64676d2f9d6.jpeg)


左のファイアウォールルールから「ファイアウォールルールを作成」を選択。

![スクリーンショット 2019-11-09 16.33.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35884/15287c9b-7895-2e33-bad1-2dac523f2527.png)

以下のように3000番ポートを許可するルールを作成する。

|項目|入力内容|
|---|---|
|名前|allow-3000|
|ターゲットタグ|allow3000-server|
|IP範囲|0.0.0.0/0|
|プロトコルとポート|tcp:3000|


![スクリーンショット 2019-11-09 16.37.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35884/ff3a1f34-14c7-7eb9-bbf9-d73e45d5706d.png)
![スクリーンショット 2019-11-09 16.37.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35884/a793a4da-6b8e-90a9-5faf-98651e484515.png)

GCEインスタンスに戻り、編集を選択する。

![スクリーンショット 2019-11-09 16.40.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35884/4f54bc62-0ec9-6a8e-8b31-7aef73ec5de0.png)

ネットワークタグに先程作成した「allow3000-server」を入力して保存。

![スクリーンショット 2019-11-09 16.40.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35884/b928e276-e0eb-89b2-77c7-b56f0d3f8829.png)

これでポートを指定すればCodiMDのページが表示される。

http://インスタンスの外部IP:3000/