Haskellで自分のWebページをリニューアルした
二週間前からHaskellにハマっており、当初は会社のあるサンプルコードをHaskellに書いてみようと思ったのがサーバーのスペックなど考えて諦めて自分のWebページをリニューアルに至ったところです。
以下HaskellでWebページの開発、公開まで書いてみようと思います。 Webページ \= Webシステム
開発環境はMac OSXでのDocker for Macです。haskell, dockerのインストールなど省略させてください。
HaskellでWeb開発?
正気なの?と思う方もいるかと思います、意外とその辺のWebフレームワークは存在してました。
Haskell Web Framework
- Yesod (https://www.yesodweb.com/)
- Scotty (https://github.com/scotty-web/scotty)
- Miso (https://github.com/dmjio/miso)
- Servant (https://www.servant.dev/)
今回はScottyを使うことにしました。Yesodと違ってScottyはWeb API向け軽量フレームワークでhtmlのレンダリングにはまた別のものを用意しなければなりませんでした。レンダリングエンジンもいろいろあるみたいですが、今回はblaze-htmlを使うことにしました。
デプロイサーバー
もともと自分のWebページはgoogle appengineの無料枠で動かしてました。今回もdockerでappengineでなんとかしようとしてみました。具体的にはgoogle container registryにimageをpushしてappengineからそれをデプロイする方法です。無料枠だとデプロイはやっと成功するが、ページにアクセスするとエラーが出ました。(「サーバーが一時的に停止、30秒後にもう一回試してみろ」のエラーだけどあてにならない)
次は自分が持ってるvultr vpsでdocker-composeでなんとか動かせないかと。既にサーバーに別のものが動いていて残りメモリは700MBぐらいでした。そこでdocker-compose up (stack build) したらsshが反応しなくなり、ほかのdocker containerも不正終了されました。
諦めようかと思ったが、最後にherokuで試してみようと思いました。調べてみたら、heroku container registryこいつが非常に優秀てgoogle container registryより使い勝手が良かったです。
$ heroku container:push web
$ heroku container:release web
この2つのコマンドでデプロイ、リリースが完了です!
herokuのプロセススリープ
herokuの無料dynoでは一定時間アクセスがないとプロセスを殺して、再びアクセス来る時にプロセスを起動するので、最初の表示に非常に時間かかります。そこはheroku schedulerを使って10分おきにcurlコマンドでサイト起こしてあげることにしました。
https化
herokuではカスタムドメインの設定できますが、httpsにするには有料プランのdynoを買わないと駄目ぽいです。そこはcloudflareを使うことにしました。 ネームサーバー変更して数時間待てば反映されます。しかもroot domainもサポートしていてwwwも消すことができます。
感想
これで完全無料でHaskellでWebページ公開できました。
詳細はGitHubのRepo見ればわかるかと思います。