This commit is contained in:
Iliyan Angelov
2025-11-25 02:06:38 +02:00
parent 2f6dca736a
commit 82024016cd
37 changed files with 1800 additions and 1478 deletions

258
start-services.sh Executable file
View File

@@ -0,0 +1,258 @@
#!/bin/bash
# GNX-WEB Service Startup Script
# Starts backend on port 1086 and frontend on port 1087
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Get script directory
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
BACKEND_DIR="$SCRIPT_DIR/backEnd"
FRONTEND_DIR="$SCRIPT_DIR/frontEnd"
# Ports
BACKEND_PORT=1086
FRONTEND_PORT=1087
echo -e "${BLUE}=========================================="
echo "GNX-WEB Service Startup"
echo "==========================================${NC}"
# Check if PM2 is installed
if ! command -v pm2 &> /dev/null; then
echo -e "${YELLOW}PM2 is not installed. Installing PM2...${NC}"
npm install -g pm2
fi
# Function to check if port is in use
check_port() {
local port=$1
if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1 || netstat -tlnp 2>/dev/null | grep -q ":$port " || ss -tlnp 2>/dev/null | grep -q ":$port "; then
return 0
else
return 1
fi
}
# Check if ports are available
if check_port $BACKEND_PORT; then
echo -e "${YELLOW}Port $BACKEND_PORT is already in use. Stopping existing service...${NC}"
pm2 delete gnxsoft-backend 2>/dev/null || true
sleep 2
fi
if check_port $FRONTEND_PORT; then
echo -e "${YELLOW}Port $FRONTEND_PORT is already in use. Stopping existing service...${NC}"
pm2 delete gnxsoft-frontend 2>/dev/null || true
sleep 2
fi
# Check if backend directory exists
if [ ! -d "$BACKEND_DIR" ]; then
echo -e "${RED}Error: Backend directory not found at $BACKEND_DIR${NC}"
exit 1
fi
# Check if frontend directory exists
if [ ! -d "$FRONTEND_DIR" ]; then
echo -e "${RED}Error: Frontend directory not found at $FRONTEND_DIR${NC}"
exit 1
fi
# Function to generate secure random key
generate_secret_key() {
python3 -c "import secrets; print(secrets.token_urlsafe($1))" 2>/dev/null || \
openssl rand -base64 $((($1 * 3) / 4)) | tr -d '\n' | head -c $1
}
# Check if backend .env exists
if [ ! -f "$BACKEND_DIR/.env" ]; then
echo -e "${YELLOW}Warning: Backend .env file not found. Creating from example...${NC}"
if [ -f "$BACKEND_DIR/production.env.example" ]; then
cp "$BACKEND_DIR/production.env.example" "$BACKEND_DIR/.env"
# Generate and update keys automatically
echo -e "${BLUE}Generating secure keys...${NC}"
SECRET_KEY=$(generate_secret_key 50)
INTERNAL_API_KEY=$(generate_secret_key 32)
# Update keys in .env file
sed -i "s|^SECRET_KEY=.*|SECRET_KEY=$SECRET_KEY|" "$BACKEND_DIR/.env"
sed -i "s|^INTERNAL_API_KEY=.*|INTERNAL_API_KEY=$INTERNAL_API_KEY|" "$BACKEND_DIR/.env"
sed -i "s|^STATIC_ROOT=.*|STATIC_ROOT=$BACKEND_DIR/staticfiles|" "$BACKEND_DIR/.env"
sed -i "s|^MEDIA_ROOT=.*|MEDIA_ROOT=$BACKEND_DIR/media|" "$BACKEND_DIR/.env"
echo -e "${GREEN}✓ Generated and updated SECRET_KEY and INTERNAL_API_KEY${NC}"
echo -e "${YELLOW}Please update other values in $BACKEND_DIR/.env${NC}"
else
echo -e "${RED}Error: production.env.example not found${NC}"
exit 1
fi
else
# Check if keys need to be generated
if grep -q "your-super-secret\|your-secure-api-key\|PLACEHOLDER" "$BACKEND_DIR/.env"; then
echo -e "${BLUE}Generating secure keys for existing .env file...${NC}"
SECRET_KEY=$(generate_secret_key 50)
INTERNAL_API_KEY=$(generate_secret_key 32)
# Update keys in .env file
sed -i "s|^SECRET_KEY=.*|SECRET_KEY=$SECRET_KEY|" "$BACKEND_DIR/.env"
sed -i "s|^INTERNAL_API_KEY=.*|INTERNAL_API_KEY=$INTERNAL_API_KEY|" "$BACKEND_DIR/.env"
echo -e "${GREEN}✓ Updated SECRET_KEY and INTERNAL_API_KEY${NC}"
# Update nginx config if it exists
if [ -f "/etc/nginx/sites-available/gnxsoft" ]; then
echo -e "${BLUE}Updating nginx configuration with INTERNAL_API_KEY...${NC}"
escaped_key=$(echo "$INTERNAL_API_KEY" | sed 's/[[\.*^$()+?{|]/\\&/g')
sudo sed -i "s|set \$api_key \".*\";|set \$api_key \"$escaped_key\";|g" /etc/nginx/sites-available/gnxsoft
echo -e "${GREEN}✓ Updated nginx config with INTERNAL_API_KEY${NC}"
fi
fi
fi
# Start Backend
echo -e "${GREEN}[1/2] Starting Backend on port $BACKEND_PORT...${NC}"
cd "$BACKEND_DIR"
# Check if virtual environment exists
if [ ! -d "venv" ]; then
echo -e "${YELLOW}Virtual environment not found. Creating...${NC}"
python3 -m venv venv
fi
# Activate virtual environment
source venv/bin/activate
# Install/update dependencies
if [ ! -f "venv/.deps_installed" ]; then
echo -e "${BLUE}Installing Python dependencies...${NC}"
pip install -r requirements.txt
touch venv/.deps_installed
fi
# Run migrations
echo -e "${BLUE}Running database migrations...${NC}"
python manage.py migrate --noinput
# Collect static files
echo -e "${BLUE}Collecting static files...${NC}"
python manage.py collectstatic --noinput
# Create logs directory
mkdir -p logs
# Start backend with PM2
pm2 start gunicorn \
--name "gnxsoft-backend" \
--interpreter "$BACKEND_DIR/venv/bin/python" \
-- \
gnx.wsgi:application \
--bind 127.0.0.1:$BACKEND_PORT \
--workers 3 \
--timeout 120 \
--access-logfile "$BACKEND_DIR/logs/gunicorn_access.log" \
--error-logfile "$BACKEND_DIR/logs/gunicorn_error.log"
# Start Frontend
echo -e "${GREEN}[2/2] Starting Frontend on port $FRONTEND_PORT...${NC}"
cd "$FRONTEND_DIR"
# Check if node_modules exists
if [ ! -d "node_modules" ]; then
echo -e "${YELLOW}Node modules not found. Installing...${NC}"
npm install
fi
# Check if .next exists (build directory)
if [ ! -d ".next" ]; then
echo -e "${YELLOW}Frontend not built. Building...${NC}"
# Use production environment for build
NODE_ENV=production PORT=$FRONTEND_PORT npm run build
fi
# Create .env.production if it doesn't exist
if [ ! -f ".env.production" ]; then
echo -e "${BLUE}Creating .env.production file...${NC}"
cat > .env.production << EOF
NEXT_PUBLIC_SITE_URL=https://gnxsoft.com
NEXT_PUBLIC_API_URL=
PORT=$FRONTEND_PORT
NODE_ENV=production
NEXT_TELEMETRY_DISABLED=1
EOF
echo -e "${GREEN}✓ Created .env.production${NC}"
else
# Update PORT if it exists but is different
if ! grep -q "^PORT=$FRONTEND_PORT" .env.production; then
echo -e "${BLUE}Updating PORT in .env.production...${NC}"
if grep -q "^PORT=" .env.production; then
sed -i "s|^PORT=.*|PORT=$FRONTEND_PORT|" .env.production
else
echo "PORT=$FRONTEND_PORT" >> .env.production
fi
echo -e "${GREEN}✓ Updated PORT in .env.production${NC}"
fi
# Ensure NODE_ENV is set to production
if ! grep -q "^NODE_ENV=production" .env.production; then
if grep -q "^NODE_ENV=" .env.production; then
sed -i "s|^NODE_ENV=.*|NODE_ENV=production|" .env.production
else
echo "NODE_ENV=production" >> .env.production
fi
fi
fi
# Check if Next.js is using standalone output mode
if grep -q '"output":\s*"standalone"' next.config.js 2>/dev/null || grep -q "output:.*'standalone'" next.config.js 2>/dev/null; then
echo -e "${BLUE}Detected standalone mode. Starting with standalone server...${NC}"
# Check if standalone server exists
if [ ! -f ".next/standalone/server.js" ]; then
echo -e "${YELLOW}Standalone server not found. Rebuilding...${NC}"
NODE_ENV=production PORT=$FRONTEND_PORT npm run build
fi
# Start standalone server with PM2
PORT=$FRONTEND_PORT NODE_ENV=production pm2 start node \
--name "gnxsoft-frontend" \
--cwd "$FRONTEND_DIR" \
-- \
".next/standalone/server.js"
else
# Standard Next.js start
PORT=$FRONTEND_PORT NODE_ENV=production pm2 start npm \
--name "gnxsoft-frontend" \
-- start
fi
# Save PM2 configuration
pm2 save
echo ""
echo -e "${GREEN}=========================================="
echo "Services Started Successfully!"
echo "==========================================${NC}"
echo ""
echo -e "${BLUE}Backend:${NC} http://127.0.0.1:$BACKEND_PORT"
echo -e "${BLUE}Frontend:${NC} http://127.0.0.1:$FRONTEND_PORT"
echo ""
echo "PM2 Commands:"
echo " pm2 status - Check service status"
echo " pm2 logs gnxsoft-backend - View backend logs"
echo " pm2 logs gnxsoft-frontend - View frontend logs"
echo " pm2 restart all - Restart all services"
echo " pm2 stop all - Stop all services"
echo " pm2 delete all - Remove all services"
echo ""
echo -e "${YELLOW}Note: Make sure to configure nginx to proxy to these ports${NC}"
echo ""