Files
Sankofa/docs/vm/DETAILED_VM_DEPLOYMENT_STEPS.md
defiQUG 33d50fb91e
Some checks failed
API CI / API Lint (push) Successful in 47s
API CI / API Type Check (push) Failing after 47s
API CI / API Test (push) Successful in 1m0s
API CI / API Build (push) Failing after 50s
API CI / Build Docker Image (push) Has been skipped
Build Crossplane Provider / build (push) Failing after 5m51s
CD Pipeline / Deploy to Staging (push) Failing after 29s
CI Pipeline / Lint and Type Check (push) Failing after 36s
CI Pipeline / Build (push) Has been skipped
CI Pipeline / Test Backend (push) Failing after 1m33s
CI Pipeline / Test Frontend (push) Failing after 30s
CI Pipeline / Security Scan (push) Failing after 1m16s
Crossplane Provider CI / Go Test (push) Failing after 3m23s
Crossplane Provider CI / Go Lint (push) Failing after 7m27s
Crossplane Provider CI / Go Build (push) Failing after 3m27s
Deploy to Staging / Deploy to Staging (push) Failing after 30s
Portal CI / Portal Lint (push) Failing after 21s
Portal CI / Portal Type Check (push) Failing after 21s
Portal CI / Portal Test (push) Failing after 21s
Portal CI / Portal Build (push) Failing after 22s
Test Suite / frontend-tests (push) Failing after 30s
Test Suite / api-tests (push) Failing after 49s
Test Suite / blockchain-tests (push) Failing after 30s
Type Check / type-check (map[directory:. name:root]) (push) Failing after 23s
Type Check / type-check (map[directory:api name:api]) (push) Failing after 21s
Type Check / type-check (map[directory:portal name:portal]) (push) Failing after 19s
Validate Configuration Files / validate (push) Failing after 1m52s
CD Pipeline / Deploy to Production (push) Has been skipped
chore: consolidate local WIP (repo cleanup 20260707)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-07 09:41:34 -07:00

