I am trying to get hypnotoad with a Mojolicious :: Lite application running on Heroku with Perloku . Something does not happen there when hypnotoad gets into the execution loop, which causes it to fail. I suppose I am missing something simple, but Heroku docs did not help, and I was not able to fix the good error messages from this.
I start with a very simple application, so I show some environment variables:
#!/usr/bin/env perl # today use Mojolicious::Lite; get '/' => sub { my $c = shift; my $content = "Perl: $^X Pid: $$\n\n"; foreach my $key ( keys %ENV ) { next unless $key =~ /Mojo|toad/i; $content .= "$key $ENV{$key}\n"; } $c->stash( content => $content ); $c->render('index'); }; app->start; __DATA__ @@ index.html.ep % layout 'default'; % title 'Welcome'; <p>Welcome to the Mojolicious real-time web framework!</p> <pre> <%= $content %> </pre> @@ layouts/default.html.ep <!DOCTYPE html> <html> <head><title><%= title %></title></head> <body><%= content %></body> </html>
When I run it locally, I have no problem. I can see from the environment variables that my program is running under hypnotoad:
Welcome to the Mojolicious real-time web framework! Perl: /Users/brian/Dropbox/bin/perls/perl5.20.0 Pid: 40006 HYPNOTOAD_PID 39981 MOJO_HELP HYPNOTOAD_TEST HYPNOTOAD_EXE /Users/brian/bin/perls/hypnotoad5.20.0 MOJO_REUSE 0.0.0.0:8080:6 HYPNOTOAD_REV 3 HYPNOTOAD_APP /Users/brian/Desktop/toady.d/toady MOJO_MODE production MOJO_HOME HYPNOTOAD_STOP HYPNOTOAD_FOREGROUND
Now I am deploying this with Mojolicious :: Command :: deploy :: heroku :
% toady deploy heroku --create
This works on https://frozen-brushlands-4002.herokuapp.com , using the default Perloku file:
#!/bin/sh ./toady daemon --listen http://*:$PORT --mode production
This does not work hypnotoad, although despite some of the links that I have seen, this suggests what I should get. The application works though:
Welcome to the Mojolicious real-time web framework! Perl: /app/vendor/perl/bin/perl Pid: 3 MOJO_REUSE 0.0.0.0:12270:4 MOJO_HOME MOJO_HELP MOJO_MODE production MOJO_EXE ./toady
I decided that I could just modify the Perloku file to run hypnotoad:
hypnloading starts and shuts down almost immediately without other log messages:
% heroku logs --app ... 2015-01-04T09:23:36.516864+00:00 heroku[web.1]: Starting process with command `./Perloku` 2015-01-04T09:23:38.321628+00:00 heroku[web.1]: State changed from starting to crashed
I can change the call to use -t to test the application to see if:
It works, and I get "Everything looks good!" message, therefore hypnosis is performed:
2015-01-04T09:36:36.955680+00:00 heroku[web.1]: Starting process with command `./Perloku` 2015-01-04T09:36:38.340717+00:00 app[web.1]: Everything looks good! 2015-01-04T09:36:39.085887+00:00 heroku[web.1]: State changed from starting to crashed
I turn on Mojo debug logging, but I don't see any additional output besides my own statements.
#!/usr/bin/env perl use Mojolicious::Lite; $|++; my $log = app->log; $log->level( 'debug' ); $log->debug( "INC: @INC" ); get '/' => sub { ...; }; $log->debug( "Right before start" ); my $app = app->start; $log->debug( "Right after start" ); $app;
I tried other things, for example, to load a module that, as I know, does not exist, and I get the expected error "Could not be found" in the logs.
The launch from the shell to the hero ( heroku run bash ) was not covered. The output of mojo version is the same as on my local machine:
$ perl vendor/perl-deps/bin/mojo version CORE Perl (v5.16.2, linux) Mojolicious (5.71, Tiger Face) OPTIONAL EV 4.0+ (n/a) IO::Socket::Socks 0.64+ (n/a) IO::Socket::SSL 1.84+ (n/a) Net::DNS::Native 0.15+ (n/a) You might want to update your Mojolicious to 5.72.
I see there is something really simple that I miss, but at the same time, none of this is archived for easy debugging.
Oleg is getting a little closer, but there are still problems. I already tried the foreground option and ran into the same problems, but didn't mention it.
If I start hypnotoad in the foreground, it tries to bind to the address. It cannot communicate with port 80 (or 443) and fails, and it can listen to 127.0.0.1: almost, but it looks like it cannot fully listen:
2015-01-13T11:47:54+00:00 heroku[slug-compiler]: Slug compilation started 2015-01-13T11:48:32+00:00 heroku[slug-compiler]: Slug compilation finished 2015-01-13T11:48:32.735095+00: 00 heroku[api]: Deploy dcab778 by ... 2015-01-13T11:48:32.735095+00:00 heroku[api]: Release v31 created by ... 2015-01-13T11:48:32.969489+00:00 heroku[web.1]: State changed from crashed to starting 2015-01-13T11:48:34.909134+00:00 heroku[web.1]: Starting process with command `./Perloku` 2015-01-13T11:48:36.045985+00:00 app[web.1]: Can't create listen socket: Permission denied at /app/vendor/perl-deps/lib/perl5/Mojo/IOLoop.pm line 120. 2015-01-13T11:48:36.920004+00:00 heroku[web.1]: Process exited with status 13 2015-01-13T11:48:36.932014+00:00 heroku[web.1]: State changed from starting to crashed
Here with an unprivileged port:
2015-01-13T11:39:10+00:00 heroku[slug-compiler]: Slug compilation started 2015-01-13T11:39:44+00:00 heroku[slug-compiler]: Slug compilation finished 2015-01-13T11:39:44.519679+00:00 heroku[api]: Deploy bbd1f68 by ... 2015-01-13T11:39:44.519679+00:00 heroku[api]: Release v29 created by ... 2015-01-13T11:39:44.811111+00:00 heroku[web.1]: State changed from crashed to starting 2015-01-13T11:39:47.382298+00:00 heroku[web.1]: Starting process with command `./Perloku` 2015-01-13T11:39:48.454706+00:00 app[web.1]: [Tue Jan 13 11:39:48 2015] [info] Listening at "http://*:8000". 2015-01-13T11:39:48.454733+00:00 app[web.1]: Server available at http://127.0.0.1:8000. 2015-01-13T11:39:48.454803+00:00 app[web.1]: [Tue Jan 13 11:39:48 2015] [info] Manager 3 started. 2015-01-13T11:39:48.480084+00:00 app[web.1]: [Tue Jan 13 11:39:48 2015] [info] Creating process id file "/app/hypnotoad.pid". 2015-01-13T11:40:47.703110+00:00 heroku[web.1]: Stopping process with SIGKILL 2015-01-13T11:40:47.702867+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch 2015-01-13T11:40:48.524470+00:00 heroku[web.1]: Process exited with status 137 2015-01-13T11:40:48.534002+00:00 heroku[web.1]: State changed from starting to crashed