
irucaを支える技術
テンマドで運営している在席管理サービス「iruca」の話。
大仰なタイトルになってしまったけれど、2018年11月時点でどんな感じで動いているのか、書いておこうと思う。ちょうどNode.jsのバージョンを10系に上げたところなので(Herokuでのデフォルトが10系になったので)。
インフラ
- Heroku
- PostgreSQL(Heroku Postgres)
- Redis(Redis Cloud)
- Papertrail
- SendGrid
- CircleCI
テーマは省力化。conasuで扱い慣れていたこともあり、Herokuで構築した。なのでHerokuで扱いやすいPostgreSQLを選び、セッションストレージと一部コンテンツのキャッシュにRedisを利用している。Heroku Redisを使っていないのは、無料で使える枠がRedis Cloudの方が大きかったから、という記憶。ログの集約とSlackへの通知にPapertrailを、すこしだけ存在するメール配信にはSendGridを利用している。
CircleCIは以前はデプロイにまで使っていたが、CircleCI v2で公式のHerokuデプロイ機能がなくなったため、現在はテスト用途にのみ利用。orbが使えるようになったので、この辺また変えるかも。
デプロイにはHerokuのGitHub連携を用いていて、ステージング環境にはmasterブランチの内容が自動的に反映されるようになっている。ちなみに、プロダクション環境へのデプロイは手動。できるだけ利用の少ない時間帯に、と考えるとタイミングを自分で決められた方がよかったため。もっとも、Herokuのリポジトリーにgit pushするだけでデプロイできてしまうのだが。
モニタリングにはHerokuのMetricsでほぼ事足りてしまっている。Libratoも入れてはあるのだが、ほぼ使っていない。外形監視にはUptime Robotを用いている。
サーバーサイド
Node.jsでは定番中の定番、Expressをフレームワークとして利用。たくさんのライブラリーが揃っていたり、middlewareの使い勝手がよいので何も不自由していない。Promise前提の新しいフレームワークも気になってはいるものの、ExpressでもPromiseを利用した記述ができるため、なかなか食指が動かない。
テンプレートエンジンにはPugとかではなくNunjucksを利用。使い慣れていたPHPのTwigとほぼ同じ記法(PythonのJinja由来)を使えるのは、便利。ただ、今だったらTwig.jsを選ぶかもしれないなとは思う。
クライアントサイド
クライアントサイドではVue.jsを利用。リリースしてしばらくはjQueryで動いていたが、Vue.jsを試したいと思って使い始めたのだった。SSR(サーバーサイドレンダリング)とかは行っていない。タスクランナーがgulp.jsなのは当時使い慣れていたから。今ならWebpackを使うことになると思う。
CSSのプリプロセッサーとしてはSassを利用。ライブラリーとしてBourbonを使っているが、ほんの少しのmixinしか使っていないので、将来的にははずすかもしれない。
まとめ
全体的にできるだけ楽に、簡単に作ろうという感じかもしれない。そもそも開発合宿で1日で生まれたサービスでもあるし、他にもお仕事がある中で、片手間で動かしてきた経緯もあるので。
特に今までPRなど行っていないのだが、リリース以来ずっと利用者が増え続けているサービスでもあったりするので、簡単にインフラのメンテナンスや増強ができるHerokuはとても便利。ちなみにサーバーがある場所は米国だが、そこまでレイテンシーに目くじらを立てるようなことは起こっていない。
折角の自社サービスなので、少しずつ新しいものを取り入れつつ、試したりもしながら運用していけたらと思う。