# MeshRay 配置指南

## 配置文件模板

### config.yaml 完整参数说明

```yaml
# 服务器配置
server:
  port: 9531                    # API 服务端口
  mode: "release"               # gin 模式：debug/release/test
  
# 数据库配置
database:
  type: "sqlite"                # 数据库类型：sqlite
  path: "data/meshray.db"       # SQLite 数据库文件路径
  
# 日志配置
log:
  level: "info"                 # 日志级别：debug/info/warn/error
  format: "json"                # 日志格式：json/console
  output: "logs/meshray.log"    # 日志文件路径
  max_size: 100                 # 单文件最大大小 (MB)
  max_backups: 3                # 保留旧日志文件数
  max_age: 30                   # 日志保留天数
  
# STUN 服务器配置（可选）
stun:
  enabled: true
  servers:
    - "stun.miwifi.com:3478"
    - "stun.stunprotocol.org:3478"
    
# TURN 服务器配置（可选）
turn:
  enabled: false
  server_addr: "turn.example.com:3478"
  username: "meshray_user"
  password: "your_password"
  realm: "meshray"
  
# WireGuard 配置
wireguard:
  interface_name: "wg0"         # WG 网卡名称
  listen_port: 51820            # WG 监听端口
  mtu: 1420                     # WG MTU 值
  
# gRPC 配置（ctr ↔ Core 通信）
grpc:
  port: 50051                   # gRPC 服务端口
  max_message_size: 4194304     # 最大消息大小 (4MB)
  
# 雪花算法配置
snowflake:
  machine_id: 1                 # 机器 ID (0-1023)
  
# 安全配置
security:
  jwt_secret: "your-jwt-secret-key"  # JWT 签名密钥
  jwt_expire: 24h                    # JWT 过期时间
  
# MeshSeed 配置
meshseed:
  default_expiry: 720h          # 默认过期时间 (30 天)
  network_secret_min_len: 32    # NetworkSecret 最小长度
```

---

## Docker Compose 部署配置

### docker-compose.yaml

```yaml
version: '3.8'

services:
  meshray:
    image: zkcoi/meshray:latest
    container_name: meshray
    restart: unless-stopped
    
    # 特权模式（必需：用于创建 WG 网卡）
    privileged: true
    
    # 网络配置
    network_mode: host
    
    # 环境变量
    environment:
      - TZ=Asia/Shanghai
      - MESHRAY_PORT=9531
      - MESHRAY_DB_PATH=/app/data/meshray.db
      
    # 卷挂载
    volumes:
      - ./data:/app/data              # 数据目录
      - ./logs:/app/logs              # 日志目录
      - ./config.yaml:/app/config.yaml  # 配置文件
      
    # 设备映射（WG 网卡必需）
    devices:
      - /dev/net/tun:/dev/net/tun
      
    # 系统参数（IP 转发）
    sysctls:
      - net.ipv4.ip_forward=1
      
    # 能力添加
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
      
    # 健康检查
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9531/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
```

### 启动命令

```bash
# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f meshray

# 停止服务
docker-compose down

# 重启服务
docker-compose restart
```

---

## 关键参数复用规则

### 1. 跨容器共享数据库

**场景**：多个 MeshRay 实例共享同一数据库（不推荐，仅用于测试）

```yaml
volumes:
  - /shared/data/meshray.db:/app/data/meshray.db
```

**注意**：
- ⚠️ SQLite 不支持多写，可能导致锁竞争
- ✅ 生产环境应使用独立数据库

---

### 2. 外部访问配置

**场景**：允许局域网访问 MeshRay

```yaml
ports:
  - "0.0.0.0:9531:9531"  # 监听所有网卡
  
environment:
  - MESHRAY_CORS_ORIGINS=http://192.168.1.100:9531
```

---

### 3. WireGuard 端口映射

**场景**：Docker 后需要暴露 WG 端口

```yaml
ports:
  - "51820:51820/udp"  # WG 监听端口
  
environment:
  - WIREGUARD_LISTEN_PORT=51820
```

---

### 4. 中继节点特殊配置

**场景**：运行在 Docker 中的 Mesh 中继节点

```yaml
sysctls:
  - net.ipv4.ip_forward=1  # 必需：开启 IP 转发
  
cap_add:
  - NET_ADMIN              # 必需：网络管理权限
  
iptables: true             # 启用 iptables 支持
```

**验证 IP 转发**：
```bash
# 进入容器
docker exec -it meshray sh

# 检查 IP 转发
cat /proc/sys/net/ipv4/ip_forward
# 输出应为：1
```

