I'm hosting a rails project on Amazon Elastic Beanstalk and I try to configure a container command to automatically restart my delayed_job worker on the server after each deployment.
I tried with this one :
container_commands:
restartdelayedjob:
command: "RAILS_ENV=production script/delayed_job --pid-dir=/home/ec2-user/pids start"
cwd: /var/app/current
But, it seems that the pushed version is deployed after the restarting of the worker so the jobs failed to be processed by the worker.
When I connect on my instance by ssh, kill the worker process and restart a new one from the deployed version folder, everything works fine.
Do you have any ideas of how I can handle this?
Thanks
As per the Amazon documentation for
container_commands
:(emphasis mine)
This means at that point
/var/app/current
which you are setting as thecwd
for your command is still pointing to the previous version. However by default, from the docs again,cwd
:This means that if you want to run
delayed_job
from the directory of the app that just got extracted (but not yet deployed), don't overridecwd
and it should start the delayed_job for the app that's about to be deployed.Ref: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-container_commands
Update:
I've now set this up myself and found there's limitations to doing it via the standard
container_commands
- basically delayed_job will be started while it is still in the/var/app/ondeck
directory. Usually this is OK, but I had some issues with some jobs because that path had stuck around it would cause errors as the app was now in/var/app/current
.I found an undocumented (so warning!) approach that you can add scripts to be run AFTER your app server is restarted (and your new deploy is in
/var/app/current
).Basically Elastic Beanstalk will execute any scripts in
/opt/elasticbeanstalk/hooks/appdeploy/post
after the web server is restarted. This means if you drop shell scripts in this directory they will be run.I created a shell script like this:
I uploaded this script to an S3 bucket, and made sure it was "public". You can then use an options script in your
.ebextensions
directory (eg.99delayed_job.config
) to deploy this script as part of your app deploy, taking note that thepost
directory might not exist:When you deploy you should see something like this in your
/var/log/eb-tools.log
:As I said, putting stuff in this "post" directory is undocumented - but hopefully at some point Amazon add actual support to the
.options
scripts to run commands post-deploy, in that case you could move this to the officially supported approach.On 64bit Amazon Linux 2014.09 v1.1.0 running Ruby 2.1 (Passenger Standalone), got it working thanks to this post.
Note that this script is run as root, but your workers should be run as the webapp user.
In case anybody is looking to get delayed_job working in latest ElasticBeanstalk (64bit Amazon Linux 2014.09 v1.0.9 running Ruby 2.1 (Puma)): I got it to work using the below code (Thanks to damontorgerson). This file goes in ruby.config in .ebextensions folder.
I got mine working like so with the "daemons" gem: