31981-test/docker/start-services.sh
2025-06-04 11:19:59 +00:00

85 lines
6.2 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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"