#!/usr/bin/env bash # Deploy CM4 eMMC provisioning to a Proxmox host (creates LXC 201, installs scripts on host and in LXC). # Usage: ./deploy-to-proxmox.sh [proxmox_host] # Example: ./deploy-to-proxmox.sh root@10.130.60.224 # Requires: ssh key access to root@ set -e PROXMOX="${1:-root@10.130.60.224}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_DIR="$(dirname "$SCRIPT_DIR")" echo "Deploying to $PROXMOX ..." rsync -a "$REPO_DIR/" "$PROXMOX:/tmp/emmc-provisioning-deploy/" --exclude='.git' --exclude='scripts/deploy-to-proxmox.sh' ssh "$PROXMOX" bash -s << 'REMOTE' set -e DEPLOY=/tmp/emmc-provisioning-deploy # Ensure LXC 201 exists (create if not) if ! pct status 201 &>/dev/null; then echo "Creating LXC 201 (cm4-provisioning)..." pct create 201 local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst \ --hostname cm4-provisioning --memory 1024 --swap 0 --cores 1 \ --rootfs local-zfs:8 --net0 name=eth0,bridge=vmbr0,ip=dhcp \ --unprivileged 0 --features nesting=1 -tag cm4-provisioning mkdir -p /var/lib/cm4-provisioning pct set 201 -mp0 /var/lib/cm4-provisioning,mp=/var/lib/cm4-provisioning fi # Host: install scripts and udev mkdir -p /opt/cm4-provisioning /etc/cm4-provisioning cp "$DEPLOY/flash-emmc-on-connect.sh" /opt/cm4-provisioning/ chmod +x /opt/cm4-provisioning/flash-emmc-on-connect.sh cp "$DEPLOY/cm4-flash-trigger.sh" /usr/local/bin/ chmod +x /usr/local/bin/cm4-flash-trigger.sh cp "$DEPLOY/90-cm4-boot-mode.rules" /etc/udev/rules.d/ udevadm control --reload-rules cat > /opt/cm4-provisioning/env << 'ENV' GOLDEN_IMAGE=/var/lib/cm4-provisioning/golden.img RPIBOOT_DIR=/opt/usbboot EMMC_SIZE_BYTES=8589934592 ENV touch /etc/cm4-provisioning/enabled mkdir -p /var/lib/cm4-provisioning/backups # Start LXC if stopped pct start 201 2>/dev/null || true # LXC: install scripts pct exec 201 -- mkdir -p /opt/cm4-provisioning /etc/cm4-provisioning pct push 201 "$DEPLOY/flash-emmc-on-connect.sh" /opt/cm4-provisioning/ pct exec 201 -- chmod +x /opt/cm4-provisioning/flash-emmc-on-connect.sh pct push 201 "$DEPLOY/cm4-flash-trigger.sh" /usr/local/bin/cm4-flash-trigger.sh pct exec 201 -- chmod +x /usr/local/bin/cm4-flash-trigger.sh pct exec 201 -- bash -c 'echo -e "GOLDEN_IMAGE=/var/lib/cm4-provisioning/golden.img\nRPIBOOT_DIR=/opt/usbboot\nEMMC_SIZE_BYTES=8589934592" > /opt/cm4-provisioning/env' # LXC: install dashboard pct exec 201 -- mkdir -p /opt/cm4-provisioning/dashboard/templates pct push 201 "$DEPLOY/dashboard/app.py" /opt/cm4-provisioning/dashboard/ pct push 201 "$DEPLOY/dashboard/templates/index.html" /opt/cm4-provisioning/dashboard/templates/ pct push 201 "$DEPLOY/dashboard/cm4-dashboard.service" /opt/cm4-provisioning/dashboard/ echo "Deploy done. Install usbboot on host when online: ssh $PROXMOX 'bash /tmp/emmc-provisioning-deploy/scripts/install-usbboot-on-host.sh'" echo "To enable the dashboard in LXC 201: pct exec 201 -- bash -c 'apt-get install -y python3-flask; cp /opt/cm4-provisioning/dashboard/cm4-dashboard.service /etc/systemd/system/; systemctl daemon-reload; systemctl enable --now cm4-dashboard'" REMOTE echo "Done. Put golden.img in /var/lib/cm4-provisioning/ on the host (or scp to LXC 201 at /var/lib/cm4-provisioning/)." echo "When the host has internet, run on the host: bash /tmp/emmc-provisioning-deploy/scripts/install-usbboot-on-host.sh" echo "Dashboard: install flask in LXC 201 and enable cm4-dashboard.service (see PROXMOX-LXC-DEPLOYMENT.md)."