A scalable QEMU container deployment with scale-to-zero functionality using Sablier.
├── render.py # Template rendering script
├── Dockerfile # Caddy with Sablier plugin
├── templates/ # Jinja2 templates
│ ├── docker-compose.j2 # Docker Compose template
│ └── Caddyfile.j2 # Caddy configuration template
└── output/ # Generated configuration files
├── docker-compose.yml
└── Caddyfile
- Install dependencies:
pip install -r requirements.txt- Generate configuration:
# Use defaults (6 containers, legacy boot, kali image, 2G RAM, 2 CPU cores)
python render.py
# Custom configuration
python render.py -n 10 --boot-image ubuntu --ram-size 4G --cpu-cores 4 --prefix vm- Deploy:
cd output
docker-compose up -d-n, --num-containers: Number of QEMU containers (default: 6)--boot-mode: QEMU boot mode (legacy/uefi, default: legacy)--boot-image: QEMU boot image (default: kali)--ram-size: RAM size per container (default: 2G)--cpu-cores: CPU cores per container (default: 2)--prefix: Custom container name prefix (default: boot image name)
- ⚙️ Dynamically generated
docker-compose.ymlandCaddyfilefor 1–100+ QEMU VMs - 💻 Per-container terminal access via Sablier and web browser
- 🔁 Auto-scaling via sablier session lifecycle
- 🔐 Secure routing with Caddy reverse proxy
- 📦 Easy deployment with a single command