mirror of
				https://github.com/9technologygroup/patchmon.net.git
				synced 2025-10-31 03:53:51 +00:00 
			
		
		
		
	setup: improve sudo handling and add root checks
- Add root permission check at startup - Install sudo automatically if not present (for Debian systems) - Add run_as_user() helper function with better error handling - Provide fallback PostgreSQL setup using 'su' when sudo unavailable - Replace all sudo -u commands with the new helper function - Better error messages for missing users/sudo This ensures compatibility with minimal Debian systems that don't have sudo by default.
This commit is contained in:
		
							
								
								
									
										83
									
								
								setup.sh
									
									
									
									
									
								
							
							
						
						
									
										83
									
								
								setup.sh
									
									
									
									
									
								
							| @@ -180,13 +180,49 @@ check_timezone() { | |||||||
|     fi |     fi | ||||||
| } | } | ||||||
|  |  | ||||||
|  | check_root() { | ||||||
|  |     if [[ $EUID -ne 0 ]]; then | ||||||
|  |         print_error "This script must be run as root" | ||||||
|  |         print_info "Please run: sudo $0" | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # Function to run commands as a specific user with better error handling | ||||||
|  | run_as_user() { | ||||||
|  |     local user="$1" | ||||||
|  |     local command="$2" | ||||||
|  |      | ||||||
|  |     if ! command -v sudo >/dev/null 2>&1; then | ||||||
|  |         print_error "sudo is required but not installed. Please install sudo first." | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     if ! id "$user" &>/dev/null; then | ||||||
|  |         print_error "User '$user' does not exist" | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     sudo -u "$user" bash -c "$command" | ||||||
|  | } | ||||||
|  |  | ||||||
| check_prerequisites() { | check_prerequisites() { | ||||||
|     print_info "Running and checking prerequisites..." |     print_info "Running and checking prerequisites..." | ||||||
|  |      | ||||||
|  |     # Check if running as root | ||||||
|  |     check_root | ||||||
|  |      | ||||||
|     print_info "Installing updates..." |     print_info "Installing updates..." | ||||||
|     apt-get update -y |     apt-get update -y | ||||||
|     apt-get upgrade -y |     apt-get upgrade -y | ||||||
|      |      | ||||||
|     print_info "Installing prerequisite applications..." |     print_info "Installing prerequisite applications..." | ||||||
|  |     # Install sudo if not present (needed for user switching) | ||||||
|  |     if ! command -v sudo >/dev/null 2>&1; then | ||||||
|  |         print_info "Installing sudo (required for user switching)..." | ||||||
|  |         apt-get install -y sudo | ||||||
|  |     fi | ||||||
|  |      | ||||||
|     apt-get install -y wget curl jq git netcat-openbsd |     apt-get install -y wget curl jq git netcat-openbsd | ||||||
|      |      | ||||||
|     print_status "Prerequisites installed successfully" |     print_status "Prerequisites installed successfully" | ||||||
| @@ -579,14 +615,27 @@ EOF | |||||||
| setup_database() { | setup_database() { | ||||||
|     print_info "Creating database: $DB_NAME" |     print_info "Creating database: $DB_NAME" | ||||||
|      |      | ||||||
|     # Drop and recreate database and user for clean state |     # Check if sudo is available for user switching | ||||||
|     sudo -u postgres psql -c "DROP DATABASE IF EXISTS $DB_NAME;" || true |     if command -v sudo >/dev/null 2>&1; then | ||||||
|     sudo -u postgres psql -c "DROP USER IF EXISTS $DB_USER;" || true |         # Drop and recreate database and user for clean state | ||||||
|      |         sudo -u postgres psql -c "DROP DATABASE IF EXISTS $DB_NAME;" || true | ||||||
|     # Create database and user |         sudo -u postgres psql -c "DROP USER IF EXISTS $DB_USER;" || true | ||||||
|     sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';" |          | ||||||
|     sudo -u postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_USER;" |         # Create database and user | ||||||
|     sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" |         sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';" | ||||||
|  |         sudo -u postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_USER;" | ||||||
|  |         sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" | ||||||
|  |     else | ||||||
|  |         # Alternative method for systems without sudo (run as postgres user directly) | ||||||
|  |         print_warning "sudo not available, using alternative method for PostgreSQL setup" | ||||||
|  |          | ||||||
|  |         # Switch to postgres user using su | ||||||
|  |         su - postgres -c "psql -c \"DROP DATABASE IF EXISTS $DB_NAME;\"" || true | ||||||
|  |         su - postgres -c "psql -c \"DROP USER IF EXISTS $DB_USER;\"" || true | ||||||
|  |         su - postgres -c "psql -c \"CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';\"" | ||||||
|  |         su - postgres -c "psql -c \"CREATE DATABASE $DB_NAME OWNER $DB_USER;\"" | ||||||
|  |         su - postgres -c "psql -c \"GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;\"" | ||||||
|  |     fi | ||||||
|      |      | ||||||
|     print_status "Database $DB_NAME created with user $DB_USER" |     print_status "Database $DB_NAME created with user $DB_USER" | ||||||
| } | } | ||||||
| @@ -639,11 +688,11 @@ install_dependencies() { | |||||||
|     chown -R "$INSTANCE_USER:$INSTANCE_USER" "$APP_DIR/.npm" |     chown -R "$INSTANCE_USER:$INSTANCE_USER" "$APP_DIR/.npm" | ||||||
|      |      | ||||||
|     # Clean npm cache to avoid permission issues |     # Clean npm cache to avoid permission issues | ||||||
|     sudo -u "$INSTANCE_USER" bash -c "cd $APP_DIR && npm cache clean --force" 2>/dev/null || true |     run_as_user "$INSTANCE_USER" "cd $APP_DIR && npm cache clean --force" 2>/dev/null || true | ||||||
|      |      | ||||||
|     # Install root dependencies as the dedicated user |     # Install root dependencies as the dedicated user | ||||||
|     print_info "Installing root dependencies..." |     print_info "Installing root dependencies..." | ||||||
|     if ! sudo -u "$INSTANCE_USER" bash -c " |     if ! run_as_user "$INSTANCE_USER" " | ||||||
|         cd $APP_DIR |         cd $APP_DIR | ||||||
|         export NPM_CONFIG_CACHE=$APP_DIR/.npm |         export NPM_CONFIG_CACHE=$APP_DIR/.npm | ||||||
|         export NPM_CONFIG_PREFIX=$APP_DIR/.npm-global |         export NPM_CONFIG_PREFIX=$APP_DIR/.npm-global | ||||||
| @@ -658,7 +707,7 @@ install_dependencies() { | |||||||
|     print_info "Installing backend dependencies..." |     print_info "Installing backend dependencies..." | ||||||
|     cd backend |     cd backend | ||||||
|     rm -rf node_modules |     rm -rf node_modules | ||||||
|     if ! sudo -u "$INSTANCE_USER" bash -c " |     if ! run_as_user "$INSTANCE_USER" " | ||||||
|         cd $APP_DIR/backend |         cd $APP_DIR/backend | ||||||
|         export NPM_CONFIG_CACHE=$APP_DIR/.npm |         export NPM_CONFIG_CACHE=$APP_DIR/.npm | ||||||
|         export NPM_CONFIG_PREFIX=$APP_DIR/.npm-global |         export NPM_CONFIG_PREFIX=$APP_DIR/.npm-global | ||||||
| @@ -674,7 +723,7 @@ install_dependencies() { | |||||||
|     print_info "Installing frontend dependencies..." |     print_info "Installing frontend dependencies..." | ||||||
|     cd frontend |     cd frontend | ||||||
|     rm -rf node_modules |     rm -rf node_modules | ||||||
|     if ! sudo -u "$INSTANCE_USER" bash -c " |     if ! run_as_user "$INSTANCE_USER" " | ||||||
|         cd $APP_DIR/frontend |         cd $APP_DIR/frontend | ||||||
|         export NPM_CONFIG_CACHE=$APP_DIR/.npm |         export NPM_CONFIG_CACHE=$APP_DIR/.npm | ||||||
|         export NPM_CONFIG_PREFIX=$APP_DIR/.npm-global |         export NPM_CONFIG_PREFIX=$APP_DIR/.npm-global | ||||||
| @@ -687,7 +736,7 @@ install_dependencies() { | |||||||
|      |      | ||||||
|     # Build frontend |     # Build frontend | ||||||
|     print_info "Building frontend..." |     print_info "Building frontend..." | ||||||
|     if ! sudo -u "$INSTANCE_USER" bash -c " |     if ! run_as_user "$INSTANCE_USER" " | ||||||
|         cd $APP_DIR/frontend |         cd $APP_DIR/frontend | ||||||
|         export NPM_CONFIG_CACHE=$APP_DIR/.npm |         export NPM_CONFIG_CACHE=$APP_DIR/.npm | ||||||
|         export NPM_CONFIG_PREFIX=$APP_DIR/.npm-global |         export NPM_CONFIG_PREFIX=$APP_DIR/.npm-global | ||||||
| @@ -757,8 +806,8 @@ run_migrations() { | |||||||
|      |      | ||||||
|     cd "$APP_DIR/backend" |     cd "$APP_DIR/backend" | ||||||
|     # Suppress Prisma CLI output (still logged to install log via tee) |     # Suppress Prisma CLI output (still logged to install log via tee) | ||||||
|     sudo -u "$INSTANCE_USER" npx prisma migrate deploy >/dev/null 2>&1 || true |     run_as_user "$INSTANCE_USER" "cd $APP_DIR/backend && npx prisma migrate deploy" >/dev/null 2>&1 || true | ||||||
|     sudo -u "$INSTANCE_USER" npx prisma generate >/dev/null 2>&1 || true |     run_as_user "$INSTANCE_USER" "cd $APP_DIR/backend && npx prisma generate" >/dev/null 2>&1 || true | ||||||
|      |      | ||||||
|     print_status "Database migrations completed as $INSTANCE_USER" |     print_status "Database migrations completed as $INSTANCE_USER" | ||||||
| } | } | ||||||
| @@ -1048,7 +1097,7 @@ populate_server_settings() { | |||||||
|     cd "$APP_DIR/backend" |     cd "$APP_DIR/backend" | ||||||
|      |      | ||||||
|     # Create settings update script |     # Create settings update script | ||||||
|     sudo -u "$INSTANCE_USER" cat > update_settings.js << EOF |     cat > update_settings.js << EOF | ||||||
| const { PrismaClient } = require('@prisma/client'); | const { PrismaClient } = require('@prisma/client'); | ||||||
| const prisma = new PrismaClient(); | const prisma = new PrismaClient(); | ||||||
|  |  | ||||||
| @@ -1092,7 +1141,7 @@ updateSettings(); | |||||||
| EOF | EOF | ||||||
|  |  | ||||||
|     # Run the settings update script as the dedicated user |     # Run the settings update script as the dedicated user | ||||||
|     sudo -u "$INSTANCE_USER" node update_settings.js |     run_as_user "$INSTANCE_USER" "cd $APP_DIR/backend && node update_settings.js" | ||||||
|      |      | ||||||
|     # Clean up temporary script |     # Clean up temporary script | ||||||
|     rm -f update_settings.js |     rm -f update_settings.js | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user