#!/bin/sh # Agentic Core — установка одной командой (Horizon Labs, hrzn.uz) # # curl -fsSL https://download.agntc.pro/install.sh | sh # # Полная установка на чистый Linux-сервер (бинарь + PostgreSQL/Redis в Docker # + systemd-сервис + сгенерированные секреты): # # curl -fsSL https://download.agntc.pro/install.sh | AGNTC_WITH_DEPS=1 sh # # Переменные: # AGNTC_VERSION=1.0.0 конкретная версия (по умолчанию latest) # AGNTC_BIN_DIR=... куда ставить бинарь (по умолчанию /usr/local/bin, без прав — ~/.local/bin) # AGNTC_WITH_DEPS=1 поднять зависимости в Docker и создать systemd-сервис # AGNTC_DIR=... рабочий каталог установки (по умолчанию /opt/agentic, без прав — ~/agentic) # AGNTC_PG_PORT=5432, AGNTC_REDIS_PORT=6379, AGNTC_PUBLIC_PORT=8080, AGNTC_ADMIN_PORT=8081 set -eu BASE="https://download.agntc.pro" VERSION="${AGNTC_VERSION:-$(curl -fsSL "$BASE/releases/VERSION")}" OS="$(uname -s)" ARCH="$(uname -m)" case "$OS" in Linux) os=linux ;; Darwin) os=darwin ;; *) echo "ошибка: неподдерживаемая ОС: $OS (поддерживаются Linux и macOS)" >&2; exit 1 ;; esac case "$ARCH" in x86_64|amd64) arch=x86_64 ;; aarch64|arm64) arch=arm64 ;; *) echo "ошибка: неподдерживаемая архитектура: $ARCH" >&2; exit 1 ;; esac TARGET="$os-$arch" if [ "$TARGET" = "darwin-x86_64" ]; then echo "ошибка: для macOS доступна только сборка arm64 (Apple Silicon)" >&2; exit 1 fi ARTIFACT="agentic-core-$VERSION-$TARGET.tar.gz" URL="$BASE/releases/$VERSION/$ARTIFACT" # Каталог установки: /usr/local/bin при наличии прав, иначе ~/.local/bin BIN_DIR="${AGNTC_BIN_DIR:-}" if [ -z "$BIN_DIR" ]; then if [ -w /usr/local/bin ] || [ "$(id -u)" = "0" ]; then BIN_DIR=/usr/local/bin else BIN_DIR="$HOME/.local/bin" fi fi mkdir -p "$BIN_DIR" TMP="$(mktemp -d)" trap 'rm -rf "$TMP"' EXIT echo "Agentic Core $VERSION ($TARGET)" echo "загрузка: $URL" curl -fsSL -o "$TMP/$ARTIFACT" "$URL" # Проверка контрольной суммы curl -fsSL -o "$TMP/checksums.txt" "$BASE/releases/$VERSION/checksums.txt" EXPECTED="$(grep " $ARTIFACT\$" "$TMP/checksums.txt" | cut -d' ' -f1)" if command -v sha256sum >/dev/null 2>&1; then ACTUAL="$(sha256sum "$TMP/$ARTIFACT" | cut -d' ' -f1)" else ACTUAL="$(shasum -a 256 "$TMP/$ARTIFACT" | cut -d' ' -f1)" fi if [ "$EXPECTED" != "$ACTUAL" ]; then echo "ошибка: контрольная сумма не совпала" >&2 exit 1 fi tar -xzf "$TMP/$ARTIFACT" -C "$TMP" install -m 755 "$TMP/agentic-core" "$BIN_DIR/agentic-core" echo echo "установлено: $BIN_DIR/agentic-core" "$BIN_DIR/agentic-core" --version case ":$PATH:" in *":$BIN_DIR:"*) ;; *) echo "внимание: $BIN_DIR не в PATH — добавьте: export PATH=\"$BIN_DIR:\$PATH\"" ;; esac # ===== Полная установка: зависимости + сервис (AGNTC_WITH_DEPS=1) ===== rand_hex() { openssl rand -hex "$1" 2>/dev/null || head -c "$1" /dev/urandom | od -An -tx1 | tr -d ' \n' } if [ "${AGNTC_WITH_DEPS:-0}" = "1" ]; then if [ "$os" != "linux" ]; then echo "ошибка: AGNTC_WITH_DEPS поддерживается только на Linux" >&2; exit 1 fi SUDO="" [ "$(id -u)" != "0" ] && command -v sudo >/dev/null 2>&1 && SUDO="sudo" # Docker if ! command -v docker >/dev/null 2>&1; then echo echo "Docker не найден — устанавливаю (get.docker.com)…" curl -fsSL https://get.docker.com | $SUDO sh fi WORK_DIR="${AGNTC_DIR:-}" if [ -z "$WORK_DIR" ]; then if [ -w /opt ] || [ "$(id -u)" = "0" ] || [ -n "$SUDO" ]; then WORK_DIR=/opt/agentic; else WORK_DIR="$HOME/agentic"; fi fi $SUDO mkdir -p "$WORK_DIR" $SUDO chown "$(id -u):$(id -g)" "$WORK_DIR" 2>/dev/null || true PG_PORT="${AGNTC_PG_PORT:-5432}" REDIS_PORT="${AGNTC_REDIS_PORT:-6379}" PUBLIC_PORT="${AGNTC_PUBLIC_PORT:-8080}" ADMIN_PORT="${AGNTC_ADMIN_PORT:-8081}" # .env с секретами — создаётся один раз, повторный запуск не перетирает if [ ! -f "$WORK_DIR/.env" ]; then PG_PASSWORD="$(rand_hex 16)" cat > "$WORK_DIR/.env" < "$WORK_DIR/docker-compose.yml" <&2 exit 1 } # systemd-сервис if command -v systemctl >/dev/null 2>&1 && [ -n "$SUDO$([ "$(id -u)" = "0" ] && echo root)" ]; then $SUDO tee /etc/systemd/system/agentic-core.service > /dev/null </dev/null 2>&1; do i=$((i+1)); [ $i -gt 40 ] && break; sleep 1 done if curl -sf "http://127.0.0.1:$ADMIN_PORT/health" >/dev/null 2>&1; then echo echo "Agentic Core запущен (systemd: agentic-core.service)." echo " Dash: http://<этот сервер>:$ADMIN_PORT (откройте и пройдите мастер)" echo " Публичный API: http://<этот сервер>:$PUBLIC_PORT" echo " Конфигурация: $WORK_DIR/.env" echo echo "ВАЖНО: admin-порт $ADMIN_PORT держите за firewall или VPN — на нём весь meta-API." else echo "ядро не ответило на :$ADMIN_PORT — смотрите: journalctl -u agentic-core -n 50" >&2 exit 1 fi else echo echo "systemd недоступен — запустите вручную:" echo " cd $WORK_DIR && set -a && . ./.env && set +a && agentic-core serve" fi else echo echo "Дальше:" echo " 1. PostgreSQL 16 (+pgvector) и Redis: задайте DATABASE_URL и REDIS_URL" echo " (или перезапустите установку с AGNTC_WITH_DEPS=1 — поднимет всё в Docker)" echo " 2. agentic-core setup # диагностика, миграции, базовые данные" echo " 3. agentic-core serve # Dash: http://сервер:8081, API: :8080" fi echo echo "Документация: https://github.com/aliexz011/agentic-core (docs/QUICKSTART.md)"