#!/bin/bash # 🚀 Laca City Website - Complete VPS Deployment Script # This script sets up your entire website on a VPS with domain configuration # Run this script on your VPS after uploading your project files # Can be run as root user or regular user with sudo privileges set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # No Color # Configuration Variables (Modify these before running) DOMAIN_NAME="" # e.g., "yourdomain.com" EMAIL="" # Your email for SSL certificate PROJECT_NAME="laca-city" DB_NAME="laca_city_db" DB_USER="laca_admin" DB_PASSWORD="" # Will be generated if empty FRONTEND_PORT=3000 BACKEND_PORT=3001 NGINX_CONFIG_NAME="laca-city" # System Configuration UBUNTU_VERSION=$(lsb_release -rs 2>/dev/null || echo "unknown") CURRENT_USER=$(whoami) PROJECT_DIR="/var/www/$PROJECT_NAME" BACKUP_DIR="/var/backups/$PROJECT_NAME" # Function to print colored output print_header() { echo -e "\n${PURPLE}========================================${NC}" echo -e "${PURPLE}$1${NC}" echo -e "${PURPLE}========================================${NC}\n" } print_status() { echo -e "${BLUE}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } print_step() { echo -e "${CYAN}[STEP]${NC} $1" } # Function to check if command exists command_exists() { command -v "$1" >/dev/null 2>&1 } # Function to prompt for user input prompt_input() { local prompt="$1" local var_name="$2" local default="$3" if [ -n "$default" ]; then read -p "$prompt [$default]: " input eval "$var_name=\${input:-$default}" else read -p "$prompt: " input eval "$var_name=\$input" fi } # Function to generate random password generate_password() { openssl rand -base64 32 | tr -d "=+/" | cut -c1-25 } # Function to create systemd service create_systemd_service() { local service_name="$1" local description="$2" local exec_start="$3" local working_dir="$4" local user="$5" $SUDO_CMD tee "/etc/systemd/system/$service_name.service" > /dev/null < /dev/null </dev/null | { cat; echo "0 3 * * * /usr/bin/certbot renew --quiet"; } | $SUDO_CMD crontab - print_success "SSL certificate configured and auto-renewal setup" } # Function to setup PostgreSQL setup_postgresql() { print_step "Setting up PostgreSQL..." $SUDO_CMD apt update $SUDO_CMD apt install -y postgresql postgresql-contrib # Start and enable PostgreSQL $SUDO_CMD systemctl start postgresql $SUDO_CMD systemctl enable postgresql # Generate database password if not provided if [ -z "$DB_PASSWORD" ]; then DB_PASSWORD=$(generate_password) print_status "Generated database password: $DB_PASSWORD" fi # Create database and user if [ "$CURRENT_USER" = "root" ]; then su - postgres -c "psql" </dev/null || true $SUDO_CMD chown -R "$SERVICE_USER:$SERVICE_USER" "$PROJECT_DIR" cd "$PROJECT_DIR" # Install dependencies print_status "Installing frontend dependencies..." cd "$PROJECT_DIR/frontend" npm ci --production print_status "Installing backend dependencies..." cd "$PROJECT_DIR/backend" npm ci --production print_success "Project dependencies installed" } # Function to create environment files create_env_files() { print_step "Creating environment files..." # Backend environment cat > "$PROJECT_DIR/backend/.env" < "$PROJECT_DIR/frontend/.env.production" < ecosystem.config.js < /dev/null < /dev/null < "\$BACKUP_PATH/database.sql" # Backup application files cp -r "$PROJECT_DIR" "\$BACKUP_PATH/app" # Backup Nginx configuration cp -r /etc/nginx/sites-available/$NGINX_CONFIG_NAME "\$BACKUP_PATH/nginx.conf" # Compress backup cd "$BACKUP_DIR" tar -czf "backup_\$BACKUP_DATE.tar.gz" "backup_\$BACKUP_DATE" rm -rf "backup_\$BACKUP_DATE" # Keep only last 7 days of backups find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +7 -delete echo "Backup completed: backup_\$BACKUP_DATE.tar.gz" EOF $SUDO_CMD chmod +x "/usr/local/bin/backup-$PROJECT_NAME" # Setup daily backup cron job (crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/backup-$PROJECT_NAME") | crontab - print_success "Backup script created and scheduled" } # Function to setup deployment script create_deployment_script() { print_step "Creating deployment script for future updates..." tee "$PROJECT_DIR/deploy-update.sh" > /dev/null </dev/null; then print_error "This script requires sudo access. Please ensure you can run sudo commands." exit 1 fi SUDO_CMD="sudo" SERVICE_USER="$CURRENT_USER" fi # Collect configuration if [ -z "$DOMAIN_NAME" ]; then prompt_input "Enter your domain name (e.g., yourdomain.com)" DOMAIN_NAME fi if [ -z "$EMAIL" ]; then prompt_input "Enter your email for SSL certificate" EMAIL fi if [ -z "$DB_PASSWORD" ]; then prompt_input "Enter database password (leave empty to generate)" DB_PASSWORD fi print_status "Configuration:" print_status "Domain: $DOMAIN_NAME" print_status "Email: $EMAIL" print_status "Project Directory: $PROJECT_DIR" print_status "Frontend Port: $FRONTEND_PORT" print_status "Backend Port: $BACKEND_PORT" read -p "Continue with deployment? (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then print_status "Deployment cancelled." exit 0 fi # Start deployment print_header "STARTING DEPLOYMENT" # Update system print_step "Updating system packages..." $SUDO_CMD apt update && $SUDO_CMD apt upgrade -y # Install basic tools print_step "Installing basic tools..." $SUDO_CMD apt install -y curl wget git unzip software-properties-common apt-transport-https ca-certificates gnupg lsb-release openssl # Setup firewall setup_firewall # Install Node.js install_nodejs # Setup databases setup_postgresql setup_redis # Setup project setup_project # Create environment files create_env_files # Build applications build_applications # Setup Nginx setup_nginx # Setup SSL setup_ssl # Setup PM2 setup_pm2 # Setup monitoring setup_monitoring # Create backup script create_backup_script # Create deployment script create_deployment_script # Final checks final_checks print_header "🎉 DEPLOYMENT COMPLETED SUCCESSFULLY!" echo -e "\n${GREEN}Your Laca City website is now deployed!${NC}\n" echo -e "🌐 Website URL: ${CYAN}https://$DOMAIN_NAME${NC}" echo -e "📊 PM2 Monitor: ${CYAN}pm2 monit${NC}" echo -e "📝 Logs: ${CYAN}pm2 logs${NC}" echo -e "🔄 Update: ${CYAN}$PROJECT_DIR/deploy-update.sh${NC}" echo -e "💾 Backup: ${CYAN}/usr/local/bin/backup-$PROJECT_NAME${NC}" echo -e "\n${YELLOW}Important Information:${NC}" echo -e "📧 Database Password: ${RED}$DB_PASSWORD${NC} (save this!)" echo -e "📁 Project Directory: $PROJECT_DIR" echo -e "📁 Backup Directory: $BACKUP_DIR" echo -e "🔧 Nginx Config: /etc/nginx/sites-available/$NGINX_CONFIG_NAME" echo -e "\n${BLUE}Useful Commands:${NC}" echo -e " pm2 list # View running processes" echo -e " pm2 restart all # Restart all applications" echo -e " pm2 logs # View application logs" echo -e " $SUDO_CMD systemctl status nginx # Check Nginx status" echo -e " $SUDO_CMD certbot renew --dry-run # Test SSL renewal" print_success "Setup completed! Your website should be accessible at https://$DOMAIN_NAME" } # Run main function main "$@"