* feat: implement JWT-based authentication system - Add bcrypt password hashing and JWT token generation - Create blocking auth modals for login and setup - Add authentication management to General Settings - Implement API routes for login, verify, setup, and credential management - Add AuthProvider and AuthGuard components - Support first-time setup and persistent authentication - Store credentials securely in .env file * feat: add option to skip enabling auth during setup - Add toggle in SetupModal to choose whether to enable authentication immediately - Users can set up credentials but keep authentication disabled initially - Authentication can be enabled/disabled later through General Settings - Maintains flexibility for users who want to configure auth gradually * fix: allow proceeding without password when auth is disabled - Make password fields optional when authentication is disabled in setup - Update button validation to only require password when auth is enabled - Modify API to handle optional password parameter - Update hasCredentials logic to work with username-only setup - Users can now complete setup with just username when auth is disabled - Password can be added later when enabling authentication * feat: don't store credentials when authentication is disabled - When auth is disabled, no username or password is stored - Setup modal only requires credentials when authentication is enabled - Disabling authentication clears all stored credentials - Users can skip authentication entirely without storing any data - Clean separation between enabled/disabled authentication states * feat: add setup completed flag to prevent modal on every load - Add AUTH_SETUP_COMPLETED flag to track when user has completed setup - Setup modal only appears when setupCompleted is false - Both enabled and disabled auth setups mark setup as completed - Clean .env file when authentication is disabled (no empty credential lines) - Prevents setup modal from appearing on every page load after user decision * fix: add missing Authentication tab button in settings modal - Authentication tab button was missing from the tabs navigation - Users couldn't access authentication settings - Added Authentication tab button with proper styling and click handler - Authentication settings are now accessible through the settings modal * fix: properly load and display authentication settings - Add setupCompleted state variable to track setup status - Update loadAuthCredentials to include setupCompleted field - Fix authentication status display logic to show correct state - Show proper status when auth is disabled but setup is completed - Enable toggle only when setup is completed (not just when credentials exist) - Settings now correctly reflect the actual authentication state * fix: handle empty FILTERS environment variable - Add check for empty or invalid FILTERS JSON before parsing - Prevents 'Unexpected end of JSON input' error when FILTERS is empty - Return null filters instead of throwing parse error - Clean up empty FILTERS line from .env file - Fixes console error when loading settings modal * fix: load authentication credentials when settings modal opens - Add loadAuthCredentials() call to useEffect when modal opens - Authentication settings were not loading because the function wasn't being called - Now properly loads auth configuration when settings modal is opened - Settings will display the correct authentication status and state * fix: prevent multiple JWT secret generation with caching - Add JWT secret caching to prevent race conditions - Multiple API calls were generating duplicate JWT secrets - Now caches secret after first generation/read - Clean up duplicate JWT_SECRET lines from .env file - Prevents .env file from being cluttered with multiple secrets * feat: auto-login user after setup with authentication enabled - When user sets up authentication with credentials, automatically log them in - Prevents need to manually log in after setup completion - Setup modal now calls login API after successful setup when auth is enabled - AuthGuard no longer reloads page after setup, just refreshes config - Seamless user experience from setup to authenticated state * fix: resolve console errors and improve auth flow - Fix 401 Unauthorized error by checking setup status before auth verification - AuthProvider now checks if setup is completed before attempting to verify auth - Prevents unnecessary auth verification calls when no credentials exist - Add webpack polling configuration to fix WebSocket HMR issues - Improves development experience when accessing from different IPs - Eliminates console errors during initial setup flow * fix: resolve build errors and linting issues - Fix TypeScript ESLint error: use optional chain expression in auth.ts - Fix React Hook warning: add missing 'isRunning' dependency to useEffect in Terminal.tsx - Build now compiles successfully without any errors or warnings - All linting rules are now satisfied
PVE Scripts Local 🚀
A modern web-based management interface for Proxmox VE (PVE) helper scripts. This tool provides a user-friendly way to discover, download, and execute community-sourced Proxmox scripts locally with real-time terminal output streaming. No more need for curl -> bash calls, it all happens in your enviroment.
🎯 Deployment Options
This application can be deployed in multiple ways to suit different environments:
- 📦 Debian LXC Container: Deploy inside a Debian LXC container for better isolation
- 🔧 Helper Script: Use the automated helper script for easy setup
All deployment methods provide the same functionality and web interface.
🌟 Features
- Web-based Interface: Modern React/Next.js frontend with real-time terminal emulation
- Script Discovery: Browse and search through community Proxmox scripts from GitHub
- One-Click Execution: Run scripts directly from the web interface with live output
- Real-time Terminal: Full terminal emulation with xterm.js for interactive script execution
- Script Management: Download, update, and manage local script collections
- Security: Sandboxed script execution with path validation and time limits
- Database Integration: PostgreSQL backend for script metadata and execution history
- WebSocket Communication: Real-time bidirectional communication for script execution
🏗️ Architecture
Frontend
- Next.js 15 with React 19
- TypeScript for type safety
- Tailwind CSS for styling
- xterm.js for terminal emulation
- tRPC for type-safe API communication
Backend
- Node.js server with WebSocket support
- WebSocket Server for real-time script execution
- Script Downloader Service for GitHub integration
Scripts
- Core Functions: Shared utilities and build functions
- Container Scripts: Pre-configured LXC container setups
- Installation Scripts: System setup and configuration tools
Database
- SQLite Database: Local database stored at
data/settings.db - Server Management: Stores Proxmox server configurations and credentials
- Automatic Setup: Database and tables are created automatically on first run
- Data Persistence: Settings persist across application restarts
📋 Prerequisites
For All Deployment Methods
- Node.js 22+ and npm
- Git for cloning the repository
- Proxmox VE environment (host or access to Proxmox cluster)
- SQLite (included with Node.js better-sqlite3 package)
For Debian LXC Container Installation
- Debian LXC container (Debian 11+ recommended)
- build-essentials:
apt install build-essential - Container with sufficient resources (2GB RAM, 4GB storage minimum)
- Network access from container to Proxmox host
- Optional: Privileged container for full Proxmox integration
🚀 Installation
Choose the installation method that best fits your environment:
Option 1: Debian LXC Container Installation
For better isolation and security, you can run PVE Scripts Local inside a Debian LXC container:
Step 1: Create Debian LXC Container
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/debian.sh)"
Step 2: Install Dependencies in Container
# Enter the container
pct enter 100
# Update and install dependencies
apt update && apt install -y build-essential git curl
# Install Node.js 24.x
curl -fsSL https://deb.nodesource.com/setup_24.x | bash -
apt install -y nodejs
Step 3: Clone and Setup Application
# Clone the repository
git clone https://github.com/community-scripts/ProxmoxVE-Local.git /opt/PVESciptslocal
cd PVESciptslocal
# Install dependencies and build
npm install
cp .env.example .env
npm run build
# Create database directory
mkdir -p data
chmod 755 data
Step 4: Start the Application
# Start in production mode
npm start
# Or create a systemd service (optional)
# Create systemd service for easy management
Access the application:
- 🌐 Container IP:
http://<CONTAINER_IP>:3000 - 🔧 Container management:
pct start 100,pct stop 100,pct status 100
Option 2: Use the helper script
This creates the LXC and installs the APP for you.
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/pve-scripts-local.sh)"
🎯 Usage
1. Access the Web Interface
The web interface is accessible regardless of your deployment method:
- LXC Container Installation:
http://<CONTAINER_IP>:3000 - Custom Installation:
http://<YOUR_IP>:3000
2. Service Management
For helper-script installations (systemd service):
# Start the service
systemctl start pvescriptslocal
# Stop the service
systemctl stop pvescriptslocal
# Check service status
systemctl status pvescriptslocal
# Enable auto-start on boot
systemctl enable pvescriptslocal
# View service logs
journalctl -u pvescriptslocal -f
For manual installations:
# Start application
npm start
# Development mode
npm run dev:server
# Build for production
npm run build
3. Browse Available Scripts
- The main page displays a grid of available Proxmox scripts
- Use the search functionality to find specific scripts
- Scripts are categorized by type (containers, installations, etc.)
4. Download Scripts
- Click on any script card to view details
- Use the "Download" button to fetch scripts from the ProxmoxVE GitHub
- Downloaded scripts are stored locally in the
scripts/directory
5. Execute Scripts
- Click "Run Script" on any downloaded script
- A terminal window will open with real-time output
- Interact with the script through the web terminal
- Use the close button to stop execution
6. Script Management
- View script execution history
- Update scripts to latest versions
- Manage local script collections
7. Database Management
The application uses SQLite for storing server configurations:
- Database Location:
data/settings.db - Automatic Creation: Database and tables are created on first run
- Server Storage: Proxmox server credentials and configurations
- Backup: Copy
data/settings.dbto backup your server configurations - Reset: Delete
data/settings.dbto reset all server configurations
📁 Project Structure
PVESciptslocal/
├── scripts/ # Script collection
│ ├── core/ # Core utility functions
│ │ ├── build.func # Build system functions
│ │ ├── tools.func # Tool installation functions
│ │ └── create_lxc.sh # LXC container creation
│ ├── ct/ # Container templates
│ └── install/ # Installation scripts
├── src/ # Source code
│ ├── app/ # Next.js app directory
│ │ ├── _components/ # React components
│ │ └── page.tsx # Main page
│ └── server/ # Server-side code
│ ├── database.js # SQLite database service
│ └── services/ # Business logic services
├── data/ # Database storage
│ └── settings.db # SQLite database file
├── public/ # Static assets
├── server.js # Main server file
└── package.json # Dependencies and scripts
🚀 Development
Prerequisites for Development
- Node.js 22+
- Git
Development Commands
# Install dependencies
npm install
Start development server
npm run dev:server
Project Structure for Developers
- Frontend: React components in
src/app/_components/ - Backend: Server logic in
src/server/ - API: tRPC routers for type-safe API communication
- Scripts: Bash scripts in
scripts/directory
🤝 Contributing
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
📝 License
This project is licensed under the MIT License - see the LICENSE file for details.
Note: This is beta software. Use with caution in production environments and always backup your Proxmox configuration before running scripts.