chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo "Running on architecture: $(uname -m)"
|
||||
|
||||
# Copy PocketBase data if empty
|
||||
if [ ! -f /mnt/pb_data/data.db ] && [ -d /app/pb_data ] && [ "$(ls -A /app/pb_data)" ]; then
|
||||
cp -a /app/pb_data/. /mnt/pb_data/
|
||||
fi
|
||||
|
||||
# Start PocketBase in the background
|
||||
echo "Starting CheckCle Application..."
|
||||
/app/pocketbase serve --http=0.0.0.0:8090 --dir /mnt/pb_data 2>&1 | grep -vE 'REST API|Dashboard' &
|
||||
|
||||
# Wait for PocketBase to become available
|
||||
echo "Waiting for Backend Server to become available..."
|
||||
until curl -s http://localhost:8090/api/health >/dev/null; do
|
||||
echo "Waiting on http://localhost:8090..."
|
||||
sleep 1
|
||||
done
|
||||
|
||||
echo "Backend Server is up!"
|
||||
|
||||
# Start Go service
|
||||
echo "Starting Go Operational service..."
|
||||
/app/service-operation &
|
||||
|
||||
echo "Default Access: admin@example.com/Admin123456"
|
||||
# Keep container alive
|
||||
wait
|
||||
@@ -0,0 +1,367 @@
|
||||
|
||||
#!/bin/bash
|
||||
|
||||
# CheckCle Regional Monitoring Agent - Universal Installation Script
|
||||
# This script automatically detects system architecture and installs the appropriate package
|
||||
# Usage: curl -fsSL https://raw.githubusercontent.com/operacle/checkcle/main/scripts/install-regional-agent.sh | sudo bash -s -- [options]
|
||||
|
||||
set -e
|
||||
|
||||
# Default values
|
||||
REGION_NAME=""
|
||||
AGENT_ID=""
|
||||
AGENT_IP_ADDRESS=""
|
||||
AGENT_TOKEN=""
|
||||
POCKETBASE_URL=""
|
||||
BASE_PACKAGE_URL="https://github.com/operacle/Distributed-Regional-Monitoring/releases/download/V1.0.0"
|
||||
PACKAGE_VERSION="1.0.0"
|
||||
SERVICE_NAME="regional-check-agent"
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Helper functions
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# Function to show usage
|
||||
show_usage() {
|
||||
echo "Usage: $0 [OPTIONS]"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " --region-name=NAME Set the region name (required)"
|
||||
echo " --agent-id=ID Set the agent ID (required)"
|
||||
echo " --agent-ip=IP Set the agent IP address (required)"
|
||||
echo " --token=TOKEN Set the authentication token (required)"
|
||||
echo " --pocketbase-url=URL Set the PocketBase API URL (required)"
|
||||
echo " --package-version=VER Set package version (default: $PACKAGE_VERSION)"
|
||||
echo " --help Show this help message"
|
||||
echo ""
|
||||
echo "Example:"
|
||||
echo " $0 --region-name=\"us-east-1\" --agent-id=\"agent_abc123\" \\"
|
||||
echo " --agent-ip=\"192.168.1.100\" --token=\"your-token\" \\"
|
||||
echo " --pocketbase-url=\"https://your-pb.com\""
|
||||
}
|
||||
|
||||
# Parse command line arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--region-name=*)
|
||||
REGION_NAME="${1#*=}"
|
||||
shift
|
||||
;;
|
||||
--agent-id=*)
|
||||
AGENT_ID="${1#*=}"
|
||||
shift
|
||||
;;
|
||||
--agent-ip=*)
|
||||
AGENT_IP_ADDRESS="${1#*=}"
|
||||
shift
|
||||
;;
|
||||
--token=*)
|
||||
AGENT_TOKEN="${1#*=}"
|
||||
shift
|
||||
;;
|
||||
--pocketbase-url=*)
|
||||
POCKETBASE_URL="${1#*=}"
|
||||
shift
|
||||
;;
|
||||
--package-version=*)
|
||||
PACKAGE_VERSION="${1#*=}"
|
||||
shift
|
||||
;;
|
||||
--help)
|
||||
show_usage
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1"
|
||||
show_usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Validate required parameters
|
||||
if [[ -z "$REGION_NAME" || -z "$AGENT_ID" || -z "$AGENT_IP_ADDRESS" || -z "$AGENT_TOKEN" || -z "$POCKETBASE_URL" ]]; then
|
||||
log_error "Missing required parameters"
|
||||
echo ""
|
||||
show_usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "============================================="
|
||||
echo " CheckCle Regional Monitoring Agent"
|
||||
echo " Universal Installation"
|
||||
echo "============================================="
|
||||
|
||||
# Check if running as root
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
log_error "This script must be run as root (use sudo)"
|
||||
echo " Usage: sudo bash $0 [options]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Detect operating system
|
||||
OS_TYPE=$(uname -s | tr '[:upper:]' '[:lower:]')
|
||||
|
||||
# Check if it's a supported OS
|
||||
if [[ "$OS_TYPE" != "linux" ]]; then
|
||||
log_error "Unsupported operating system: $OS_TYPE"
|
||||
log_info "This installer only supports Linux systems"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Detect architecture
|
||||
ARCH=$(uname -m)
|
||||
|
||||
# Map architecture to package architecture
|
||||
case $ARCH in
|
||||
x86_64|amd64)
|
||||
PKG_ARCH="amd64"
|
||||
;;
|
||||
aarch64|arm64)
|
||||
PKG_ARCH="arm64"
|
||||
;;
|
||||
armv7l|armv6l)
|
||||
PKG_ARCH="arm64"
|
||||
log_warning "ARM 32-bit detected, using ARM64 package (may require compatibility layer)"
|
||||
;;
|
||||
*)
|
||||
log_error "Unsupported architecture: $ARCH"
|
||||
log_info "Supported architectures: x86_64 (amd64), aarch64 (arm64)"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
log_success "System: $OS_TYPE ($ARCH -> $PKG_ARCH)"
|
||||
|
||||
# Construct package URLs and names
|
||||
PACKAGE_URL="$BASE_PACKAGE_URL/distributed-regional-check-agent_${PACKAGE_VERSION}_${PKG_ARCH}.deb"
|
||||
PACKAGE_NAME="distributed-regional-check-agent_${PACKAGE_VERSION}_${PKG_ARCH}.deb"
|
||||
|
||||
# Check for required tools
|
||||
MISSING_TOOLS=()
|
||||
|
||||
if ! command -v wget >/dev/null 2>&1 && ! command -v curl >/dev/null 2>&1; then
|
||||
MISSING_TOOLS+=("wget or curl")
|
||||
fi
|
||||
|
||||
if ! command -v dpkg >/dev/null 2>&1; then
|
||||
MISSING_TOOLS+=("dpkg")
|
||||
fi
|
||||
|
||||
if ! command -v systemctl >/dev/null 2>&1; then
|
||||
MISSING_TOOLS+=("systemd")
|
||||
fi
|
||||
|
||||
if [ ${#MISSING_TOOLS[@]} -ne 0 ]; then
|
||||
log_error "Missing required tools: ${MISSING_TOOLS[*]}"
|
||||
log_info "On Debian/Ubuntu: sudo apt-get update && sudo apt-get install wget curl"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create temporary directory
|
||||
TEMP_DIR=$(mktemp -d)
|
||||
|
||||
# Download the .deb package
|
||||
log_info "Downloading package for $PKG_ARCH..."
|
||||
cd "$TEMP_DIR"
|
||||
|
||||
# Test if package exists first
|
||||
if command -v curl >/dev/null 2>&1; then
|
||||
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" -I "$PACKAGE_URL")
|
||||
if [ "$HTTP_STATUS" != "200" ] && [ "$HTTP_STATUS" != "302" ]; then
|
||||
log_error "Package not found at $PACKAGE_URL (HTTP $HTTP_STATUS)"
|
||||
log_info "Check: https://github.com/operacle/Distributed-Regional-Monitoring/releases"
|
||||
rm -rf "$TEMP_DIR"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Try wget first, then curl as fallback
|
||||
DOWNLOAD_SUCCESS=false
|
||||
|
||||
if command -v wget >/dev/null 2>&1; then
|
||||
if wget -q --show-progress --timeout=30 --tries=3 "$PACKAGE_URL" -O "$PACKAGE_NAME"; then
|
||||
DOWNLOAD_SUCCESS=true
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$DOWNLOAD_SUCCESS" = false ] && command -v curl >/dev/null 2>&1; then
|
||||
if curl -L --connect-timeout 30 --max-time 300 --retry 3 --retry-delay 2 -o "$PACKAGE_NAME" "$PACKAGE_URL" --progress-bar; then
|
||||
DOWNLOAD_SUCCESS=true
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$DOWNLOAD_SUCCESS" = false ]; then
|
||||
log_error "Failed to download package from $PACKAGE_URL"
|
||||
log_info "Check internet connection and package availability"
|
||||
rm -rf "$TEMP_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Verify download was successful
|
||||
if [ ! -f "$PACKAGE_NAME" ] || [ ! -s "$PACKAGE_NAME" ]; then
|
||||
log_error "Downloaded package is empty or missing"
|
||||
rm -rf "$TEMP_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Verify package integrity
|
||||
if dpkg-deb --info "$PACKAGE_NAME" > /dev/null 2>&1; then
|
||||
log_success "Package verified"
|
||||
else
|
||||
log_error "Package verification failed - corrupted download"
|
||||
rm -rf "$TEMP_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Install the package
|
||||
log_info "Installing package..."
|
||||
if dpkg -i "$PACKAGE_NAME" 2>/dev/null; then
|
||||
log_success "Package installed"
|
||||
else
|
||||
log_warning "Fixing dependencies..."
|
||||
if apt-get update && apt-get install -f -y; then
|
||||
log_success "Package installed with dependencies"
|
||||
else
|
||||
log_error "Failed to install package"
|
||||
log_info "Try: sudo apt-get update && sudo apt-get install -f"
|
||||
rm -rf "$TEMP_DIR"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Configure the agent
|
||||
log_info "Configuring agent..."
|
||||
|
||||
# Ensure configuration directory exists
|
||||
mkdir -p /etc/regional-check-agent
|
||||
|
||||
# Create the environment configuration file
|
||||
cat > /etc/regional-check-agent/regional-check-agent.env << EOF
|
||||
# Distributed Regional Check Agent Configuration
|
||||
# Auto-generated on $(date)
|
||||
|
||||
# Server Configuration
|
||||
PORT=8091
|
||||
|
||||
# Operation defaults
|
||||
DEFAULT_COUNT=4
|
||||
DEFAULT_TIMEOUT=10s
|
||||
MAX_COUNT=20
|
||||
MAX_TIMEOUT=30s
|
||||
|
||||
# Logging
|
||||
ENABLE_LOGGING=true
|
||||
|
||||
# PocketBase integration
|
||||
POCKETBASE_ENABLED=true
|
||||
POCKETBASE_URL=$POCKETBASE_URL
|
||||
|
||||
# Regional Agent Configuration
|
||||
REGION_NAME=$REGION_NAME
|
||||
AGENT_ID=$AGENT_ID
|
||||
AGENT_IP_ADDRESS=$AGENT_IP_ADDRESS
|
||||
AGENT_TOKEN=$AGENT_TOKEN
|
||||
|
||||
# Monitoring configuration
|
||||
CHECK_INTERVAL=30s
|
||||
MAX_RETRIES=3
|
||||
REQUEST_TIMEOUT=10s
|
||||
EOF
|
||||
|
||||
# Set proper permissions
|
||||
if id "regional-check-agent" &>/dev/null; then
|
||||
chown root:regional-check-agent /etc/regional-check-agent/regional-check-agent.env
|
||||
chmod 640 /etc/regional-check-agent/regional-check-agent.env
|
||||
else
|
||||
chown root:root /etc/regional-check-agent/regional-check-agent.env
|
||||
chmod 600 /etc/regional-check-agent/regional-check-agent.env
|
||||
fi
|
||||
|
||||
log_success "Configuration complete"
|
||||
|
||||
# Enable and start the service
|
||||
log_info "Starting service..."
|
||||
|
||||
# Reload systemd daemon
|
||||
systemctl daemon-reload
|
||||
|
||||
# Enable the service for auto-start
|
||||
if systemctl enable $SERVICE_NAME; then
|
||||
log_success "Service enabled"
|
||||
else
|
||||
log_error "Failed to enable service"
|
||||
rm -rf "$TEMP_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Start the service
|
||||
if systemctl start $SERVICE_NAME; then
|
||||
log_success "Service started"
|
||||
else
|
||||
log_error "Failed to start service"
|
||||
log_info "Check logs: sudo journalctl -u $SERVICE_NAME -f"
|
||||
rm -rf "$TEMP_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Wait a moment for service to initialize
|
||||
sleep 5
|
||||
|
||||
# Test health endpoint
|
||||
HEALTH_CHECK_ATTEMPTS=3
|
||||
for i in $(seq 1 $HEALTH_CHECK_ATTEMPTS); do
|
||||
if curl -s -f --connect-timeout 5 http://localhost:8091/health > /dev/null; then
|
||||
log_success "Health endpoint responding"
|
||||
break
|
||||
else
|
||||
if [ $i -lt $HEALTH_CHECK_ATTEMPTS ]; then
|
||||
sleep 2
|
||||
else
|
||||
log_warning "Health endpoint not responding (service may still be starting)"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# Cleanup
|
||||
rm -rf "$TEMP_DIR"
|
||||
|
||||
echo ""
|
||||
echo "============================================="
|
||||
echo " Installation Complete!"
|
||||
echo "============================================="
|
||||
echo ""
|
||||
log_success "CheckCle Regional Monitoring Agent installed successfully"
|
||||
echo ""
|
||||
echo "Agent Details:"
|
||||
echo " Region: $REGION_NAME"
|
||||
echo " Agent ID: $AGENT_ID"
|
||||
echo " Status: $(systemctl is-active $SERVICE_NAME 2>/dev/null || echo 'unknown')"
|
||||
echo " Health: http://localhost:8091/health"
|
||||
echo ""
|
||||
echo "Management Commands:"
|
||||
echo " Status: sudo systemctl status $SERVICE_NAME"
|
||||
echo " Logs: sudo journalctl -u $SERVICE_NAME -f"
|
||||
echo " Restart: sudo systemctl restart $SERVICE_NAME"
|
||||
echo ""
|
||||
log_success "Agent is now monitoring and reporting to your dashboard!"
|
||||
@@ -0,0 +1,753 @@
|
||||
#!/bin/bash
|
||||
|
||||
# CheckCle Server Monitoring Agent - One-Click Installation Script
|
||||
# This script provides fully automated installation using environment variables
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
CONFIG_FILE="/etc/monitoring-agent/monitoring-agent.env"
|
||||
|
||||
# GitHub release base URL
|
||||
GITHUB_BASE_URL="https://github.com/operacle/checke-server-agent/releases/download/v1.0.0"
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Helper functions
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# Check if running as root
|
||||
check_root() {
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
log_error "This script must be run as root (use sudo)"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Detect system architecture and package format with fallback
|
||||
detect_system() {
|
||||
log_info "Detecting system architecture and package format..."
|
||||
|
||||
# Detect architecture
|
||||
ARCH=$(uname -m)
|
||||
case $ARCH in
|
||||
x86_64)
|
||||
PACKAGE_ARCH="amd64"
|
||||
;;
|
||||
aarch64|arm64)
|
||||
PACKAGE_ARCH="arm64"
|
||||
;;
|
||||
*)
|
||||
log_error "Unsupported architecture: $ARCH"
|
||||
log_info "Supported architectures: x86_64 (amd64), aarch64/arm64"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Detect OS and preferred package format
|
||||
PREFERRED_FORMAT=""
|
||||
PREFERRED_MANAGER=""
|
||||
|
||||
if [[ -f /etc/os-release ]]; then
|
||||
OS_ID=$(grep "^ID=" /etc/os-release | cut -d'=' -f2 | tr -d '"')
|
||||
OS_LIKE=$(grep "^ID_LIKE=" /etc/os-release 2>/dev/null | cut -d'=' -f2 | tr -d '"' || echo "")
|
||||
|
||||
log_info "Detected OS: $OS_ID"
|
||||
[[ -n "$OS_LIKE" ]] && log_info "OS family: $OS_LIKE"
|
||||
|
||||
# Determine preferred package format based on OS
|
||||
case "$OS_ID" in
|
||||
debian|ubuntu|linuxmint|elementary|pop)
|
||||
PREFERRED_FORMAT="deb"
|
||||
PREFERRED_MANAGER="dpkg"
|
||||
;;
|
||||
rhel|centos|fedora|rocky|almalinux|oracle|amazonlinux)
|
||||
PREFERRED_FORMAT="rpm"
|
||||
if command -v dnf >/dev/null 2>&1; then
|
||||
PREFERRED_MANAGER="dnf"
|
||||
elif command -v yum >/dev/null 2>&1; then
|
||||
PREFERRED_MANAGER="yum"
|
||||
else
|
||||
PREFERRED_MANAGER="rpm"
|
||||
fi
|
||||
;;
|
||||
arch|manjaro|artix|endeavouros)
|
||||
# Arch-based systems - use tar.gz fallback
|
||||
log_info "Arch-based system detected, using tar.gz format"
|
||||
PREFERRED_FORMAT="tar.gz"
|
||||
PREFERRED_MANAGER="tar"
|
||||
;;
|
||||
*)
|
||||
# Check OS_LIKE for family detection
|
||||
if [[ "$OS_LIKE" == *"debian"* ]] || [[ "$OS_LIKE" == *"ubuntu"* ]]; then
|
||||
PREFERRED_FORMAT="deb"
|
||||
PREFERRED_MANAGER="dpkg"
|
||||
elif [[ "$OS_LIKE" == *"rhel"* ]] || [[ "$OS_LIKE" == *"fedora"* ]]; then
|
||||
PREFERRED_FORMAT="rpm"
|
||||
if command -v dnf >/dev/null 2>&1; then
|
||||
PREFERRED_MANAGER="dnf"
|
||||
elif command -v yum >/dev/null 2>&1; then
|
||||
PREFERRED_MANAGER="yum"
|
||||
else
|
||||
PREFERRED_MANAGER="rpm"
|
||||
fi
|
||||
elif [[ "$OS_LIKE" == *"arch"* ]]; then
|
||||
PREFERRED_FORMAT="tar.gz"
|
||||
PREFERRED_MANAGER="tar"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# If no preferred format detected, check available package managers
|
||||
if [[ -z "$PREFERRED_FORMAT" ]]; then
|
||||
if command -v dpkg >/dev/null 2>&1; then
|
||||
PREFERRED_FORMAT="deb"
|
||||
PREFERRED_MANAGER="dpkg"
|
||||
elif command -v rpm >/dev/null 2>&1; then
|
||||
PREFERRED_FORMAT="rpm"
|
||||
if command -v dnf >/dev/null 2>&1; then
|
||||
PREFERRED_MANAGER="dnf"
|
||||
elif command -v yum >/dev/null 2>&1; then
|
||||
PREFERRED_MANAGER="yum"
|
||||
else
|
||||
PREFERRED_MANAGER="rpm"
|
||||
fi
|
||||
else
|
||||
# Fallback to tar.gz for unsupported systems
|
||||
log_info "No native package manager found, using tar.gz fallback"
|
||||
PREFERRED_FORMAT="tar.gz"
|
||||
PREFERRED_MANAGER="tar"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Set initial package format and manager
|
||||
PACKAGE_FORMAT="$PREFERRED_FORMAT"
|
||||
PACKAGE_MANAGER="$PREFERRED_MANAGER"
|
||||
|
||||
# Construct initial package filename and URL
|
||||
construct_package_url
|
||||
|
||||
log_success "System detection complete:"
|
||||
log_info " Architecture: $ARCH -> $PACKAGE_ARCH"
|
||||
log_info " Package format: $PACKAGE_FORMAT"
|
||||
log_info " Package manager: $PACKAGE_MANAGER"
|
||||
log_info " Package URL: $PACKAGE_URL"
|
||||
}
|
||||
|
||||
# Construct package URL based on current format
|
||||
construct_package_url() {
|
||||
if [[ "$PACKAGE_FORMAT" == "tar.gz" ]]; then
|
||||
PACKAGE_FILENAME="monitoring-agent_1.0.0_${PACKAGE_ARCH}.tar.gz"
|
||||
else
|
||||
PACKAGE_FILENAME="monitoring-agent_1.0.0_${PACKAGE_ARCH}.${PACKAGE_FORMAT}"
|
||||
fi
|
||||
PACKAGE_URL="${GITHUB_BASE_URL}/${PACKAGE_FILENAME}"
|
||||
}
|
||||
|
||||
# Validate required environment variables - check both current and sudo environments
|
||||
validate_environment() {
|
||||
# Check if SERVER_TOKEN is available in current environment or passed as argument
|
||||
if [[ -z "$SERVER_TOKEN" ]]; then
|
||||
log_error "SERVER_TOKEN environment variable is required"
|
||||
log_info "Usage examples:"
|
||||
log_info " SERVER_TOKEN=your-token sudo -E bash $0"
|
||||
log_info " sudo SERVER_TOKEN=your-token bash $0"
|
||||
log_info " curl -L script-url | SERVER_TOKEN=your-token sudo bash"
|
||||
log_info ""
|
||||
log_info "Required: SERVER_TOKEN"
|
||||
log_info "Optional: POCKETBASE_URL, SERVER_NAME, AGENT_ID, HEALTH_CHECK_PORT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_success "Environment validation passed"
|
||||
log_info "SERVER_TOKEN: ${SERVER_TOKEN:0:8}..."
|
||||
[[ -n "$POCKETBASE_URL" ]] && log_info "POCKETBASE_URL: $POCKETBASE_URL"
|
||||
[[ -n "$SERVER_NAME" ]] && log_info "SERVER_NAME: $SERVER_NAME"
|
||||
[[ -n "$AGENT_ID" ]] && log_info "AGENT_ID: $AGENT_ID"
|
||||
}
|
||||
|
||||
# Download package with fallback to tar.gz
|
||||
download_package() {
|
||||
local temp_dir="/tmp/monitoring-agent-install"
|
||||
mkdir -p "$temp_dir"
|
||||
|
||||
log_info "Downloading monitoring agent package..."
|
||||
log_info "URL: $PACKAGE_URL"
|
||||
|
||||
# Try to download the preferred package format first
|
||||
if curl -L -f -s -o "$temp_dir/$PACKAGE_FILENAME" "$PACKAGE_URL" 2>/dev/null; then
|
||||
# Verify the file was actually downloaded and has content
|
||||
if [[ -s "$temp_dir/$PACKAGE_FILENAME" ]]; then
|
||||
DOWNLOADED_PACKAGE="$temp_dir/$PACKAGE_FILENAME"
|
||||
log_success "Package downloaded successfully: $PACKAGE_FILENAME"
|
||||
return 0
|
||||
else
|
||||
log_warning "Downloaded file is empty, trying fallback..."
|
||||
rm -f "$temp_dir/$PACKAGE_FILENAME"
|
||||
fi
|
||||
else
|
||||
log_warning "Failed to download preferred package format: $PACKAGE_FORMAT"
|
||||
fi
|
||||
|
||||
# If preferred format failed and it's not tar.gz, try tar.gz fallback
|
||||
if [[ "$PACKAGE_FORMAT" != "tar.gz" ]]; then
|
||||
log_warning "Native package ($PACKAGE_FORMAT) not available, trying tar.gz fallback..."
|
||||
|
||||
# Switch to tar.gz format
|
||||
PACKAGE_FORMAT="tar.gz"
|
||||
PACKAGE_MANAGER="tar"
|
||||
construct_package_url
|
||||
|
||||
log_info "Fallback URL: $PACKAGE_URL"
|
||||
|
||||
if curl -L -f -s -o "$temp_dir/$PACKAGE_FILENAME" "$PACKAGE_URL" 2>/dev/null; then
|
||||
# Verify the file was actually downloaded and has content
|
||||
if [[ -s "$temp_dir/$PACKAGE_FILENAME" ]]; then
|
||||
DOWNLOADED_PACKAGE="$temp_dir/$PACKAGE_FILENAME"
|
||||
log_success "Fallback package downloaded successfully: $PACKAGE_FILENAME"
|
||||
return 0
|
||||
else
|
||||
log_error "Downloaded fallback file is empty"
|
||||
rm -f "$temp_dir/$PACKAGE_FILENAME"
|
||||
fi
|
||||
else
|
||||
log_error "Failed to download tar.gz fallback"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Both attempts failed
|
||||
log_error "Failed to download package from: $PACKAGE_URL"
|
||||
log_info "Please check:"
|
||||
log_info " 1. Internet connectivity"
|
||||
log_info " 2. Package availability for your architecture ($PACKAGE_ARCH)"
|
||||
log_info " 3. GitHub repository access"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Install tar.gz package
|
||||
install_tar_package() {
|
||||
log_info "Installing monitoring agent from tar.gz package..."
|
||||
|
||||
local temp_extract_dir="/tmp/monitoring-agent-extract"
|
||||
mkdir -p "$temp_extract_dir"
|
||||
|
||||
# Extract tar.gz package
|
||||
if tar -xzf "$DOWNLOADED_PACKAGE" -C "$temp_extract_dir"; then
|
||||
log_success "Package extracted successfully"
|
||||
else
|
||||
log_error "Failed to extract tar.gz package"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Install files to their proper locations
|
||||
log_info "Installing files to system directories..."
|
||||
|
||||
# Create necessary directories
|
||||
mkdir -p /usr/bin
|
||||
mkdir -p /etc/monitoring-agent
|
||||
mkdir -p /var/lib/monitoring-agent
|
||||
mkdir -p /var/log/monitoring-agent
|
||||
|
||||
# Detect systemd service directory based on OS
|
||||
if [[ -d /lib/systemd/system ]]; then
|
||||
SYSTEMD_DIR="/lib/systemd/system"
|
||||
elif [[ -d /usr/lib/systemd/system ]]; then
|
||||
SYSTEMD_DIR="/usr/lib/systemd/system"
|
||||
else
|
||||
SYSTEMD_DIR="/etc/systemd/system"
|
||||
fi
|
||||
mkdir -p "$SYSTEMD_DIR"
|
||||
|
||||
# Copy files from extracted package
|
||||
if [[ -f "$temp_extract_dir/usr/bin/monitoring-agent" ]]; then
|
||||
cp "$temp_extract_dir/usr/bin/monitoring-agent" /usr/bin/
|
||||
chmod +x /usr/bin/monitoring-agent
|
||||
log_success "Binary installed to /usr/bin/monitoring-agent"
|
||||
else
|
||||
log_error "Binary not found in package"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -f "$temp_extract_dir/etc/monitoring-agent/monitoring-agent.env" ]]; then
|
||||
cp "$temp_extract_dir/etc/monitoring-agent/monitoring-agent.env" /etc/monitoring-agent/
|
||||
log_success "Configuration template installed"
|
||||
fi
|
||||
|
||||
# Create monitoring-agent user and group if they don't exist
|
||||
if ! getent group monitoring-agent >/dev/null 2>&1; then
|
||||
groupadd --system monitoring-agent
|
||||
log_success "Created monitoring-agent group"
|
||||
else
|
||||
log_info "monitoring-agent group already exists"
|
||||
fi
|
||||
|
||||
if ! getent passwd monitoring-agent >/dev/null 2>&1; then
|
||||
useradd --system --gid monitoring-agent --home-dir /var/lib/monitoring-agent --shell /bin/false --comment "Monitoring Agent" monitoring-agent
|
||||
log_success "Created monitoring-agent user"
|
||||
else
|
||||
log_info "monitoring-agent user already exists"
|
||||
fi
|
||||
|
||||
# Set proper ownership and permissions
|
||||
chown -R monitoring-agent:monitoring-agent /var/lib/monitoring-agent
|
||||
chown -R monitoring-agent:monitoring-agent /var/log/monitoring-agent
|
||||
chown -R monitoring-agent:monitoring-agent /etc/monitoring-agent
|
||||
chmod 755 /var/lib/monitoring-agent
|
||||
chmod 755 /var/log/monitoring-agent
|
||||
chmod 755 /etc/monitoring-agent
|
||||
|
||||
# Check if Docker is installed and configure service file accordingly
|
||||
DOCKER_AVAILABLE=false
|
||||
if command -v docker >/dev/null 2>&1 && getent group docker >/dev/null 2>&1; then
|
||||
DOCKER_AVAILABLE=true
|
||||
# Add monitoring-agent user to docker group if Docker is available
|
||||
usermod -a -G docker monitoring-agent
|
||||
log_info "Docker detected, added monitoring-agent user to docker group"
|
||||
else
|
||||
log_info "Docker not detected, skipping Docker group configuration"
|
||||
fi
|
||||
|
||||
# Create the systemd service file with proper Docker configuration
|
||||
create_systemd_service_file "$SYSTEMD_DIR" "$DOCKER_AVAILABLE"
|
||||
|
||||
# Clean up extraction directory
|
||||
rm -rf "$temp_extract_dir"
|
||||
|
||||
log_success "Tar.gz package installation completed"
|
||||
}
|
||||
|
||||
# Create systemd service file with Docker configuration
|
||||
create_systemd_service_file() {
|
||||
local systemd_dir="$1"
|
||||
local docker_available="$2"
|
||||
|
||||
log_info "Creating systemd service file at $systemd_dir/monitoring-agent.service"
|
||||
|
||||
cat > "$systemd_dir/monitoring-agent.service" << 'EOF'
|
||||
[Unit]
|
||||
Description=CheckCle Server Monitoring Agent
|
||||
Documentation=https://github.com/operacle/checkcle-server-agent
|
||||
After=network.target
|
||||
Wants=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=monitoring-agent
|
||||
Group=monitoring-agent
|
||||
EOF
|
||||
|
||||
# Add Docker group only if Docker is available
|
||||
if [[ "$docker_available" == "true" ]]; then
|
||||
echo "# Add docker group for Docker monitoring access" >> "$systemd_dir/monitoring-agent.service"
|
||||
echo "SupplementaryGroups=docker" >> "$systemd_dir/monitoring-agent.service"
|
||||
else
|
||||
echo "# Docker not available - skipping Docker group configuration" >> "$systemd_dir/monitoring-agent.service"
|
||||
fi
|
||||
|
||||
# Continue with the rest of the service configuration
|
||||
cat >> "$systemd_dir/monitoring-agent.service" << 'EOF'
|
||||
ExecStart=/usr/bin/monitoring-agent
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
|
||||
# Security settings
|
||||
NoNewPrivileges=yes
|
||||
ProtectSystem=strict
|
||||
ProtectHome=yes
|
||||
PrivateTmp=yes
|
||||
ProtectKernelTunables=yes
|
||||
ProtectControlGroups=yes
|
||||
RestrictSUIDSGID=yes
|
||||
RemoveIPC=yes
|
||||
RestrictRealtime=yes
|
||||
|
||||
# Allow access to system information and configuration
|
||||
ReadWritePaths=/var/log/monitoring-agent
|
||||
ReadOnlyPaths=/proc /sys /etc/monitoring-agent
|
||||
|
||||
# Network access
|
||||
PrivateNetwork=no
|
||||
|
||||
# Environment
|
||||
EnvironmentFile=/etc/monitoring-agent/monitoring-agent.env
|
||||
WorkingDirectory=/var/lib/monitoring-agent
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
log_success "Created systemd service file with Docker support: $docker_available"
|
||||
}
|
||||
|
||||
# Install package based on detected package manager
|
||||
install_package() {
|
||||
log_info "Installing monitoring agent package using $PACKAGE_MANAGER..."
|
||||
|
||||
case $PACKAGE_MANAGER in
|
||||
dpkg)
|
||||
# Update package lists
|
||||
apt-get update -qq
|
||||
|
||||
# Install the package
|
||||
if dpkg -i "$DOWNLOADED_PACKAGE" 2>/dev/null; then
|
||||
log_success "DEB package installed successfully"
|
||||
else
|
||||
log_warning "Package installation had dependency issues, fixing..."
|
||||
apt-get install -f -y
|
||||
log_success "Dependencies resolved and package installed"
|
||||
fi
|
||||
;;
|
||||
|
||||
rpm)
|
||||
# Install the package directly
|
||||
if rpm -ivh "$DOWNLOADED_PACKAGE" 2>/dev/null; then
|
||||
log_success "RPM package installed successfully"
|
||||
else
|
||||
log_error "RPM package installation failed"
|
||||
log_info "Try installing manually: sudo rpm -ivh $DOWNLOADED_PACKAGE"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
yum)
|
||||
if yum localinstall -y "$DOWNLOADED_PACKAGE"; then
|
||||
log_success "Package installed successfully via YUM"
|
||||
else
|
||||
log_error "YUM package installation failed"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
dnf)
|
||||
if dnf localinstall -y "$DOWNLOADED_PACKAGE"; then
|
||||
log_success "Package installed successfully via DNF"
|
||||
else
|
||||
log_error "DNF package installation failed"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
tar)
|
||||
install_tar_package
|
||||
;;
|
||||
|
||||
*)
|
||||
log_error "Unsupported package manager: $PACKAGE_MANAGER"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Auto-detect system information
|
||||
detect_system_info() {
|
||||
log_info "Auto-detecting system information..."
|
||||
|
||||
# Detect hostname
|
||||
DETECTED_HOSTNAME=$(hostname)
|
||||
log_info "Detected hostname: $DETECTED_HOSTNAME"
|
||||
|
||||
# Detect IP address
|
||||
DETECTED_IP=$(ip route get 8.8.8.8 2>/dev/null | head -1 | awk '{print $7}' | head -1)
|
||||
if [[ -z "$DETECTED_IP" ]]; then
|
||||
DETECTED_IP=$(hostname -I | awk '{print $1}')
|
||||
fi
|
||||
log_info "Detected IP address: $DETECTED_IP"
|
||||
|
||||
# Detect OS
|
||||
if [[ -f /etc/os-release ]]; then
|
||||
DETECTED_OS=$(grep "^ID=" /etc/os-release | cut -d'=' -f2 | tr -d '"')
|
||||
else
|
||||
DETECTED_OS="linux"
|
||||
fi
|
||||
log_info "Detected OS: $DETECTED_OS"
|
||||
}
|
||||
|
||||
# Configure agent using environment variables
|
||||
configure_agent() {
|
||||
log_info "Configuring agent with provided settings..."
|
||||
|
||||
# Use environment variables or auto-detected defaults
|
||||
SERVER_NAME="${SERVER_NAME:-$DETECTED_HOSTNAME}"
|
||||
POCKETBASE_URL="${POCKETBASE_URL:-http://localhost:8090}"
|
||||
IP_ADDRESS="${IP_ADDRESS:-$DETECTED_IP}"
|
||||
HOSTNAME="${HOSTNAME:-$DETECTED_HOSTNAME}"
|
||||
OS_TYPE="${OS_TYPE:-$DETECTED_OS}"
|
||||
AGENT_ID="${AGENT_ID:-monitoring-agent-$(hostname -s)}"
|
||||
HEALTH_CHECK_PORT="${HEALTH_CHECK_PORT:-8081}"
|
||||
|
||||
log_info "Final configuration:"
|
||||
log_info " Server Name: $SERVER_NAME"
|
||||
log_info " Agent ID: $AGENT_ID"
|
||||
log_info " PocketBase URL: $POCKETBASE_URL"
|
||||
log_info " IP Address: $IP_ADDRESS"
|
||||
log_info " OS Type: $OS_TYPE"
|
||||
log_info " Health Check Port: $HEALTH_CHECK_PORT"
|
||||
|
||||
write_config
|
||||
}
|
||||
|
||||
# Write configuration to file
|
||||
write_config() {
|
||||
log_info "Writing configuration to $CONFIG_FILE..."
|
||||
|
||||
# Create directory if it doesn't exist
|
||||
mkdir -p "$(dirname "$CONFIG_FILE")"
|
||||
|
||||
cat > "$CONFIG_FILE" << EOF
|
||||
# CheckCle Server Monitoring Agent Configuration
|
||||
# Generated on $(date)
|
||||
|
||||
# Basic Configuration
|
||||
AGENT_ID=$AGENT_ID
|
||||
CHECK_INTERVAL=30s
|
||||
HEALTH_CHECK_PORT=$HEALTH_CHECK_PORT
|
||||
|
||||
# PocketBase Configuration
|
||||
POCKETBASE_ENABLED=true
|
||||
POCKETBASE_URL=$POCKETBASE_URL
|
||||
|
||||
# Server Configuration
|
||||
SERVER_NAME=$SERVER_NAME
|
||||
HOSTNAME=$HOSTNAME
|
||||
IP_ADDRESS=$IP_ADDRESS
|
||||
OS_TYPE=$OS_TYPE
|
||||
SERVER_TOKEN=$SERVER_TOKEN
|
||||
|
||||
# Remote Control
|
||||
REMOTE_CONTROL_ENABLED=true
|
||||
COMMAND_CHECK_INTERVAL=10s
|
||||
|
||||
# Monitoring Settings
|
||||
REPORT_INTERVAL=5m
|
||||
MAX_RETRIES=3
|
||||
REQUEST_TIMEOUT=10s
|
||||
EOF
|
||||
|
||||
# Set proper permissions
|
||||
chown root:monitoring-agent "$CONFIG_FILE" 2>/dev/null || chown root:root "$CONFIG_FILE"
|
||||
chmod 640 "$CONFIG_FILE"
|
||||
|
||||
log_success "Configuration written successfully"
|
||||
}
|
||||
|
||||
# Start and enable service
|
||||
start_service() {
|
||||
log_info "Starting monitoring agent service..."
|
||||
|
||||
# Reload systemd
|
||||
systemctl daemon-reload
|
||||
|
||||
# Enable service
|
||||
systemctl enable monitoring-agent
|
||||
log_success "Service enabled for auto-start"
|
||||
|
||||
# Start service
|
||||
if systemctl start monitoring-agent; then
|
||||
log_success "Service started successfully"
|
||||
else
|
||||
log_error "Failed to start service"
|
||||
log_info "Check logs with: journalctl -u monitoring-agent -f"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Check service status
|
||||
sleep 2
|
||||
if systemctl is-active --quiet monitoring-agent; then
|
||||
log_success "Service is running"
|
||||
else
|
||||
log_warning "Service may have issues, checking status..."
|
||||
systemctl status monitoring-agent --no-pager
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Test installation
|
||||
test_installation() {
|
||||
log_info "Testing installation..."
|
||||
|
||||
# Test health endpoint
|
||||
local health_port=${HEALTH_CHECK_PORT:-8081}
|
||||
log_info "Testing health endpoint at http://localhost:$health_port/health"
|
||||
|
||||
# Wait a moment for service to fully start
|
||||
sleep 3
|
||||
|
||||
if curl -s "http://localhost:$health_port/health" > /dev/null; then
|
||||
log_success "Health endpoint is responding"
|
||||
else
|
||||
log_warning "Health endpoint not responding yet (service may still be starting)"
|
||||
fi
|
||||
|
||||
# Show recent logs
|
||||
log_info "Recent service logs:"
|
||||
journalctl -u monitoring-agent --no-pager -n 5
|
||||
}
|
||||
|
||||
# Show post-installation information
|
||||
show_post_install_info() {
|
||||
echo
|
||||
echo "============================================="
|
||||
echo " Installation Complete!"
|
||||
echo "============================================="
|
||||
echo
|
||||
log_success "CheckCle Monitoring Agent installed and configured successfully"
|
||||
echo
|
||||
echo "System Information:"
|
||||
echo " Architecture: $ARCH ($PACKAGE_ARCH)"
|
||||
echo " Package: $PACKAGE_FILENAME"
|
||||
echo " Package Manager: $PACKAGE_MANAGER"
|
||||
if [[ "$PACKAGE_FORMAT" == "tar.gz" ]]; then
|
||||
echo " Installation Type: Manual (tar.gz)"
|
||||
else
|
||||
echo " Installation Type: Native package ($PACKAGE_FORMAT)"
|
||||
fi
|
||||
echo
|
||||
echo "Configuration: $CONFIG_FILE"
|
||||
echo "Service status: systemctl status monitoring-agent"
|
||||
echo "Service logs: journalctl -u monitoring-agent -f"
|
||||
echo "Health check: curl http://localhost:${HEALTH_CHECK_PORT:-8081}/health"
|
||||
echo
|
||||
echo "The monitoring agent is now running and will appear in your dashboard."
|
||||
echo
|
||||
}
|
||||
|
||||
# Clean up temporary files
|
||||
cleanup() {
|
||||
if [[ -n "$DOWNLOADED_PACKAGE" && -f "$DOWNLOADED_PACKAGE" ]]; then
|
||||
rm -f "$DOWNLOADED_PACKAGE"
|
||||
rm -rf "$(dirname "$DOWNLOADED_PACKAGE")"
|
||||
fi
|
||||
}
|
||||
|
||||
# Main installation function
|
||||
main() {
|
||||
echo "============================================="
|
||||
echo " CheckCle Server Monitoring Agent"
|
||||
echo " One-Click Installation"
|
||||
echo "============================================="
|
||||
echo
|
||||
|
||||
check_root
|
||||
validate_environment
|
||||
detect_system
|
||||
detect_system_info
|
||||
|
||||
log_info "Starting automated installation..."
|
||||
|
||||
# Set up cleanup trap
|
||||
trap cleanup EXIT
|
||||
|
||||
# Download and install package
|
||||
download_package
|
||||
install_package
|
||||
|
||||
# Configure and start service
|
||||
configure_agent
|
||||
|
||||
if start_service; then
|
||||
test_installation
|
||||
show_post_install_info
|
||||
else
|
||||
log_error "Service failed to start properly"
|
||||
log_info "Check configuration: sudo nano $CONFIG_FILE"
|
||||
log_info "Restart service: sudo systemctl restart monitoring-agent"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Handle script arguments
|
||||
case "${1:-}" in
|
||||
--help|-h)
|
||||
echo "CheckCle Server Monitoring Agent - One-Click Installer"
|
||||
echo
|
||||
echo "Usage: SERVER_TOKEN=your-token [OPTIONS] sudo bash $0"
|
||||
echo " or: sudo SERVER_TOKEN=your-token [OPTIONS] bash $0"
|
||||
echo " or: curl -L script-url | SERVER_TOKEN=your-token [OPTIONS] sudo bash"
|
||||
echo
|
||||
echo "System Requirements:"
|
||||
echo " - Linux with systemd"
|
||||
echo " - Supported architectures: x86_64 (amd64), aarch64/arm64"
|
||||
echo " - Supported distributions: Debian/Ubuntu (.deb), RHEL/CentOS/Fedora (.rpm), or any Linux (tar.gz fallback)"
|
||||
echo
|
||||
echo "Package Installation Logic:"
|
||||
echo " 1. Detects OS and tries native package format first (.deb for Debian-based, .rpm for RHEL-based)"
|
||||
echo " 2. If native package is not available, automatically falls back to tar.gz"
|
||||
echo " 3. tar.gz works on any Linux distribution with systemd"
|
||||
echo
|
||||
echo "Required Environment Variables:"
|
||||
echo " SERVER_TOKEN Server authentication token"
|
||||
echo
|
||||
echo "Optional Environment Variables:"
|
||||
echo " POCKETBASE_URL PocketBase URL (default: http://localhost:8090)"
|
||||
echo " SERVER_NAME Server name (default: hostname)"
|
||||
echo " AGENT_ID Agent identifier (default: monitoring-agent-hostname)"
|
||||
echo " HEALTH_CHECK_PORT Health check port (default: 8081)"
|
||||
echo
|
||||
echo "Examples:"
|
||||
echo " SERVER_TOKEN=abc123 sudo -E bash $0"
|
||||
echo " sudo SERVER_TOKEN=abc123 POCKETBASE_URL=https://pb.example.com bash $0"
|
||||
echo
|
||||
echo "Options:"
|
||||
echo " --help, -h Show this help message"
|
||||
echo " --uninstall Uninstall the monitoring agent"
|
||||
echo
|
||||
exit 0
|
||||
;;
|
||||
--uninstall)
|
||||
check_root
|
||||
log_info "Uninstalling monitoring agent..."
|
||||
systemctl stop monitoring-agent 2>/dev/null || true
|
||||
systemctl disable monitoring-agent 2>/dev/null || true
|
||||
|
||||
# Remove based on detected package manager
|
||||
if command -v dpkg >/dev/null 2>&1 && dpkg -l monitoring-agent >/dev/null 2>&1; then
|
||||
dpkg -r monitoring-agent 2>/dev/null || true
|
||||
log_success "DEB package removed"
|
||||
elif command -v rpm >/dev/null 2>&1 && rpm -q monitoring-agent >/dev/null 2>&1; then
|
||||
rpm -e monitoring-agent 2>/dev/null || true
|
||||
log_success "RPM package removed"
|
||||
else
|
||||
# Manual removal for tar.gz installations
|
||||
log_info "Performing manual cleanup for tar.gz installation..."
|
||||
rm -f /usr/bin/monitoring-agent 2>/dev/null || true
|
||||
rm -rf /etc/monitoring-agent 2>/dev/null || true
|
||||
rm -f /lib/systemd/system/monitoring-agent.service 2>/dev/null || true
|
||||
rm -f /usr/lib/systemd/system/monitoring-agent.service 2>/dev/null || true
|
||||
rm -f /etc/systemd/system/monitoring-agent.service 2>/dev/null || true
|
||||
userdel monitoring-agent 2>/dev/null || true
|
||||
groupdel monitoring-agent 2>/dev/null || true
|
||||
rm -rf /var/lib/monitoring-agent 2>/dev/null || true
|
||||
rm -rf /var/log/monitoring-agent 2>/dev/null || true
|
||||
log_success "Manual cleanup completed"
|
||||
fi
|
||||
|
||||
systemctl daemon-reload 2>/dev/null || true
|
||||
log_success "Monitoring agent uninstalled"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
main "$@"
|
||||
;;
|
||||
esac
|
||||
@@ -0,0 +1,361 @@
|
||||
|
||||
#!/bin/bash
|
||||
|
||||
# CheckCle Server Monitoring Agent - Docker One-Click Installation Script
|
||||
# This script provides fully automated Docker installation using environment variables
|
||||
|
||||
set -e
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Helper functions
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# Check if running as root
|
||||
check_root() {
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
log_error "This script must be run as root (use sudo)"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Check if Docker is installed
|
||||
check_docker() {
|
||||
if ! command -v docker >/dev/null 2>&1; then
|
||||
log_error "Docker is not installed"
|
||||
log_info "Please install Docker first:"
|
||||
log_info " Ubuntu/Debian: sudo apt-get update && sudo apt-get install docker.io"
|
||||
log_info " CentOS/RHEL: sudo yum install docker"
|
||||
log_info " Or visit: https://docs.docker.com/engine/install/"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if Docker daemon is running
|
||||
if ! docker info >/dev/null 2>&1; then
|
||||
log_error "Docker daemon is not running"
|
||||
log_info "Start Docker with: sudo systemctl start docker"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_success "Docker is installed and running"
|
||||
}
|
||||
|
||||
# Validate required environment variables
|
||||
validate_environment() {
|
||||
local missing_vars=()
|
||||
|
||||
# Check required variables
|
||||
[[ -z "$SERVER_TOKEN" ]] && missing_vars+=("SERVER_TOKEN")
|
||||
[[ -z "$POCKETBASE_URL" ]] && missing_vars+=("POCKETBASE_URL")
|
||||
[[ -z "$SERVER_NAME" ]] && missing_vars+=("SERVER_NAME")
|
||||
[[ -z "$AGENT_ID" ]] && missing_vars+=("AGENT_ID")
|
||||
|
||||
if [[ ${#missing_vars[@]} -ne 0 ]]; then
|
||||
log_error "Missing required environment variables: ${missing_vars[*]}"
|
||||
log_info ""
|
||||
log_info "Usage examples:"
|
||||
log_info " SERVER_TOKEN=your-token POCKETBASE_URL=http://host:8090 SERVER_NAME=server AGENT_ID=agent sudo -E bash $0"
|
||||
log_info " sudo SERVER_TOKEN=your-token POCKETBASE_URL=http://host:8090 SERVER_NAME=server AGENT_ID=agent bash $0"
|
||||
log_info ""
|
||||
log_info "Required variables:"
|
||||
log_info " SERVER_TOKEN Server authentication token"
|
||||
log_info " POCKETBASE_URL PocketBase URL (e.g., http://194.233.80.126:8090)"
|
||||
log_info " SERVER_NAME Server name (e.g., DB-Server01)"
|
||||
log_info " AGENT_ID Agent identifier (e.g., agent_hogr3np88u7dq5xf9balzl)"
|
||||
log_info ""
|
||||
log_info "Optional variables:"
|
||||
log_info " HEALTH_CHECK_PORT Health check port (default: 8081)"
|
||||
log_info " CONTAINER_NAME Container name (default: monitoring-agent)"
|
||||
log_info " DOCKER_IMAGE Docker image (default: operacle/checkcle-server-agent:latest)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_success "Environment validation passed"
|
||||
log_info "SERVER_TOKEN: ${SERVER_TOKEN:0:8}..."
|
||||
log_info "POCKETBASE_URL: $POCKETBASE_URL"
|
||||
log_info "SERVER_NAME: $SERVER_NAME"
|
||||
log_info "AGENT_ID: $AGENT_ID"
|
||||
}
|
||||
|
||||
# Set default values for optional variables
|
||||
set_defaults() {
|
||||
HEALTH_CHECK_PORT="${HEALTH_CHECK_PORT:-8081}"
|
||||
CONTAINER_NAME="${CONTAINER_NAME:-monitoring-agent}"
|
||||
DOCKER_IMAGE="${DOCKER_IMAGE:-operacle/checkcle-server-agent:latest}"
|
||||
POCKETBASE_ENABLED="${POCKETBASE_ENABLED:-true}"
|
||||
|
||||
log_info "Configuration:"
|
||||
log_info " Container name: $CONTAINER_NAME"
|
||||
log_info " Docker image: $DOCKER_IMAGE"
|
||||
log_info " Health check port: $HEALTH_CHECK_PORT"
|
||||
log_info " PocketBase enabled: $POCKETBASE_ENABLED"
|
||||
}
|
||||
|
||||
# Stop and remove existing container if it exists
|
||||
cleanup_existing_container() {
|
||||
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||
log_info "Stopping and removing existing container: $CONTAINER_NAME"
|
||||
docker stop "$CONTAINER_NAME" >/dev/null 2>&1 || true
|
||||
docker rm "$CONTAINER_NAME" >/dev/null 2>&1 || true
|
||||
log_success "Existing container removed"
|
||||
fi
|
||||
}
|
||||
|
||||
# Create Docker volumes
|
||||
create_volumes() {
|
||||
log_info "Creating Docker volumes..."
|
||||
|
||||
# Create volumes if they don't exist
|
||||
if ! docker volume ls --format '{{.Name}}' | grep -q "^monitoring_data$"; then
|
||||
docker volume create monitoring_data
|
||||
log_success "Created monitoring_data volume"
|
||||
else
|
||||
log_info "monitoring_data volume already exists"
|
||||
fi
|
||||
|
||||
if ! docker volume ls --format '{{.Name}}' | grep -q "^monitoring_logs$"; then
|
||||
docker volume create monitoring_logs
|
||||
log_success "Created monitoring_logs volume"
|
||||
else
|
||||
log_info "monitoring_logs volume already exists"
|
||||
fi
|
||||
}
|
||||
|
||||
# Get Docker group ID
|
||||
get_docker_group_id() {
|
||||
local docker_gid
|
||||
docker_gid=$(getent group docker | cut -d: -f3)
|
||||
if [[ -z "$docker_gid" ]]; then
|
||||
log_warning "Docker group not found, using default GID 999"
|
||||
docker_gid=999
|
||||
fi
|
||||
echo "$docker_gid"
|
||||
}
|
||||
|
||||
# Run the Docker container
|
||||
run_docker_container() {
|
||||
log_info "Starting monitoring agent Docker container..."
|
||||
|
||||
local docker_gid
|
||||
docker_gid=$(get_docker_group_id)
|
||||
|
||||
log_info "Docker group ID: $docker_gid"
|
||||
|
||||
# Run the Docker container with all the required parameters
|
||||
docker run -d \
|
||||
--name "$CONTAINER_NAME" \
|
||||
--restart unless-stopped \
|
||||
-p "$HEALTH_CHECK_PORT:8081" \
|
||||
--group-add "$docker_gid" \
|
||||
-e AGENT_ID="$AGENT_ID" \
|
||||
-e SERVER_NAME="$SERVER_NAME" \
|
||||
-e SERVER_TOKEN="$SERVER_TOKEN" \
|
||||
-e POCKETBASE_URL="$POCKETBASE_URL" \
|
||||
-e POCKETBASE_ENABLED="$POCKETBASE_ENABLED" \
|
||||
-v /proc:/host/proc:ro \
|
||||
-v /etc:/host/etc:ro \
|
||||
-v /sys:/host/sys:ro \
|
||||
-v /:/host/root:ro \
|
||||
-v /var/run:/host/var/run:ro \
|
||||
-v /dev:/host/dev:ro \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock:ro \
|
||||
-v monitoring_data:/var/lib/monitoring-agent \
|
||||
-v monitoring_logs:/var/log/monitoring-agent \
|
||||
"$DOCKER_IMAGE"
|
||||
|
||||
log_success "Docker container started successfully"
|
||||
}
|
||||
|
||||
# Wait for container to be ready
|
||||
wait_for_container() {
|
||||
log_info "Waiting for container to be ready..."
|
||||
|
||||
local max_attempts=30
|
||||
local attempt=0
|
||||
|
||||
while [[ $attempt -lt $max_attempts ]]; do
|
||||
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||
log_success "Container is running"
|
||||
return 0
|
||||
fi
|
||||
|
||||
sleep 1
|
||||
((attempt++))
|
||||
done
|
||||
|
||||
log_error "Container failed to start within expected time"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Test the installation
|
||||
test_installation() {
|
||||
log_info "Testing installation..."
|
||||
|
||||
# Check container status
|
||||
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||
log_error "Container is not running"
|
||||
log_info "Check container logs: docker logs $CONTAINER_NAME"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Wait a moment for the service to start
|
||||
sleep 3
|
||||
|
||||
# Test health endpoint
|
||||
log_info "Testing health endpoint at http://localhost:$HEALTH_CHECK_PORT/health"
|
||||
|
||||
if curl -s -f "http://localhost:$HEALTH_CHECK_PORT/health" >/dev/null 2>&1; then
|
||||
log_success "Health endpoint is responding"
|
||||
else
|
||||
log_warning "Health endpoint not responding yet (service may still be starting)"
|
||||
fi
|
||||
|
||||
# Show recent container logs
|
||||
log_info "Recent container logs:"
|
||||
docker logs --tail 10 "$CONTAINER_NAME"
|
||||
}
|
||||
|
||||
# Show post-installation information
|
||||
show_post_install_info() {
|
||||
echo
|
||||
echo "============================================="
|
||||
echo " Docker Installation Complete!"
|
||||
echo "============================================="
|
||||
echo
|
||||
log_success "CheckCle Monitoring Agent Docker container installed and running successfully"
|
||||
echo
|
||||
echo "Container Information:"
|
||||
echo " Container name: $CONTAINER_NAME"
|
||||
echo " Docker image: $DOCKER_IMAGE"
|
||||
echo " Health check port: $HEALTH_CHECK_PORT"
|
||||
echo " Agent ID: $AGENT_ID"
|
||||
echo " Server name: $SERVER_NAME"
|
||||
echo
|
||||
echo "Useful commands:"
|
||||
echo " Container status: docker ps -f name=$CONTAINER_NAME"
|
||||
echo " Container logs: docker logs -f $CONTAINER_NAME"
|
||||
echo " Stop container: docker stop $CONTAINER_NAME"
|
||||
echo " Start container: docker start $CONTAINER_NAME"
|
||||
echo " Remove container: docker rm -f $CONTAINER_NAME"
|
||||
echo " Health check: curl http://localhost:$HEALTH_CHECK_PORT/health"
|
||||
echo
|
||||
echo "The monitoring agent is now running in a Docker container and will appear in your dashboard."
|
||||
echo
|
||||
}
|
||||
|
||||
# Main installation function
|
||||
main() {
|
||||
echo "============================================="
|
||||
echo " CheckCle Server Monitoring Agent"
|
||||
echo " Docker One-Click Installation"
|
||||
echo "============================================="
|
||||
echo
|
||||
|
||||
check_root
|
||||
check_docker
|
||||
validate_environment
|
||||
set_defaults
|
||||
|
||||
log_info "Starting Docker container installation..."
|
||||
|
||||
# Setup and run container
|
||||
cleanup_existing_container
|
||||
create_volumes
|
||||
run_docker_container
|
||||
|
||||
if wait_for_container; then
|
||||
test_installation
|
||||
show_post_install_info
|
||||
else
|
||||
log_error "Container installation failed"
|
||||
log_info "Check container logs: docker logs $CONTAINER_NAME"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Handle script arguments
|
||||
case "${1:-}" in
|
||||
--help|-h)
|
||||
echo "CheckCle Server Monitoring Agent - Docker One-Click Installer"
|
||||
echo
|
||||
echo "Usage: SERVER_TOKEN=token POCKETBASE_URL=url SERVER_NAME=name AGENT_ID=id sudo bash $0"
|
||||
echo
|
||||
echo "System Requirements:"
|
||||
echo " - Docker installed and running"
|
||||
echo " - Root privileges (sudo)"
|
||||
echo " - Internet access to pull Docker image"
|
||||
echo
|
||||
echo "Required Environment Variables:"
|
||||
echo " SERVER_TOKEN Server authentication token"
|
||||
echo " POCKETBASE_URL PocketBase URL (e.g., http://194.233.80.126:8090)"
|
||||
echo " SERVER_NAME Server name (e.g., DB-Server01)"
|
||||
echo " AGENT_ID Agent identifier"
|
||||
echo
|
||||
echo "Optional Environment Variables:"
|
||||
echo " HEALTH_CHECK_PORT Health check port (default: 8081)"
|
||||
echo " CONTAINER_NAME Container name (default: monitoring-agent)"
|
||||
echo " DOCKER_IMAGE Docker image (default: operacle/checkcle-server-agent:latest)"
|
||||
echo " POCKETBASE_ENABLED Enable PocketBase (default: true)"
|
||||
echo
|
||||
echo "Examples:"
|
||||
echo " SERVER_TOKEN=abc123 POCKETBASE_URL=http://host:8090 SERVER_NAME=server AGENT_ID=agent sudo -E bash $0"
|
||||
echo " sudo SERVER_TOKEN=abc123 POCKETBASE_URL=http://host:8090 SERVER_NAME=server AGENT_ID=agent bash $0"
|
||||
echo
|
||||
echo "Options:"
|
||||
echo " --help, -h Show this help message"
|
||||
echo " --uninstall Remove the monitoring agent container"
|
||||
echo
|
||||
exit 0
|
||||
;;
|
||||
--uninstall)
|
||||
check_root
|
||||
check_docker
|
||||
set_defaults
|
||||
|
||||
log_info "Uninstalling monitoring agent Docker container..."
|
||||
|
||||
# Stop and remove container
|
||||
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||
docker stop "$CONTAINER_NAME" >/dev/null 2>&1 || true
|
||||
docker rm "$CONTAINER_NAME" >/dev/null 2>&1 || true
|
||||
log_success "Container removed"
|
||||
else
|
||||
log_info "Container not found"
|
||||
fi
|
||||
|
||||
# Optionally remove volumes (ask user)
|
||||
echo -n "Remove data volumes? (y/N): "
|
||||
read -r response
|
||||
if [[ "$response" =~ ^[Yy]$ ]]; then
|
||||
docker volume rm monitoring_data monitoring_logs >/dev/null 2>&1 || true
|
||||
log_success "Data volumes removed"
|
||||
else
|
||||
log_info "Data volumes preserved"
|
||||
fi
|
||||
|
||||
log_success "Monitoring agent Docker container uninstalled"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
main "$@"
|
||||
;;
|
||||
esac
|
||||
@@ -0,0 +1,62 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
DATA_DIR="/opt/pb_data"
|
||||
PORT=8090
|
||||
COMPOSE_FILE="/opt/docker-compose.yml"
|
||||
RAW_URL="https://raw.githubusercontent.com/operacle/checkcle/main/docker-compose.yml"
|
||||
|
||||
echo "🚀 Installing Checkcle using Docker Compose"
|
||||
|
||||
# Step 1: Check if port is already in use
|
||||
if lsof -i :"$PORT" &>/dev/null; then
|
||||
echo "❗ ERROR: Port $PORT is already in use. Please free the port or change the Docker Compose configuration."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Step 2: Ensure Docker is installed
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo "🔧 Docker not found. Installing Docker..."
|
||||
curl -fsSL https://get.docker.com | sh
|
||||
fi
|
||||
|
||||
# Step 3: Ensure Docker Compose v2 is available
|
||||
if ! docker compose version &> /dev/null; then
|
||||
echo "❗ Docker Compose v2 not found. Please install Docker Compose v2 and rerun this script."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Step 4: Download docker-compose.yml if not exists
|
||||
if [ ! -f "$COMPOSE_FILE" ]; then
|
||||
echo "📥 Downloading docker-compose.yml to $COMPOSE_FILE..."
|
||||
curl -fsSL "$RAW_URL" -o "$COMPOSE_FILE"
|
||||
else
|
||||
echo "✅ docker-compose.yml already exists at $COMPOSE_FILE"
|
||||
fi
|
||||
|
||||
# Step 5: Create data volume directory if it doesn’t exist
|
||||
if [ ! -d "$DATA_DIR" ]; then
|
||||
echo "📁 Creating data volume directory at $DATA_DIR"
|
||||
sudo mkdir -p "$DATA_DIR"
|
||||
sudo chown "$(whoami)":"$(whoami)" "$DATA_DIR"
|
||||
fi
|
||||
|
||||
# Step 6: Start the service
|
||||
cd /opt
|
||||
echo "📦 Starting Checkcle service with Docker Compose..."
|
||||
docker compose -f "$COMPOSE_FILE" up -d
|
||||
|
||||
# Step 7: Detect host IP address
|
||||
HOST_IP=$(hostname -I | awk '{print $1}')
|
||||
|
||||
# Step 8: Show success output
|
||||
echo ""
|
||||
echo "✅ Checkcle has been successfully installed and started."
|
||||
echo ""
|
||||
echo "🛠️ Admin Web Management"
|
||||
echo "🔗 Default URL: http://$HOST_IP:$PORT"
|
||||
echo "👤 User: admin@example.com"
|
||||
echo "🔑 Passwd: Admin123456"
|
||||
echo ""
|
||||
echo "📌 Make sure port $PORT is accessible from your host system or cloud firewall."
|
||||
Reference in New Issue
Block a user