updates
This commit is contained in:
240
start-services.sh
Executable file
240
start-services.sh
Executable file
@@ -0,0 +1,240 @@
|
||||
#!/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
|
||||
|
||||
# Set PORT environment variable and start with PM2
|
||||
PORT=$FRONTEND_PORT NODE_ENV=production pm2 start npm \
|
||||
--name "gnxsoft-frontend" \
|
||||
-- start
|
||||
|
||||
# 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 ""
|
||||
|
||||
Reference in New Issue
Block a user