# ============================================================================== # docker/nats.conf — MAM 원격 프로덕션 브로커 (Track 1R) # # 정본 문서: PRIVATE_SERVER.md §9.1 # 시크릿: 이 파일에는 없습니다. 모든 password 는 docker/.env → compose # environment → 컨테이너 환경변수로 주입되는 $VAR 참조입니다. # # ⚠ 암호 문자 제약: NATS 는 환경변수 값을 자체 설정 렉서로 재파싱합니다. # 암호에 [공백 ; , ] } # ' " $] 가 들어가면 설정이 깨지거나 다르게 해석됩니다. # 반드시 `openssl rand -base64 32` (알파벳 A-Za-z0-9+/=) 를 사용하십시오. # ============================================================================== server_name: mam-hub # ── JetStream: MQTT retained/QoS1 저장소. 종료 이벤트 재수신이 여기에 의존 ── jetstream { store_dir: "/data" # 절대경로 고정. '~' 도 인용된 "$HOME" 도 확장되지 않음 max_file: 10G # 접미사는 대문자만 유효 (K/M/G/T) max_mem: 256M } http_port: 8222 # 무인증 모니터링 → 호스트 게시는 loopback 한정 (compose) mqtt { port: 1883 ack_wait: 60s # WAN RTT 흡수 (기본 30s) max_ack_pending: 1024 # 다중 에이전트 동시 발행 여유 (상한 65535) } websocket { port: 8080 no_tls: true # 사설망/tailnet 한정. 생략하면 TLS 설정 필수라 기동 실패 # ── 원점(Origin) 정책 ──────────────────────────────────────────────── # 기본값은 이미 '모든 출처 허용'입니다. same_origin 의 기본값은 false 이고 # allowed_origins 가 비어 있으면 checkOrigin() 이 Origin 헤더를 읽지도 않고 # 즉시 nil 을 반환합니다 (server/websocket.go:1039). # → http://localhost:3000 의 브라우저 대시보드는 별도 설정 없이 접속됩니다. # → `same_origin: false` 를 적는 것은 no-op 입니다. # # 8080 을 tailnet 밖으로 노출한다면 아래를 켜서 출처를 좁히십시오. # 주의: allowed_origins 를 비우지 않는 순간 원점 검사가 '켜집니다'. # "*" 는 절대 쓰지 마십시오 — 옵션 검증 실패로 서버가 기동하지 못합니다 # (websocket.go:1142 "must be absolute URLs with http or https scheme"). # allowed_origins: ["https://dashboard.example", "http://localhost:3000"] # ── 이 포트는 MQTT-over-WebSocket 도 서빙합니다 ─────────────────────── # 경로 /mqtt 로 붙으면 완전한 MQTT 클라이언트가 됩니다 (mqtt.go:193, # websocket.go:1335 → createMQTTClient, 1883 리스너와 동일 함수). # ws://:8080/mqtt → MQTT. retained 종료 이벤트를 받습니다. # ws://:8080/ → NATS 네이티브. retained 를 받지 못합니다 (N-1). # 브라우저 대시보드는 MQTT.js 로 /mqtt 에 붙이는 것을 권장합니다. } # ── 인증 및 멀티테넌시 ──────────────────────────────────────────────────── accounts { MAM: { jetstream: enabled # MQTT 내부 스트림이 이 계정 안에 생성됨 users: [ # 발행자 겸 구독자 — MAM 에이전트 본체 (.mam.env 의 MQTT_USERNAME) { user: mam_agent, password: $MAM_BROKER_PASS } # 관측자 — 대시보드/모니터링. 반드시 MAM 계정 안에 위치 { user: mam_observer, password: $MAM_OBSERVER_PASS, permissions: { subscribe: { allow: ["python.mqtt.jobs.>"] } # M3 이후: "mam..jobs.>" publish: { deny: [">"] } } } ] } # MAM 과 무관한 홈랩 서비스 전용. MAM subject 는 보이지 않음(의도된 격리) HOME: { jetstream: enabled, users: [ { user: home, password: $HOME_BROKER_PASS } ] } SYS: { users: [ { user: sys, password: $SYS_BROKER_PASS } ] } } system_account: SYS