환경변수 가이드
.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 | 프로젝트 ID | Firebase 콘솔 |
NEXT_PUBLIC_FIREBASE_API_KEY | Web API 키 | Firebase 콘솔 |
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN | Auth 도메인 | Firebase 콘솔 |
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET | Storage 버킷 | Firebase 콘솔 |
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID | Messaging Sender ID | Firebase 콘솔 |
NEXT_PUBLIC_FIREBASE_APP_ID | 앱 ID | Firebase 콘솔 |
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_SECRET | iron-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_KEY | functions Secret + apps/web env | API 키 (re_로 시작) | resend.com |
RESEND_FROM_EMAIL | functions env + apps/web env | 발신 이메일 | Resend 도메인 인증 필요 (기본 noreply@pro.neohollo.com) |
APP_BASE_URL | functions env | 이메일 본문 deeplink base (Cloud Functions onPortalMessageCreated) | https://pro.neohollo.com (기본) |
미설정 시 이메일 발송 대신 서버 로그에 출력됩니다 (인앱 알림은 정상 작동).
6. 에러 모니터링 (Sentry)
| 변수 | 용도 | 발급처 |
|---|---|---|
NEXT_PUBLIC_SENTRY_DSN | Sentry DSN | sentry.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_URL | Slack 수신 웹훅 URL | Slack 앱 설정 |
미설정 시 Firestore에만 저장되고 Slack 알림은 발송되지 않습니다.
Slack 웹훅 설정 방법
- Slack API에 접속하여 Create New App > From scratch 선택
- 앱 이름(예:
너홀로프로 피드백)과 워크스페이스를 지정하고 생성 - 왼쪽 메뉴 OAuth & Permissions > Bot Token Scopes > Add an OAuth Scope >
incoming-webhook추가 - 왼쪽 메뉴 Incoming Webhooks 클릭 > Activate Incoming Webhooks를 On으로 전환
- 하단 Add New Webhook to Workspace 클릭 > 알림 받을 채널(예:
#피드백) 선택 > 허용 - 생성된 Webhook URL을 복사 (형태:
https://hooks.slack.com/services/T.../B.../xxx) .env.local에 추가:
SLACK_FEEDBACK_WEBHOOK_URL=https://hooks.slack.com/services/T.../B.../xxx
- 앱을 재시작하면 피드백 제출 시 해당 채널에 알림이 전송됩니다
"봇 사용자가 없습니다" 오류가 발생하면? 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_EMULATOR | Firebase 에뮬레이터 사용 | false |
NEXT_PUBLIC_ENABLE_AI | AI 기능 활성화 | false |
NEXT_PUBLIC_RECAPTCHA_SITE_KEY | reCAPTCHA v3 사이트 키 | - |