fix: bake in AppArmor unconfined + schema validation for Docker-in-LXC

This commit is contained in:
2026-05-27 15:44:02 +10:00
parent 0cee9ed36f
commit 9dc7a53071
+30 -14
View File
@@ -42,14 +42,14 @@ echo "============================================"
# --- Check if template exists --- # --- Check if template exists ---
if ! pveam list local | grep -q "debian-12-standard"; then if ! pveam list local | grep -q "debian-12-standard"; then
echo "[1/8] Downloading Debian 12 template..." echo "[1/9] Downloading Debian 12 template..."
pveam download local debian-12-standard_12.12-1_amd64.tar.zst pveam download local debian-12-standard_12.12-1_amd64.tar.zst
else else
echo "[1/8] Debian 12 template already available" echo "[1/9] Debian 12 template already available"
fi fi
# --- Create the container --- # --- Create the container (don't start yet - need AppArmor fix first) ---
echo "[2/8] Creating LXC container ${CT_ID}..." echo "[2/9] Creating LXC container ${CT_ID}..."
pct create "${CT_ID}" "${CT_TEMPLATE}" \ pct create "${CT_ID}" "${CT_TEMPLATE}" \
--hostname "${CT_NAME}" \ --hostname "${CT_NAME}" \
--memory "${CT_MEMORY}" \ --memory "${CT_MEMORY}" \
@@ -59,16 +59,23 @@ pct create "${CT_ID}" "${CT_TEMPLATE}" \
--net0 "name=eth0,bridge=${BRIDGE},ip=${CT_IP},gw=${CT_GW},firewall=0" \ --net0 "name=eth0,bridge=${BRIDGE},ip=${CT_IP},gw=${CT_GW},firewall=0" \
--nameserver "10.0.0.224" \ --nameserver "10.0.0.224" \
--onboot 1 \ --onboot 1 \
--start 1 \
--unprivileged 1 \ --unprivileged 1 \
--features "nesting=1,keyctl=1" \ --features "nesting=1,keyctl=1" \
--startup "order=3,up=15" --startup "order=3,up=15"
echo "[3/8] Waiting for container to start..." # --- Apply AppArmor fix for Docker-in-LXC ---
echo "[3/9] Applying AppArmor fix for Docker compatibility..."
CT_CONF="/etc/pve/lxc/${CT_ID}.conf"
if ! grep -q "lxc.apparmor.profile" "${CT_CONF}" 2>/dev/null; then
echo "lxc.apparmor.profile: unconfined" >> "${CT_CONF}"
fi
pct start "${CT_ID}"
echo "[4/9] Waiting for container to start..."
sleep 5 sleep 5
# --- Install Docker inside the container --- # --- Install Docker inside the container ---
echo "[4/8] Installing Docker..." echo "[5/9] Installing Docker..."
pct exec "${CT_ID}" -- bash -c ' pct exec "${CT_ID}" -- bash -c '
apt-get update -qq apt-get update -qq
apt-get install -y -qq ca-certificates curl gnupg apt-get install -y -qq ca-certificates curl gnupg
@@ -83,7 +90,7 @@ pct exec "${CT_ID}" -- bash -c '
' '
# --- Create Docker Compose config --- # --- Create Docker Compose config ---
echo "[5/8] Creating Guacamole Docker Compose configuration..." echo "[6/9] Creating Guacamole Docker Compose configuration..."
pct exec "${CT_ID}" -- bash -c " pct exec "${CT_ID}" -- bash -c "
mkdir -p /opt/guacamole mkdir -p /opt/guacamole
cat > /opt/guacamole/docker-compose.yml << DCEOF cat > /opt/guacamole/docker-compose.yml << DCEOF
@@ -137,26 +144,35 @@ DCEOF
" "
# --- Generate the database init script --- # --- Generate the database init script ---
echo "[6/8] Generating database initialisation schema..." echo "[7/9] Generating database initialisation schema..."
pct exec "${CT_ID}" -- bash -c ' pct exec "${CT_ID}" -- bash -c '
mkdir -p /opt/guacamole/initdb mkdir -p /opt/guacamole/initdb
docker pull guacamole/guacamole:latest -q docker pull guacamole/guacamole:latest -q
docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --postgresql > /opt/guacamole/initdb/001-init.sql docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --postgresql \
echo "Database schema extracted successfully" > /opt/guacamole/initdb/001-init.sql 2>/dev/null
# Validate the schema was generated properly
SCHEMA_SIZE=$(wc -c < /opt/guacamole/initdb/001-init.sql)
if [ "${SCHEMA_SIZE}" -lt 1000 ]; then
echo "ERROR: Schema generation failed (${SCHEMA_SIZE} bytes)"
echo "Check that AppArmor fix was applied correctly"
exit 1
fi
echo "Schema generated successfully (${SCHEMA_SIZE} bytes)"
' '
# --- Start the stack --- # --- Start the stack ---
echo "[7/8] Starting Guacamole stack..." echo "[8/9] Starting Guacamole stack..."
pct exec "${CT_ID}" -- bash -c ' pct exec "${CT_ID}" -- bash -c '
cd /opt/guacamole cd /opt/guacamole
docker compose up -d docker compose up -d
echo "Waiting for services to initialise..." echo "Waiting for services to initialise..."
sleep 15 sleep 20
docker compose ps docker compose ps
' '
# --- Create systemd service for auto-start --- # --- Create systemd service for auto-start ---
echo "[8/8] Creating systemd service for auto-start..." echo "[9/9] Creating systemd service for auto-start..."
pct exec "${CT_ID}" -- bash -c ' pct exec "${CT_ID}" -- bash -c '
cat > /etc/systemd/system/guacamole.service << "SVCEOF" cat > /etc/systemd/system/guacamole.service << "SVCEOF"
[Unit] [Unit]