141 lines
5.6 KiB
Bash
141 lines
5.6 KiB
Bash
#!/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 "$@"
|