mirror of
https://github.com/pezkuwichain/pezkuwi-validator-v1.0.0.git
synced 2026-04-22 11:17:55 +00:00
4e93995605
- Created automated installer for Windows 10+ - Installs as Windows Service (auto-restart) - Uses NSSM for service management - Includes system requirements check - Downloads and extracts binaries automatically - Generates validator keys - Updated README with Windows instructions
221 lines
7.2 KiB
PowerShell
221 lines
7.2 KiB
PowerShell
# Pezkuwi Validator Installer for Windows
|
||
# Usage: iwr -useb https://raw.githubusercontent.com/pezkuwichain/pezkuwi-validator-v1.0.0/main/scripts/windows/install-validator.ps1 | iex
|
||
|
||
#Requires -RunAsAdministrator
|
||
|
||
$ErrorActionPreference = "Stop"
|
||
|
||
Write-Host "🚀 Pezkuwi Validator Installer v1.0.0 (Windows)" -ForegroundColor Cyan
|
||
Write-Host "=============================================" -ForegroundColor Cyan
|
||
Write-Host ""
|
||
|
||
# Configuration
|
||
$PEZKUWI_VERSION = "v1.0.0-local-testnet-success"
|
||
$GITHUB_REPO = "pezkuwichain/pezkuwi-sdk"
|
||
$INSTALL_DIR = "$env:USERPROFILE\.pezkuwi"
|
||
$CHAIN_SPEC_URL = "https://raw.githubusercontent.com/$GITHUB_REPO/main/pezkuwi-local-raw.json"
|
||
|
||
# Functions
|
||
function Write-Success {
|
||
param($Message)
|
||
Write-Host "✓ $Message" -ForegroundColor Green
|
||
}
|
||
|
||
function Write-Error-Custom {
|
||
param($Message)
|
||
Write-Host "✗ $Message" -ForegroundColor Red
|
||
}
|
||
|
||
function Write-Info {
|
||
param($Message)
|
||
Write-Host "ℹ $Message" -ForegroundColor Yellow
|
||
}
|
||
|
||
function Check-Requirements {
|
||
Write-Info "Checking system requirements..."
|
||
|
||
# Check Windows version
|
||
$osVersion = [System.Environment]::OSVersion.Version
|
||
if ($osVersion.Major -lt 10) {
|
||
Write-Error-Custom "Windows 10 or later required"
|
||
exit 1
|
||
}
|
||
|
||
# Check CPU cores
|
||
$cpuCores = (Get-WmiObject Win32_Processor).NumberOfLogicalProcessors
|
||
if ($cpuCores -lt 2) {
|
||
Write-Error-Custom "Minimum 2 CPU cores required (found: $cpuCores)"
|
||
exit 1
|
||
}
|
||
|
||
# Check RAM
|
||
$totalRAM = [math]::Round((Get-WmiObject Win32_ComputerSystem).TotalPhysicalMemory / 1GB)
|
||
if ($totalRAM -lt 4) {
|
||
Write-Error-Custom "Minimum 4GB RAM required (found: ${totalRAM}GB)"
|
||
exit 1
|
||
}
|
||
|
||
Write-Success "System requirements met"
|
||
}
|
||
|
||
function Install-Dependencies {
|
||
Write-Info "Checking dependencies..."
|
||
|
||
# Check if Chocolatey is installed
|
||
if (-not (Get-Command choco -ErrorAction SilentlyContinue)) {
|
||
Write-Info "Installing Chocolatey..."
|
||
Set-ExecutionPolicy Bypass -Scope Process -Force
|
||
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
|
||
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
|
||
}
|
||
|
||
Write-Success "Dependencies ready"
|
||
}
|
||
|
||
function Download-Binaries {
|
||
Write-Info "Downloading Pezkuwi binaries..."
|
||
|
||
New-Item -ItemType Directory -Force -Path "$INSTALL_DIR\bin" | Out-Null
|
||
|
||
$RELEASE_URL = "https://github.com/$GITHUB_REPO/releases/download/$PEZKUWI_VERSION"
|
||
$ARCHIVE_NAME = "pezkuwi-binaries-linux-x86_64.tar.gz"
|
||
$TEMP_FILE = "$env:TEMP\$ARCHIVE_NAME"
|
||
|
||
try {
|
||
# Download archive
|
||
Write-Info "Downloading from: $RELEASE_URL/$ARCHIVE_NAME"
|
||
Invoke-WebRequest -Uri "$RELEASE_URL/$ARCHIVE_NAME" -OutFile $TEMP_FILE -UseBasicParsing
|
||
|
||
# Extract using tar (available in Windows 10+)
|
||
Write-Info "Extracting binaries..."
|
||
tar -xzf $TEMP_FILE -C "$INSTALL_DIR\bin\"
|
||
|
||
# Cleanup
|
||
Remove-Item $TEMP_FILE
|
||
|
||
Write-Success "Binaries downloaded and extracted"
|
||
}
|
||
catch {
|
||
Write-Error-Custom "Failed to download binaries: $_"
|
||
Write-Info "Please check if release exists: $RELEASE_URL"
|
||
exit 1
|
||
}
|
||
}
|
||
|
||
function Download-ChainSpec {
|
||
Write-Info "Downloading chain specification..."
|
||
|
||
New-Item -ItemType Directory -Force -Path "$INSTALL_DIR\config" | Out-Null
|
||
|
||
try {
|
||
Invoke-WebRequest -Uri $CHAIN_SPEC_URL -OutFile "$INSTALL_DIR\config\chain-spec.json" -UseBasicParsing
|
||
Write-Success "Chain spec downloaded"
|
||
}
|
||
catch {
|
||
Write-Error-Custom "Failed to download chain spec: $_"
|
||
exit 1
|
||
}
|
||
}
|
||
|
||
function Generate-Keys {
|
||
Write-Info "Generating validator keys..."
|
||
|
||
New-Item -ItemType Directory -Force -Path "$INSTALL_DIR\keys" | Out-Null
|
||
|
||
$nodeKeyOutput = & "$INSTALL_DIR\bin\pezkuwi.exe" key generate-node-key --base-path "$INSTALL_DIR\data" --chain "$INSTALL_DIR\config\chain-spec.json" 2>&1
|
||
$nodeKeyOutput | Out-File "$INSTALL_DIR\keys\node-id.txt"
|
||
|
||
$nodeId = Get-Content "$INSTALL_DIR\keys\node-id.txt"
|
||
|
||
Write-Success "Keys generated"
|
||
Write-Info "Your Node ID: $nodeId"
|
||
}
|
||
|
||
function Create-WindowsService {
|
||
Write-Info "Creating Windows service..."
|
||
|
||
$serviceName = "PezkuwiValidator"
|
||
$displayName = "Pezkuwi Validator Node"
|
||
$description = "Pezkuwi blockchain validator node"
|
||
|
||
# Remove existing service if present
|
||
$existingService = Get-Service -Name $serviceName -ErrorAction SilentlyContinue
|
||
if ($existingService) {
|
||
Write-Info "Removing existing service..."
|
||
Stop-Service -Name $serviceName -Force
|
||
sc.exe delete $serviceName
|
||
Start-Sleep -Seconds 2
|
||
}
|
||
|
||
# Create batch file to run the validator
|
||
$batchFile = "$INSTALL_DIR\start-validator.bat"
|
||
@"
|
||
@echo off
|
||
cd /d "$INSTALL_DIR"
|
||
"$INSTALL_DIR\bin\pezkuwi.exe" --chain "$INSTALL_DIR\config\chain-spec.json" --base-path "$INSTALL_DIR\data" --validator --name "Validator-$env:COMPUTERNAME" --port 30333 --rpc-port 9944 --rpc-cors all --rpc-methods=unsafe
|
||
"@ | Out-File -FilePath $batchFile -Encoding ASCII
|
||
|
||
# Create service using NSSM (Non-Sucking Service Manager)
|
||
choco install nssm -y --no-progress
|
||
|
||
nssm install $serviceName "$batchFile"
|
||
nssm set $serviceName DisplayName $displayName
|
||
nssm set $serviceName Description $description
|
||
nssm set $serviceName Start SERVICE_AUTO_START
|
||
|
||
Write-Success "Windows service created"
|
||
}
|
||
|
||
function Start-Validator {
|
||
Write-Info "Starting validator..."
|
||
|
||
Start-Service -Name "PezkuwiValidator"
|
||
Start-Sleep -Seconds 3
|
||
|
||
$service = Get-Service -Name "PezkuwiValidator"
|
||
if ($service.Status -eq "Running") {
|
||
Write-Success "Validator started successfully!"
|
||
}
|
||
else {
|
||
Write-Error-Custom "Failed to start validator"
|
||
Write-Info "Check logs in Event Viewer"
|
||
exit 1
|
||
}
|
||
}
|
||
|
||
function Print-Summary {
|
||
Write-Host ""
|
||
Write-Host "=============================================" -ForegroundColor Cyan
|
||
Write-Host "🎉 Installation Complete!" -ForegroundColor Cyan
|
||
Write-Host "=============================================" -ForegroundColor Cyan
|
||
Write-Host ""
|
||
Write-Host "📍 Install Directory: $INSTALL_DIR"
|
||
Write-Host "🔑 Node ID: $(Get-Content $INSTALL_DIR\keys\node-id.txt)"
|
||
Write-Host ""
|
||
Write-Host "📊 Useful Commands:" -ForegroundColor Yellow
|
||
Write-Host " • Check status: Get-Service PezkuwiValidator"
|
||
Write-Host " • View logs: Get-EventLog -LogName Application -Source PezkuwiValidator -Newest 50"
|
||
Write-Host " • Stop node: Stop-Service PezkuwiValidator"
|
||
Write-Host " • Restart node: Restart-Service PezkuwiValidator"
|
||
Write-Host ""
|
||
Write-Host "🌐 RPC Endpoint: http://localhost:9944"
|
||
Write-Host "📡 P2P Port: 30333"
|
||
Write-Host ""
|
||
}
|
||
|
||
# Main execution
|
||
try {
|
||
Check-Requirements
|
||
Install-Dependencies
|
||
Download-Binaries
|
||
Download-ChainSpec
|
||
Generate-Keys
|
||
Create-WindowsService
|
||
Start-Validator
|
||
Print-Summary
|
||
}
|
||
catch {
|
||
Write-Error-Custom "Installation failed: $_"
|
||
exit 1
|
||
}
|