Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 7 additions & 3 deletions realtime/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -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
6 changes: 3 additions & 3 deletions realtime/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 타임아웃 |

---
Expand Down
6 changes: 3 additions & 3 deletions realtime/internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down