一人もくもく会 α verでサービス開始しました。
請求書作成システム α verでサービス開始しました。

PhoenixでLet's EncryptによるSSL

前提

PhoenixでLet's Encryptにより無料でSSL対応を行う。

手順

基本的には

Phoenix/Elixir App Secured with Let’s Encrypt – Andrew Forward – Medium

で書かれている通り。

とりあえずサーバー起動。

MIX_ENV=prod mix phx.server

サーバーを起動したまま.well-knownフォルダを更新しなければならないのでそのための設定を行う。

まず.well-knownフォルダ以下をそのままアクセスできるようにするための設定。

lib/プロジェクト名/web/endpoint.ex にてPlug.Staticの設定に.well-knownを追加する。

plug Plug.Static,
 at: "/", from: :yourproject, gzip: false,
 only: ~w(css fonts images js favicon.ico robots.txt .well-known)

これで _build/prod/lib/プロジェクト名/priv/static/.well-known 以下がそのまま公開され、 http://yourdomain.com/.well-known/****.html のような感じでアクセスできるようになる。

ちなみに、設定を変更したらアプリケーションを再起動する必要があると思う。 また、再起動すると作っていた.well-knownは消えるので混乱しないよう注意。

うまくいったらあとはcertbotで証明書を発行する。

そして設定を更新。

config :yourproject, Yourproject.Web.Endpoint,
  http: [port: 80],
  https: [port: 443,
    url: [host: "yourdomain.com", port: 443],
    keyfile: "/etc/letsencrypt/live/yourdomain.com/privkey.pem",
    cacertfile: "/etc/letsencrypt/live/yourdomain.com/chain.pem",  
    certfile: "/etc/letsencrypt/live/yourdomain.com/cert.pem"],
  force_ssl: [hsts: true]

これで完了。更新などもそのまま普通にできるようになる。

Now your site is being served up only through SSL directly through Phoenix (no Nginx required).

と書かれているので別のWEBサーバーを使う冗長な方法もあったのだろうか。 とはいえ_build以下を使う方法なので今後のバージョンによってはできなくなる可能性などもあるのかもしれない。