#!/usr/bin/env bash # GoClaw Control Center — однострочная установка # Использование: curl -fsSL https://git.softuniq.eu/UniqAI/GoClaw/raw/branch/main/install.sh | bash set -euo pipefail REPO_URL="https://git.softuniq.eu/UniqAI/GoClaw.git" INSTALL_DIR="${GOCLAW_DIR:-$HOME/goclaw}" COMPOSE_FILE="docker/docker-stack.yml" # Цвета RED='\033[0;31m' GREEN='\033[0;32m' CYAN='\033[0;36m' YELLOW='\033[1;33m' NC='\033[0m' banner() { echo -e "${CYAN}" echo " ██████╗ ██████╗ ██████╗██╗ █████╗ ██╗ ██╗" echo " ██╔════╝ ██╔═══██╗██╔════╝██║ ██╔══██╗██║ ██║" echo " ██║ ███╗██║ ██║██║ ██║ ███████║██║ █╗ ██║" echo " ██║ ██║██║ ██║██║ ██║ ██╔══██║██║███╗██║" echo " ╚██████╔╝╚██████╔╝╚██████╗███████╗██║ ██║╚███╔███╔╝" echo " ╚═════╝ ╚═════╝ ╚═════╝╚══════╝╚═╝ ╚═╝ ╚══╝╚══╝ " echo -e "${NC}" echo -e "${CYAN} GoClaw Control Center — AI Agent Orchestration Platform${NC}" echo -e "${CYAN} https://git.softuniq.eu/UniqAI/GoClaw${NC}" echo "" } info() { echo -e "${CYAN}[INFO]${NC} $*"; } success() { echo -e "${GREEN}[OK]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } error() { echo -e "${RED}[ERROR]${NC} $*"; exit 1; } check_deps() { info "Проверка зависимостей..." for cmd in git docker; do if ! command -v "$cmd" &>/dev/null; then error "Не найден '$cmd'. Установите его и повторите." fi done # Проверяем docker compose (v2) или docker-compose (v1) if docker compose version &>/dev/null 2>&1; then COMPOSE_CMD="docker compose" elif command -v docker-compose &>/dev/null; then COMPOSE_CMD="docker-compose" else error "Не найден 'docker compose' или 'docker-compose'. Установите Docker Compose." fi success "Все зависимости найдены (compose: $COMPOSE_CMD)" } clone_or_update() { if [ -d "$INSTALL_DIR/.git" ]; then info "Обновление существующей установки в $INSTALL_DIR..." git -C "$INSTALL_DIR" pull --ff-only success "Репозиторий обновлён" else info "Клонирование репозитория в $INSTALL_DIR..." git clone "$REPO_URL" "$INSTALL_DIR" success "Репозиторий клонирован" fi } setup_env() { local env_file="$INSTALL_DIR/.env" if [ ! -f "$env_file" ]; then info "Создание .env из шаблона..." cp "$INSTALL_DIR/.env.example" "$env_file" # Генерация случайного JWT_SECRET local jwt_secret jwt_secret=$(openssl rand -hex 32 2>/dev/null || cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 64) sed -i "s|JWT_SECRET=.*|JWT_SECRET=${jwt_secret}|" "$env_file" warn "Файл .env создан. Укажите OLLAMA_API_KEY:" warn " nano $env_file" echo "" read -rp " Введите OLLAMA_API_KEY (или Enter для пропуска): " api_key if [ -n "$api_key" ]; then sed -i "s|OLLAMA_API_KEY=.*|OLLAMA_API_KEY=${api_key}|" "$env_file" success "OLLAMA_API_KEY сохранён" else warn "OLLAMA_API_KEY не задан — чат и список моделей будут недоступны" fi else success ".env уже существует, пропускаем" fi } start_services() { info "Запуск GoClaw Control Center..." cd "$INSTALL_DIR" # Проверяем наличие docker-compose.yml (для простого запуска без Swarm) if [ -f "docker-compose.yml" ]; then $COMPOSE_CMD up -d elif [ -f "$COMPOSE_FILE" ]; then # Swarm mode if ! docker info 2>/dev/null | grep -q "Swarm: active"; then info "Инициализация Docker Swarm..." docker swarm init --advertise-addr "$(hostname -I | awk '{print $1}')" 2>/dev/null || true fi docker stack deploy -c "$COMPOSE_FILE" goclaw else error "Не найден docker-compose.yml или $COMPOSE_FILE" fi } print_success() { echo "" echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${GREEN} GoClaw Control Center успешно запущен!${NC}" echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo "" local ip ip=$(hostname -I 2>/dev/null | awk '{print $1}' || echo "localhost") echo -e " ${CYAN}Web UI:${NC} http://${ip}:3000" echo -e " ${CYAN}Gateway API:${NC} http://${ip}:18789" echo -e " ${CYAN}Конфиг:${NC} $INSTALL_DIR/.env" echo "" echo -e " Управление:" echo -e " ${YELLOW}Остановить:${NC} cd $INSTALL_DIR && docker compose down" echo -e " ${YELLOW}Логи:${NC} cd $INSTALL_DIR && docker compose logs -f" echo -e " ${YELLOW}Обновить:${NC} cd $INSTALL_DIR && git pull && docker compose up -d --build" echo "" } main() { banner check_deps clone_or_update setup_env start_services print_success } main "$@"