-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdev.sh
More file actions
executable file
·129 lines (112 loc) · 5.61 KB
/
dev.sh
File metadata and controls
executable file
·129 lines (112 loc) · 5.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/bin/bash
# dev.sh — start the full forensics-ai stack locally
# Usage: ./dev.sh [--no-build]
#
# Services started:
# EDR Pipeline backend → http://localhost:8099
# Web UI (Next.js) → http://localhost:3000
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# ── Go path ──────────────────────────────────────────────────────────────────
export PATH="/snap/bin:$PATH"
# ── Args ─────────────────────────────────────────────────────────────────────
SKIP_BUILD=false
for arg in "$@"; do
[[ "$arg" == "--no-build" ]] && SKIP_BUILD=true
done
# ── Dependency checks ─────────────────────────────────────────────────────────
if ! command -v go &>/dev/null; then
echo "❌ Go not found. Install via: sudo snap install go --classic"
exit 1
fi
if ! command -v node &>/dev/null; then
echo "❌ Node.js not found. Install from https://nodejs.org"
exit 1
fi
if ! command -v npm &>/dev/null; then
echo "❌ npm not found."
exit 1
fi
# ── Build backend ─────────────────────────────────────────────────────────────
BACKEND_DIR="$SCRIPT_DIR/apps/edr-pipeline"
BINARY="$BACKEND_DIR/build/edr-pipeline"
if [[ "$SKIP_BUILD" == false ]]; then
echo "🔨 Building EDR pipeline..."
(cd "$BACKEND_DIR" && go build -o build/edr-pipeline ./cmd/edr)
echo "✅ Build complete"
else
echo "⏭️ Skipping build (--no-build)"
if [[ ! -f "$BINARY" ]]; then
echo "❌ Binary not found at $BINARY — run without --no-build first"
exit 1
fi
fi
# ── Install frontend deps if needed ──────────────────────────────────────────
WEB_DIR="$SCRIPT_DIR/apps/web"
if [[ ! -d "$WEB_DIR/node_modules" ]]; then
echo "📦 Installing frontend dependencies..."
(cd "$WEB_DIR" && npm install)
fi
# ── Start AI analyst service (optional — requires uv + AWS credentials) ──────
ANALYST_DIR="$SCRIPT_DIR/apps/ai-analyst"
ANALYST_PID=""
if command -v uv &>/dev/null && [[ -f "$ANALYST_DIR/pyproject.toml" ]]; then
echo "🤖 Starting AI analyst service on :8001..."
if [[ ! -f "$ANALYST_DIR/.env" ]]; then
cp "$ANALYST_DIR/.env.example" "$ANALYST_DIR/.env" 2>/dev/null || true
fi
(cd "$ANALYST_DIR" && uv run uvicorn analyst.main:app --host 0.0.0.0 --port 8001 --app-dir src) &
ANALYST_PID=$!
else
echo "ℹ️ Skipping AI analyst (uv not found or pyproject.toml missing)"
fi
# ── Start backend ─────────────────────────────────────────────────────────────
echo "🚀 Starting EDR pipeline on :8099..."
EDR_PORT=8099 EDR_RULES_DIR="$BACKEND_DIR/rules" ANALYST_API_URL=http://localhost:8001 "$BINARY" &
BACKEND_PID=$!
# ── Wait for backend to be ready ─────────────────────────────────────────────
echo -n "⏳ Waiting for backend"
for i in $(seq 1 20); do
if curl -sf http://localhost:8099/health &>/dev/null; then
echo " ✓"
break
fi
echo -n "."
sleep 0.5
if [[ $i -eq 20 ]]; then
echo ""
echo "❌ Backend did not start in time"
kill $BACKEND_PID 2>/dev/null
exit 1
fi
done
# ── Start frontend ────────────────────────────────────────────────────────────
echo "🚀 Starting web UI on :3000..."
(cd "$WEB_DIR" && NEXT_PUBLIC_API_URL=http://localhost:8099 NEXT_PUBLIC_ANALYST_URL=http://localhost:8001 npm run dev) &
FRONTEND_PID=$!
# ── Cleanup on exit ───────────────────────────────────────────────────────────
cleanup() {
echo ""
echo "🛑 Stopping services..."
kill $BACKEND_PID $FRONTEND_PID 2>/dev/null
[[ -n "$ANALYST_PID" ]] && kill $ANALYST_PID 2>/dev/null
wait $BACKEND_PID $FRONTEND_PID 2>/dev/null
echo "👋 Done"
}
trap cleanup EXIT INT TERM
# ── Summary ───────────────────────────────────────────────────────────────────
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo " 🔬 Forensics AI — local dev stack"
echo ""
echo " EDR Pipeline API → http://localhost:8099/health"
echo " AI Analyst API → http://localhost:8001/health (if uv available)"
echo " Web UI → http://localhost:3000"
echo ""
echo " Flags: --no-build (skip go build, use existing binary)"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "Press Ctrl+C to stop all services"
echo ""
wait