# Proxmox API Credentials Setup **Last Updated**: 2024-12-19 ## Overview This guide explains how to create and configure Proxmox API tokens for use with the Crossplane provider. ## Current Status Proxmox credentials are **not yet configured** in `.env`. You need to: 1. Create API tokens in each Proxmox instance 2. Add them to the `.env` file ## Creating API Tokens ### For Each Proxmox Instance 1. **Log in to Proxmox Web UI** - Instance 1: https://ml110-01.sankofa.nexus:8006 - Instance 2: https://r630-01.sankofa.nexus:8006 2. **Navigate to API Tokens** - Go to: **Datacenter** → **Permissions** → **API Tokens** - Click **Add** or **Create Token** 3. **Configure Token** - **Token ID**: `crossplane-` - Instance 1: `crossplane-us-sfvalley` - Instance 2: `crossplane-us-sfvalley-2` - **User**: `root@pam` (or dedicated service account) - **Expiration**: Set appropriate expiration (or leave blank for no expiration) - **Privilege Separation**: Enable if using dedicated user - **Permissions**: - **Administrator** (full access) - Recommended for initial setup - Or specific permissions: VM.Allocate, VM.Audit, Datastore.Audit, etc. 4. **Save Token Secret** - **Important**: Copy the token secret immediately - Format: `user@realm!token-id=token-secret` - Example: `root@pam!crossplane-us-sfvalley=abc123def456...` - You cannot view the secret again after creation ## Adding Credentials to .env ### Option 1: Instance-Specific Credentials (Recommended) Edit `.env` and uncomment/fill in: ```bash # Instance 1 (ML110-01) - us-sfvalley PROXMOX_USERNAME_ML110_01=root@pam PROXMOX_TOKEN_ML110_01=root@pam!crossplane-us-sfvalley=your-token-secret-here # Instance 2 (R630-01) - us-sfvalley-2 PROXMOX_USERNAME_R630_01=root@pam PROXMOX_TOKEN_R630_01=root@pam!crossplane-us-sfvalley-2=your-token-secret-here ``` ### Option 2: Generic Credentials (Same Token for Both) If using the same token for both instances: ```bash PROXMOX_USERNAME=root@pam PROXMOX_TOKEN=root@pam!crossplane-token=your-token-secret-here ``` ## Token Format Proxmox API tokens use the format: ``` user@realm!token-id=token-secret ``` Where: - `user@realm`: The Proxmox user (e.g., `root@pam`) - `token-id`: The token identifier (e.g., `crossplane-us-sfvalley`) - `token-secret`: The secret part of the token ## Testing Credentials ### Test Connectivity ```bash # Test with token export PROXMOX_TOKEN='root@pam!crossplane-us-sfvalley=your-secret' ./scripts/test-proxmox-connectivity.sh ``` ### Test API Access ```bash # Test API call curl -k -H "Authorization: PVEAPIToken ${PROXMOX_TOKEN}" \ https://ml110-01.sankofa.nexus:8006/api2/json/version ``` ## Security Best Practices 1. **Use Dedicated Service Accounts** - Create a dedicated user for Crossplane (e.g., `crossplane@pam`) - Grant only necessary permissions - Use privilege separation 2. **Rotate Tokens Regularly** - Set expiration dates - Rotate tokens quarterly or as per security policy - Revoke old tokens immediately 3. **Limit Permissions** - Don't use Administrator role if not needed - Grant only specific permissions required - Use least privilege principle 4. **Secure Storage** - Never commit `.env` to git (already in `.gitignore`) - Use Kubernetes secrets for production - Rotate credentials if exposed ## Using Credentials ### In Scripts Scripts automatically load from `.env`: ```bash # Scripts will use PROXMOX_TOKEN or instance-specific tokens ./scripts/test-proxmox-connectivity.sh ./scripts/create-proxmox-secret.sh ``` ### In Kubernetes Create Kubernetes secret: ```bash # Interactive creation ./scripts/create-proxmox-secret.sh # Or manually kubectl create secret generic proxmox-credentials \ --from-literal=username=root@pam \ --from-literal=token='root@pam!token-id=token-secret' \ -n crossplane-system ``` ## Troubleshooting ### Token Not Working 1. **Verify Token Format** ```bash echo $PROXMOX_TOKEN # Should be: user@realm!token-id=token-secret ``` 2. **Test API Access** ```bash curl -k -H "Authorization: PVEAPIToken ${PROXMOX_TOKEN}" \ https://ml110-01.sankofa.nexus:8006/api2/json/version ``` 3. **Check Token Permissions** - Verify token has required permissions - Check if token is expired - Verify user account is active ### Authentication Errors 1. **Verify .env is Loaded** ```bash source .env echo $PROXMOX_TOKEN ``` 2. **Check Token Secret** - Ensure token secret is correct - No extra spaces or quotes - Full token format included 3. **Test Each Instance** ```bash # Test Instance 1 export PROXMOX_TOKEN='root@pam!crossplane-us-sfvalley=secret' curl -k -H "Authorization: PVEAPIToken ${PROXMOX_TOKEN}" \ https://ml110-01.sankofa.nexus:8006/api2/json/version # Test Instance 2 export PROXMOX_TOKEN='root@pam!crossplane-us-sfvalley-2=secret' curl -k -H "Authorization: PVEAPIToken ${PROXMOX_TOKEN}" \ https://r630-01.sankofa.nexus:8006/api2/json/version ``` ## Related Documentation - [Environment Variables](./ENVIRONMENT_VARIABLES.md) - [Deployment Readiness](./DEPLOYMENT_READINESS.md) - [Quick Start Guide](./QUICK_START.md)