Commit 8affefbc authored by Lisa's avatar Lisa

feat: add installer build scripts for Linux and Windows

- Add Linux installer (self-contained bash script)

- Add Windows build script (NSIS + Python embeddable)

- Installers produce fully offline-capable agents
parent 1773a2c0
# Deployment Scripts for Hermes Node Agent
These scripts build installers for deploying Hermes Node Agent on target machines.
## Structure
```
deploy/
├── README.md - This file
├── linux/
│ └── install-node.sh - Self-contained Linux installer (embedded files)
├── windows/
│ ├── build-installer.sh - Build script for Windows .exe installer
│ └── installer.nsi - NSIS installer template
```
## Building Installers
### Linux
The Linux installer is self-contained (no build required):
```bash
sudo deploy/linux/install-node.sh
```
Features:
- All agent files embedded (base64 tarball)
- Uses system Python 3
- pip installs `websockets`
- Creates SysV init service as root
### Windows
Build the Windows .exe offline installer:
```bash
cd deploy/windows
bash build-installer.sh
```
Dependencies: `makensis`, `wget`, `python3`, `pip`.
Output: `deploy/windows/hermes-node-agent-installer.exe` (~11 MB)
Installer includes:
- Python 3.13.1 embeddable
- websockets library (cp313 win_amd64)
- Node agent source files
- Batch launchers + config wizard
- GUI NSIS installer
## Release Process
1. Linux installer is already built: `deploy/linux/install-node.sh`
2. Build Windows installer: `cd deploy/windows && bash build-installer.sh`
3. Create release bundle:
```bash
cd /path/to/hermes-node-agent
cp deploy/linux/install-node.sh ./
cp deploy/windows/hermes-node-agent-installer.exe ./
zip -r node-agent-v2.zip install-node.sh hermes-node-agent-installer.exe
```
4. Upload release to website: `https://lisa.nexlab.net/files/node-agent-v2.zip`
## Notes
- Both installers are fully **offline-capable** after build
- No git clone on target
- Zero external network dependencies on target machines
- All source code included; only network during Windows **build**, not during install
#!/bin/bash
# Hermes Node Agent Installer — Linux Version
# Copyright (c) 2026 Stefy (nextime) Lanza <stefy@nexlab.net>
# All rights reserved.
#
# This software is released under the MIT License with a copyleft clause.
# See the LICENSE file for full terms.
#
# INSTALLER DESCRIPTION:
# Self-contained installer for Linux. Embedded: node agent code, init.d script.
# External: pip install websockets (online required).
# No git clone, no network downloads of our files.
set -e
echo "=== Hermes Node Agent Installer (Linux) ==="
echo ""
# Check if running as root (for service setup)
if [ "$EUID" -eq 0 ]; then
RUN_AS_ROOT=true
else
RUN_AS_ROOT=false
echo "⚠️ Not running as root — skipping service installation."
echo " To install as a service, run: sudo $0"
echo ""
fi
# Check for Python 3
if ! command -v python3 &> /dev/null; then
echo "❌ ERROR: Python 3 is required but not found."
echo " Install Python 3 first, then re-run this installer."
exit 1
fi
echo "✓ Python: $(python3 --version)"
# Check for pip (will use it to install websockets)
if ! command -v pip3 &> /dev/null && ! command -v pip &> /dev/null; then
echo "❌ ERROR: pip is required but not found."
echo " Install with: apt install python3-pip (Debian/Ubuntu) or equivalent"
exit 1
fi
PIP_CMD="pip3"
command -v pip3 &> /dev/null || PIP_CMD="pip"
# Install websockets library (only network call)
echo "[1/5] Installing Python dependencies (websockets)..."
if ! $PIP_CMD install --quiet websockets 2>/dev/null; then
echo "⚠️ Could not install via pip (may need network). Trying with user flag..."
if ! $PIP_CMD install --user --quiet websockets 2>/dev/null; then
echo "❌ Failed to install websockets. Try manually: $PIP_CMD install websockets"
exit 1
fi
fi
echo "✓ websockets library installed"
# Determine install locations
if [ "$RUN_AS_ROOT" = true ]; then
AGENT_DIR="/usr/local/bin"
CONFIG_DIR="/etc/hermes-node"
USE_SERVICE=true
else
AGENT_DIR="$HOME/.local/bin"
CONFIG_DIR="$HOME/.config/hermes-node"
USE_SERVICE=false
fi
mkdir -p "$AGENT_DIR"
mkdir -p "$CONFIG_DIR"
# Extract embedded agent files
echo "[2/5] Extracting embedded agent files..."
TMP_EXTRACT=$(mktemp -d)
cd "$TMP_EXTRACT"
# === EMBEDDED TARBALL (base64) ===
cat <<'TARBALL_DATA' | base64 -d | tar xzf -
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
# === END EMBEDDED DATA ===
# Copy agent script
cp hermes-node-agent/hermes_node_agent.py "$AGENT_DIR/hermes-node-agent"
chmod +x "$AGENT_DIR/hermes-node-agent"
echo "✓ Agent: $AGENT_DIR/hermes-node-agent"
# Copy init.d script (for root installs)
if [ "$USE_SERVICE" = true ]; then
cp hermes-node-agent/hermes-node-agent.init.d /etc/init.d/hermes-node-agent
chmod +x /etc/init.d/hermes-node-agent
echo "✓ Init script: /etc/init.d/hermes-node-agent"
fi
# Copy node_gateway.py (for plugin reference, if needed)
cp hermes-node-agent/node_gateway.py "$AGENT_DIR/hermes-node-gateway.py" 2>/dev/null || true
# Clean up
echo "[3/5] Cleaning up temporary files..."
cd /
rm -rf "$TMP_EXTRACT"
# Create config file if missing
echo "[4/5] Checking configuration..."
if [ ! -f "$CONFIG_DIR/config.json" ]; then
echo "[5/5] Creating config file..."
NODE_NAME=$(hostname)
TOKEN=$(python3 -c "import secrets; print(secrets.token_hex(16))")
cat > "$CONFIG_DIR/config.json" << EOF
{
"gateway_url": "ws://YOUR-GATEWAY-HOST:8765",
"node_name": "${NODE_NAME}",
"token": "${TOKEN}",
"sexec_path": "${HOME}/.openclaw/skills/sexec/sexec.sh",
"reconnect_interval": 5,
"heartbeat_interval": 30,
"capabilities": ["exec"]
}
EOF
echo "✓ Config: $CONFIG_DIR/config.json"
echo ""
echo "⚠️ IMPORTANT: Edit $CONFIG_DIR/config.json"
echo " → Set gateway_url to your gateway (e.g., wss://zeiss:8765)"
echo " → Set token to match gateway's token for this node"
echo " → Add capabilities: ["exec", "browser_control", "computer_control"] as needed"
else
echo "[5/5] Config already exists → skipping"
echo " Config: $CONFIG_DIR/config.json"
fi
# Install SysV init service (root only)
if [ "$USE_SERVICE" = true ]; then
echo ""
echo "[Service] Enabling auto-start on boot..."
update-rc.d hermes-node-agent defaults 2>/dev/null || true
echo "✓ Service: /etc/init.d/hermes-node-agent"
echo ""
echo "Service commands:"
echo " /etc/init.d/hermes-node-agent start|stop|restart|status"
else
echo ""
echo "[Service] Skipped (not root). Manual start required:"
echo " $AGENT_DIR/hermes-node-agent --config $CONFIG_DIR/config.json"
fi
echo ""
echo "=== Installation Complete ==="
echo ""
echo "Quick start:"
echo " Config: $CONFIG_DIR/config.json"
echo " Agent: $AGENT_DIR/hermes-node-agent"
echo " Run: $AGENT_DIR/hermes-node-agent --config $CONFIG_DIR/config.json"
echo ""
if [ "$USE_SERVICE" = true ]; then
echo "To start the service:"
echo " /etc/init.d/hermes-node-agent start"
echo ""
else
echo "To run manually:"
echo " $AGENT_DIR/hermes-node-agent --config $CONFIG_DIR/config.json &"
echo ""
fi
#!/bin/bash
# Build Windows offline installer for Hermes Node Agent
# Requires: makensis (NSIS compiler), wget/curl, python3 + pip
set -e
cd "$(cd "$(dirname "$0")"/.. && pwd)"
WORKDIR=$(mktemp -d)
echo "Build directory: $WORKDIR"
# Download components
echo "Downloading Python 3.13.1 embeddable..."
wget -q "https://www.python.org/ftp/python/3.13.1/python-3.13.1-embed-amd64.zip" -O "$WORKDIR/python.zip"
echo "Downloading websockets..."
python3 -m pip download websockets --platform win_amd64 --python-version 3.13 --only-binary=:all: -d "$WORKDIR"
# Build payload
PAYLOAD="$WORKDIR/payload"
mkdir -p "$PAYLOAD"/{python,node,config}
# Extract Python
unzip -q "$WORKDIR/python.zip" -d "$PAYLOAD/python"
mkdir -p "$PAYLOAD/python/Lib/site-packages"
# Install websockets
WHEEL=$(ls "$WORKDIR"/websockets*.whl)
unzip -q "$WHEEL" -d "$PAYLOAD/python/Lib/site-packages"
# Copy sources
cp ../hermes_node_agent.py "$PAYLOAD/node/"
cp ../browser_controller.py "$PAYLOAD/node/"
# sexec placeholder
echo '@echo off' > "$PAYLOAD/sexec.bat"
echo 'echo "sexec not implemented on Windows"' >> "$PAYLOAD/sexec.bat"
echo 'exit /b 0' >> "$PAYLOAD/sexec.bat"
# Config template
cat > "$PAYLOAD/config/config.json" <<'EOF'
{
"gateway_url": "ws://YOUR-GATEWAY:8765",
"node_name": "WIN-NODE",
"token": "YOUR-TOKEN-HERE",
"sexec_path": ".\sexec.bat",
"reconnect_interval": 5,
"heartbeat_interval": 30,
"capabilities": ["exec"]
}
EOF
# Launchers
cat > "$PAYLOAD/setup.bat" <<'EOF'
@echo off
echo === Hermes Node Agent Setup ===
set /p GATEWAY_HOST="Gateway host: "
set /p NODE_NAME="Node name [%COMPUTERNAME%]: "
if "%NODE_NAME%"=="" set NODE_NAME=%COMPUTERNAME%
set /p GATEWAY_TOKEN="Gateway token: "
(
echo {
echo "gateway_url": "ws://%GATEWAY_HOST%:8765",
echo "node_name": "%NODE_NAME%",
echo "token": "%GATEWAY_TOKEN%",
echo "sexec_path": ".\sexec.bat",
echo "reconnect_interval": 5,
echo "heartbeat_interval": 30,
echo "capabilities": ["exec"]
echo }
) > config\config.json
echo Configuration saved. Run agent.bat to start.
pause
EOF
cat > "$PAYLOAD/agent.bat" <<'EOF'
@echo off
cd /d "%~dp0"
set PYTHONHOME=python
set PYTHONPATH=python;python\Lib;python\Lib\site-packages
set PATH=%~dp0python;%PATH%
python.exe node\hermes_node_agent.py --config config\config.json
pause
EOF
# NSIS script
cat > "$WORKDIR/installer.nsi" <<'NSIS'
!define APP "Hermes Node Agent"
!define VER "2.0"
Name "${APP} ${VER}"
OutFile "hermes-node-agent-installer.exe"
InstallDir "$PROGRAMFILES64\HermesNode"
RequestExecutionLevel admin
!include "MUI2.nsh"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"
Section "Install"
SetOutPath "$INSTDIR"
File /r "payload\*.*"
WriteUninstaller "$INSTDIR\uninstall.exe"
CreateDirectory "$SMPROGRAMS\${APP}"
CreateShortCut "$SMPROGRAMS\${APP}\Setup.lnk" "$INSTDIR\setup.bat"
CreateShortCut "$SMPROGRAMS\${APP}\Start.lnk" "$INSTDIR\agent.bat"
CreateShortCut "$SMPROGRAMS\${APP}\Uninstall.lnk" "$INSTDIR\uninstall.exe"
SectionEnd
Section "Uninstall"
RMDir /r "$INSTDIR"
RMDir /r "$SMPROGRAMS\${APP}"
SectionEnd
NSIS
# Compile
echo "Compiling NSIS installer..."
cd "$WORKDIR"
makensis installer.nsi
# Move output
cp hermes-node-agent-installer.exe "$OLDPWD/../../deploy/windows/"
echo "✅ Build complete: deploy/windows/hermes-node-agent-installer.exe"
rm -rf "$WORKDIR"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment