install.sh
This commit is contained in:
parent
5b618c08ed
commit
3edc477069
|
@ -5,126 +5,236 @@
|
|||
|
||||
set -e
|
||||
|
||||
echo "=== Superball Thrower Daemon Installation ==="
|
||||
echo
|
||||
echo "🏀 Superball Thrower Daemon Installation"
|
||||
echo "========================================"
|
||||
|
||||
# Check if running as root
|
||||
if [[ $EUID -eq 0 ]]; then
|
||||
echo "This script should not be run as root for security reasons."
|
||||
echo "Please run as a regular user with sudo privileges."
|
||||
echo "❌ This script should not be run as root for security reasons"
|
||||
echo " Please run as a regular user with sudo privileges"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if Node.js is installed
|
||||
if ! command -v node &> /dev/null; then
|
||||
echo "Error: Node.js is not installed."
|
||||
echo "Please install Node.js 16 or later from https://nodejs.org/"
|
||||
# Function to check if command exists
|
||||
command_exists() {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Check for required system dependencies
|
||||
echo "📋 Checking system dependencies..."
|
||||
|
||||
# Check for curl
|
||||
if ! command_exists curl; then
|
||||
echo "❌ curl is required but not installed"
|
||||
echo " Please install curl: sudo apt update && sudo apt install curl"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check Node.js version
|
||||
NODE_VERSION=$(node --version | cut -d'v' -f2 | cut -d'.' -f1)
|
||||
if [ "$NODE_VERSION" -lt 16 ]; then
|
||||
echo "Error: Node.js version 16 or later is required."
|
||||
echo "Current version: $(node --version)"
|
||||
# Check for systemctl (systemd)
|
||||
if ! command_exists systemctl; then
|
||||
echo "❌ systemd is required but not found"
|
||||
echo " This script requires a systemd-based system"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✓ Node.js $(node --version) detected"
|
||||
# Install latest Node.js using nvm
|
||||
echo "🔧 Installing latest Node.js using nvm..."
|
||||
|
||||
# Check if npm is installed
|
||||
if ! command -v npm &> /dev/null; then
|
||||
echo "Error: npm is not installed."
|
||||
# Download and install nvm
|
||||
if [ ! -d "$HOME/.nvm" ]; then
|
||||
echo " Downloading and installing nvm..."
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
|
||||
fi
|
||||
|
||||
# Load nvm
|
||||
export NVM_DIR="$HOME/.nvm"
|
||||
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
||||
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
|
||||
|
||||
# Install Node.js 22 (latest LTS)
|
||||
echo " Installing Node.js 22..."
|
||||
nvm install 22
|
||||
nvm use 22
|
||||
|
||||
# Verify installation
|
||||
NODE_VERSION=$(node --version)
|
||||
NPM_VERSION=$(npm --version)
|
||||
echo "✅ Node.js $NODE_VERSION installed"
|
||||
echo "✅ npm $NPM_VERSION installed"
|
||||
|
||||
# Install npm dependencies
|
||||
echo "📦 Installing npm dependencies..."
|
||||
if ! npm install; then
|
||||
echo "❌ Failed to install npm dependencies"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✓ npm $(npm --version) detected"
|
||||
echo "✅ Dependencies installed successfully"
|
||||
|
||||
# Get the directory where this script is located
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
DAEMON_DIR="$SCRIPT_DIR"
|
||||
# Interactive configuration
|
||||
echo ""
|
||||
echo "⚙️ Thrower Configuration"
|
||||
echo "========================"
|
||||
echo "Please provide the following information for your Superball Thrower:"
|
||||
echo ""
|
||||
|
||||
echo "Installing to: $DAEMON_DIR"
|
||||
echo
|
||||
# Prompt for configuration values
|
||||
read -p "Enter your private key (hex format, leave empty to generate new): " PRIVATE_KEY
|
||||
read -p "Enter your public key (hex format, leave empty if generating new): " PUBLIC_KEY
|
||||
read -p "Enter thrower name (e.g., 'My Superball Thrower'): " THROWER_NAME
|
||||
read -p "Enter thrower description: " THROWER_DESCRIPTION
|
||||
read -p "Enter banner URL (optional, press enter to skip): " BANNER_URL
|
||||
read -p "Enter icon URL (optional, press enter to skip): " ICON_URL
|
||||
|
||||
# Install Node.js dependencies
|
||||
echo "Installing Node.js dependencies..."
|
||||
cd "$DAEMON_DIR"
|
||||
npm install
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: Failed to install Node.js dependencies"
|
||||
exit 1
|
||||
# Generate keypair if not provided
|
||||
if [ -z "$PRIVATE_KEY" ] || [ -z "$PUBLIC_KEY" ]; then
|
||||
echo "🔑 Generating new keypair..."
|
||||
# We'll let the daemon generate the keypair on first run
|
||||
PRIVATE_KEY=""
|
||||
PUBLIC_KEY=""
|
||||
fi
|
||||
|
||||
echo "✓ Dependencies installed successfully"
|
||||
echo
|
||||
# Update config.json with user input
|
||||
echo "📝 Updating configuration file..."
|
||||
|
||||
# Create user for daemon (if it doesn't exist)
|
||||
DAEMON_USER="superball"
|
||||
if ! id "$DAEMON_USER" &>/dev/null; then
|
||||
echo "Creating system user: $DAEMON_USER"
|
||||
# Create a temporary config file with user values
|
||||
cat > config.json << EOF
|
||||
{
|
||||
"thrower": {
|
||||
"privateKey": "$PRIVATE_KEY",
|
||||
"publicKey": "$PUBLIC_KEY",
|
||||
"name": "$THROWER_NAME",
|
||||
"description": "$THROWER_DESCRIPTION",
|
||||
"banner": "$BANNER_URL",
|
||||
"icon": "$ICON_URL",
|
||||
"adminPubkey": "",
|
||||
"contact": "",
|
||||
"supportedSups": "1,2,3,4,5,6",
|
||||
"software": "https://git.laantungir.net/laantungir/super_ball.git",
|
||||
"version": "1.0.0",
|
||||
"privacyPolicy": "",
|
||||
"termsOfService": "",
|
||||
"refreshRate": 300,
|
||||
"maxDelay": 86460
|
||||
},
|
||||
"relays": [
|
||||
{ "url": "wss://relay.laantungir.net", "read": true, "write": true, "authStatus": "unknown" },
|
||||
{ "url": "wss://relay.damus.io", "read": true, "write": true, "authStatus": "unknown" },
|
||||
{ "url": "wss://nos.lol", "read": true, "write": true, "authStatus": "unknown" },
|
||||
{ "url": "wss://relay.snort.social", "read": true, "write": true, "authStatus": "unknown" },
|
||||
{ "url": "wss://relay.primal.net", "read": true, "write": true, "authStatus": "unknown" },
|
||||
{ "url": "wss://relay.nostr.band", "read": true, "write": true, "authStatus": "unknown" },
|
||||
{ "url": "wss://nostr.oxtr.dev", "read": true, "write": true, "authStatus": "unknown" },
|
||||
{ "url": "wss://offchain.pub", "read": true, "write": true, "authStatus": "unknown" },
|
||||
{ "url": "wss://nostr-pub.wellorder.net", "read": true, "write": true, "authStatus": "unknown" }
|
||||
],
|
||||
"daemon": {
|
||||
"logLevel": "info",
|
||||
"maxQueueSize": 1000,
|
||||
"maxLogEntries": 1000,
|
||||
"autoStart": false
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
echo "✅ Configuration updated"
|
||||
|
||||
# Create system user for the daemon
|
||||
echo "👤 Creating system user..."
|
||||
DAEMON_USER="superball-thrower"
|
||||
|
||||
if id "$DAEMON_USER" &>/dev/null; then
|
||||
echo "✅ User $DAEMON_USER already exists"
|
||||
else
|
||||
echo " Creating user: $DAEMON_USER"
|
||||
sudo useradd --system --no-create-home --shell /bin/false "$DAEMON_USER"
|
||||
echo "✓ User $DAEMON_USER created"
|
||||
else
|
||||
echo "✓ User $DAEMON_USER already exists"
|
||||
echo "✅ User $DAEMON_USER created"
|
||||
fi
|
||||
|
||||
# Create directories
|
||||
echo "Creating directories..."
|
||||
sudo mkdir -p /var/log/superball
|
||||
sudo mkdir -p /etc/superball
|
||||
sudo chown "$DAEMON_USER:$DAEMON_USER" /var/log/superball
|
||||
echo "✓ Directories created"
|
||||
# Create installation directory
|
||||
INSTALL_DIR="/opt/superball-thrower"
|
||||
echo "📁 Setting up installation directory: $INSTALL_DIR"
|
||||
|
||||
# Copy configuration file
|
||||
if [ ! -f "/etc/superball/config.json" ]; then
|
||||
echo "Installing default configuration..."
|
||||
sudo cp "$DAEMON_DIR/config.json" /etc/superball/config.json
|
||||
sudo chown "$DAEMON_USER:$DAEMON_USER" /etc/superball/config.json
|
||||
sudo chmod 600 /etc/superball/config.json
|
||||
echo "✓ Configuration installed to /etc/superball/config.json"
|
||||
echo "⚠️ IMPORTANT: Edit /etc/superball/config.json with your private key and settings"
|
||||
else
|
||||
echo "✓ Configuration already exists at /etc/superball/config.json"
|
||||
sudo mkdir -p "$INSTALL_DIR"
|
||||
sudo cp daemon.js "$INSTALL_DIR/"
|
||||
sudo cp package.json "$INSTALL_DIR/"
|
||||
sudo cp config.json "$INSTALL_DIR/"
|
||||
|
||||
# Copy node_modules if it exists
|
||||
if [ -d "node_modules" ]; then
|
||||
sudo cp -r node_modules "$INSTALL_DIR/"
|
||||
fi
|
||||
|
||||
# Set ownership and permissions
|
||||
sudo chown -R "$DAEMON_USER:$DAEMON_USER" "$INSTALL_DIR"
|
||||
sudo chmod 755 "$INSTALL_DIR"
|
||||
sudo chmod 644 "$INSTALL_DIR"/*.js "$INSTALL_DIR"/*.json
|
||||
sudo chmod -R 755 "$INSTALL_DIR/node_modules" 2>/dev/null || true
|
||||
|
||||
echo "✅ Files installed to $INSTALL_DIR"
|
||||
|
||||
# Create log directory
|
||||
LOG_DIR="/var/log/superball-thrower"
|
||||
echo "📝 Creating log directory: $LOG_DIR"
|
||||
|
||||
sudo mkdir -p "$LOG_DIR"
|
||||
sudo chown "$DAEMON_USER:$DAEMON_USER" "$LOG_DIR"
|
||||
sudo chmod 755 "$LOG_DIR"
|
||||
|
||||
echo "✅ Log directory created"
|
||||
|
||||
# Install systemd service
|
||||
echo "Installing systemd service..."
|
||||
sudo cp "$DAEMON_DIR/superball-thrower.service" /etc/systemd/system/
|
||||
sudo sed -i "s|/path/to/thrower_daemon|$DAEMON_DIR|g" /etc/systemd/system/superball-thrower.service
|
||||
echo "⚙️ Installing systemd service..."
|
||||
|
||||
sudo cp superball-thrower.service /etc/systemd/system/
|
||||
sudo systemctl daemon-reload
|
||||
echo "✓ Systemd service installed"
|
||||
sudo systemctl enable superball-thrower.service
|
||||
|
||||
# Set permissions
|
||||
echo "Setting permissions..."
|
||||
sudo chown -R "$DAEMON_USER:$DAEMON_USER" "$DAEMON_DIR"
|
||||
sudo chmod +x "$DAEMON_DIR/daemon.js"
|
||||
echo "✓ Permissions set"
|
||||
echo "✅ Systemd service installed and enabled"
|
||||
|
||||
echo
|
||||
echo "=== Installation Complete ==="
|
||||
echo
|
||||
echo "Next steps:"
|
||||
echo "1. Edit the configuration file:"
|
||||
echo " sudo nano /etc/superball/config.json"
|
||||
echo
|
||||
echo "2. Add your private key and configure relays"
|
||||
echo
|
||||
echo "3. Enable and start the service:"
|
||||
echo " sudo systemctl enable superball-thrower"
|
||||
echo " sudo systemctl start superball-thrower"
|
||||
echo
|
||||
echo "4. Check service status:"
|
||||
echo " sudo systemctl status superball-thrower"
|
||||
echo
|
||||
echo "5. View logs:"
|
||||
echo " sudo journalctl -u superball-thrower -f"
|
||||
echo
|
||||
echo "Configuration file location: /etc/superball/config.json"
|
||||
echo "Log file location: /var/log/superball/daemon.log"
|
||||
echo "Service name: superball-thrower"
|
||||
echo
|
||||
echo "⚠️ SECURITY WARNING:"
|
||||
echo " Make sure to secure your private key in the configuration file!"
|
||||
echo " The config file should only be readable by the superball user."
|
||||
# Initialize daemon if no keypair was provided
|
||||
if [ -z "$PRIVATE_KEY" ]; then
|
||||
echo "🔑 Initializing daemon to generate keypair..."
|
||||
# Create a simple init script that generates keypair
|
||||
sudo -u "$DAEMON_USER" bash -c "
|
||||
export NVM_DIR=\"$HOME/.nvm\"
|
||||
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
|
||||
cd \"$INSTALL_DIR\"
|
||||
node -e \"
|
||||
const { generateSecretKey, getPublicKey } = require('nostr-tools/pure');
|
||||
const fs = require('fs');
|
||||
const config = JSON.parse(fs.readFileSync('config.json', 'utf8'));
|
||||
const sk = generateSecretKey();
|
||||
const pk = getPublicKey(sk);
|
||||
config.thrower.privateKey = Buffer.from(sk).toString('hex');
|
||||
config.thrower.publicKey = pk;
|
||||
fs.writeFileSync('config.json', JSON.stringify(config, null, 2));
|
||||
console.log('Generated keypair:');
|
||||
console.log('Private key:', Buffer.from(sk).toString('hex'));
|
||||
console.log('Public key:', pk);
|
||||
\"
|
||||
"
|
||||
echo "✅ Keypair generated"
|
||||
fi
|
||||
|
||||
# Installation complete
|
||||
echo ""
|
||||
echo "🎉 Installation completed successfully!"
|
||||
echo ""
|
||||
echo "📋 Next steps:"
|
||||
echo " 1. Start the service: sudo systemctl start superball-thrower"
|
||||
echo " 2. Check status: sudo systemctl status superball-thrower"
|
||||
echo " 3. View logs: sudo journalctl -u superball-thrower -f"
|
||||
echo ""
|
||||
echo "📖 For more information, see the README.md file"
|
||||
echo ""
|
||||
echo "🔐 Security notes:"
|
||||
echo " - The daemon runs as user '$DAEMON_USER' with limited privileges"
|
||||
echo " - Configuration files are owned by the daemon user"
|
||||
echo " - Logs are written to $LOG_DIR"
|
||||
echo ""
|
||||
echo "⚙️ Configuration summary:"
|
||||
echo " - Thrower name: $THROWER_NAME"
|
||||
echo " - Description: $THROWER_DESCRIPTION"
|
||||
echo " - Config file: $INSTALL_DIR/config.json"
|
||||
echo ""
|
|
@ -3,9 +3,19 @@
|
|||
# Superball Thrower Daemon Installation Script
|
||||
# This script installs and configures the Superball Thrower daemon
|
||||
|
||||
sudo apt install nodejs npm
|
||||
# Download and install nvm:
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
|
||||
|
||||
# in lieu of restarting the shell
|
||||
\. "$HOME/.nvm/nvm.sh"
|
||||
|
||||
# Download and install Node.js:
|
||||
nvm install 22
|
||||
|
||||
# Verify the Node.js version:
|
||||
node -v # Should print "v22.20.0".
|
||||
|
||||
# Verify npm version:
|
||||
npm -v # Should print "10.9.3".
|
||||
|
||||
# Verify installation
|
||||
node --version
|
||||
npm --version
|
||||
|
||||
|
|
Loading…
Reference in New Issue