-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstart.sh
More file actions
executable file
·143 lines (114 loc) · 5.42 KB
/
Copy pathstart.sh
File metadata and controls
executable file
·143 lines (114 loc) · 5.42 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
#!/usr/bin/env bash
# Manual Start (Development)
# Starts frontend, backend, and QVAC service in parallel.
#
# Usage:
# ./start.sh — start all services
# ./start.sh --setup — run setup-dev.sh before starting (first run, or after dep changes)
set -uo pipefail
# Ensure uv and other user-local binaries are on PATH (not sourced in non-interactive bash).
# shellcheck source=/dev/null
[[ -s "$HOME/.local/bin/env" ]] && source "$HOME/.local/bin/env"
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_DIR="$ROOT/.logs"
mkdir -p "$LOG_DIR"
# ── helpers ──────────────────────────────────────────────────────────────────
log() { printf '\033[1;34m[start]\033[0m %s\n' "$*"; }
err() { printf '\033[1;31m[start]\033[0m ERROR: %s\n' "$*" >&2; }
die() { err "$*"; exit 1; }
load_nvm() {
export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
# shellcheck source=/dev/null
[[ -s "$NVM_DIR/nvm.sh" ]] && source "$NVM_DIR/nvm.sh"
command -v node &>/dev/null || die "Node.js not found. Install via: nvm install 22 && nvm alias default 22"
}
# ── args ─────────────────────────────────────────────────────────────────────
RUN_SETUP=false
for arg in "$@"; do
case "$arg" in
--setup) RUN_SETUP=true ;;
*) die "Unknown argument: $arg\nUsage: ./start.sh [--setup]" ;;
esac
done
# ── prerequisites ─────────────────────────────────────────────────────────────
command -v uv &>/dev/null || die "uv not found. Install: https://docs.astral.sh/uv/getting-started/installation/"
load_nvm
# ── npm install helper (only runs when node_modules is missing) ───────────────
npm_install_if_needed() {
local dir="$1"
if [[ ! -d "$dir/node_modules" ]]; then
log "node_modules missing in $dir — running npm install..."
(cd "$dir" && npm install) || die "npm install failed in $dir"
fi
}
# ── optional backend setup (first run) ───────────────────────────────────────
if $RUN_SETUP; then
log "Running backend setup (setup-dev.sh)..."
(cd "$ROOT/services/ai" && bash setup-dev.sh) || die "setup-dev.sh failed."
log "Setup complete."
npm_install_if_needed "$ROOT/apps/web"
npm_install_if_needed "$ROOT/workers/qvac-service"
fi
# ── kill stale processes on service ports (leftover from previous runs) ──────
kill_port() {
local port="$1"
local pids
pids=$(lsof -ti :"$port" -n -P 2>/dev/null || true)
if [[ -n "$pids" ]]; then
log "Port $port in use — killing stale process(es): $pids"
echo "$pids" | xargs kill 2>/dev/null || true
sleep 1
fi
}
kill_port 3000 # frontend
kill_port 8000 # backend
kill_port 3001 # QVAC
# ── cleanup on exit ───────────────────────────────────────────────────────────
PIDS=()
cleanup() {
echo ""
log "Shutting down all services..."
for pid in "${PIDS[@]:-}"; do
[[ -n "$pid" ]] && kill "$pid" 2>/dev/null || true
done
wait 2>/dev/null || true
log "All services stopped."
}
trap cleanup EXIT INT TERM
# ── 1. frontend ───────────────────────────────────────────────────────────────
log "Starting frontend → http://localhost:3000 (log: .logs/frontend.log)"
(
cd "$ROOT/apps/web"
exec npm run dev
) > "$LOG_DIR/frontend.log" 2>&1 &
PIDS+=($!)
# ── 2. backend ────────────────────────────────────────────────────────────────
log "Starting backend → http://localhost:8000 (log: .logs/backend.log)"
(
cd "$ROOT/services/ai"
exec uv run uvicorn app.main:app --reload --port 8000
) > "$LOG_DIR/backend.log" 2>&1 &
PIDS+=($!)
# ── 3. QVAC service ───────────────────────────────────────────────────────────
log "Starting QVAC → http://localhost:3001 (log: .logs/qvac.log)"
(
cd "$ROOT/workers/qvac-service"
exec node src/server.js
) > "$LOG_DIR/qvac.log" 2>&1 &
PIDS+=($!)
# ── summary ───────────────────────────────────────────────────────────────────
echo ""
echo " Bitcoin Academy — development"
echo ""
echo " Frontend → http://localhost:3000"
echo " Backend → http://localhost:8000 (Swagger: /docs)"
echo " QVAC → http://localhost:3001"
echo ""
echo " Tail logs: tail -f .logs/backend.log"
echo " tail -f .logs/frontend.log"
echo " tail -f .logs/qvac.log"
echo ""
echo " Press Ctrl+C to stop all services."
echo ""
# keep script alive so trap fires on Ctrl+C
wait