end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

dotCloud (perl PSGI/Plack)の使い方入門を解説して、無料webサービス

https://www.dotcloud.com

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も少なく、今ひとつな印象を受けます。

  • apache + mod_perl環境での開発経験はあるが、PSGI/Plackは未経験
  • dotCloudは魅力的なpaas環境だが、ドキュメントが少ない

私は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を利用しておらず、DBIsqlを実行
  • 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)は、apachehttpd.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