From 0cee9ed36f3d48e0502ce01aba0856c78b8e5b77 Mon Sep 17 00:00:00 2001 From: jessikitty Date: Wed, 27 May 2026 15:38:03 +1000 Subject: [PATCH] fix: AppArmor unconfined for Docker in unprivileged LXC (CT 121, 122) --- fix-docker-lxc.sh | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 fix-docker-lxc.sh diff --git a/fix-docker-lxc.sh b/fix-docker-lxc.sh new file mode 100644 index 0000000..1fb772c --- /dev/null +++ b/fix-docker-lxc.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# ===================================================================== +# Fix: Docker in unprivileged LXC containers +# ===================================================================== +# Both NPM (CT 122) and Guacamole (CT 121) fail with: +# "open sysctl net.ipv4.ip_unprivileged_port_start: permission denied" +# +# Fix: Set AppArmor profile to unconfined. +# Run on Proxmox host (10.0.0.240) as root. +# Run THIS script first, then fix-guac-npm.sh second. +# ===================================================================== + +set -euo pipefail + +for CT_ID in 121 122; do + CT_CONF="/etc/pve/lxc/${CT_ID}.conf" + CT_NAME=$(pct config "${CT_ID}" | grep hostname | awk '{print $2}') + + echo "=== Fixing CT ${CT_ID} (${CT_NAME}) ===" + + pct stop "${CT_ID}" 2>/dev/null || true + sleep 3 + + if grep -q "lxc.apparmor.profile" "${CT_CONF}" 2>/dev/null; then + sed -i 's/^lxc\.apparmor\.profile:.*/lxc.apparmor.profile: unconfined/' "${CT_CONF}" + else + echo "lxc.apparmor.profile: unconfined" >> "${CT_CONF}" + fi + + pct start "${CT_ID}" + sleep 5 + pct exec "${CT_ID}" -- systemctl restart docker + sleep 3 + echo " Done" +done + +echo "" +echo "AppArmor fix applied to CT 121 and 122." +echo "Now run: ./fix-guac-npm.sh"