From 323dea6798f71a1d772a324a67b141b0a21815d3 Mon Sep 17 00:00:00 2001 From: Pouzor Date: Tue, 7 Apr 2026 00:49:52 +0200 Subject: [PATCH] Remove custom proxmox script and doc --- INSTALLATION.md | 20 ++---- scripts/install-proxmox.sh | 134 ----------------------------------- scripts/lxc-install.sh | 138 ------------------------------------- scripts/update.sh | 66 ------------------ 4 files changed, 5 insertions(+), 353 deletions(-) delete mode 100755 scripts/install-proxmox.sh delete mode 100755 scripts/lxc-install.sh delete mode 100755 scripts/update.sh diff --git a/INSTALLATION.md b/INSTALLATION.md index 049bd13..1d0a5d0 100644 --- a/INSTALLATION.md +++ b/INSTALLATION.md @@ -53,25 +53,15 @@ docker compose up -d ## Proxmox LXC Install -Run this **on the Proxmox host** — it creates a Debian 12 LXC container and installs Homelable inside automatically: +You can now install Homelable with community-scripts (proxmox-VE) : + +`https://community-scripts.org/scripts/homelable` + ```bash -bash <(curl -fsSL https://raw.githubusercontent.com/Pouzor/homelable/main/scripts/install-proxmox.sh) +bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/homelable.sh)" ``` -Default container settings: 2 cores, 1 GB RAM, 8 GB disk, DHCP on `vmbr0`. Override before running: - -```bash -CTID=150 RAM=2048 STORAGE=local-zfs bash <(curl -fsSL .../install-proxmox.sh) -``` - -The backend runs as a systemd service, the frontend is served via nginx on port 80. - -> To install manually inside an existing Debian/Ubuntu machine or LXC: -> ```bash -> bash <(curl -fsSL https://raw.githubusercontent.com/Pouzor/homelable/main/scripts/lxc-install.sh) -> ``` - ### Update (LXC) Run the update script inside the container (pulls latest code, rebuilds frontend, restarts services — `.env` and database are never touched): diff --git a/scripts/install-proxmox.sh b/scripts/install-proxmox.sh deleted file mode 100755 index 34a8c0b..0000000 --- a/scripts/install-proxmox.sh +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env bash -# Homelable — Proxmox VE LXC creator -# Run this on the Proxmox HOST (not inside a container): -# bash <(curl -fsSL https://raw.githubusercontent.com/Pouzor/homelable/main/scripts/install-proxmox.sh) - -set -euo pipefail - -RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m' -info() { echo -e "${GREEN}[homelable]${NC} $*"; } -warn() { echo -e "${YELLOW}[homelable]${NC} $*"; } -error() { echo -e "${RED}[homelable]${NC} $*"; exit 1; } -step() { echo -e "\n${CYAN}▶ $*${NC}"; } - -# ── Must run on a Proxmox VE host ───────────────────────────────────────────── -[[ $EUID -ne 0 ]] && error "Run as root on the Proxmox host" -command -v pct &>/dev/null || error "pct not found — run this on a Proxmox VE host, not inside a container" - -# ── Detect available storages for LXC rootfs ────────────────────────────────── -mapfile -t STORAGES < <(pvesm status --content rootdir 2>/dev/null | awk 'NR>1 && $3=="active" {print $1}') -[[ ${#STORAGES[@]} -eq 0 ]] && error "No active storage found that supports LXC rootfs (rootdir content type)" - -if [[ ${#STORAGES[@]} -eq 1 ]]; then - DEFAULT_STORAGE="${STORAGES[0]}" -else - echo "" - echo "Available storages:" - for i in "${!STORAGES[@]}"; do - echo " $((i+1))) ${STORAGES[$i]}" - done - read -rp "Select storage [1]: " STORAGE_IDX - STORAGE_IDX="${STORAGE_IDX:-1}" - DEFAULT_STORAGE="${STORAGES[$((STORAGE_IDX-1))]}" -fi - -# ── Settings (override via env vars) ────────────────────────────────────────── -CT_HOSTNAME="${CT_HOSTNAME:-homelable}" -STORAGE="${STORAGE:-$DEFAULT_STORAGE}" -DISK_SIZE="${DISK_SIZE:-8}" # GB -RAM="${RAM:-1024}" # MB -CORES="${CORES:-2}" -BRIDGE="${BRIDGE:-vmbr0}" -RAW="https://raw.githubusercontent.com/Pouzor/homelable/main" - -# ── Interactive prompts ──────────────────────────────────────────────────────── -DEFAULT_CTID="$(pvesh get /cluster/nextid 2>/dev/null || echo 200)" - -if [[ -z "${CTID:-}" ]]; then - read -rp "Container ID [${DEFAULT_CTID}]: " CTID_INPUT - CTID="${CTID_INPUT:-$DEFAULT_CTID}" -fi - -if [[ -z "${ROOT_PASSWORD:-}" ]]; then - while true; do - read -rsp "Root password for LXC container: " ROOT_PASSWORD - echo "" - [[ -z "$ROOT_PASSWORD" ]] && warn "Password cannot be empty, try again." && continue - read -rsp "Confirm root password: " ROOT_PASSWORD_CONFIRM - echo "" - [[ "$ROOT_PASSWORD" == "$ROOT_PASSWORD_CONFIRM" ]] && break - warn "Passwords do not match, try again." - done -fi - -step "Creating Homelable LXC (CTID=$CTID, hostname=$CT_HOSTNAME, storage=$STORAGE)" - -# ── Download Debian 12 template if needed ───────────────────────────────────── -TEMPLATE_STORAGE=$(pvesm status --content vztmpl | awk 'NR>1 {print $1; exit}') -TEMPLATE=$(pveam list "$TEMPLATE_STORAGE" 2>/dev/null | grep "debian-12" | tail -1 | awk '{print $1}') - -if [[ -z "$TEMPLATE" ]]; then - info "Downloading Debian 12 LXC template..." - pveam update - TEMPLATE_NAME=$(pveam available --section system | grep "debian-12" | tail -1 | awk '{print $2}') - [[ -z "$TEMPLATE_NAME" ]] && error "Could not find a Debian 12 template" - pveam download "$TEMPLATE_STORAGE" "$TEMPLATE_NAME" - TEMPLATE="$TEMPLATE_STORAGE:vztmpl/$TEMPLATE_NAME" -fi - -info "Using template: $TEMPLATE" - -# ── Create the container ─────────────────────────────────────────────────────── -pct create "$CTID" "$TEMPLATE" \ - --hostname "$CT_HOSTNAME" \ - --storage "$STORAGE" \ - --rootfs "${STORAGE}:${DISK_SIZE}" \ - --memory "$RAM" \ - --cores "$CORES" \ - --net0 "name=eth0,bridge=${BRIDGE},ip=dhcp${VLAN_TAG:+,tag=${VLAN_TAG}}" \ - --ostype debian \ - --unprivileged 1 \ - --features "nesting=1" \ - --password "$ROOT_PASSWORD" \ - --start 1 - -info "Container $CTID created and started" - -# ── Wait for container to be ready ──────────────────────────────────────────── -info "Waiting for container to be ready..." -for i in $(seq 1 30); do - if pct exec "$CTID" -- test -x /usr/bin/apt-get &>/dev/null; then - break - fi - [[ $i -eq 30 ]] && error "Container did not become ready after 30s" - sleep 1 -done - -# Wait a bit more for network (DHCP lease) -info "Waiting for network (DHCP)..." -for i in $(seq 1 20); do - if pct exec "$CTID" -- sh -c "ip route | grep -q default" &>/dev/null; then - break - fi - [[ $i -eq 20 ]] && error "Container has no default route after 20s — check bridge $BRIDGE" - sleep 1 -done - -# ── Grant NET_RAW for nmap (ping-based checks) ───────────────────────────────── -echo "lxc.cap.keep = net_raw net_bind_service" >> "/etc/pve/lxc/${CTID}.conf" 2>/dev/null || true - -# ── Bootstrap curl then run the installer ───────────────────────────────────── -step "Running Homelable installer inside container $CTID..." -pct exec "$CTID" -- apt-get install -y -qq curl -pct exec "$CTID" -- bash -c "curl -fsSL ${RAW}/scripts/lxc-install.sh | bash" - -# ── Done ────────────────────────────────────────────────────────────────────── -IP=$(pct exec "$CTID" -- hostname -I 2>/dev/null | awk '{print $1}' || echo "") -echo "" -echo -e " ${GREEN}✓ Homelable installed in LXC $CTID${NC}" -echo -e " ${GREEN}✓ Open http://${IP}${NC}" -echo -e " Homelable login: ${YELLOW}admin / admin${NC}" -echo -e " LXC root SSH: ${YELLOW}root / ${NC}" -echo -e " ${YELLOW}⚠ Change the Homelable password after first login${NC}" -echo -e " ${YELLOW} - edit /opt/homelable/backend/.env (AUTH_PASSWORD_HASH)${NC}" -echo "" diff --git a/scripts/lxc-install.sh b/scripts/lxc-install.sh deleted file mode 100755 index f8827b4..0000000 --- a/scripts/lxc-install.sh +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env bash -# Homelable — in-container installer -# Runs INSIDE a Debian/Ubuntu LXC container (called automatically by install-proxmox.sh) -# Can also be run manually inside any Debian/Ubuntu machine: -# bash <(curl -fsSL https://raw.githubusercontent.com/Pouzor/homelable/main/scripts/lxc-install.sh) - -set -euo pipefail - -INSTALL_DIR=/opt/homelable -DATA_DIR=/opt/homelable/data -SERVICE_USER=homelable -REPO_URL="https://github.com/Pouzor/homelable.git" - -RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' -info() { echo -e "${GREEN}[homelable]${NC} $*"; } -warn() { echo -e "${YELLOW}[homelable]${NC} $*"; } -error() { echo -e "${RED}[homelable]${NC} $*"; exit 1; } - -[[ $EUID -ne 0 ]] && error "Run as root (sudo bash ...)" - -# ── Detect OS ───────────────────────────────────────────────────────────────── -if [[ -f /etc/os-release ]]; then - # shellcheck source=/dev/null - . /etc/os-release -else - error "Cannot detect OS" -fi -info "Detected: $PRETTY_NAME" -[[ "$ID" =~ ^(debian|ubuntu)$ ]] || error "Requires Debian or Ubuntu" - -# ── System deps ─────────────────────────────────────────────────────────────── -info "Installing system dependencies..." -apt-get update -apt-get install -y --fix-missing python3 python3-pip python3-venv nmap curl git nginx - -# ── Node.js 20 ──────────────────────────────────────────────────────────────── -if ! command -v node &>/dev/null; then - info "Installing Node.js 20..." - curl -fsSL https://deb.nodesource.com/setup_20.x | bash - - apt-get install -y -qq nodejs -fi - -# ── Service user ────────────────────────────────────────────────────────────── -if ! id "$SERVICE_USER" &>/dev/null; then - useradd --system --shell /sbin/nologin "$SERVICE_USER" - info "Created service user: $SERVICE_USER" -fi - -# ── Clone / update repo ─────────────────────────────────────────────────────── -if [[ -d "$INSTALL_DIR/.git" ]]; then - info "Updating existing installation..." - git -C "$INSTALL_DIR" pull --quiet -else - info "Cloning repository..." - git clone --quiet "$REPO_URL" "$INSTALL_DIR" -fi - -mkdir -p "$DATA_DIR" - -# ── Backend ─────────────────────────────────────────────────────────────────── -info "Setting up Python backend..." -cd "$INSTALL_DIR/backend" -python3 -m venv .venv -.venv/bin/pip install --quiet -r requirements.txt - -# Generate .env if missing -if [[ ! -f .env ]]; then - SECRET=$(python3 -c "import secrets; print(secrets.token_urlsafe(32))") - # Default hash = bcrypt of "admin" (same as .env.example) - cat > .env < /etc/systemd/system/homelable-backend.service < /etc/nginx/sites-available/homelable - -ln -sf /etc/nginx/sites-available/homelable /etc/nginx/sites-enabled/homelable -rm -f /etc/nginx/sites-enabled/default -nginx -t -systemctl reload nginx || systemctl start nginx - -# ── Enable & start ──────────────────────────────────────────────────────────── -systemctl daemon-reload -systemctl enable --now homelable-backend -systemctl enable --now nginx - -info "Done!" -echo "" -echo -e " ${GREEN}Homelable is running at http://$(hostname -I | awk '{print $1}')${NC}" -echo -e " Default login: admin / admin" -echo -e " ${YELLOW}⚠ Change the password: edit $INSTALL_DIR/backend/.env (AUTH_PASSWORD_HASH)${NC}" -echo "" diff --git a/scripts/update.sh b/scripts/update.sh deleted file mode 100755 index 6359ee6..0000000 --- a/scripts/update.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env bash -# Homelable — update to latest version -# Run inside the LXC / any Linux host where lxc-install.sh was used: -# bash /opt/homelable/scripts/update.sh -# Or pull-and-run directly: -# bash <(curl -fsSL https://raw.githubusercontent.com/Pouzor/homelable/main/scripts/update.sh) - -set -euo pipefail - -INSTALL_DIR=/opt/homelable - -RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' -info() { echo -e "${GREEN}[homelable]${NC} $*"; } -warn() { echo -e "${YELLOW}[homelable]${NC} $*"; } -error() { echo -e "${RED}[homelable]${NC} $*"; exit 1; } - -[[ $EUID -ne 0 ]] && error "Run as root (sudo bash ...)" -[[ -d "$INSTALL_DIR/.git" ]] || error "Homelable not found at $INSTALL_DIR — run lxc-install.sh first" - -# ── Pull latest code ────────────────────────────────────────────────────────── -info "Pulling latest code..." -BEFORE=$(git -C "$INSTALL_DIR" rev-parse HEAD) -git -C "$INSTALL_DIR" pull --quiet -AFTER=$(git -C "$INSTALL_DIR" rev-parse HEAD) - -if [[ "$BEFORE" == "$AFTER" ]]; then - info "Already up to date." - exit 0 -fi - -echo "" -info "Changes since last update:" -git -C "$INSTALL_DIR" log --oneline "${BEFORE}..${AFTER}" -echo "" - -# ── Stop backend ───────────────────────────────────────────────────────────── -info "Stopping backend service..." -systemctl stop homelable-backend - -# ── Backend deps ───────────────────────────────────────────────────────────── -info "Updating Python dependencies..." -cd "$INSTALL_DIR/backend" -.venv/bin/pip install --quiet -r requirements.txt - -# ── Frontend build ──────────────────────────────────────────────────────────── -info "Rebuilding frontend..." -cd "$INSTALL_DIR/frontend" -npm ci --silent -npm run build - -# ── nginx config ───────────────────────────────────────────────────────────── -info "Updating nginx config..." -sed \ - -e 's|http://backend:8000|http://127.0.0.1:8000|g' \ - -e "s|/usr/share/nginx/html|$INSTALL_DIR/frontend/dist|g" \ - "$INSTALL_DIR/docker/nginx.conf" > /etc/nginx/sites-available/homelable -nginx -t && systemctl reload nginx - -# ── Restart backend ─────────────────────────────────────────────────────────── -info "Starting backend service..." -systemctl start homelable-backend - -echo "" -echo -e " ${GREEN}Homelable updated successfully!${NC}" -echo -e " Running at http://$(hostname -I | awk '{print $1}')" -echo ""