proxmox: create-openbureau-lxc env-überschreibbar + domain-fähig

- Alle CONFIG-Werte per Env überschreibbar (ROOTFS_STORAGE, HOSTNAME,
  DISK_GB, RAM_MB, CORES, BRIDGE, IP, GATEWAY) — vorher teils hardcodet,
  was auf ZFS-Hosts (local-zfs statt local-lvm) non-interaktiv scheiterte.
- Neue Variable SITE_DOMAIN: setzt SITE_URL + API_EXTERNAL_URL auf
  https://<domain> (Same-Origin, Pfad-Routing am Reverse-Proxy) statt
  Container-IP. Abschluss zeigt passenden Caddy-Block.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-04 01:06:05 +02:00
parent b67b24a53c
commit f434885c28
+42 -16
View File
@@ -13,23 +13,30 @@
set -euo pipefail set -euo pipefail
############################ CONFIG ############################ ############################ CONFIG ############################
# Alle Werte sind per Umgebungsvariable überschreibbar, z.B.:
# ROOTFS_STORAGE=local-zfs HOSTNAME=openbureau-dev SITE_DOMAIN=dev.openbureau.ch \
# IP=192.168.1.134/24 GATEWAY=192.168.1.1 bash create-openbureau-lxc.sh
CTID="${CTID:-$(pvesh get /cluster/nextid)}" CTID="${CTID:-$(pvesh get /cluster/nextid)}"
HOSTNAME="openbureau" HOSTNAME="${HOSTNAME:-openbureau}"
# Storage # Storage
TEMPLATE_STORAGE="local" TEMPLATE_STORAGE="${TEMPLATE_STORAGE:-local}"
ROOTFS_STORAGE="local-lvm" ROOTFS_STORAGE="${ROOTFS_STORAGE:-local-lvm}"
DISK_GB="20" # Supabase + CMS DISK_GB="${DISK_GB:-20}" # Supabase + CMS
# Ressourcen # Ressourcen
RAM_MB="4096" RAM_MB="${RAM_MB:-4096}"
SWAP_MB="1024" SWAP_MB="${SWAP_MB:-1024}"
CORES="2" CORES="${CORES:-2}"
# Netzwerk # Netzwerk
BRIDGE="vmbr0" BRIDGE="${BRIDGE:-vmbr0}"
IP="dhcp" # "dhcp" ODER statisch z.B. "192.168.1.50/24" IP="${IP:-dhcp}" # "dhcp" ODER statisch z.B. "192.168.1.50/24"
GATEWAY="" # nur bei statischer IP GATEWAY="${GATEWAY:-}" # nur bei statischer IP
# Öffentliche Domain hinter einem Reverse-Proxy (Caddy o.ä.) mit Pfad-Routing
# (/auth/* + /rest/* → :8000, Rest → :8080). Leer = LAN-Direktzugriff per IP:Port.
SITE_DOMAIN="${SITE_DOMAIN:-}"
# Zugang # Zugang
SSH_PUBKEY_FILE="${SSH_PUBKEY_FILE:-$HOME/.ssh/id_ed25519.pub}" SSH_PUBKEY_FILE="${SSH_PUBKEY_FILE:-$HOME/.ssh/id_ed25519.pub}"
@@ -142,16 +149,23 @@ pct exec "$CTID" -- bash -euo pipefail -c "
sed -i \"s|^ANON_KEY=.*|ANON_KEY=\${ANON}|\" .env sed -i \"s|^ANON_KEY=.*|ANON_KEY=\${ANON}|\" .env
sed -i \"s|^SERVICE_ROLE_KEY=.*|SERVICE_ROLE_KEY=\${SVC}|\" .env sed -i \"s|^SERVICE_ROLE_KEY=.*|SERVICE_ROLE_KEY=\${SVC}|\" .env
# URLs auf die Container-IP setzen # URLs setzen — bei gesetzter SITE_DOMAIN auf die öffentliche HTTPS-Domain
# (Browser ruft /auth/* + /rest/* same-origin auf, der Proxy routet sie an
# :8000), sonst auf die Container-IP fürs LAN.
HOSTIP=\$(hostname -I | awk '{print \$1}') HOSTIP=\$(hostname -I | awk '{print \$1}')
sed -i \"s|^SITE_URL=.*|SITE_URL=http://\${HOSTIP}:8080|\" .env SITE_DOMAIN='${SITE_DOMAIN}'
sed -i \"s|^API_EXTERNAL_URL=.*|API_EXTERNAL_URL=http://\${HOSTIP}:8000|\" .env if [ -n \"\$SITE_DOMAIN\" ]; then
SITE_URL=\"https://\$SITE_DOMAIN\"; API_URL=\"https://\$SITE_DOMAIN\"
else
SITE_URL=\"http://\${HOSTIP}:8080\"; API_URL=\"http://\${HOSTIP}:8000\"
fi
sed -i \"s|^SITE_URL=.*|SITE_URL=\${SITE_URL}|\" .env
sed -i \"s|^API_EXTERNAL_URL=.*|API_EXTERNAL_URL=\${API_URL}|\" .env
sed -i \"s|^ADMIN_EMAILS=.*|ADMIN_EMAILS=${ADMIN_EMAIL}|\" .env sed -i \"s|^ADMIN_EMAILS=.*|ADMIN_EMAILS=${ADMIN_EMAIL}|\" .env
# Out-of-box LAN-Direktzugriff (kein Reverse-Proxy) → auf allen Interfaces # Auf allen Interfaces lauschen, damit Reverse-Proxy bzw. LAN drankommen.
# lauschen. Für Domain/HTTPS hinter Proxy: BIND_ADDR=127.0.0.1 setzen.
sed -i \"s|^BIND_ADDR=.*|BIND_ADDR=0.0.0.0|\" .env sed -i \"s|^BIND_ADDR=.*|BIND_ADDR=0.0.0.0|\" .env
# CORS auf die Browser-Origin (= SITE_URL) festnageln statt „*\". # CORS auf die Browser-Origin (= SITE_URL) festnageln statt „*\".
sed -i \"s|__CORS_ORIGIN__|http://\${HOSTIP}:8080|g\" kong.yml sed -i \"s|__CORS_ORIGIN__|\${SITE_URL}|g\" kong.yml
echo 'OK: .env generiert.' echo 'OK: .env generiert.'
fi fi
@@ -173,6 +187,18 @@ pct exec "$CTID" -- bash -euo pipefail -c "
IPADDR="$(pct exec "$CTID" -- hostname -I 2>/dev/null | awk '{print $1}')" IPADDR="$(pct exec "$CTID" -- hostname -I 2>/dev/null | awk '{print $1}')"
say "Fertig. LXC $CTID läuft${IPADDR:+ unter $IPADDR}." say "Fertig. LXC $CTID läuft${IPADDR:+ unter $IPADDR}."
if [ -n "$SITE_DOMAIN" ]; then
cat <<EOF
Öffentlich: https://${SITE_DOMAIN} (sobald der Reverse-Proxy auf ${IPADDR:-<ip>} zeigt)
Caddy-Block: ${SITE_DOMAIN} {
@sb path /auth/* /rest/* /storage/* /realtime/*
reverse_proxy @sb ${IPADDR:-<ip>}:8000
reverse_proxy ${IPADDR:-<ip>}:8080
}
EOF
fi
cat <<EOF cat <<EOF
Admin: http://${IPADDR:-<ip>}:8080/admin/ Admin: http://${IPADDR:-<ip>}:8080/admin/