forked from EraMatch/EraMatch
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstart-dev.sh
More file actions
executable file
·187 lines (158 loc) · 7.12 KB
/
Copy pathstart-dev.sh
File metadata and controls
executable file
·187 lines (158 loc) · 7.12 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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#!/usr/bin/env bash
# ─────────────────────────────────────────────────────────────────────────────
# EraMatch dev-server launcher — macOS, Linux, Windows (via WSL/Git Bash)
#
# Usage:
# bash start-dev.sh — start all services (clears ports first)
# bash start-dev.sh stop — kill all services occupying dev ports
# bash start-dev.sh status — print what is running on each port
# ─────────────────────────────────────────────────────────────────────────────
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_DIR="$ROOT_DIR/.dev-logs"
VENV_ACTIVATE="$ROOT_DIR/backend/.venv/bin/activate"
# Ports used by every service
SERVICES=("backend-api" "ai-service" "recruiter-portal" "candidate-portal")
get_service_port() {
case "$1" in
"backend-api") echo 8000 ;;
"ai-service") echo 8001 ;;
"recruiter-portal") echo 5173 ;;
"candidate-portal") echo 5174 ;;
*) echo 0 ;;
esac
}
# ── Helpers ───────────────────────────────────────────────────────────────────
pid_on_port() {
# Returns the PID using a port, empty string if nothing
if command -v lsof &>/dev/null; then
lsof -ti tcp:"$1" 2>/dev/null | head -1 || true
elif command -v ss &>/dev/null; then
ss -tlnp "sport = :$1" 2>/dev/null | awk 'NR>1{match($0,/pid=([0-9]+)/,a); if(a[1]) print a[1]}' | head -1 || true
fi
}
kill_port() {
local port="$1"
local pid
pid=$(pid_on_port "$port")
if [[ -n "$pid" ]]; then
echo " Port $port occupied by PID $pid — killing..."
kill -TERM "$pid" 2>/dev/null || kill -9 "$pid" 2>/dev/null || true
sleep 0.5
fi
}
# ── Stop mode ─────────────────────────────────────────────────────────────────
if [[ "${1:-}" == "stop" ]]; then
echo "Stopping all EraMatch dev services..."
for svc in "${SERVICES[@]}"; do
port=$(get_service_port "$svc")
pid=$(pid_on_port "$port")
if [[ -n "$pid" ]]; then
echo " Stopping $svc on :$port (PID $pid)"
kill -TERM "$pid" 2>/dev/null || true
fi
done
# Also kill stale celery workers
pkill -f "celery.*worker" 2>/dev/null || true
echo "Done."
exit 0
fi
# ── Status mode ───────────────────────────────────────────────────────────────
if [[ "${1:-}" == "status" ]]; then
echo "EraMatch dev service status:"
for svc in "${SERVICES[@]}"; do
port=$(get_service_port "$svc")
pid=$(pid_on_port "$port")
if [[ -n "$pid" ]]; then
echo " ✓ $svc :$port (PID $pid)"
else
echo " ✗ $svc :$port (not running)"
fi
done
exit 0
fi
# ── Pre-flight: clear occupied ports ─────────────────────────────────────────
echo "Checking ports..."
for svc in "${SERVICES[@]}"; do
port=$(get_service_port "$svc")
pid=$(pid_on_port "$port")
if [[ -n "$pid" ]]; then
echo " Port $port ($svc) already in use by PID $pid — clearing..."
kill -TERM "$pid" 2>/dev/null || kill -9 "$pid" 2>/dev/null || true
sleep 0.5
# Verify it's free now
leftover=$(pid_on_port "$port")
if [[ -n "$leftover" ]]; then
echo " WARNING: port $port still occupied by PID $leftover after kill attempt."
fi
fi
done
# Also clear stale Celery workers from previous runs
STALE_CELERY=$(pgrep -f "celery.*worker" 2>/dev/null || true)
if [[ -n "$STALE_CELERY" ]]; then
echo " Clearing stale Celery worker(s): PIDs $STALE_CELERY"
pkill -f "celery.*worker" 2>/dev/null || true
sleep 0.5
fi
echo "Ports clear. Starting services..."
echo
# ── OS detection ──────────────────────────────────────────────────────────────
OS_TYPE="$(uname -s 2>/dev/null || echo "Unknown")"
if [[ "$OS_TYPE" == "Darwin" ]]; then
CELERY_POOL="--pool=threads"
CELERY_PREFIX="OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES"
else
CELERY_POOL="--pool=threads"
CELERY_PREFIX=""
fi
CELERY_CONCURRENCY="--concurrency=6"
mkdir -p "$LOG_DIR"
if [[ ! -f "$VENV_ACTIVATE" ]]; then
echo "Error: Python virtual environment not found at $VENV_ACTIVATE"
echo "Create it first: cd backend && python -m venv .venv && pip install -e ."
exit 1
fi
PIDS=()
CLEANED_UP=0
start_service() {
local name="$1"
local command="$2"
local log_file="$LOG_DIR/${name}.log"
echo "Starting $name..."
bash -lc "$command" >"$log_file" 2>&1 &
local pid=$!
PIDS+=("$pid")
echo " PID: $pid | Log: $log_file"
}
cleanup() {
if [[ "$CLEANED_UP" -eq 1 ]]; then return; fi
CLEANED_UP=1
echo
echo "Stopping all services..."
for pid in "${PIDS[@]}"; do
if kill -0 "$pid" 2>/dev/null; then
kill "$pid" 2>/dev/null || true
fi
done
pkill -f "celery.*worker" 2>/dev/null || true
wait || true
echo "All services stopped."
}
trap cleanup INT TERM EXIT
# ── Services ─────────────────────────────────────────────────────────────────
start_service "backend-api" "source '$VENV_ACTIVATE' && cd '$ROOT_DIR/backend' && uvicorn app.main:app --reload --port 8000"
start_service "celery-worker" "source '$VENV_ACTIVATE' && cd '$ROOT_DIR/backend' && $CELERY_PREFIX celery -A worker.celery_app worker --loglevel=info $CELERY_POOL $CELERY_CONCURRENCY -n backend@%h"
start_service "ai-service" "cd '$ROOT_DIR/ai-service' && uv run uvicorn main:app --reload --port 8001"
start_service "ai-celery-worker" "cd '$ROOT_DIR/ai-service' && uv run celery -A worker.celery_app worker --loglevel=info --pool=solo -n ai@%h"
start_service "livekit-worker" "cd '$ROOT_DIR/ai-service' && uv run python livekit_worker/agent_server.py dev"
start_service "recruiter-portal" "cd '$ROOT_DIR/Frontend/recruiter-portal' && npm run dev"
start_service "candidate-portal" "cd '$ROOT_DIR/Frontend/candidate-portal' && npm run dev"
echo
echo "All services started. Press Ctrl+C to stop all. (or: bash start-dev.sh stop)"
echo "Logs: tail -f '$LOG_DIR/<service>.log'"
echo
echo " backend-api → http://localhost:8000"
echo " recruiter-portal → http://localhost:5173"
echo " candidate-portal → http://localhost:5174"
echo " ai-service → http://localhost:8001"
wait