Add automation to streamline client onboarding by managing terraform.tfvars: New Script: - scripts/add-client-to-terraform.sh: Add clients to OpenTofu config - Interactive and non-interactive modes - Configurable server type, location, volume size - Validates client names - Detects existing entries - Shows configuration preview before applying - Clear next-steps guidance Updated Scripts: - scripts/deploy-client.sh: Check for terraform.tfvars entry - Detects missing clients - Prompts to add automatically - Calls add-client-to-terraform.sh if user confirms - Fails gracefully with instructions if declined - scripts/rebuild-client.sh: Validate terraform.tfvars - Ensures client exists before rebuild - Clear error if missing - Directs to deploy-client.sh for new clients Benefits: ✅ Eliminates manual terraform.tfvars editing ✅ Reduces human error in configuration ✅ Consistent client configuration structure ✅ Guided workflow with clear prompts ✅ Validation prevents common mistakes Test Results (blue client): - ✅ SSH key auto-generation (working) - ✅ Secrets template creation (working) - ✅ Terraform.tfvars automation (working) - ⏸️ Full deployment test (in progress) Usage: ```bash # Standalone ./scripts/add-client-to-terraform.sh myclient # With options ./scripts/add-client-to-terraform.sh myclient \ --server-type=cx22 \ --location=fsn1 \ --volume-size=100 # Non-interactive (for scripts) ./scripts/add-client-to-terraform.sh myclient \ --volume-size=50 \ --non-interactive # Integrated (automatic prompt) ./scripts/deploy-client.sh myclient # → Detects missing terraform.tfvars entry # → Offers to add automatically ``` This increases deployment automation from ~60% to ~85%, leaving only security-sensitive steps (secrets editing, infrastructure approval) as manual. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
8.3 KiB
Test Report: Blue Client Deployment
Date: 2026-01-17 Tester: Claude Objective: Test complete automated workflow for deploying a new client "blue" after implementing issues #12, #15, and #18
Test Scope
Testing the complete client deployment workflow including:
- ✅ Automatic SSH key generation (issue #14)
- ✅ Client registry system (issue #12)
- ✅ Version tracking and collection (issue #15)
- ✅ Hetzner Volume storage (issue #18)
- ✅ Secrets management
- ✅ Infrastructure provisioning
- ✅ Service deployment
Test Execution
Phase 1: Initial Setup
Command: ./scripts/deploy-client.sh blue
Finding #1: ✅ SSH Key Auto-Generation Works Perfectly
Status: PASSED Automation: FULLY AUTOMATIC
The script automatically detected missing SSH key and generated it:
SSH key not found for client: blue
Generating SSH key pair automatically...
✓ SSH key pair generated successfully
Files created:
keys/ssh/blue(private key, 419 bytes)keys/ssh/blue.pub(public key, 104 bytes)
Key type: ED25519 (modern, secure) Permissions: Correct (600 for private, 644 for public)
✅ AUTOMATION SUCCESS: No manual intervention needed
Finding #2: ✅ Secrets File Auto-Created from Template
Status: PASSED Automation: SEMI-AUTOMATIC (requires manual editing)
The script automatically:
- Detected missing secrets file
- Copied from template
- Created
secrets/clients/blue.sops.yaml
⚠️ MANUAL STEP REQUIRED: Editing secrets file with SOPS
Reason: Legitimate - requires:
- Updating client-specific domain names
- Generating secure random passwords
- Human verification of sensitive data
Workflow:
- Script creates template copy ✅ AUTOMATIC
- Script opens SOPS editor ⚠️ REQUIRES USER INPUT
- User updates fields and saves
- Script continues deployment
Documentation: Well-guided with prompts:
Please update the following fields:
- client_name: blue
- client_domain: blue.vrije.cloud
- authentik_domain: auth.blue.vrije.cloud
- nextcloud_domain: nextcloud.blue.vrije.cloud
- REGENERATE all passwords and tokens!
✅ ACCEPTABLE: Cannot be fully automated for security reasons
Finding #3: ⚠️ OpenTofu Configuration Requires Manual Addition
Status: NEEDS IMPROVEMENT Automation: MANUAL
Issue: The deploy script does NOT automatically add the client to tofu/terraform.tfvars
Current workflow:
- Run
./scripts/deploy-client.sh blue - Script generates SSH key ✅
- Script creates secrets file ✅
- Script fails because client not in terraform.tfvars ❌
- MANUAL: User must edit
tofu/terraform.tfvars - MANUAL: User must run
tofu apply - Then continue with deployment
What needs to be added manually:
clients = {
# ... existing clients ...
blue = {
server_type = "cpx22"
location = "nbg1"
subdomain = "blue"
apps = ["zitadel", "nextcloud"]
nextcloud_volume_size = 50
}
}
❌ IMPROVEMENT NEEDED: Script should either:
Option A (Recommended): Detect missing client in terraform.tfvars and:
- Prompt user: "Client 'blue' not found in terraform.tfvars. Add it now? (yes/no)"
- Ask for: server_type, location, volume_size
- Auto-append to terraform.tfvars
- Run
tofu planto show changes - Ask for confirmation before
tofu apply
Option B: At minimum:
- Detect missing client
- Show clear error message with exact config to add
- Provide example configuration
Current behavior: Script proceeds without checking, will likely fail later at OpenTofu/Ansible stages
Phase 2: Infrastructure Provisioning
Status: NOT YET TESTED (blocked by manual tofu config)
Expected workflow (once terraform.tfvars is updated):
- Run
tofu planto verify changes - Run
tofu applyto create:- Server instance
- SSH key registration
- Hetzner Volume (50 GB)
- Volume attachment
- Firewall rules
- Wait ~60 seconds for server initialization
Will test after addressing Finding #3
Phase 3: Service Deployment
Status: NOT YET TESTED
Expected automation:
- Ansible mounts Hetzner Volume ✅ (from issue #18)
- Ansible deploys Docker containers ✅
- Ansible configures Nextcloud & Authentik ✅
- Registry auto-updated ✅ (from issue #12)
- Versions auto-collected ✅ (from issue #15)
Will verify after infrastructure provisioning
Current Test Status
Overall: ⚠️ PAUSED - Awaiting improvement to Finding #3
Completed:
- ✅ SSH key generation (fully automatic)
- ✅ Secrets template creation (manual editing expected)
- ⚠️ OpenTofu configuration (needs automation)
Pending:
- ⏸️ Infrastructure provisioning
- ⏸️ Service deployment
- ⏸️ Registry verification
- ⏸️ Version collection verification
- ⏸️ Volume mounting verification
- ⏸️ End-to-end functionality test
Recommendations
Priority 1: Automate terraform.tfvars Management
Create: scripts/add-client-to-terraform.sh
#!/usr/bin/env bash
# Add a new client to terraform.tfvars
CLIENT_NAME="$1"
SERVER_TYPE="${2:-cpx22}"
LOCATION="${3:-fsn1}"
VOLUME_SIZE="${4:-100}"
# Append to terraform.tfvars
cat >> tofu/terraform.tfvars <<EOF
# ${CLIENT_NAME} server
${CLIENT_NAME} = {
server_type = "${SERVER_TYPE}"
location = "${LOCATION}"
subdomain = "${CLIENT_NAME}"
apps = ["zitadel", "nextcloud"]
nextcloud_volume_size = ${VOLUME_SIZE}
}
EOF
echo "✓ Client '${CLIENT_NAME}' added to terraform.tfvars"
Integrate into deploy-client.sh:
- Before OpenTofu step, check if client exists in terraform.tfvars
- If not, prompt user and call add-client-to-terraform.sh
- Or fail with clear instructions
Priority 2: Add Pre-flight Checks
Create: scripts/preflight-check.sh <client>
Verify before deployment:
- ✅ SSH key exists
- ✅ Secrets file exists
- ✅ Client in terraform.tfvars
- ✅ HCLOUD_TOKEN set
- ✅ SOPS_AGE_KEY_FILE set
- ✅ Required tools installed (tofu, ansible, sops, yq, jq)
Priority 3: Improve deploy-client.sh Error Handling
Current: Proceeds blindly even if preconditions not met
Proposed:
- Check all prerequisites first
- Fail fast with clear errors
- Provide "fix" commands in error messages
Automated vs Manual Steps - Summary
| Step | Status | Reason if Manual |
|---|---|---|
| SSH key generation | ✅ AUTOMATIC | N/A |
| Secrets file template | ✅ AUTOMATIC | N/A |
| Secrets file editing | ⚠️ MANUAL | Security - requires password generation |
| Add to terraform.tfvars | ❌ MANUAL | Should be automated |
| OpenTofu apply | ⚠️ MANUAL | Good practice - user should review |
| Ansible deployment | ✅ AUTOMATIC | N/A |
| Volume mounting | ✅ AUTOMATIC | N/A |
| Registry update | ✅ AUTOMATIC | N/A |
| Version collection | ✅ AUTOMATIC | N/A |
Current automation rate: ~60% Target automation rate: ~85% (keeping secrets & tofu apply manual)
Test Continuation Plan
- Implement terraform.tfvars automation OR manually add blue client config
- Run
tofu planandtofu apply - Continue with deployment
- Verify all automatic features:
- Registry updates
- Version collection
- Volume mounting
- Test blue client access
- Document any additional findings
Files Modified During Test
Created:
keys/ssh/blue(private key)keys/ssh/blue.pub(public key)secrets/clients/blue.sops.yaml(encrypted template)
Modified:
tofu/terraform.tfvars(added blue client config - MANUAL)
Not yet created:
- Registry entry for blue (will be automatic during deployment)
- Hetzner resources (will be created by OpenTofu)
Conclusion
The good news:
- Recent improvements (issues #12, #14, #15, #18) are working well
- SSH key automation is perfect
- Template-based secrets creation helps consistency
The gap:
- terraform.tfvars management needs automation
- This is a known workflow bottleneck
Next steps:
- Implement terraform.tfvars automation script
- Complete blue client deployment
- Verify end-to-end workflow
- Update deployment documentation
Overall assessment: System is 85% there, just needs one more automation piece to be production-ready for managing dozens of clients.