#!/bin/bash ########################################### # Ternoa Installer Script # Author: SOUFIANE BOUCHAARA # Email: contact@soufianebouchaara.com # Version: 1.2.0 ########################################### # Function to display a spinner while waiting for a process to finish spinner() { local pid=$1 local delay=0.15 local spinstr='|/-\' echo -n "Installing Ternoa " while ps -p $pid > /dev/null; do for i in $(seq 0 3); do echo -n "${spinstr:$i:1}" echo -en "\b" sleep $delay done done echo -e "\bDone!" } # Function to check if a service is running and stop it stop_service() { local service_name=$1 if systemctl is-active --quiet $service_name; then systemctl stop $service_name echo "Stopping $service_name" fi } # Stop ternoa service if running stop_service ternoa # Check if the script is run as root if [ "$EUID" -ne 0 ]; then echo "Please run as root" exit fi # Detect Debian/Ubuntu if [ -f /etc/debian_version ]; then DISTRO="debian" elif [ -f /etc/lsb-release ]; then DISTRO="ubuntu" else echo "Unsupported distribution" exit fi # Set installation variables read -p "Enter Ternoa Version (default: v1.3.2): " VERSION VERSION=${VERSION:-v1.3.2} BINARY_URL="https://github.com/capsule-corp-ternoa/ternoa-node/releases/download/$VERSION/ternoa" INSTALL_PATH="/usr/bin/ternoa" USERNAME="ternoa" GROUPNAME="root" # Create a user and group for Ternoa service groupadd $GROUPNAME useradd -m -g $GROUPNAME $USERNAME usermod -aG sudo $USERNAME # Download binary with spinner wget $BINARY_URL -O $INSTALL_PATH & spinner $! # Create the base path directory and grant write permissions to root group BASE_PATH="/block/chain/node-data" mkdir -p $BASE_PATH chown $USERNAME:$GROUPNAME $BASE_PATH chmod a+x $BASE_PATH # Get user inputs read -p "Node Name (required): " NODE_NAME if [ -z "$NODE_NAME" ]; then echo "Node Name is required. Exiting." exit 1 fi # Input validation for Chain Name CHAIN_NAME="" while true; do read -p "Chain Name (alphanet/mainnet/betanet, default: mainnet): " CHAIN_NAME CHAIN_NAME=${CHAIN_NAME:-mainnet} case $CHAIN_NAME in alphanet|mainnet|betanet) break ;; *) echo "Invalid Chain Name. Please enter alphanet, mainnet, or betanet." ;; esac done #Construct Ternoa command TERNOA_COMMAND="/usr/bin/ternoa --name $NODE_NAME --chain $CHAIN_NAME --base-path $BASE_PATH --ws-max-connections 1000 --telemetry-url 'wss://telemetry.polkadot.io/submit/ 0'" # Prompt for Validator only if not specified in the command line if [ -z "$VALIDATOR" ]; then read -p "Validator (true/false, default: false): " USER_VALIDATOR VALIDATOR=${USER_VALIDATOR:false} fi read -p "Archive Mode (true/false, default: true): " ARCHIVE_MODE ARCHIVE_MODE=${ARCHIVE_MODE:-true} read -p "Enable Prometheus (true/false, default: false): " PROMETHEUS PROMETHEUS=${PROMETHEUS:-false} # Add --validator flag if the user specified true or enable RPC Calls if [ "$VALIDATOR" == "true" ]; then TERNOA_COMMAND="$TERNOA_COMMAND --validator" else TERNOA_COMMAND="$TERNOA_COMMAND --ws-external --rpc-external --rpc-cors all --rpc-methods=Safe " fi # Initialize PROMETHEUS_PORT with default value PROMETHEUS_PORT="9615" # Prompt for PROMETHEUS_PORT only if PROMETHEUS is true if [ "$PROMETHEUS" == "true" ]; then while true; do read -p "Enter Prometheus Port (default: 9615, integer): " USER_PROMETHEUS_PORT if [ -z "$USER_PROMETHEUS_PORT" ]; then break elif [[ ! "$USER_PROMETHEUS_PORT" =~ ^[0-9]+$ ]]; then echo "Please enter a valid integer for Prometheus Port." else PROMETHEUS_PORT="$USER_PROMETHEUS_PORT" break fi done fi # Move ternoa binary to /usr/bin and make it executable for the root group mv $INSTALL_PATH /usr/bin/ternoa chown $USERNAME:$GROUPNAME /usr/bin/ternoa chmod a+x /usr/bin/ternoa # Add additional flags based on user inputs if [ "$PROMETHEUS" == "true" ]; then TERNOA_COMMAND="$TERNOA_COMMAND --prometheus-port $PROMETHEUS_PORT" fi if [ "$ARCHIVE_MODE" == "false" ]; then TERNOA_COMMAND="$TERNOA_COMMAND --database paritydb" else TERNOA_COMMAND="$TERNOA_COMMAND --state-pruning archive" fi # Create systemd service file cat < /etc/systemd/system/ternoa.service [Unit] Description=Ternoa Node [Service] ExecStart=$TERNOA_COMMAND Restart=always User=$USERNAME Group=$GROUPNAME [Install] WantedBy=multi-user.target EOL # Add ternoa user to sudoers echo "$USERNAME ALL=(ALL) ALL" | tee -a /etc/sudoers # Start and enable the service systemctl daemon-reload systemctl start ternoa systemctl enable ternoa echo "Running Ternoa with the following command :" echo "$TERNOA_COMMAND" echo "Ternoa installed successfully!" echo "Ternoa version: $VERSION" # Display journalctl logs for 10 seconds and kill the process echo "Displaying journalctl logs for 10 seconds..." journalctl -u ternoa --follow & JOURNAL_PID=$! # Wait for 10 seconds sleep 10 # Kill the journalctl process kill $JOURNAL_PID echo "Logs displayed for 10 seconds. Exiting." # Check if ternoa service is running if systemctl is-active --quiet ternoa; then echo "Ternoa installed successfully!" echo "Ternoa version: $VERSION" echo "Ternoa service is running." else echo "Error: Ternoa service is not running." fi