Prefix LXCs hotel-manage-*; group in Proxmox pool + tag

This commit is contained in:
jtricerolph 2026-07-01 12:40:28 +00:00
parent d052d0bddf
commit 4622cc3d45
3 changed files with 110 additions and 71 deletions

View file

@ -1,4 +1,4 @@
# Proxmox Helpers — HNF Stack Installer
# Hotel Manage — Proxmox Stack Installer
tteck-style helper scripts that provision the stack onto a fresh Proxmox host —
no local copy of the repo required on the host.
@ -64,7 +64,7 @@ target. It then provisions the six foundation LXCs (postgres, auth, portal,
npm, management, noticeboard), health-checks each, and configures the NPM proxy
routes. (Leave the Forgejo token blank — the repos are public.)
Secrets are written to `/root/hnf-credentials.txt` (chmod 600) — copy this
Secrets are written to `/root/hotel-manage-credentials.txt` (chmod 600) — copy this
offsite.
## Add an app later
@ -75,7 +75,7 @@ On the Proxmox host (again, because it creates an LXC):
bash <(curl -fsSL https://git.pterois.co.uk/hotel-manage-stack/stack-init/raw/branch/main/add-app.sh)
```
Reads `/root/hnf-credentials.txt` for the shared secret and office IP,
Reads `/root/hotel-manage-credentials.txt` for the shared secret and office IP,
provisions a new LXC, optionally creates a dedicated postgres DB, clones the
app repo, and prints the NPM route / Uptime Kuma / webhook / deploy-map lines
to finish wiring it in. After that, ongoing updates flow through the management
@ -88,6 +88,18 @@ Same command on the new host. Only the wizard answers differ per site:
The internal `10.10.10.0/24` network and all service IPs are identical
everywhere, so the repos are reused unchanged.
## LXC organisation
Every LXC is created with:
- a `hotel-manage-<role>` **hostname** (e.g. `hotel-manage-postgres`,
`hotel-manage-auth`, `hotel-manage-noticeboard`),
- membership of a Proxmox **resource pool** `hotel-manage`, and
- a **tag** `hotel-manage`,
so the whole stack groups and filters together in the Proxmox UI and is easy to
tell apart from any other containers on the host. `add-app.sh` puts new app LXCs
in the same pool/tag.
## Notes
- All repos are public, so no Forgejo token is needed to install or update.

View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash
# ┌─────────────────────────────────────────────────────────────────────────┐
# │ HNF Manage — Add App LXC │
# │ Hotel Manage — Add App LXC │
# │ Provisions a single app container and wires it into the stack. │
# │ │
# │ Usage: bash add-app.sh (or curl-bootstrap, see install/README.md) │
@ -23,7 +23,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
# Load secrets from credentials file if present
CREDS_FILE=/root/hnf-credentials.txt
CREDS_FILE=/root/hotel-manage-credentials.txt
if [[ -f "$CREDS_FILE" ]]; then
# shellcheck disable=SC1090
set -a; source <(grep -v '^#' "$CREDS_FILE" | grep '='); set +a
@ -104,12 +104,18 @@ fi
# ── Get mgmt public key ───────────────────────────────────────────────────────
MGMT_PUBKEY=""
[[ -f /root/.ssh/hnf_management.pub ]] && MGMT_PUBKEY=$(cat /root/.ssh/hnf_management.pub)
[[ -f /root/.ssh/hotel-manage_deploy.pub ]] && MGMT_PUBKEY=$(cat /root/.ssh/hotel-manage_deploy.pub)
# ── Resource pool (created by install-stack.sh; reuse if present) ──────────────
POOL="hotel-manage"
POOL_OPT=""
pvesh get "/pools/${POOL}" &>/dev/null || pvesh create /pools --poolid "${POOL}" &>/dev/null || true
pvesh get "/pools/${POOL}" &>/dev/null && POOL_OPT="--pool ${POOL}"
# ── Create LXC ────────────────────────────────────────────────────────────────
msg_info "Creating LXC ${LXC_ID} (hnf-${APP_NAME} at 10.10.10.${LAST_OCTET})"
msg_info "Creating LXC ${LXC_ID} (hotel-manage-${APP_NAME} at 10.10.10.${LAST_OCTET})"
pct create "$LXC_ID" "$TEMPLATE" \
--hostname "hnf-${APP_NAME}" \
--hostname "hotel-manage-${APP_NAME}" \
--memory 512 \
--cores 1 \
--rootfs "${STORAGE}:8" \
@ -117,6 +123,8 @@ pct create "$LXC_ID" "$TEMPLATE" \
--features nesting=1 \
--unprivileged 0 \
--onboot 1 \
--tags "${POOL}" \
${POOL_OPT} \
--start 1 &>/dev/null
sleep 5
msg_ok "LXC ${LXC_ID} created"
@ -150,17 +158,17 @@ if [[ "$APP_DB" == "yes" ]]; then
msg_info "Creating database ${APP_DB_NAME}"
# Run SQL via postgres LXC
pct exec 100 -- bash -c "
docker exec hnf-postgres psql -U postgres -c \
docker exec hotel-manage-postgres psql -U postgres -c \
\"CREATE USER ${APP_DB_USER} WITH PASSWORD '${APP_DB_PASS}';\" 2>/dev/null || true
docker exec hnf-postgres psql -U postgres -c \
docker exec hotel-manage-postgres psql -U postgres -c \
\"CREATE DATABASE ${APP_DB_NAME} OWNER ${APP_DB_USER};\" 2>/dev/null || true
docker exec hnf-postgres psql -U postgres -d ${APP_DB_NAME} -c \
docker exec hotel-manage-postgres psql -U postgres -d ${APP_DB_NAME} -c \
\"GRANT ALL ON SCHEMA public TO ${APP_DB_USER};\" 2>/dev/null || true
" &>/dev/null
msg_ok "Database ${APP_DB_NAME} created"
# Append DB creds to credentials file
cat >> /root/hnf-credentials.txt <<EOF
cat >> /root/hotel-manage-credentials.txt <<EOF
# ${APP_NAME} DB
${APP_NAME^^}_DB_PASS=${APP_DB_PASS}
@ -178,13 +186,13 @@ if [[ "$USE_FORGEJO" == "true" ]]; then
git clone -q '${FORGEJO_REPO}' /opt/${APP_NAME}
" &>/dev/null
else
tmp=$(mktemp /tmp/hnf-app-XXXX.tar.gz)
tmp=$(mktemp /tmp/hotel-manage-app-XXXX.tar.gz)
tar czf "$tmp" -C "$(dirname "$LOCAL_SRC")" "$(basename "$LOCAL_SRC")" 2>/dev/null
pct push "$LXC_ID" "$tmp" /tmp/hnf-app.tar.gz 2>/dev/null
pct push "$LXC_ID" "$tmp" /tmp/hotel-manage-app.tar.gz 2>/dev/null
pct exec "$LXC_ID" -- bash -c "
mkdir -p /opt && tar xzf /tmp/hnf-app.tar.gz -C /opt
mkdir -p /opt && tar xzf /tmp/hotel-manage-app.tar.gz -C /opt
mv /opt/$(basename "$LOCAL_SRC") /opt/${APP_NAME} 2>/dev/null || true
rm -f /tmp/hnf-app.tar.gz
rm -f /tmp/hotel-manage-app.tar.gz
" &>/dev/null
rm -f "$tmp"
fi
@ -192,7 +200,7 @@ msg_ok "App files deployed to /opt/${APP_NAME}"
# ── Write .env ────────────────────────────────────────────────────────────────
msg_info "Writing .env"
ENV_TMP=$(mktemp /tmp/hnf-env-XXXX)
ENV_TMP=$(mktemp /tmp/hotel-manage-env-XXXX)
{
echo "NODE_ENV=production"
echo "APP_SLUG=${APP_NAME}"
@ -209,7 +217,7 @@ msg_ok ".env written"
# ── Register app in auth service ──────────────────────────────────────────────
msg_warn "Remember to register '${APP_NAME}' in the auth service DB:"
printf " docker exec hnf-auth-1 node -e \"\n"
printf " docker exec hotel-manage-auth-1 node -e \"\n"
printf " const db = require('./src/db.js');\n"
printf " db.query(\\\"INSERT INTO apps (slug,name,base_path) VALUES ('%s','%s','%s') ON CONFLICT DO NOTHING\\\");\n" \
"$APP_NAME" "$APP_NAME" "$APP_PATH"
@ -233,7 +241,7 @@ cat <<SUMMARY
3. Add to Uptime Kuma:
http://10.10.10.${LAST_OCTET}:${APP_PORT}${APP_PATH}health
4. Add Forgejo webhook:
http://10.10.10.105:9000/webhook (secret in /root/hnf-credentials.txt)
http://10.10.10.105:9000/webhook (secret in /root/hotel-manage-credentials.txt)
5. Add deploy entry to the management repo: updater/deploy-map.js:
'${APP_NAME}': { host: '10.10.10.${LAST_OCTET}', path: '/opt/${APP_NAME}' }

View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash
# ┌─────────────────────────────────────────────────────────────────────────┐
# │ HNF Manage — Proxmox Stack Installer │
# │ Hotel Manage — Proxmox Stack Installer │
# │ Provisions: postgres · auth · portal · npm · management · noticeboard │
# │ │
# │ Run on the Proxmox host shell: │
@ -97,35 +97,35 @@ ensure_template() {
# ── Collect site config ───────────────────────────────────────────────────────
collect_config() {
SITE_NAME=$(whiptail --title "HNF Stack — Site Config" \
SITE_NAME=$(whiptail --title "Hotel Manage — Site Config" \
--inputbox "Site name:" 8 52 "Hotel Number Four" 3>&1 1>&2 2>&3) || exit 0
DOMAIN=$(whiptail --title "HNF Stack — Site Config" \
DOMAIN=$(whiptail --title "Hotel Manage — Site Config" \
--inputbox "Public domain (e.g. manage.hotelnumberfour.com):" 8 64 "manage.hotelnumberfour.com" \
3>&1 1>&2 2>&3) || exit 0
NPM_LAN_IP=$(whiptail --title "HNF Stack — Site Config" \
NPM_LAN_IP=$(whiptail --title "Hotel Manage — Site Config" \
--inputbox "NPM LXC static LAN IP (from your hotel LAN pool):" 8 64 "10.4.0.50" \
3>&1 1>&2 2>&3) || exit 0
LAN_GW=$(whiptail --title "HNF Stack — Site Config" \
LAN_GW=$(whiptail --title "Hotel Manage — Site Config" \
--inputbox "LAN gateway IP:" 8 52 "10.4.0.1" 3>&1 1>&2 2>&3) || exit 0
OFFICE_IP=$(whiptail --title "HNF Stack — Site Config" \
OFFICE_IP=$(whiptail --title "Hotel Manage — Site Config" \
--inputbox \
"Office IP / CIDR / DDNS hostname for offsite restriction.
Examples: 203.0.113.5 10.4.0.0/22 hotel.dyndns.org
Type 'disabled' to allow access from anywhere:" \
11 64 "disabled" 3>&1 1>&2 2>&3) || exit 0
ADMIN_EMAIL=$(whiptail --title "HNF Stack — Admin Account" \
ADMIN_EMAIL=$(whiptail --title "Hotel Manage — Admin Account" \
--inputbox "Admin user email:" 8 52 "" 3>&1 1>&2 2>&3) || exit 0
ADMIN_PASS=$(whiptail --title "HNF Stack — Admin Account" \
ADMIN_PASS=$(whiptail --title "Hotel Manage — Admin Account" \
--passwordbox "Admin user password:" 8 52 3>&1 1>&2 2>&3) || exit 0
# Deploy source — per-service Forgejo repos (default) or a local copy on this host
FORGEJO_BASE=$(whiptail --title "HNF Stack — Forgejo" \
FORGEJO_BASE=$(whiptail --title "Hotel Manage — Forgejo" \
--inputbox \
"Forgejo org/base URL hosting the per-service repos.
Each service is cloned from <base>/<service>.git
@ -135,7 +135,7 @@ Example: https://git.pterois.co.uk/hotel-manage-stack" \
13 66 "https://git.pterois.co.uk/hotel-manage-stack" 3>&1 1>&2 2>&3) || exit 0
FORGEJO_BASE="${FORGEJO_BASE%/}"
FORGEJO_TOKEN=$(whiptail --title "HNF Stack — Forgejo Token" \
FORGEJO_TOKEN=$(whiptail --title "Hotel Manage — Forgejo Token" \
--passwordbox \
"The repos are PUBLIC — leave this blank.
@ -144,7 +144,7 @@ from Forgejo → Settings → Applications, scope read:repository,
which gets embedded in each LXC's git remote for the updater.)" \
12 66 3>&1 1>&2 2>&3) || exit 0
if whiptail --title "HNF Stack — Deploy Source" --yesno \
if whiptail --title "Hotel Manage — Deploy Source" --yesno \
"Deploy services from Forgejo? (recommended)\n\nNo = copy from a local repo at ${REPO_ROOT}\n(only works if you already copied the repo to this host)" \
11 62; then
USE_FORGEJO=true
@ -152,24 +152,24 @@ which gets embedded in each LXC's git remote for the updater.)" \
USE_FORGEJO=false
fi
BACKUP_REMOTE=$(whiptail --title "HNF Stack — Backup" \
BACKUP_REMOTE=$(whiptail --title "Hotel Manage — Backup" \
--inputbox \
"Backup rsync target (leave blank to skip backup config).
Example: backup@192.168.1.10:/backups/hnf" \
Example: backup@192.168.1.10:/backups/hotel-manage" \
10 64 "" 3>&1 1>&2 2>&3) || exit 0
# Confirm LXC allocation
whiptail --title "HNF Stack — Confirm" --yesno \
whiptail --title "Hotel Manage — Confirm" --yesno \
"LXCs to be created (storage: ${STORAGE}):
ID Hostname IP
──────────────────────────────────────────
100 hnf-postgres 10.10.10.100
101 hnf-auth 10.10.10.101
102 hnf-portal 10.10.10.102
103 hnf-npm 10.10.10.103 / ${NPM_LAN_IP} (dual-homed)
105 hnf-management 10.10.10.105
112 hnf-noticeboard 10.10.10.112
100 hotel-manage-postgres 10.10.10.100
101 hotel-manage-auth 10.10.10.101
102 hotel-manage-portal 10.10.10.102
103 hotel-manage-npm 10.10.10.103 / ${NPM_LAN_IP} (dual-homed)
105 hotel-manage-management 10.10.10.105
112 hotel-manage-noticeboard 10.10.10.112
Domain: ${DOMAIN}
Admin: ${ADMIN_EMAIL}
@ -187,8 +187,8 @@ gen_secrets() {
WEBHOOK_SECRET=$(openssl rand -hex 24)
NPM_ADMIN_PASS=$(openssl rand -base64 12 | tr -dc 'a-zA-Z0-9' | head -c 12)
cat > /root/hnf-credentials.txt <<EOF
# HNF Manage credentials — generated $(date '+%Y-%m-%d %H:%M')
cat > /root/hotel-manage-credentials.txt <<EOF
# Hotel Manage credentials — generated $(date '+%Y-%m-%d %H:%M')
# !! KEEP THIS FILE SAFE — store a copy offsite !!
SITE_NAME=${SITE_NAME}
@ -211,22 +211,22 @@ FORGEJO_TOKEN=${FORGEJO_TOKEN}
BACKUP_REMOTE=${BACKUP_REMOTE}
EOF
chmod 600 /root/hnf-credentials.txt
msg_ok "Secrets generated → /root/hnf-credentials.txt"
chmod 600 /root/hotel-manage-credentials.txt
msg_ok "Secrets generated → /root/hotel-manage-credentials.txt"
}
# ── SSH keypair for management → app LXCs ────────────────────────────────────
gen_mgmt_ssh_key() {
if [[ ! -f /root/.ssh/hnf_management ]]; then
if [[ ! -f /root/.ssh/hotel-manage_deploy ]]; then
msg_info "Generating management SSH keypair"
mkdir -p /root/.ssh
ssh-keygen -t ed25519 -f /root/.ssh/hnf_management -N "" -C "hnf-management-deploy" &>/dev/null
msg_ok "SSH keypair generated → /root/.ssh/hnf_management"
ssh-keygen -t ed25519 -f /root/.ssh/hotel-manage_deploy -N "" -C "hotel-manage-management-deploy" &>/dev/null
msg_ok "SSH keypair generated → /root/.ssh/hotel-manage_deploy"
else
msg_ok "Using existing SSH keypair at /root/.ssh/hnf_management"
msg_ok "Using existing SSH keypair at /root/.ssh/hotel-manage_deploy"
fi
MGMT_PUBKEY=$(cat /root/.ssh/hnf_management.pub)
echo "${MGMT_PUBKEY}" >> /root/hnf-credentials.txt
MGMT_PUBKEY=$(cat /root/.ssh/hotel-manage_deploy.pub)
echo "${MGMT_PUBKEY}" >> /root/hotel-manage-credentials.txt
}
# ── LXC lifecycle helpers ─────────────────────────────────────────────────────
@ -244,16 +244,30 @@ lxc_running() {
pct status "$1" 2>/dev/null | grep -q "running"
}
# Group the stack in a Proxmox resource pool + tag for tidy UI organisation.
POOL="hotel-manage"
POOL_OPT=""
ensure_pool() {
if ! pvesh get "/pools/${POOL}" &>/dev/null; then
msg_info "Creating Proxmox resource pool '${POOL}'"
pvesh create /pools --poolid "${POOL}" --comment "Hotel Manage stack" &>/dev/null || true
pvesh get "/pools/${POOL}" &>/dev/null && msg_ok "Pool '${POOL}' ready" \
|| msg_warn "Could not create pool '${POOL}' — continuing without it"
fi
# Only pass --pool if it actually exists (else pct create would fail)
pvesh get "/pools/${POOL}" &>/dev/null && POOL_OPT="--pool ${POOL}"
}
create_lxc() {
local id=$1 ip=$2 name=$3 mem=${4:-512} cores=${5:-1}
if lxc_exists "$id"; then
msg_warn "LXC $id (hnf-${name}) already exists — skipping creation"
msg_warn "LXC $id (hotel-manage-${name}) already exists — skipping creation"
lxc_running "$id" || pct start "$id"
return
fi
local tmpl; tmpl=$(get_template)
pct create "$id" "$tmpl" \
--hostname "hnf-${name}" \
--hostname "hotel-manage-${name}" \
--memory "$mem" \
--cores "$cores" \
--rootfs "${STORAGE}:8" \
@ -261,6 +275,8 @@ create_lxc() {
--features nesting=1 \
--unprivileged 0 \
--onboot 1 \
--tags "${POOL}" \
${POOL_OPT} \
--start 1 &>/dev/null
sleep 5 # let systemd start
}
@ -268,13 +284,13 @@ create_lxc() {
create_npm_lxc() {
local id=103
if lxc_exists "$id"; then
msg_warn "LXC $id (hnf-npm) already exists — skipping creation"
msg_warn "LXC $id (hotel-manage-npm) already exists — skipping creation"
lxc_running "$id" || pct start "$id"
return
fi
local tmpl; tmpl=$(get_template)
pct create "$id" "$tmpl" \
--hostname "hnf-npm" \
--hostname "hotel-manage-npm" \
--memory 512 \
--cores 1 \
--rootfs "${STORAGE}:8" \
@ -283,6 +299,8 @@ create_npm_lxc() {
--features nesting=1 \
--unprivileged 0 \
--onboot 1 \
--tags "${POOL}" \
${POOL_OPT} \
--start 1 &>/dev/null
sleep 5
}
@ -320,7 +338,7 @@ install_mgmt_key() {
push_file() {
# Write content to a temp file, push into LXC, remove temp
local id=$1 dest=$2; shift 2
local tmp; tmp=$(mktemp /tmp/hnf-push-XXXX)
local tmp; tmp=$(mktemp /tmp/hotel-manage-push-XXXX)
cat > "$tmp" # reads stdin
pct push "$id" "$tmp" "$dest" 2>/dev/null
rm -f "$tmp"
@ -329,14 +347,14 @@ push_file() {
push_dir() {
# tar local dir → push tarball → extract in LXC at parent of dest
local id=$1 src=$2 dest=$3
local tmp; tmp=$(mktemp /tmp/hnf-dir-XXXX.tar.gz)
local tmp; tmp=$(mktemp /tmp/hotel-manage-dir-XXXX.tar.gz)
tar czf "$tmp" -C "$(dirname "$src")" "$(basename "$src")" 2>/dev/null
pct push "$id" "$tmp" /tmp/hnf-deploy.tar.gz 2>/dev/null
pct push "$id" "$tmp" /tmp/hotel-manage-deploy.tar.gz 2>/dev/null
pct exec "$id" -- bash -c "
mkdir -p '$(dirname "$dest")'
tar xzf /tmp/hnf-deploy.tar.gz -C '$(dirname "$dest")'
tar xzf /tmp/hotel-manage-deploy.tar.gz -C '$(dirname "$dest")'
mv '$(dirname "$dest")/$(basename "$src")' '${dest}' 2>/dev/null || true
rm -f /tmp/hnf-deploy.tar.gz
rm -f /tmp/hotel-manage-deploy.tar.gz
" &>/dev/null
rm -f "$tmp"
}
@ -380,7 +398,7 @@ wait_healthy() {
wait_pg() {
local max=30 i=0
while ! pct exec 100 -- bash -c \
"docker exec hnf-postgres pg_isready -U postgres" &>/dev/null; do
"docker exec hotel-manage-postgres pg_isready -U postgres" &>/dev/null; do
sleep 3; ((i++))
[[ $i -ge $max ]] && { msg_warn "Postgres not ready after 90s"; return 1; }
done
@ -407,7 +425,7 @@ deploy_postgres() {
push_file 100 /opt/postgres/docker-compose.yml <<'EOF'
services:
postgres:
container_name: hnf-postgres
container_name: hotel-manage-postgres
image: postgres:16-alpine
environment:
- POSTGRES_USER=postgres
@ -548,7 +566,7 @@ deploy_npm() {
push_file 103 /opt/npm/docker-compose.yml <<'EOF'
services:
npm:
container_name: hnf-npm
container_name: hotel-manage-npm
image: jc21/nginx-proxy-manager:latest
ports:
- "80:80"
@ -591,8 +609,8 @@ deploy_management() {
# Copy the management SSH private key into management container
pct exec 105 -- mkdir -p /root/.ssh
pct push 105 /root/.ssh/hnf_management /root/.ssh/hnf_management &>/dev/null
pct exec 105 -- chmod 600 /root/.ssh/hnf_management
pct push 105 /root/.ssh/hotel-manage_deploy /root/.ssh/hotel-manage_deploy &>/dev/null
pct exec 105 -- chmod 600 /root/.ssh/hotel-manage_deploy
msg_info "Deploying management stack"
deploy_service 105 "management" "${REPO_ROOT}/management" /opt/management
@ -742,7 +760,7 @@ print_summary() {
printf "\n${GN}"
cat <<SUMMARY
╔══════════════════════════════════════════════════════════════╗
║ HNF Manage — Stack Deployed ║
║ Hotel Manage — Stack Deployed ║
╚══════════════════════════════════════════════════════════════╝
SUMMARY
printf "${CL}"
@ -754,18 +772,18 @@ SUMMARY
── Services ──────────────────────────────────────────────────
LXC Hostname IP Port Status
100 hnf-postgres 10.10.10.100 5432 (internal only)
101 hnf-auth 10.10.10.101 3001 /api/auth/*
102 hnf-portal 10.10.10.102 3000 /
103 hnf-npm 10.10.10.3 80/443 entry point
100 hotel-manage-postgres 10.10.10.100 5432 (internal only)
101 hotel-manage-auth 10.10.10.101 3001 /api/auth/*
102 hotel-manage-portal 10.10.10.102 3000 /
103 hotel-manage-npm 10.10.10.3 80/443 entry point
(LAN) ${NPM_LAN_IP} 81 NPM admin
105 hnf-management 10.10.10.105 3002 Uptime Kuma
105 hotel-manage-management 10.10.10.105 3002 Uptime Kuma
9000 Forgejo webhooks
112 hnf-noticeboard 10.10.10.112 3080 /notices/
112 hotel-manage-noticeboard 10.10.10.112 3080 /notices/
── Credentials ───────────────────────────────────────────────
Admin login: ${ADMIN_EMAIL}
Credentials: /root/hnf-credentials.txt (chmod 600)
Credentials: /root/hotel-manage-credentials.txt (chmod 600)
── Next steps ────────────────────────────────────────────────
1. Point DNS: ${DOMAIN}${NPM_LAN_IP}
@ -800,6 +818,7 @@ check_vmbr1
collect_config
gen_secrets
gen_mgmt_ssh_key
ensure_pool
deploy_postgres
deploy_auth