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:
2026-03-24 06:54:39 +03:00
parent ca3c786a6b
commit 68b6eaeac5
4 changed files with 135 additions and 77 deletions

160
setup.sh
View File

@@ -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
}