#!/bin/bash #========================================================================== # PyGuardian Docker Installation Script # Supports containerized deployment for Controller and Agent modes # Author: SmartSolTech Team # Version: 2.0 #========================================================================== set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' NC='\033[0m' # Global variables INSTALL_MODE="" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" DOCKER_COMPOSE_VERSION="2.20.0" # Configuration variables TELEGRAM_BOT_TOKEN="" ADMIN_ID="" CONTROLLER_URL="" AGENT_TOKEN="" CONTROLLER_PORT="8080" #========================================================================== # Helper functions #========================================================================== print_header() { echo -e "${BLUE}" echo "==============================================" echo " PyGuardian Docker $1 Installation" echo "==============================================" echo -e "${NC}" } print_success() { echo -e "${GREEN}✓ $1${NC}" } print_error() { echo -e "${RED}✗ $1${NC}" } print_info() { echo -e "${BLUE}ℹ $1${NC}" } # Check if running as root check_root() { if [[ $EUID -ne 0 ]]; then print_error "This script must be run as root or with sudo" exit 1 fi } # Parse command line arguments parse_args() { while [[ $# -gt 0 ]]; do case $1 in --mode=*) INSTALL_MODE="${1#*=}" shift ;; --controller-url=*) CONTROLLER_URL="${1#*=}" shift ;; --agent-token=*) AGENT_TOKEN="${1#*=}" shift ;; --telegram-token=*) TELEGRAM_BOT_TOKEN="${1#*=}" shift ;; --admin-id=*) ADMIN_ID="${1#*=}" shift ;; --port=*) CONTROLLER_PORT="${1#*=}" shift ;; -h|--help) show_usage exit 0 ;; *) print_error "Unknown option: $1" show_usage exit 1 ;; esac done } show_usage() { echo "Usage: $0 [OPTIONS]" echo "" echo "OPTIONS:" echo " --mode=MODE Installation mode: controller, agent" echo " --controller-url=URL Controller URL (for agent mode)" echo " --agent-token=TOKEN Agent authentication token" echo " --telegram-token=TOKEN Telegram bot token" echo " --admin-id=ID Telegram admin ID" echo " --port=PORT Controller port (default: 8080)" echo " -h, --help Show this help" } # Select installation mode select_install_mode() { print_info "Выберите режим Docker установки:" echo "" echo "1) Controller - Центральный контроллер кластера в Docker" echo "2) Agent - Агент в Docker для подключения к контроллеру" echo "" while true; do read -p "Выберите режим (1-2): " choice case $choice in 1) INSTALL_MODE="controller" break ;; 2) INSTALL_MODE="agent" break ;; *) print_error "Неверный выбор. Введите 1 или 2." ;; esac done } # Check Docker requirements check_docker_requirements() { print_info "Проверка Docker требований..." # Check if Docker is installed if ! command -v docker &> /dev/null; then print_info "Docker не установлен. Устанавливаем Docker..." install_docker else print_success "Docker уже установлен: $(docker --version)" fi # Check if Docker Compose is installed if ! command -v docker-compose &> /dev/null; then print_info "Docker Compose не установлен. Устанавливаем..." install_docker_compose else print_success "Docker Compose уже установлен: $(docker-compose --version)" fi # Start Docker service systemctl start docker systemctl enable docker print_success "Docker service started and enabled" } # Install Docker install_docker() { print_info "Установка Docker..." # Install prerequisites if command -v apt-get &> /dev/null; then apt-get update apt-get install -y ca-certificates curl gnupg # Add Docker's official GPG key install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg chmod a+r /etc/apt/keyrings/docker.gpg # Add repository echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null apt-get update apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin elif command -v yum &> /dev/null; then yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin else print_error "Unsupported package manager for Docker installation" exit 1 fi print_success "Docker installed successfully" } # Install Docker Compose install_docker_compose() { print_info "Установка Docker Compose..." curl -L "https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose print_success "Docker Compose installed successfully" } # Get configuration for controller get_controller_config() { if [[ -z "$TELEGRAM_BOT_TOKEN" ]]; then echo "" print_info "Настройка Telegram бота для контроллера:" echo "1. Создайте бота у @BotFather" echo "2. Получите токен бота" echo "3. Узнайте ваш chat ID у @userinfobot" echo "" read -p "Введите токен Telegram бота: " TELEGRAM_BOT_TOKEN fi if [[ -z "$ADMIN_ID" ]]; then read -p "Введите ваш Telegram ID (admin): " ADMIN_ID fi read -p "Порт для API контроллера (по умолчанию $CONTROLLER_PORT): " input_port CONTROLLER_PORT=${input_port:-$CONTROLLER_PORT} } # Get configuration for agent get_agent_config() { if [[ -z "$CONTROLLER_URL" ]]; then read -p "URL контроллера (например, https://controller.example.com:8080): " CONTROLLER_URL fi if [[ -z "$AGENT_TOKEN" ]]; then read -p "Токен агента (получите у администратора контроллера): " AGENT_TOKEN fi read -p "Имя агента (по умолчанию: $(hostname)): " AGENT_NAME AGENT_NAME=${AGENT_NAME:-$(hostname)} } # Create Dockerfile for controller create_controller_dockerfile() { print_info "Создание Dockerfile для контроллера..." mkdir -p controller cat > controller/Dockerfile < agent/Dockerfile < controller-config.yaml < agent-config.yaml < docker-compose.yml < docker-compose.yml <