-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathrun
More file actions
executable file
·222 lines (203 loc) · 7.06 KB
/
Copy pathrun
File metadata and controls
executable file
·222 lines (203 loc) · 7.06 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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#!/bin/bash
# Загружаем переменные из .env
set -o allexport
source ./.env
set +o allexport
# --- НАЧАЛО ИЗМЕНЕНИЙ ---
# Массив для хранения PID всех фоновых процессов
pids=()
# Функция очистки, которая будет вызвана при выходе
cleanup() {
echo # Перевод строки для красоты
echo "Caught signal, cleaning up background processes..."
for pid in "${pids[@]}"; do
# Проверяем, существует ли еще процесс, перед тем как его завершать
if kill -0 "$pid" 2>/dev/null; then
echo "Stopping process with PID: $pid"
# Отправляем сигнал SIGTERM для корректного завершения
kill "$pid"
fi
done
echo "Cleanup complete."
}
# Устанавливаем "ловушку" для сигналов SIGINT (Ctrl+C), SIGTERM (стандартное завершение) и EXIT (любой выход)
trap cleanup SIGINT SIGTERM EXIT
# --- КОНЕЦ ИЗМЕНЕНИЙ ---
# Автоматический поиск main файлов Flutter frontend
cd "$(dirname "$0")" && docker compose down > /dev/null 2>&1
cd "$(dirname "$0")/../electronicqueue-frontend" && docker compose down > /dev/null 2>&1
cd - > /dev/null > /dev/null 2>&1
# Kill processes on BACKEND_PORT, FRONTEND_PORT
kill_by_port() {
local PORT=$1
if command -v lsof >/dev/null 2>&1; then
local PID
PID=$(lsof -ti tcp:$PORT)
if [ -n "$PID" ]; then
echo "Killing process on port $PORT (PID $PID) via lsof"
kill -9 $PID
sleep 1
fi
elif command -v fuser >/dev/null 2>&1; then
local PID
PID=$(fuser $PORT/tcp 2>/dev/null)
if [ -n "$PID" ]; then
echo "Killing process on port $PORT (PID $PID) via fuser"
kill -9 $PID
sleep 1
fi
fi
# Windows: netstat + taskkill
if [[ "$(uname -s 2>/dev/null)" =~ (MINGW|MSYS|CYGWIN|Windows_NT) ]]; then
local PIDS
PIDS=$(netstat -ano | grep :$PORT | awk '{print $5}' | sort | uniq)
for PID in $PIDS; do
if [ -n "$PID" ]; then
echo "Killing process on port $PORT (PID $PID) via taskkill"
taskkill //PID $PID //F 2>/dev/null
sleep 1
fi
done
fi
}
# --- Аргументы ---
usage() {
echo "Usage: $0 [go|go-docker] [flutter|flutter-docker] [local|docker]"
echo
echo "Key descriptions:"
echo " go - Run Go backend"
echo " go-docker - Run Go backend in Docker"
echo " flutter - Run Flutter frontend"
echo " flutter-docker - Run Flutter frontend in Docker"
echo " local - Run Go and Flutter locally"
echo " docker - Run Go and Flutter in Docker"
exit 1
}
if [[ $# -eq 0 ]]; then
usage
fi
RUN_GO=""
RUN_GO_DOCKER=""
RUN_FLUTTER=""
RUN_FLUTTER_DOCKER=""
for arg in "$@"; do
case $arg in
go)
RUN_GO="true"
;;
go-docker)
RUN_GO_DOCKER="true"
;;
flutter)
RUN_FLUTTER="true"
;;
flutter-docker)
RUN_FLUTTER_DOCKER="true"
;;
local)
RUN_GO="true"
RUN_FLUTTER="true"
;;
docker)
RUN_GO_DOCKER="true"
RUN_FLUTTER_DOCKER="true"
;;
*)
usage
;;
esac
done
# Kill processes on BACKEND_PORT, FRONTEND_PORT
if { [[ "$RUN_GO" == "true" && -n "$BACKEND_PORT" ]] || [[ "$RUN_GO_DOCKER" == "true" && -n "$BACKEND_PORT" ]]; }; then
kill_by_port $BACKEND_PORT
fi
if { [[ "$RUN_FLUTTER" == "true" && -n "$FRONTEND_PORT" ]] || [[ "$RUN_FLUTTER_DOCKER" == "true" && -n "$FRONTEND_PORT" ]]; }; then
cd "$(dirname "$0")/../electronicqueue-frontend/lib" || { echo "lib directory not found!"; exit 1; }
mapfile -t FLUTTER_MAIN_FILES < <(find . -maxdepth 2 -mindepth 2 -type f -name '*main*.dart' | sed 's|^./||')
cd - > /dev/null 2>&1
N=${#FLUTTER_MAIN_FILES[@]}
for ((i=0; i<N; i++)); do
PORT=$((FRONTEND_PORT+i))
kill_by_port $PORT
done
fi
# Run Go backend
if [[ "$RUN_GO" == "true" ]]; then
echo "Updating Swagger documentation..."
if ! swag init --dir ./cmd,./internal --output ./docs; then
echo "Failed to update Swagger documentation."
exit 1
fi
echo "Starting Go backend..."
# ИЗМЕНЕНО: Запускаем в фоне и сохраняем PID
(cd "$(dirname "$0")" && go run cmd/main.go) &
pids+=($!)
echo "Go backend started with PID: ${pids[-1]}."
elif [[ "$RUN_GO_DOCKER" == "true" ]]; then
echo "Starting Go backend via Docker Compose..."
if ! docker info > /dev/null 2>&1; then
echo "Make sure that Docker Engine is running. Try restarting Docker Desktop."
exit 1
fi
docker compose down > /dev/null 2>&1
# ИЗМЕНЕНО: Запускаем в фоне и сохраняем PID
(cd "$(dirname "$0")" && docker compose up) &
pids+=($!)
echo "Go backend (Docker Compose) started with PID: ${pids[-1]}."
fi
# Run Flutter frontend
if [[ "$RUN_FLUTTER" == "true" ]]; then
cd "$(dirname "$0")/../electronicqueue-frontend" || { echo "Failed to change directory to electronicqueue-frontend."; exit 1; }
if flutter pub get; then
echo "Flutter setup complete."
else
echo "Failed to fetch packages."
exit 1
fi
if [ -z "$FRONTEND_PORT" ]; then
echo "FRONTEND_PORT is not set in .env!"
exit 1
fi
PORT=$FRONTEND_PORT
for MAIN_FILE in "${FLUTTER_MAIN_FILES[@]}"; do
echo "Starting Flutter frontend: $MAIN_FILE on port $PORT..."
# ИЗМЕНЕНО: Запускаем в фоне и сохраняем PID
flutter run -t "lib/$MAIN_FILE" -d ${BROWSER:-chrome} --web-port=$PORT &
pids+=($!)
echo "Flutter frontend for $MAIN_FILE started with PID ${pids[-1]}."
PORT=$((PORT+1))
done
echo "All Flutter frontends started."
cd - > /dev/null
elif [[ "$RUN_FLUTTER_DOCKER" == "true" ]]; then
echo "Starting Flutter frontend containers from compose.yaml..."
cd "$(dirname "$0")/../electronicqueue-frontend" || { echo "Failed to change directory to electronicqueue-frontend."; exit 1; }
if ! docker info > /dev/null 2>&1; then
echo "Make sure that Docker Engine is running. Try restarting Docker Desktop."
exit 1
fi
docker compose down > /dev/null 2>&1
if [ ! -f compose.yaml ]; then
echo "compose.yaml not found! Please run install.sh with --flutter-docker first."
exit 1
fi
PORT=$FRONTEND_PORT
for MAIN_FILE in "${FLUTTER_MAIN_FILES[@]}"; do
echo "Starting Flutter frontend: $MAIN_FILE on port $PORT..."
start "" "http://localhost:$PORT/"
PORT=$((PORT+1))
done
# ИЗМЕНЕНО: Запускаем в фоне и сохраняем PID
docker compose up &
pids+=($!)
echo "Flutter frontends (Docker Compose) started with PID ${pids[-1]}."
cd - > /dev/null
fi
# --- НАЧАЛО ИЗМЕНЕНИЙ ---
# Ждем завершения всех фоновых процессов.
# Скрипт будет "висеть" здесь, пока его не прервут (например, через Ctrl+C)
echo
echo "All processes are running. Press Ctrl+C to stop all."
wait
# --- КОНЕЦ ИЗМЕНЕНИЙ ---
exit 0