fix: improve pve start/restart commands with container readiness wait

- Add wait_for_containers() function that checks container health status
- Commands now wait up to 120 seconds for all containers to become healthy
- Improved error handling with better error messages
- Frontend container waits for app healthcheck before starting
- Users see clear progress messages instead of hanging indefinitely
- Fixes pve start and pve restart hanging issues
This commit is contained in:
markmorado
2026-04-29 22:25:11 +02:00
parent 297082dc72
commit ae41dacd0e

67
pve
View File

@@ -57,6 +57,39 @@ pve_dc() {
return $rc return $rc
} }
# ── Вспомогательная функция: ожидание готовности контейнеров ──────────────────
wait_for_containers() {
local timeout=120
local elapsed=0
local check_interval=5
info "Ожидание готовности контейнеров..."
while [ $elapsed -lt $timeout ]; do
# Проверяем, что все контейнеры запущены и healthy
local app_status=$(docker ps --filter "name=serverpanel-app" --format "{{.State}}")
local db_status=$(docker ps --filter "name=serverpanel-db" --format "{{.State}}")
local frontend_status=$(docker ps --filter "name=serverpanel-frontend" --format "{{.State}}")
if [ "$app_status" = "running" ] && [ "$db_status" = "running" ] && [ "$frontend_status" = "running" ]; then
# Проверяем healthcheck статусы
local app_health=$(docker inspect serverpanel-app --format='{{.State.Health.Status}}' 2>/dev/null)
local db_health=$(docker inspect serverpanel-db --format='{{.State.Health.Status}}' 2>/dev/null)
if [ "$app_health" = "healthy" ] && [ "$db_health" = "healthy" ]; then
ok "Все контейнеры готовы"
return 0
fi
fi
echo -n "."
sleep $check_interval
elapsed=$((elapsed + check_interval))
done
warn "Контейнеры не стали полностью готовы за $timeout секунд"
return 1
}
# ── Предусловия ─────────────────────────────────────────────────────────────── # ── Предусловия ───────────────────────────────────────────────────────────────
check_docker() { check_docker() {
docker info &>/dev/null || \ docker info &>/dev/null || \
@@ -72,13 +105,20 @@ check_pve_dir() {
cmd_start() { cmd_start() {
check_docker; check_pve_dir check_docker; check_pve_dir
step "Запуск панели" step "Запуск панели"
if pve_dc up -d; then if ! pve_dc up -d; then
die "Не удалось запустить панели контейнеры"
fi
wait_for_containers
if [ $? -ne 0 ]; then
warn "Контейнеры могут быть еще не полностью готовы. Проверьте логи:"
info " pve logs app"
info " pve logs db"
fi
ok "Панель запущена" ok "Панель запущена"
echo "" echo ""
pve_dc ps pve_dc ps
else
die "Не удалось запустить панель"
fi
} }
# ── pve stop ────────────────────────────────────────────────────────────────── # ── pve stop ──────────────────────────────────────────────────────────────────
@@ -96,16 +136,25 @@ cmd_restart() {
pve_dc down pve_dc down
step "Пересборка образа app (без кеша)" step "Пересборка образа app (без кеша)"
pve_dc build --no-cache app if ! pve_dc build --no-cache app; then
die "Не удалось пересобрать образ app"
fi
step "Запуск контейнеров" step "Запуск контейнеров"
if pve_dc up -d; then if ! pve_dc up -d; then
die "Не удалось запустить панель после пересборки"
fi
wait_for_containers
if [ $? -ne 0 ]; then
warn "Контейнеры могут быть еще не полностью готовы. Проверьте логи:"
info " pve logs app"
info " pve logs db"
fi
ok "Панель перезапущена" ok "Панель перезапущена"
echo "" echo ""
pve_dc ps pve_dc ps
else
die "Не удалось запустить панель после пересборки"
fi
} }
# ── pve update ──────────────────────────────────────────────────────────────── # ── pve update ────────────────────────────────────────────────────────────────