diff --git a/CHANGELOG.md b/CHANGELOG.md index dc7522a..52ab937 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,19 @@ The format is based on [Keep a Changelog][keepachangelog] and adheres to [Semant ### Deprecated ### Fixed +## [0.69.3] - 2025-11-11 + +### Added +- Added `--ignore-resource-checks` flag to the install command to skip disk, RAM, and CPU prerequisite validation. + +### Changed +\n +### Deprecated + +### Removed + +### Fixed +\n ## [0.69.2] - 2025-11-11 ### Added diff --git a/Makefile b/Makefile index 7fd8d6a..3479b83 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ test-e2e: .PHONY: build clean test run-node run-node2 run-node3 run-example deps tidy fmt vet lint clear-ports install-hooks kill -VERSION := 0.69.2 +VERSION := 0.69.3 COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown) DATE ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ) LDFLAGS := -X 'main.version=$(VERSION)' -X 'main.commit=$(COMMIT)' -X 'main.date=$(DATE)' diff --git a/pkg/cli/prod_commands.go b/pkg/cli/prod_commands.go index 165797b..9aa0370 100644 --- a/pkg/cli/prod_commands.go +++ b/pkg/cli/prod_commands.go @@ -61,6 +61,7 @@ func showProdHelp() { fmt.Printf(" --bootstrap-join ADDR - Bootstrap raft join address (for secondary bootstrap)\n") fmt.Printf(" --domain DOMAIN - Domain for HTTPS (optional)\n") fmt.Printf(" --branch BRANCH - Git branch to use (main or nightly, default: main)\n") + fmt.Printf(" --ignore-resource-checks - Skip disk/RAM/CPU prerequisite validation\n") fmt.Printf(" upgrade - Upgrade existing installation (requires root/sudo)\n") fmt.Printf(" Options:\n") fmt.Printf(" --restart - Automatically restart services after upgrade\n") @@ -101,6 +102,7 @@ func handleProdInstall(args []string) { // Parse arguments force := false isBootstrap := false + skipResourceChecks := false var vpsIP, domain, peersStr, bootstrapJoin, branch string for i, arg := range args { @@ -129,6 +131,8 @@ func handleProdInstall(args []string) { if i+1 < len(args) { branch = args[i+1] } + case "--ignore-resource-checks": + skipResourceChecks = true } } @@ -164,7 +168,7 @@ func handleProdInstall(args []string) { debrosHome := "/home/debros" debrosDir := debrosHome + "/.debros" - setup := production.NewProductionSetup(debrosHome, os.Stdout, force, branch, false) + setup := production.NewProductionSetup(debrosHome, os.Stdout, force, branch, false, skipResourceChecks) // Save branch preference for future upgrades if err := production.SaveBranchPreference(debrosDir, branch); err != nil { @@ -279,7 +283,7 @@ func handleProdUpgrade(args []string) { fmt.Printf(" This will preserve existing configurations and data\n") fmt.Printf(" Configurations will be updated to latest format\n\n") - setup := production.NewProductionSetup(debrosHome, os.Stdout, force, branch, noPull) + setup := production.NewProductionSetup(debrosHome, os.Stdout, force, branch, noPull, false) // Log if --no-pull is enabled if noPull { diff --git a/pkg/environments/production/orchestrator.go b/pkg/environments/production/orchestrator.go index 1197f4a..457d0d6 100644 --- a/pkg/environments/production/orchestrator.go +++ b/pkg/environments/production/orchestrator.go @@ -11,28 +11,29 @@ import ( // ProductionSetup orchestrates the entire production deployment type ProductionSetup struct { - osInfo *OSInfo - arch string - debrosHome string - debrosDir string - logWriter io.Writer - forceReconfigure bool - skipOptionalDeps bool - privChecker *PrivilegeChecker - osDetector *OSDetector - archDetector *ArchitectureDetector - resourceChecker *ResourceChecker - fsProvisioner *FilesystemProvisioner - userProvisioner *UserProvisioner - stateDetector *StateDetector - configGenerator *ConfigGenerator - secretGenerator *SecretGenerator - serviceGenerator *SystemdServiceGenerator - serviceController *SystemdController - binaryInstaller *BinaryInstaller - branch string - skipRepoUpdate bool - NodePeerID string // Captured during Phase3 for later display + osInfo *OSInfo + arch string + debrosHome string + debrosDir string + logWriter io.Writer + forceReconfigure bool + skipOptionalDeps bool + skipResourceChecks bool + privChecker *PrivilegeChecker + osDetector *OSDetector + archDetector *ArchitectureDetector + resourceChecker *ResourceChecker + fsProvisioner *FilesystemProvisioner + userProvisioner *UserProvisioner + stateDetector *StateDetector + configGenerator *ConfigGenerator + secretGenerator *SecretGenerator + serviceGenerator *SystemdServiceGenerator + serviceController *SystemdController + binaryInstaller *BinaryInstaller + branch string + skipRepoUpdate bool + NodePeerID string // Captured during Phase3 for later display } // ReadBranchPreference reads the stored branch preference from disk @@ -63,7 +64,7 @@ func SaveBranchPreference(debrosDir, branch string) error { } // NewProductionSetup creates a new production setup orchestrator -func NewProductionSetup(debrosHome string, logWriter io.Writer, forceReconfigure bool, branch string, skipRepoUpdate bool) *ProductionSetup { +func NewProductionSetup(debrosHome string, logWriter io.Writer, forceReconfigure bool, branch string, skipRepoUpdate bool, skipResourceChecks bool) *ProductionSetup { debrosDir := debrosHome + "/.debros" arch, _ := (&ArchitectureDetector{}).Detect() @@ -73,25 +74,26 @@ func NewProductionSetup(debrosHome string, logWriter io.Writer, forceReconfigure } return &ProductionSetup{ - debrosHome: debrosHome, - debrosDir: debrosDir, - logWriter: logWriter, - forceReconfigure: forceReconfigure, - arch: arch, - branch: branch, - skipRepoUpdate: skipRepoUpdate, - privChecker: &PrivilegeChecker{}, - osDetector: &OSDetector{}, - archDetector: &ArchitectureDetector{}, - resourceChecker: NewResourceChecker(), - fsProvisioner: NewFilesystemProvisioner(debrosHome), - userProvisioner: NewUserProvisioner("debros", debrosHome, "/bin/bash"), - stateDetector: NewStateDetector(debrosDir), - configGenerator: NewConfigGenerator(debrosDir), - secretGenerator: NewSecretGenerator(debrosDir), - serviceGenerator: NewSystemdServiceGenerator(debrosHome, debrosDir), - serviceController: NewSystemdController(), - binaryInstaller: NewBinaryInstaller(arch, logWriter), + debrosHome: debrosHome, + debrosDir: debrosDir, + logWriter: logWriter, + forceReconfigure: forceReconfigure, + arch: arch, + branch: branch, + skipRepoUpdate: skipRepoUpdate, + skipResourceChecks: skipResourceChecks, + privChecker: &PrivilegeChecker{}, + osDetector: &OSDetector{}, + archDetector: &ArchitectureDetector{}, + resourceChecker: NewResourceChecker(), + fsProvisioner: NewFilesystemProvisioner(debrosHome), + userProvisioner: NewUserProvisioner("debros", debrosHome, "/bin/bash"), + stateDetector: NewStateDetector(debrosDir), + configGenerator: NewConfigGenerator(debrosDir), + secretGenerator: NewSecretGenerator(debrosDir), + serviceGenerator: NewSystemdServiceGenerator(debrosHome, debrosDir), + serviceController: NewSystemdController(), + binaryInstaller: NewBinaryInstaller(arch, logWriter), } } @@ -157,23 +159,27 @@ func (ps *ProductionSetup) Phase1CheckPrerequisites() error { ps.logf(" ✓ Basic dependencies available") // Check system resources - if err := ps.resourceChecker.CheckDiskSpace(ps.debrosHome); err != nil { - ps.logf(" ❌ %v", err) - return err - } - ps.logf(" ✓ Sufficient disk space available") + if ps.skipResourceChecks { + ps.logf(" ⚠️ Skipping system resource checks (disk, RAM, CPU) due to --ignore-resource-checks flag") + } else { + if err := ps.resourceChecker.CheckDiskSpace(ps.debrosHome); err != nil { + ps.logf(" ❌ %v", err) + return err + } + ps.logf(" ✓ Sufficient disk space available") - if err := ps.resourceChecker.CheckRAM(); err != nil { - ps.logf(" ❌ %v", err) - return err - } - ps.logf(" ✓ Sufficient RAM available") + if err := ps.resourceChecker.CheckRAM(); err != nil { + ps.logf(" ❌ %v", err) + return err + } + ps.logf(" ✓ Sufficient RAM available") - if err := ps.resourceChecker.CheckCPU(); err != nil { - ps.logf(" ❌ %v", err) - return err + if err := ps.resourceChecker.CheckCPU(); err != nil { + ps.logf(" ❌ %v", err) + return err + } + ps.logf(" ✓ Sufficient CPU cores available") } - ps.logf(" ✓ Sufficient CPU cores available") return nil }