Merge pull request #20 from MickLesk/main
Add structured installer.sh with dependency checks and systemd service
This commit is contained in:
31
README.md
31
README.md
@@ -42,7 +42,36 @@ A modern web-based management interface for Proxmox VE (PVE) helper scripts. Thi
|
||||
|
||||
## 🚀 Installation
|
||||
|
||||
You can use the provided ```install.sh``` file in the root directory of this repository or follow the steps below to install manually. The install script takes care of all prerequisits.
|
||||
You can either install automatically via the provided installer script or do a manual setup.
|
||||
|
||||
### Option 1: Install via Bash (Recommended)
|
||||
|
||||
Run this command directly on your Proxmox VE host:
|
||||
|
||||
```bash
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/michelroegl-brunner/PVESciptslocal/main/install.sh)"
|
||||
```
|
||||
|
||||
## The script will:
|
||||
- Verify that you are running on Proxmox VE
|
||||
- Check and install git and Node.js 24.x if missing
|
||||
- Clone the repository into /opt/PVESciptslocal (or your chosen path)
|
||||
- Run npm install and build the project
|
||||
- Set up .env from .env.example if missing
|
||||
- Create a systemd service (pvescriptslocal.service) for easy start/stop management
|
||||
|
||||
After installation, the app will be accessible at:
|
||||
👉 http://<YOUR_PVE_IP>:3000
|
||||
|
||||
You can manage the service with:
|
||||
```bash
|
||||
systemctl start pvescriptslocal
|
||||
systemctl stop pvescriptslocal
|
||||
systemctl status pvescriptslocal
|
||||
```
|
||||
|
||||
|
||||
### Option 2: Manual Installation
|
||||
|
||||
### 1. Clone the Repository
|
||||
|
||||
|
||||
100
install.sh
100
install.sh
@@ -1,40 +1,38 @@
|
||||
#!/usr/bin/env bash
|
||||
# ------------------------------------------------------------------------------
|
||||
# Installer for PVESciptslocal
|
||||
# Author: Canbiz
|
||||
# Installer for PVESciptslocal with systemd integration
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Colors
|
||||
# --- Core ---------------------------------------------------------------------
|
||||
RD=$(echo -e "\033[01;31m")
|
||||
GN=$(echo -e "\033[1;92m")
|
||||
YW=$(echo -e "\033[33m")
|
||||
CL=$(echo -e "\033[m")
|
||||
|
||||
# Status functions
|
||||
msg_info() { echo -e "⏳ $YW$1$CL"; }
|
||||
msg_ok() { echo -e "✔️ $GN$1$CL"; }
|
||||
msg_err() { echo -e "❌ $RD$1$CL"; }
|
||||
|
||||
# --- Check Proxmox VE environment ---
|
||||
# --- PVE Check ----------------------------------------------------------------
|
||||
check_pve() {
|
||||
if ! command -v pveversion >/dev/null 2>&1; then
|
||||
msg_err "This script must be executed on a Proxmox VE host."
|
||||
exit 1
|
||||
fi
|
||||
msg_ok "Proxmox VE detected: $(pveversion)"
|
||||
}
|
||||
|
||||
# --- Check git ---
|
||||
if ! command -v git >/dev/null 2>&1; then
|
||||
msg_info "Git not found, installing..."
|
||||
# --- Dependency Check & Install -----------------------------------------------
|
||||
check_dependencies() {
|
||||
msg_info "Checking required packages (build-essential, git)..."
|
||||
apt-get update
|
||||
apt-get install -y git
|
||||
msg_ok "Git installed: $(git --version)"
|
||||
else
|
||||
msg_ok "Git already available: $(git --version)"
|
||||
fi
|
||||
apt-get install -y build-essential git
|
||||
msg_ok "Dependencies installed."
|
||||
}
|
||||
|
||||
# --- Check Node.js ---
|
||||
check_nodejs() {
|
||||
if ! command -v node >/dev/null 2>&1; then
|
||||
msg_info "Node.js not found, installing Node.js 24.x..."
|
||||
curl -fsSL https://deb.nodesource.com/setup_24.x | bash -
|
||||
@@ -43,12 +41,13 @@ if ! command -v node >/dev/null 2>&1; then
|
||||
else
|
||||
msg_ok "Node.js already available: $(node -v)"
|
||||
fi
|
||||
}
|
||||
|
||||
# --- Ask for installation path ---
|
||||
# --- Repository Handling ------------------------------------------------------
|
||||
clone_or_update_repo() {
|
||||
read -rp "Installation directory [default: /opt/PVESciptslocal]: " INSTALL_DIR
|
||||
INSTALL_DIR=${INSTALL_DIR:-/opt/PVESciptslocal}
|
||||
|
||||
# --- Clone or update repository ---
|
||||
if [ ! -d "$INSTALL_DIR/.git" ]; then
|
||||
msg_info "Cloning repository into $INSTALL_DIR..."
|
||||
git clone https://github.com/michelroegl-brunner/PVESciptslocal.git "$INSTALL_DIR"
|
||||
@@ -60,13 +59,14 @@ else
|
||||
fi
|
||||
|
||||
cd "$INSTALL_DIR"
|
||||
}
|
||||
|
||||
# --- Install dependencies ---
|
||||
msg_info "Installing dependencies..."
|
||||
# --- Application Setup --------------------------------------------------------
|
||||
setup_app() {
|
||||
msg_info "Installing npm dependencies..."
|
||||
npm install
|
||||
msg_ok "Dependencies installed."
|
||||
|
||||
# --- Environment file ---
|
||||
if [ ! -f .env ]; then
|
||||
msg_info "Creating environment file from example..."
|
||||
cp .env.example .env
|
||||
@@ -75,16 +75,64 @@ else
|
||||
msg_ok ".env file already exists, keeping it."
|
||||
fi
|
||||
|
||||
# --- Build the application ---
|
||||
msg_info "Building application..."
|
||||
npm run build
|
||||
msg_ok "Build completed."
|
||||
}
|
||||
|
||||
# --- Start the application ---
|
||||
read -rp "Do you want to start the application now? (y/N): " START_APP
|
||||
if [[ "$START_APP" =~ ^[Yy]$ ]]; then
|
||||
msg_info "Starting application..."
|
||||
npm start
|
||||
# --- Systemd Service ----------------------------------------------------------
|
||||
setup_systemd_service() {
|
||||
SERVICE_NAME="pvescriptslocal"
|
||||
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
|
||||
|
||||
msg_info "Creating systemd service at $SERVICE_FILE..."
|
||||
cat > "$SERVICE_FILE" <<EOF
|
||||
[Unit]
|
||||
Description=PVEScriptslocal Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=${INSTALL_DIR}
|
||||
ExecStart=/usr/bin/npm start
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
Environment=NODE_ENV=production
|
||||
User=root
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
systemctl daemon-reexec
|
||||
msg_ok "Systemd service created."
|
||||
|
||||
read -rp "Enable and start the service now? (y/N): " START_SERVICE
|
||||
if [[ "$START_SERVICE" =~ ^[Yy]$ ]]; then
|
||||
systemctl enable --now "$SERVICE_NAME"
|
||||
msg_ok "Service enabled and started."
|
||||
else
|
||||
msg_info "You can start the app anytime by running: cd $INSTALL_DIR && npm start"
|
||||
msg_info "You can start it manually with: systemctl start $SERVICE_NAME"
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "---------------------------------------------"
|
||||
echo " Service installed: $SERVICE_NAME"
|
||||
echo " Manage it with:"
|
||||
echo " systemctl start $SERVICE_NAME"
|
||||
echo " systemctl stop $SERVICE_NAME"
|
||||
echo " systemctl status $SERVICE_NAME"
|
||||
echo " App will be available at: http://<IP>:3000"
|
||||
echo "---------------------------------------------"
|
||||
}
|
||||
|
||||
# --- Main ---------------------------------------------------------------------
|
||||
main() {
|
||||
check_pve
|
||||
check_dependencies
|
||||
check_nodejs
|
||||
clone_or_update_repo
|
||||
setup_app
|
||||
setup_systemd_service
|
||||
}
|
||||
|
||||
main "$@"
|
||||
|
||||
Reference in New Issue
Block a user