docs: update CLAUDE.md, README.md, PROMPT.md, setup.sh per post-change checklist
- Prisma 7 notes: adapter-pg, no url in schema - README: setup.sh commands, first admin auto-assign, pgbouncer in docker - PROMPT.md: Prisma 7 adapter-pg description - setup.sh dev: reordered (kill first, containers before prisma, healthchecks)
This commit is contained in:
160
setup.sh
160
setup.sh
@@ -1325,8 +1325,35 @@ cmd_reset() {
|
||||
cmd_dev() {
|
||||
log_step "Dev Server — обновление и запуск"
|
||||
|
||||
# 1. Git pull (без интерактива — stash автоматически)
|
||||
log_step "1/7 — Обновление кода"
|
||||
# 1. Убить старые процессы Next.js + освободить порт 3000
|
||||
log_step "1/8 — Очистка старых процессов"
|
||||
local killed=0
|
||||
# Убить все процессы next
|
||||
for pid in $(pgrep -f "next dev" 2>/dev/null || true); do
|
||||
kill -9 "$pid" 2>/dev/null && ((killed++)) || true
|
||||
done
|
||||
for pid in $(pgrep -f "next-server" 2>/dev/null || true); do
|
||||
kill -9 "$pid" 2>/dev/null && ((killed++)) || true
|
||||
done
|
||||
# Убить всё на портах 3000-3005
|
||||
for p in $(seq 3000 3005); do
|
||||
local port_pid
|
||||
port_pid=$(lsof -ti :"$p" 2>/dev/null || true)
|
||||
if [[ -n "$port_pid" ]]; then
|
||||
kill -9 $port_pid 2>/dev/null && ((killed++)) || true
|
||||
fi
|
||||
done
|
||||
# Удалить lock-файл Next.js
|
||||
rm -rf .next/dev 2>/dev/null || true
|
||||
if [[ $killed -gt 0 ]]; then
|
||||
log_ok "Убито процессов: $killed"
|
||||
sleep 1
|
||||
else
|
||||
log_ok "Старых процессов нет"
|
||||
fi
|
||||
|
||||
# 2. Git pull (без интерактива — stash автоматически)
|
||||
log_step "2/8 — Обновление кода"
|
||||
if [[ -d .git ]]; then
|
||||
if ! git diff --quiet 2>/dev/null || ! git diff --cached --quiet 2>/dev/null; then
|
||||
git stash push -m "auto-stash before dev $(date +%Y%m%d_%H%M%S)" 2>&1
|
||||
@@ -1336,14 +1363,48 @@ cmd_dev() {
|
||||
log_ok "git pull завершён"
|
||||
fi
|
||||
|
||||
# 2. npm install
|
||||
log_step "2/7 — Зависимости"
|
||||
# 3. npm install
|
||||
log_step "3/8 — Зависимости"
|
||||
npm install 2>&1 | tail -3
|
||||
log_ok "npm install завершён"
|
||||
|
||||
# 3. Prisma
|
||||
log_step "3/7 — Prisma"
|
||||
# 4. Prisma generate (не требует БД)
|
||||
log_step "4/8 — Prisma generate"
|
||||
npx prisma generate 2>&1 | tail -2
|
||||
log_ok "Prisma Client сгенерирован"
|
||||
|
||||
# 5. Контейнеры + ожидание здоровья
|
||||
log_step "5/8 — Контейнеры"
|
||||
docker compose up -d postgres minio redis pgbouncer 2>&1 | tail -5
|
||||
log_ok "Инфра-контейнеры запущены"
|
||||
|
||||
# Ждём PostgreSQL (макс 30 сек)
|
||||
local waited=0
|
||||
while [[ $waited -lt 30 ]]; do
|
||||
if docker compose exec -T postgres pg_isready -U postgres &>/dev/null; then
|
||||
log_ok "PostgreSQL ready"
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
waited=$((waited + 2))
|
||||
done
|
||||
if [[ $waited -ge 30 ]]; then
|
||||
log_warn "PostgreSQL не готов за 30 сек — продолжаю"
|
||||
fi
|
||||
|
||||
# Ждём Redis (макс 10 сек)
|
||||
waited=0
|
||||
while [[ $waited -lt 10 ]]; do
|
||||
if docker compose exec -T redis redis-cli ping 2>/dev/null | grep -q PONG; then
|
||||
log_ok "Redis ready"
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
waited=$((waited + 1))
|
||||
done
|
||||
|
||||
# 6. Prisma db push (теперь БД точно запущена)
|
||||
log_step "6/8 — Синхронизация схемы БД"
|
||||
if docker compose exec -T postgres pg_isready -U postgres &>/dev/null; then
|
||||
npx prisma db push --skip-generate --accept-data-loss 2>&1 | tail -3
|
||||
log_ok "Схема БД синхронизирована"
|
||||
@@ -1351,62 +1412,8 @@ cmd_dev() {
|
||||
log_warn "PostgreSQL недоступен — миграция пропущена"
|
||||
fi
|
||||
|
||||
# 4. Инфраструктурные контейнеры
|
||||
log_step "4/7 — Контейнеры"
|
||||
docker compose up -d postgres minio redis pgbouncer 2>&1 | tail -5
|
||||
log_ok "Инфра-контейнеры запущены"
|
||||
|
||||
# Ждём здоровья сервисов (макс 30 сек)
|
||||
log_info "Ожидаю готовности сервисов..."
|
||||
local waited=0
|
||||
while [[ $waited -lt 30 ]]; do
|
||||
local all_ok=true
|
||||
for svc in postgres redis pgbouncer; do
|
||||
local st
|
||||
st=$(check_service "$svc")
|
||||
if [[ "$st" != "ok" ]]; then
|
||||
all_ok=false
|
||||
break
|
||||
fi
|
||||
done
|
||||
if $all_ok; then
|
||||
log_ok "Все сервисы healthy"
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
waited=$((waited + 2))
|
||||
done
|
||||
if [[ $waited -ge 30 ]]; then
|
||||
log_warn "Таймаут ожидания — некоторые сервисы могут быть unhealthy"
|
||||
log_info "Запусти ./setup.sh doctor для диагностики"
|
||||
fi
|
||||
|
||||
# 5. Убить старые процессы Next.js
|
||||
log_step "5/7 — Очистка старых процессов"
|
||||
local killed=0
|
||||
for pid in $(pgrep -f "next dev" 2>/dev/null || true); do
|
||||
kill "$pid" 2>/dev/null && ((killed++)) || true
|
||||
done
|
||||
# Убить процесс на порту 3000
|
||||
local port_pid
|
||||
port_pid=$(lsof -ti :3000 2>/dev/null || true)
|
||||
if [[ -n "$port_pid" ]]; then
|
||||
kill "$port_pid" 2>/dev/null && ((killed++)) || true
|
||||
fi
|
||||
if [[ $killed -gt 0 ]]; then
|
||||
log_ok "Убито процессов: $killed"
|
||||
sleep 1
|
||||
else
|
||||
log_ok "Старых процессов нет"
|
||||
fi
|
||||
|
||||
# 6. Очистка .next кеша
|
||||
log_step "6/7 — Очистка кеша"
|
||||
[[ -d ".next" ]] && rm -rf .next
|
||||
log_ok "Кеш очищен"
|
||||
|
||||
# 7. MinIO bucket
|
||||
log_step "7/7 — MinIO bucket"
|
||||
log_step "7/8 — MinIO bucket"
|
||||
local bucket
|
||||
bucket=$(env_get S3_BUCKET)
|
||||
bucket="${bucket:-liveserver}"
|
||||
@@ -1416,6 +1423,15 @@ cmd_dev() {
|
||||
local minio_pass
|
||||
minio_pass=$(env_get MINIO_ROOT_PASSWORD)
|
||||
minio_pass="${minio_pass:-minioadmin}"
|
||||
# Ждём MinIO (макс 15 сек)
|
||||
waited=0
|
||||
while [[ $waited -lt 15 ]]; do
|
||||
if docker compose exec -T minio mc alias set local http://localhost:9000 "$minio_user" "$minio_pass" &>/dev/null; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
waited=$((waited + 1))
|
||||
done
|
||||
if docker compose exec -T minio mc alias set local http://localhost:9000 "$minio_user" "$minio_pass" &>/dev/null; then
|
||||
if docker compose exec -T minio mc ls "local/${bucket}" &>/dev/null; then
|
||||
log_ok "Bucket '${bucket}' существует"
|
||||
@@ -1428,9 +1444,29 @@ cmd_dev() {
|
||||
log_warn "MinIO ещё не готов — bucket создастся при следующем запуске"
|
||||
fi
|
||||
|
||||
# 8. Очистка .next кеша
|
||||
log_step "8/8 — Очистка кеша"
|
||||
[[ -d ".next" ]] && rm -rf .next
|
||||
log_ok "Кеш очищен"
|
||||
|
||||
# Автоопределение LAN IP для auth
|
||||
local lan_ip
|
||||
lan_ip=$(hostname -I 2>/dev/null | awk '{print $1}' || true)
|
||||
if [[ -n "$lan_ip" ]]; then
|
||||
if ! grep -q "^LAN_HOST=" .env 2>/dev/null; then
|
||||
echo "LAN_HOST=${lan_ip}" >> .env
|
||||
log_ok "LAN_HOST=${lan_ip} добавлен в .env"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Проверка порта 3000
|
||||
if lsof -ti :3000 &>/dev/null; then
|
||||
log_warn "Порт 3000 всё ещё занят — Next.js выберет другой"
|
||||
fi
|
||||
|
||||
# Запуск
|
||||
echo ""
|
||||
log_ok "${GREEN}${BOLD}Готово! Запускаю dev-сервер...${NC}"
|
||||
log_ok "${GREEN}${BOLD}Готово! Запускаю dev-сервер на порту 3000...${NC}"
|
||||
echo ""
|
||||
exec npm run dev
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user