admin-infra-linode
Deploys infrastructure on Linode (Akamai Cloud) with Linodes, Firewalls, and VLANs.Strong Kubernetes support with Cluster Autoscaler and Akamai edge network integration.Use when: setting up Linode/Akamai infrastructure, deploying Linodes, configuring firewalls, needing Kubernetes autoscaling, wanting Akamai CDN integration.Keywords: linode, akamai, linode-cli, VPS, dedicated CPU, firewall, VLAN, kubernetes autoscale, infrastructure
When & Why to Use This Skill
This Claude skill automates the deployment and management of cloud infrastructure on Linode (Akamai Cloud). It enables users to provision virtual private servers (Linodes), configure secure firewalls, and set up VLANs using the Linode CLI. With built-in support for Kubernetes (LKE) and cluster autoscaling, it streamlines the setup of production-ready environments for applications like Coolify and Kasm, ensuring high performance and cost-efficiency through standardized server profiles.
Use Cases
- Rapidly deploying optimized VPS instances for hosting self-hosted platforms like Coolify or Kasm with pre-configured resource tiers.
- Automating the creation of secure network environments by provisioning Linode Firewalls with custom inbound/outbound rules and VLANs.
- Setting up scalable Kubernetes clusters (LKE) that leverage the Akamai edge network and Cluster Autoscaler for dynamic workload management.
- Streamlining DevOps infrastructure-as-code workflows by using standardized CLI commands to manage the entire lifecycle of cloud resources from provisioning to cleanup.
| name | admin-infra-linode |
|---|---|
| description | | |
| Use when | setting up Linode/Akamai infrastructure, deploying Linodes, configuring firewalls, needing Kubernetes autoscaling, wanting Akamai CDN integration. |
| Keywords | linode, akamai, linode-cli, VPS, dedicated CPU, firewall, VLAN, kubernetes autoscale, infrastructure |
| license | MIT |
Linode Infrastructure
Status: Production Ready | Dependencies: linode-cli, SSH key pair
Navigation
- Operations, troubleshooting, config, and cost snapshot:
references/OPERATIONS.md
Step 0: Gather Required Information (MANDATORY)
STOP. Before ANY deployment commands, collect ALL parameters from the user.
Copy this checklist and confirm each item:
Required Parameters:
- [ ] SERVER_NAME - Unique name for this server
- [ ] LINODE_REGION - Region (us-east, us-central, us-west, eu-west, ap-south, etc.)
- [ ] LINODE_TYPE - Linode type (see profiles below)
- [ ] SSH_KEY_LABEL - Label of SSH key in Linode
- [ ] SSH_KEY_PATH - Path to local SSH private key (default: ~/.ssh/id_rsa)
Deployment Purpose (determines recommended profile):
- [ ] Purpose: coolify / kasm / both / custom
coolify → g6-standard-2 ($36/mo)
kasm → g6-standard-4 ($72/mo)
both → g6-standard-8 ($144/mo)
custom → Ask for specific type
Recommended profiles by purpose:
| Purpose | Type | vCPU | RAM | Monthly |
|---|---|---|---|---|
| coolify | g6-standard-2 | 2 | 4GB | $36 |
| kasm | g6-standard-4 | 4 | 8GB | $72 |
| both | g6-standard-8 | 8 | 16GB | $144 |
DO NOT proceed to Prerequisites until ALL parameters are confirmed.
Prerequisites
Before using this skill, verify the following:
1. Linode CLI Installed
linode-cli --version
If missing, install with:
# Python (pip) - Recommended
pip3 install linode-cli
# macOS (Homebrew)
brew install linode-cli
# Linux (pipx)
pipx install linode-cli
2. Linode Account & API Token
If you don't have a Linode account:
Sign up at: https://www.linode.com/?r=YOUR_REFERRAL_CODE
Disclosure: This is a referral link. You'll receive $100 in credit for 60 days, and the skill author receives $25 account credit after you spend $25. Using this link helps support the development of these skills.
Get API Token: https://cloud.linode.com/profile/tokens
Create a Personal Access Token with Read/Write access for Linodes, Firewalls, NodeBalancers, etc.
3. linode-cli Configured
linode-cli account view
If it shows an error, configure with:
# Interactive setup
linode-cli configure
# Or via environment variable
export LINODE_CLI_TOKEN="your_token_here"
linode-cli account view
4. SSH Key Pair
ls ~/.ssh/id_rsa.pub
If missing, generate with:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
5. SSH Key Uploaded to Linode
linode-cli sshkeys list
If empty, upload with:
linode-cli sshkeys create --label "my-key" --ssh_key "$(cat ~/.ssh/id_rsa.pub)"
6. Test Authentication
linode-cli regions list
If this fails: Token may be invalid or expired. Create a new one.
Server Profiles
Coolify/Kasm Deployments
| Profile | Linode Type | vCPU | RAM | Disk | Monthly Cost |
|---|---|---|---|---|---|
coolify |
g6-standard-2 | 2 | 4GB | 80GB | $36 |
kasm |
g6-standard-4 | 4 | 8GB | 160GB | $72 |
both |
g6-standard-8 | 8 | 16GB | 320GB | $144 |
Dedicated CPU (Best Performance)
| Profile | Linode Type | vCPU | RAM | Disk | Monthly Cost |
|---|---|---|---|---|---|
dedicated-small |
g6-dedicated-2 | 2 | 4GB | 80GB | $36 |
dedicated-medium |
g6-dedicated-4 | 4 | 8GB | 160GB | $72 |
dedicated-large |
g6-dedicated-8 | 8 | 16GB | 320GB | $144 |
Premium Plans (Higher Performance)
| Linode Type | vCPU | RAM | Disk | Monthly Cost |
|---|---|---|---|---|
| g7-premium-2 | 2 | 4GB | 100GB | $43 |
| g7-premium-4 | 4 | 8GB | 200GB | $86 |
| g7-premium-8 | 8 | 16GB | 400GB | $172 |
Deployment Steps
Step 1: Set Environment Variables
export LINODE_REGION="us-east" # See regions below
export LINODE_TYPE="g6-standard-2" # See profiles above
export LINODE_IMAGE="linode/ubuntu22.04"
export SERVER_NAME="my-server"
export SSH_KEY_LABEL="my-key"
Region options
| Code | Location | Region |
|---|---|---|
us-east |
Newark, NJ | US East |
us-central |
Dallas, TX | US Central |
us-west |
Fremont, CA | US West |
us-southeast |
Atlanta, GA | US Southeast |
us-ord |
Chicago, IL | US Central |
us-lax |
Los Angeles, CA | US West |
us-mia |
Miami, FL | US Southeast |
us-sea |
Seattle, WA | US Northwest |
ca-central |
Toronto, Canada | Canada |
eu-west |
London, UK | UK |
eu-central |
Frankfurt, Germany | Germany |
ap-south |
Singapore | Asia |
ap-northeast |
Tokyo, Japan | Japan |
ap-west |
Mumbai, India | India |
ap-southeast |
Sydney, Australia | Australia |
Run linode-cli regions list for full list.
Step 2: Get SSH Key ID
SSH_KEY_ID=$(linode-cli sshkeys list --label "$SSH_KEY_LABEL" --format id --text --no-headers)
echo "SSH Key ID: $SSH_KEY_ID"
# Verify
if [ -z "$SSH_KEY_ID" ]; then
echo "ERROR: SSH key '$SSH_KEY_LABEL' not found. Upload it first."
exit 1
fi
Step 3: Create Firewall
# Create firewall
FIREWALL_ID=$(linode-cli firewalls create \
--label "my-firewall" \
--rules.inbound_policy DROP \
--rules.outbound_policy ACCEPT \
--format id --text --no-headers)
echo "Firewall ID: $FIREWALL_ID"
# Allow SSH
linode-cli firewalls rules-update "$FIREWALL_ID" \
--inbound '[
{"protocol":"TCP","ports":"22","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"},
{"protocol":"TCP","ports":"80","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"},
{"protocol":"TCP","ports":"443","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"},
{"protocol":"TCP","ports":"8000","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"},
{"protocol":"TCP","ports":"6001-6002","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"},
{"protocol":"TCP","ports":"8443","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"},
{"protocol":"TCP","ports":"3389","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"},
{"protocol":"TCP","ports":"3000-4000","addresses":{"ipv4":["0.0.0.0/0"],"ipv6":["::/0"]},"action":"ACCEPT"}
]' \
--inbound_policy DROP \
--outbound_policy ACCEPT
Step 4: Create Linode
LINODE_ID=$(linode-cli linodes create \
--region "$LINODE_REGION" \
--type "$LINODE_TYPE" \
--image "$LINODE_IMAGE" \
--label "$SERVER_NAME" \
--authorized_keys "$(cat ~/.ssh/id_rsa.pub)" \
--root_pass "$(openssl rand -base64 32)" \
--format id --text --no-headers)
echo "Linode ID: $LINODE_ID"
Step 5: Apply Firewall to Linode
linode-cli firewalls device-create "$FIREWALL_ID" \
--type linode \
--id "$LINODE_ID"
Step 6: Wait and Get Linode IP
# Wait for Linode to be running
echo "Waiting for Linode to be running..."
while [ "$(linode-cli linodes view "$LINODE_ID" --format status --text --no-headers)" != "running" ]; do
sleep 5
done
# Get IP address
SERVER_IP=$(linode-cli linodes view "$LINODE_ID" --format ipv4 --text --no-headers | head -1)
echo "SERVER_IP=$SERVER_IP"
Step 7: Wait for Server Ready
# Wait for SSH to be available (typically 60-90 seconds)
echo "Waiting for server to be ready..."
until ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@$SERVER_IP "echo connected" 2>/dev/null; do
sleep 5
done
echo "Server is ready!"
Step 8: Verify Connection
ssh root@$SERVER_IP "uname -a && free -h && df -h /"
Step 9: Output for Downstream Skills
# Linode only offers x86 architecture
SERVER_ARCH="amd64"
# Save to .env.local for downstream skills
echo "SERVER_IP=$SERVER_IP" >> .env.local
echo "SSH_USER=root" >> .env.local
echo "SSH_KEY_PATH=~/.ssh/id_rsa" >> .env.local
echo "SERVER_ARCH=$SERVER_ARCH" >> .env.local
echo "COOLIFY_SERVER_IP=$SERVER_IP" >> .env.local
echo "KASM_SERVER_IP=$SERVER_IP" >> .env.local
echo ""
echo "Linode deployed successfully!"
echo " IP: $SERVER_IP"
echo " Arch: $SERVER_ARCH"
echo " SSH: ssh root@$SERVER_IP"
Verify Deployment
ssh root@$SERVER_IP "echo 'Linode connected successfully'"
Kubernetes Auto-Scaling
Linode Kubernetes Engine (LKE) supports Cluster Autoscaler for automatic node scaling.
Create LKE Cluster
# Create cluster (via API - CLI doesn't support all options)
linode-cli lke cluster-create \
--label "my-lke" \
--region "$LINODE_REGION" \
--k8s_version "1.28"
Enable Cluster Autoscaler
The Cluster Autoscaler runs in the management cluster and scales based on workload:
- Install Cluster Autoscaler add-on in your cluster
- Configure with Linode API token
- Set min/max nodes per pool
See: https://linode.github.io/cluster-api-provider-linode/topics/autoscaling.html
Cleanup
Warning: This is destructive and cannot be undone.
# Delete Linode
linode-cli linodes delete "$LINODE_ID"
# Delete firewall
linode-cli firewalls delete "$FIREWALL_ID"
# Optionally delete SSH key
# linode-cli sshkeys delete "$SSH_KEY_ID"
Operations
Troubleshooting, best practices, configuration variables, and cost snapshots are in references/OPERATIONS.md.
Logging Integration
When performing infrastructure operations, log to the centralized system:
# After provisioning
log_admin "SUCCESS" "operation" "Provisioned Linode" "id=$LINODE_ID provider=Linode"
# After destroying
log_admin "SUCCESS" "operation" "Deleted Linode" "id=$LINODE_ID"
# On error
log_admin "ERROR" "operation" "Linode deployment failed" "error=$ERROR_MSG"
See admin skill's references/logging.md for full logging documentation.