Files
lisilou-portfolio/install.sh
T
jhodgkin 68fda8be49 Simplify template detection - check local first
Directly check pveam list local for existing Debian 12 template
before attempting download.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 12:07:57 -07:00

220 lines
6.7 KiB
Bash

#!/usr/bin/env bash
# LisiLou Portfolio - Proxmox LXC Helper Script
# Run this script on your Proxmox host to create an LXC container with the portfolio
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Default values
CTID="${CTID:-}"
HOSTNAME="${HOSTNAME:-lisilou-portfolio}"
MEMORY="${MEMORY:-512}"
DISK="${DISK:-4}"
CORES="${CORES:-1}"
STORAGE="${STORAGE:-local-lvm}"
TEMPLATE_STORAGE="${TEMPLATE_STORAGE:-local}"
BRIDGE="${BRIDGE:-vmbr0}"
REPO_URL="https://github.com/jhodgkin/lisilou-portfolio.git"
header() {
echo -e "\n${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BLUE} $1${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
}
msg() {
echo -e "${GREEN}[INFO]${NC} $1"
}
warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
error() {
echo -e "${RED}[ERROR]${NC} $1"
exit 1
}
header "LisiLou Photography Portfolio - Proxmox Installer"
# Check if running on Proxmox
if ! command -v pveversion &> /dev/null; then
error "This script must be run on a Proxmox VE host"
fi
msg "Proxmox VE $(pveversion | cut -d'/' -f2) detected"
# Get next available CTID if not specified
if [ -z "$CTID" ]; then
CTID=$(pvesh get /cluster/nextid)
msg "Using next available CTID: $CTID"
fi
# Prompt for configuration
echo ""
read -p "Container ID [$CTID]: " input
CTID="${input:-$CTID}"
read -p "Hostname [$HOSTNAME]: " input
HOSTNAME="${input:-$HOSTNAME}"
read -p "Memory in MB [$MEMORY]: " input
MEMORY="${input:-$MEMORY}"
read -p "Disk size in GB [$DISK]: " input
DISK="${input:-$DISK}"
read -p "CPU cores [$CORES]: " input
CORES="${input:-$CORES}"
read -p "Storage [$STORAGE]: " input
STORAGE="${input:-$STORAGE}"
read -p "Network bridge [$BRIDGE]: " input
BRIDGE="${input:-$BRIDGE}"
echo ""
read -p "Use DHCP for networking? [Y/n]: " use_dhcp
use_dhcp="${use_dhcp:-Y}"
if [[ "${use_dhcp,,}" != "y" ]]; then
read -p "IP Address (e.g., 192.168.1.100/24): " IP_ADDR
read -p "Gateway: " GATEWAY
NET_CONFIG="name=eth0,bridge=$BRIDGE,ip=$IP_ADDR,gw=$GATEWAY"
else
NET_CONFIG="name=eth0,bridge=$BRIDGE,ip=dhcp"
fi
# Find container template
header "Checking Container Template"
# Check for existing local Debian 12 template first
msg "Checking for local templates..."
TEMPLATE=$(pveam list local 2>/dev/null | grep "debian-12" | head -1 | awk '{print $1}')
if [ -n "$TEMPLATE" ]; then
msg "Found local template: $TEMPLATE"
else
# Need to download
msg "No local Debian 12 template found. Downloading..."
pveam update
# Get the template name from available list
TEMPLATE_NAME=$(pveam available --section system | grep "debian-12-standard" | awk '{print $2}' | head -1)
if [ -z "$TEMPLATE_NAME" ]; then
error "Could not find Debian 12 template to download"
fi
msg "Downloading $TEMPLATE_NAME..."
pveam download local "$TEMPLATE_NAME"
TEMPLATE="local:vztmpl/$TEMPLATE_NAME"
fi
msg "Will use template: $TEMPLATE"
# Create container
header "Creating LXC Container"
msg "Creating container $CTID ($HOSTNAME)..."
msg "Using template: $TEMPLATE"
pct create $CTID "$TEMPLATE" \
--hostname $HOSTNAME \
--memory $MEMORY \
--cores $CORES \
--rootfs $STORAGE:$DISK \
--net0 $NET_CONFIG \
--unprivileged 1 \
--features nesting=1,keyctl=1 \
--onboot 1 \
--start 0
msg "Container created successfully"
# Start container
msg "Starting container..."
pct start $CTID
sleep 5
# Wait for network
msg "Waiting for network..."
for i in {1..30}; do
if pct exec $CTID -- ping -c 1 google.com &> /dev/null; then
break
fi
sleep 2
done
# Install Docker and setup application
header "Installing Docker & Application"
pct exec $CTID -- bash -c "
set -e
echo '[INFO] Updating system...'
apt-get update
apt-get upgrade -y
echo '[INFO] Installing dependencies...'
apt-get install -y ca-certificates curl gnupg git
echo '[INFO] Adding Docker repository...'
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo \"deb [arch=\$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \$(. /etc/os-release && echo \$VERSION_CODENAME) stable\" > /etc/apt/sources.list.d/docker.list
echo '[INFO] Installing Docker...'
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
echo '[INFO] Enabling Docker service...'
systemctl enable docker
systemctl start docker
echo '[INFO] Cloning repository...'
cd /opt
git clone $REPO_URL
cd lisilou-portfolio
echo '[INFO] Creating Docker network...'
docker network create web || true
echo '[INFO] Starting application...'
docker compose up -d
echo '[INFO] Installation complete!'
"
# Get container IP
header "Installation Complete!"
CONTAINER_IP=$(pct exec $CTID -- hostname -I | awk '{print $1}')
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN} LisiLou Portfolio has been deployed successfully!${NC}"
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
echo -e " ${BLUE}Container ID:${NC} $CTID"
echo -e " ${BLUE}Hostname:${NC} $HOSTNAME"
echo -e " ${BLUE}IP Address:${NC} $CONTAINER_IP"
echo -e " ${BLUE}Portfolio URL:${NC} http://$CONTAINER_IP:8080"
echo ""
echo -e " ${YELLOW}Configuration:${NC}"
echo -e " Edit: /opt/lisilou-portfolio/config/site.json"
echo ""
echo -e " ${YELLOW}Useful commands (run inside container):${NC}"
echo -e " pct enter $CTID"
echo -e " cd /opt/lisilou-portfolio"
echo -e " docker compose logs -f"
echo -e " docker compose restart"
echo ""
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"