| 
 | 1 | +#!/bin/bash  | 
 | 2 | + | 
 | 3 | +export PROJECT_NAME=$1  | 
 | 4 | +export PROJECT_DIR=$2  | 
 | 5 | +export HOST_IP=$3  | 
 | 6 | +export HOST_PORT=$4  | 
 | 7 | + | 
 | 8 | +echo "Running autohost on ${PROJECT_NAME}..."  | 
 | 9 | + | 
 | 10 | +#------  | 
 | 11 | +HOSTING_DIR="/autohost/${PROJECT_NAME}_hostingdata"  | 
 | 12 | +echo "Saving hosting data in ${HOSTING_DIR}"  | 
 | 13 | + | 
 | 14 | +sudo rm -rf $HOSTING_DIR  | 
 | 15 | +sudo mkdir -p $HOSTING_DIR  | 
 | 16 | +sudo mkdir "${HOSTING_DIR}/logs"  | 
 | 17 | +sudo touch "$HOSTING_DIR/logs/gunicorn-supervisor.log"  | 
 | 18 | +sudo touch "$HOSTING_DIR/logs/nginx-access.log"  | 
 | 19 | +sudo touch "$HOSTING_DIR/logs/nginx-error.log"  | 
 | 20 | + | 
 | 21 | +#------  | 
 | 22 | +echo "Setting up Gunicorn..."  | 
 | 23 | +GUNICORN_SCRIPT="${HOSTING_DIR}/gunicorn-start.sh"  | 
 | 24 | + | 
 | 25 | +sudo touch $GUNICORN_SCRIPT  | 
 | 26 | + | 
 | 27 | +cat >> $GUNICORN_SCRIPT <<\EOF  | 
 | 28 | +#!/bin/bash  | 
 | 29 | +EOF  | 
 | 30 | + | 
 | 31 | +cat >> $GUNICORN_SCRIPT <<EOF  | 
 | 32 | +NAME="${PROJECT_NAME}"  | 
 | 33 | +SOCKFILE="${HOSTING_DIR}/run/gunicorn.sock"  | 
 | 34 | +DJANGODIR=${PROJECT_DIR}  | 
 | 35 | +USER=root  | 
 | 36 | +GROUP=webapps  | 
 | 37 | +NUM_WORKERS=4  | 
 | 38 | +DJANGO_SETTINGS_MODULE=${PROJECT_NAME}.settings  | 
 | 39 | +DJANGO_WSGI_MODULE=${PROJECT_NAME}.wsgi  | 
 | 40 | +EOF  | 
 | 41 | + | 
 | 42 | +cat >> $GUNICORN_SCRIPT <<\EOF  | 
 | 43 | +echo "Starting ${NAME} as root"  | 
 | 44 | +EOF  | 
 | 45 | + | 
 | 46 | +cat >> $GUNICORN_SCRIPT <<EOF  | 
 | 47 | +source "${HOSTING_DIR}/venv/bin/activate"  | 
 | 48 | +EOF  | 
 | 49 | + | 
 | 50 | +cat >> $GUNICORN_SCRIPT <<\EOF  | 
 | 51 | +export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE  | 
 | 52 | +export PYTHONPATH=$DJANGODIR:$PYTHONPATH  | 
 | 53 | +EOF  | 
 | 54 | + | 
 | 55 | +cat >> $GUNICORN_SCRIPT <<EOF  | 
 | 56 | +mkdir "${HOSTING_DIR}/run"  | 
 | 57 | +
  | 
 | 58 | +EOF  | 
 | 59 | + | 
 | 60 | +cat >> $GUNICORN_SCRIPT <<\EOF  | 
 | 61 | +exec gunicorn ${DJANGO_WSGI_MODULE}:application \  | 
 | 62 | +	--name $NAME \  | 
 | 63 | +	--workers $NUM_WORKERS \  | 
 | 64 | +	--user=$USER \  | 
 | 65 | +	--bind unix:$SOCKFILE   | 
 | 66 | +EOF  | 
 | 67 | + | 
 | 68 | +sudo chmod u+x $GUNICORN_SCRIPT  | 
 | 69 | + | 
 | 70 | + | 
 | 71 | +#------  | 
 | 72 | +python3 -m venv "${HOSTING_DIR}/venv"  | 
 | 73 | +source "${HOSTING_DIR}/venv/bin/activate"  | 
 | 74 | + | 
 | 75 | +pip install -r "${PROJECT_DIR}/requirements.txt"  | 
 | 76 | +pip install gunicorn  | 
 | 77 | +pip install setproctitle  | 
 | 78 | + | 
 | 79 | +python "${PROJECT_DIR}/manage.py" collectstatic  | 
 | 80 | + | 
 | 81 | +deactivate  | 
 | 82 | + | 
 | 83 | +#-----  | 
 | 84 | +echo "Installing dependencies"  | 
 | 85 | +sudo apt-get install nginx  | 
 | 86 | +sudo apt-get install supervisor  | 
 | 87 | + | 
 | 88 | +echo "	"  | 
 | 89 | +echo "Setting up supervisor"  | 
 | 90 | +echo "${PROJECT_NAME}.conf"  | 
 | 91 | + | 
 | 92 | +sudo rm -rf "/etc/supervisor/conf.d/${PROJECT_NAME}.conf"  | 
 | 93 | +sudo cat >> "/etc/supervisor/conf.d/${PROJECT_NAME}.conf" <<EOF  | 
 | 94 | +[program:${PROJECT_NAME}]  | 
 | 95 | +command=${GUNICORN_SCRIPT}  | 
 | 96 | +user = root  | 
 | 97 | +stdout_logfile = "${HOSTING_DIR}/logs/gunicorn-supervisor.log"  | 
 | 98 | +redirect_stderror = true  | 
 | 99 | +EOF  | 
 | 100 | + | 
 | 101 | +sudo supervisorctl reread  | 
 | 102 | +sudo supervisorctl update  | 
 | 103 | + | 
 | 104 | +echo "	"  | 
 | 105 | +echo "Setting up nginx"  | 
 | 106 | +echo "Saving nginx configuration at /etc/nginx/sites-available/${PROJECT_NAME}"  | 
 | 107 | +sudo rm -rf /etc/nginx/sites-available/${PROJECT_NAME}  | 
 | 108 | +sudo rm -rf /etc/nginx/sites-enabled/${PROJECT_NAME}  | 
 | 109 | +touch /etc/nginx/sites-available/${PROJECT_NAME}  | 
 | 110 | + | 
 | 111 | +sudo cat >> /etc/nginx/sites-available/${PROJECT_NAME} <<EOF  | 
 | 112 | +upstream ${PROJECT_NAME}_app_server {  | 
 | 113 | +	server unix:${HOSTING_DIR}/run/gunicorn.sock fail_timeout=0;  | 
 | 114 | +}  | 
 | 115 | +
  | 
 | 116 | +
  | 
 | 117 | +server {  | 
 | 118 | +	listen ${HOST_PORT};  | 
 | 119 | +	server_name ${HOST_IP};  | 
 | 120 | +	  | 
 | 121 | +	client_max_body_size 4G;  | 
 | 122 | +	  | 
 | 123 | +	access_log ${HOSTING_DIR}/logs/nginx-access.log;  | 
 | 124 | +	error_log ${HOSTING_DIR}/logs/nginx-error.log;  | 
 | 125 | +	  | 
 | 126 | +	location /static/ {  | 
 | 127 | +		alias	$PROJECT_DIR/static/;  | 
 | 128 | +	}  | 
 | 129 | +	  | 
 | 130 | +	location /media/ {  | 
 | 131 | +		alias	$PROJECT_DIR/media;  | 
 | 132 | +	}  | 
 | 133 | +EOF  | 
 | 134 | +cat >> /etc/nginx/sites-available/$PROJECT_NAME <<\EOF  | 
 | 135 | +	location / {  | 
 | 136 | +          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  | 
 | 137 | +          proxy_set_header Host $http_host;  | 
 | 138 | +          proxy_redirect off;  | 
 | 139 | +        if (!-f $request_filename) {  | 
 | 140 | +EOF  | 
 | 141 | + | 
 | 142 | +cat >> /etc/nginx/sites-available/$PROJECT_NAME <<EOF  | 
 | 143 | +            proxy_pass http://${PROJECT_NAME}_app_server;  | 
 | 144 | +            break;  | 
 | 145 | +        }  | 
 | 146 | +    }  | 
 | 147 | +    # Error pages  | 
 | 148 | +    error_page 500 502 503 504 /500.html;  | 
 | 149 | +    location = /500.html {  | 
 | 150 | +        root ${PROJECT_DIR}/static/;  | 
 | 151 | +	    }  | 
 | 152 | +}  | 
 | 153 | +EOF  | 
 | 154 | + | 
 | 155 | +sudo ln -s /etc/nginx/sites-available/${PROJECT_NAME} /etc/nginx/sites-enabled/  | 
 | 156 | + | 
 | 157 | +sudo nginx -s reload  | 
 | 158 | +sudo nginx -s reopen  | 
 | 159 | +sudo supervisorctl status $PROJECT_NAME  | 
 | 160 | + | 
 | 161 | + | 
 | 162 | +echo "Your project is up and running at ${HOST_IP}:${HOST_PORT}"  | 
 | 163 | + | 
 | 164 | + | 
 | 165 | + | 
0 commit comments