Files
claudetools/projects/dataforth-dos/testdatadb-fix/deploy.ps1
Mike Swanson 470638ff86 sync: Dataforth sync fixes, TestDataDB stability, and client scripts
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>
2026-03-13 06:08:31 -07:00

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 '========================================'