#!/bin/bash # ============================================================================== # 🦞 Freelaw Dev Setup β€” Bootstrap para PC novo # Uso: curl -fsSL https://setup.freelaw.ai | bash # ============================================================================== set -e GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' PURPLE='\033[0;35m' CYAN='\033[0;36m' BOLD='\033[1m' DIM='\033[2m' NC='\033[0m' SERVER1="65.21.116.37" # AX42 - 64GB SERVER2="37.27.59.167" # AX102 - 128GB HEALTH_PORT=9999 echo "" echo -e "${PURPLE}═══════════════════════════════════════════════════${NC}" echo -e "${PURPLE} 🦞 Freelaw Dev Environment β€” Setup${NC}" echo -e "${PURPLE}═══════════════════════════════════════════════════${NC}" echo "" echo -e " Este script configura seu computador para acessar" echo -e " os servidores de desenvolvimento da Freelaw." echo "" echo -e " ${BOLD}Servidores:${NC}" echo -e " AX42 β€” 64GB RAM, 16 cores (${SERVER1})" echo -e " AX102 β€” 128GB RAM, 32 cores (${SERVER2})" echo "" # ─── 0. Detectar OS ───────────────────────────────────── OS="$(uname -s)" case "$OS" in Linux*) PLATFORM=linux ;; Darwin*) PLATFORM=mac ;; MINGW*|MSYS*|CYGWIN*) PLATFORM=windows ;; *) echo -e "${RED}OS nΓ£o suportado: $OS${NC}"; exit 1 ;; esac echo -e "${DIM} Detectado: $PLATFORM ($OS)${NC}" echo "" # ─── 1. SSH Key ────────────────────────────────────────── echo -e "${BOLD}[1/5] SSH Key${NC}" SSH_DIR="$HOME/.ssh" SSH_KEY="$SSH_DIR/id_ed25519_freelaw" mkdir -p "$SSH_DIR" && chmod 700 "$SSH_DIR" if [ -f "$SSH_KEY" ]; then echo -e " ${GREEN}βœ“${NC} Key jΓ‘ existe: $SSH_KEY" else echo -e " Gerando SSH key..." read -p " Seu email Freelaw (ex: nome@freelaw.ai): " EMAIL [ -z "$EMAIL" ] && EMAIL="dev@freelaw.ai" ssh-keygen -t ed25519 -C "$EMAIL" -f "$SSH_KEY" -N "" -q chmod 600 "$SSH_KEY" echo -e " ${GREEN}βœ“${NC} Key gerada: $SSH_KEY" fi echo "" echo -e " ${YELLOW}╔══════════════════════════════════════════════════════╗${NC}" echo -e " ${YELLOW}β•‘ SUA CHAVE PÚBLICA (envie para o time de infra): β•‘${NC}" echo -e " ${YELLOW}β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•${NC}" echo "" echo -e " ${CYAN}$(cat "${SSH_KEY}.pub")${NC}" echo "" # Copy to clipboard if possible if command -v pbcopy &>/dev/null; then cat "${SSH_KEY}.pub" | pbcopy echo -e " ${GREEN}βœ“${NC} Copiada para o clipboard (Mac)" elif command -v xclip &>/dev/null; then cat "${SSH_KEY}.pub" | xclip -selection clipboard echo -e " ${GREEN}βœ“${NC} Copiada para o clipboard (Linux)" elif command -v clip.exe &>/dev/null; then cat "${SSH_KEY}.pub" | clip.exe echo -e " ${GREEN}βœ“${NC} Copiada para o clipboard (WSL)" fi echo "" echo -e " ${BOLD}PrΓ³ximo passo:${NC} Envie essa chave no ${PURPLE}#flw-infra${NC} do Discord" echo -e " e aguarde confirmaΓ§Γ£o de que foi adicionada." echo "" read -p " Sua chave jΓ‘ foi adicionada ao servidor? (s/N) " KEY_ADDED if [[ ! "$KEY_ADDED" =~ ^[sS]$ ]]; then echo -e " ${YELLOW}Envie a chave e rode este script novamente depois.${NC}" echo -e " ${DIM}Ou rode: bash <(curl -fsSL https://setup.freelaw.ai)${NC}" exit 0 fi # ─── 2. Username ───────────────────────────────────────── echo "" echo -e "${BOLD}[2/5] Seu usuΓ‘rio no servidor${NC}" echo -e " ${DIM}(formato: nome-freelaw, ex: guilherme-freelaw)${NC}" read -p " Username: " USERNAME [ -z "$USERNAME" ] && { echo -e "${RED}Username obrigatΓ³rio${NC}"; exit 1; } # ─── 3. SSH Config ─────────────────────────────────────── echo "" echo -e "${BOLD}[3/5] SSH Config${NC}" SSH_CONFIG="$SSH_DIR/config" # Backup existing config [ -f "$SSH_CONFIG" ] && cp "$SSH_CONFIG" "$SSH_CONFIG.bak.$(date +%s)" # Remove existing freelaw entries if [ -f "$SSH_CONFIG" ]; then # Remove old freelaw-dev block sed -i.tmp '/^Host freelaw-dev$/,/^Host /{ /^Host freelaw-dev$/d; /^Host /!d; }' "$SSH_CONFIG" 2>/dev/null || \ sed -i '' '/^Host freelaw-dev$/,/^Host /{ /^Host freelaw-dev$/d; /^Host /!d; }' "$SSH_CONFIG" 2>/dev/null || true sed -i.tmp '/^Host freelaw-1$/,/^Host /{ /^Host freelaw-1$/d; /^Host /!d; }' "$SSH_CONFIG" 2>/dev/null || \ sed -i '' '/^Host freelaw-1$/,/^Host /{ /^Host freelaw-1$/d; /^Host /!d; }' "$SSH_CONFIG" 2>/dev/null || true sed -i.tmp '/^Host freelaw-2$/,/^Host /{ /^Host freelaw-2$/d; /^Host /!d; }' "$SSH_CONFIG" 2>/dev/null || \ sed -i '' '/^Host freelaw-2$/,/^Host /{ /^Host freelaw-2$/d; /^Host /!d; }' "$SSH_CONFIG" 2>/dev/null || true rm -f "$SSH_CONFIG.tmp" fi cat >> "$SSH_CONFIG" << SSHEOF # ─── Freelaw Dev Servers ───────────────────────────────── Host freelaw-dev HostName ${SERVER1} User ${USERNAME} IdentityFile ${SSH_KEY} ServerAliveInterval 60 ServerAliveCountMax 3 ForwardAgent yes Host freelaw-1 HostName ${SERVER1} User ${USERNAME} IdentityFile ${SSH_KEY} ServerAliveInterval 60 ServerAliveCountMax 3 ForwardAgent yes Host freelaw-2 HostName ${SERVER2} User ${USERNAME} IdentityFile ${SSH_KEY} ServerAliveInterval 60 ServerAliveCountMax 3 ForwardAgent yes # ─── End Freelaw ───────────────────────────────────────── SSHEOF chmod 600 "$SSH_CONFIG" echo -e " ${GREEN}βœ“${NC} SSH config atualizado" echo -e " ${DIM} ssh freelaw-dev β†’ AX42 (64GB)${NC}" echo -e " ${DIM} ssh freelaw-1 β†’ AX42 (64GB)${NC}" echo -e " ${DIM} ssh freelaw-2 β†’ AX102 (128GB)${NC}" # ─── 4. Instalar freelaw-connect (smart router) ───────── echo "" echo -e "${BOLD}[4/5] Smart Router (freelaw-connect)${NC}" INSTALL_DIR="/usr/local/bin" if [ "$PLATFORM" = "windows" ]; then INSTALL_DIR="$HOME/bin" mkdir -p "$INSTALL_DIR" fi # Download router scripts curl -fsSL "https://setup.freelaw.ai/freelaw-connect" -o "$INSTALL_DIR/freelaw-connect" 2>/dev/null || \ cat > "$INSTALL_DIR/freelaw-connect" << 'CONNECTEOF' #!/bin/bash SERVER1="65.21.116.37" SERVER2="37.27.59.167" TIMEOUT=2 USER="${1:-$(whoami)}" score1=$(curl -sf --connect-timeout $TIMEOUT "http://$SERVER1:9999" | grep -o '"score":[0-9]*' | cut -d: -f2 2>/dev/null) & pid1=$! score2=$(curl -sf --connect-timeout $TIMEOUT "http://$SERVER2:9999" | grep -o '"score":[0-9]*' | cut -d: -f2 2>/dev/null) & pid2=$! wait $pid1 $pid2 2>/dev/null score1=${score1:-999}; score2=${score2:-999} if [ "${score2:-999}" -le "${score1:-999}" ] 2>/dev/null; then TARGET="$SERVER2"; NAME="AX102 (128GB, 32 cores)" else TARGET="$SERVER1"; NAME="AX42 (64GB, 16 cores)" fi echo -e "\033[0;35m🦞 Freelaw Dev β†’ $NAME\033[0m" echo -e "\033[2m Scores: AX42=$score1 | AX102=$score2 (lower=better)\033[0m" echo "" for key in ~/.ssh/id_ed25519_freelaw ~/.ssh/id_ed25519 ~/.ssh/id_rsa; do [ -f "$key" ] && exec ssh -i "$key" "$USER@$TARGET" done exec ssh "$USER@$TARGET" CONNECTEOF chmod +x "$INSTALL_DIR/freelaw-connect" 2>/dev/null || true echo -e " ${GREEN}βœ“${NC} freelaw-connect instalado" echo -e " ${DIM} Rode: freelaw-connect ${USERNAME}${NC}" # ─── 5. Testar conexΓ£o ────────────────────────────────── echo "" echo -e "${BOLD}[5/5] Testando conexΓ£o${NC}" # Test health endpoints echo -n " AX42 (${SERVER1}): " h1=$(curl -sf --connect-timeout 3 "http://${SERVER1}:${HEALTH_PORT}") [ -n "$h1" ] && echo -e "${GREEN}online${NC} β€” $h1" || echo -e "${YELLOW}offline ou firewall${NC}" echo -n " AX102 (${SERVER2}): " h2=$(curl -sf --connect-timeout 3 "http://${SERVER2}:${HEALTH_PORT}") [ -n "$h2" ] && echo -e "${GREEN}online${NC} β€” $h2" || echo -e "${YELLOW}offline ou firewall${NC}" echo "" echo -n " SSH freelaw-dev: " if ssh -o ConnectTimeout=5 -o BatchMode=yes -o StrictHostKeyChecking=no freelaw-dev echo "OK" 2>/dev/null; then echo -e "${GREEN}βœ“ ConexΓ£o OK!${NC}" else echo -e "${YELLOW}falhou${NC} β€” sua chave pode nΓ£o ter sido adicionada ainda" fi # ─── Done ──────────────────────────────────────────────── echo "" echo -e "${PURPLE}═══════════════════════════════════════════════════${NC}" echo -e "${PURPLE} 🦞 Setup completo!${NC}" echo -e "${PURPLE}═══════════════════════════════════════════════════${NC}" echo "" echo -e " ${BOLD}Conectar:${NC}" echo -e " ${GREEN}ssh freelaw-dev${NC} β†’ servidor padrΓ£o (AX42)" echo -e " ${GREEN}ssh freelaw-2${NC} β†’ servidor grande (AX102)" echo -e " ${GREEN}freelaw-connect ${USERNAME}${NC} β†’ auto-routing (melhor servidor)" echo "" echo -e " ${BOLD}Primeiro acesso:${NC}" echo -e " O onboarding roda automaticamente na primeira conexΓ£o." echo -e " Vai configurar Git, repo, Claude Code, Codex e mais." echo "" echo -e " ${BOLD}IDEs:${NC}" echo -e " VS Code: Remote-SSH β†’ freelaw-dev" echo -e " Cursor: Remote-SSH β†’ freelaw-dev" echo -e " Claude App: SSH Remote β†’ freelaw-dev" echo "" echo -e " ${BOLD}Ajuda:${NC} ${CYAN}#flw-infra${NC} no Discord" echo ""