# Prism

HTTP / SOCKS5 代理网关，带 Web 管理台。控制面自研（Go + SQLite），数据面嵌入 [Mihomo](https://github.com/MetaCubeX/mihomo)。

管理台支持**简体中文、繁体中文、英文**三种界面语言，可在「系统设置 → 显示语言」中随时切换。

## 界面预览

以下为 Web 管理台主要页面（点击可查看原图）。

| 登录 | 监控大盘 |
|:---:|:---:|
| ![登录页](docs/image/登陆页.png) | ![监控大盘](docs/image/监控大盘.png) |
| 默认密码 `admin`，首次登录后请修改 | 实时速率、连接趋势与流量分布 |

| 订阅管理 | 代理节点 |
|:---:|:---:|
| ![订阅管理](docs/image/订阅管理.png) | ![代理节点](docs/image/代理节点.png) |
| Clash YAML / 节点链接，自动识别与定时拉取 | 延迟测速、国家标签、导入导出 |

| 出站管理 | 路由规则 |
|:---:|:---:|
| ![出站管理](docs/image/出站管理.png) | ![路由规则](docs/image/路由规则.png) |
| 默认出站、策略组与国家 url-test 池 | 手动规则、合成预览与命中测试 |

| 请求日志 | 运行日志 |
|:---:|:---:|
| ![请求日志](docs/image/请求日志.png) | ![运行日志](docs/image/运行日志.png) |
| 代理请求明细与分页检索 | 内核与系统运行日志 |

| 系统设置 |
|:---:|
| ![系统设置](docs/image/系统设置.png) |
| 端口、认证、Geo 数据、API Key、界面语言 |

## 功能概览

| 模块 | 说明 |
|------|------|
| 订阅管理 | Clash YAML、节点链接、自动识别；定时拉取与热重载 |
| 代理节点 | 订阅/手动节点、国家标签、延迟测速、导入导出 |
| 出站管理 | 默认出站、策略组切换、国家 url-test 池 |
| 路由规则 | 手动高优先级规则、合成预览、命中测试、导入导出 |
| 监控大盘 | 实时速率、域名/节点流量、连接趋势 |
| 日志 | 请求日志、运行日志、审计日志（分页，单页最多 500 条） |
| 系统设置 | 端口、认证、Geo 数据、API Key、界面语言 |
| OpenAPI | `/api/docs` 交互文档，`/api/v1/openapi.json` |

## 架构

```
客户端 → Mihomo 入站 (HTTP/SOCKS5) → 规则引擎 → 出站节点
                ↑
         Prism 控制面 (配置合成 / REST API / Vue UI)
                ↓
            SQLite + 内存缓存
```

## 快速开始（开发）

### 依赖

- Go 1.25+（见 `go.mod`）
- Node.js 20+（仅开发/构建前端）

依赖镜像（已写入 `go.env`、`web/.npmrc`，国内网络友好）：

- Go：`GOPROXY=https://goproxy.cn,direct`
- npm：`registry=https://registry.npmmirror.com`

海外用户可将 `GOPROXY` 改为 `https://proxy.golang.org,direct`，npm 使用默认 registry 即可。

### 启动

```bash
# 终端 1：后端
make run

# 终端 2：前端（Vite 代理 /api → :8080）
make dev-web
```

访问 http://localhost:5173 ，默认密码 `admin`（**首次登录后请立即修改**）。

```bash
make test   # 运行单元测试
make build  # 构建 dist/prism
```

## 部署

镜像由 Gitea Actions 自动构建并发布到 Container Registry，**无需自行编译**。直接拉取运行即可。

```bash
docker pull git.rc707blog.top/rose_cat707/prism:latest
```

| Tag | 说明 |
|-----|------|
| `latest` | `main` / `master` 分支最新构建 |
| `sha-xxxxxxx` | 对应 commit 短 SHA |
| `v1.2.3` | 推送 Git tag `v1.2.3` 时发布 |

### docker run

```bash
docker pull git.rc707blog.top/rose_cat707/prism:latest

docker run -d --name prism \
  --restart unless-stopped \
  -p 8080:8080 \
  -p 7890:7890 \
  -p 7891:7891 \
  -v prism-data:/app/data \
  git.rc707blog.top/rose_cat707/prism:latest
```

### Docker Compose

仓库根目录 `docker-compose.yml` 已指向上述镜像：

```bash
docker compose pull
docker compose up -d
```

数据持久化在 `./data`，升级时 `docker compose pull && docker compose up -d` 即可保留数据卷。

**端口（默认）**

| 服务 | 端口 | 说明 |
|------|------|------|
| 管理 API / Web UI | 8080 | 浏览器访问管理台 |
| HTTP 代理 | 7890 | 客户端 HTTP 代理 |
| SOCKS5 代理 | 7891 | 客户端 SOCKS5 代理 |

代理端口可在管理台「系统设置」修改并保存后重载内核。

若通过域名 + HTTPS 访问管理台，可在前面加 Nginx/Caddy 反代到 `8080`。**勿将代理端口 7890/7891 无防护暴露公网**；建议 VPN、IP 白名单或强密码 + 入站认证。

## 数据目录

`-data` 指定数据目录（默认 `./data`）：

```
data/
├── prism.db      # SQLite：订阅、节点、规则、设置、日志
└── geo/          # Country.mmdb、geoip.dat、geosite.dat
```

首次使用含 `GEOIP`/`GEOSITE` 规则时，可在「系统设置 → Geo 数据」一键下载，或手动放入 `data/geo/`。

## 使用攻略（简要）

### 1. 首次登录

1. 打开 `http://<主机>:8080`
2. 默认密码 `admin`，登录后进入「系统设置」修改密码
3. 按需切换「显示语言」

### 2. 添加订阅

1. 「订阅管理」→「添加订阅」
2. 类型选 **自动识别**（兼容 Clash YAML、Base64 链接、短链）
3. 保存后自动拉取节点并重载内核

### 3. 配置出站

1. 「出站管理」设置**默认出站**（未命中规则时生效）
2. 在策略组中切换当前节点；国家池为自动测速选最快

### 4. 配置规则

1. 「路由规则」添加手动规则（优先级高于订阅规则）
2. 可将域名指向 `country:HK` 等国家池，或 `DIRECT` / `PROXY`
3. 使用「规则命中测试」验证 URL 走向

### 5. 客户端接入

| 类型 | 地址 | 默认 |
|------|------|------|
| HTTP 代理 | `<服务器IP>:7890` | 无认证（可在设置中启用） |
| SOCKS5 | `<服务器IP>:7891` | 同上 |

本机 `127.0.0.1` 访问代理可免认证（若已配置入站认证）。

### 6. API 与自动化

- 交互文档：`http://<主机>:8080/api/docs`
- 登录获取 Token：`POST /api/v1/auth/login`
- 或在「系统设置」申请 **API Key**，请求头：
  - `Authorization: Bearer <key>` 或
  - `X-API-Key: <key>`
- 修改配置后：`POST /api/v1/system/reload` 热重载内核

### 7. 日常运维

| 操作 | 位置 / API |
|------|------------|
| 查看流量与连接 | 监控大盘 |
| 节点测速 | 代理节点 → 全部测速 |
| 查看请求明细 | 请求日志 |
| 更新 Geo | 系统设置 → Geo 数据 |
| 重载配置 | 系统设置 → 重载内核 |

## 订阅类型

| 类型 | 说明 |
|------|------|
| `auto` | 自动识别（推荐） |
| `clash` | Clash / Mihomo YAML |
| `links` | Base64 或纯文本节点链接 |

## API 前缀

REST API：`/api/v1`  
认证：`Authorization: Bearer <token>` 或 API Key。

主要端点：`/dashboard`、`/subscriptions`、`/proxies`、`/rules`、`/settings`、`/traffic-logs`、`/logs`、`/system/reload`。

## 项目结构

```
cmd/prism/           # 进程入口
internal/
  api/               # HTTP 层（按域拆分 handlers_*.go）
  settings/          # 设置键名、展示/提交规范化、语言
  store/             # SQLite 与仓储
  service/           # 编排与热重载
  configbuilder/     # Mihomo YAML 合成
  subscription/      # 订阅拉取解析
web/                 # Vue 3 管理台
  src/i18n/          # 多语言资源
  src/views/         # 页面
  src/styles/        # 设计系统 theme.css
docs/
  image/             # README 界面截图
  UI-DESIGN-SYSTEM.md
.gitea/workflows/    # Gitea Actions CI
```

## CI / 镜像发布

推送 `main` / `master` 或 tag `v*` 时，Gitea Actions 构建多架构镜像并推送到 Registry。工作流与 Dockerfile 约定见 [.gitea/README.md](.gitea/README.md)；维护者配置见 [CONTRIBUTING.md](CONTRIBUTING.md)。

## 贡献与安全

- [CONTRIBUTING.md](CONTRIBUTING.md) — 开发环境、CI 配置、提交规范
- [SECURITY.md](SECURITY.md) — 漏洞报告与部署安全建议
- [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md) — 第三方组件与许可

## 许可

Prism 控制面代码采用 [MIT License](LICENSE)。

嵌入的 [Mihomo](https://github.com/MetaCubeX/mihomo) 内核采用 **GPL-3.0 OR MIT** 双重许可。分发二进制或容器镜像时，请保留相关版权声明并遵守 Mihomo 及全部依赖的许可条款。详见 [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md)。
