Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新(準備中)

Jan 16, 2021 - コメント - 日記

1つのサーバにたくさんのWebサービスを詰め込む方法

個人的な実験用にDigitalOcean でサーバを借りています。せっかくなので一台のサーバにいろんなソフトウェアをインストールして有効活用したいので以下のような仕組みを考案しました。

構成

traefik というリバースプロキシを使って、リクエストされたURLに応じてサービスのDockerコンテナに振り分けます。さらに、オレオレ証明書ではなく、Let’sEncryptで証明書を無料で取得してSSLも実現します。

以下説明のためのプロジェクトをgithubにあげてあるので取得してください。

$ git clone https://github.com/tumf/traefik-webrouter

Cloudflare DNS

Cloudflare のDNSは無料で使える上に、UIも使いやすいのでおすすめです。ドメインレジストラの設定で、CloudflareにDNSを移管します。LetsEncrypt の証明書発行時にCloudFlareのAPIキーが必要ですので発行をしておきます。 Cloudflareのダッシュボードの右下にGet your API token と言うリンクがありますのでここから

CF Dashboard link

APIキーのパミッションを設定できるので、ZONE.DNS EDITを設定します。

Configure CF Permission

発行したAPIキーは、.envの中に書いておきます。

CLOUDFLARE_DNS_API_TOKEN=トークンをここにペースト

traefikの設定

traefik.yml内部のemailを修正します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
providers:
  docker: {}

log:
  level: INFO

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
          permanent: true
  websecure:
    address: ":443"

certificatesResolvers:
  dnsresolver:
    acme:
      email: your@example.com
      storage: /data/acme.json
      dnsChallenge:
        provider: cloudflare

ネットワークの作成

Dockern内部でtraefikからコンテナへリクエストを振り分けるネットワークをfrontという名前で作成します。

$ docker create network front

traefikの起動

以下のようにしてtraefikを起動します。

$ docker-compose up -d

サービスを追加する

ここまで出来たらあとはメモリの上限までサービスを増やせます。例としてwhoamiと言うサービスを作ってみます。https://whoami.example.comにアクセスすることでwhoamiを返答します。

traefikは各コンテナに振られているlabelをみてルーティングを決定します。サービスを増やすにあたって、traefikの設定を変えたり、再起動する必要がありません。便利でしょ?!