So you’ve created an Elastic Beanstalk environment, you have a play framework distribution which you’ve created using play dist (either on your local environment, or right there on the server, whatever you prefer)
play dist outputs a my-app-1.0.zip file which has a self-contained version of your app with all the necessary libraries and a start script.
Afer you unzip it, you end up with a my-app-1.0/lib/ folder and a start script.
[ec2-user@ip-10-235-8-106 bullq-1.0]$ ls -l total 24 drwxrwxr-x 2 ec2-user ec2-user 4096 Sep 27 15:35 lib -rwxrwxr-x 1 ec2-user ec2-user 4328 Sep 27 15:35 start
Make sure it’s executable by using chmod +x start on the start script.
So now, this is all in the first ec2 instance of your elastic beanstalk environment, if you’re like me and you’ve used ubuntu/debian for your server management things can be slightly different here, since Amazon preferred CentOS for their default image, and here I’ll show you how to make your play app auto start when the server boots because you want every new machine that may be instanciated to have your app installed and to start the service as soon as the machine is up.
Create a /etc/init.d/myappd script
(I’m using ‘myapp’ here as an example, your app can be named whatever is named, so replace accordingly)
#!/usr/bin/env bash # myappd # Script to start|stop|restart myappd from /etc/init.d/ # By Gubatron - @gubatron - gubatron@gmail.com #replace accordingly in these variables 'myapp' for the name of your app PID_FILE=/home/ec2-user/myapp/dist/myapp-1.0/RUNNING_PID DAEMON_NAME=myappd DAEMON_PATH=/home/ec2-user/myapp DAEMON=$DAEMON_PATH/dist/myapp-1.0/start test -x $DAEMON || exit 0 set -e function killDAEMON() { echo "start kill daemon" kill -9 `cat /home/ec2-user/bullq/dist/bullq-1.0/RUNNING_PID` echo "end kill daemon" } function removePIDFile() { if [ -e $PID_FILE ] then rm -f $PID_FILE fi } case $1 in start) removePIDFile echo "Starting $DAEMON_NAME... $DAEMON" nohup $DAEMON & ;; restart) echo "Hot restart of $DAEMON_NAME" killDAEMON removePIDFile COMMAND="nohup $DAEMON &"; echo $COMMAND `$COMMAND` rm -f $PID_FILE ;; stop) echo "Stopping $DAEMON_NAME" killDAEMON removePIDFile ;; *) echo "Usage: $DAEMON_NAME {start|restart|stop}" >&2 exit 1 ;; esac exit 0
Save that script, and now you’re able to execute the following commans to start, stop and restart your play app.
/etc/init.d/myappd start /etc/init.d/myappd stop /etc/init.d/myappd restart
Wire it to autostart
The simplest way I found to have this script start when the server would boot was to add it at the end of the
/etc/rc.local file. (In ubuntu you’d register the new script with the upate-rc.d command)
#!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local /etc/init.d/myappd start