| name | admin-devops |
| description | Infrastructure management using the device profile. Servers are stored in profile.servers[], deployments reference .env.local files via profile.deployments{}. Use when: managing server inventory, provisioning infrastructure, deploying to cloud providers. |
| license | MIT |
DevOps Administration
Purpose: Coordinate server provisioning and deployment across admin-infra-* and admin-app-* skills using the unified profile.
Profile-First Approach
Servers are in the profile, not a separate inventory file.
# PowerShell
. scripts/Load-Profile.ps1
Load-AdminProfile -Export
$AdminProfile.servers | Format-Table id, name, host, role, provider, status
# Bash
source scripts/load-profile.sh
load_admin_profile
jq '.servers[] | {id, name, host, role, provider, status}' "$ADMIN_PROFILE_PATH"
Server Operations
List All Servers
Get-AdminServer | Format-Table
get_admin_server all ""
Filter by Role
Get-AdminServer -Role "coolify"
get_admin_server role "coolify"
Filter by Provider
Get-AdminServer -Provider "contabo"
get_admin_server provider "contabo"
Get Specific Server
Get-AdminServer -Id "cool-two"
get_admin_server id "cool-two"
SSH to Server
Profile contains all SSH details:
$server = Get-AdminServer -Id "cool-two"
ssh -i $server.keyPath -p $server.port "$($server.username)@$($server.host)"
ssh_to_server "cool-two" # Helper from load-profile.sh
Add New Server
After Provisioning
$AdminProfile.servers += @{
id = "new-server"
name = "NEW_SERVER"
host = "192.168.1.100"
port = 22
username = "root"
authMethod = "key"
keyPath = "C:/Users/Owner/.ssh/id_rsa"
provider = "hetzner"
role = "coolify"
domain = "example.com"
status = "active"
addedAt = (Get-Date).ToString("o")
lastConnected = $null
notes = "Provisioned via admin-infra-hetzner"
}
# Save
$AdminProfile | ConvertTo-Json -Depth 10 | Set-Content $AdminProfile.paths.deviceProfile
Deployments
Deployments reference .env.local files containing provider credentials and config.
List Deployments
$AdminProfile.deployments.PSObject.Properties | ForEach-Object {
[PSCustomObject]@{
Name = $_.Name
Type = $_.Value.type
Provider = $_.Value.provider
Status = $_.Value.status
HasEnvFile = [bool]$_.Value.envFile
}
}
Load Deployment Config
Load-AdminProfile -Deployment "vibeskills-oci" -Export
$DeploymentEnv # Contains .env.local variables
load_admin_profile
load_deployment "vibeskills-oci"
# Variables exported to environment
Add New Deployment
$AdminProfile.deployments["my-new-deploy"] = @{
envFile = "D:/projects/my-deploy/.env.local"
type = "coolify"
provider = "hetzner"
status = "pending"
serverIds = @("new-server")
lastDeployed = $null
notes = $null
}
Provisioning Workflow
Step 1: Choose Provider
| Provider | Skill | Notes |
|---|---|---|
| OCI | admin-infra-oci |
Free tier ARM |
| Hetzner | admin-infra-hetzner |
Best price/perf |
| Contabo | admin-infra-contabo |
Budget VPS |
| DigitalOcean | admin-infra-digitalocean |
Simple |
| Vultr | admin-infra-vultr |
Global |
| Linode | admin-infra-linode |
Akamai |
Step 2: Create .env.local
Copy template and fill provider section:
cp templates/env-template.env ./my-deploy/.env.local
# Edit with provider credentials
Step 3: Register Deployment
$AdminProfile.deployments["my-deploy"] = @{
envFile = "D:/projects/my-deploy/.env.local"
type = "coolify"
provider = "hetzner"
status = "pending"
serverIds = @()
}
Step 4: Run Infrastructure Skill
# Route to appropriate skill
admin-infra-hetzner → Provisions server
# Returns server details
Step 5: Update Profile
# Add server
$AdminProfile.servers += @{ ... }
# Link to deployment
$AdminProfile.deployments["my-deploy"].serverIds += "new-server-id"
$AdminProfile.deployments["my-deploy"].status = "active"
# Save
$AdminProfile | ConvertTo-Json -Depth 10 | Set-Content $AdminProfile.paths.deviceProfile
Application Deployment
After Infrastructure Ready
| App | Skill | Prerequisites |
|---|---|---|
| Coolify | admin-app-coolify |
Server with Docker |
| KASM | admin-app-kasm |
Server with Docker |
Workflow
- Load deployment:
Load-AdminProfile -Deployment "my-deploy" -Export - Get server:
$server = Get-AdminServer -Id $DeploymentEnv.SERVER_ID - SSH and deploy via
admin-app-*skill
Status Updates
# Find server
$idx = $AdminProfile.servers.FindIndex({ param($s) $s.id -eq "cool-two" })
# Update status
$AdminProfile.servers[$idx].status = "stopped"
$AdminProfile.servers[$idx].lastConnected = (Get-Date).ToString("o")
# Save
$AdminProfile | ConvertTo-Json -Depth 10 | Set-Content $AdminProfile.paths.deviceProfile
Routing Summary
| Task | Route To |
|---|---|
| Provision OCI | admin-infra-oci |
| Provision Hetzner | admin-infra-hetzner |
| Provision others | admin-infra-{provider} |
| Install Coolify | admin-app-coolify |
| Install KASM | admin-app-kasm |
| Windows tasks | admin-windows |
| WSL tasks | admin-wsl |
References
references/DEPLOYMENT_WORKFLOWS.md- Detailed deployment stepsreferences/TROUBLESHOOTING.md- Common issues