Heroku互換アプリをVPS上のDokku環境へデプロイする

# はじめに

[個人開発ならHerokuよりDokkuを使おう](https://qiita.com/gn_spawn/items/712349b5b0ebaf4b0203)の記事に感化され、自作サービスをDokkuへデプロイし開発・運用していま~~す~~した。Dokkuを動かすサーバにはさくらのVPSを利用しました。

本記事ではアプリケーションをDokku環境へデプロイするまでの手順を記載します。

# 利用したサービス・技術

* さくらのVPSを利用
* Dokkuのサブドメイン機能を活用するため、お名前.comでドメインを購入

# 手順

## VPSを立てる

Dokkuを動かすためのVPSをたてます

筆者は[さくらのVPS](https://vps.sakura.ad.jp/)を利用しました。

サーバを立てたら[こちら](https://help.sakura.ad.jp/hc/ja/articles/206208181)などを参考にしてサーバの初期設定をします。

### VPS設定の【注意点】
Dokkuを利用するため以下の注意点があります。

#### 1. DokkuはUbuntuでないと動かない(CentOSはNG)

[こちら](https://github.com/dokku/dokku#requirements)の公式リファレンスにあるように、現時点(2018年3月時点)ではUbuntu16.04またはUbuntu14.04のDebian系のみのサポートです。CentOS6はサポートなし、CentOS7はexperimental版がありますが、安定せずドキュメントもほぼ無い状況です。

私はこれを把握せずCentOS6でスタートしてしまいUbuntuを入れ直しました。。。


#### 2. デフォルトではiptablesにてHTTPが閉じられているので開ける必要がある

さくらのVPSのUbuntuではiptablesのデフォルト設定は以下のようになっており、HTTPなどは閉じられているので開いてあげる必要があります。

```/etc/iptables/iptables.rules
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
```

開き方は[こちら](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04)などを参考にしてください。

## 独自ドメインをさくらのVPSに紐付ける

Dokkuのサブドメイン自動生成の機能を有効活用するため[お名前.com](https://www.onamae.com/)で購入したドメインをさくらのVPSに紐付けます。

### さくらのVPSでのドメイン設定

さくらのVPSコンソール画面の「ネームサーバ登録」タブからネームサーバ設定画面を開き、下記画像のように独自ドメインにて"*"エントリと"@"エントリをAレコードで登録します。

<img width="739" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/91562/df526659-6d8e-511d-9f91-7dbc712c70b7.png">


### お名前.comでの設定

さくらのVPSの「ネームサーバ登録」に記載のDNSサーバのドメインを、お名前.comの対象独自ドメインの「ネームサーバの変更」画面にて下記画像のように設定します。

![screenshot2.png](https://qiita-image-store.s3.amazonaws.com/0/91562/61696a92-a5fa-da85-ff91-ab21568305ee.png)

以上の設定でVPSはDokkuが自動生成するサブドメインへのリクエストを受け入れるようになりました。

## Dokkuをインストール&セットアップ

### Dokkuをインストール

DokkuをさくらのVPSへインストールします。

[Dokkuの公式ページ](http://dokku.viewdocs.io/dokku/#install-curl)に従い以下のコマンドでインストール

```
$ wget https://raw.githubusercontent.com/dokku/dokku/v0.11.6/bootstrap.sh
$ sudo DOKKU_TAG=v0.11.6 bash bootstrap.sh
```

### DokkuへSSHキー設定

インストールが完了したらDokkuへデプロイするためのSSHキー設定をします。

VPSのドメイントップへアクセスすると下記画像のようなDokkuの設定ページが表示されます。

![スクリーンショット_2018-02-18_23_19_06.jpg](https://qiita-image-store.s3.amazonaws.com/0/91562/d0fc62fa-2c53-5e56-55a2-7da6f88e43f7.jpeg)

Public Keyの設定は[gitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)などの記事と同じ要領で設定します。

Hostnameには上記にて設定した独自ドメイン名を入力し、今回はDokkuのサブドメイン機能を利用したいので"Use virtualhost naming for apps"にチェックをつけます。

また、これらの設定はサーバ上にてDokkuインストール時に作成される`/home/dokku/.ssh`パス内で確認・再設定ができます。

## アプリをDokkuへデプロイ

Dokkuへアプリをデプロイします。

本記事では例としてアプリ名をmyappとします。

### Dokkuにてデプロイ用アプリを生成

VPSでdokkuコマンドにてこれからデプロイするアプリをDokku上に作成します。

```
# dokku apps:create myapp
```

### ローカルマシンからデプロイ

DokkuはHeroku互換なので[こちら](https://github.com/momotaro98/yarana-bot/blob/master/Procfile)のようなProcfileファイルをアプリのルートディレクトリへ用意します。

アプリのルートディレクトリからDokkuへデプロイします。

```
$ cd myapp
$ git remote add dokku dokku@your-root-domain.com:myapp
$ git push dokku master
```

以下のように終了すればデプロイ成功です！アプリが動作するか確認しましょう。

```
=====> Application deployed:
       http://myapp.your-root-domain.com
```


# 補足

筆者はGo言語の[LINE Message API](https://developers.line.biz/ja/services/messaging-api/)のSDKを利用してBotアプリ用APIを作成しそれをDukkuへデプロイしました。

以下はそれに関した補足内容です。

## アプリをHTTPS化

Line BotのMessage APIを利用するためにはアプリケーションをHTTPS化をする必要があります。

Dokkuには非常に容易にHTTPS化する[dokku-letsencrypt](https://github.com/dokku/dokku-letsencrypt)というプラグインがあります。

[Usage](https://github.com/dokku/dokku-letsencrypt#usage)にあるようにたった2コマンドでアプリをHTTPS化できるのでとても便利です。

## Go言語製アプリをDokku(Heroku)へデプロイするには`/vender`ディレクトリもgitに含めないといけない

サードパーティを利用したGo言語製のアプリをDokku(Heroku)へデプロイするためには[dep](https://github.com/golang/dep)などの依存管理ツールを利用する必要があります。

このとき作成される`/vender`ディレクトリはgitに含めないとデプロイできません。筆者は.gitignoreファイルへ`/vender`ディレクトリを含めてしまっていたので失敗してしまいました。

[こちら](http://nirasan.hatenablog.com/entry/2016/07/29/184454)の記事に助けられました。


# おわりに

アプリケーションをDokkuへデプロイするまでの手順をVPS設定まで含めて記載しました。

Dokkuでの環境変数設定やログ取得などは本記事では触れていないので別記事を作成し紹介できればと思います。

# 参考

* https://qiita.com/gn_spawn/items/712349b5b0ebaf4b0203
* https://help.sakura.ad.jp/hc/ja/articles/206208181
* http://dokku.viewdocs.io/dokku/getting-started/installation/
* https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04
* http://nirasan.hatenablog.com/entry/2016/07/29/184454