85 lines
6.2 KiB
Bash
Executable File
85 lines
6.2 KiB
Bash
Executable File
#!/bin/sh
|
||
set -e
|
||
|
||
# ── FRONTEND ──────────────────────────────────────────
|
||
export FRONT_PORT=${FRONT_PORT:-3001}
|
||
yarn --cwd /app/frontend dev --turbopack --turbo -p "$FRONT_PORT" &
|
||
echo $! > /app/pids/frontend.pid
|
||
|
||
# ── BACKEND ───────────────────────
|
||
export BACKEND_PORT=${BACKEND_PORT:-3000}
|
||
# Запускаем скрипт "start", который включает db:migrate, db:seed и watch (nodemon)
|
||
npm --prefix /app/backend run start &
|
||
echo $! > /app/pids/backend.pid
|
||
|
||
# ── APP-SHELL ──────────────────────────────────────────
|
||
export APP_SHELL_PORT=${APP_SHELL_PORT:-4000}
|
||
yarn --cwd /app/app-shell start &
|
||
APP_SHELL_PID=$!
|
||
echo $APP_SHELL_PID > /app/pids/app-shell.pid
|
||
|
||
# --- Ожидание запуска ВСЕХ сервисов и их готовности -------------------
|
||
|
||
echo '⌛ Waiting for backend to be ready...'
|
||
# Проверяем, что бэкенд слушает порт
|
||
until nc -z localhost "$BACKEND_PORT"; do sleep 2; done
|
||
echo '✔ Backend is listening on port.'
|
||
# Дополнительная проверка, чтобы Nodemon успел запуститься и не перезапуститься сразу
|
||
# после начала app-shell Git-операций. Возможно, это нужно, если Nodemon стартует медленно.
|
||
sleep 10 # <-- Можно настроить, если бэкенд нестабилен в первые секунды
|
||
|
||
echo '⌛ Waiting for app-shell to be ready (including Git initialization)...'
|
||
# Ждем, пока app-shell начнет слушать порт, что означает, что Git инициализация завершена
|
||
until nc -z localhost "$APP_SHELL_PORT"; do sleep 2; done
|
||
echo '✔ App-shell is fully ready and listening on port.'
|
||
|
||
echo '⌛ Waiting for frontend to be ready...'
|
||
# Ждем, пока фронтенд начнет слушать порт
|
||
until nc -z localhost "$FRONT_PORT"; do sleep 2; done
|
||
echo '✔ Frontend is listening on port.'
|
||
# Очень важный момент для `next dev`: он начинает слушать порт, но компилирует страницы
|
||
# асинхронно. Нам нужно дать ему время для первичной компиляции.
|
||
echo '⌛ Giving frontend time for initial compilation and route setup...'
|
||
sleep 30 # <-- Увеличьте это, если фронтенд по-прежнему выдает 500-е ошибки на запросы
|
||
echo '✔ Frontend is likely ready for traffic.'
|
||
|
||
|
||
# ── PAGE WARMING (in background) ──────────────────────
|
||
# Теперь этот блок запустится только после того, как все сервисы объявили себя готовыми
|
||
# (т.е. app-shell завершил Git, frontend начал компиляцию, backend запустился).
|
||
(
|
||
echo '🔥 Warming specific critical pages first…'
|
||
# Добавляем таймаут для curl, чтобы не зависать
|
||
# -m 60: максимальное время для операции в секундах
|
||
# --retry 5: повторить 5 раз
|
||
# --retry-delay 10: задержка между повторами 10 секунд
|
||
curl -m 60 --retry 5 --retry-delay 10 -L -s -o /dev/null -w "\n✔ warmed %{url_effective} %{http_code}\n" "http://localhost:${FRONT_PORT}/login" || echo "✖ skipped /login (curl failed)"
|
||
curl -m 60 --retry 5 --retry-delay 10 -L -s -o /dev/null -w "\n✔ warmed %{url_effective} %{http_code}\n" "http://localhost:${FRONT_PORT}/dashboard" || echo "✖ skipped /dashboard (curl failed)"
|
||
curl -m 60 --retry 5 --retry-delay 10 -L -s -o /dev/null -w "\n✔ warmed %{url_effective} %{http_code}\n" "http://localhost:${FRONT_PORT}/" || echo "✖ skipped / (curl failed)"
|
||
curl -L -s -o /dev/null -w "\n✔ warmed %{url_effective} %{http_code}\n" "http://localhost:${FRONT_PORT}/users/users-list/" || echo "✖ skipped /users/users-list/ (curl failed)"
|
||
curl -L -s -o /dev/null -w "\n✔ warmed %{url_effective} %{http_code}\n" "http://localhost:${FRONT_PORT}/analytics/analytics-list/" || echo "✖ skipped /analytics/analytics-list/ (curl failed)"
|
||
curl -L -s -o /dev/null -w "\n✔ warmed %{url_effective} %{http_code}\n" "http://localhost:${FRONT_PORT}/courses/courses-list/" || echo "✖ skipped /courses/courses-list/ (curl failed)"
|
||
curl -L -s -o /dev/null -w "\n✔ warmed %{url_effective} %{http_code}\n" "http://localhost:${FRONT_PORT}/discussion_boards/discussion_boards-list/" || echo "✖ skipped /discussion_boards/discussion_boards-list/ (curl failed)"
|
||
curl -L -s -o /dev/null -w "\n✔ warmed %{url_effective} %{http_code}\n" "http://localhost:${FRONT_PORT}/enrollments/enrollments-list/" || echo "✖ skipped /enrollments/enrollments-list/ (curl failed)"
|
||
curl -L -s -o /dev/null -w "\n✔ warmed %{url_effective} %{http_code}\n" "http://localhost:${FRONT_PORT}/instructors/instructors-list/" || echo "✖ skipped /instructors/instructors-list/ (curl failed)"
|
||
curl -L -s -o /dev/null -w "\n✔ warmed %{url_effective} %{http_code}\n" "http://localhost:${FRONT_PORT}/students/students-list/" || echo "✖ skipped /students/students-list/ (curl failed)"
|
||
curl -L -s -o /dev/null -w "\n✔ warmed %{url_effective} %{http_code}\n" "http://localhost:${FRONT_PORT}/roles/roles-list/" || echo "✖ skipped /roles/roles-list/ (curl failed)"
|
||
curl -L -s -o /dev/null -w "\n✔ warmed %{url_effective} %{http_code}\n" "http://localhost:${FRONT_PORT}/permissions/permissions-list/" || echo "✖ skipped /permissions/permissions-list/ (curl failed)"
|
||
|
||
echo '🚀 Warmup script finished.'
|
||
) &
|
||
|
||
# ── Nginx PID 1 ──────────────────
|
||
# Nginx запускается ТОЛЬКО ПОСЛЕ того, как все внутренние сервисы (backend, app-shell, frontend)
|
||
# полностью готовы к приему трафика, и даже страницы прогреты.
|
||
echo '🚀 Starting Nginx…'
|
||
nginx -g "daemon off;" &
|
||
NGINX_PID=$!
|
||
|
||
trap 'kill $(jobs -p)' TERM INT
|
||
|
||
wait "$NGINX_PID"
|
||
|
||
|
||
|