AudioForge / scripts /prod_start_manual.ps1
OnyxlMunkey's picture
c618549
# AudioForge Production Startup Script (Manual - No Docker)
# Starts PostgreSQL/Redis, initializes DB, then starts backend and frontend in production mode
param(
[switch]$SkipServices = $false,
[switch]$SkipBuild = $false,
[switch]$Help = $false
)
$Colors = @{
Red = "Red"
Green = "Green"
Yellow = "Yellow"
Blue = "Cyan"
Cyan = "Cyan"
}
function Write-Info { Write-Host "[INFO] $args" -ForegroundColor $Colors.Blue }
function Write-Success { Write-Host "[SUCCESS] $args" -ForegroundColor $Colors.Green }
function Write-Warning { Write-Host "[WARNING] $args" -ForegroundColor $Colors.Yellow }
function Write-Error { Write-Host "[ERROR] $args" -ForegroundColor $Colors.Red }
if ($Help) {
Write-Host @"
AudioForge Production Startup Script (Manual)
Usage:
.\scripts\prod_start_manual.ps1 [-SkipServices] [-SkipBuild] [-Help]
Options:
-SkipServices Skip starting PostgreSQL/Redis (assume they're already running)
-SkipBuild Skip building frontend (use existing build)
-Help Show this help message
This script will:
1. Start PostgreSQL and Redis (if not skipped)
2. Wait for services to be ready
3. Initialize the database
4. Build frontend for production (if not skipped)
5. Start backend server in production mode (4 workers)
6. Start frontend server in production mode
"@
exit 0
}
$ProjectRoot = Split-Path -Parent $PSScriptRoot
Set-Location $ProjectRoot
# Step 1: Start PostgreSQL and Redis
if (-not $SkipServices) {
Write-Info "Starting PostgreSQL and Redis..."
# Check if Docker is available and running
try {
$null = docker ps 2>&1 | Out-Null
if ($LASTEXITCODE -ne 0) {
Write-Error "Docker Desktop is not running!"
Write-Warning "Please start Docker Desktop and try again"
Write-Info "You can skip this step with -SkipServices if services are already running"
exit 1
}
} catch {
Write-Error "Cannot connect to Docker daemon!"
Write-Warning "Please start Docker Desktop and try again"
Write-Info "You can skip this step with -SkipServices if services are already running"
exit 1
}
# Start only postgres and redis services
Write-Info "Starting PostgreSQL and Redis containers..."
docker-compose up -d postgres redis
if ($LASTEXITCODE -ne 0) {
Write-Error "Failed to start services!"
Write-Info "Make sure Docker Desktop is running"
exit 1
}
Write-Info "Waiting for PostgreSQL to be ready..."
$maxAttempts = 30
$attempt = 0
$postgresReady = $false
while ($attempt -lt $maxAttempts -and -not $postgresReady) {
try {
$result = docker exec audioforge-postgres pg_isready -U postgres 2>&1
if ($LASTEXITCODE -eq 0) {
$postgresReady = $true
Write-Success "PostgreSQL is ready!"
}
} catch {
# Continue waiting
}
if (-not $postgresReady) {
Start-Sleep -Seconds 1
$attempt++
Write-Host "." -NoNewline
}
}
Write-Host ""
if (-not $postgresReady) {
Write-Error "PostgreSQL failed to start within timeout!"
exit 1
}
Write-Info "Waiting for Redis to be ready..."
Start-Sleep -Seconds 2
try {
$null = docker exec audioforge-redis redis-cli ping 2>&1
if ($LASTEXITCODE -eq 0) {
Write-Success "Redis is ready!"
}
} catch {
Write-Warning "Redis health check failed, but continuing..."
}
} else {
Write-Info "Skipping service startup (assuming PostgreSQL/Redis are running)"
}
# Step 2: Setup Backend Environment
Write-Info "Setting up backend environment..."
Set-Location "$ProjectRoot\backend"
# Check for Python 3.11 venv first (for ML support), then fall back to regular venv
$venvPath = if (Test-Path ".venv311") { ".venv311" } elseif (Test-Path ".venv") { ".venv" } else { $null }
if ($null -eq $venvPath) {
Write-Warning "Virtual environment not found! Creating .venv..."
python -m venv .venv
$venvPath = ".venv"
& "$venvPath\Scripts\Activate.ps1"
pip install -e ".[dev]"
} else {
Write-Info "Using virtual environment: $venvPath"
# Activate venv for subsequent commands
& "$venvPath\Scripts\Activate.ps1"
}
# Step 3: Initialize Database
Write-Info "Initializing database..."
# Check if .env exists
if (-not (Test-Path ".env")) {
Write-Warning ".env file not found! Running setup_env.py..."
Set-Location $ProjectRoot
python scripts/setup_env.py
Set-Location "$ProjectRoot\backend"
}
# Use venv's Python explicitly for database initialization
& "$venvPath\Scripts\python.exe" scripts/init_db.py
if ($LASTEXITCODE -ne 0) {
Write-Error "Database initialization failed!"
Write-Info "Make sure PostgreSQL is running and DATABASE_URL is correct in backend/.env"
exit 1
}
Write-Success "Database initialized successfully!"
# Step 4: Build Frontend for Production
if (-not $SkipBuild) {
Write-Info "Building frontend for production..."
Set-Location "$ProjectRoot\frontend"
# Check if node_modules exists
if (-not (Test-Path "node_modules")) {
Write-Warning "Frontend dependencies not installed! Installing..."
pnpm install
}
# Ensure .env.local exists
if (-not (Test-Path ".env.local")) {
Write-Info "Creating frontend .env.local..."
"NEXT_PUBLIC_API_URL=http://localhost:8000" | Out-File -FilePath ".env.local" -Encoding UTF8
}
# Set production environment
$env:NODE_ENV = "production"
Write-Info "Running production build (this may take a few minutes)..."
pnpm build
if ($LASTEXITCODE -ne 0) {
Write-Error "Frontend build failed!"
exit 1
}
Write-Success "Frontend built successfully!"
} else {
Write-Info "Skipping frontend build (using existing build)"
}
# Step 5: Start Backend in Production Mode
Write-Info "Starting backend server in production mode..."
Set-Location "$ProjectRoot\backend"
# Check for Python 3.11 venv first (for ML support), then fall back to regular venv
$venvPath = if (Test-Path ".venv311") { ".venv311" } elseif (Test-Path ".venv") { ".venv" } else { $null }
if ($null -eq $venvPath) {
Write-Warning "Virtual environment not found! Creating .venv..."
python -m venv .venv
$venvPath = ".venv"
& "$venvPath\Scripts\Activate.ps1"
pip install -e ".[dev]"
} else {
Write-Info "Using virtual environment: $venvPath"
}
# Set production environment variables
$env:ENVIRONMENT = "production"
$env:LOG_LEVEL = "info"
# Start backend in production mode with 4 workers
$backendJob = Start-Process powershell -ArgumentList @(
"-NoExit",
"-Command",
"cd '$ProjectRoot\backend'; `$env:ENVIRONMENT='production'; `$env:LOG_LEVEL='info'; `$venv = if (Test-Path .venv311) { '.venv311' } elseif (Test-Path .venv) { '.venv' } else { `$null }; if (`$venv) { & `"`$venv\Scripts\Activate.ps1`" }; uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4 --log-level info"
) -PassThru
Write-Success "Backend starting in production mode (PID: $($backendJob.Id))"
Write-Info "Backend will be available at http://localhost:8000"
# Step 6: Start Frontend in Production Mode
Write-Info "Starting frontend server in production mode..."
Set-Location "$ProjectRoot\frontend"
# Ensure .env.local exists
if (-not (Test-Path ".env.local")) {
Write-Info "Creating frontend .env.local..."
"NEXT_PUBLIC_API_URL=http://localhost:8000" | Out-File -FilePath ".env.local" -Encoding UTF8
}
# Set production environment
$env:NODE_ENV = "production"
# Start frontend in production mode
$frontendJob = Start-Process powershell -ArgumentList @(
"-NoExit",
"-Command",
"cd '$ProjectRoot\frontend'; `$env:NODE_ENV='production'; pnpm start"
) -PassThru
Write-Success "Frontend starting in production mode (PID: $($frontendJob.Id))"
Write-Info "Frontend will be available at http://localhost:3000"
# Wait a bit for services to start
Write-Info "Waiting for services to initialize..."
Start-Sleep -Seconds 10
# Final status
Write-Host ""
Write-Host "================================================================" -ForegroundColor Green
Write-Host " " -ForegroundColor Green
Write-Host " AudioForge Production Mode Started! " -ForegroundColor Green
Write-Host " " -ForegroundColor Green
Write-Host "================================================================" -ForegroundColor Green
Write-Host ""
Write-Success "Backend: http://localhost:8000 (4 workers)"
Write-Success "Frontend: http://localhost:3000 (production build)"
Write-Success "API Docs: http://localhost:8000/api/docs"
Write-Host ""
Write-Info "Backend and Frontend are running in separate PowerShell windows"
Write-Info "Close those windows to stop the servers"
Write-Host ""
Write-Info "To stop PostgreSQL/Redis: docker-compose down"
Write-Host ""
Write-Info "Ready to test music generation!"
Write-Host ""