-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstart.sh
More file actions
executable file
·126 lines (111 loc) · 3.57 KB
/
start.sh
File metadata and controls
executable file
·126 lines (111 loc) · 3.57 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
#!/usr/bin/env bash
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DOCKER_MODE=false
FORCE=false
RESET=false
BACKEND_PID=""
FRONTEND_PID=""
for arg in "$@"; do
case $arg in
--docker) DOCKER_MODE=true ;;
--force) FORCE=true ;;
--reset) RESET=true ;;
esac
done
cleanup() {
trap - EXIT INT TERM # Prevent re-entry
echo ""
echo "Stopping..."
if [ "$DOCKER_MODE" = "false" ]; then
if [ -n "$BACKEND_PID" ]; then
# Kill children first (e.g. the app process spawned by dotnet run), then the parent
pkill -P "$BACKEND_PID" 2>/dev/null || true
kill "$BACKEND_PID" 2>/dev/null || true
fi
if [ -n "$FRONTEND_PID" ]; then
pkill -P "$FRONTEND_PID" 2>/dev/null || true
kill "$FRONTEND_PID" 2>/dev/null || true
fi
docker compose -f "$SCRIPT_DIR/docker-compose.yml" down
fi
}
# Prints info about who is listening on PORT.
# Returns 1 if the port is occupied, 0 if free.
report_port() {
local port="$1"
local info
info="$(lsof -nP -i:"$port" -sTCP:LISTEN 2>/dev/null | tail -n +2 || true)"
if [ -n "$info" ]; then
local name pid
name="$(echo "$info" | awk '{print $1}')"
pid="$(echo "$info" | awk '{print $2}')"
echo " Port $port is in use by $name (pid $pid)"
return 1
fi
return 0
}
kill_port() {
local port="$1"
local pids
pids="$(lsof -ti:"$port" 2>/dev/null || true)"
if [ -n "$pids" ]; then
echo "$pids" | xargs kill 2>/dev/null || true
sleep 1
fi
}
trap cleanup EXIT INT TERM
if [ "$DOCKER_MODE" = "true" ]; then
echo "Building backend and frontend..."
"$SCRIPT_DIR/build-for-docker.sh"
echo "Starting all services in Docker..."
docker compose -f "$SCRIPT_DIR/docker-compose.dev.yml" up
else
# Check ports before doing any heavy work
PORT_CONFLICT=false
report_port 5001 || PORT_CONFLICT=true
report_port 5173 || PORT_CONFLICT=true
if [ "$PORT_CONFLICT" = "true" ]; then
if [ "$FORCE" = "false" ]; then
echo ""
echo "Run ./start.sh --force to stop conflicting processes and start fresh."
exit 1
fi
echo "Stopping conflicting processes..."
kill_port 5001
kill_port 5173
fi
echo "Starting Weaviate and text2vec-transformers..."
docker compose -f "$SCRIPT_DIR/docker-compose.yml" up -d
echo "Waiting for Weaviate to be ready..."
ATTEMPTS=0
until curl -sf http://localhost:8080/v1/.well-known/ready > /dev/null 2>&1; do
ATTEMPTS=$((ATTEMPTS + 1))
if [ "$ATTEMPTS" -ge 60 ]; then
echo "Weaviate did not become ready within 2 minutes. Check Docker logs."
exit 1
fi
sleep 2
done
echo "Weaviate is ready."
if [ ! -d "$SCRIPT_DIR/WebApp/node_modules" ]; then
echo "Installing frontend dependencies..."
(cd "$SCRIPT_DIR/WebApp" && npm install --silent)
fi
echo "Starting backend..."
DOTNET_ENV="ASPNETCORE_URLS=http://+:5001"
[ "$RESET" = "true" ] && DOTNET_ENV="$DOTNET_ENV Seed__Reset=true"
(cd "$SCRIPT_DIR/WebApi" && exec env $DOTNET_ENV dotnet run) &
BACKEND_PID=$!
echo "Starting frontend..."
(cd "$SCRIPT_DIR/WebApp" && exec npm run dev) &
FRONTEND_PID=$!
echo ""
echo "All services running:"
echo " Frontend: http://localhost:5173"
echo " Backend: http://localhost:5001"
echo " Weaviate: http://localhost:8080"
echo ""
echo "Press Ctrl+C to stop."
wait "$BACKEND_PID" "$FRONTEND_PID"
fi