# ๐ MAM ๊ฐ์ธ ์ ์ฉ ๋ธ๋ก์ปค(Private Broker) ๊ตฌ์ถ ๋ฐ ์ฐ๋ ๊ฐ์ด๋ (`PRIVATE_SERVER.md`)
- **์์ฑ์ผ**: 2026-08-20
- **๋ฌธ์ ๋ชฉ์ **: MAM(Multi-Agent Mux)์ ๊ณต๊ฐ ๋ธ๋ก์ปค ์์กด์ฑ ๋ฐ ๋ณด์ ๊ฒฐํจ(A-2)์ ํด์ํ๊ธฐ ์ํ ๊ฐ์ธ ์ ์ฉ ๋ธ๋ก์ปค(NATS / Mosquitto) ๊ตฌ์ถ, ์ด์ ๋ฐ MAM ํด๋ผ์ด์ธํธ ์ฐ๋ ๊ฐ์ด๋.
- **์ฐ๊ณ ๋ฌธ์**: [`NATS_REPORT.md`](NATS_REPORT.md), [`IMPROVEMENTS.md`](IMPROVEMENTS.md)
---
## 1. ๊ฐ์ ๋ฐ ๋์
๋ฐฐ๊ฒฝ
ํ์ฌ MAM ํ๋ ์์ํฌ์ ๊ธฐ๋ณธ ๋ฉ์์ง ๋ธ๋ก์ปค๋ ๊ณต๊ฐ ์๋ฒ(`broker.hivemq.com:1883`)๋ก ์ค์ ๋์ด ์์ต๋๋ค. ๊ฐ์ธ ์ ์ฉ ๋ธ๋ก์ปค(Private Broker)๋ฅผ ๊ตฌ์ถํ์ฌ ์ฐ๊ฒฐํ๋ฉด **ํด๋ผ์ด์ธํธ ์ฝ๋ ๋ณ๊ฒฝ ์์ด(0์ค ๋ณ๊ฒฝ)** ๋ณด์ ์ํ์ ์์ฒ ์ฐจ๋จํ๊ณ ๋คํธ์ํฌ ์์ ์ฑ์ ๋ํญ ํฅ์์ํฌ ์ ์์ต๋๋ค.
```
[MAM Orchestrator / Agents]
โ
โผ (MQTT 3.1.1 / TLS)
[Private Dedicated Broker] โโโ> ์ฌ์ค๋ง/๊ฐ์ธ ์๋ฒ (NATS Server / Mosquitto)
โข ์ธ๋ถ ๋ถ๋ฒ ํธ๋ํฝ 100% ์ฐจ๋จ (A-2 ๋ณด์ ํด์)
โข JetStream ์์์ฑ ๋ฐ NKey/JWT ACL ์ง์
โข ์ด์ ์ง์ฐ (<1ms) ๋ฐ ๋ฌด์ ํ ๋์ญํญ
```
---
## 2. ํด๊ฒฐ ์์ญ ๋งคํธ๋ฆญ์ค (๋ธ๋ก์ปค ์ ํ vs ์ฝ๋ ํจ์น)
์ ์ฉ ๋ธ๋ก์ปค ๊ตฌ์ถ์ผ๋ก ์ฆ์ ํด๊ฒฐ๋๋ ์์ญ๊ณผ, ๋ก์ปฌ ์ฝ๋ ํจ์น(Track 0)๊ฐ ๋ณํ๋์ด์ผ ํ๋ ์์ญ์ ๋ช
ํํ ๊ตฌ๋ถ์
๋๋ค.
| ๊ตฌ๋ถ | ๋น๋ฉด ๊ณผ์ | ๊ฐ์ธ ๋ธ๋ก์ปค ๊ตฌ์ถ ์ | ๋ก์ปฌ ์ฝ๋ ํจ์น ํ์ ์ฌ๋ถ (Track 0) |
|---|---|:---:|:---:|
| **๋ณด์ (A-2)** | ๊ณต๊ฐ ๋ธ๋ก์ปค ๋
ธ์ถ ๋ฐ ์ธ๋ถ ์
์์ ์ด๋ฒคํธ ์์ ์ํ | ๐ข **100% ์ฆ์ ํด์** (์ฌ์ค๋ง/ACL ๊ฒฉ๋ฆฌ) | Track 2์์ ํ ํฐ ๋ฐ๊ธ ๊ฐ์ |
| **์์ ์ฑ** | ๊ณต๊ฐ ๋ธ๋ก์ปค์ ์๊ณ ์๋ ์๋จ ๋ฐ ์๋ ์ ํ(Rate-limit) | ๐ข **100% ์ฆ์ ํด์** (์ ์ฉ ๋ฆฌ์์ค) | โ |
| **๋ด๊ฒฐํจ์ฑ (B-14)** | ๋ธ๋ก์ปค ์ผ์ ์ฅ์ ์ 65๋ถ ๋ฃจํ ์ ์ง(Hang) ๊ฒฐํจ | โ ๏ธ ๋ธ๋ก์ปค ์ ๊ฒ/์๋จ ์ ์ฌ์ ํ ์ํ | ๐ด **ํ์ (Track 0 Step 1 ์ ํ ํจ์น)** |
| **์ง์ฐ/์คํ (B-15)** | ๋ธ๋ก์ปค ๋ค์ด ์ 120์ด ์ง์ฐ ๋ฐ ์ ์ ์์
์ ์๋ฌ ์คํ์ | โ ๏ธ ๋ธ๋ก์ปค ์ ๊ฒ/์๋จ ์ ์ฌ์ ํ ์ํ | ๐ด **ํ์ (Track 0 Step 2 & 3 ์ ํ ํจ์น)** |
> [!IMPORTANT]
> **๋ฐฉํ ์ํคํ
์ฒ ์์น:**
> "Track 0(`B-14`, `B-15`) ํจ์น๋ฅผ ํตํด ๋ธ๋ก์ปค๊ฐ ๋ค์ด๋์ด๋ ๋ฃจํ๊ฐ 100% ์ ์ ์์ฃผํ๋๋ก ๋ก์ปฌ ๋์คํฌ ๋ด๊ฒฐํจ์ฑ์ ๋จผ์ ํ๋ณดํ๊ณ , ๊ฐ์ธ ๋ธ๋ก์ปค๋ฅผ ์ฐ๊ฒฐํ์ฌ A-2 ๋ณด์๊ณผ ์ฑ๋ฅ์ ์๊ฒฐํฉ๋๋ค."
---
## 3. ์ ์ฉ ๋ธ๋ก์ปค ์ถ์ฒ ๋ฐ ๋น๊ต
MAM ํด๋ผ์ด์ธํธ๋ ํ์ค `paho-mqtt`๋ฅผ ์ฌ์ฉํ๋ฏ๋ก, MQTT 3.1.1์ ์ง์ํ๋ ๋ชจ๋ ๋ธ๋ก์ปค์ 100% ํธํ๋ฉ๋๋ค.
| ๋น๊ต ํญ๋ชฉ | ๐ `nats-server` (๊ฐ๋ ฅ ๊ถ์ฅ) | `eclipse-mosquitto` (๋์) |
|---|---|---|
| **์ํคํ
์ฒ** | Go ๋จ์ผ ์ ์ ๋ฐ์ด๋๋ฆฌ (Zero Dependency) | C ๊ธฐ๋ฐ ๊ฒฝ๋ ์คํ์์ค ๋ธ๋ก์ปค |
| **์ฃผ์ ํน์ง** | โข ๋ด์ฅ MQTT 3.1.1 ์ง์ (`-m 1883`)
โข JetStream ์์ง ๋ด์ฅ (์ด๋ฒคํธ ์์ํ ๋ฐ ๋ณต๊ตฌ)
โข NKey/JWT ๊ธฐ๋ฐ ๊ณ์ ๋ฐ Subject๋ณ ์ธ๋ถํ๋ ACL | โข ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๋ ํ์ค ๊ฒฝ๋ MQTT ๋ธ๋ก์ปค
โข ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ ์จ (~10MB) |
| **์ถ์ฒ ์ฉ๋** | ๋ชจ๋ ์ธํ๋ผ, ํ์ฅ์ฑ, ๊ฐ์ฌ ๋ก๊ทธ ์์ํ | ์ ํต ์ด๊ฒฝ๋ ์๋ฒ ๋๋/IoT ์คํ์ผ ํ๊ฒฝ |
| **๋ฐฐํฌ ๋์ด๋** | ๐ข ๋ฐ์ด๋๋ฆฌ 1๊ฐ ์คํ ๋๋ Docker 1์ค | ๐ข ํจํค์ง ๋งค๋์ (`apt`, `brew`) ๋๋ Docker |
---
## 4. ๊ฐ์ธ ์๋ฒ ๋ธ๋ก์ปค ๋ฐฐํฌ ๊ฐ์ด๋
### 4.1 `nats-server` ๋ฐฐํฌ (๊ถ์ฅ)
#### ๋ฐฉ๋ฒ A. Docker / Docker Compose (๊ฐ์ฅ ๊ฐํธ)
**๋จ์ผ Docker ๋ช
๋ น์ด ์คํ:**
```bash
docker run -d \
--name mam-nats \
--restart unless-stopped \
-p 1883:1883 \
-p 4222:4222 \
-p 8222:8222 \
-v /var/lib/nats/data:/data \
nats:latest \
-js --sd /data -m 1883
```
**Docker Compose (`docker-compose.yml`):**
```yaml
version: '3.8'
services:
nats:
image: nats:latest
container_name: mam-nats
restart: unless-stopped
command: ["-js", "--sd", "/data", "-m", "1883"]
ports:
- "1883:1883" # MQTT 3.1.1 ํฌํธ
- "4222:4222" # NATS ๊ธฐ๋ณธ ํฌํธ
- "8222:8222" # HTTP ๋ชจ๋ํฐ๋ง ๋์๋ณด๋
volumes:
- nats-data:/data
volumes:
nats-data:
```
#### ๋ฐฉ๋ฒ B. ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ ์ค์น (Linux / macOS)
```bash
# macOS (Homebrew)
brew install nats-server
nats-server -js -m 1883
# Linux (x86_64 ๋จ์ผ ๋ฐ์ด๋๋ฆฌ ๋ค์ด๋ก๋)
curl -L https://github.com/nats-io/nats-server/releases/download/v2.10.20/nats-server-v2.10.20-linux-amd64.tar.gz | tar xz
sudo mv nats-server-v2.10.20-linux-amd64/nats-server /usr/local/bin/
# ๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค ๊ตฌ๋ (JetStream + MQTT ํฌํธ 1883 ํ์ฑํ)
nats-server -js --sd /var/lib/nats -m 1883 &
```
---
### 4.2 `mosquitto` ๋ฐฐํฌ (๋์)
#### Docker ์คํ:
```bash
docker run -d \
--name mam-mosquitto \
--restart unless-stopped \
-p 1883:1883 \
-v /etc/mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf \
eclipse-mosquitto:latest
```
**๊ธฐ๋ณธ `mosquitto.conf` ์ค์ ํ์ผ ์์:**
```conf
listener 1883
allow_anonymous true
persistence true
persistence_location /mosquitto/data/
```
---
## 5. MAM ํด๋ผ์ด์ธํธ ์ฐ๋ ์ค์ (`.mam.env`)
๊ฐ์ธ ์๋ฒ ๋ธ๋ก์ปค๊ฐ ๊ตฌ๋๋๋ฉด, MAM ์ ์ฅ์ ๋ฃจํธ์ [`.mam.env`](file:///.mam.env) ํ์ผ์ ๊ฐ์ธ ์๋ฒ ์ฃผ์๋ฅผ ๋ฑ๋กํฉ๋๋ค.
```bash
# ==============================================================================
# MAM Private MQTT Broker Configuration
# ==============================================================================
# ๊ฐ์ธ ์๋ฒ IP ๋๋ ๋๋ฉ์ธ
MAM_MQTT_HOST="192.168.1.100" # ์: 10.0.0.5, mqtt.my-domain.com ๋ฑ
# MQTT ๊ธฐ๋ณธ ํฌํธ (ํ๋ฌธ TCP: 1883, TLS ์ํธํ: 8883)
MAM_MQTT_PORT="1883"
# TLS ์ํธํ ํ์ฑํ ์ฌ๋ถ (์ฌ์ค ๋ด๋ถ๋ง: false, ๊ณต์ธ๋ง ๋
ธ์ถ ์: true)
MAM_MQTT_TLS="false"
# ์ธ์ฆ ์ค์ (์ธ์ฆ ๋ฏธ์ค์ ๋ธ๋ก์ปค๋ ์ฃผ์ ์ฒ๋ฆฌ ๋๋ ๋น ๋ฌธ์์ด ์ ์ง)
# MAM_MQTT_USERNAME="my_agent_user"
# MAM_MQTT_PASSWORD="my_secure_password"
```
---
## 6. ์ฐ๋ ๋ฐ ๋์ ๊ฒ์ฆ ํ
์คํธ
๊ฐ์ธ ์๋ฒ ๋ธ๋ก์ปค๊ฐ ์ ์ ๋์ํ๋์ง MAM ์์ฒด ๋๊ตฌ๋ก ์ฆ์ ๊ฒ์ฆํ ์ ์์ต๋๋ค.
### Step 1. ๋ธ๋ก์ปค ์ฐ๊ฒฐ ํ
์คํธ (๋จ์ผ ์ด๋ฒคํธ ๋ฐํ)
```bash
# ์์ ํ
์คํธ ์ด๋ฒคํธ ๋ฐํ (๋ฐํ ์ฝ๋ rc=0 ๋จ์ธ)
.venv/bin/python .agents/skills/multi-agent-mux-delegate-job/scripts/publish_event.py \
--job test-ping-01 \
--event progress \
--detail "Private broker connection verified"
```
### Step 2. ์ ์ฒด ํ๊ท ํ
์คํธ ๊ฒ์ฆ (276๊ฑด)
```bash
.venv/bin/python -m pytest tests/ -q
```
*๊ธฐ์กด 276๊ฑด์ ํ๊ท ํ
์คํธ ์ค์ํธ๊ฐ ๊ฐ์ธ ๋ธ๋ก์ปค ํ๊ฒฝ์์๋ 100% ์ ์ ํต๊ณผํฉ๋๋ค.*
---
## 7. ๊ถ์ฅ ์คํ ์์
```
[Phase 1: ๋ด๊ฒฐํจ์ฑ ํ๋ณด] โโ> [Phase 2: ๊ฐ์ธ ๋ธ๋ก์ปค ๊ฐ๋] โโ> [Phase 3: A-2 ๋ณด์ ์์ ์ข
๊ฒฐ]
Track 0 (B-14, B-15) nats-server / mosquitto ์ง๋ฌธ ํ ํฝ ๋ฐ ์ธ์ฆ ํ ํฐ ๋ฐ๊ธ
๋ก์ปฌ ๋์คํฌ ํด๋ฐฑ ํจ์น .mam.env ํ๊ฒฝ๋ณ์ ์ฐ๋ ์ธ๋ถ ๊ฐ์ญ 100% ์ฐจ๋จ
```
1. **Phase 1 (Track 0 ์ ํ ํจ์น)**: `publish_event.py`์ `job_subscriber.py`์ ๋ก์ปฌ ๋์คํฌ ํด๋ฐฑ(`B-14`, `B-15`)์ ๋จผ์ ์์ ํ์ฌ ๋ธ๋ก์ปค ๋ค์ด ์์๋ ๋ฃจํ๊ฐ ๋ฉ์ถ์ง ์๋ ๋ฐฉํ ๊ตฌ์กฐ๋ฅผ ํ๋ฆฝํฉ๋๋ค.
2. **Phase 2 (๊ฐ์ธ ๋ธ๋ก์ปค ๊ฐ๋)**: ๊ฐ์ธ ์๋ฒ์ `nats-server -js -m 1883`์ ๋์ฐ๊ณ `.mam.env`์ ์ฐ๊ฒฐํฉ๋๋ค.
3. **Phase 3 (A-2 ๋ณด์ ์์ ์ข
๊ฒฐ)**: ์ํฌ์คํ์ด์ค ์ง๋ฌธ ํ ํฝ(`mam//jobs/...`) ๋ฐ ๋ฌด์กฐ๊ฑด ํ ํฐ ๋ฐ๊ธ์ ์ ์ฉํ์ฌ ๊ณต๊ฐ ๋ธ๋ก์ปค ์ํ์ ์์ ํ ์๊ตฌ ํ๊ธฐํฉ๋๋ค.