mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-22 16:43:35 +00:00
fix: 修复编辑oai账号是代理IP被错误保存的问题
This commit is contained in:
88
README.md
88
README.md
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
**🔐 自行搭建Claude API中转服务,支持多账户管理**
|
**🔐 自行搭建Claude API中转服务,支持多账户管理**
|
||||||
|
|
||||||
[English](#english) • [中文文档](#中文文档) • [📸 界面预览](docs/preview.md) • [📢 公告频道](https://t.me/claude_relay_service)
|
[English](#english) • [中文文档](#中文文档) • [📸 演示站点](https://demo.pincc.ai/admin-next/login) • [📢 公告频道](https://t.me/claude_relay_service)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -42,27 +42,19 @@
|
|||||||
|
|
||||||
如果有以上困惑,那这个项目可能适合你。
|
如果有以上困惑,那这个项目可能适合你。
|
||||||
|
|
||||||
> 💡 **热心网友福利**
|
> 💡 **Claude Code 拼车服务**
|
||||||
> 热心网友正在用本项目,正在拼车官方Claude Code Max 20X 200刀版本,是现在最稳定的方案。
|
> 目前有两个稳定的 Claude Code Max 20X 200刀 拼车渠道:
|
||||||
> 有需要自取: [https://ctok.ai/](https://ctok.ai/)
|
> 1. **PinCC** - 项目官方运营的拼车服务:[https://pincc.ai/](https://pincc.ai/)
|
||||||
|
> 2. **CToK** - 社区认可的合作伙伴服务:[https://ctok.ai/](https://ctok.ai/)
|
||||||
|
|
||||||
### 适合的场景
|
### 适合的场景
|
||||||
|
|
||||||
✅ **找朋友拼车**: 三五好友一起分摊Claude Code Max订阅,Opus爽用
|
✅ **找朋友拼车**: 三五好友一起分摊Claude Code Max订阅
|
||||||
✅ **隐私敏感**: 不想让第三方镜像看到你的对话内容
|
✅ **隐私敏感**: 不想让第三方镜像看到你的对话内容
|
||||||
✅ **技术折腾**: 有基本的技术基础,愿意自己搭建和维护
|
✅ **技术折腾**: 有基本的技术基础,愿意自己搭建和维护
|
||||||
✅ **稳定需求**: 需要长期稳定的Claude访问,不想受制于镜像站
|
✅ **稳定需求**: 需要长期稳定的Claude访问,不想受制于镜像站
|
||||||
✅ **地区受限**: 无法直接访问Claude官方服务
|
✅ **地区受限**: 无法直接访问Claude官方服务
|
||||||
|
|
||||||
### 不适合的场景
|
|
||||||
|
|
||||||
❌ **纯小白**: 完全不懂技术,连服务器都不会买
|
|
||||||
❌ **偶尔使用**: 一个月用不了几次,没必要折腾
|
|
||||||
❌ **注册问题**: 无法自行注册Claude账号
|
|
||||||
❌ **支付问题**: 没有支付渠道订阅Claude Code
|
|
||||||
|
|
||||||
**如果你只是普通用户,对隐私要求不高,随便玩玩、想快速体验 Claude,那选个你熟知的镜像站会更合适。**
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 💭 为什么要自己搭?
|
## 💭 为什么要自己搭?
|
||||||
@@ -84,7 +76,7 @@
|
|||||||
|
|
||||||
## 🚀 核心功能
|
## 🚀 核心功能
|
||||||
|
|
||||||
> 📸 **[点击查看界面预览](docs/preview.md)** - 查看Web管理界面的详细截图
|
> 📸 **[查看演示站点](https://demo.pincc.ai/admin-next/login)**
|
||||||
|
|
||||||
### 基础功能
|
### 基础功能
|
||||||
|
|
||||||
@@ -134,13 +126,7 @@
|
|||||||
### 快速安装
|
### 快速安装
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 下载并运行管理脚本
|
curl -fsSL https://pincc.ai/manage.sh -o manage.sh && chmod +x manage.sh && ./manage.sh install
|
||||||
curl -fsSL https://raw.githubusercontent.com/Wei-Shaw/claude-relay-service/main/scripts/manage.sh -o manage.sh
|
|
||||||
chmod +x manage.sh
|
|
||||||
./manage.sh install
|
|
||||||
|
|
||||||
# 安装后可以使用 crs 命令管理服务
|
|
||||||
crs # 显示交互式菜单
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 脚本功能
|
### 脚本功能
|
||||||
@@ -298,60 +284,15 @@ npm run service:status
|
|||||||
|
|
||||||
## 🐳 Docker 部署
|
## 🐳 Docker 部署
|
||||||
|
|
||||||
### 使用 Docker Hub 镜像(最简单)
|
### Docker compose
|
||||||
|
|
||||||
> 🚀 使用官方镜像,自动构建,始终保持最新版本
|
|
||||||
|
|
||||||
|
#### 第一步:下载构建docker-compose.yml文件的脚本并执行
|
||||||
```bash
|
```bash
|
||||||
# 拉取镜像(支持 amd64 和 arm64)
|
curl -fsSL https://pincc.ai/crs-compose.sh -o crs-compose.sh && chmod +x crs-compose.sh && ./crs-compose.sh
|
||||||
docker pull weishaw/claude-relay-service:latest
|
```
|
||||||
|
|
||||||
# 使用 docker-compose
|
#### 第二步:启动
|
||||||
# 创建 .env 文件用于 docker-compose 的环境变量:
|
```bash
|
||||||
cat > .env << 'EOF'
|
|
||||||
# 必填:安全密钥(请修改为随机值)
|
|
||||||
JWT_SECRET=your-random-secret-key-at-least-32-chars
|
|
||||||
ENCRYPTION_KEY=your-32-character-encryption-key
|
|
||||||
|
|
||||||
# 可选:管理员凭据
|
|
||||||
ADMIN_USERNAME=cr_admin
|
|
||||||
ADMIN_PASSWORD=your-secure-password
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# 创建 docker-compose.yml 文件:
|
|
||||||
cat > docker-compose.yml << 'EOF'
|
|
||||||
version: '3.8'
|
|
||||||
services:
|
|
||||||
claude-relay:
|
|
||||||
image: weishaw/claude-relay-service:latest
|
|
||||||
container_name: claude-relay-service
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "3000:3000"
|
|
||||||
environment:
|
|
||||||
- JWT_SECRET=${JWT_SECRET}
|
|
||||||
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
|
|
||||||
- REDIS_HOST=redis
|
|
||||||
- ADMIN_USERNAME=${ADMIN_USERNAME:-}
|
|
||||||
- ADMIN_PASSWORD=${ADMIN_PASSWORD:-}
|
|
||||||
volumes:
|
|
||||||
- ./logs:/app/logs
|
|
||||||
- ./data:/app/data
|
|
||||||
depends_on:
|
|
||||||
- redis
|
|
||||||
|
|
||||||
redis:
|
|
||||||
image: redis:7-alpine
|
|
||||||
container_name: claude-relay-redis
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- redis_data:/data
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
redis_data:
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# 启动服务
|
|
||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -364,7 +305,6 @@ docker-compose.yml 已包含:
|
|||||||
- ✅ Redis数据库
|
- ✅ Redis数据库
|
||||||
- ✅ 健康检查
|
- ✅ 健康检查
|
||||||
- ✅ 自动重启
|
- ✅ 自动重启
|
||||||
- ✅ 所有配置通过环境变量管理
|
|
||||||
|
|
||||||
### 环境变量说明
|
### 环境变量说明
|
||||||
|
|
||||||
|
|||||||
@@ -671,10 +671,7 @@ async function getAllAccounts() {
|
|||||||
if (accountData.proxy) {
|
if (accountData.proxy) {
|
||||||
try {
|
try {
|
||||||
accountData.proxy = JSON.parse(accountData.proxy)
|
accountData.proxy = JSON.parse(accountData.proxy)
|
||||||
// 屏蔽代理密码
|
// 不屏蔽代理密码,返回明文
|
||||||
if (accountData.proxy && accountData.proxy.password) {
|
|
||||||
accountData.proxy.password = '******'
|
|
||||||
}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// 如果解析失败,设置为null
|
// 如果解析失败,设置为null
|
||||||
accountData.proxy = null
|
accountData.proxy = null
|
||||||
|
|||||||
@@ -1883,7 +1883,19 @@ const selectedTagCount = computed(() => {
|
|||||||
|
|
||||||
// 分页相关
|
// 分页相关
|
||||||
const currentPage = ref(1)
|
const currentPage = ref(1)
|
||||||
const pageSize = ref(10)
|
// 从 localStorage 读取保存的每页显示条数,默认为 10
|
||||||
|
const getInitialPageSize = () => {
|
||||||
|
const saved = localStorage.getItem('apiKeysPageSize')
|
||||||
|
if (saved) {
|
||||||
|
const parsedSize = parseInt(saved, 10)
|
||||||
|
// 验证保存的值是否在允许的选项中
|
||||||
|
if ([10, 20, 50, 100].includes(parsedSize)) {
|
||||||
|
return parsedSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 10
|
||||||
|
}
|
||||||
|
const pageSize = ref(getInitialPageSize())
|
||||||
const pageSizeOptions = [10, 20, 50, 100]
|
const pageSizeOptions = [10, 20, 50, 100]
|
||||||
|
|
||||||
// 模态框状态
|
// 模态框状态
|
||||||
@@ -3640,6 +3652,11 @@ watch([currentPage, pageSize], () => {
|
|||||||
updateSelectAllState()
|
updateSelectAllState()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 监听每页显示条数变化,保存到 localStorage
|
||||||
|
watch(pageSize, (newSize) => {
|
||||||
|
localStorage.setItem('apiKeysPageSize', newSize.toString())
|
||||||
|
})
|
||||||
|
|
||||||
// 监听API Keys数据变化,清理无效的选中状态
|
// 监听API Keys数据变化,清理无效的选中状态
|
||||||
watch(apiKeys, () => {
|
watch(apiKeys, () => {
|
||||||
const validIds = new Set(apiKeys.value.map((key) => key.id))
|
const validIds = new Set(apiKeys.value.map((key) => key.id))
|
||||||
|
|||||||
Reference in New Issue
Block a user