881 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Detailed VM Deployment Steps Review
**Date**: 2025-12-13
**Status**: Comprehensive Review of All VM Deployment Steps
---
## Executive Summary
This document provides a detailed step-by-step review of the deployment process for each of the 30 VMs in the Sankofa Phoenix infrastructure. Each VM goes through a standardized deployment process with specific steps that are executed by the Crossplane Proxmox provider.
---
## VM Deployment Process Overview
### Standard Deployment Flow
For each VM, the following steps are executed in order:
1. **Reconciliation Trigger**: Kubernetes controller detects new/updated ProxmoxVM resource
2. **Validation**: Validate VM specification (name, CPU, memory, disk, network, image)
3. **Authentication**: Authenticate to Proxmox API using token or username/password
4. **Site Resolution**: Resolve site configuration from ProviderConfig
5. **Node Health Check**: Verify target Proxmox node is healthy and reachable
6. **Network Validation**: Verify network bridge exists on target node
7. **VM Creation**: Execute VM creation on Proxmox
8. **Status Update**: Update Kubernetes resource with VMID and status
9. **Monitoring**: Continue monitoring VM state and IP address
---
## Detailed Deployment Steps by VM
### Phase 1: Core Infrastructure
#### 1.1 Nginx Proxy VM
**File**: `examples/production/nginx-proxy-vm.yaml`
**Node**: ml110-01
**Site**: site-1
**Configuration**:
- CPU: 2 cores
- Memory: 4 GiB
- Disk: 20 GiB
- Storage: local-lvm
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**:
1. **Reconciliation**:
- Controller receives ProxmoxVM resource
- Validates ProviderConfigReference exists
2. **Authentication**:
- Reads credentials from `proxmox-credentials` secret
- Detects token authentication (tokenid + token)
- Creates Proxmox client with token: `root@pam!sankofa-instance-1-api-token=token`
- Uses Cookie header: `PVEAuthCookie=root@pam!sankofa-instance-1-api-token=token`
3. **Site Resolution**:
- Finds site-1 in ProviderConfig
- Endpoint: `https://192.168.11.10:8006`
- Node: `ml110-01`
4. **Node Health Check**:
- Calls: `GET /nodes/ml110-01/status`
- Verifies node is reachable and healthy
- ⚠️ **Potential Issue**: If health check fails, VM creation is delayed
5. **Network Validation**:
- Calls: `GET /nodes/ml110-01/network`
- Verifies `vmbr0` bridge exists
- ⚠️ **Potential Issue**: If bridge doesn't exist, VM creation fails
6. **VM Specification Validation**:
- Validates VM name: `nginx-proxy-vm` (1-100 chars, alphanumeric)
- Validates CPU: 2 (1-1024 range)
- Validates Memory: 4Gi (128MB-2TB range)
- Validates Disk: 20Gi (1GB-100TB range)
- Validates Network: vmbr0 (valid bridge name)
- Validates Image: `local:iso/ubuntu-22.04-cloud.img` (must exist in storage)
7. **Image Resolution**:
- Searches for image in Proxmox storage
- Looks for `ubuntu-22.04-cloud.img` in storage pools
- Expected volid: `local:iso/ubuntu-22.04-cloud.img`
- ⚠️ **Critical**: If image not found, VM creation fails
8. **VMID Assignment**:
- Calls: `GET /cluster/nextid`
- Gets next available VMID (e.g., 100, 101, 102...)
- VMID assigned: `<next-available-id>`
9. **VM Configuration Creation**:
- Creates VM config with:
- `vmid`: Assigned VMID
- `name`: nginx-proxy-vm
- `cores`: 2
- `memory`: 4096 (4Gi in MB)
- `net0`: `virtio,bridge=vmbr0`
- `scsi0`: `local-lvm:20,format=qcow2` (for cloud image import)
- `ostype`: l26 (Linux 2.6+)
- `agent`: 1 (QEMU guest agent enabled)
- `boot`: `order=scsi0`
10. **Cloud-init Configuration**:
- Adds cloud-init drive: `ide2=local-lvm:cloudinit`
- Sets cloud-init user: `ciuser=admin`
- Sets network config: `ipconfig0=ip=dhcp`
- Writes userData to cloud-init drive
11. **VM Creation**:
- Calls: `POST /nodes/ml110-01/qemu`
- Creates VM with configuration
- Returns: VMID if successful
12. **Image Import** (if needed):
- If image is `.img` or `.qcow2`:
- Stops VM (if running)
- Calls: `POST /nodes/ml110-01/qemu/{vmid}/importdisk`
- Imports image from `local:iso/ubuntu-22.04-cloud.img`
- Waits for import to complete (with timeout)
- ⚠️ **Critical**: If importdisk fails, VM is cleaned up
13. **Status Update**:
- Updates ProxmoxVM status:
- `vmId`: Assigned VMID
- `state`: "created"
- `conditions`: Ready=True
- Requeues for status monitoring (10 seconds)
14. **VM State Monitoring**:
- Subsequent reconciles check VM state
- Calls: `GET /nodes/ml110-01/qemu/{vmid}/status/current`
- Updates status.state (running, stopped, etc.)
- Retrieves IP address from QEMU guest agent
**Expected Timeline**: 2-5 minutes
**Dependencies**: None
**Potential Issues**:
- Image not found in storage
- Network bridge doesn't exist
- Node health check fails
- Importdisk API not supported (Proxmox version)
---
#### 1.2 Cloudflare Tunnel VM
**File**: `examples/production/cloudflare-tunnel-vm.yaml`
**Node**: r630-01
**Site**: site-2
**Configuration**:
- CPU: 2 cores
- Memory: 4 GiB
- Disk: 10 GiB
- Storage: local-lvm
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**: Same as Nginx Proxy VM, but:
- Target node: r630-01
- Endpoint: `https://192.168.11.11:8006`
- Disk: 10 GiB (smaller)
- ⚠️ **Note**: Uses local-lvm on R630-01 (limited to 171.3 GB)
**Expected Timeline**: 2-5 minutes
**Dependencies**: None
---
### Phase 2: Phoenix Infrastructure
#### 2.1 DNS Primary
**File**: `examples/production/phoenix/dns-primary.yaml`
**Node**: ml110-01
**Site**: site-1
**Configuration**:
- CPU: 2 cores (reduced from 4)
- Memory: 4 GiB (reduced from 8Gi)
- Disk: 50 GiB
- Storage: local-lvm
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**: Standard process
**Expected Timeline**: 2-5 minutes
**Dependencies**: None (but other services may depend on DNS)
---
#### 2.2 Git Server
**File**: `examples/production/phoenix/git-server.yaml`
**Node**: r630-01 (moved from ml110-01)
**Site**: site-2
**Configuration**:
- CPU: 4 cores (reduced from 8)
- Memory: 16 GiB
- Disk: 500 GiB (large disk)
- Storage: ceph-fs (changed from local-lvm)
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**: Standard process, but:
- ⚠️ **Large Disk**: 500 GiB requires Ceph storage
- ⚠️ **Storage Check**: Verifies ceph-fs storage exists
- ⚠️ **Image Import**: Large image import may take longer
**Expected Timeline**: 5-10 minutes (due to large disk)
**Dependencies**: None
**Optimization Notes**:
- Moved to R630-01 for better CPU resources
- Using ceph-fs for large disk (avoids local-lvm constraint)
---
#### 2.3 Email Server
**File**: `examples/production/phoenix/email-server.yaml`
**Node**: r630-01 (moved from ml110-01)
**Site**: site-2
**Configuration**:
- CPU: 4 cores (reduced from 8)
- Memory: 16 GiB
- Disk: 200 GiB
- Storage: ceph-fs (changed from local-lvm)
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**: Standard process
**Expected Timeline**: 3-7 minutes
**Dependencies**: None
---
#### 2.4 DevOps Runner
**File**: `examples/production/phoenix/devops-runner.yaml`
**Node**: r630-01 (moved from ml110-01)
**Site**: site-2
**Configuration**:
- CPU: 4 cores (reduced from 8)
- Memory: 16 GiB
- Disk: 200 GiB
- Storage: ceph-fs (changed from local-lvm)
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**: Standard process
**Expected Timeline**: 3-7 minutes
**Dependencies**: None
---
#### 2.5 Codespaces IDE
**File**: `examples/production/phoenix/codespaces-ide.yaml`
**Node**: r630-01 (moved from ml110-01)
**Site**: site-2
**Configuration**:
- CPU: 4 cores (reduced from 8)
- Memory: 32 GiB (reduced from 32Gi, unchanged)
- Disk: 200 GiB
- Storage: ceph-fs (changed from local-lvm)
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**: Standard process
**Expected Timeline**: 3-7 minutes
**Dependencies**: None
**Note**: High memory requirement (32 GiB)
---
#### 2.6 AS4 Gateway
**File**: `examples/production/phoenix/as4-gateway.yaml`
**Node**: r630-01 (moved from ml110-01)
**Site**: site-2
**Configuration**:
- CPU: 4 cores (reduced from 8)
- Memory: 16 GiB
- Disk: 500 GiB (large disk)
- Storage: ceph-fs (changed from local-lvm)
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**: Standard process
**Expected Timeline**: 5-10 minutes (due to large disk)
**Dependencies**: None
---
#### 2.7 Business Integration Gateway
**File**: `examples/production/phoenix/business-integration-gateway.yaml`
**Node**: r630-01 (moved from ml110-01)
**Site**: site-2
**Configuration**:
- CPU: 4 cores (reduced from 8)
- Memory: 16 GiB
- Disk: 200 GiB
- Storage: ceph-fs (changed from local-lvm)
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**: Standard process
**Expected Timeline**: 3-7 minutes
**Dependencies**: None
---
#### 2.8 Financial Messaging Gateway
**File**: `examples/production/phoenix/financial-messaging-gateway.yaml`
**Node**: r630-01 (moved from ml110-01)
**Site**: site-2
**Configuration**:
- CPU: 4 cores (reduced from 8)
- Memory: 16 GiB
- Disk: 500 GiB (large disk)
- Storage: ceph-fs (changed from local-lvm)
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**: Standard process
**Expected Timeline**: 5-10 minutes (due to large disk)
**Dependencies**: None
---
### Phase 3: Blockchain Infrastructure
#### 3.1 Validators (4x)
**Files**:
- `examples/production/smom-dbis-138/validator-01.yaml`
- `examples/production/smom-dbis-138/validator-02.yaml`
- `examples/production/smom-dbis-138/validator-03.yaml`
- `examples/production/smom-dbis-138/validator-04.yaml`
**Node**: r630-01 (moved from ml110-01)
**Site**: site-2
**Configuration** (per validator):
- CPU: 3 cores (reduced from 6)
- Memory: 12 GiB (reduced from 12Gi, unchanged)
- Disk: 20 GiB
- Storage: ceph-fs (changed from local-lvm)
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**: Standard process for each validator
**Expected Timeline**: 2-5 minutes per validator (8-20 minutes total)
**Dependencies**: None (but validators should be deployed together)
**Total Resources**:
- CPU: 12 cores (4 × 3)
- Memory: 48 GiB (4 × 12 GiB)
- Disk: 80 GiB (4 × 20 GiB)
---
#### 3.2 Sentries (4x)
**Files**:
- `examples/production/smom-dbis-138/sentry-01.yaml` (ml110-01)
- `examples/production/smom-dbis-138/sentry-02.yaml` (ml110-01)
- `examples/production/smom-dbis-138/sentry-03.yaml` (r630-01)
- `examples/production/smom-dbis-138/sentry-04.yaml` (r630-01)
**Configuration** (per sentry):
- CPU: 2 cores (reduced from 4)
- Memory: 4 GiB (reduced from 8Gi)
- Disk: 20 GiB
- Storage: local-lvm (sentries 01-02), ceph-fs (sentries 03-04)
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**: Standard process
**Expected Timeline**: 2-5 minutes per sentry
**Dependencies**: None
**Total Resources**:
- ML110-01: 4 CPU, 8 GiB RAM, 40 GiB disk
- R630-01: 4 CPU, 8 GiB RAM, 40 GiB disk
---
#### 3.3 RPC Nodes (4x)
**Files**:
- `examples/production/smom-dbis-138/rpc-node-01.yaml`
- `examples/production/smom-dbis-138/rpc-node-02.yaml`
- `examples/production/smom-dbis-138/rpc-node-03.yaml`
- `examples/production/smom-dbis-138/rpc-node-04.yaml`
**Node**: r630-01
**Site**: site-2
**Configuration** (per RPC node):
- CPU: 2 cores (reduced from 4)
- Memory: 4 GiB (reduced from 8Gi)
- Disk: 20 GiB
- Storage: ceph-fs (changed from local-lvm)
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**: Standard process
**Expected Timeline**: 2-5 minutes per node (8-20 minutes total)
**Dependencies**: None
**Total Resources**:
- CPU: 8 cores (4 × 2)
- Memory: 16 GiB (4 × 4 GiB)
- Disk: 80 GiB (4 × 20 GiB)
---
#### 3.4 Services (4x)
**Files**:
- `examples/production/smom-dbis-138/management.yaml`
- `examples/production/smom-dbis-138/monitoring.yaml`
- `examples/production/smom-dbis-138/services.yaml`
- `examples/production/smom-dbis-138/blockscout.yaml`
**Node**: r630-01
**Site**: site-2
**Configuration** (per service):
- CPU: 2 cores (reduced from 4)
- Memory: 4 GiB (reduced from 8Gi)
- Disk: 20 GiB
- Storage: ceph-fs (changed from local-lvm)
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**: Standard process
**Expected Timeline**: 2-5 minutes per service (8-20 minutes total)
**Dependencies**: None
**Total Resources**:
- CPU: 8 cores (4 × 2)
- Memory: 16 GiB (4 × 4 GiB)
- Disk: 80 GiB (4 × 20 GiB)
---
### Phase 4: Test/Example VMs
#### 4.1 Basic VM
**File**: `examples/production/basic-vm.yaml`
**Node**: ml110-01
**Site**: site-1
**Configuration**:
- CPU: 2 cores
- Memory: 4 GiB
- Disk: 50 GiB
- Storage: local-lvm
- Network: vmbr0
- Image: local:iso/ubuntu-22.04-cloud.img
- Cloud-init: ✅ Configured
**Deployment Steps**: Standard process
**Expected Timeline**: 2-5 minutes
**Priority**: LOW (test VM)
---
#### 4.2 VM-100
**File**: `examples/production/vm-100.yaml`
**Node**: ml110-01
**Site**: site-1
**Configuration**: Similar to basic-vm
**Deployment Steps**: Standard process
**Expected Timeline**: 2-5 minutes
**Priority**: LOW (test VM)
---
#### 4.3 Medium VM
**File**: `examples/production/medium-vm.yaml`
**Status**: ⚠️ Error reading configuration
**Issue**: YAML file may have syntax errors or missing fields
**Action Required**: Review and fix YAML file
---
#### 4.4 Large VM
**File**: `examples/production/large-vm.yaml`
**Status**: ⚠️ Error reading configuration
**Issue**: YAML file may have syntax errors or missing fields
**Action Required**: Review and fix YAML file
---
#### 4.5 Blockscout
**File**: `examples/production/smom-dbis-138/blockscout.yaml`
**Status**: ⚠️ Error reading configuration
**Issue**: YAML file may have syntax errors or missing fields
**Action Required**: Review and fix YAML file
---
## Detailed Deployment Process Flow
### Step-by-Step Execution
For each VM, the controller executes these steps in sequence:
#### Step 1: Resource Validation
```go
// Validate VM name (1-100 chars, alphanumeric + hyphens/underscores)
utils.ValidateVMName(vm.Spec.ForProvider.Name)
// Validate CPU (1-1024)
utils.ValidateCPU(vm.Spec.ForProvider.CPU)
// Validate Memory (128MB-2TB, supports Gi/Mi/Ki)
utils.ValidateMemory(vm.Spec.ForProvider.Memory)
// Validate Disk (1GB-100TB, supports Ti/Gi/Mi)
utils.ValidateDisk(vm.Spec.ForProvider.Disk)
// Validate Network bridge name
utils.ValidateNetworkBridge(vm.Spec.ForProvider.Network)
// Validate Image specification
utils.ValidateImageSpec(vm.Spec.ForProvider.Image)
```
#### Step 2: Authentication
```go
// Read credentials from secret
creds := getCredentials(providerConfig)
// Create Proxmox client
if creds.Token != "" {
// Token authentication
token := fmt.Sprintf("%s=%s", creds.Username, creds.Token)
client := NewClientWithToken(endpoint, token, insecureSkipTLS)
} else {
// Username/password authentication
client := NewClient(endpoint, username, password, insecureSkipTLS)
}
```
#### Step 3: Node Health Check
```go
// Check node is reachable and healthy
client.CheckNodeHealth(ctx, node)
// Calls: GET /nodes/{node}/status
```
#### Step 4: Network Validation
```go
// Verify network bridge exists
client.NetworkExists(ctx, node, network)
// Calls: GET /nodes/{node}/network
// Searches for bridge in network list
```
#### Step 5: VMID Assignment
```go
// Get next available VMID
client.Get(ctx, "/cluster/nextid")
// Returns: Next available VMID (e.g., "100", "101")
```
#### Step 6: Image Resolution
```go
// Search for image in storage
if image contains ":" {
// Already a volid (storage:path)
imageVolid = image
} else {
// Search storage pools
client.findImageInStorage(ctx, node, image)
// Searches all storages for matching image
}
```
#### Step 7: VM Configuration
```go
vmConfig := {
"vmid": vmID,
"name": vmName,
"cores": cpu,
"memory": parseMemory(memory), // Convert to MB
"net0": fmt.Sprintf("virtio,bridge=%s", network),
"scsi0": diskConfig, // Format: storage:size,format=qcow2
"ostype": "l26",
"agent": "1",
"boot": "order=scsi0"
}
// Add cloud-init if userData provided
if userData != "" {
vmConfig["ide2"] = fmt.Sprintf("%s:cloudinit", storage)
vmConfig["ciuser"] = "admin"
vmConfig["ipconfig0"] = "ip=dhcp"
}
```
#### Step 8: VM Creation
```go
// Create VM on Proxmox
client.Post(ctx, fmt.Sprintf("/nodes/%s/qemu", node), vmConfig)
// Calls: POST /nodes/{node}/qemu
// Returns: VMID if successful
```
#### Step 9: Image Import (if needed)
```go
if needsImageImport && imageVolid != "" {
// Stop VM if running
client.Post(ctx, fmt.Sprintf("/nodes/%s/qemu/%d/status/stop", node, vmID))
// Wait for VM to stop (up to 30 seconds)
waitForVMStop(ctx, node, vmID, 30*time.Second)
// Import image
client.Post(ctx, fmt.Sprintf("/nodes/%s/qemu/%d/importdisk", node, vmID), {
"storage": storageName,
"filename": imagePath,
"format": "qcow2"
})
// Monitor import task until completion
monitorTask(ctx, taskID, timeout)
}
```
#### Step 10: Status Update
```go
// Update ProxmoxVM status
vm.Status.VMID = createdVM.ID
vm.Status.State = "created"
vm.Status.Conditions = append(conditions, {
Type: "Ready",
Status: "True",
Reason: "Created",
Message: fmt.Sprintf("VM %d created successfully", vmID)
})
// Update Kubernetes resource
r.Status().Update(ctx, &vm)
// Requeue for monitoring (10 seconds)
return ctrl.Result{RequeueAfter: 10 * time.Second}, nil
```
#### Step 11: State Monitoring
```go
// Subsequent reconciles check VM state
client.Get(ctx, fmt.Sprintf("/nodes/%s/qemu/%d/status/current", node, vmID))
// Updates: vm.Status.State (running, stopped, etc.)
// Get IP address from QEMU guest agent
client.Get(ctx, fmt.Sprintf("/nodes/%s/qemu/%d/agent/network-get-interfaces", node, vmID))
// Updates: vm.Status.IPAddress
```
---
## Potential Issues and Mitigations
### Issue 1: Image Not Found
**Symptom**: Error "image 'X' not found in storage"
**Cause**: Image not uploaded to Proxmox storage
**Mitigation**:
- Verify image exists: `./scripts/verify-image-availability.sh`
- Upload image if missing
- Provider will retry automatically
### Issue 2: Network Bridge Missing
**Symptom**: Error "network bridge 'X' does not exist"
**Cause**: Network bridge not configured on Proxmox node
**Mitigation**:
- Verify bridge exists: Check Proxmox network configuration
- Create bridge if missing
- Provider will fail fast (no retry)
### Issue 3: Node Health Check Fails
**Symptom**: Error "node X is not reachable or unhealthy"
**Cause**: Node down, network issue, or authentication failure
**Mitigation**:
- Check node status on Proxmox
- Verify network connectivity
- Check authentication credentials
- Provider retries with exponential backoff
### Issue 4: Importdisk Not Supported
**Symptom**: Error "importdisk API not supported"
**Cause**: Proxmox version too old (< 6.2)
**Mitigation**:
- Upgrade Proxmox to 6.2+
- Or use template-based deployment instead
- Provider detects and cleans up VM
### Issue 5: Resource Exhaustion
**Symptom**: Error "insufficient resources"
**Cause**: Node out of CPU/RAM/disk
**Mitigation**:
- Check resource usage: `./scripts/check-proxmox-quota-ssh.sh`
- Free up resources or move VMs
- Provider will retry (may succeed if resources freed)
### Issue 6: Storage Full
**Symptom**: Error "storage full" or "disk creation failed"
**Cause**: Storage pool out of space
**Mitigation**:
- Check storage usage on Proxmox
- Free up space or expand storage
- Consider using Ceph for large disks
---
## Deployment Order Recommendations
### Critical Path (Must Deploy First)
1. Nginx Proxy VM (ML110-01)
2. Cloudflare Tunnel VM (R630-01)
3. DNS Primary (ML110-01)
### High Priority (Deploy After Core)
4. Git Server (R630-01)
5. Email Server (R630-01)
6. DevOps Runner (R630-01)
### Medium Priority
7. Codespaces IDE (R630-01)
8. AS4 Gateway (R630-01)
9. Business Integration Gateway (R630-01)
10. Financial Messaging Gateway (R630-01)
### Blockchain Infrastructure
11. Validators (4x) - Deploy together
12. Sentries (4x) - Deploy together
13. RPC Nodes (4x) - Deploy together
14. Services (4x) - Deploy together
### Low Priority (Test VMs)
15. Test/Example VMs (deploy only if resources allow)
---
## Resource Allocation Summary
### ML110-01 (Site-1)
- **VMs**: 6
- **Total CPU**: 6 cores (slightly exceeds 5 available)
- **Total RAM**: 12 GiB
- **Total Disk**: 90 GiB (local-lvm)
### R630-01 (Site-2)
- **VMs**: 21
- **Total CPU**: 54 cores (slightly exceeds 50 available)
- **Total RAM**: 212 GiB
- **Total Disk**: 2,440 GiB (using ceph-fs)
---
## Monitoring and Verification
### Real-Time Monitoring
```bash
# Watch all VMs
kubectl get proxmoxvm -A -w
# Check specific VM
kubectl describe proxmoxvm <vm-name>
# View provider logs
kubectl logs -n crossplane-system -l app=crossplane-provider-proxmox -f
```
### Verification Commands
```bash
# Check VM status
kubectl get proxmoxvm -A -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.vmId}{"\t"}{.status.state}{"\n"}{end}'
# Verify on Proxmox
./scripts/ssh-ml110-01.sh 'qm list'
./scripts/ssh-r630-01.sh 'qm list'
```
---
## Summary
**Total VMs**: 30
**Production VMs**: 25
**Test VMs**: 5
**Deployment Method**: Crossplane Proxmox Provider
**Authentication**: Token-based (Cookie header)
**Expected Timeline**: 30-60 minutes for all VMs
**Status**: ✅ All configurations reviewed, deployment ready
---
**Last Updated**: 2025-12-13
**Status**: ✅ **COMPREHENSIVE REVIEW COMPLETE**