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


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

why

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

dokku

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

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

  • さらにdokku letsencrypt(beta)というのもあって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の仰せの通りに。

$ 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)

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と言ってはいるが、ドキュメント量見るとあまり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

証明書の自動更新設定

dokku letsencrypt:cron-job --add

要確認。

dokku で静的サイトを deploy

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

.static
index.html

ドメインルートに deploy

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

git remote add dokku [email protected]:dokku.me