forkanartを支える技術

forkanart という絵をフォークするという絵を描く人向けのサービスをリリースしたのですが、今回はその裏側の技術的な話をします。

ざっと構成を列挙します。

フロントエンド:

バックエンド:

アプリケーション:

デプロイ:

これ以外にもありますが、大雑把にこんな感じになってます。

フロントエンド

リクエスト -> nginx -> varnish -> uwsgi という特に珍しくもない構成です。
nginxをフロントに置いているのはvarnishがhttps通信を扱えないからです。 今forkanartは全部httpなのですが、将来的にhttpsに対応させる予定があるためこのようにしています。
蛇足ですが、nginxはグローバル80番、varnishはローカル8080番、uwsgiはローカル8081番の待受としています。

また、元々アプリケーションサーバーはgunicorn + meinheldを使う予定でしたが、まだloggingモジュールに対応していないとのことでuwsgiを使うことにしました。

バックエンド

MySQLはユーザー情報、MongoDBはそれ以外という使い分けをしています。
forkanartは画像のタイトルやコメントの変更がシームレスに出来るようにしているので、その部分はMongoDBみたいなwriteが速いデータベースが適切では?という理由です。ただ、今後色々やることも考えるとユーザー情報は信頼と実績のMySQLに置くようにしました。

アプリケーション

言語はPythonフレームワークはPyramidを使っています。Pyramidは前にも中規模サイトを作る際に使用したので勘所が分かってたというのもあって今回も使いました。
PyramidはDjangoと違って全部入りではないので、データベース接続部分やフォームライブラリを別途用意しなければなりません。 データベース接続はMySQLと繋ぐのはSQLAlchemy、MongoDBと繋ぐのはmongoengineを使っています。SQLAlchemyはオーソドックスとして、MongoDBの接続用ライブラリは他にも色々探したのですが、中でも一番良さそうだったのがmongoengineでした。
フォームライブラリはWTFormsを使っています。Pyramidであればcolander + deformが定番みたいな感じですが、フォームライブラリにデザインを合わせないといけないような感じで柔軟性がないので採用しませんでした。

テンプレートエンジンは mako で、CSSPySCSS + pyramid_scssJavaScriptGoogle Closure Compiler でminifyしています。

デプロイ

手動でデプロイしてしまうと更新できていないなどのミスが出てくる可能性があるので自動にしています。
Pythonでのデプロイツールの定番であるFabricに加えて、環境構築用ライブラリのalnairを使用しています。 alnairは自分が開発しており、実の所forkanartの環境構築のために開発しました。

その他

ツイッターログインの部分はvelruse (https://github.com/bbangert/velruse/)を使っています。このvelruseはpypiに上がってるものは古過ぎワロス状態なのでgithubにあるものを使っています。その他にもfacebookgithubOpenIDなど色々対応しています。


ざっとこんな感じになっています。事例として何かしらの参考になれば。