본문으로 건너뛰기

환경변수 가이드

.env.example 파일을 복사하여 설정합니다.

cp apps/web/.env.example apps/web/.env.local # 로컬 개발
cp apps/web/.env.example apps/web/.env.production # 프로덕션

1. Firebase 클라이언트 SDK

브라우저에 노출되는 공개 키입니다. Firebase 콘솔 > 프로젝트 설정 > 앱에서 확인.

변수용도발급처
NEXT_PUBLIC_FIREBASE_PROJECT_ID프로젝트 IDFirebase 콘솔
NEXT_PUBLIC_FIREBASE_API_KEYWeb API 키Firebase 콘솔
NEXT_PUBLIC_FIREBASE_AUTH_DOMAINAuth 도메인Firebase 콘솔
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKETStorage 버킷Firebase 콘솔
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_IDMessaging Sender IDFirebase 콘솔
NEXT_PUBLIC_FIREBASE_APP_ID앱 IDFirebase 콘솔

2. Firebase Admin SDK (서버 전용)

절대 브라우저에 노출 금지. Firebase 콘솔 > 서비스 계정 > 새 비공개 키 생성.

변수용도발급처
FB_ADMIN_PROJECT_ID프로젝트 ID서비스 계정 JSON
FB_ADMIN_CLIENT_EMAIL서비스 계정 이메일서비스 계정 JSON
FB_ADMIN_PRIVATE_KEY비공개 키서비스 계정 JSON

3. AI 기능 (Firebase AI Logic)

너홀로프로의 모든 AI 기능 — AI 서류 생성, 전략 분석, 대시보드 브리핑, 증거자료 요약 — 은 클라이언트에서 Firebase AI Logic (firebase/ai) 을 통해 Gemini 를 직접 호출합니다. 별도 환경변수 불필요 — 섹션 1 의 Firebase 클라이언트 SDK 설정만으로 동작합니다.

기능모델호출 위치
AI 서류 생성Gemini (Firebase AI Logic)클라이언트 (firebase/ai)
AI 전략 분석Gemini (Firebase AI Logic)클라이언트 (firebase/ai)
AI 대시보드 브리핑Gemini (Firebase AI Logic)클라이언트 (firebase/ai)
AI 증거자료 요약Gemini (Firebase AI Logic)클라이언트 (firebase/ai)

활성화 여부는 섹션 9 의 NEXT_PUBLIC_ENABLE_AI 와 Firestore appMetadata.features.ai.* 플래그로 제어합니다.

모델 교체 전략

현재 Firebase AI Logic 을 통해 Gemini 를 사용합니다. 향후 국산형 소버린 AI 가 출시되면 전환을 검토할 수 있습니다.

레거시 lib/llm/

이전 버전에는 서버 측 LLM 추상화 (lib/llm/) 와 LLM_PROVIDER, LLM_API_KEY, ANTHROPIC_API_KEY 환경변수가 존재했습니다. 현재 버전에서는 완전히 제거되었습니다 — CLAUDE.md 의 "Gemini 는 클라이언트에서만" 정책에 따라 모든 AI 호출이 Firebase AI Logic 으로 통합되었습니다.

4. 의뢰인 포털 세션

의뢰인 포털은 변호사가 전달한 4자리 접속 코드로 인증하며, 인증 성공 후 iron-session 암호화 쿠키로 세션을 유지합니다.

변수용도발급처
PORTAL_SESSION_SECRETiron-session 쿠키 암호화 키 (32자 이상)openssl rand -base64 32
  • 미설정 시 런타임 에러 발생 (필수 설정)
  • 외부 OAuth 공급자와 무관. 포털 본인확인은 접속 코드 단일 경로입니다.

5. 이메일 발송 (Resend)

직원 초대, 기일·항소기한 알림, 의뢰인 포털 메시지 도착 알림 (ADR 0025) 에 사용됩니다. 포털 의뢰인 인증 자체는 이메일을 쓰지 않습니다 — 변호사가 카카오/문자로 링크와 접속 코드를 직접 전달합니다. Next 앱은 lib/email/send.ts, Cloud Functions 는 functions/src/email.ts 를 통해 동일한 환경변수로 발송합니다 (cross-package import 불가로 의도적 중복).

