#!/usr/bin/env bash # # MAESTRO 初回セットアップスクリプト # # 新しい環境でゼロから動かすための対話式セットアップ。 # クローン済みのディレクトリで実行する: # # git clone https://gitea.example.com/your-org/maestro.git maestro # cd maestro # ./scripts/setup.sh # set -euo pipefail PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" cd "$PROJECT_DIR" echo "==========================================" echo " MAESTRO セットアップ" echo "==========================================" echo "" # ------------------------------------------------------- # Step 1: 依存関係チェック # ------------------------------------------------------- echo "[1/5] 前提条件チェック..." MISSING=() command -v node >/dev/null 2>&1 || MISSING+=("node") command -v npm >/dev/null 2>&1 || MISSING+=("npm") command -v curl >/dev/null 2>&1 || MISSING+=("curl") if [ ${#MISSING[@]} -gt 0 ]; then echo " ERROR: 以下がインストールされていません: ${MISSING[*]}" exit 1 fi NODE_VER=$(node -v | sed 's/v//' | cut -d. -f1) if [ "$NODE_VER" -lt 20 ]; then echo " ERROR: Node.js 20+ が必要です(現在: $(node -v))" exit 1 fi echo " Node.js $(node -v) ... OK" echo "" # ------------------------------------------------------- # Step 2: npm install & build # ------------------------------------------------------- echo "[2/5] 依存パッケージのインストール & ビルド..." ./scripts/build-all.sh | tail -5 echo " ビルド完了" echo "" # Playwright ブラウザのインストール(WebSearch に必要) echo " Playwright ブラウザをインストール中..." if npx playwright install chromium 2>/dev/null; then echo " Playwright chromium インストール完了" else echo " WARN: Playwright のインストールに失敗しました。WebSearch は SearXNG フォールバックで動作します。" echo " 後から 'npx playwright install chromium' で手動インストールできます。" fi echo "" # ------------------------------------------------------- # Step 3: config.yaml 生成 # ------------------------------------------------------- echo "[3/5] 設定ファイル (config.yaml) の作成..." DEFAULT_OLLAMA_URL="http://localhost:11434/v1" DEFAULT_MODEL_NAME="qwen3:8b" DEFAULT_ALLOWED_USER="*" DEFAULT_MODE="local" if [ -f "config.yaml" ]; then EXISTING_MODE=$(grep -E '^\s*integration_mode:' config.yaml | head -1 | sed 's/.*integration_mode:\s*//' | tr -d '"' | tr -d "'" || true) EXISTING_OLLAMA_URL=$(grep -E '^\s*base_url:' config.yaml | head -1 | sed 's/.*base_url:\s*//' | tr -d '"' | tr -d "'" || true) EXISTING_MODEL_NAME=$(grep -E '^\s*model:' config.yaml | head -1 | sed 's/.*model:\s*//' | tr -d '"' | tr -d "'" || true) EXISTING_ALLOWED_USER=$(grep -E '^\s*allowed_users:' config.yaml | head -1 | sed 's/.*\["\?//' | sed 's/"\?\].*//' || true) [ -n "${EXISTING_MODE}" ] && DEFAULT_MODE="${EXISTING_MODE}" [ -n "${EXISTING_OLLAMA_URL}" ] && DEFAULT_OLLAMA_URL="${EXISTING_OLLAMA_URL}" [ -n "${EXISTING_MODEL_NAME}" ] && DEFAULT_MODEL_NAME="${EXISTING_MODEL_NAME}" [ -n "${EXISTING_ALLOWED_USER}" ] && DEFAULT_ALLOWED_USER="${EXISTING_ALLOWED_USER}" fi echo "" read -rp " 起動モード (local / hybrid / gitea) [${DEFAULT_MODE}]: " INTEGRATION_MODE read -rp " Ollama の URL (例: http://gpu-server:11434/v1) [${DEFAULT_OLLAMA_URL}]: " OLLAMA_URL read -rp " 使用する LLM モデル名 (例: qwen3:8b) [${DEFAULT_MODEL_NAME}]: " MODEL_NAME read -rp " Local/Gitea で受け付けるユーザー名 [${DEFAULT_ALLOWED_USER}]: " ALLOWED_USER INTEGRATION_MODE="${INTEGRATION_MODE:-$DEFAULT_MODE}" OLLAMA_URL="${OLLAMA_URL:-$DEFAULT_OLLAMA_URL}" MODEL_NAME="${MODEL_NAME:-$DEFAULT_MODEL_NAME}" ALLOWED_USER="${ALLOWED_USER:-$DEFAULT_ALLOWED_USER}" GITEA_URL="" if [ "$INTEGRATION_MODE" = "hybrid" ] || [ "$INTEGRATION_MODE" = "gitea" ]; then EXISTING_GITEA_URL=$(grep -E '^\s*url:' config.yaml 2>/dev/null | head -1 | sed 's/.*url:\s*//' | tr -d '"' | tr -d "'" || true) DEFAULT_GITEA_URL="${EXISTING_GITEA_URL:-https://your-gitea.example.com}" read -rp " Gitea の URL (例: https://gitea.example.com) [${DEFAULT_GITEA_URL}]: " GITEA_URL GITEA_URL="${GITEA_URL:-$DEFAULT_GITEA_URL}" fi if [ -f "config.yaml" ]; then cp config.yaml config.yaml.bak echo " 既存の config.yaml を config.yaml.bak にバックアップしました" fi if [ ! -f "config.yaml.example" ]; then echo " ERROR: config.yaml.example が見つかりません" exit 1 fi cp config.yaml.example config.yaml sed -i "s|^\(\s*integration_mode:\s*\).*|\1${INTEGRATION_MODE}|" config.yaml sed -i "s|^\(\s*model:\s*\).*|\1${MODEL_NAME}|" config.yaml sed -i "s|^\(\s*base_url:\s*\).*|\1${OLLAMA_URL}|" config.yaml sed -i "s|^\(allowed_users:\s*\).*|\1[\"${ALLOWED_USER}\"]|" config.yaml if [ -n "${GITEA_URL}" ]; then python3 - <> config.yaml <&1) || true if echo "$RESPONSE" | python3 -c "import sys,json; print(' Webhook ID:', json.load(sys.stdin)['id'])" 2>/dev/null; then echo " 登録完了" else echo " WARN: Webhook の登録に失敗しました。手動で設定してください。" echo " エラー: ${RESPONSE}" fi else echo " スキップ。後から ./scripts/setup-repo.sh で追加できます。" fi echo "" echo "==========================================" echo " セットアップ完了!" echo "==========================================" echo "" echo "起動コマンド:" echo "" if [ "$INTEGRATION_MODE" = "hybrid" ] || [ "$INTEGRATION_MODE" = "gitea" ]; then echo " export GITEA_API_TOKEN=\"${GITEA_API_TOKEN}\"" echo " export GITEA_WEBHOOK_SECRET=\"${GITEA_WEBHOOK_SECRET}\"" fi echo " npm start" echo "" echo "管理ダッシュボード: http://localhost:9876/ui/" echo "" if [ "$INTEGRATION_MODE" != "local" ]; then echo "追加リポジトリの監視:" echo " ./scripts/setup-repo.sh owner/repo http://this-machine:9876" fi echo ""