feat: auto LAN auth + setup.sh dev command

- auth.ts: auto-allow localhost:3000-3010 + LAN_HOST for trustedOrigins
- setup.sh: new `dev` command (update + kill old processes + auto LAN IP + launch)
- next.config.ts: allowedDevOrigins for LAN HMR
This commit is contained in:
2026-03-24 03:24:14 +03:00
parent cbdd2fb2e4
commit f6f93c2ae9
4 changed files with 163 additions and 18 deletions

115
setup.sh
View File

@@ -6,6 +6,7 @@ set -uo pipefail
# ============================================================
# Usage:
# ./setup.sh — интерактивное меню
# ./setup.sh dev — обновить + запустить dev-сервер (auto LAN, kill old)
# ./setup.sh install — первоначальная установка
# ./setup.sh update — обновить проект (git pull + npm + prisma + rebuild)
# ./setup.sh doctor — диагностика и автоисправление
@@ -206,6 +207,7 @@ print_usage() {
echo -e " ${BOLD}Команды:${NC}"
echo -e " ${CYAN}install${NC} Первоначальная установка"
echo -e " ${CYAN}update${NC} Обновить проект (git pull + npm + prisma + rebuild)"
echo -e " ${CYAN}dev${NC} Обновить + запустить dev-сервер (auto LAN, kill old)"
echo -e " ${CYAN}doctor${NC} Диагностика и автоисправление проблем"
echo -e " ${CYAN}status${NC} Статус всех сервисов"
echo -e " ${CYAN}admin${NC} Создать администратора"
@@ -1266,6 +1268,86 @@ cmd_reset() {
echo ""
}
# ============================================================
# COMMAND: dev — обновить + запустить dev-сервер
# ============================================================
cmd_dev() {
log_step "Dev Server — обновление и запуск"
# 1. Git pull (без интерактива — stash автоматически)
log_step "1/6 — Обновление кода"
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
log_ok "Изменения сохранены в stash"
fi
git pull --rebase 2>&1 | tail -5
log_ok "git pull завершён"
fi
# 2. npm install (только если package-lock изменился)
log_step "2/6 — Зависимости"
npm install 2>&1 | tail -3
log_ok "npm install завершён"
# 3. Prisma
log_step "3/6 — Prisma"
npx prisma generate 2>&1 | tail -2
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 "Схема БД синхронизирована"
else
log_warn "PostgreSQL недоступен — миграция пропущена"
fi
# 4. Инфраструктурные контейнеры
log_step "4/6 — Контейнеры"
docker compose up -d postgres minio redis pgbouncer 2>&1 | tail -5
log_ok "Инфра-контейнеры запущены"
# 5. Убить старые процессы Next.js
log_step "5/6 — Очистка старых процессов"
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/6 — Очистка кеша"
[[ -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" && -z "$(env_get LAN_HOST)" ]]; then
log_info "LAN IP: ${lan_ip}"
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
# Запуск
echo ""
log_ok "${GREEN}${BOLD}Готово! Запускаю dev-сервер...${NC}"
echo ""
exec npm run dev
}
# ============================================================
# MAIN — Роутер команд
# ============================================================
@@ -1282,6 +1364,9 @@ case "$CMD" in
update)
cmd_update
;;
dev)
cmd_dev
;;
doctor|fix)
cmd_doctor
;;
@@ -1316,24 +1401,26 @@ case "$CMD" in
else
echo -e " ${BOLD}Что делаем?${NC}"
echo ""
echo -e " ${BOLD}1)${NC} ${CYAN}doctor${NC} — диагностика и исправление"
echo -e " ${BOLD}2)${NC} ${CYAN}update${NC}обновить проект"
echo -e " ${BOLD}3)${NC} ${CYAN}status${NC}статус сервисов"
echo -e " ${BOLD}4)${NC} ${CYAN}admin${NC} создать администратора"
echo -e " ${BOLD}5)${NC} ${CYAN}restart${NC}перезапуск контейнеров"
echo -e " ${BOLD}6)${NC} ${CYAN}install${NC} — полная переустановка"
echo -e " ${BOLD}7)${NC} ${CYAN}reset${NC} сброс всего"
echo -e " ${BOLD}1)${NC} ${CYAN}dev${NC} ${GREEN}обновить + запустить dev-сервер${NC}"
echo -e " ${BOLD}2)${NC} ${CYAN}doctor${NC}диагностика и исправление"
echo -e " ${BOLD}3)${NC} ${CYAN}update${NC}обновить проект"
echo -e " ${BOLD}4)${NC} ${CYAN}status${NC}статус сервисов"
echo -e " ${BOLD}5)${NC} ${CYAN}admin${NC} создать администратора"
echo -e " ${BOLD}6)${NC} ${CYAN}restart${NC} — перезапуск контейнеров"
echo -e " ${BOLD}7)${NC} ${CYAN}install${NC} — полная переустановка"
echo -e " ${BOLD}8)${NC} ${CYAN}reset${NC}сброс всего"
echo ""
ask "Выбери действие" "1" CHOICE
case "$CHOICE" in
1|doctor) cmd_doctor ;;
2|update) cmd_update ;;
3|status) cmd_status ;;
4|admin) cmd_admin ;;
5|restart) cmd_restart ;;
6|install) cmd_install ;;
7|reset) cmd_reset ;;
1|dev) cmd_dev ;;
2|doctor) cmd_doctor ;;
3|update) cmd_update ;;
4|status) cmd_status ;;
5|admin) cmd_admin ;;
6|restart) cmd_restart ;;
7|install) cmd_install ;;
8|reset) cmd_reset ;;
*) log_err "Неизвестный выбор: ${CHOICE}"; print_usage ;;
esac
fi