- ADD_CHAIN138_TO_LEDGER_LIVE: Ledger form done; public code review repo bis-innovations/LedgerLive; init/push commands - CONTRACT_DEPLOYMENT_RUNBOOK: Chain 138 gas price 1 gwei, 36-addr check, TransactionMirror workaround - CONTRACT_*: AddressMapper, MirrorManager deployed 2026-02-12; 36-address on-chain check - NEXT_STEPS_FOR_YOU: Ledger done; steps completable now (no LAN); run-completable-tasks-from-anywhere - MASTER_INDEX, OPERATOR_OPTIONAL, SMART_CONTRACTS_INVENTORY_SIMPLE: updates - LEDGER_BLOCKCHAIN_INTEGRATION_COMPLETE: bis-innovations/LedgerLive reference Co-authored-by: Cursor <cursoragent@cursor.com>
5.8 KiB
Using Templates as Base for Multiple LXC Deployments
Last Updated: 2026-01-31
Document Version: 1.0
Status: Active Documentation
Overview
Yes, you can absolutely use a template (created by all-templates.sh or any official Proxmox template) as a base for deploying multiple LXC containers. There are two main approaches:
Approach 1: Use Official Template Directly (Recommended)
This is the most common approach - use the official Proxmox template directly for each deployment.
How It Works
-
Download template once (if not already available):
pveam download local debian-12-standard_12.2-1_amd64.tar.zst -
Deploy multiple containers from the same template:
# Container 1 pct create 100 local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst \ --hostname container1 --memory 2048 --cores 2 # Container 2 pct create 101 local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst \ --hostname container2 --memory 2048 --cores 2 # Container 3 pct create 102 local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst \ --hostname container3 --memory 4096 --cores 4
Advantages
- ✅ Fast deployments (template is reused)
- ✅ Clean slate for each container
- ✅ Official templates are maintained and updated
- ✅ Less storage overhead (linked clones possible)
Example from Codebase
Looking at smom-dbis-138-proxmox/scripts/deployment/deploy-services.sh, this approach is used:
pct create "$vmid" \
"${CONTAINER_OS_TEMPLATE:-local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst}" \
--storage "${PROXMOX_STORAGE:-local-lvm}" \
--hostname "$hostname" \
--memory "$memory" \
--cores "$cores" \
--rootfs "${PROXMOX_STORAGE:-local-lvm}:${disk}" \
--net0 "$network_config"
Approach 2: Create Custom Template from Base Container
If you need a pre-configured base with specific packages or configurations.
Workflow
-
Create a base container using
all-templates.sh:bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/all-templates.sh)" # Select: debian-12-standard -
Customize the base container:
# Enter the container pct enter <CTID> # Install common packages, configure settings, etc. apt update && apt upgrade -y apt install -y curl wget git vim htop # Configure base settings # ... your customizations ... # Exit container exit -
Stop the container:
pct stop <CTID> -
Convert container to template:
pct template <CTID> -
Deploy multiple containers from your custom template:
# Use the template (it's now at local:vztmpl/vm-<CTID>.tar.gz) pct create 200 local:vztmpl/vm-<CTID>.tar.gz \ --hostname app1 --memory 2048 pct create 201 local:vztmpl/vm-<CTID>.tar.gz \ --hostname app2 --memory 2048
Advantages
- ✅ Pre-configured with your common packages
- ✅ Faster deployment (less setup per container)
- ✅ Consistent base configuration
- ✅ Custom applications/tools pre-installed
Considerations
- ⚠️ Template becomes static (won't get OS updates automatically)
- ⚠️ Requires maintenance if you need to update base packages
- ⚠️ Larger template size (includes your customizations)
Approach 3: Clone Existing Container
For quick duplication of an existing container:
# Clone container 100 to new container 200
pct clone 100 200 --hostname new-container
This creates a linked clone (space-efficient) or full clone depending on storage capabilities.
Recommended Workflow for Your Use Case
Based on the codebase patterns, here's the recommended approach:
For Standard Deployments
Use official templates directly - This is what most scripts in the codebase do:
# Set your base template
CONTAINER_OS_TEMPLATE="local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst"
# Deploy multiple containers with different configurations
for i in {1..5}; do
pct create $((100+i)) "$CONTAINER_OS_TEMPLATE" \
--hostname "app-$i" \
--memory 2048 \
--cores 2 \
--rootfs local-lvm:20 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp
done
For Pre-Configured Bases
If you need a customized base:
- Create one container from
all-templates.sh - Customize it with common packages/configurations
- Convert to template:
pct template <CTID> - Use that template for all future deployments
Example: Batch Deployment Script
Here's a script that deploys multiple containers from a base template:
#!/bin/bash
# deploy-multiple-containers.sh
BASE_TEMPLATE="${CONTAINER_OS_TEMPLATE:-local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst}"
START_CTID=100
declare -A CONTAINERS=(
["web1"]="2048:2:20"
["web2"]="2048:2:20"
["db1"]="4096:4:50"
["app1"]="2048:2:30"
)
for hostname in "${!CONTAINERS[@]}"; do
IFS=':' read -r memory cores disk <<< "${CONTAINERS[$hostname]}"
CTID=$((START_CTID++))
echo "Creating $hostname (CTID: $CTID)..."
pct create $CTID "$BASE_TEMPLATE" \
--hostname "$hostname" \
--memory "$memory" \
--cores "$cores" \
--rootfs local-lvm:"$disk" \
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
--unprivileged 1 \
--features nesting=1,keyctl=1
pct start $CTID
echo "✓ $hostname created and started"
done
Summary
- ✅ Yes, templates can be the base for all LXC deployments
- ✅ Official templates (from
all-templates.sh) are best for standard deployments - ✅ Custom templates (from
pct template) are best for pre-configured bases - ✅ Cloning (
pct clone) is best for quick duplication
The codebase already uses this pattern extensively - templates are reused for multiple container deployments, making it efficient and consistent.