最近、Module::CoreListのWebUIと、perl-buildで使っているperlのリリースとアーカイブのリストの生成をHerokuに移動しました。両方とも、情報を更新するworkerとappサーバが必要になるので、Heroku上でProcletを使ってappサーバとworkerなどを動かしてみました。
HerokuでのProcletの使い方
まず、cpanfileとProcfileを用意します。
$ cat cpanfile
requires 'HTTP::Tiny','0.043';
requires 'Getopt::Long';
requires 'Proclet';
requires 'Plack';
requires 'Starlet';
$ cat Procfile
web: ./server.pl --port $PORT
Procfileに書くのは1つだけです。2つ以上起動する場合は、別途お金がかかります。
server.plはこんな感じで、オプションでportを受け取り、workerとStarletのプロセスを起動します。
#!/usr/bin/env perl
use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/lib";
use Proclet;
use Plack::Loader;
use Getopt::Long;
use HTTP::Tiny;
my $port = 5000;
Getopt::Long::Configure ("no_ignore_case");
GetOptions(
"p|port=s" => \$port,
);
$proclet->service(
tag => 'worker',
code => sub {
my $worker = MyWorker->new;
$worker->run
},
);
my $app = MyWeb->to_psgi;
$proclet->service(
code => sub {
my $loader = Plack::Loader->load(
'Starlet',
port => $port,
host => 0,
max_workers => 5,
);
$loader->run($app);
},
tag => 'web',
);
$proclet->run;
場合によっては定期的にサービスを叩くworkerも合った方がいいかもしれません
$proclet->service(
every => '*/30 * * * *',
tag => 'ping',
code => sub {
my $ua = HTTP::Tiny->new;
$ua->get("http://${yourservicename}.herokuapp.com/");
}
);
Procletはcron likeなworkerもサポートしています。
server.plは実行権限も付けておきます
$ chmod +x server.pl
準備ができたら、herokuコマンドを使ってアプリケーションを登録します。
$ heroku create yourappname --buildpack https://github.com/kazeburo/heroku-buildpack-perl-procfile.git
拙作のbuildpackを使うと、cpanfileを使って依存モジュールをいれ、環境変数を設定してくれます。
最後にpushしてサービスを起動します。
$ git push heroku master
...
-----> Heroku receiving push
-----> Fetching custom buildpack
-----> Perl/Procfile app detected
-----> Installing dependencies
便利ですね!