Skip to content

Installing in an LXC container

Run this on the Proxmox node itself, as root:

Terminal window
curl -fsSL https://web.proxploy.dev/install.sh | bash

With no flags, install.sh checks for pct and /etc/pve; finding both, it takes the PVE-host path documented on this page rather than installing directly. No --shape flag is needed or accepted on this path: passing --shape is what tells the script to skip CT creation and install directly instead, which is the systemd path, not this one.

  1. Resolves CT settings it wasn’t given explicitly (below).
  2. Creates the container with pct create: the current debian-12-standard template, 2 cores, 2 GiB RAM, unprivileged, nesting enabled, DHCP on the chosen bridge.
  3. Starts the CT and polls pct exec <ctid> -- true until it succeeds, so nothing tries to push into or exec inside a container whose init hasn’t come up yet.
  4. Pushes the installer into the CT with pct push.
  5. Runs the in-container half with pct exec, passing --shape lxc plus the resolved channel, version, and public key, and setting PROXPLOY_SELF_CTID in its environment so Proxploy can recognize its own container at boot: the container Proxploy is running in is a protected destructive-action target, not just another CT in the list.
  6. Prints the CT’s IP so you can browse straight to https://<ip>/ and create the first account.

Steps 2 onward are the same code path a plain Debian host takes for the in-container half; see What installing does to a node for what that half does.

All of these have defaults; pass them only to override:

| Flag | Default | Meaning | |---|---|---| | --ctid | First free id ≥ 150 | The container id to create. | | --storage | First storage with rootdir content | Where the CT’s root filesystem lives. | | --bridge | vmbr0 | The network bridge the CT’s NIC attaches to. | | --hostname | none (LAN install) | A public DNS name Caddy should request a Let’s Encrypt certificate for. Omit it for a LAN-only install; Caddy still serves TLS, via its own self-signed CA, on https://<ip>/. |

--channel and --version also apply here and are forwarded into the CT; see Installing Proxploy for their defaults.

Two more flags exist for testing and staged rollouts rather than everyday use: --pve-only stops after the CT is created and staged, without running the in-container installer, and --dry-run stops right after pct create, before the CT is even started.