⛏️

Vultrでdokkuが動くサーバを作り、HTTPS, ドメイン当て, Dockerfileを使ったデプロイまで備忘録

2020/10/27に公開

自己紹介と背景

はじめまして。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>/

にアクセスしてこんな感じの画面が出れば終了

参考

注釈

脚注
  1. How to Get Started with Dokku Ubuntu - UpCloudを見た感じRAM1GBで良さそうなので最小構成にしています。 ↩︎

Discussion