prod deploy version
This commit is contained in:
@@ -0,0 +1,215 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Configuration
|
||||
REPO_URL="http://owusu:890eccfcea010beb94a0adba246aaf9258330b70@23.29.118.76:3000/owusu/ds-fire-fighter.git"
|
||||
APP_DIR="/home/owusu/ds-fire-fighter"
|
||||
BRANCH="main"
|
||||
PYTHON_VERSION="3.11"
|
||||
WORKERS=4
|
||||
THREADS=2
|
||||
TIMEOUT=120
|
||||
MAX_REQUESTS=1000
|
||||
MAX_REQUESTS_JITTER=50
|
||||
DEBUG_MODE=true
|
||||
|
||||
# Colors for output
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Logging function
|
||||
log() {
|
||||
local level=$1
|
||||
local message=$2
|
||||
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
||||
|
||||
case $level in
|
||||
"INFO")
|
||||
echo -e "${BLUE}[$timestamp] INFO: $message${NC}"
|
||||
;;
|
||||
"SUCCESS")
|
||||
echo -e "${GREEN}[$timestamp] SUCCESS: $message${NC}"
|
||||
;;
|
||||
"WARNING")
|
||||
echo -e "${YELLOW}[$timestamp] WARNING: $message${NC}"
|
||||
;;
|
||||
"ERROR")
|
||||
echo -e "${RED}[$timestamp] ERROR: $message${NC}"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Debug logging function
|
||||
debug_log() {
|
||||
if [ "$DEBUG_MODE" = true ]; then
|
||||
echo -e "${YELLOW}[DEBUG] $1${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Error handling
|
||||
set -e
|
||||
trap 'last_command=$current_command; current_command=$BASH_COMMAND' DEBUG
|
||||
trap 'if [ $? -ne 0 ]; then log "ERROR" "Command failed: $last_command"; exit 1; fi' EXIT
|
||||
|
||||
# Function to check if a command exists
|
||||
command_exists() {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Function to install Python 3.11
|
||||
install_python() {
|
||||
log "INFO" "Installing Python ${PYTHON_VERSION}..."
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y software-properties-common
|
||||
sudo add-apt-repository -y ppa:deadsnakes/ppa
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y python${PYTHON_VERSION} python${PYTHON_VERSION}-venv python${PYTHON_VERSION}-dev
|
||||
}
|
||||
|
||||
# Function to setup git repository
|
||||
setup_repo() {
|
||||
if [ ! -d "$APP_DIR" ]; then
|
||||
log "INFO" "Cloning repository..."
|
||||
git clone $REPO_URL $APP_DIR
|
||||
else
|
||||
log "INFO" "Updating repository..."
|
||||
cd $APP_DIR
|
||||
git fetch origin
|
||||
git reset --hard origin/$BRANCH
|
||||
git clean -fd
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to setup virtual environment
|
||||
setup_venv() {
|
||||
log "INFO" "Setting up virtual environment..."
|
||||
if [ ! -d "$APP_DIR/venv" ]; then
|
||||
python${PYTHON_VERSION} -m venv $APP_DIR/venv
|
||||
fi
|
||||
source $APP_DIR/venv/bin/activate
|
||||
pip install --upgrade pip
|
||||
pip install -r $APP_DIR/requirements.txt
|
||||
}
|
||||
|
||||
# Function to create gunicorn config
|
||||
create_gunicorn_config() {
|
||||
log "INFO" "Creating Gunicorn configuration..."
|
||||
cat > $APP_DIR/gunicorn_config.py << EOL
|
||||
import multiprocessing
|
||||
import os
|
||||
|
||||
# Server socket
|
||||
bind = "0.0.0.0:5042"
|
||||
backlog = 2048
|
||||
|
||||
# Worker processes
|
||||
workers = ${WORKERS}
|
||||
worker_class = "uvicorn.workers.UvicornWorker"
|
||||
worker_connections = 1000
|
||||
timeout = ${TIMEOUT}
|
||||
keepalive = 2
|
||||
|
||||
# Process naming
|
||||
proc_name = "firefighter"
|
||||
pythonpath = "."
|
||||
|
||||
# Logging
|
||||
accesslog = "logs/access.log"
|
||||
errorlog = "logs/error.log"
|
||||
loglevel = "info"
|
||||
|
||||
# Server mechanics
|
||||
daemon = False
|
||||
pidfile = "gunicorn.pid"
|
||||
umask = 0
|
||||
user = None
|
||||
group = None
|
||||
tmp_upload_dir = None
|
||||
|
||||
# Worker lifecycle
|
||||
max_requests = ${MAX_REQUESTS}
|
||||
max_requests_jitter = ${MAX_REQUESTS_JITTER}
|
||||
graceful_timeout = 30
|
||||
preload_app = True
|
||||
|
||||
# Debug
|
||||
reload = False
|
||||
reload_engine = "auto"
|
||||
spew = False
|
||||
|
||||
# Server mechanics
|
||||
check_config = False
|
||||
preload_app = True
|
||||
EOL
|
||||
}
|
||||
|
||||
# Function to setup systemd service
|
||||
setup_service() {
|
||||
log "INFO" "Setting up systemd service..."
|
||||
sudo tee /etc/systemd/system/firefighter.service << EOL
|
||||
[Unit]
|
||||
Description=Fire Fighter Interview API
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
User=$USER
|
||||
WorkingDirectory=$APP_DIR
|
||||
Environment="PATH=$APP_DIR/venv/bin"
|
||||
Environment="PYTHONPATH=$APP_DIR"
|
||||
ExecStart=$APP_DIR/start.sh
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
StartLimitInterval=0
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOL
|
||||
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable firefighter
|
||||
}
|
||||
|
||||
# Main deployment process
|
||||
main() {
|
||||
log "INFO" "Starting deployment process..."
|
||||
|
||||
# Check and install Python if needed
|
||||
if ! command_exists python${PYTHON_VERSION}; then
|
||||
install_python
|
||||
fi
|
||||
|
||||
# Setup repository
|
||||
setup_repo
|
||||
|
||||
# Create logs directory
|
||||
mkdir -p $APP_DIR/logs
|
||||
|
||||
# Setup virtual environment and install dependencies
|
||||
setup_venv
|
||||
|
||||
# Create gunicorn config
|
||||
create_gunicorn_config
|
||||
|
||||
# Setup and start service
|
||||
setup_service
|
||||
sudo systemctl restart firefighter
|
||||
|
||||
log "SUCCESS" "Deployment completed!"
|
||||
log "INFO" "Your application should now be running at http://localhost:5042"
|
||||
|
||||
# Print helpful commands
|
||||
echo -e "\n${BLUE}Useful commands:${NC}"
|
||||
echo "View service status: sudo systemctl status firefighter"
|
||||
echo "View logs: sudo journalctl -u firefighter -f"
|
||||
echo "View application logs: tail -f $APP_DIR/logs/access.log"
|
||||
echo "View error logs: tail -f $APP_DIR/logs/error.log"
|
||||
echo "Restart service: sudo systemctl restart firefighter"
|
||||
echo "Stop service: sudo systemctl stop firefighter"
|
||||
echo "Start service: sudo systemctl start firefighter"
|
||||
echo "Deploy new version: ./server_deploy.sh"
|
||||
}
|
||||
|
||||
# Run main function
|
||||
main
|
||||
Reference in New Issue
Block a user