환경 변수
이 문서로 해결할 질문
- Kafka Consumer에 필요한 환경 변수는 무엇인가요?
- OpenAI·공공데이터 API 키는 어디서 쓰이나요?
- producer와 공유하는 DB·Kafka 변수는 어떻게 맞추나요?
개요
Consumer 패키지는 Kafka Consumer와 배치 워커를 실행합니다. 환경 변수 파일은 호스트에서는 server/consumer/.env.local, Docker에서는 server/consumer/.env.docker.local을 사용합니다.
cp server/consumer/.env.example server/consumer/.env.local
부팅 시 server/consumer/.../env.validation.ts의 Joi 스키마로 모든 변수가 필수인지 검증합니다.
METRICS_ENABLED=true이면 METRICS_PORT에서 별도로 /metrics 엔드포인트를 노출합니다.
Docker Compose
DOCKERHUB_USERNAME
| 항목 | 내용 |
|---|---|
| 설명 | Docker Hub 계정명. Compose image 필드 ${DOCKERHUB_USERNAME}/mealio-consumer:latest 치환에 사용 |
| 예시 | your-dockerhub-username |
| 사용처 | docker/consumer/compose.yml services.consumer.image |
| 패턴 | Compose가 image 태그를 해석하거나 Docker Hub에 Push |
MEMORY_LIMIT
| 항목 | 내용 |
|---|---|
| 설명 | consumer 컨테이너 메모리 limit (deploy.resources.limits.memory) |
| 예시 | 1G |
| 사용처 | docker/consumer/compose.yml |
공통
APP_ENV
| 항목 | 내용 |
|---|---|
| 설명 | 배포 환경 식별자 |
| 허용값 | local, development, production, test |
| 사용처 | @mealio/shared Sentry 초기화, 로그 컨텍스트 |
데이터·메시징
POSTGRESQL_URL, MONGODB_URL, REDIS_URL, KAFKA_BROKERS, KAFKA_CLIENT_ID는 producer 환경 변수와 동일한 연결 정보를 사용합니다. 호스트/Docker 호스트명만 환경에 맞게 바꿉니다.
| 변수 | consumer 전용 차이 |
|---|---|
KAFKA_CLIENT_ID | 예: mealio-consumer (producer와 구분) |
POSTGRESQL_URL
| 항목 | 내용 |
|---|---|
| 설명 | Prisma — Recipe·추천·크레딧·pgvector |
| 사용처 | server/consumer/.../repositories/postgresql/ |
MONGODB_URL
| 항목 | 내용 |
|---|---|
| 설명 | EventLog·ChatbotLog·ingestion job 문서 |
| 사용처 | Mongoose 스키마 모듈 |
REDIS_URL
| 항목 | 내용 |
|---|---|
| 설명 | Handler 캐시·챗봇 스트림 이벤트 발행 |
| 예시 (로컬) | redis://:devpassword@localhost:6379 |
| 예시 (Compose 앱) | redis://:devpassword@redis:6379 |
| 사용처 | @mealio/shared Redis 모듈 |
KAFKA_BROKERS / KAFKA_CLIENT_ID
| 항목 | 내용 |
|---|---|
| 설명 | Consumer 구독·내부 Producer(cache-invalidation 등) 브로커 연결 |
| 사용처 | server/consumer/.../integrations/kafka/ |
OpenAI
OPENAI_API_KEY
| 항목 | 내용 |
|---|---|
| 설명 | GPT Chat Completions·Embedding·Batch API 인증 |
| 사용처 | server/consumer/.../integrations/openai/ |
OPENAI_CHAT_MODEL
| 항목 | 내용 |
|---|---|
| 설명 | 챗봇 Function Calling 모델 |
| 사용처 | ProcessChatHandler |
OPENAI_TITLE_MODEL
| 항목 | 내용 |
|---|---|
| 설명 | chatbot.start 시 대화 제목 생성 모델 |
| 사용처 | SyncConversationMetaHandler |
OPENAI_QUERY_EXPANSION_MODEL
| 항목 | 내용 |
|---|---|
| 설명 | search_recipes Query Expansion 모델 |
| 사용처 | RecipeSearchQueryExpansionService |
OPENAI_EMBEDDING_MODEL
| 항목 | 내용 |
|---|---|
| 설명 | search_recipes 질의 임베딩 + recipe ingestion persist 시 RecipeEmbedding 업서트 |
| 사용처 | integrations/openai/openai.service.ts, recipe-ingestion-embed-submit/integrations/recipe-embedding-document.integration.ts, recipe-ingestion-embed-retrieve/services/embed-retrieve.service.ts, SearchRecipesHandler |
OPENAI_BATCH_MODEL
| 항목 | 내용 |
|---|---|
| 설명 | recipe ingestion submit 배치 변환 |
| 사용처 | recipe-ingestion-parse-submit job |
OpenAI 변수는 챗봇, 레시피 수집, 레시피 임베딩 문서에서 사용처를 확인할 수 있습니다.
공공데이터 (레시피 수집)
PUBLIC_DATA_API_KEY
| 항목 | 내용 |
|---|---|
| 설명 | 식약처 조리식품 레시피 DB API 키 |
| 사용처 | recipe-ingestion-fetch job |
Recipe 이미지 재호스팅 (S3)
AWS_REGION
| 항목 | 내용 |
|---|---|
| 설명 | S3 클라이언트 리전 |
| 예시 | ap-northeast-2 |
| 사용처 | integrations/storage/storage.module.ts |
S3_RECIPE_IMAGES_BUCKET
| 항목 | 내용 |
|---|---|
| 설명 | 레시피 이미지 업로드 버킷 |
| 사용처 | integrations/storage/s3-uploader.service.ts |
RECIPE_IMAGES_CDN_BASE_URL
| 항목 | 내용 |
|---|---|
| 설명 | 업로드 후 DB에 저장할 CDN base URL (trailing slash 제거 후 key 결합) |
| 예시 | https://cdn.example.com |
| 사용처 | integrations/storage/s3-uploader.service.ts |
RECIPE_IMAGE_REHOST_ENABLED
| 항목 | 내용 |
|---|---|
| 설명 | persist 시 식약처 이미지 S3 재호스팅 여부 |
| 패턴 | optional boolean, 기본 true. 로컬에서는 false로 스킵 가능 |
| 사용처 | recipe-ingestion-persist/domains/recipe-image-rehost.domain.ts |
AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY
| 항목 | 내용 |
|---|---|
| 설명 | 로컬·비-IAM 환경에서 S3 업로드용 AWS 자격 증명 (SDK 기본 credential chain) |
| 패턴 | optional. RECIPE_IMAGE_REHOST_ENABLED=true일 때 필요 |
| 권한 | 대상 버킷 s3:PutObject |
| 사용처 | @aws-sdk/client-s3 (env로 자동 주입, Joi 필수 아님) |
관측성
METRICS_ENABLED / METRICS_PORT
| 항목 | 내용 |
|---|---|
| 설명 | Prometheus /metrics 노출 여부와 포트 |
| 패턴 | METRICS_ENABLED=true일 때 METRICS_PORT 필수 (예: 9101) |
| 사용처 | server/consumer/.../metrics-exporter.service.ts |
SLOW_QUERY_THRESHOLD_MS
| 항목 | 내용 |
|---|---|
| 설명 | Prisma/Mongoose 슬로우 쿼리 감지 임계값(ms) |
| 예시 | 500 |
| 패턴 | METRICS_ENABLED=true일 때 필수. 양의 정수 |
| 사용처 | @mealio/shared observability.config.ts |
PUSHGATEWAY_URL
| 항목 | 내용 |
|---|---|
| 설명 | recipe-ingestion CLI batch job 종료 시 Prometheus 메트릭 push 대상 (optional) |
| 예시 (호스트 CLI) | http://localhost:9091 |
| 예시 (Compose 내부) | http://pushgateway:9091 |
| 사용처 | server/consumer/.../metrics-push.ts |
| 패턴 | 미설정 시 push skip — CLI job 동작에는 영향 없음. METRICS_ENABLED=true일 때만 push |
SENTRY_ENABLED / SENTRY_DSN_CONSUMER
| 항목 | 내용 |
|---|---|
| 설명 | Consumer 프로세스 Sentry 에러 리포팅 |
| 패턴 | SENTRY_ENABLED=true 이고 DSN이 있을 때만 활성화 |
| 사용처 | @mealio/shared sentry.config.ts |