9b4fe40 이 개발 전용 자동 로그인을 지우면서 빌더 2단계가 막다른 길이 됐다.
로그인한 적도 없는 사람에게 "로그인이 만료되었습니다" 라고 쓰고, 그 화면에는
로그인으로 갈 링크가 없다. 실측(킹서버): 계정이 DB 에 0개라 아무도 통과 못 했다.
- lib/autoSession.ts: 옛 devSession 을 되살리되 `import.meta.env.DEV` 게이트를 뺐다.
운영 번들에서도 돌아야 한다 — 대신 VITE_AUTO_LOGIN_ID·PW 가 **둘 다** 있을 때만
움직이고 기본값은 없다. 진행 중인 로그인을 하나의 약속으로 공유하는 구조는 그대로
가져왔다: 훅 안에만 두면 로그인 전에 누른 검색이 토큰 없이 나가 '만료'로 떨어진다.
- usePlaceSearch: 검색 전에 그 약속을 기다린다(경합을 만료로 오인하던 자리).
- Dockerfile·compose: VITE_* 는 번들에 구워지므로 build args 다. 값을 바꾸면
`./deploy.sh solution-site` 로 다시 굽는다.
⚠️ 계정이 번들에 그대로 들어간다. 내부 테스트 호스트 전용이고, 사장님에게 열기 전에
AUTO_LOGIN_* 을 비우고 재빌드해야 한다.
tsc --noEmit · eslint 통과
59 lines
2.5 KiB
Plaintext
59 lines
2.5 KiB
Plaintext
# cp .env.example .env 후 값을 채운다. .env 는 커밋되지 않는다.
|
|
# 우선순위: 실제 환경변수(compose) > .env > 코드 기본값(config_models.py)
|
|
|
|
# ── 공통 solution/backend · admin/backend (server_configs 가 읽는다)
|
|
APP_ENV=local
|
|
|
|
DB_HOST=127.0.0.1
|
|
DB_PORT=5432
|
|
DB_USER=postgres
|
|
DB_PASSWORD=
|
|
DB_NAME=web4ai_db
|
|
|
|
# 비우면 토큰 서명이 안 된다
|
|
# 생성: python -c "import secrets; print(secrets.token_urlsafe(48))"
|
|
JWT_ACCESS_SECRET=
|
|
JWT_REFRESH_SECRET=
|
|
|
|
# 키가 비면 그 어댑터만 꺼진다. 서버는 뜬다.
|
|
PERPLEXITY_API_KEY=
|
|
COLLECT_USE_PERPLEXITY=0 # Perplexity 채널 발견. 0=끔(기본)
|
|
NAVER_CLIENT_ID=
|
|
NAVER_CLIENT_SECRET=
|
|
KAKAO_REST_API_KEY= # 미발급. 없으면 네이버 지역검색을 쓴다
|
|
GEMINI_API_KEY=
|
|
TOUR_API_KEY= # 디코딩된 키(인코딩 키는 이중 인코딩된다)
|
|
|
|
# CORS 허용 오리진. 쉼표로 여럿.
|
|
# 서버에 올리면 반드시 적는다. 안 적으면 화면은 뜨고 API 만 막힌다.
|
|
# CLIENT_URL=http://172.30.1.36:30031,http://localhost:3002
|
|
# LANDING_URL=
|
|
|
|
# ── solution/frontend 브라우저가 부르는 주소 (compose 가 VITE_* 로 주입)
|
|
# ★ 브라우저가 부르는 주소다. 서버에 올리면 localhost 는 즉시 틀린다.
|
|
# PUBLIC_API_BASE_URL=http://localhost:9800
|
|
# PUBLIC_WEB_BASE_URL=http://localhost:3000
|
|
|
|
# ── solution/site 발행물 — solution/backend 도 같이 본다
|
|
# canonical·og:url·sitemap·IndexNow 가 전부 SITE_PUBLIC_HOST 를 쓴다.
|
|
SITE_PUBLIC_HOST=w4ai.o2o.kr
|
|
INDEXNOW_KEY= # 비우면 색인 통보를 건너뛴다(발행은 정상)
|
|
AZURE_STORAGE_CONNECTION_STRING= # 비우면 로컬 발행만 한다
|
|
AZURE_STORAGE_CONTAINER=
|
|
AZURE_STORAGE_PREFIX=
|
|
|
|
# ── compose 포트 매핑
|
|
# 비우면 로컬 기본값. 서버 값은 docs/SERVERS.md
|
|
# SITE_HTTP_PORT=80 # 발행 사이트
|
|
# WEB_PORT=3000 # 사장님 앱
|
|
# API_PORT=9800 # 사장님 API
|
|
# ADMIN_PORT=3002 # 내부 화면 (bind 127.0.0.1)
|
|
# ADMIN_API_PORT_PUBLIC=9801 # 내부 API (bind 127.0.0.1)
|
|
|
|
# 자동 로그인 — 위저드 앞에 로그인 화면을 세우지 않으려고 세션을 미리 잡는다.
|
|
# ⚠️ 이 값은 **프론트 번들에 구워진다.** 페이지를 연 사람은 누구나 JS 에서 읽는다 —
|
|
# 내부 테스트 호스트에서만 채우고, 사장님에게 여는 순간 비운다(lib/autoSession.ts).
|
|
# ★ 바꾸면 재빌드해야 한다: ./deploy.sh solution-site
|
|
AUTO_LOGIN_ID=
|
|
AUTO_LOGIN_PW=
|