dotCloud (perl PSGI/Plack)に手を出すには、日本語情報が少ない?
利用可能言語(※1) | perl php java ruby node.js 他 | |
---|---|---|
利用可能DB(※1) | mysql postgres 他 | |
利用料金(※2) | 2サービスまでの利用なら無料 |
※1 http://docs.dotcloud.com/services/roadmap/
※2 https://www.dotcloud.com/pricing/
2011年7月頃に開始されたdotCloudはGAEやHerokuのような技術制限が少なく、無料で始められる為、盛り上がると思っていましたが、最近では取り上げるblogも少なく、今ひとつな印象を受けます。
私は2011年春頃にSign Upしたものの、このような理由で使っていませんでしたが、同じような理由でdotcloudへ手を出すのを面倒に思っている方もいると思います。
そこで、試しに書いたサンプルコードを使い、PSGI/Plack と dotCloud の使い方を私なりに解説してみます。
(上記以外の理由で盛り上がっていないのであれば、ややこしいかも)
※作成したサンプルコードは次のurlにcommitしてあります。
https://github.com/end0tknr/dotcloud-perl-mysql-sample
※dotcloudへ配備した状態は次のurlで、そのうち削除します。
http://smpl-end0tknr.dotcloud.com/
PSGI/Plackとは?
dotcloudはPSGI前提ですので、「PSGI/Plackとは?」を理解するにはgihyo.jpの記事が分かり易いと思います。
第1回 PSGI/Plack―フレームワークとサーバをつなぐエンジン (1):Perl Hackers Hub|gihyo.jp … 技術評論社
サンプルコードのディレクトリ構成
や、特徴は次の通りです。
- Plackによるpsgiですが、Mojolicious等のフレームワークは利用せず、オレオレMVC
- mysqlはo/r mapperを利用しておらず、DBIでsqlを実行
- html-templateはText::Xslate
- ログ出力はLog::Log4perl
|-- dotcloud.yml |-- smpl.ddl.sql |-- approot | |-- Makefile.PL | |-- app.psgi | |-- app.psgi.dev | |-- etc | | |-- config.yaml | | `-- config.yaml.dev | |-- lib | | |-- SMPL | | | |-- Config.pm | | | |-- CtrlCgi | | | | |-- Index.pm | | | | `-- User.pm | | | |-- CtrlCgi.pm | | | |-- DBI.pm | | | |-- Model | | | | `-- User.pm | | | |-- View | | | | `-- User.pm | | | `-- View.pm | | `-- SMPL.pm | |-- static | | |-- bootstrap | | | |-- css | | | | |-- bootstrap-responsive.css | | | | |-- bootstrap-responsive.min.css | | | | |-- bootstrap.css | | | | `-- bootstrap.min.css | | | |-- img | | | | |-- glyphicons-halflings-white.png | | | | `-- glyphicons-halflings.png | | | `-- js | | | |-- bootstrap.js | | | `-- bootstrap.min.js | | `-- js | | `-- jquery-1.7.2.min.js | `-- tmpl | |-- Error500.html | |-- Index.html | `-- User | `-- List.html
dotcloud.yml と、アプリ作成、配備
http://docs.dotcloud.com/guides/build-file/
まず、dotcloudで利用するサービスをdotcloud.ymlに記述します。
今回は、dbにmysqlを持つperl web applicationですので、次のように記述しますが、これでdotcloudの2個のサービスを利用することになります。
dotcloud.ymlの内容
www: type: perl approot: approot db: type: mysql
次に、dotcloudのcliツールを使い、アプリ作成(アプリ名はsmplにしています)と配備を行います。
$ cd dotcloud-perl-mysql-sample $ dotcloud create smpl $ dotcloud push smpl
私の場合、cliのinstallにやや手こずった為、pythonのinstallから行なっています。
fedora10 on colinuxにpython v2.7.3をsrcからinstall - end0tknrのkipple - web写経開発
データベースの準備
先程の「dotcloud push smpl」でmysql環境が用意されるので、まず、dotcloudへsshし、environment.yml に記載されているDB接続条件を確認下さい。
$ dotcloud ssh smpl.www dotcloud@smpl-default-www-0:~$ pwd /home/dotcloud dotcloud@smpl-default-www-0:~$ cat environment.yml DOTCLOUD_DB_MYSQL_HOST: smpl-end0tknr.dotcloud.com DOTCLOUD_DB_MYSQL_LOGIN: root DOTCLOUD_DB_MYSQL_PASSWORD: ないしょ DOTCLOUD_DB_MYSQL_PORT: '26489' DOTCLOUD_DB_MYSQL_URL: mysql://root:ないしょ@smpl-end0tknr.dotcloud.com:26489 <略>
※db接続条件は「$ dotcloud info smpl.db」コマンドでも確認できます
CREATE DATABASE smpl CHARACTER SET utf8; -- dotcloud.com環境下ではuser=rootのみ利用できるようです grant all privileges on smpl.* to smpladm@localhost identified by 'ないしょ'; use smpl; CREATE TABLE user ( uid varchar(32) comment 'user id', `name` varchar(64), update_time datetime default NULL, PRIMARY KEY(uid) ) COMMENT='USER MASTER'; insert into user values('user001','user no 1','2011-10-01 12:00:00'); insert into user values('user002','user no 2','2011-02-28 12:00:00'); insert into user values('user003','user no 3','2011-10-01 01:00:00'); insert into user values('user004','ユーザNO4',null);
※開発環境用にgrantしていますが、dotcloudではrootでのみdb接続可?
テスト用に用意したDB DDLは上記の通りですので、dotcloudコマンドからmysqlに接続し、このddlを実行することで、DBを作成して下さい。
$ dotcloud run smpl.db -- mysql -uroot -p # mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 62 Server version: 5.1.41-3ubuntu12.10-log (Ubuntu) Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
approot/Makefile.PL にcpan依存moduleを記載
Makefile.PLにcpanの依存moduleを記載すると、deploy(dotcloud push smpl)時にdotcloudがこれらをinstallしてくれます。
#!/usr/bin/env perl use ExtUtils::MakeMaker; WriteMakefile( PREREQ_PM => {'DBI'=> 0, 'DBD::mysql'=> 0, 'Log::Log4perl'=> 0, 'Module::Pluggable'=> 0, 'Plack'=> 0, 'Text::Xslate'=> 0, 'YAML'=> 0 } );
approot/app.psgi(.dev)は、apacheのhttpd.confのようなもの?
app.psgi は本番用?のpsgiファイルで、単にMVCのControllerへkickし、[$HTTP_RESPONSE_CODE, [$HTTP_HEADER], [$HTTP_BODY] ] を返すと、ページ表示してくれます。
#!/usr/local/bin/perl use strict; use utf8; use FindBin; use lib $FindBin::Bin .'/lib'; use Plack::Request; #substitute for CGI.pm use SMPL::CtrlCgi; use Data::Dumper; # psgi fileは、apache の httpd.conf のようなものです my $app = sub { my ($env) = @_; #psgi env my $req = Plack::Request->new($env); #CGI.pm代替 return SMPL::CtrlCgi->new()->run($req); #controler of MVC };
dotcloudは、css(bootstrap)やjs(jquery)等の静的ファイルを staticディレクトリ以下に置くと、「dotcloud push」時に自動的に http://smpl-end0tknr.dotcloud.com/static/ へmount (alias)してくれます。
一方、開発環境では、次のようにPlack::BuilderとPlack::App::Fileでstaticを明示する必要があります。
#!/usr/local/bin/perl use strict; use utf8; use FindBin; use lib $FindBin::Bin .'/lib'; use Plack::App::File; use Plack::Builder; use Plack::Request; #substitute for CGI.pm use SMPL::CtrlCgi; use Data::Dumper; my $STATIC_PATH = "/home/endo/dev/dotcloud-perl-sample/static/"; # psgi fileは、apache の httpd.conf のようなものです my $app = sub { my ($env) = @_; #psgi env my $req = Plack::Request->new($env); #CGI.pm代替 return SMPL::CtrlCgi->new()->run($req); #controler of MVC }; my $static = Plack::App::File->new(root =>$STATIC_PATH)->to_app; builder { # alias設定 mount "/static" => $static; #静的file mount "/" => $app; #動的file(cgi) };
アプリ用設定ファイル approot/etc/config.yaml , config.yaml.dev
解説は割愛します。
common: html_template_path: /home/dotcloud/current/tmpl static_file_path: "http://smpl-end0tknr.dotcloud.com/static/" root_url: "http://smpl-end0tknr.dotcloud.com/" db: host: smpl-end0tknr.dotcloud.com port: 26489 db_name: smpl db_user: root db_pass: ないしょ db_opt: AutoCommit: 0 mysql_enable_utf8: 1 client_encoding: utf8 log: log4perl.rootLogger: INFO, LOGFILE log4perl.appender.LOGFILE: Log::Log4perl::Appender::File log4perl.appender.LOGFILE.filename: /var/tmp/smpl.log log4perl.appender.LOGFILE.mode: append log4perl.appender.LOGFILE.layout: PatternLayout log4perl.appender.LOGFILE.layout.ConversionPattern: %d %F [%p] %m %n
その他
今日はここまで
書くのに疲れてきたので、今日はここまでにしておきます。
https://github.com/end0tknr/dotcloud-perl-mysql-sample にcommitしているperl moduleは400行もないので、SMPL/CtrlCgi.pmからも追えると思います。
dotcloud logs smpl.www でログ確認しましょう
dotcloudでは500(Internal Server Error)の場合も、404(Not Found)として表示するようです。「$ dotcloud logs smpl.www」でログ確認しましょう
独自ドメインの割り当ては、dotcloud alias add
$ dotcloud alias add $dotcloudアプリ名 $ドメイン名
cronジョブ
試していませんが、次のurlが参考になります
http://docs.dotcloud.com/guides/periodic-tasks/
http://tikitikipoo.phpfogapp.com/dotcloud_cron/
認証...
こちらも試していませんが、例えばbasic認証であれば、次のurlが参考になります
http://search.cpan.org/perldoc?Plack::Middleware::Auth::Basic