---

## ExternalService 配置示例

### STUN 服务器

```json
{
  "category": "networking",
  "serviceType": "stun_server",
  "name": "公共 STUN",
  "config": {
    "servers": [
      "stun.miwifi.com:3478",
      "stun.stunprotocol.org:3478",
      "stun.l.google.com:19302"
    ]
  }
}
```

### TURN 服务器（长期凭证）

```json
{
  "category": "networking",
  "serviceType": "turn_server",
  "name": "Coturn 服务器",
  "config": {
    "server_addr": "turn.example.com:3478",
    "realm": "meshray",
    "auth_type": "long_term",
    "long_term": {
      "username": "meshray_user",
      "password": "secure_password_123"
    }
  }
}
```

### TURN 服务器（短期凭证）

```json
{
  "category": "networking",
  "serviceType": "turn_server",
  "name": "Coturn 动态凭证",
  "config": {
    "server_addr": "turn.example.com:3478",
    "realm": "meshray",
    "auth_type": "short_term",
    "short_term": {
      "username": "meshray_user",
      "auth_secret": "super_secret_key_for_hmac",
      "expires_in": 86400
    }
  }
}
```

### WS 隧道（Nginx 反向代理）

```json
{
  "category": "networking",
  "serviceType": "ws_tunnel",
  "name": "Nginx WS 代理",
  "config": {
    "server_type": "nginx",
    "endpoint_type": "wss",
    "endpoint": "wss://relay.example.com/ws-tunnel",
    "use_coturn_stun": false
  }
}
```

### DDNS 阿里云

```json
{
  "category": "dns",
  "serviceType": "ddns_aliyun",
  "name": "阿里云 DDNS",
  "config": {
    "access_key_id": "LTAI5t...",
    "access_key_secret": "...",
    "region_id": "cn-hangzhou",
    "domain": "home.example.com",
    "txt_record_name": "_meshray"
  }
}
```

### Webhook

```json
{
  "category": "automation",
  "serviceType": "webhook",
  "name": "企业微信机器人",
  "config": {
    "url": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx",
    "method": "POST",
    "headers": {
      "Content-Type": "application/json"
    },
    "body_template": "{\"msgtype\":\"text\",\"text\":{\"content\":\"{{.Message}}\"}}"
  }
}
```

---

## 常见场景配置案例

### 场景 1：家庭 NAS 部署

**需求**：
- 部署在家庭 NAS（群晖/威联通）
- 通过公网 IPv6 访问
- 自动更新 IPv6 地址到 DDNS

**配置**：
```yaml
# docker-compose.yaml
services:
  meshray:
    image: zkcoi/meshray:latest
    network_mode: host  # 使用宿主机网络，获取 IPv6
    
    environment:
      - IPV6_ENABLED=true
      
    volumes:
      - ./data:/app/data
```

**ExternalService**：
1. 添加 DDNS 服务（IPv6 自动更新）
2. 添加 STUN 服务（辅助穿透）

---

### 场景 2：云服务器中转

**需求**：
- 云服务器作为中转节点
- 开启 Mesh 中继功能
- 多客户端连接

**配置**：
```yaml
services:
  meshray:
    privileged: true
    network_mode: host
    
    sysctls:
      - net.ipv4.ip_forward=1  # 必需：IP 转发
      
    cap_add:
      - NET_ADMIN              # 必需：WG 网卡管理
```

**ExternalService**：
1. 添加 TURN 服务器（云服务商提供）
2. 配置为中继节点（AllowedIPs = 0.0.0.0/0）

---

### 场景 3：纯内网部署

**需求**：
- 完全离线运行
- 不使用 STUN/TURN
- 仅 Direct-UDP 直连

**配置**：
```yaml
# config.yaml
stun:
  enabled: false
  
turn:
  enabled: false
```

**策略设置**：
- 只启用 Direct-UDP 层
- 禁用所有 Relay 层

---

## 故障排查

### 检查配置文件有效性

```bash
# 验证 YAML 语法
python3 -c "import yaml; yaml.safe_load(open('config.yaml'))"

# 检查 JSON 配置
jq '.' config.json
```

### 查看当前配置

```bash
# API 查询
curl http://localhost:9531/api/config

# 查看环境变量
docker exec meshray env | grep MESHRAY
```

### 重置配置

```bash
# 删除配置文件
rm config.yaml data/meshray.db

# 重新初始化
docker-compose up -d
```

---

*最后更新：v2.1.0*
