Coder のセルフホスティング

# 目次

* [概要](#概要)
* [環境](#環境)
* [インストール](#インストール)
* [証明書発行手順と起動](#証明書発行手順と起動)
* [証明書更新手順](#証明書更新手順)

## 概要

[Coder](https://coder.com/) は オンライン版の `Visual Studio Code` である.
サーバー上にインストールをすることでクラウド開発環境を簡単に用意できる.
`Coder` は起動毎にパスワードを発行することでセキュリティを担保しているが, SSL 通信は自分で設定する必要がある.

`Docker` コンテナで稼働させる手もある. しかし, コンテナ内ではコンテナを使用できないため, 使い勝手が悪い.
使うなら適当な `VPS` あるいはインスタンスを借りてセルフホスティングすることをお勧めする.もっとも, 開発に `Docker` を使用しないのであれば有料ホスティングを使用することが一番手間がかからない.

ちなみに, 余談ではあるが 2019年5月6日に [Visual Studio Online](https://azure.microsoft.com/ja-jp/updates/visual-studio-online/) が発表されており Microsoft 自身が Visual Studio Code のクラウド対応を行うとのこと. Visual Studio Online の料金体系がどうなるかは分からないが [Cloud9](https://aws.amazon.com/jp/cloud9/) より使い勝手がはるかに良いため, Visual Studio Online が始まるまでの代替として有効な選択肢だと思う.

### Coder 公式ページ

* [Coder](https://coder.com/)
* [code-server](https://github.com/cdr/code-server)

## 環境

| OS             | VERSION    |
|:-------------- |:---------- |
| `Ubuntu Server`| `16.04 LTS`|

| パッケージ     | VERSION    |
|:-------------- |:---------- |
| `git`          | `2.7.4`    |
| `wget`         | `1.17.1`   |
| `unzip`        | `6.0.0`    |

## インストール

※ ディレクトリ等の構成は自分の環境に合わせて適宜読み替えること.

1. ディレクトリを作成する.
    * `mkdir ~/coder`
2. ディレクトリ移動する.
    * `cd ~/coder`
3. `Coder` のバイナリ版をダウンロードする.
    * `wget https://github.com/cdr/code-server/releases/download/1.1119-vsc1.33.1/code-server1.1119-vsc1.33.1-linux-x64.tar.gz`
4. 展開する.
    * `tar xvfz code-server1.1119-vsc1.33.1-linux-x64.tar.gz -C ~/coder`
5. バイナリを移動する.
    * `mv code-server1.1119-vsc1.33.1-linux-x64/code-server ~/coder`
6. 実行する.
    * `sudo ~/code-server <ワークスペース> -p <ポート番号>`
    * <ワークスペース>にはディレクトリパスを指定.
    * <ポート番号>にはサービスを稼働させるポート番号を指定.
    * デフォルトでは HTTPS で起動される.
    * 標準出力にパスワードが表示される.
7. ブラウザで `Coder` へアクセス.
    * `https://<IPアドレス>:<ポート番号>`
    * 証明書を設定していないためブラウザによっては開かない, あるいは警告が出る.
8. ログイン画面が出たらインストール成功.
9. 終了する場合は `ctl-c` で終了.

※ 起動するごとにパスワードは変わる.
※ 常駐させるよりは使用する時のみ起動するほうがセキュリティ的にも良いと思われる.

## 証明書発行手順と起動

※ ディレクトリ等の構成は自分の環境に合わせて適宜読み替えること.
※ ドメインの取得及び `DNS` の設定は行われているものとする.

1. `Certbot` をインストールする
    * `cd ~/`
    * `git clone https://github.com/certbot/certbot`
2. `80` ポートと `443` ポートを使用しているアプリケーションがあれば停止する.
    * バイナリ版の `Coder` はスタンドアロンで取得したほうが吉.
3. 証明書の発行.
    * `~/certbot/certbot-auto certonly --standalone -d <ドメイン名> -m <メールアドレス>`
    * 例：`~/certbot/certbot-auto certonly --standalone -d example.com -d www.example.com -m info@example.com`
    * ポートを使用しているアプリケーションを停止できない場合
        * `webroot` モードで取得する.
        * `~/certbot/certbot-auto certonly --webroot --webroot-path <ドキュメントルート> -d <ドメイン名> -m <メールアドレス>`
        * ドキュメントルートでは `80` 及び `443` で稼働しているサービスのドキュメントルートを指定する.
4. 証明書の発行を確認.
    * `sudo ls -l /etc/letsencrypt/live/`
    * `sudo ls -l /etc/letsencrypt/live/<ドメイン名>`
5. 証明書を指定して `Coder` を起動する.
    * `sudo ./coder/code-server --cert /etc/letsencrypt/live/<ドメイン名>/fullchain.pem --cert-key /etc/letsencrypt/live/<ドメイン名>/privkey.pem <ワークスペース> -p 443`
    * 例：`sudo ./coder/code-server --cert /etc/letsencrypt/live/example.com/fullchain.pem --cert-key /etc/letsencrypt/live/example.com/privkey.pem workspace -p 443`
6. ブラウザから `Coder` へアクセスして警告が出ないことを確認する
    * `https://<ドメイン名>`

### 起動コマンドの登録

1. `bash` に起動コマンドを登録する.
    * `vi ~/.profile`
    * `alias coder='sudo ~/coder/code-server --cert /etc/letsencrypt/live/<ドメイン名>/fullchain.pem --cert-key /etc/letsencrypt/live/<ドメイン名>/privkey.pem <ワークスペース> -p 443'` を追記して保存する.
2. プロファイルの読み込み.
    * `source .profile`
3. 以降は `coder` コマンドで `Coder` 起動できる.

## 証明書更新手順

`Let's Encrypt` は有効期限が 3 か月なので定期的な証明書更新が必要になる.

以下の手順で更新することが可能. `cron` に登録して自動化しても良いが本件では `Coder` は常に手動起動を想定しているため手動で更新する手順とする.

※ ディレクトリ等の構成は自分の環境に合わせて適宜読み替えること.

1. `Coder` を終了する.
    * `Coder` を起動させているターミナルで `Ctl-c`
2. ( スタンドアロンで証明書を取得している場合 ) `80` ポートと `443` ポートを使用しているアプリケーションがあれば終了する.
3. 更新コマンドの実行.
    * `~/certbot/certbot-auto renew`
    * `Cert not yet due for renewal` と表示された場合は更新の必要なし.