변수위치용도발급처 / 기본값
RESEND_API_KEYfunctions Secret + apps/web envAPI 키 (re_로 시작)resend.com
RESEND_FROM_EMAILfunctions env + apps/web env발신 이메일Resend 도메인 인증 필요 (기본 noreply@pro.neohollo.com)
APP_BASE_URLfunctions env이메일 본문 deeplink base (Cloud Functions onPortalMessageCreated)https://pro.neohollo.com (기본)

미설정 시 이메일 발송 대신 서버 로그에 출력됩니다 (인앱 알림은 정상 작동).

6. 에러 모니터링 (Sentry)

변수용도발급처
NEXT_PUBLIC_SENTRY_DSNSentry DSNsentry.io
SENTRY_ORG소스맵 업로드용 (선택)sentry.io
SENTRY_PROJECT소스맵 업로드용 (선택)sentry.io
SENTRY_AUTH_TOKEN소스맵 업로드용 (선택)sentry.io

미설정 시 Sentry가 비활성화됩니다.

7. 결제 (토스페이먼츠)

현재 전환 예정 상태. 설정은 주석 처리되어 있습니다.

변수용도발급처
TOSS_CLIENT_KEY클라이언트 키 (전환 예정)developers.tosspayments.com
TOSS_SECRET_KEY시크릿 키 (전환 예정)동일
NEXT_PUBLIC_BASE_URL결제 콜백 URL프로덕션 도메인

8. 불만사항접수 (Slack 알림)

(workspace) 영역의 피드백 FAB 버튼으로 접수된 불만사항을 Slack 채널로 실시간 알림받습니다.

변수용도발급처
SLACK_FEEDBACK_WEBHOOK_URLSlack 수신 웹훅 URLSlack 앱 설정

미설정 시 Firestore에만 저장되고 Slack 알림은 발송되지 않습니다.

Slack 웹훅 설정 방법

  1. Slack API에 접속하여 Create New App > From scratch 선택
  2. 앱 이름(예: 너홀로프로 피드백)과 워크스페이스를 지정하고 생성
  3. 왼쪽 메뉴 OAuth & Permissions > Bot Token Scopes > Add an OAuth Scope > incoming-webhook 추가
  4. 왼쪽 메뉴 Incoming Webhooks 클릭 > Activate Incoming WebhooksOn으로 전환
  5. 하단 Add New Webhook to Workspace 클릭 > 알림 받을 채널(예: #피드백) 선택 > 허용
  6. 생성된 Webhook URL을 복사 (형태: https://hooks.slack.com/services/T.../B.../xxx)
  7. .env.local에 추가:
SLACK_FEEDBACK_WEBHOOK_URL=https://hooks.slack.com/services/T.../B.../xxx
  1. 앱을 재시작하면 피드백 제출 시 해당 채널에 알림이 전송됩니다

"봇 사용자가 없습니다" 오류가 발생하면? 3번 단계(OAuth & Permissions > Bot Token Scopes > incoming-webhook 추가)를 먼저 완료한 뒤 5번 단계를 진행하세요.

알림 형식

[불만사항접수] 버그
사무소: 법무법인 한빛 (tenant-abc123)
작성자: 김변호사
내용: 사건 상세 페이지에서 증거자료 탭이 로딩되지 않습니다...

프로덕션 배포

Firebase App Hosting 환경에서는 Secret Manager를 사용하세요:

firebase apphosting:secrets:set SLACK_FEEDBACK_WEBHOOK_URL

9. 개발 도구

변수용도기본값
NEXT_PUBLIC_USE_EMULATORFirebase 에뮬레이터 사용false
NEXT_PUBLIC_ENABLE_AIAI 기능 활성화false
NEXT_PUBLIC_RECAPTCHA_SITE_KEYreCAPTCHA v3 사이트 키-