/
Vibek
/
Agent_GG
Обзор
Документация
Войти
/
Vibek
/
Agent_GG
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/stack.sh
200 строк
4 KB
Vladimir
Добавить единые скрипты управления стеком MVP.
25 май 2026, 21:13
25 май 2026, 21:13
d142da3
Код
Авторство
О чём код?
#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" BACKEND_DIR="${PROJECT_ROOT}/backend" DATABASES_SCRIPT="${SCRIPT_DIR}/databases.sh" RUNTIME_DIR="${PROJECT_ROOT}/.runtime" BACKEND_PID_FILE="${RUNTIME_DIR}/backend.pid" BACKEND_LOG_FILE="${RUNTIME_DIR}/backend.log" HOST="${GG_BACKEND_HOST:-127.0.0.1}" PORT="${GG_BACKEND_PORT:-8000}" HEALTH_URL="http://${HOST}:${PORT}/health" READY_TIMEOUT_SECONDS="${GG_BACKEND_READY_TIMEOUT_SECONDS:-45}" mkdir -p "${RUNTIME_DIR}" if [[ ! -x "${DATABASES_SCRIPT}" ]]; then echo "ERROR: ${DATABASES_SCRIPT} not found or not executable." >&2 exit 1 fi resolve_python_bin() { if [[ -n "${GG_PYTHON_BIN:-}" ]]; then echo "${GG_PYTHON_BIN}" return 0 fi if [[ -x "${PROJECT_ROOT}/.venv/bin/python" ]]; then echo "${PROJECT_ROOT}/.venv/bin/python" return 0 fi if [[ -x "${PROJECT_ROOT}/venv/bin/python" ]]; then echo "${PROJECT_ROOT}/venv/bin/python" return 0 fi if command -v python3 >/dev/null 2>&1; then command -v python3 return 0 fi if command -v python >/dev/null 2>&1; then command -v python return 0 fi echo "ERROR: Python executable not found." >&2 exit 1 } is_backend_running() { if [[ ! -f "${BACKEND_PID_FILE}" ]]; then return 1 fi local pid pid="$(cat "${BACKEND_PID_FILE}")" if [[ -z "${pid}" ]]; then return 1 fi if ! kill -0 "${pid}" >/dev/null 2>&1; then return 1 fi return 0 } wait_for_backend_ready() { local elapsed=0 local step=2 echo "Waiting for backend health endpoint: ${HEALTH_URL}" while (( elapsed < READY_TIMEOUT_SECONDS )); do if curl --silent --show-error --max-time 2 "${HEALTH_URL}" >/dev/null 2>&1; then echo "Backend is ready." return 0 fi sleep "${step}" elapsed=$((elapsed + step)) done echo "ERROR: backend is not ready after ${READY_TIMEOUT_SECONDS}s." >&2 return 1 } start_backend() { if is_backend_running; then echo "Backend is already running (pid=$(cat "${BACKEND_PID_FILE}"))." return 0 fi local python_bin python_bin="$(resolve_python_bin)" echo "Starting backend on ${HOST}:${PORT} using ${python_bin}" ( cd "${BACKEND_DIR}" nohup "${python_bin}" -m uvicorn src.main:create_app --factory --host "${HOST}" --port "${PORT}" \ >"${BACKEND_LOG_FILE}" 2>&1 & echo $! >"${BACKEND_PID_FILE}" ) if ! wait_for_backend_ready; then echo "Backend log: ${BACKEND_LOG_FILE}" >&2 return 1 fi echo "Backend started (pid=$(cat "${BACKEND_PID_FILE}"))." } stop_backend() { if ! is_backend_running; then echo "Backend is not running." rm -f "${BACKEND_PID_FILE}" return 0 fi local pid pid="$(cat "${BACKEND_PID_FILE}")" echo "Stopping backend (pid=${pid})" kill "${pid}" >/dev/null 2>&1 || true sleep 1 if kill -0 "${pid}" >/dev/null 2>&1; then echo "Backend did not stop gracefully, forcing..." kill -9 "${pid}" >/dev/null 2>&1 || true fi rm -f "${BACKEND_PID_FILE}" echo "Backend stopped." } start_stack() { "${DATABASES_SCRIPT}" start start_backend echo echo "Stack is ready." echo "UI: http://${HOST}:${PORT}" echo "Health: ${HEALTH_URL}" } stop_stack() { stop_backend "${DATABASES_SCRIPT}" stop } status_stack() { if is_backend_running; then echo "Backend: running (pid=$(cat "${BACKEND_PID_FILE}"))" else echo "Backend: stopped" fi "${DATABASES_SCRIPT}" status } logs_stack() { echo "=== Backend log (${BACKEND_LOG_FILE}) ===" if [[ -f "${BACKEND_LOG_FILE}" ]]; then sed -n '1,200p' "${BACKEND_LOG_FILE}" else echo "No backend log yet." fi echo echo "=== Databases logs ===" "${DATABASES_SCRIPT}" logs } usage() { cat <<'EOF' Usage: ./scripts/stack.sh <command> Commands: start Start db + metrics_db + backend stop Stop backend + databases restart Restart full stack status Show backend + database statuses logs Show backend + database logs EOF } main() { local command="${1:-}" case "${command}" in start) start_stack ;; stop) stop_stack ;; restart) stop_stack start_stack ;; status) status_stack ;; logs) logs_stack ;; *) usage exit 1 ;; esac } main "$@"