Use
Install
Create a container or VM – with the dialog, without a dialog, or with Docker.
Container or VM?
| LXC container | VM | |
|---|---|---|
| Script | ct.sh | vm.sh |
| Based on | Proxmox’s Debian 13 template | a ready-built, tested image of the app |
| Installation | runs inside the container while it is created | already in the image – the first boot only applies the instance settings |
| Resources | lightweight | own kernel, more RAM |
| Best for | most services | kernel features, Docker in the guest, desktop |
Both lead to the same result: the same packages, the same configuration, the same
update. Which platforms an app offers is shown on its page.
With the dialog
On the Proxmox host as root:
bash -c "$(curl -fsSL https://iac.heyer.systems/<app>/ct.sh)" # container
bash -c "$(curl -fsSL https://iac.heyer.systems/<app>/vm.sh)" # VM
default takes the app’s default values, advanced asks for everything – including the
modules and where the SSH keys come from (file, URL like https://git.example/<user>.keys, paste).
Without a dialog
With IAC_NONINTERACTIVE=1 the app’s defaults apply, plus every var_* you pass:
IAC_NONINTERACTIVE=1 var_net=192.168.40.20/24 var_gateway=192.168.40.1 \
var_modules=node-exporter,unattended-upgrades \
bash -c "$(curl -fsSL https://iac.heyer.systems/traefik/ct.sh)"
You do not have to write this by hand: the generator on every app page builds the command. All variables, grouped:
Guest
| Variable | Meaning | Default |
|---|---|---|
var_id | ID of the guest | next free |
var_hostname | hostname | name of the app |
var_start | start after creating (1 / 0) | 1 |
Resources and storage
| Variable | Meaning | Default |
|---|---|---|
var_cpu | CPU cores | app’s value |
var_ram | RAM in MiB (at least 512) | app’s value |
var_disk | disk in GiB | app’s value |
var_storage | Proxmox storage for the disk | first suitable |
var_template_storage | storage of the Debian template (LXC only) | first suitable |
Network
| Variable | Meaning | Default |
|---|---|---|
var_bridge | network bridge | vmbr0 |
var_vlan | VLAN tag | none |
var_net | dhcp or a static address like 192.168.40.20/24 | dhcp |
var_gateway | gateway for a static address | – |
var_nameserver | DNS servers | like the host |
var_searchdomain | search domain | like the host |
var_mac | MAC address of eth0, e.g. BC:24:11:12:34:56 | random |
Modules, access and app settings
| Variable | Meaning | Default |
|---|---|---|
var_modules | modules, comma-separated ('' = none) | the app’s preselection |
var_ssh_keys | file, URL or key line | /root/.ssh/authorized_keys of the host |
var_<setting> | settings of the app, e.g. var_db_host (LXC only so far) | – |
VM only
| Variable | Meaning | Default |
|---|---|---|
var_image_version | a specific image version | latest |
Result as JSON
For automation, IAC_RESULT=/path/result.json writes the result as JSON at the end:
| Field | Content |
|---|---|
status | ok or failed |
kind, app | lxc or vm, and the app |
id, hostname, node | the guest and the Proxmox node it runs on |
mac, ip | network addresses of the guest |
modules | the chosen modules |
guest_exists | whether the guest exists – it is kept after a failure |
error | the reason on failure |
log | path to the log on the host |
core_ref, app_ref | the versions of iac-core and the app that were used |
VM images
Every VM image is built automatically, started and checked in a test VM and only then
published – on every change of the app and every Monday with the latest Debian packages.
vm.sh downloads it with a SHA256 checksum and verifies it before the import. The disk grows
to the chosen size when the guest is created.
You can also download an image by hand: https://iac.heyer.systems/<app>/image/latest and
…/image/SHA256SUMS.
Docker
Apps with a Docker variant come with a simple docker-compose.yml:
mkdir -p /opt/traefik && cd /opt/traefik
curl -fsSL https://iac.heyer.systems/traefik/docker-compose.yml -o docker-compose.yml
docker compose up -d
Ports and settings go into a .env next to it (e.g. PORT_80=8081). Modules and update only
exist in LXC and VM.
Test a branch
IAC_APP_REF=<branch> IAC_CORE_REF=<branch> bash -c "$(curl -fsSL https://iac.heyer.systems/<app>/ct.sh)"
IAC_APP_REF picks the state of the app, IAC_CORE_REF the one of iac-core.