PCが重いのでクラウド上に開発環境を構築してみた

# tl;dr
1. VPS 上の docker-compose を利用して OSS の Web IDE(c9 core) を導入した。
2. ローカル環境の CPU の負荷は軽くなった（体感）。
3. ローカル環境の メモリ の負荷が高くなった（体感）。

# 実行環境
#### ローカル環境
- Model: **MacBook Air(11-inch, Early 2014)**
- CPU: **1.4 GHz Intel Core i5**
- Mem: **4 Gb 1600 MHz DDR3**
- OS: **macOS Mojave ver10.14**

#### クラウド環境
- Model: **さくらのVPS**
- CPU: **3コア**
- Mem: **2G**
- OS: **CentOS 7.5**

# 経緯
どうやら都会ではDockerやらコンテナやらが流行っていると聞く。
早速、試してみようと思ったが、私の MacBook Air が悲鳴を上げ始めた。

# 導入手順
## クラウド環境入手
今回はさくらのVPSを利用しております。

他にも選択肢はあると思いますので、それぞれの状況に合わせてご検討ください。

## クラウド環境へアクセス
SSHでVPSにログインする。

```bash
[user@local_env] ssh root@0.0.0.0
```

※ご自身の環境に合わせてIPアドレスを変更してください。

## docker-composeのインストール
さくらのVPSの場合はパブリックスクリプトを利用して導入可能です。

OS毎にインストール方法の誤差があるかと思いますので、それぞれの環境に合わせてインストールを行ってください。

今回は本題から逸れるため他の方にお任せいたします。

```bash
[root@cloud_env] docker-compose -v
docker-compose version 1.14.0, build xxxxxx
```

## Cloud9 Coreの導入
Cloud9 とは Web 上で実行できる開発環境になります。
本来はサービスに登録して、利用する必要があるのですが、
今回利用している Cloud9 CoreはIDE部分のみをOSSとして提供されているものになります。

```bash
# yumのアップデート
[root@cloud_env] yum update -y

# gitのインストール
[root@cloud_env] yum install -y git

# gitリポジトリからソースをcloneする
[root@cloud_env] git clone git://github.com/c9/core.git c9sdk
[root@cloud_env] cd c9sdk

# インストールのためのスクリプトを実行する
[root@cloud_env] scripts/install-sdk.sh
```

なんか失敗する

```bash
Error: please install make to proceed
To do so, log into your machine and type 'yum groupinstall -y development'
Error: please install gcc to proceed
To do so, log into your machine and type 'yum groupinstall -y development'
Error: please install glibc-static to proceed
To do so, log into your machine and type 'yum install glibc-static'
```

言われた通りにインストールする

```bash
[root@cloud_env] yum groupinstall -y development
[root@cloud_env] yum install -y glibc-static

# 再度インストールを試みる
[root@cloud_env] scripts/install-sdk.sh
```

無事インストールに成功するはず

次にアプリケーションを起動する

```bash
# server.js を実行する
[root@cloud_env] node server.js
-bash: node: command not found
```

なんでや。。。と思いつつ node をインストール

```bash
# 8系をインストールしたかったので下記手順を実行する
# nvm とか使いたい場合は別途実行する必要があります
[root@cloud_env] curl -sL https://rpm.nodesource.com/setup_8.x | bash -
[root@cloud_env] yum install -y nodejs
[root@cloud_env] node -v
v8.12.0

# 再度server.js を実行する
[root@cloud_env] node server.js
```

ここで動けば問題無し
しかし、docker上で動いているのでアクセスはできないはず

以下、手作業に疲れてきたのでDockerfileとdocker-compose.ymlを作成して実施します。

#### Dockerfile

```dockerfile
FROM centos:latest

ENV APP_ROOT /var

WORKDIR $APP_ROOT

RUN yum update -y

RUN curl -sL https://rpm.nodesource.com/setup_8.x | bash -
RUN yum install -y nodejs

RUN yum install -y git
RUN git clone git://github.com/c9/core.git c9sdk

WORKDIR $APP_ROOT/c9sdk

RUN yum groupinstall -y development
RUN yum install -y glibc-static

RUN scripts/install-sdk.sh
```

#### docker-compose.yml

```yml
version: '3'

services:
  c9core:
    build: ${PWD}
    image: docker/c9:1.0.0
    container_name: c9core
    restart: always
    volumes:
      - /local_workspace:/cloud_workspace
    ports:
      - 8080:8080
    command: /bin/bash -c "node server.js --listen 0.0.0.0 -p 8080 -w /cloud_workspace -a USER:PASSWORD"
    tty: true
    privileged: true
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
```

以下、ご自身の環境に合わせて変更してください。

```bash
# ワークスペースの指定
-w クラウド上のワークスペース

# 認証情報の指定
# basic認証が必要なため
-a ユーザ名:パスワード

# IPアドレスとポートはそれぞれ指定
# 指定無しの場合はlocalhost:8080
--listen 0.0.0.0 -p 8080
```

docker-compose実行

```
ディレクトリ構成は以下を想定
root
  └ Dockerfile
  └ docker-compose.yml
```
```bash
[root@cloud_env] docker-compose build
[root@cloud_env] docker-compose up -d
```

指定したアドレスとポートにアクセスする
http://0.0.0.0:8080

たぶんできてる

#### 追記(2018/10/10)

ポートの開放をお忘れなきよう

```bash
# 開放されているポート確認
[root@cloud_env] firewall-cmd --list-ports --zone=public

# 利用したいポートの開放
[root@cloud_env] firewall-cmd --add-port=8080/tcp --zone=public --permanent

# リロード
[root@cloud_env] firewall-cmd --reload
```

# 参考
https://github.com/c9/core
https://monopro.org/?p=338