VPSにdokku入れてできるだけ楽にデプロイ

どうも、しゅーいっちです。

## why
- かなり昔にsinatraで作った地味サービスをそろそろをSSL化したい
- メンテされてない dokku-alt やめて [dokku](http://dokku.viewdocs.io/dokku/) に切り替えたい。（そもそも dokku がメンテされてなくて dokku-alt が生まれたのに本家が復活してた）
- なんかSSHの設定おかしくなってpushできなくなった（けど現行サーバであれこれやるのめんどくさい）
- 眠っているVPSがあった。

## dokku
https://github.com/dokku/dokku/

> Docker powered mini-Heroku. The smallest PaaS implementation you've ever seen.

- これを自前のサーバに入れると、Herokuみたいな `git push` でデプロイできる仕組みを自前で構築できる。

- さらに[dokku letsencrypt(beta)](https://github.com/dokku/dokku-letsencrypt)というのもあってSSL化も簡単そう。


## さあ始めよう

### サーバ基本設定

さくらVPSです。Ubuntu 18.04

こちらを参考にさせていただきました。
https://loumo.jp/wp/archive/20190302120011/

80, 443 の portを開ける。

`$ sudo ufw allow http`
`$ sudo ufw allow https`

（↑ これやってなくて、いろいろ遠回りしました）

確認

```
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
443/tcp                    ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)             
443/tcp (v6)               ALLOW       Anywhere (v6) 
```

### dokku 入れる

officialの仰せの通りに。

https://github.com/dokku/dokku/#installation

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

dockerが入ったりします。時間がかかるということで途中で星空を眺めます。

```
This is going to take a long time
.....................................................................
............+...............................................+........
................+....................................................
.....................................................................
.....................................................................
.....................................................................
+..+.................................................................
...............................................+.....................
.....................................................................
.....................................................................
.....................................................................
...........................+.......+...............................+.
.........+.................................+.........................
...........+..............................+..........................
```

入りました。

```
$ dokku -v
dokku version 0.19.11
```

### dokku 設定

（このまま現行ドメインのDNS変えるとサービス表示されなくなることに気づき別に検証用ドメインを取得💰）

ドメインがすでにサーバーIPに向いた状態です。

`http://ドメイン` にアクセスしたら表示される設定画面で設定を完了させる。
- Public SSH Keys
- Hostname

あとからSSH keyの設定する時は
`dokku ssh-keys` コマンド使う
http://dokku.viewdocs.io/dokku~v0.7.1/deployment/user-management/#adding-deploy-users

あとから、ドメイン関連の設定する時は
`dokku domains` コマンド使う
https://github.com/dokku/dokku/blob/master/docs/configuration/domains.md

### sample app を push してみる

これそのままやった
http://dokku.viewdocs.io/dokku/deployment/application-deployment/

http://ruby-getting-started.dracarysme.com で表示された。（ドラカリス！🔥）
↑
削除済み

### 自分の app を push

rubyのバージョン古過ぎてコケるぽいのでスキップ。

```
! An error occurred while installing ruby-2.1.0
! Heroku recommends you use the latest supported Ruby version listed here:
! https://devcenter.heroku.com/articles/ruby-support#supported-runtimes
```

### sample app を SSL化

[dokku-letsencrypt (Beta)](https://github.com/dokku/dokku-letsencrypt)

officialの仰せのままに

```
# dokku 0.5+
$ sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
```

メアド設定して実行

```
$ dokku config:set --no-restart ruby-getting-started DOKKU_LETSENCRYPT_EMAIL=メアド
$ dokku letsencrypt ruby-getting-started
```

リダイレクトもきちんとされつつ、あっさりとSSL化
https://ruby-getting-started.dracarysme.com 🧖‍♀️🐲🔥🌚
↑
削除済み

## 作りかけの nuxt app を push してみる

officialの仰せのままに設定
https://nuxtjs.org/faq/dokku-deployment/

できた。

## 感想

### よかったこと
- DNSやnginxの設定することなしに、アプリごとに勝手にサブドメイン増えてくのが楽しい
- nuxt app を firebase に上げると SSRのためのfunctionsが必要だけど、dokkuだと不要ぽい。

### イマイチだったこと
- やはりサーバ基本設定がめんどくさい
- mini-Herokuと言ってはいるが、[ドキュメント量](http://dokku.viewdocs.io/dokku/getting-started/installation/)見るとあまりmini感を感じられない。

---

追記

## myapp を deploy

rubyのバージョンを上げてデプロしました。

letsencryptでSSL化する時にドメイン設定でハマりました。

症状: 証明書は入ってきてるし、https にリダイレクトもされるが、ブラウザでアクセスするとSSLが有効になっていない（安全でないサイトのお知らせが出る）。

原因: アプリはサブドメイン運用なのですが、デプロイの過程でなぜかルートドメインもvhostsに追加されていたのが原因でした。

```
$ dokku domains:report
       Domains app enabled:           true                     
       Domains app vhosts:            example.com sub.example.com     
       Domains global enabled:        false                    
       Domains global vhosts:                                  
```

`$ dokku domains:remove <app name> <削除したいURL>`

```
$ dokku domains:report
       Domains app enabled:           true                     
       Domains app vhosts:            sub.example.com     
       Domains global enabled
```

その後、 `dokku certs:remove <app name>` で一旦証明書を削除して、再度取得したらいけた。

proxy portの設定とかいろいろ触ったけど関係なかった。最終的にデフォルトのこの状態。

```
$ dokku proxy:ports <app name>
-----> scheme             host port                 container port                                     
http                      80                        5000                                               
https                     443                       5000 
```

あとは、analyticsのプロパティURL変更して、google seach consoleのプロパティ作り直して、関連付けし直してSSL化完了。

[日付の計算 カレンダータ: https://calcal.helloqapp.com](https://calcal.helloqapp.com)

### 証明書の自動更新設定

`dokku letsencrypt:cron-job --add`

要確認。

### dokku で静的サイトを deploy

空の `.static` を作って push するだけ。

```
.static
index.html
```

### ドメインルートに deploy

`git remote add` 時に `:` の後にドメインルートを入れる。

`git remote add dokku dokku@dokku.me:dokku.me`