Vultrでdokkuが動くサーバを作り、HTTPS, ドメイン当て, Dockerfileを使ったデプロイまで備忘録
自己紹介と背景
はじめまして。reudと申します。情報系の大学生です。
趣味で自分が欲しいなと思うWebアプリを作っています。
趣味の一環でTwitterのツイートでツイートしてから一定期間経ったものを自動で削除するツールを開発しているのですが、どこで稼働させるかについて迷いました。
要望はこの通り
- 楽に動かしたい
- 24h稼働で出来るだけ安く動かしたい
この記事を見ている人はHerokuが該当しそうだなと思ったかもしれません。
僕もそう思っていたのですが、「Twitterのツイートでツイートしてから一定期間経ったものを自動で削除するツール」を作成するに当たって、Twitterのアクセストークンの扱いを考えると、Herokuでは困ることがあります。
それがDynoの問題でざっくり言うと、アプリケーションが一日に一回以上再起動されてしまいます。
Heroku なら、アプリを実行している dyno(コンテナ)の動作を気にする必要がありません。dyno はプラットフォームによって自動的に管理されているからです。各 dyno は他の dyno から隔離された仮想ランタイム環境とファイルシステムから構成されています。dyno は永続的なものではなく、アプリとシステム全体の健全性を維持するため 1 日に 1 回以上再起動されます(再起動の時点で残っているリクエストは、問題なく処理されます)。複数の dyno を実行するアプリの場合、各 dyno は異なる間隔で再起動されます。
引用: Heroku Dynos - ライフサイクル | Heroku
となると、Twitterのアクセストークンをメモリ以外のどこかに安全に保管する必要があります。
Twitterのアクセストークンが漏れでもした場合、(権限によりますが、)他の悪意アプリケーションにもそのアクセストークンが利用出来てしまうため、本当にやりたい放題出来てしまうのでこれだけは避けなければなりません。
正直、アクセストークンをDBに保存するのも微妙なのでなんとかしてDynoが再起動しない様な方法を探っていた所、dokku/dokku: A docker-powered PaaS that helps you build and manage the lifecycle of applications を見つけました。
Dockerを利用したミニHerokuみたいなものでHerokuと同じ様な手順でアプリケーションを展開出来るのでこれに乗ろうかと思います。
自前でサーバを建てる必要はありますが、建ててしまえばHerokuアプリケーション建て放題と考えれば良いでしょうか。
環境
今回は以下の環境で説明します。
VPS サービス: Vultr
↑からサインアップすると僕に$10入ります。
サーバー: Cloud Compute, Tokyo, Ubuntu 20.04, 25GB SSD $5/mo [1]
ドメイン: Google Domain
どう操作すればサーバを作れるかは省略します。
※ 2020/10/27 Ubuntu 20.10にするとインストールスクリプトが終わらなくなります(1敗)
サーバの準備
パッケージ更新
apt update
apt upgrade
その他もろもろセットアップ
Vultrがキレイにまとまっている記事を出しているのでそちらをご確認ください。
Initial Secure Server Configuration of Ubuntu 18.04 - Vultr.com
(ufwを設定している場合)ポートの許可
HTTPSを利用するため、443,80ポートを開けます。
sudo ufw allow 443
sudo ufw allow 80
sudo ufw enable
Vultr側でFWの設定
とりあえずこんな感じに
dokkuを入れる、セットアップをする。
ここから本題です。
スクリプトを走らせる
dokku/dokku: A docker-powered PaaS that helps you build and manage the lifecycle of applications
にかかれている通りに。
↓のコマンドが変わっているかもしれないので上記記事Installetionの内容が同じか確認してください。
wget https://raw.githubusercontent.com/dokku/dokku/v0.21.4/bootstrap.sh
sudo DOKKU_TAG=v0.21.4 bash bootstrap.sh
僕と同じ構成でこのスクリプトを動かすと結構時間がかかりますので記事でも書いて待ちましょう。
※ Ensuring we have the proper dependenciesで止まる
一回これ経験しました。僕の場合はdokkuに対応していないUbuntu 20.10でスクリプトを走らせたのが原因でした。 参考になれば。
Setup
ブラウザでhttp:://<サーバのIP> にアクセスします。。
Use virtualhost naming for apps
にCheckを入れてからセットアップを完了させてください。
ドメインを当てる
Vultr
再度メニュー ⇛ Product ⇛ DNS から当てます。
AレコードにdokkuのIP, CNAME,MXレコードに自分のドメインを当てます。(Add Domainの画面でDomain: 自分のドメイン Default IP Address: <dokkuのサーバのIP> ってやれば最初からそうなってる・・・はず。)
Google Domains
サイドメニューからDNSを選んでカスタムネームサーバを利用するに変更して、vultrのネームサーバを設定します。
Introduction to Vultr DNS - Vultr.com
ここに
Vultr's nameservers are ns1.vultr.com and ns2.vultr.com.
と書かれているのでそのように設定します。
Dokku
Dokkuの動くサーバに入り
dokku domains:set-global <domain>
以上です。
HTTPSにする。
簡単に出来る plugin があるので使いましょう
dokku/dokku-letsencrypt: Automatic Let's Encrypt TLS Certificate installation for dokku
sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
でインストール完了します。
アプリごとに証明書のメアドを変えたいとかなければ、globalにlets encrypt用のメアドを設定します。
dokku config:set --global DOKKU_LETSENCRYPT_EMAIL=your@email.tld
動かしてみる
一旦動かしてみましょう。dokkuの動くサーバ上でアプリを作成します。
テスト用に
Einsteinish/docker-nginx-hello-world: SIngle page docker nginx
こちらのリポジトリを使わせて頂きます。
事前にdokkuのサーバでアプリケーションを作成しておきます。
dokku apps:create hello-world-from-dockerfile
参考までに、2020/10/27時点で利用するコミットIDは55c61f51f63553fe3e5b14947dcbe3de7317ae3e
です。
ローカルPCでクローンしてdokkuをremoteに追加します。
git clone https://github.com/Einsteinish/docker-nginx-hello-world.git
git remote add dokku dokku@<dokkuサーバのIP>:hello-world-from-dockerfile
追加したら早速push
git push dokku
dokku サーバにサイド入り証明書の設定をします。
dokku letsencrypt hello-world-from-dockerfile
https://hello-world-from-dockerfile.<domain>/
にアクセスしてこんな感じの画面が出れば終了
参考
- Heroku Dynos - ライフサイクル | Heroku
- 【Docker入門】DockerfileでHello World! - Qiita
- Dokku - The smallest PaaS implementation you've ever seen
- 海外仮想ホスティング(VPS)Vultrでドメインを追加する - その他
- Dokku - The smallest PaaS implementation you've ever seen
注釈
-
How to Get Started with Dokku Ubuntu - UpCloudを見た感じRAM1GBで良さそうなので最小構成にしています。 ↩︎
Discussion