はやし雑記

はやしです

vibe.d(D言語製WAF)でWeb開発、DockerでAWSへデプロイ

はじめに

皆さん、vibe.dはご存知でしょうか。そもそもD言語はご存知でしょうか。

D言語 - Wikipedia

C++erがD言語を使ってみて感激した機能 - Qiita

型推論GC、テンプレートやコンパイル時関数実行などもでできて、モダンでCoolな言語仕様の言語です。 個人的には、若干Swiftに似ているかなぁ(D言語がSwiftに似ているのでは無く、SwiftがD言語に似ているのだが)という感じがあります。

残念なことに、D言語はまだユーザーが少なく、Googleにも"dlang"で検索すると"もしかして golang"と煽られる始末で、まだまだライブラリやフレームワークは発展途上です。 そんな数少ないD言語製のWeb Application Frameworkの中で、vibe.dは最も成熟したものだと思います。

vibed.org

先日Pythonで運用していたhayashikun.comのさくらVPSの契約が切れ、もう運用してないWebサービス等もあったので一新しようと思い、vibe.dで実装、dockerでAWSにデプロイしたので、備忘録を残します。

件のhayashikun.comは、以下のリポジトリで公開しております。

GitHub - hayashikun/hayashikun.com

2018年4月22日 追記: 中身もなんもないカスサイトの維持に3000円強/月かかってるのでgithub pagesに移行した

D言語開発環境セットアップ

この記事を読んでD言語開発を始めてくれる人が1人でも増えれば非常に嬉しいので、D言語の開発環境セットアップについても書いておきます。 D言語コンパイラは主に3種類(DMD, GDC, LDC)ありますが、DMDが最もフォーマルで(おそらく)一般的なので、DMDを使う前提で進めていきます。

Compilers - D Wiki

インストールは、以下の通りです。めちゃくちゃ簡単です。

Install D locally - Dlang Tour

IDEについては、EclipseDDTなどありますが、上手く動かない事があったので、最近は専らVS Codeで開発をしています。

qiita.com

この拡張機能が最もインストール数も多く、使いやすいかと思います。

D Programming Language (code-d) - Visual Studio Marketplace

vibe.dことはじめ

以下のドキュメントを見れば一目瞭然かと思います。 Documentation - vibe.d

今回はNginxでリバースプロキシをする都合上、portは8080で、0.0.0.0にバインドします。

vibe.d/server.d at master · vibe-d/vibe.d · GitHub

Routingは1つのファイルにまとめてしまっても良いですが、今後もっと増えるかもしれないので別moduleに切り分けています。

module hayashikun.app;
import vibe.vibe;

void main()
{
    import hayashikun.router;
    auto settings = new HTTPServerSettings;
    settings.port = 8080;
    listenHTTP(settings, getRouter());

    runApplication();
}
module hayashikun.router;

import hayashikun.controller;
import vibe.d;

URLRouter getRouter()
{
    auto router = new URLRouter();
    router.get("/", &index);
    router.get("*", serveStaticFiles("./public/"));
    return router;
}

所謂Controllerは、今回はViewをレンダリングするだけなのでこれだけです。

module hayashikun.controller.index;

import vibe.d;

void index(HTTPServerRequest req, HTTPServerResponse res)
{
    res.render!("index.dt", req);
}

まぁ正直GitHubPagesでも良いじゃんって感じですが、はい、はい……

Viewはdietというvibe.dに同梱されたテンプレートエンジンを使います。 継承が使えるので、layout.dtでレイアウトを持ち、index.dtでindexのhtmlを書いています。 RubyでいうところのSlimに似た感じですね。

hayashikun.com/views at master · hayashikun/hayashikun.com · GitHub

このdietの何が素晴らしいって、テンプレートの中にロジックが少し書けるのと、コンパイル時に構文チェック等をしてくれるんですよね。 なので、もしtypoとかがあってもコンパイル時にわかります、サイコー

deploy

これまでの内容はオマケです、読む必要ありません。 ここから備忘録です。

deployはEC2にしました。ECSでDockerを管理しようかとも思ったんですが、面倒だったのでEC2のインスタンス上にDockerをインストールして動かすという感じでしました。

インスタンスは貧困大学院生なのでt2.microです。

$ sudo -s
# fallocate -l 1024m /tmp/swap.img
# mkswap /tmp/swap.img
# chmod 600 /tmp/swap.img
# swapon /tmp/swap.img
# exit
$ sudo yum update -y
$ sudo yum install -y docker git
$ sudo service docker start
$ sudo usermod -a -G docker ec2-user
$ git clone https://github.com/hayashikun/hayashikun.com.git
$ cd hayashikun.com/
$ sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose up

これでいけます(とりあえずは)

最初にsudo -sしてから諸々やっているのは、t2.microだとこうしてスワップを作っておかないとdocker-composeしてる途中にメモリ不足で死ぬからです。

もろもろ手抜きしてやってますが、vibe.dはサイコーです。

記事書いてる途中でめんどくさくなっていろいろすっ飛ばしましたが、まぁ、うん、アレです!