diff --git a/docker-compose.yml b/docker-compose.yml index ac5f2228..749b379e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -135,6 +135,10 @@ services: REALTIME_LISTEN_ADDR: :38020 REALTIME_RABBITMQ_URL: amqp://${RABBITMQ_USER:-stackup}:${RABBITMQ_PASSWORD:-stackup}@rabbitmq:38050/ REALTIME_LOG_LEVEL: ${REALTIME_LOG_LEVEL:-info} + REALTIME_JWT_SECRET: ${JWT_SECRET:-} + REALTIME_CORE_BASE_URL: ${CORE_INTERNAL_BASE_URL:-http://backend:38010} + REALTIME_INTERNAL_API_KEY: ${CORE_INTERNAL_API_KEY:-local-development-internal-api-key} + REALTIME_WS_WRITE_TIMEOUT: ${REALTIME_WS_WRITE_TIMEOUT:-10s} depends_on: rabbitmq: condition: service_healthy diff --git a/realtime/.env.example b/realtime/.env.example index 64ca4f74..f39c2a3f 100644 --- a/realtime/.env.example +++ b/realtime/.env.example @@ -5,7 +5,11 @@ REALTIME_QUEUE_NAME=q.realtime.session.notify REALTIME_SSE_PING_INTERVAL=30s REALTIME_SSE_SLOW_CONSUMER_TIMEOUT=5s REALTIME_SSE_BUFFER_SIZE=16 -REALTIME_JWT_SECRET=change-me-in-prod -REALTIME_CORE_BASE_URL=http://localhost:38080 -REALTIME_INTERNAL_API_KEY=change-me-internal-key +# 아래 3개는 Core 와 공유하는 값. 반드시 Core 와 동일하게 맞출 것. +# - REALTIME_JWT_SECRET == Core JWT_SECRET (stream 토큰 검증 키; 불일치 시 SSE/WS 인증 401) +# - REALTIME_INTERNAL_API_KEY == Core CORE_INTERNAL_API_KEY (WS 답변 프록시; AI 서버도 공유) +# - REALTIME_CORE_BASE_URL == Core 내부 REST 주소 (compose 내부에서는 http://backend:38010) +REALTIME_JWT_SECRET=local-development-jwt-secret-must-be-replaced +REALTIME_CORE_BASE_URL=http://localhost:38010 +REALTIME_INTERNAL_API_KEY=local-development-internal-api-key REALTIME_WS_WRITE_TIMEOUT=10s diff --git a/realtime/CLAUDE.md b/realtime/CLAUDE.md index 416057b9..73ee1037 100644 --- a/realtime/CLAUDE.md +++ b/realtime/CLAUDE.md @@ -151,9 +151,9 @@ Heartbeat (proxy keepalive): | `REALTIME_SSE_PING_INTERVAL` | `30s` | SSE heartbeat 주기 | | `REALTIME_SSE_SLOW_CONSUMER_TIMEOUT` | `5s` | 구독자 send timeout | | `REALTIME_SSE_BUFFER_SIZE` | `16` | 구독자별 채널 버퍼 | -| `REALTIME_JWT_SECRET` | `change-me-in-prod` | Stream 토큰 검증 키 소스 (Core `JWT_SECRET`과 동일값. 키 = `SHA-256(secret)`, HS256) | -| `REALTIME_CORE_BASE_URL` | `http://localhost:38080` | Core 내부 REST base URL (WS 답변 프록시) | -| `REALTIME_INTERNAL_API_KEY` | `change-me-internal-key` | Core 내부 API 호출용 `X-Internal-API-Key` | +| `REALTIME_JWT_SECRET` | `local-development-jwt-secret-must-be-replaced` | **Core `JWT_SECRET`과 동일값 필수** (Stream 토큰 검증 키. 키=`SHA-256(secret)`, HS256). 불일치 시 SSE/WS 인증 401 | +| `REALTIME_CORE_BASE_URL` | `http://localhost:38010` | Core 내부 REST base URL (WS 답변 프록시). compose 내부는 `http://backend:38010` | +| `REALTIME_INTERNAL_API_KEY` | `local-development-internal-api-key` | **Core `CORE_INTERNAL_API_KEY`와 동일값 필수** (AI 서버도 공유). `X-Internal-API-Key` | | `REALTIME_WS_WRITE_TIMEOUT` | `10s` | WS write 타임아웃 | --- diff --git a/realtime/internal/config/config.go b/realtime/internal/config/config.go index ef32a9b8..643f77e6 100644 --- a/realtime/internal/config/config.go +++ b/realtime/internal/config/config.go @@ -11,9 +11,9 @@ type Config struct { RabbitMQURL string `env:"REALTIME_RABBITMQ_URL" envDefault:"amqp://stackup:stackup@localhost:38050/"` LogLevel string `env:"REALTIME_LOG_LEVEL" envDefault:"info"` QueueName string `env:"REALTIME_QUEUE_NAME" envDefault:"q.realtime.session.notify"` - JWTSecret string `env:"REALTIME_JWT_SECRET" envDefault:"change-me-in-prod"` - CoreBaseURL string `env:"REALTIME_CORE_BASE_URL" envDefault:"http://localhost:38080"` - InternalApiKey string `env:"REALTIME_INTERNAL_API_KEY" envDefault:"change-me-internal-key"` + JWTSecret string `env:"REALTIME_JWT_SECRET" envDefault:"local-development-jwt-secret-must-be-replaced"` + CoreBaseURL string `env:"REALTIME_CORE_BASE_URL" envDefault:"http://localhost:38010"` + InternalApiKey string `env:"REALTIME_INTERNAL_API_KEY" envDefault:"local-development-internal-api-key"` WSWriteTimeout time.Duration `env:"REALTIME_WS_WRITE_TIMEOUT" envDefault:"10s"` SSEPingInterval time.Duration `env:"REALTIME_SSE_PING_INTERVAL" envDefault:"30s"` SSESlowConsumerTimeout time.Duration `env:"REALTIME_SSE_SLOW_CONSUMER_TIMEOUT" envDefault:"5s"`