Dataforth DOS: - TestDataDB: singleton DB connection fix (crash prevention), WAL mode, WinSW service config, backup script, uncaught exception handlers - Sync-FromNAS.ps1: Get-NASFileList temp file approach to avoid SSH stdout deadlock, *> $null output suppression, 8.3 filename filter for PUSH phase, backslash-escaped SCP paths, rename-to-.synced - import.js: INSERT OR REPLACE for re-tested devices - Full import run: 1,028,275 -> 1,632,793 records, indexes added - Deploy script for sync fixes to AD2 Client scripts (temp/): - BG Builders: Lesley account check, MFA phone update - Lonestar Electrical: Kyla/Russ Google Workspace setup, 2FA bypass - AD2 diagnostics and NAS connectivity tests PENDING: Investigate why newest test_date is Jan 19 despite daily tests Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
135 lines
5.5 KiB
PowerShell
135 lines
5.5 KiB
PowerShell
# deploy.ps1
|
|
# Deploys the fixed TestDataDB application to AD2 (192.168.0.6).
|
|
#
|
|
# Copies files via SCP, installs dependencies, sets up the Windows service,
|
|
# and installs the backup scheduled task.
|
|
#
|
|
# Must be run from the directory containing the fixed files.
|
|
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
$RemoteHost = '192.168.0.6'
|
|
$RemoteUser = 'INTRANET\sysadmin'
|
|
$RemotePass = 'Paper123!@#'
|
|
$RemotePath = 'C:\Shares\testdatadb'
|
|
$SshExe = 'C:\Windows\System32\OpenSSH\ssh.exe'
|
|
$ScpExe = 'C:\Windows\System32\OpenSSH\scp.exe'
|
|
$LocalDir = $PSScriptRoot
|
|
|
|
# Credentials for SSH - set up sshpass-equivalent via environment
|
|
# Note: For automated deployment, the SSH key should be pre-configured.
|
|
# This script uses password-based auth via the ssh client.
|
|
|
|
$SshTarget = "${RemoteUser}@${RemoteHost}"
|
|
|
|
function Invoke-RemoteCommand {
|
|
param([string]$Command)
|
|
Write-Host "[INFO] Remote: $Command"
|
|
& $SshExe $SshTarget $Command
|
|
if ($LASTEXITCODE -ne 0) {
|
|
Write-Host "[ERROR] Remote command failed with exit code $LASTEXITCODE"
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
function Copy-ToRemote {
|
|
param([string]$LocalFile, [string]$RemoteDir)
|
|
$remoteDest = "${SshTarget}:`"${RemoteDir}`""
|
|
Write-Host "[INFO] Copying $LocalFile -> $RemoteDir"
|
|
& $ScpExe $LocalFile $remoteDest
|
|
if ($LASTEXITCODE -ne 0) {
|
|
Write-Host "[ERROR] SCP failed for $LocalFile"
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
Write-Host '========================================'
|
|
Write-Host 'TestDataDB Deployment to AD2'
|
|
Write-Host '========================================'
|
|
Write-Host ''
|
|
|
|
# -----------------------------------------------------------------------
|
|
# Step 1: Ensure remote directories exist
|
|
# -----------------------------------------------------------------------
|
|
Write-Host '[STEP 1] Creating remote directories...'
|
|
Invoke-RemoteCommand "if not exist `"${RemotePath}\routes`" mkdir `"${RemotePath}\routes`""
|
|
Invoke-RemoteCommand "if not exist `"${RemotePath}\logs`" mkdir `"${RemotePath}\logs`""
|
|
Invoke-RemoteCommand "if not exist `"${RemotePath}\backups`" mkdir `"${RemotePath}\backups`""
|
|
|
|
# -----------------------------------------------------------------------
|
|
# Step 2: Stop existing node process / service
|
|
# -----------------------------------------------------------------------
|
|
Write-Host ''
|
|
Write-Host '[STEP 2] Stopping existing processes...'
|
|
# Try stopping the service first (may not exist yet)
|
|
& $SshExe $SshTarget "net stop TestDataDB 2>nul & echo Service stop attempted"
|
|
# Kill any lingering node processes running server.js
|
|
& $SshExe $SshTarget "taskkill /F /FI `"IMAGENAME eq node.exe`" 2>nul & echo Process kill attempted"
|
|
Write-Host '[OK] Existing processes stopped.'
|
|
|
|
# -----------------------------------------------------------------------
|
|
# Step 3: Copy files to remote
|
|
# -----------------------------------------------------------------------
|
|
Write-Host ''
|
|
Write-Host '[STEP 3] Copying files to AD2...'
|
|
|
|
$filesToCopy = @(
|
|
@{ Local = "$LocalDir\server.js"; Remote = $RemotePath },
|
|
@{ Local = "$LocalDir\package.json"; Remote = $RemotePath },
|
|
@{ Local = "$LocalDir\install-service.js"; Remote = $RemotePath },
|
|
@{ Local = "$LocalDir\uninstall-service.js"; Remote = $RemotePath },
|
|
@{ Local = "$LocalDir\backup-db.ps1"; Remote = $RemotePath },
|
|
@{ Local = "$LocalDir\install-backup-task.ps1"; Remote = $RemotePath },
|
|
@{ Local = "$LocalDir\routes\api.js"; Remote = "$RemotePath\routes" }
|
|
)
|
|
|
|
foreach ($file in $filesToCopy) {
|
|
Copy-ToRemote -LocalFile $file.Local -RemoteDir $file.Remote
|
|
}
|
|
|
|
Write-Host '[OK] All files copied.'
|
|
|
|
# -----------------------------------------------------------------------
|
|
# Step 4: Install npm dependencies
|
|
# -----------------------------------------------------------------------
|
|
Write-Host ''
|
|
Write-Host '[STEP 4] Installing npm dependencies...'
|
|
Invoke-RemoteCommand "cd /d `"${RemotePath}`" && npm install --production"
|
|
Write-Host '[OK] Dependencies installed.'
|
|
|
|
# -----------------------------------------------------------------------
|
|
# Step 5: Uninstall old service (if present) and install new one
|
|
# -----------------------------------------------------------------------
|
|
Write-Host ''
|
|
Write-Host '[STEP 5] Installing Windows service...'
|
|
# Uninstall first to ensure clean state
|
|
& $SshExe $SshTarget "cd /d `"${RemotePath}`" && node uninstall-service.js 2>nul"
|
|
Start-Sleep -Seconds 3
|
|
Invoke-RemoteCommand "cd /d `"${RemotePath}`" && node install-service.js"
|
|
Write-Host '[OK] Windows service installed.'
|
|
|
|
# -----------------------------------------------------------------------
|
|
# Step 6: Install backup scheduled task
|
|
# -----------------------------------------------------------------------
|
|
Write-Host ''
|
|
Write-Host '[STEP 6] Installing backup scheduled task...'
|
|
Invoke-RemoteCommand "powershell -NoProfile -ExecutionPolicy Bypass -File `"${RemotePath}\install-backup-task.ps1`""
|
|
Write-Host '[OK] Backup task installed.'
|
|
|
|
# -----------------------------------------------------------------------
|
|
# Step 7: Verify service is running
|
|
# -----------------------------------------------------------------------
|
|
Write-Host ''
|
|
Write-Host '[STEP 7] Verifying service status...'
|
|
Start-Sleep -Seconds 5
|
|
& $SshExe $SshTarget "sc query TestDataDB"
|
|
|
|
Write-Host ''
|
|
Write-Host '========================================'
|
|
Write-Host '[OK] Deployment complete.'
|
|
Write-Host "[INFO] Service: TestDataDB on $RemoteHost"
|
|
Write-Host "[INFO] URL: http://${RemoteHost}:3000"
|
|
Write-Host "[INFO] Logs: ${RemotePath}\logs\"
|
|
Write-Host "[INFO] Backups: ${RemotePath}\backups\ (daily at 2 AM)"
|
|
Write-Host '========================================'
|