Last active
December 17, 2015 18:19
-
-
Save michaelhenry/5652287 to your computer and use it in GitHub Desktop.
Celery deployment script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# ========================================================= | |
# celerybeat - Starts the Celery periodic task scheduler. | |
# ========================================================= | |
# | |
# :Usage: /etc/init.d/celerybeat {start|stop|force-reload|restart|try-restart|status} | |
# :Configuration file: /etc/default/celerybeat or /etc/default/celeryd | |
# | |
# See http://docs.celeryproject.org/en/latest/tutorials/daemonizing.html#generic-init-scripts | |
### BEGIN INIT INFO | |
# Provides: celerybeat | |
# Required-Start: $network $local_fs $remote_fs | |
# Required-Stop: $network $local_fs $remote_fs | |
# Default-Start: 2 3 4 5 | |
# Default-Stop: 0 1 6 | |
# Short-Description: celery periodic task scheduler | |
### END INIT INFO | |
# Cannot use set -e/bash -e since the kill -0 command will abort | |
# abnormally in the absence of a valid process ID. | |
#set -e | |
CELERY_BIN=${CELERY_BIN:-"celery"} | |
DEFAULT_PID_FILE="/var/run/celery/beat.pid" | |
DEFAULT_LOG_FILE="/var/log/celery/beat.log" | |
DEFAULT_LOG_LEVEL="INFO" | |
DEFAULT_CELERYBEAT="$CELERY_BIN beat" | |
# /etc/init.d/celerybeat: start and stop the celery periodic task scheduler daemon. | |
if test -f /etc/default/celeryd; then | |
. /etc/default/celeryd | |
fi | |
if test -f /etc/default/celerybeat; then | |
. /etc/default/celerybeat | |
fi | |
CELERYBEAT=${CELERYBEAT:-$DEFAULT_CELERYBEAT} | |
CELERYBEAT_LOG_LEVEL=${CELERYBEAT_LOG_LEVEL:-${CELERYBEAT_LOGLEVEL:-$DEFAULT_LOG_LEVEL}} | |
# Sets --app argument for CELERY_BIN | |
CELERY_APP_ARG="" | |
if [ ! -z "$CELERY_APP"]; then | |
CELERY_APP_ARG="--app=$CELERY_APP" | |
fi | |
# Set CELERY_CREATE_DIRS to always create log/pid dirs. | |
CELERY_CREATE_DIRS=${CELERY_CREATE_DIRS:-0} | |
CELERY_CREATE_RUNDIR=$CELERY_CREATE_DIRS | |
CELERY_CREATE_LOGDIR=$CELERY_CREATE_DIRS | |
if [ -z "$CELERYBEAT_PID_FILE" ]; then | |
CELERYBEAT_PID_FILE="$DEFAULT_PID_FILE" | |
CELERY_CREATE_RUNDIR=1 | |
fi | |
if [ -z "$CELERYBEAT_LOG_FILE" ]; then | |
CELERYBEAT_LOG_FILE="$DEFAULT_LOG_FILE" | |
CELERY_CREATE_LOGDIR=1 | |
fi | |
export CELERY_LOADER | |
CELERYBEAT_OPTS="$CELERYBEAT_OPTS -f $CELERYBEAT_LOG_FILE -l $CELERYBEAT_LOG_LEVEL" | |
if [ -n "$2" ]; then | |
CELERYBEAT_OPTS="$CELERYBEAT_OPTS $2" | |
fi | |
CELERYBEAT_LOG_DIR=`dirname $CELERYBEAT_LOG_FILE` | |
CELERYBEAT_PID_DIR=`dirname $CELERYBEAT_PID_FILE` | |
# Extra start-stop-daemon options, like user/group. | |
if [ -n "$CELERYBEAT_USER" ]; then | |
DAEMON_OPTS="$DAEMON_OPTS --uid $CELERYBEAT_USER" | |
fi | |
if [ -n "$CELERYBEAT_GROUP" ]; then | |
DAEMON_OPTS="$DAEMON_OPTS --gid $CELERYBEAT_GROUP" | |
fi | |
CELERYBEAT_CHDIR=${CELERYBEAT_CHDIR:-$CELERYD_CHDIR} | |
if [ -n "$CELERYBEAT_CHDIR" ]; then | |
DAEMON_OPTS="$DAEMON_OPTS --workdir $CELERYBEAT_CHDIR" | |
fi | |
export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" | |
check_dev_null() { | |
if [ ! -c /dev/null ]; then | |
echo "/dev/null is not a character device!" | |
exit 75 # EX_TEMPFAIL | |
fi | |
} | |
maybe_die() { | |
if [ $? -ne 0 ]; then | |
echo "Exiting: $*" | |
exit 77 # EX_NOPERM | |
fi | |
} | |
create_default_dir() { | |
if [ ! -d "$1" ]; then | |
echo "- Creating default directory: '$1'" | |
mkdir -p "$1" | |
maybe_die "Couldn't create directory $1" | |
echo "- Changing permissions of '$1' to 02755" | |
chmod 02755 "$1" | |
maybe_die "Couldn't change permissions for $1" | |
if [ -n "$CELERYBEAT_USER" ]; then | |
echo "- Changing owner of '$1' to '$CELERYBEAT_USER'" | |
chown "$CELERYBEAT_USER" "$1" | |
maybe_die "Couldn't change owner of $1" | |
fi | |
if [ -n "$CELERYBEAT_GROUP" ]; then | |
echo "- Changing group of '$1' to '$CELERYBEAT_GROUP'" | |
chgrp "$CELERYBEAT_GROUP" "$1" | |
maybe_die "Couldn't change group of $1" | |
fi | |
fi | |
} | |
check_paths() { | |
if [ $CELERY_CREATE_LOGDIR -eq 1 ]; then | |
create_default_dir "$CELERYBEAT_LOG_DIR" | |
fi | |
if [ $CELERY_CREATE_RUNDIR -eq 1 ]; then | |
create_default_dir "$CELERYBEAT_PID_DIR" | |
fi | |
} | |
create_paths () { | |
create_default_dir "$CELERYBEAT_LOG_DIR" | |
create_default_dir "$CELERYBEAT_PID_DIR" | |
} | |
wait_pid () { | |
pid=$1 | |
forever=1 | |
i=0 | |
while [ $forever -gt 0 ]; do | |
kill -0 $pid 1>/dev/null 2>&1 | |
if [ $? -eq 1 ]; then | |
echo "OK" | |
forever=0 | |
else | |
kill -TERM "$pid" | |
i=$((i + 1)) | |
if [ $i -gt 60 ]; then | |
echo "ERROR" | |
echo "Timed out while stopping (30s)" | |
forever=0 | |
else | |
sleep 0.5 | |
fi | |
fi | |
done | |
} | |
stop_beat () { | |
echo -n "Stopping celerybeat... " | |
if [ -f "$CELERYBEAT_PID_FILE" ]; then | |
wait_pid $(cat "$CELERYBEAT_PID_FILE") | |
else | |
echo "NOT RUNNING" | |
fi | |
} | |
start_beat () { | |
echo "Starting celerybeat..." | |
if [ -n "$VIRTUALENV" ]; then | |
source $VIRTUALENV/bin/activate | |
fi | |
$CELERYBEAT $CELERY_APP_ARG $CELERYBEAT_OPTS $DAEMON_OPTS --detach \ | |
--pidfile="$CELERYBEAT_PID_FILE" | |
} | |
case "$1" in | |
start) | |
check_dev_null | |
check_paths | |
start_beat | |
;; | |
stop) | |
check_paths | |
stop_beat | |
;; | |
reload|force-reload) | |
echo "Use start+stop" | |
;; | |
restart) | |
echo "Restarting celery periodic task scheduler" | |
check_paths | |
stop_beat | |
check_dev_null | |
start_beat | |
;; | |
create-paths) | |
check_dev_null | |
create_paths | |
;; | |
check-paths) | |
check_dev_null | |
check_paths | |
;; | |
*) | |
echo "Usage: /etc/init.d/celerybeat {start|stop|restart|create-paths}" | |
exit 64 # EX_USAGE | |
;; | |
esac | |
exit 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#/etc/default/celerybeat | |
# Where the Django project is. | |
CELERYBEAT_CHDIR="/home/ubuntu/" | |
# Name of the projects settings module. | |
export DJANGO_SETTINGS_MODULE="project.settings.production" | |
ENV_PYTHON="$CELERYBEAT_CHDIR/environment/bin/python" | |
# Path to celerybeat | |
CELERYBEAT="$ENV_PYTHON /home/ubuntu/jnewsaustralia-web/project/manage.py celerybeat" | |
# Extra arguments to celerybeat | |
CELERYBEAT_OPTS="--schedule=/var/run/celerybeat-schedule" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh -e | |
# ============================================ | |
# celeryd - Starts the Celery worker daemon. | |
# ============================================ | |
# | |
# :Usage: /etc/init.d/celeryd {start|stop|force-reload|restart|try-restart|status} | |
# :Configuration file: /etc/default/celeryd | |
# | |
# See http://docs.celeryproject.org/en/latest/tutorials/daemonizing.html#generic-init-scripts | |
# /etc/init.d/celeryd | |
### BEGIN INIT INFO | |
# Provides: celeryd | |
# Required-Start: $network $local_fs $remote_fs | |
# Required-Stop: $network $local_fs $remote_fs | |
# Default-Start: 2 3 4 5 | |
# Default-Stop: 0 1 6 | |
# Short-Description: celery task worker daemon | |
### END INIT INFO | |
# some commands work asyncronously, so we'll wait this many seconds | |
SLEEP_SECONDS=5 | |
DEFAULT_PID_FILE="/var/run/celery/%N.pid" | |
DEFAULT_LOG_FILE="/var/log/celery/%N.log" | |
DEFAULT_LOG_LEVEL="INFO" | |
DEFAULT_NODES="celery" | |
DEFAULT_CELERYD="-m celery worker --detach" | |
CELERY_DEFAULTS=${CELERY_DEFAULTS:-"/etc/default/celeryd"} | |
test -f "$CELERY_DEFAULTS" && . "$CELERY_DEFAULTS" | |
# Sets --app argument for CELERY_BIN | |
CELERY_APP_ARG="" | |
if [ ! -z "$CELERY_APP" ]; then | |
CELERY_APP_ARG="--app=$CELERY_APP" | |
fi | |
# Set CELERY_CREATE_DIRS to always create log/pid dirs. | |
CELERY_CREATE_DIRS=${CELERY_CREATE_DIRS:-0} | |
CELERY_CREATE_RUNDIR=$CELERY_CREATE_DIRS | |
CELERY_CREATE_LOGDIR=$CELERY_CREATE_DIRS | |
if [ -z "$CELERYD_PID_FILE" ]; then | |
CELERYD_PID_FILE="$DEFAULT_PID_FILE" | |
CELERY_CREATE_RUNDIR=1 | |
fi | |
if [ -z "$CELERYD_LOG_FILE" ]; then | |
CELERYD_LOG_FILE="$DEFAULT_LOG_FILE" | |
CELERY_CREATE_LOGDIR=1 | |
fi | |
CELERYD_LOG_LEVEL=${CELERYD_LOG_LEVEL:-${CELERYD_LOGLEVEL:-$DEFAULT_LOG_LEVEL}} | |
CELERY_BIN=${CELERY_BIN:-"celery"} | |
CELERYD_MULTI=${CELERYD_MULTI:-"$CELERY_BIN multi"} | |
CELERYD=${CELERYD:-$DEFAULT_CELERYD} | |
CELERYD_NODES=${CELERYD_NODES:-$DEFAULT_NODES} | |
export CELERY_LOADER | |
if [ -n "$2" ]; then | |
CELERYD_OPTS="$CELERYD_OPTS $2" | |
fi | |
CELERYD_LOG_DIR=`dirname $CELERYD_LOG_FILE` | |
CELERYD_PID_DIR=`dirname $CELERYD_PID_FILE` | |
# Extra start-stop-daemon options, like user/group. | |
if [ -n "$CELERYD_USER" ]; then | |
DAEMON_OPTS="$DAEMON_OPTS --uid=$CELERYD_USER" | |
fi | |
if [ -n "$CELERYD_GROUP" ]; then | |
DAEMON_OPTS="$DAEMON_OPTS --gid=$CELERYD_GROUP" | |
fi | |
if [ -n "$CELERYD_CHDIR" ]; then | |
DAEMON_OPTS="$DAEMON_OPTS --workdir=$CELERYD_CHDIR" | |
fi | |
check_dev_null() { | |
if [ ! -c /dev/null ]; then | |
echo "/dev/null is not a character device!" | |
exit 75 # EX_TEMPFAIL | |
fi | |
} | |
maybe_die() { | |
if [ $? -ne 0 ]; then | |
echo "Exiting: $* (errno $?)" | |
exit 77 # EX_NOPERM | |
fi | |
} | |
create_default_dir() { | |
if [ ! -d "$1" ]; then | |
echo "- Creating default directory: '$1'" | |
mkdir -p "$1" | |
maybe_die "Couldn't create directory $1" | |
echo "- Changing permissions of '$1' to 02755" | |
chmod 02755 "$1" | |
maybe_die "Couldn't change permissions for $1" | |
if [ -n "$CELERYD_USER" ]; then | |
echo "- Changing owner of '$1' to '$CELERYD_USER'" | |
chown "$CELERYD_USER" "$1" | |
maybe_die "Couldn't change owner of $1" | |
fi | |
if [ -n "$CELERYD_GROUP" ]; then | |
echo "- Changing group of '$1' to '$CELERYD_GROUP'" | |
chgrp "$CELERYD_GROUP" "$1" | |
maybe_die "Couldn't change group of $1" | |
fi | |
fi | |
} | |
check_paths() { | |
if [ $CELERY_CREATE_LOGDIR -eq 1 ]; then | |
create_default_dir "$CELERYD_LOG_DIR" | |
fi | |
if [ $CELERY_CREATE_RUNDIR -eq 1 ]; then | |
create_default_dir "$CELERYD_PID_DIR" | |
fi | |
} | |
create_paths() { | |
create_default_dir "$CELERYD_LOG_DIR" | |
create_default_dir "$CELERYD_PID_DIR" | |
} | |
export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" | |
_get_pid_files() { | |
[ ! -d "$CELERYD_PID_DIR" ] && return | |
echo `ls -1 "$CELERYD_PID_DIR"/*.pid 2> /dev/null` | |
} | |
stop_workers () { | |
$CELERYD_MULTI stopwait $CELERYD_NODES --pidfile="$CELERYD_PID_FILE" | |
sleep $SLEEP_SECONDS | |
} | |
start_workers () { | |
$CELERYD_MULTI start $CELERYD_NODES $DAEMON_OPTS \ | |
--pidfile="$CELERYD_PID_FILE" \ | |
--logfile="$CELERYD_LOG_FILE" \ | |
--loglevel="$CELERYD_LOG_LEVEL" \ | |
--cmd="$CELERYD" \ | |
$CELERY_APP_ARG \ | |
$CELERYD_OPTS | |
sleep $SLEEP_SECONDS | |
} | |
restart_workers () { | |
$CELERYD_MULTI restart $CELERYD_NODES $DAEMON_OPTS \ | |
--pidfile="$CELERYD_PID_FILE" \ | |
--logfile="$CELERYD_LOG_FILE" \ | |
--loglevel="$CELERYD_LOG_LEVEL" \ | |
--cmd="$CELERYD" \ | |
$CELERY_APP_ARG \ | |
$CELERYD_OPTS | |
sleep $SLEEP_SECONDS | |
} | |
check_status () { | |
local pid_files=`_get_pid_files` | |
[ -z "$pid_files" ] && echo "celeryd is stopped" && exit 1 | |
local one_failed= | |
for pid_file in $pid_files; do | |
local node=`basename "$pid_file" .pid` | |
local pid=`cat "$pid_file"` | |
local cleaned_pid=`echo "$pid" | sed -e 's/[^0-9]//g'` | |
if [ -z "$pid" ] || [ "$cleaned_pid" != "$pid" ]; then | |
echo "bad pid file ($pid_file)" | |
else | |
local failed= | |
kill -0 $pid 2> /dev/null || failed=true | |
if [ "$failed" ]; then | |
echo "celeryd (node $node) (pid $pid) is stopped, but pid file exists!" | |
one_failed=true | |
else | |
echo "celeryd (node $node) (pid $pid) is running..." | |
fi | |
fi | |
done | |
[ "$one_failed" ] && exit 1 || exit 0 | |
} | |
case "$1" in | |
start) | |
check_dev_null | |
check_paths | |
start_workers | |
;; | |
stop) | |
check_dev_null | |
check_paths | |
stop_workers | |
;; | |
reload|force-reload) | |
echo "Use restart" | |
;; | |
status) | |
check_status | |
;; | |
restart) | |
check_dev_null | |
check_paths | |
restart_workers | |
;; | |
try-restart) | |
check_dev_null | |
check_paths | |
restart_workers | |
;; | |
create-paths) | |
check_dev_null | |
create_paths | |
;; | |
check-paths) | |
check_dev_null | |
check_paths | |
;; | |
*) | |
echo "Usage: /etc/init.d/celeryd {start|stop|restart|kill|create-paths}" | |
exit 64 # EX_USAGE | |
;; | |
esac | |
exit 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Name of nodes to start, here we have a single node | |
CELERYD_NODES="w1" | |
# or we could have three nodes: | |
#CELERYD_NODES="w1 w2 w3" | |
# Where to chdir at start. | |
CELERYD_CHDIR="/home/ubuntu" | |
# Python interpreter from environment. | |
ENV_PYTHON="$CELERYD_CHDIR/environment/bin/python" | |
# How to call "manage.py celeryd_multi" | |
CELERYD_MULTI="$ENV_PYTHON $CELERYD_CHDIR/jnewsaustralia-web/project/manage.py celeryd_multi" | |
# How to call "manage.py celeryctl" | |
CELERYCTL="$ENV_PYTHON $CELERYD_CHDIR/jnewsaustralia-web/project/manage.py celeryctl" | |
# Extra arguments to celeryd | |
CELERYD_OPTS="--time-limit=300 --concurrency=8" | |
# %n will be replaced with the nodename. | |
CELERYD_LOG_FILE="/var/log/celery/%n.log" | |
CELERYD_PID_FILE="/var/run/celery/%n.pid" | |
# Workers should run as an unprivileged user. | |
CELERYD_USER="celery" | |
CELERYD_GROUP="celery" | |
# Name of the projects settings module. | |
export DJANGO_SETTINGS_MODULE="project.settings.production" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# Deployment Config for JNewsAU | |
# Place the script in the file - /etc/init.d/$name | |
# make it executable - chmod +x /etc/init.d/$name | |
# And finally, wire it up - update-rc.d $name defaults | |
SERVICE_NAME='jnewsau' | |
ADDRESS='127.0.0.1' | |
PYTHON="/home/ubuntu/environment/bin/python" | |
GUNICORN="/home/ubuntu/environment/bin/gunicorn_django" | |
PROJECT_LOCATION="/home/ubuntu/jnewsaustralia-web/project" | |
MANAGE_PY="$PROJECT_LOCATION/manage.py" | |
DEFAULT_ARGS="--workers=3 --daemon --bind=$ADDRESS:" | |
COLLECT_STATIC_CMD="$PYTHON $MANAGE_PY collectstatic" | |
BASE_CMD="$GUNICORN $DEFAULT_ARGS" | |
SERVER_PORT='8000' | |
SERVER_PID="$PROJECT_LOCATION/$SERVICE_NAME.pid" | |
start_server () { | |
if [ -f $1 ]; then | |
#pid exists, check if running | |
if [ "$(ps -p `cat $1` | wc -l)" -gt 1 ]; then | |
echo "$SERVICE_NAME already running on ${ADDRESS}:${2}" | |
return | |
fi | |
fi | |
echo "collecting static" | |
$COLLECT_STATIC_CMD | |
sleep 2 | |
cd $PROJECT_LOCATION | |
echo "starting ${ADDRESS}:${2}" | |
$BASE_CMD$2 --pid=$1 | |
} | |
stop_server (){ | |
if [ -f $1 ] && [ "$(ps -p `cat $1` | wc -l)" -gt 1 ]; then | |
echo "stopping $SERVICE_NAME ${ADDRESS}:${2}" | |
kill -9 `cat $1` | |
rm $1 | |
else | |
if [ -f $1 ]; then | |
echo "$SERVICE_NAME ${ADDRESS}:${2} not running" | |
else | |
echo "No pid file found for $SERVICE_NAME ${ADDRESS}:${2}" | |
fi | |
fi | |
} | |
case "$1" in | |
'start') | |
start_server $SERVER_PID $SERVER_PORT | |
;; | |
'stop') | |
stop_server $SERVER_PID $SERVER_PORT | |
;; | |
'restart') | |
stop_server $SERVER_PID $SERVER_PORT | |
sleep 2 | |
start_server $SERVER_PID $SERVER_PORT | |
;; | |
*) | |
echo "Usage: $0 { start | stop | restart }" | |
;; | |
esac | |
exit 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sudo mkdir -p -m 2755 /var/run/celery | |
sudo chown ubuntu:ubuntu /var/run/celery | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sh -x /etc/init.d/celeryd start |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment