An open API service indexing awesome lists of open source software.

https://github.com/agent-network-protocol/anp-proxy

A reverse proxy service for the ANP protocol
https://github.com/agent-network-protocol/anp-proxy

Last synced: 3 months ago
JSON representation

A reverse proxy service for the ANP protocol

Awesome Lists containing this project

README

          

# ANP Proxy

Agent Network Proxy (ANP) - 高性能 HTTP over WebSocket 隧道,用于私有网络服务的安全对外暴露。

## 特性

- 🚀 **高性能异步架构** - 基于 asyncio 的纯异步实现
- 🔒 **安全可靠** - WSS (TLS) + 双向认证 + CRC 校验
- 📦 **二进制协议** - 自定义 ANPX 协议,支持大文件分片传输
- 🔧 **框架无关** - 支持任意 ASGI 应用 (FastAPI, Django, Flask 等)
- 🔄 **自动重连** - 断线自动重连,指数退避策略
- 📊 **监控友好** - 详细的日志和统计信息
- ⚙️ **易于配置** - TOML 配置文件 + 命令行参数

## 架构概览

```
┌────────────┐ WSS (TLS) ┌──────────────┐
│ Client │ ─HTTP→ ┌──────────────┐ ─────→ │ Receiver & │
│ 外部调用者 │ │ Gateway │ │ Internal App│
└────────────┘ ←HTTP─ └──────────────┘ ←───── │ (FastAPI …) │
↑ ↓ └──────────────┘
Request 包装 Response 包装
```

## 快速开始

### 安装

```bash
# 使用 UV 安装 (推荐)
uv add anp-proxy

# 或使用 pip
pip install anp-proxy
```

### 基本使用

#### 1. 开发模式 (Gateway + Receiver 一体)

```bash
# 启动一体化代理,服务本地 FastAPI 应用
anp-proxy --mode both --local-app "myapp:app" --gateway-port 8080
```

#### 2. 生产模式 - Gateway (公网部署)

```bash
# 在公网服务器启动 Gateway
anp-proxy --mode gateway --gateway-host 0.0.0.0 --gateway-port 80 --wss-port 443
```

#### 3. 生产模式 - Receiver (私网部署)

```bash
# 在私网启动 Receiver,连接到公网 Gateway
anp-proxy --mode receiver --gateway-url "wss://your-gateway.com:443" --local-app "myapp:app"
```

### 配置文件

创建 `config.toml`:

```toml
mode = "both" # gateway, receiver, both

[gateway]
host = "0.0.0.0"
port = 8080
wss_port = 8765

[receiver]
gateway_url = "wss://localhost:8765"
local_app_module = "myapp:app"

[logging]
level = "INFO"
```

使用配置文件:

```bash
anp-proxy --config config.toml
```

## 详细配置

### Gateway 配置

```toml
[gateway]
# HTTP 服务器设置
host = "0.0.0.0"
port = 8080

# WebSocket 服务器设置
wss_host = "0.0.0.0"
wss_port = 8765

# 连接设置
max_connections = 100
timeout = 30.0
chunk_size = 65536 # 64KB

[gateway.tls]
enabled = true
cert_file = "server.crt"
key_file = "server.key"
verify_mode = "required"

[gateway.auth]
enabled = true
shared_secret = "your-secret-key"
token_expiry = 3600
```

### Receiver 配置

```toml
[receiver]
# Gateway 连接
gateway_url = "wss://gateway.example.com:8765"

# 本地应用设置
local_app_module = "myapp:app" # ASGI 应用

# 重连设置
reconnect_enabled = true
reconnect_delay = 5.0
max_reconnect_attempts = 10

[receiver.tls]
enabled = true
ca_file = "ca.crt"
verify_mode = "required"

[receiver.auth]
enabled = true
shared_secret = "your-secret-key"
```

## Python API

### 编程方式使用

```python
import asyncio
from anp_proxy import ANPProxy, ANPConfig

# 创建配置
config = ANPConfig(mode="both")
config.gateway.port = 8080
config.receiver.local_app_module = "myapp:app"

# 创建并运行代理
async def main():
proxy = ANPProxy(config)

if config.mode == "gateway":
gateway = proxy.create_gateway_server()
await gateway.run()
elif config.mode == "receiver":
receiver = proxy.create_receiver_client()
await receiver.run()

asyncio.run(main())
```

### 集成到现有应用

```python
from fastapi import FastAPI
from anp_proxy import ReceiverClient, ReceiverConfig

app = FastAPI()

@app.get("/")
async def root():
return {"message": "Hello World"}

# 创建 ANP Receiver
config = ReceiverConfig(gateway_url="wss://gateway.example.com:8765")
receiver = ReceiverClient(config, app)

# 启动 receiver (在后台任务中)
import asyncio
asyncio.create_task(receiver.run())
```

## ANPX 协议

ANP Proxy 使用自定义的 ANPX 二进制协议,支持:

- **固定 24B 头部** - 魔数、版本、类型、标志、长度、CRC 校验
- **TLV 扩展体** - 灵活的标签-长度-值格式
- **分片传输** - 支持大文件和流式内容
- **端到端校验** - CRC-32 双层校验保证数据完整性

详细协议规范请参考 [docs/proxy-protocol.md](docs/proxy-protocol.md)

## 监控和运维

### 健康检查

```bash
# 检查 Gateway 状态
curl http://localhost:8080/health

# 获取统计信息
curl http://localhost:8080/stats
```

### 日志配置

```toml
[logging]
level = "INFO" # DEBUG, INFO, WARNING, ERROR
format = "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
file = "anp-proxy.log"
max_size = "10MB"
backup_count = 5
```

### 性能调优

```toml
[gateway]
chunk_size = 131072 # 128KB,适合大文件传输
max_connections = 1000 # 最大连接数
timeout = 60.0 # 超时时间

[receiver]
chunk_size = 131072
reconnect_delay = 2.0 # 重连延迟
```

## 部署示例

### Docker 部署

```dockerfile
FROM python:3.11-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .
EXPOSE 8080 8765

CMD ["anp-proxy", "--config", "config.toml"]
```

### Systemd 服务

```ini
[Unit]
Description=ANP Proxy Gateway
After=network.target

[Service]
Type=exec
User=anp-proxy
WorkingDirectory=/opt/anp-proxy
ExecStart=/opt/anp-proxy/venv/bin/anp-proxy --config config.toml
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
```

## 故障排除

### 常见问题

1. **连接失败**
- 检查防火墙设置
- 验证 WebSocket URL 是否正确
- 确认 TLS 证书配置

2. **认证失败**
- 检查 shared_secret 是否一致
- 验证时间同步 (重要)

3. **性能问题**
- 调整 chunk_size
- 增加 max_connections
- 检查网络延迟

### 调试模式

```bash
anp-proxy --debug --log-level DEBUG
```

## 许可证

MIT License - 详见 [LICENSE](LICENSE) 文件

## 贡献

欢迎提交 Issue 和 Pull Request!

## 支持

- 📖 [文档](docs/)
- 🐛 [Issue Tracker](https://github.com/your-org/anp-proxy/issues)
- 💬 [讨论区](https://github.com/your-org/anp-proxy/discussions)