92 lines
2.2 KiB
Bash
92 lines
2.2 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# File: add-gunicorn-service.sh
|
|
# Usage: ./add-gunicorn-service.sh domain.com hestiauser projectname
|
|
|
|
set -e
|
|
|
|
if [ "$#" -ne 3 ]; then
|
|
echo "Usage: $0 domain hestia_user project_name"
|
|
echo "Example: $0 example.com admin myproject"
|
|
exit 1
|
|
fi
|
|
|
|
DOMAIN="$1"
|
|
USER="$2"
|
|
PROJECT="$3"
|
|
|
|
HOMEDIR="/home/$USER"
|
|
WEBDIR="$HOMEDIR/web/$DOMAIN/public_html"
|
|
VENV_BIN="$WEBDIR/venv/bin"
|
|
SOCK_PATH="$WEBDIR/gunicorn.sock"
|
|
SERVICE_NAME="gunicorn-$DOMAIN"
|
|
|
|
SERVICE_FILE="/etc/systemd/system/$SERVICE_NAME.service"
|
|
|
|
if [ ! -d "$WEBDIR" ]; then
|
|
echo "Error: Domain directory not found → $WEBDIR"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -d "$VENV_BIN" ]; then
|
|
echo "Warning: Virtualenv not found → $VENV_BIN"
|
|
echo "Assuming gunicorn is installed inside the venv anyway"
|
|
fi
|
|
|
|
echo "Creating service for: $DOMAIN"
|
|
echo "User: $USER"
|
|
echo "Project: $PROJECT"
|
|
echo "Socket path: $SOCK_PATH"
|
|
echo "Service name: $SERVICE_NAME"
|
|
echo ""
|
|
|
|
cat << EOF | sudo tee "$SERVICE_FILE" > /dev/null
|
|
[Unit]
|
|
Description=Gunicorn instance for $DOMAIN (Django)
|
|
After=network.target
|
|
|
|
[Service]
|
|
User=$USER
|
|
Group=www-data
|
|
WorkingDirectory=$WEBDIR
|
|
Environment="PATH=$VENV_BIN:/usr/local/bin:/usr/bin"
|
|
Environment="PYTHONUNBUFFERED=1"
|
|
ExecStart=$VENV_BIN/gunicorn \\
|
|
--access-logfile - \\
|
|
--workers 3 \\
|
|
--threads 2 \\
|
|
--worker-class=gthread \\
|
|
--bind unix:$SOCK_PATH \\
|
|
--log-level=info \\
|
|
$PROJECT.wsgi:application
|
|
|
|
Restart=always
|
|
RestartSec=3
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
echo "Service file created: $SERVICE_FILE"
|
|
|
|
sudo systemctl daemon-reload
|
|
echo "→ daemon-reload completed"
|
|
|
|
sudo systemctl stop "$SERVICE_NAME" 2>/dev/null || true
|
|
|
|
sudo systemctl enable "$SERVICE_NAME"
|
|
sudo systemctl start "$SERVICE_NAME"
|
|
|
|
echo ""
|
|
echo "Service status:"
|
|
sudo systemctl status "$SERVICE_NAME" --no-pager -l | head -n 12
|
|
|
|
echo ""
|
|
echo "Socket check:"
|
|
ls -l "$SOCK_PATH" 2>/dev/null || echo "Socket not yet created (service must be running)"
|
|
|
|
echo ""
|
|
echo "If you get 502 Bad Gateway:"
|
|
echo "1. Make sure gunicorn is installed in venv: $VENV_BIN/pip install gunicorn"
|
|
echo "2. Run migrate & collectstatic if needed"
|
|
echo "3. Restart service: sudo systemctl restart $SERVICE_NAME" |