#!/bin/bash set -euo pipefail # Load IP configuration SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" source "${PROJECT_ROOT}/config/ip-addresses.conf" 2>/dev/null || true # Fix NPMplus installation - handles the compose.yaml issue set -e PROXMOX_HOST="${1:-192.168.11.11}" CONTAINER_ID="${2}" if [ -z "$CONTAINER_ID" ]; then echo "Usage: $0 [PROXMOX_HOST] [CONTAINER_ID]" echo "" echo "Find container ID:" echo " ssh root@$PROXMOX_HOST 'pct list | tail -5'" exit 1 fi TZ="${3:-America/New_York}" ACME_EMAIL="${4:-nsatoshi2007@hotmail.com}" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "🔧 Fixing NPMplus Installation" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" echo "Container ID: $CONTAINER_ID" echo "" # Check if container exists and is running CONTAINER_STATUS=$(ssh root@"$PROXMOX_HOST" "pct status $CONTAINER_ID 2>&1" || echo "not found") if echo "$CONTAINER_STATUS" | grep -q "not found\|does not exist"; then echo "❌ Container $CONTAINER_ID does not exist" exit 1 fi if ! echo "$CONTAINER_STATUS" | grep -q "running"; then echo "🚀 Starting container..." ssh root@"$PROXMOX_HOST" "pct start $CONTAINER_ID" sleep 3 fi echo "📦 Fixing NPMplus installation..." ssh root@"$PROXMOX_HOST" "pct exec $CONTAINER_ID -- bash" << FIX_EOF set -e echo "📋 Checking current state..." cd /opt # Check if compose.yaml exists if [ ! -f compose.yaml ]; then echo " ⚠️ compose.yaml not found, downloading..." curl -fsSL "https://raw.githubusercontent.com/ZoeyVid/NPMplus/refs/heads/develop/compose.yaml" -o compose.yaml || { echo " ❌ Failed to download compose.yaml" exit 1 } echo " ✅ compose.yaml downloaded" else echo " ✅ compose.yaml exists" fi # Verify compose.yaml is valid if ! docker compose config >/dev/null 2>&1; then echo " ⚠️ compose.yaml is invalid, re-downloading..." mv compose.yaml compose.yaml.bak curl -fsSL "https://raw.githubusercontent.com/ZoeyVid/NPMplus/refs/heads/develop/compose.yaml" -o compose.yaml fi # Update compose file with timezone and email echo " 📝 Updating compose.yaml with timezone and email..." if command -v yq >/dev/null 2>&1; then yq -i " .services.npmplus.environment |= (map(select(. != \"TZ=*\" and . != \"ACME_EMAIL=*\")) + [\"TZ=$TZ\", \"ACME_EMAIL=$ACME_EMAIL\"]) " compose.yaml echo " ✅ Updated with TZ=$TZ and ACME_EMAIL=$ACME_EMAIL" else echo " ⚠️ yq not found, skipping environment variable update" echo " 💡 You may need to update compose.yaml manually" fi # Check if Docker is running if ! pgrep dockerd >/dev/null; then echo " 🐳 Starting Docker..." rc-service docker start rc-update add docker default sleep 5 fi # Check if docker compose plugin is available if ! docker compose version >/dev/null 2>&1; then echo " 📦 Installing docker compose plugin..." # Install docker compose plugin DOCKER_COMPOSE_VERSION=\$(curl -fsSL https://api.github.com/repos/docker/compose/releases/latest | grep '"tag_name":' | cut -d'"' -f4) DOCKER_CONFIG=\${DOCKER_CONFIG:-\$HOME/.docker} mkdir -p \$DOCKER_CONFIG/cli-plugins curl -fsSL "https://github.com/docker/compose/releases/download/\$DOCKER_COMPOSE_VERSION/docker-compose-linux-x86_64" -o \$DOCKER_CONFIG/cli-plugins/docker-compose chmod +x \$DOCKER_CONFIG/cli-plugins/docker-compose echo " ✅ Docker compose plugin installed" fi # Verify we're in the right directory echo " 📍 Current directory: \$(pwd)" echo " 📄 Files in /opt:" ls -la /opt/ | head -10 # Try to start NPMplus echo "" echo "🚀 Starting NPMplus..." cd /opt docker compose up -d || { echo " ⚠️ docker compose up failed, checking logs..." docker compose ps echo "" echo " 💡 Try running manually:" echo " cd /opt" echo " docker compose up -d" exit 1 } echo " ✅ NPMplus started" # Wait for container to be ready echo "" echo "⏳ Waiting for NPMplus to be ready..." CONTAINER_ID="" for i in {1..60}; do CONTAINER_ID=\$(docker ps --filter "name=npmplus" --format "{{.ID}}") if [ -n "\$CONTAINER_ID" ]; then STATUS=\$(docker inspect --format '{{.State.Health.Status}}' "\$CONTAINER_ID" 2>/dev/null || echo "starting") if [ "\$STATUS" = "healthy" ]; then echo " ✅ NPMplus is running and healthy" break fi fi echo " ⏳ Waiting... (\$i/60)" sleep 2 done # Get admin password echo "" echo "🔑 Retrieving admin password..." PASSWORD_LINE=\$(docker logs "\$CONTAINER_ID" 2>&1 | grep -i "Creating a new user" | tail -1 || echo "") if [ -n "\$PASSWORD_LINE" ]; then PASSWORD=\$(echo "\$PASSWORD_LINE" | grep -oP "password: \K[^\s]+" || echo "") if [ -n "\$PASSWORD" ]; then echo "username: admin@example.org" > /opt/.npm_pwd echo "password: \$PASSWORD" >> /opt/.npm_pwd echo " ✅ Admin password saved to /opt/.npm_pwd" echo " 📋 Password: \$PASSWORD" else echo " ⚠️ Could not extract password from logs" fi else echo " ⚠️ Password not found in logs yet" echo " 💡 Check manually: docker logs \$CONTAINER_ID | grep -i password" fi echo "" echo "✅ NPMplus installation fixed!" FIX_EOF if [ $? -eq 0 ]; then # Get container IP CONTAINER_IP=$(ssh root@"$PROXMOX_HOST" "pct exec $CONTAINER_ID -- hostname -I | awk '{print \$1}'") echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "✅ Installation Fixed!" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" echo "📋 Container Information:" echo " • Container ID: $CONTAINER_ID" echo " • Container IP: $CONTAINER_IP" echo " • Access URL: https://$CONTAINER_IP:81" echo " • Admin Email: admin@example.org" echo "" echo "🔑 Get admin password:" echo " ssh root@$PROXMOX_HOST \"pct exec $CONTAINER_ID -- cat /opt/.npm_pwd\"" echo "" echo "📋 Next step: Run configuration migration:" echo " bash scripts/nginx-proxy-manager/post-install-migration.sh $PROXMOX_HOST $CONTAINER_ID $CONTAINER_IP" echo "" else echo "" echo "❌ Fix failed. Check the output above." exit 1 fi