update
Browse files- API_EXAMPLES.md +0 -283
- COMPLETE_SUCCESS_REPORT.md +0 -143
- DEPLOYMENT_GUIDE.md +0 -192
- DEPLOYMENT_STATUS.md +0 -124
- FINAL_DEPLOYMENT_STATUS.md +0 -134
- FINAL_SUCCESS_REPORT.md +0 -116
- HF_SPACES_TROUBLESHOOTING.md +0 -211
- OPENCODE_INTEGRATION.md +0 -182
- README.md +0 -324
- SUCCESS_REPORT.md +0 -112
- TEST_REPORT.md +0 -235
- checkupdate.sh +0 -16
- comprehensive-test.sh +0 -386
- deploy-check.sh +0 -95
- docker-start.sh +3 -3
- final-test.sh +0 -108
- health_check.sh +0 -60
- hf-spaces-test.sh +0 -377
- runtime-test.sh +0 -423
- test-api-endpoints.sh +0 -54
- test-connection.sh +0 -70
- test-nginx-config.sh +0 -62
- test-static-resources.sh +0 -54
- test_integration.sh +0 -85
API_EXAMPLES.md
DELETED
|
@@ -1,283 +0,0 @@
|
|
| 1 |
-
# 📋 OpenCode API 基本使用示例
|
| 2 |
-
|
| 3 |
-
## 🔐 认证信息
|
| 4 |
-
```
|
| 5 |
-
用户名: admin
|
| 6 |
-
密码: admin123
|
| 7 |
-
```
|
| 8 |
-
|
| 9 |
-
## 🚀 基本 API 调用示例
|
| 10 |
-
|
| 11 |
-
### 1. 健康检查
|
| 12 |
-
```bash
|
| 13 |
-
# OpenCode 服务器健康检查
|
| 14 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/global/health"
|
| 15 |
-
|
| 16 |
-
# Nginx 健康检查
|
| 17 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/health"
|
| 18 |
-
```
|
| 19 |
-
|
| 20 |
-
### 2. API 文档
|
| 21 |
-
```bash
|
| 22 |
-
# 获取完整的 API 文档 (OpenAPI 规范)
|
| 23 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/doc"
|
| 24 |
-
|
| 25 |
-
# 在浏览器中查看
|
| 26 |
-
# https://airsltd-ocngx.hf.space/opencode/doc
|
| 27 |
-
```
|
| 28 |
-
|
| 29 |
-
### 3. 项目管理
|
| 30 |
-
```bash
|
| 31 |
-
# 列出所有项目
|
| 32 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/project"
|
| 33 |
-
|
| 34 |
-
# 获取当前项目信息
|
| 35 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/project/current"
|
| 36 |
-
|
| 37 |
-
# 列出当前目录下的项目
|
| 38 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/project?directory=/path/to/project"
|
| 39 |
-
```
|
| 40 |
-
|
| 41 |
-
### 4. 会话管理
|
| 42 |
-
```bash
|
| 43 |
-
# 创建新的 AI 编程会话
|
| 44 |
-
curl -u admin:admin123 -s -X POST \
|
| 45 |
-
-H "Content-Type: application/json" \
|
| 46 |
-
-d '{"title": "AI 编程会话"}' \
|
| 47 |
-
"https://airsltd-ocngx.hf.space/opencode/session"
|
| 48 |
-
|
| 49 |
-
# 列出所有会话
|
| 50 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/session"
|
| 51 |
-
|
| 52 |
-
# 获取会话状态
|
| 53 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/session/status"
|
| 54 |
-
|
| 55 |
-
# 删除特定会话
|
| 56 |
-
curl -u admin:admin123 -s -X DELETE \
|
| 57 |
-
"https://airsltd-ocngx.hf.space/opencode/session/ses_123456"
|
| 58 |
-
```
|
| 59 |
-
|
| 60 |
-
### 5. AI 编程请求
|
| 61 |
-
```bash
|
| 62 |
-
# 创建会话并立即发送消息
|
| 63 |
-
SESSION=$(curl -u admin:admin123 -s -X POST \
|
| 64 |
-
-H "Content-Type: application/json" \
|
| 65 |
-
-d '{"title": "Python 开发"}' \
|
| 66 |
-
"https://airsltd-ocngx.hf.space/opencode/session" | jq -r '.id')
|
| 67 |
-
|
| 68 |
-
# 发送文本消息
|
| 69 |
-
curl -u admin:admin123 -s -X POST \
|
| 70 |
-
-H "Content-Type: application/json" \
|
| 71 |
-
-d '{
|
| 72 |
-
"parts": [
|
| 73 |
-
{"type": "text", "text": "请创建一个简单的 Python Flask 应用"}
|
| 74 |
-
]
|
| 75 |
-
}' \
|
| 76 |
-
"https://airsltd-ocngx.hf.space/opencode/session/$SESSION/message"
|
| 77 |
-
|
| 78 |
-
# 发送文件分析请求
|
| 79 |
-
curl -u admin:admin123 -s -X POST \
|
| 80 |
-
-H "Content-Type: application/json" \
|
| 81 |
-
-d '{
|
| 82 |
-
"parts": [
|
| 83 |
-
{"type": "text", "text": "请分析这个 Python 文件并优化性能"},
|
| 84 |
-
{"type": "file", "path": "/path/to/app.py"}
|
| 85 |
-
]
|
| 86 |
-
}' \
|
| 87 |
-
"https://airsltd-ocngx.hf.space/opencode/session/$SESSION/message"
|
| 88 |
-
```
|
| 89 |
-
|
| 90 |
-
### 6. 文件操作
|
| 91 |
-
```bash
|
| 92 |
-
# 搜索文件
|
| 93 |
-
curl -u admin:admin123 -s \
|
| 94 |
-
"https://airsltd-ocngx.hf.space/opencode/find/file?query=main.py"
|
| 95 |
-
|
| 96 |
-
# 读取文件内容
|
| 97 |
-
curl -u admin:admin123 -s \
|
| 98 |
-
"https://airsltd-ocngx.hf.space/opencode/file/content?path=/path/to/file.py"
|
| 99 |
-
|
| 100 |
-
# 列出目录
|
| 101 |
-
curl -u admin:admin123 -s \
|
| 102 |
-
"https://airsltd-ocngx.hf.space/opencode/file?path=/path/to/directory"
|
| 103 |
-
```
|
| 104 |
-
|
| 105 |
-
### 7. 提供商管理
|
| 106 |
-
```bash
|
| 107 |
-
# 列出所有可用的 AI 提供商
|
| 108 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/provider"
|
| 109 |
-
|
| 110 |
-
# 获取认证方法
|
| 111 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/provider/auth"
|
| 112 |
-
```
|
| 113 |
-
|
| 114 |
-
### 8. 配置管理
|
| 115 |
-
```bash
|
| 116 |
-
# 获取当前配置
|
| 117 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/config"
|
| 118 |
-
|
| 119 |
-
# 列出提供商标认方法
|
| 120 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/config/providers"
|
| 121 |
-
```
|
| 122 |
-
|
| 123 |
-
## 🧪 高级用法示例
|
| 124 |
-
|
| 125 |
-
### 创建 Web 应用
|
| 126 |
-
```bash
|
| 127 |
-
SESSION=$(curl -u admin:admin123 -s -X POST \
|
| 128 |
-
-H "Content-Type: application/json" \
|
| 129 |
-
-d '{"title": "Flask Web 开发"}' \
|
| 130 |
-
"https://airsltd-ocngx.hf.space/opencode/session" | jq -r '.id')
|
| 131 |
-
|
| 132 |
-
curl -u admin:admin123 -s -X POST \
|
| 133 |
-
-H "Content-Type: application/json" \
|
| 134 |
-
-d '{
|
| 135 |
-
"parts": [
|
| 136 |
-
{
|
| 137 |
-
"type": "text",
|
| 138 |
-
"text": "创建一个完整的 Flask Web 应用,包含:\n1. 主页路由 (/)\n2. 用户管理 API (/api/users)\n3. 数据库配置\n4. 基础的前端页面\n5. 错误处理\n请生成完整可运行的代码,包含所有必要的文件"
|
| 139 |
-
}
|
| 140 |
-
]
|
| 141 |
-
}' \
|
| 142 |
-
"https://airsltd-ocngx.hf.space/opencode/session/$SESSION/message"
|
| 143 |
-
```
|
| 144 |
-
|
| 145 |
-
### 代码重构
|
| 146 |
-
```bash
|
| 147 |
-
# 分析现有代码并重构
|
| 148 |
-
curl -u admin:admin123 -s -X POST \
|
| 149 |
-
-H "Content-Type: application/json" \
|
| 150 |
-
-d '{
|
| 151 |
-
"parts": [
|
| 152 |
-
{
|
| 153 |
-
"type": "text",
|
| 154 |
-
"text": "请重构这个函数,提高性能和可读性:\n\n```\ndef calculate_sum(numbers):\n total = 0\n for num in numbers:\n total += num\n return total\n```\n\n请使用 Python 最佳实践重写这个函数。"
|
| 155 |
-
}
|
| 156 |
-
]
|
| 157 |
-
}' \
|
| 158 |
-
"https://airsltd-ocngx.hf.space/opencode/session/$SESSION/message"
|
| 159 |
-
```
|
| 160 |
-
|
| 161 |
-
### 数据库操作
|
| 162 |
-
```bash
|
| 163 |
-
# 生成数据库操作代码
|
| 164 |
-
curl -u admin:admin123 -s -X POST \
|
| 165 |
-
-H "Content-Type: application/json" \
|
| 166 |
-
-d '{
|
| 167 |
-
"parts": [
|
| 168 |
-
{
|
| 169 |
-
"type": "text",
|
| 170 |
-
"text": "创建一个用户管理系统的数据库模型和 API,使用 SQLAlchemy 和 Flask,包含:\n1. User 模型\n2. CRUD 操作\n3. API 路由\n4. 数据验证\n5. 错误处理"
|
| 171 |
-
}
|
| 172 |
-
]
|
| 173 |
-
}' \
|
| 174 |
-
"https://airsltd-ocngx.hf.space/opencode/session/$SESSION/message"
|
| 175 |
-
```
|
| 176 |
-
|
| 177 |
-
## 🔍 响应处理
|
| 178 |
-
|
| 179 |
-
### 解析 JSON 响应
|
| 180 |
-
```bash
|
| 181 |
-
# 使用 jq 美化输出
|
| 182 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/session/ses_123" | jq '.'
|
| 183 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/session/ses_123" | jq '.title'
|
| 184 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/session/ses_123" | jq '.time'
|
| 185 |
-
```
|
| 186 |
-
|
| 187 |
-
### 流式响应处理
|
| 188 |
-
```bash
|
| 189 |
-
# 对于长时间运行的请求,可以监控进度
|
| 190 |
-
curl -u admin:admin123 -N \
|
| 191 |
-
-H "Content-Type: application/json" \
|
| 192 |
-
-d '{
|
| 193 |
-
"parts": [
|
| 194 |
-
{"type": "text", "text": "生成一个大型的 Web 应用项目,包括前端和后端"}
|
| 195 |
-
]
|
| 196 |
-
}' \
|
| 197 |
-
"https://airsltd-ocngx.hf.space/opencode/session/$SESSION/message"
|
| 198 |
-
```
|
| 199 |
-
|
| 200 |
-
## 🎯 最佳实践
|
| 201 |
-
|
| 202 |
-
### 1. 错误处理
|
| 203 |
-
```bash
|
| 204 |
-
# 检查响应状态
|
| 205 |
-
RESPONSE=$(curl -u admin:admin123 -w "%{http_code}" -s -o /tmp/response.json \
|
| 206 |
-
"https://airsltd-ocngx.hf.space/opencode/session")
|
| 207 |
-
|
| 208 |
-
if [ "$RESPONSE" = "200" ]; then
|
| 209 |
-
echo "✅ 请求成功"
|
| 210 |
-
cat /tmp/response.json | jq '.'
|
| 211 |
-
else
|
| 212 |
-
echo "❌ 请求失败,状态码: $RESPONSE"
|
| 213 |
-
fi
|
| 214 |
-
```
|
| 215 |
-
|
| 216 |
-
### 2. 会话管理
|
| 217 |
-
```bash
|
| 218 |
-
# 保存会话 ID 到环境变量
|
| 219 |
-
export OPENCODE_SESSION=$(curl -u admin:admin123 -s -X POST \
|
| 220 |
-
-H "Content-Type: application/json" \
|
| 221 |
-
-d '{"title": "编程助手"}' \
|
| 222 |
-
"https://airsltd-ocngx.hf.space/opencode/session" | jq -r '.id')
|
| 223 |
-
|
| 224 |
-
echo "会话 ID 已保存: $OPENCODE_SESSION"
|
| 225 |
-
|
| 226 |
-
# 在后续请求中使用
|
| 227 |
-
curl -u admin:admin123 -s "https://airsltd-ocngx.hf.space/opencode/session/$OPENCODE_SESSION/message" \
|
| 228 |
-
-H "Content-Type: application/json" \
|
| 229 |
-
-d '{"parts": [{"type": "text", "text": "继续之前的开发"}]}'
|
| 230 |
-
```
|
| 231 |
-
|
| 232 |
-
### 3. 批量操作
|
| 233 |
-
```bash
|
| 234 |
-
# 创建多个项目会话
|
| 235 |
-
for project in "用户管理" "订单系统" "数据分析"; do
|
| 236 |
-
curl -u admin:admin123 -s -X POST \
|
| 237 |
-
-H "Content-Type: application/json" \
|
| 238 |
-
-d "{\"title\": \"$project 开发\"}" \
|
| 239 |
-
"https://airsltd-ocngx.hf.space/opencode/session"
|
| 240 |
-
echo "创建了 $project 项目会话"
|
| 241 |
-
done
|
| 242 |
-
```
|
| 243 |
-
|
| 244 |
-
## 📱 实际应用场景
|
| 245 |
-
|
| 246 |
-
### 自动化代码生成
|
| 247 |
-
```bash
|
| 248 |
-
# 脚本:自动生成 REST API
|
| 249 |
-
generate_api() {
|
| 250 |
-
local model=$1
|
| 251 |
-
local description=$2
|
| 252 |
-
|
| 253 |
-
SESSION=$(curl -u admin:admin123 -s -X POST \
|
| 254 |
-
-H "Content-Type: application/json" \
|
| 255 |
-
-d "{\"title\": \"API 开发\"}" \
|
| 256 |
-
"https://airsltd-ocngx.hf.space/opencode/session" | jq -r '.id')
|
| 257 |
-
|
| 258 |
-
curl -u admin:admin123 -s -X POST \
|
| 259 |
-
-H "Content-Type: application/json" \
|
| 260 |
-
-d "{\"parts\": [{\"type\": \"text\", \"text\": \"创建 $description 的 REST API,使用 $model,包含完整的 CRUD 操作和错误处理\"}]}" \
|
| 261 |
-
"https://airsltd-ocngx.hf.space/opencode/session/$SESSION/message" | jq -r '.info.parts[1].text'
|
| 262 |
-
}
|
| 263 |
-
|
| 264 |
-
# 使用示例
|
| 265 |
-
generate_api "GPT-4" "用户管理系统"
|
| 266 |
-
```
|
| 267 |
-
|
| 268 |
-
### 代码审查助手
|
| 269 |
-
```bash
|
| 270 |
-
# 代码审查会话
|
| 271 |
-
REVIEW_SESSION=$(curl -u admin:admin123 -s -X POST \
|
| 272 |
-
-H "Content-Type: application/json" \
|
| 273 |
-
-d "{\"title\": \"代码审查\"}" \
|
| 274 |
-
"https://airsltd-ocngx.hf.space/opencode/session" | jq -r '.id')
|
| 275 |
-
|
| 276 |
-
# 提交代码审查
|
| 277 |
-
curl -u admin:admin123 -s -X POST \
|
| 278 |
-
-H "Content-Type: application/json" \
|
| 279 |
-
-d "{\"parts\": [{\"type\": \"text\", \"text\": \"请审查以下代码的安全性、性能和可维护性:[代码内容]\"}]}" \
|
| 280 |
-
"https://airsltd-ocngx.hf.space/opencode/session/$REVIEW_SESSION/message"
|
| 281 |
-
```
|
| 282 |
-
|
| 283 |
-
这个 API 集成现在完全可用!您可以通过这些命令实现各种 AI 辅助的编程任务。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
COMPLETE_SUCCESS_REPORT.md
DELETED
|
@@ -1,143 +0,0 @@
|
|
| 1 |
-
# 🎉 完整修复成功报告
|
| 2 |
-
|
| 3 |
-
## ✅ 所有问题已解决
|
| 4 |
-
|
| 5 |
-
**API路由问题已完全修复!**
|
| 6 |
-
|
| 7 |
-
### 🔧 修复内容
|
| 8 |
-
1. **静态资源路由** - 添加CSS、JS、图标等资源的专门代理配置
|
| 9 |
-
2. **API端点路由** - 为所有OpenCode API端点添加直接代理配置
|
| 10 |
-
3. **完整功能覆盖** - `/global/`、`/session`、`/project`、`/provider`等所有端点
|
| 11 |
-
|
| 12 |
-
## 📊 当前状态
|
| 13 |
-
|
| 14 |
-
### ✅ 所有端点正常访问
|
| 15 |
-
```
|
| 16 |
-
✅ 静态资源 (CSS/JS/图标): 200 OK
|
| 17 |
-
✅ Web界面: 200 OK
|
| 18 |
-
✅ /global/health: {"healthy":true,"version":"1.1.6"}
|
| 19 |
-
✅ /session: 200 OK
|
| 20 |
-
✅ /project: 200 OK
|
| 21 |
-
✅ /provider: 200 OK
|
| 22 |
-
✅ /file: 200 OK
|
| 23 |
-
✅ /find: 200 OK
|
| 24 |
-
✅ /config: 200 OK
|
| 25 |
-
✅ /doc: 200 OK
|
| 26 |
-
```
|
| 27 |
-
|
| 28 |
-
### ✅ 功能验证通过
|
| 29 |
-
- ✅ **HTML页面正常加载** - 包含完整的OpenCode内容
|
| 30 |
-
- ✅ **CSS样式正确应用** - 所有样式文件200 OK
|
| 31 |
-
- ✅ **JavaScript正常执行** - API调用成功
|
| 32 |
-
- ✅ **API端点全部可用** - 所有端点返回200
|
| 33 |
-
- ✅ **响应式设计** - 移动端完美适配
|
| 34 |
-
|
| 35 |
-
## 🌱 访问端点总览
|
| 36 |
-
|
| 37 |
-
### 🎯 主要使用地址
|
| 38 |
-
```
|
| 39 |
-
https://airsltd-ocngx.hf.space/opencode/
|
| 40 |
-
```
|
| 41 |
-
|
| 42 |
-
### 📡 完整功能列表
|
| 43 |
-
```
|
| 44 |
-
🌐 Web界面: https://airsltd-ocngx.hf.space/opencode/
|
| 45 |
-
📚 API文档: https://airsltd-ocngx.hf.space/opencode/doc
|
| 46 |
-
💚 健康检查: https://airsltd-ocngx.hf.space/global/health
|
| 47 |
-
🔄 全局事件: https://airsltd-ocngx.hf.space/global/event
|
| 48 |
-
💬 会话管理: https://airsltd-ocngx.hf.space/session
|
| 49 |
-
📁 项目管理: https://airsltd-ocngx.hf.space/project
|
| 50 |
-
🤖 AI提供商: https://airsltd-ocngx.hf.space/provider
|
| 51 |
-
📄 文件操作: https://airsltd-ocngx.hf.space/file
|
| 52 |
-
🔍 搜索功能: https://airsltd-ocngx.hf.space/find
|
| 53 |
-
⚙️ 配置管理: https://airsltd-ocngx.hf.space/config
|
| 54 |
-
```
|
| 55 |
-
|
| 56 |
-
### 📱 移动端体验
|
| 57 |
-
- 📱 **完美响应式设计** - 适配各种屏幕尺寸
|
| 58 |
-
- ⚡ **流畅交互体验** - 所有资源快速加载
|
| 59 |
-
- 💬 **实时AI对话** - 完整的编程助手功能
|
| 60 |
-
- 📝 **代码编辑** - 移动端友好的编辑器
|
| 61 |
-
- 🔄 **实时同步** - 所有API调用正常工作
|
| 62 |
-
|
| 63 |
-
## 🎯 最终架构设计
|
| 64 |
-
|
| 65 |
-
### 🌟 智能路由系统
|
| 66 |
-
```
|
| 67 |
-
用户请求 → Nginx (7860) → 智能路由分发
|
| 68 |
-
↓ ↓
|
| 69 |
-
/opencode/ → OpenCode (57860) → Web界面
|
| 70 |
-
/assets/* → OpenCode (57860) → 静态资源
|
| 71 |
-
/global/* → OpenCode (57860) → 全局API
|
| 72 |
-
/session* → OpenCode (57860) → 会话API
|
| 73 |
-
/project* → OpenCode (57860) → 项目API
|
| 74 |
-
/provider* → OpenCode (57860) → 提供商API
|
| 75 |
-
/file* → OpenCode (57860) → 文件API
|
| 76 |
-
/find* → OpenCode (57860) → 搜索API
|
| 77 |
-
/config* → OpenCode (57860) → 配置API
|
| 78 |
-
/ → 静态页面 + 认证
|
| 79 |
-
```
|
| 80 |
-
|
| 81 |
-
### 🛡️ 安全架构
|
| 82 |
-
- ✅ **主页认证保护** - admin/admin123
|
| 83 |
-
- ✅ **OpenCode界面公开** - 无需认证直接访问
|
| 84 |
-
- ✅ **Lua脚本过滤** - 防止恶意请求
|
| 85 |
-
- ✅ **CORS跨域支持** - 完整的跨域配置
|
| 86 |
-
- ✅ **请求日志记录** - 完整的访问审计
|
| 87 |
-
|
| 88 |
-
## 🚀 使用指南
|
| 89 |
-
|
| 90 |
-
### 📱 移动端用户
|
| 91 |
-
1. **打开手机浏览器**
|
| 92 |
-
2. **访问**: `https://airsltd-ocngx.hf.space/opencode/`
|
| 93 |
-
3. **无需认证** - 直接进入完整的AI编程界面
|
| 94 |
-
4. **开始使用** - 享受完整的移动端AI编程体验
|
| 95 |
-
|
| 96 |
-
### 🖥️ 桌面端用户
|
| 97 |
-
**主要访问**: `https://airsltd-ocngx.hf.space/opencode/`
|
| 98 |
-
**认证主页**: `https://airsltd-ocngx.hf.space/` (admin/admin123)
|
| 99 |
-
|
| 100 |
-
### 🔌 API集成
|
| 101 |
-
所有API端点可直接访问,无需`/opencode/`前缀:
|
| 102 |
-
- `https://airsltd-ocngx.hf.space/global/health`
|
| 103 |
-
- `https://airsltd-ocngx.hf.space/session`
|
| 104 |
-
- `https://airsltd-ocngx.hf.space/project`
|
| 105 |
-
等等...
|
| 106 |
-
|
| 107 |
-
## 🎊 成功实现的目标
|
| 108 |
-
|
| 109 |
-
### ✅ 核心目标达成
|
| 110 |
-
1. **✅ API和Web统一端口** - 端口7860访问所有功能
|
| 111 |
-
2. **✅ 完整路由覆盖** - 所有API端点正常工作
|
| 112 |
-
3. **✅ 移动端完美支持** - 手机浏览器完全可用
|
| 113 |
-
4. **✅ 零开发成本** - 利用OpenCode原生界面
|
| 114 |
-
5. **✅ 企业级安全** - 合理的认证和安全配置
|
| 115 |
-
|
| 116 |
-
### 🌟 技术成就
|
| 117 |
-
- **智能路由系统** - nginx精确分发各种请求
|
| 118 |
-
- **完整功能覆盖** - Web界面 + API端点 + 静态资源
|
| 119 |
-
- **高性能代理** - CORS、SSE、流式响应全面支持
|
| 120 |
-
- **移动端优化** - 响应式设计完美适配
|
| 121 |
-
- **企业级部署** - HuggingFace Space Docker化部署
|
| 122 |
-
|
| 123 |
-
---
|
| 124 |
-
|
| 125 |
-
## 🎉 最终总结
|
| 126 |
-
|
| 127 |
-
**🚀 增量实现web代理访问,实现在手机上进行界面编程 - 完全成功!**
|
| 128 |
-
|
| 129 |
-
### 🏆 关键成就
|
| 130 |
-
- ✅ **问题全部解决** - 静态资源404 + API路由404全部修复
|
| 131 |
-
- ✅ **功能完全正常** - Web界面 + API端点 + 移动端全部可用
|
| 132 |
-
- ✅ **统一访问体验** - 单一端口提供完整AI编程平台
|
| 133 |
-
- ✅ **零配置使用** - 用户直接访问即可使用
|
| 134 |
-
- ✅ **企业级部署** - 安全、稳定、高��能
|
| 135 |
-
|
| 136 |
-
### 🎯 最终效果
|
| 137 |
-
**用户现在可以在任何设备上完美使用完整的AI编程平台!**
|
| 138 |
-
|
| 139 |
-
**📱 移动端**: `https://airsltd-ocngx.hf.space/opencode/`
|
| 140 |
-
**🖥️ 桌面端**: `https://airsltd-ocngx.hf.space/opencode/`
|
| 141 |
-
**🔌 API端点**: `https://airsltd-ocngx.hf.space/[endpoint]`
|
| 142 |
-
|
| 143 |
-
**🎊 项目圆满完成!移动端AI编程平台已完全就绪!**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DEPLOYMENT_GUIDE.md
DELETED
|
@@ -1,192 +0,0 @@
|
|
| 1 |
-
# 🚀 HuggingFace Space 部署指南
|
| 2 |
-
|
| 3 |
-
## 📋 部署前检查
|
| 4 |
-
|
| 5 |
-
✅ **所有配置已验证通过**
|
| 6 |
-
- Dockerfile 配置正确
|
| 7 |
-
- nginx 代理配置完整
|
| 8 |
-
- OpenCode 启动脚本就绪
|
| 9 |
-
- 认证和安全配置完善
|
| 10 |
-
- README.md 元数据正确
|
| 11 |
-
|
| 12 |
-
## 🎯 部署目标
|
| 13 |
-
|
| 14 |
-
实现 **API 和 Web 统一端口访问**,让用户能在手机上通过浏览器直接进行 AI 编程交互。
|
| 15 |
-
|
| 16 |
-
## 📊 架构概览
|
| 17 |
-
|
| 18 |
-
```
|
| 19 |
-
HuggingFace Space (Docker)
|
| 20 |
-
├── Nginx (端口 7860)
|
| 21 |
-
│ ├── HTTP Basic Auth (admin/admin123)
|
| 22 |
-
│ ├── Lua 安全过滤
|
| 23 |
-
│ └── 代理到 /opencode/ → OpenCode
|
| 24 |
-
└── OpenCode Serve (端口 57860)
|
| 25 |
-
├── Web 界面 (SPA)
|
| 26 |
-
├── API 端点 (REST)
|
| 27 |
-
└── API 文档 (Swagger UI)
|
| 28 |
-
```
|
| 29 |
-
|
| 30 |
-
## 🔗 访问端点
|
| 31 |
-
|
| 32 |
-
### 🌐 Web 界面访问
|
| 33 |
-
```
|
| 34 |
-
https://[your-space].hf.space/opencode/
|
| 35 |
-
```
|
| 36 |
-
- 完整的 AI 编程 Web 界面
|
| 37 |
-
- 响应式设计,支持移动端
|
| 38 |
-
- 实时 AI 对话交互
|
| 39 |
-
- 代码编辑和项目管理
|
| 40 |
-
|
| 41 |
-
### 📡 API 端点访问
|
| 42 |
-
```
|
| 43 |
-
# API 文档 (Swagger UI)
|
| 44 |
-
https://[your-space].hf.space/opencode/doc
|
| 45 |
-
|
| 46 |
-
# 健康检查
|
| 47 |
-
https://[your-space].hf.space/opencode/global/health
|
| 48 |
-
|
| 49 |
-
# 会话管理
|
| 50 |
-
https://[your-space].hf.space/opencode/session
|
| 51 |
-
|
| 52 |
-
# 其他 API...
|
| 53 |
-
https://[your-space].hf.space/opencode/*
|
| 54 |
-
```
|
| 55 |
-
|
| 56 |
-
### 🔐 认证信息
|
| 57 |
-
```
|
| 58 |
-
用户名: admin
|
| 59 |
-
密码: admin123
|
| 60 |
-
```
|
| 61 |
-
|
| 62 |
-
## 📱 移动端使用
|
| 63 |
-
|
| 64 |
-
### 🎯 手机浏览器访问
|
| 65 |
-
1. 打开手机浏览器
|
| 66 |
-
2. 访问 `https://[your-space].hf.space/opencode/`
|
| 67 |
-
3. 输入认证信息 `admin/admin123`
|
| 68 |
-
4. 开始 AI 编程交互
|
| 69 |
-
|
| 70 |
-
### ✨ 移动端特性
|
| 71 |
-
- 📱 响应式界面设计
|
| 72 |
-
- 👆 触摸友好的交互
|
| 73 |
-
- 💬 实时 AI 对话
|
| 74 |
-
- 📝 代码编辑功能
|
| 75 |
-
- 📚 集成 API 文档
|
| 76 |
-
|
| 77 |
-
## 🚀 部署步骤
|
| 78 |
-
|
| 79 |
-
### 步骤 1: 上传代码到 HuggingFace Space
|
| 80 |
-
```bash
|
| 81 |
-
git add .
|
| 82 |
-
git commit -m "Ready for HuggingFace Space deployment"
|
| 83 |
-
git push origin main
|
| 84 |
-
```
|
| 85 |
-
|
| 86 |
-
### 步骤 2: 等待构建完成
|
| 87 |
-
- HuggingFace 会自动构建 Docker 镜像
|
| 88 |
-
- 预计构建时间:3-5 分钟
|
| 89 |
-
- 查看构建日志确认无错误
|
| 90 |
-
|
| 91 |
-
### 步骤 3: 验证部署
|
| 92 |
-
```bash
|
| 93 |
-
# 检查服务状态
|
| 94 |
-
curl -u admin:admin123 https://[your-space].hf.space/health
|
| 95 |
-
|
| 96 |
-
# 检查 OpenCode 集成
|
| 97 |
-
curl -u admin:admin123 https://[your-space].hf.space/opencode/global/health
|
| 98 |
-
|
| 99 |
-
# 访问 Web 界面
|
| 100 |
-
# 浏览器访问: https://[your-space].hf.space/opencode/
|
| 101 |
-
```
|
| 102 |
-
|
| 103 |
-
## 🧪 功能测试
|
| 104 |
-
|
| 105 |
-
### ✅ 基础功能测试
|
| 106 |
-
- [ ] Web 界面正常加载
|
| 107 |
-
- [ ] 认证登录成功
|
| 108 |
-
- [ ] AI 对话响应正常
|
| 109 |
-
- [ ] API 端点访问正常
|
| 110 |
-
|
| 111 |
-
### 📱 移动端测试
|
| 112 |
-
- [ ] 手机浏览器访问正常
|
| 113 |
-
- [ ] 界面响应式适配
|
| 114 |
-
- [ ] 触摸操作流畅
|
| 115 |
-
- [ ] AI 交互功能完整
|
| 116 |
-
|
| 117 |
-
### 🔌 API 测试
|
| 118 |
-
```bash
|
| 119 |
-
# 创建 AI 会话
|
| 120 |
-
curl -u admin:admin123 -X POST \
|
| 121 |
-
-H "Content-Type: application/json" \
|
| 122 |
-
-d '{"title": "Mobile Test Session"}' \
|
| 123 |
-
https://[your-space].hf.space/opencode/session
|
| 124 |
-
|
| 125 |
-
# 发送 AI 请求
|
| 126 |
-
curl -u admin:admin123 -X POST \
|
| 127 |
-
-H "Content-Type: application/json" \
|
| 128 |
-
-d '{
|
| 129 |
-
"parts": [{"type": "text", "text": "Hello from mobile!"}]
|
| 130 |
-
}' \
|
| 131 |
-
https://[your-space].hf.space/opencode/session/[session_id]/message
|
| 132 |
-
```
|
| 133 |
-
|
| 134 |
-
## 🔧 故障排除
|
| 135 |
-
|
| 136 |
-
### 常见问题
|
| 137 |
-
|
| 138 |
-
#### 1. 构建失败
|
| 139 |
-
- 检查 Dockerfile 语法
|
| 140 |
-
- 确认所有依赖包可用
|
| 141 |
-
- 查看构建日志错误信息
|
| 142 |
-
|
| 143 |
-
#### 2. 认证失败
|
| 144 |
-
- 确认用户名密码:`admin/admin123`
|
| 145 |
-
- 检查 .htpasswd 文件生成
|
| 146 |
-
- 验证 Basic Auth 配置
|
| 147 |
-
|
| 148 |
-
#### 3. OpenCode 不可达
|
| 149 |
-
- 检查内部端口 57860
|
| 150 |
-
- 验证 nginx 代理配置
|
| 151 |
-
- 确认 OpenCode 启动成功
|
| 152 |
-
|
| 153 |
-
#### 4. 移动端显示异常
|
| 154 |
-
- 检查响应式 CSS
|
| 155 |
-
- 验证 viewport 配置
|
| 156 |
-
- 测试不同浏览器兼容性
|
| 157 |
-
|
| 158 |
-
### 📊 监控检查
|
| 159 |
-
|
| 160 |
-
#### 服务健康状态
|
| 161 |
-
```bash
|
| 162 |
-
# Nginx 健康检查
|
| 163 |
-
curl -u admin:admin123 https://[your-space].hf.space/health
|
| 164 |
-
|
| 165 |
-
# OpenCode 健康检查
|
| 166 |
-
curl -u admin:admin123 https://[your-space].hf.space/opencode/global/health
|
| 167 |
-
```
|
| 168 |
-
|
| 169 |
-
#### 日志查看
|
| 170 |
-
```bash
|
| 171 |
-
# 在 HuggingFace Space 中查看容器日志
|
| 172 |
-
# 检查 nginx 和 opencode 服务状态
|
| 173 |
-
```
|
| 174 |
-
|
| 175 |
-
## 🎉 部署成功!
|
| 176 |
-
|
| 177 |
-
### 🌟 预期效果
|
| 178 |
-
- ✅ **统一访问入口** - 单一端口提供 Web + API
|
| 179 |
-
- ✅ **移动端完美支持** - 手机浏览器直接使用
|
| 180 |
-
- ✅ **企业级安全** - 认证 + 过滤 + 日志
|
| 181 |
-
- ✅ **完整 AI 功能** - 编程 + 对话 + 文档
|
| 182 |
-
- ✅ **高性能代理** - Nginx 负载均衡
|
| 183 |
-
|
| 184 |
-
### 🚀 开始使用
|
| 185 |
-
1. **桌面端**: 访问 Web 界面进行完整 AI 编程
|
| 186 |
-
2. **移动端**: 手机浏览器随时随地进行 AI 交互
|
| 187 |
-
3. **API 集成**: 通过 REST API 集成到其他应用
|
| 188 |
-
4. **文档查看**: Swagger UI 提供完整 API 文档
|
| 189 |
-
|
| 190 |
-
---
|
| 191 |
-
|
| 192 |
-
**🎯 恭喜!您已成功实现 API 和 Web 统一端口访问,支持移动端 AI 编程交互!**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DEPLOYMENT_STATUS.md
DELETED
|
@@ -1,124 +0,0 @@
|
|
| 1 |
-
# 🎉 部署完成状态报告
|
| 2 |
-
|
| 3 |
-
## ✅ 配置验证结果
|
| 4 |
-
|
| 5 |
-
**所有关键配置已检查并确认正确:**
|
| 6 |
-
|
| 7 |
-
### 🐳 Docker 配置
|
| 8 |
-
- ✅ Dockerfile 基于 openresty/openresty
|
| 9 |
-
- ✅ 正确安装 opencode-ai
|
| 10 |
-
- ✅ 暴露端口 7860 (HuggingFace 标准)
|
| 11 |
-
- ✅ 启动脚本权限正确
|
| 12 |
-
|
| 13 |
-
### 🚀 服务启动配置
|
| 14 |
-
- ✅ OpenCode 在内部端口 57860 启动
|
| 15 |
-
- ✅ Nginx 在外部端口 7860 启动
|
| 16 |
-
- ✅ 健康检查和自动验证
|
| 17 |
-
- ✅ 进程管理和错误处理
|
| 18 |
-
|
| 19 |
-
### 🌐 Nginx 代理配置
|
| 20 |
-
- ✅ 正确代理 /opencode/ → OpenCode
|
| 21 |
-
- ✅ HTTP Basic Auth (admin/admin123)
|
| 22 |
-
- ✅ Lua 脚本安全过滤
|
| 23 |
-
- ✅ CORS 跨域支持
|
| 24 |
-
- ✅ 流式响应优化
|
| 25 |
-
|
| 26 |
-
### 📱 移动端支持
|
| 27 |
-
- ✅ OpenCode 原生 SPA 响应式设计
|
| 28 |
-
- ✅ Swagger UI 移动端友好
|
| 29 |
-
- ✅ 统一端口访问体验
|
| 30 |
-
- ✅ 触摸操作支持
|
| 31 |
-
|
| 32 |
-
## 🎯 实现的功能
|
| 33 |
-
|
| 34 |
-
### 🌟 核心目标达成
|
| 35 |
-
**✅ API 和 Web 使用相同端口,不同端点**
|
| 36 |
-
- 外部统一端口:7860
|
| 37 |
-
- Web 界面:`/opencode/`
|
| 38 |
-
- API 端点:`/opencode/*`
|
| 39 |
-
- 完美复刻原始 OpenCode 架构
|
| 40 |
-
|
| 41 |
-
### 📱 移动端编程体验
|
| 42 |
-
**✅ 手机上进行界面编程**
|
| 43 |
-
- 响应式 AI 编程界面
|
| 44 |
-
- 实时对话交互
|
| 45 |
-
- 代码编辑功能
|
| 46 |
-
- 项目管理能力
|
| 47 |
-
- API 文档集成
|
| 48 |
-
|
| 49 |
-
## 🔗 访问端点总览
|
| 50 |
-
|
| 51 |
-
### 🌐 Web 界面
|
| 52 |
-
```
|
| 53 |
-
https://[your-space].hf.space/opencode/
|
| 54 |
-
```
|
| 55 |
-
- 完整 AI 编程 Web 界面
|
| 56 |
-
- 移动端完美适配
|
| 57 |
-
- 实时 AI 对话交互
|
| 58 |
-
|
| 59 |
-
### 📡 API 端点
|
| 60 |
-
```
|
| 61 |
-
API 文档: /opencode/doc
|
| 62 |
-
健康检查: /opencode/global/health
|
| 63 |
-
会话管理: /opencode/session
|
| 64 |
-
项目管理: /opencode/project
|
| 65 |
-
文件操作: /opencode/file/*
|
| 66 |
-
搜索功能: /opencode/find/*
|
| 67 |
-
```
|
| 68 |
-
|
| 69 |
-
### 🔐 认证信息
|
| 70 |
-
```
|
| 71 |
-
用户名: admin
|
| 72 |
-
密码: admin123
|
| 73 |
-
```
|
| 74 |
-
|
| 75 |
-
## 🚀 部署就绪状态
|
| 76 |
-
|
| 77 |
-
### 📋 文件清单
|
| 78 |
-
- ✅ Dockerfile (Docker 镜像构建)
|
| 79 |
-
- ✅ docker-start.sh (服务启动脚本)
|
| 80 |
-
- ✅ nginx/nginx.conf (主配置)
|
| 81 |
-
- ✅ nginx/conf.d/default.conf (代理配置)
|
| 82 |
-
- ✅ nginx/html/index.html (静态页面)
|
| 83 |
-
- ✅ README.md (HuggingFace 元数据)
|
| 84 |
-
- ✅ deploy-check.sh (部署验证脚本)
|
| 85 |
-
- ✅ DEPLOYMENT_GUIDE.md (部署指南)
|
| 86 |
-
|
| 87 |
-
### 🎯 下一步行动
|
| 88 |
-
1. **上传代码** - 推送到 HuggingFace Space
|
| 89 |
-
2. **等待构建** - Docker 自动构建部署
|
| 90 |
-
3. **验证功能** - 测试 Web 和 API 端点
|
| 91 |
-
4. **移动端测试** - 手机浏览器验证
|
| 92 |
-
|
| 93 |
-
## 🎊 成功标准
|
| 94 |
-
|
| 95 |
-
### ✅ 部署成功指标
|
| 96 |
-
- [ ] Docker 容器成功构建和启动
|
| 97 |
-
- [ ] 所有端点正常响应 (200 OK)
|
| 98 |
-
- [ ] Web 界面在移动端完美显示
|
| 99 |
-
- [ ] AI 编程功能完全可用
|
| 100 |
-
- [ ] API 文档和测试工具正常
|
| 101 |
-
|
| 102 |
-
### 🌟 用户体验
|
| 103 |
-
- **桌面端**: 完整的 AI 编程开发环境
|
| 104 |
-
- **移动端**: 随时随地的 AI 编程助手
|
| 105 |
-
- **API 集成**: 标准化的 REST API 接口
|
| 106 |
-
- **文档支持**: 交互式 API 文档和测试
|
| 107 |
-
|
| 108 |
-
---
|
| 109 |
-
|
| 110 |
-
## 🎉 总结
|
| 111 |
-
|
| 112 |
-
**🚀 增量实现 Web 代理访问,实现在手机上进行界面编程 - 目标达成!**
|
| 113 |
-
|
| 114 |
-
### 🎯 核心成就
|
| 115 |
-
1. **✅ 统一架构** - API 和 Web 使用相同端口不同端点
|
| 116 |
-
2. **✅ 移动端支持** - 手机浏览器完美适配
|
| 117 |
-
3. **✅ 零开发成本** - 利用 OpenCode 原生界面
|
| 118 |
-
4. **✅ 企业级安全** - 完整的认证和过滤机制
|
| 119 |
-
5. **✅ 高性能代理** - Nginx 负载均衡和优化
|
| 120 |
-
|
| 121 |
-
### 🚀 立即开始
|
| 122 |
-
**项目已完全准备就绪,可以直接上传到 HuggingFace Space 进行部署!**
|
| 123 |
-
|
| 124 |
-
**🎊 恭喜您成功实现了移动端 AI 编程平台的完整解决方案!**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FINAL_DEPLOYMENT_STATUS.md
DELETED
|
@@ -1,134 +0,0 @@
|
|
| 1 |
-
# 🎉 最终部署状态报告
|
| 2 |
-
|
| 3 |
-
## ✅ 核心功能已完全正常
|
| 4 |
-
|
| 5 |
-
**移动端AI编程平台的主要功能已经完全工作!**
|
| 6 |
-
|
| 7 |
-
### 📊 当前成功状态
|
| 8 |
-
|
| 9 |
-
#### ✅ 完全正常的功能
|
| 10 |
-
```
|
| 11 |
-
🌐 Web界面: ✅ 200 OK - 完整加载
|
| 12 |
-
📱 响应式设计: ✅ 完美适配移动端
|
| 13 |
-
🎨 静态资源 (CSS/JS): ✅ 全部 200 OK
|
| 14 |
-
🖼️ 图标和主题文件: ✅ 全部 200 OK
|
| 15 |
-
📡 主要API端点: ✅ 全部 200 OK
|
| 16 |
-
• /global/health
|
| 17 |
-
• /path
|
| 18 |
-
• /pty
|
| 19 |
-
• /experimental
|
| 20 |
-
• /instance
|
| 21 |
-
• /vcs
|
| 22 |
-
• /session
|
| 23 |
-
• /project
|
| 24 |
-
• /provider
|
| 25 |
-
• /config
|
| 26 |
-
```
|
| 27 |
-
|
| 28 |
-
#### ✅ API验证说明
|
| 29 |
-
```
|
| 30 |
-
/file 和 /find 返回400: 这是正常的API验证错误
|
| 31 |
-
原因: 这些端点需要必需的参数(如path或pattern)
|
| 32 |
-
这是API设计的正常行为,不是配置问题
|
| 33 |
-
```
|
| 34 |
-
|
| 35 |
-
#### 🔄 配置更新中
|
| 36 |
-
```
|
| 37 |
-
/doc 端点: 配置已更新,等待HuggingFace重新部署
|
| 38 |
-
这是最后一个待解决的端点
|
| 39 |
-
```
|
| 40 |
-
|
| 41 |
-
## 🎯 实际使用效果
|
| 42 |
-
|
| 43 |
-
### 📱 移动端完全可用
|
| 44 |
-
**访问地址**: `https://airsltd-ocngx.hf.space/opencode/`
|
| 45 |
-
|
| 46 |
-
**用户体验**:
|
| 47 |
-
- ✅ **完美加载** - Web界面完全正常显示
|
| 48 |
-
- ✅ **响应式设计** - 手机、平板、桌面完美适配
|
| 49 |
-
- ✅ **触摸友好** - 移动端交互流畅
|
| 50 |
-
- ✅ **功能完整** - AI编程对话、代码编辑等全部功能正常
|
| 51 |
-
- ✅ **实时交互** - API调用正常,与AI助手对话流畅
|
| 52 |
-
|
| 53 |
-
### 🖥️ 桌面端完全可用
|
| 54 |
-
**访问地址**: `https://airsltd-ocngx.hf.space/opencode/`
|
| 55 |
-
|
| 56 |
-
**功能特性**:
|
| 57 |
-
- ✅ **完整Web界面** - 与原生OpenCode体验一致
|
| 58 |
-
- ✅ **API功能齐全** - 所有API端点正常工作
|
| 59 |
-
- ✅ **高性能** - nginx代理优化,响应快速
|
| 60 |
-
- ✅ **安全可靠** - 企业级认证和安全机制
|
| 61 |
-
|
| 62 |
-
## 🌟 技术成就
|
| 63 |
-
|
| 64 |
-
### ✅ 核心目标达成
|
| 65 |
-
1. **✅ API和Web统一端口** - 端口7860访问所有功能
|
| 66 |
-
2. **✅ 移动端完美支持** - 手机浏览器完全可用
|
| 67 |
-
3. **✅ 零开发成本** - 利用OpenCode原生界面
|
| 68 |
-
4. **✅ 企业级安全** - 认证和安全配置合理
|
| 69 |
-
5. **✅ 高性能部署** - nginx智能路由和优化
|
| 70 |
-
|
| 71 |
-
### 🏗️ 技术架构亮点
|
| 72 |
-
```
|
| 73 |
-
智能路由系统:
|
| 74 |
-
├── /opencode/ → OpenCode (57860) → Web界面
|
| 75 |
-
├── /assets/* → OpenCode (57860) → 静态资源
|
| 76 |
-
├── /global/* → OpenCode (57860) → 全局API
|
| 77 |
-
├── /session* → OpenCode (57860) → 会话API
|
| 78 |
-
├── /project* → OpenCode (57860) → 项目API
|
| 79 |
-
├── /provider* → OpenCode (57860) → 提供商API
|
| 80 |
-
├── /file* → OpenCode (57860) → 文件API
|
| 81 |
-
├── /find* → OpenCode (57860) → 搜索API
|
| 82 |
-
├── /config* → OpenCode (57860) → 配置API
|
| 83 |
-
├── /path* → OpenCode (57860) → 路径API
|
| 84 |
-
├── /pty* → OpenCode (57860) → 终端API
|
| 85 |
-
├── /experimental* → OpenCode (57860) → 实验API
|
| 86 |
-
├── /instance* → OpenCode (57860) → 实例API
|
| 87 |
-
└── /vcs* → OpenCode (57860) → 版本控制API
|
| 88 |
-
```
|
| 89 |
-
|
| 90 |
-
## 🚀 立即可用
|
| 91 |
-
|
| 92 |
-
### 📱 移动端用户
|
| 93 |
-
**直接访问**: `https://airsltd-ocngx.hf.space/opencode/`
|
| 94 |
-
- 无需认证
|
| 95 |
-
- 完整AI编程功能
|
| 96 |
-
- 移动端优化体验
|
| 97 |
-
- 实时AI对话交互
|
| 98 |
-
|
| 99 |
-
### 🖥️ 桌面端用户
|
| 100 |
-
**主要访问**: `https://airsltd-ocngx.hf.space/opencode/`
|
| 101 |
-
**认证主页**: `https://airsltd-ocngx.hf.space/` (admin/admin123)
|
| 102 |
-
|
| 103 |
-
### 🔌 API开发者
|
| 104 |
-
所有API端点直接可用:
|
| 105 |
-
`https://airsltd-ocngx.hf.space/[endpoint]`
|
| 106 |
-
|
| 107 |
-
---
|
| 108 |
-
|
| 109 |
-
## 🎉 最终总结
|
| 110 |
-
|
| 111 |
-
**🚀 增量实现web代理访问,实现在手机上进行界面编程 - 完全成功!**
|
| 112 |
-
|
| 113 |
-
### 🏆 关键成就
|
| 114 |
-
- ✅ **核心功能完全正常** - Web界面 + API + 移动端全部工作
|
| 115 |
-
- ✅ **零配置使用** - 用户直接访问即可使用
|
| 116 |
-
- ✅ **统一访问体验** - 单一端口提供完整AI编程平台
|
| 117 |
-
- ✅ **移动端完美** - 手机编程体验优秀
|
| 118 |
-
- ✅ **企业级部署** - 安全、稳定、高性能
|
| 119 |
-
|
| 120 |
-
### 🎯 实际效果
|
| 121 |
-
**用户现在可以在任何设备上完美使用完整的AI编程平台!**
|
| 122 |
-
|
| 123 |
-
**📱 移动端**: `https://airsltd-ocngx.hf.space/opencode/`
|
| 124 |
-
**🖥️ 桌面端**: `https://airsltd-ocngx.hf.space/opencode/`
|
| 125 |
-
**🔌 API端点**: `https://airsltd-ocngx.hf.space/[endpoint]`
|
| 126 |
-
|
| 127 |
-
**🎊 项目目标圆满完成!移动端AI编程平台已完全就绪并正常工作!**
|
| 128 |
-
|
| 129 |
-
---
|
| 130 |
-
|
| 131 |
-
### 📝 备注
|
| 132 |
-
- `/file`和`/find`端点的400错误是正常的API验证行为
|
| 133 |
-
- `/doc`端点配置已更新,等待HuggingFace重新部署生效
|
| 134 |
-
- 所有核心功能(Web界面、移动端体验、API调用)已完全正常
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FINAL_SUCCESS_REPORT.md
DELETED
|
@@ -1,116 +0,0 @@
|
|
| 1 |
-
# 🎉 静态资源问题修复完成
|
| 2 |
-
|
| 3 |
-
## ✅ 问题解决
|
| 4 |
-
|
| 5 |
-
**所有静态资源404错误已修复!**
|
| 6 |
-
|
| 7 |
-
### 🔧 修复内容
|
| 8 |
-
1. **添加静态资源路由** - 为`/assets/`、`/oc-theme-preload.js`等添加专门的nginx代理配置
|
| 9 |
-
2. **修复favicon路由** - 更新正则表达式以正确匹配所有favicon文件
|
| 10 |
-
3. **保持API代理** - `/opencode/`路径继续正常工作
|
| 11 |
-
|
| 12 |
-
## 📊 当前状态
|
| 13 |
-
|
| 14 |
-
### ✅ 所有资源正常访问
|
| 15 |
-
```
|
| 16 |
-
/assets/index-OLRiU-d3.js: ✅ 200 OK
|
| 17 |
-
/assets/index-DViKQ2Re.css: ✅ 200 OK
|
| 18 |
-
/oc-theme-preload.js: ✅ 200 OK
|
| 19 |
-
/site.webmanifest: ✅ 200 OK
|
| 20 |
-
/favicon.ico: ✅ 200 OK
|
| 21 |
-
/favicon-96x96.png: ✅ 200 OK
|
| 22 |
-
```
|
| 23 |
-
|
| 24 |
-
### ✅ Web界面完全正常
|
| 25 |
-
- ✅ HTML页面正确加载
|
| 26 |
-
- ✅ 所有CSS样式正常应用
|
| 27 |
-
- ✅ JavaScript文件正常执行
|
| 28 |
-
- ✅ 图标和manifest正常加载
|
| 29 |
-
- ✅ 响应式设计工作正常
|
| 30 |
-
|
| 31 |
-
## 🌱 访问端点
|
| 32 |
-
|
| 33 |
-
### 🎯 主要使用地址
|
| 34 |
-
```
|
| 35 |
-
https://airsltd-ocngx.hf.space/opencode/
|
| 36 |
-
```
|
| 37 |
-
|
| 38 |
-
### 📡 完整功能列表
|
| 39 |
-
```
|
| 40 |
-
Web界面: https://airsltd-ocngx.hf.space/opencode/
|
| 41 |
-
API文档: https://airsltd-ocngx.hf.space/opencode/doc
|
| 42 |
-
健康检查: https://airsltd-ocngx.hf.space/opencode/global/health
|
| 43 |
-
会话管理: https://airsltd-ocngx.hf.space/opencode/session
|
| 44 |
-
静态资源: https://airsltd-ocngx.hf.space/assets/*
|
| 45 |
-
主题脚本: https://airsltd-ocngx.hf.space/oc-theme-preload.js
|
| 46 |
-
站点配置: https://airsltd-ocngx.hf.space/site.webmanifest
|
| 47 |
-
```
|
| 48 |
-
|
| 49 |
-
## 📱 移动端使用指南
|
| 50 |
-
|
| 51 |
-
### 🎯 手机访问体验
|
| 52 |
-
1. **打开手机浏览器**
|
| 53 |
-
2. **访问**: `https://airsltd-ocngx.hf.space/opencode/`
|
| 54 |
-
3. **无需认证** - 直接进入完整的AI编程界面
|
| 55 |
-
4. **完美体验** - 响应式设计,触摸友好
|
| 56 |
-
|
| 57 |
-
### ✨ 移动端功能确认
|
| 58 |
-
- 📱 **响应式界面** - 适配各种屏幕尺寸
|
| 59 |
-
- 🎨 **样式完整** - 所有CSS正常加载
|
| 60 |
-
- ⚡ **交互流畅** - JavaScript正常执行
|
| 61 |
-
- 🖼️ **图标显示** - favicon和主题图标正常
|
| 62 |
-
- 💬 **AI对话** - 完整的编程助手功能
|
| 63 |
-
|
| 64 |
-
## 🎊 成功实现的目标
|
| 65 |
-
|
| 66 |
-
### ✅ 核心目标达成
|
| 67 |
-
1. **✅ API和Web统一端口** - 端口7860访问所有功能
|
| 68 |
-
2. **✅ 静态资源正常加载** - 所有CSS、JS、图标文件正常
|
| 69 |
-
3. **✅ 移动端完美支持** - 手机浏览器完全可用
|
| 70 |
-
4. **✅ 无认证访问** - OpenCode界面直接可用
|
| 71 |
-
5. **✅ 企业级安全** - 主页保持认证保护
|
| 72 |
-
|
| 73 |
-
### 🌟 技术架构优化
|
| 74 |
-
```
|
| 75 |
-
用户请求 → Nginx (7860) → 智能路由分发
|
| 76 |
-
↓ ↓
|
| 77 |
-
/opencode/ → OpenCode (57860) → Web界面 + API
|
| 78 |
-
/assets/* → OpenCode (57860) → 静态资源
|
| 79 |
-
/* → 静态页面 + 认证
|
| 80 |
-
```
|
| 81 |
-
|
| 82 |
-
## 🚀 立即开始使用
|
| 83 |
-
|
| 84 |
-
### 📱 移动端用户
|
| 85 |
-
**直接访问**: `https://airsltd-ocngx.hf.space/opencode/`
|
| 86 |
-
- 完整的AI编程Web界面
|
| 87 |
-
- 响应式移动端体验
|
| 88 |
-
- 实时AI对话交互
|
| 89 |
-
- 所有功能完全可用
|
| 90 |
-
|
| 91 |
-
### 🖥️ 桌面端用户
|
| 92 |
-
**主要访问**: `https://airsltd-ocngx.hf.space/opencode/`
|
| 93 |
-
**认证主页**: `https://airsltd-ocngx.hf.space/` (admin/admin123)
|
| 94 |
-
|
| 95 |
-
### 🔌 API开发者
|
| 96 |
-
所有API端点通过: `https://airsltd-ocngx.hf.space/opencode/*` 访问
|
| 97 |
-
|
| 98 |
-
---
|
| 99 |
-
|
| 100 |
-
## 🎉 最终总结
|
| 101 |
-
|
| 102 |
-
**🚀 增量实现web代理访问,实现在手机上进行界面编程 - 完全成功!**
|
| 103 |
-
|
| 104 |
-
### 🏆 关键成就
|
| 105 |
-
- ✅ **问题完全解决** - 静态资源404错误全部修复
|
| 106 |
-
- ✅ **零开发成本** - 利用OpenCode原生界面
|
| 107 |
-
- ✅ **统一架构** - API和Web完美融合
|
| 108 |
-
- ✅ **移动端优化** - 手机编程体验优秀
|
| 109 |
-
- ✅ **高性能路由** - nginx智能分发请求
|
| 110 |
-
|
| 111 |
-
### 🎯 最终效果
|
| 112 |
-
**用户现在可以在手机上完美使用完整的AI编程平台!**
|
| 113 |
-
|
| 114 |
-
访问地址:**https://airsltd-ocngx.hf.space/opencode/**
|
| 115 |
-
|
| 116 |
-
**🎊 项目圆满完成!**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HF_SPACES_TROUBLESHOOTING.md
DELETED
|
@@ -1,211 +0,0 @@
|
|
| 1 |
-
# Hugging Face Spaces 部署故障排除指南
|
| 2 |
-
|
| 3 |
-
## 🚨 当前问题
|
| 4 |
-
|
| 5 |
-
**错误信息:** `Could not connect to server. Is there a server running at https://airsltd-ocngx.hf.space?`
|
| 6 |
-
|
| 7 |
-
**问题分析:** 这表明Hugging Face Space可能没有成功启动或正在构建中。
|
| 8 |
-
|
| 9 |
-
## 🔍 诊断步骤
|
| 10 |
-
|
| 11 |
-
### 1. 检查Space状态
|
| 12 |
-
|
| 13 |
-
首先确认Space的实际状态:
|
| 14 |
-
|
| 15 |
-
```bash
|
| 16 |
-
# 检查Space是否可访问
|
| 17 |
-
curl -I https://airsltd-ocngx.hf.space
|
| 18 |
-
|
| 19 |
-
# 检查Space构建状态
|
| 20 |
-
# 需要在Hugging Face网站上查看:
|
| 21 |
-
# https://huggingface.co/spaces/airsltd/ocngx
|
| 22 |
-
```
|
| 23 |
-
|
| 24 |
-
### 2. 可能的原因
|
| 25 |
-
|
| 26 |
-
#### A. Space正在构建中
|
| 27 |
-
- **症状:** 新部署的Space需要时间构建
|
| 28 |
-
- **解决:** 等待构建完成(通常5-15分钟)
|
| 29 |
-
|
| 30 |
-
#### B. 构建失败
|
| 31 |
-
- **症状:** Space存在但无法访问
|
| 32 |
-
- **解决:** 检查构建日志
|
| 33 |
-
|
| 34 |
-
#### C. 运行时错误
|
| 35 |
-
- **症状:** Space构建成功但启动失败
|
| 36 |
-
- **解决:** 检查运行日志
|
| 37 |
-
|
| 38 |
-
#### D. 资源限制
|
| 39 |
-
- **症状:** Space因资源不足被终止
|
| 40 |
-
- **解决:** 检查资源使用情况
|
| 41 |
-
|
| 42 |
-
## 🛠️ 故障排除方案
|
| 43 |
-
|
| 44 |
-
### 方案1:检查Space状态页面
|
| 45 |
-
|
| 46 |
-
访问Hugging Face网站查看Space状态:
|
| 47 |
-
1. 打开 https://huggingface.co/spaces/airsltd/ocngx
|
| 48 |
-
2. 查看"App"状态
|
| 49 |
-
3. 检查是否有错误信息
|
| 50 |
-
|
| 51 |
-
### 方案2:检查构建日志
|
| 52 |
-
|
| 53 |
-
在Space页面查看构建日志:
|
| 54 |
-
1. 点击"Files"标签
|
| 55 |
-
2. 查看"README.md"是否包含构建信息
|
| 56 |
-
3. 检查".dockerignore"和"Dockerfile"
|
| 57 |
-
|
| 58 |
-
### 方案3:重新部署
|
| 59 |
-
|
| 60 |
-
如果Space状态异常,尝试重新部署:
|
| 61 |
-
|
| 62 |
-
```bash
|
| 63 |
-
# 1. 检查本地配置
|
| 64 |
-
./comprehensive-test.sh
|
| 65 |
-
|
| 66 |
-
# 2. 重新构建(如果需要)
|
| 67 |
-
docker build -t ocngx .
|
| 68 |
-
|
| 69 |
-
# 3. 测试本地运行
|
| 70 |
-
docker run -p 7860:7860 ocngx
|
| 71 |
-
```
|
| 72 |
-
|
| 73 |
-
### 方案4:检查配置文件
|
| 74 |
-
|
| 75 |
-
确认关键配置文件正确:
|
| 76 |
-
|
| 77 |
-
#### Dockerfile检查
|
| 78 |
-
```dockerfile
|
| 79 |
-
FROM openresty/openresty:latest
|
| 80 |
-
|
| 81 |
-
# 安装Node.js
|
| 82 |
-
RUN apt-get update && apt-get install -y curl && \
|
| 83 |
-
curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
|
| 84 |
-
apt-get install -y nodejs && \
|
| 85 |
-
npm install -g opencode-ai
|
| 86 |
-
|
| 87 |
-
# 复制配置文件
|
| 88 |
-
COPY nginx/nginx.conf /usr/local/openresty/nginx/conf/nginx.conf
|
| 89 |
-
COPY nginx/conf.d/default.conf /usr/local/openresty/nginx/conf/conf.d/default.conf
|
| 90 |
-
COPY nginx/html/ /usr/local/openresty/nginx/html/
|
| 91 |
-
|
| 92 |
-
# 复制启动脚本
|
| 93 |
-
COPY docker-start.sh /docker-start.sh
|
| 94 |
-
RUN chmod +x /docker-start.sh
|
| 95 |
-
|
| 96 |
-
# 暴露端口
|
| 97 |
-
EXPOSE 7860
|
| 98 |
-
|
| 99 |
-
# 启动命令
|
| 100 |
-
CMD ["/docker-start.sh"]
|
| 101 |
-
```
|
| 102 |
-
|
| 103 |
-
#### 启动脚本检查
|
| 104 |
-
```bash
|
| 105 |
-
#!/bin/bash
|
| 106 |
-
# 启动OpenCode
|
| 107 |
-
opencode-ai --host 0.0.0.0 --port 57860 &
|
| 108 |
-
|
| 109 |
-
# 等待OpenCode启动
|
| 110 |
-
sleep 5
|
| 111 |
-
|
| 112 |
-
# 启动Nginx
|
| 113 |
-
nginx -g 'daemon off;'
|
| 114 |
-
```
|
| 115 |
-
|
| 116 |
-
## 📋 配置验证清单
|
| 117 |
-
|
| 118 |
-
在重新部署前,确认以下配置:
|
| 119 |
-
|
| 120 |
-
### ✅ Nginx配置
|
| 121 |
-
- [ ] 监听端口7860
|
| 122 |
-
- [ ] Basic Auth配置正确
|
| 123 |
-
- [ ] 代理到127.0.0.1:57860
|
| 124 |
-
- [ ] 路径重写规则正确
|
| 125 |
-
|
| 126 |
-
### ✅ OpenCode配置
|
| 127 |
-
- [ ] 监听0.0.0.0:57860
|
| 128 |
-
- [ ] 允许外部访问
|
| 129 |
-
- [ ] 启动脚本可执行
|
| 130 |
-
|
| 131 |
-
### ✅ Docker配置
|
| 132 |
-
- [ ] 基础镜像正确
|
| 133 |
-
- [ ] 依赖安装完整
|
| 134 |
-
- [ ] 端口暴露正确
|
| 135 |
-
- [ ] 启动命令有效
|
| 136 |
-
|
| 137 |
-
## 🚀 重新部署步骤
|
| 138 |
-
|
| 139 |
-
### 1. 准备部署
|
| 140 |
-
```bash
|
| 141 |
-
# 确保所有文件已提交
|
| 142 |
-
git add .
|
| 143 |
-
git commit -m "Update configuration for HF Spaces deployment"
|
| 144 |
-
git push
|
| 145 |
-
```
|
| 146 |
-
|
| 147 |
-
### 2. 触发重新构建
|
| 148 |
-
在Hugging Face Space页面:
|
| 149 |
-
1. 点击"Settings"标签
|
| 150 |
-
2. 在"Factory"部分点击"Restart Space"
|
| 151 |
-
3. 等待重新构建完成
|
| 152 |
-
|
| 153 |
-
### 3. 监控部署过程
|
| 154 |
-
- 查看构建日志
|
| 155 |
-
- 确认没有错误
|
| 156 |
-
- 等待Space变为"Running"状态
|
| 157 |
-
|
| 158 |
-
## 🧪 部署后测试
|
| 159 |
-
|
| 160 |
-
一旦Space重新启动,运行以下测试:
|
| 161 |
-
|
| 162 |
-
```bash
|
| 163 |
-
# 测试基础连接
|
| 164 |
-
curl -I https://airsltd-ocngx.hf.space
|
| 165 |
-
|
| 166 |
-
# 测试认证
|
| 167 |
-
curl -u admin:admin123 https://airsltd-ocngx.hf.space/health
|
| 168 |
-
|
| 169 |
-
# 测试OpenCode端点
|
| 170 |
-
curl -u admin:admin123 https://airsltd-ocngx.hf.space/opencode/api/global/health
|
| 171 |
-
```
|
| 172 |
-
|
| 173 |
-
## 📞 获取帮助
|
| 174 |
-
|
| 175 |
-
如果问题仍然存在:
|
| 176 |
-
|
| 177 |
-
1. **查看Hugging Face状态**
|
| 178 |
-
- 访问 https://status.huggingface.co
|
| 179 |
-
- 确认平台无故障
|
| 180 |
-
|
| 181 |
-
2. **检查社区论坛**
|
| 182 |
-
- 搜索类似问题
|
| 183 |
-
- 在 https://discuss.huggingface.co 提问
|
| 184 |
-
|
| 185 |
-
3. **检查Space限制**
|
| 186 |
-
- 确认未超出免费额度
|
| 187 |
-
- 检查CPU/内存使用限制
|
| 188 |
-
|
| 189 |
-
## 🔄 备选方案
|
| 190 |
-
|
| 191 |
-
如果Hugging Face Spaces持续有问题,考虑:
|
| 192 |
-
|
| 193 |
-
1. **本地测试**
|
| 194 |
-
```bash
|
| 195 |
-
docker build -t ocngx .
|
| 196 |
-
docker run -p 7860:7860 ocngx
|
| 197 |
-
```
|
| 198 |
-
|
| 199 |
-
2. **其他平台**
|
| 200 |
-
- Railway
|
| 201 |
-
- Render
|
| 202 |
-
- DigitalOcean App Platform
|
| 203 |
-
|
| 204 |
-
3. **云服务器**
|
| 205 |
-
- AWS EC2
|
| 206 |
-
- Google Cloud Run
|
| 207 |
-
- Azure App Service
|
| 208 |
-
|
| 209 |
-
---
|
| 210 |
-
|
| 211 |
-
**注意:** Hugging Face Spaces可能需要几分钟来构建和启动。如果刚刚部署,请等待至少10分钟后再进行测试。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OPENCODE_INTEGRATION.md
DELETED
|
@@ -1,182 +0,0 @@
|
|
| 1 |
-
# OpenCode + Nginx 集成文档
|
| 2 |
-
|
| 3 |
-
## 🎯 架构概述
|
| 4 |
-
|
| 5 |
-
本项目实现了 OpenResty + OpenCode 的安全集成,提供:
|
| 6 |
-
|
| 7 |
-
```
|
| 8 |
-
用户请求 → Nginx (7860, Basic Auth) → OpenCode (57860, 内部)
|
| 9 |
-
```
|
| 10 |
-
|
| 11 |
-
## 🔧 核心组件
|
| 12 |
-
|
| 13 |
-
### 1. OpenResty Nginx (端口 7860)
|
| 14 |
-
- **认证保护**: HTTP Basic Auth (admin/admin123)
|
| 15 |
-
- **Lua 安全**: 用户代理过滤
|
| 16 |
-
- **API 代理**: 安全转发到 OpenCode
|
| 17 |
-
- **静态服务**: HTML 页面
|
| 18 |
-
|
| 19 |
-
### 2. OpenCode 服务器 (端口 57860)
|
| 20 |
-
- **AI 编程代理**: 代码生成和修改
|
| 21 |
-
- **OpenAPI 端点**: 完整的 REST API
|
| 22 |
-
- **多模型支持**: 支持各种 LLM 提供商
|
| 23 |
-
- **项目分析**: 自动理解代码库
|
| 24 |
-
|
| 25 |
-
## 📡 API 端点
|
| 26 |
-
|
| 27 |
-
### 🔐 认证访问 (Basic Auth)
|
| 28 |
-
```bash
|
| 29 |
-
curl -u admin:admin123 http://localhost:7860/opencode/global/health
|
| 30 |
-
```
|
| 31 |
-
|
| 32 |
-
### 🌐 可用端点
|
| 33 |
-
|
| 34 |
-
#### OpenCode 核心 API
|
| 35 |
-
```bash
|
| 36 |
-
# 健康检查
|
| 37 |
-
curl -u admin:admin123 http://localhost:7860/opencode/global/health
|
| 38 |
-
|
| 39 |
-
# API 文档 (Swagger)
|
| 40 |
-
curl -u admin:admin123 http://localhost:7860/opencode/doc
|
| 41 |
-
|
| 42 |
-
# 项目管理
|
| 43 |
-
curl -u admin:admin123 http://localhost:7860/opencode/project
|
| 44 |
-
|
| 45 |
-
# 会话管理
|
| 46 |
-
curl -u admin:admin123 http://localhost:7860/opencode/session
|
| 47 |
-
|
| 48 |
-
# 提供商管理
|
| 49 |
-
curl -u admin:admin123 http://localhost:7860/opencode/provider
|
| 50 |
-
```
|
| 51 |
-
|
| 52 |
-
#### Nginx 原生端点
|
| 53 |
-
```bash
|
| 54 |
-
# 主页
|
| 55 |
-
curl -u admin:admin123 http://localhost:7860/
|
| 56 |
-
|
| 57 |
-
# 健康检查
|
| 58 |
-
curl -u admin:admin123 http://localhost:7860/health
|
| 59 |
-
```
|
| 60 |
-
|
| 61 |
-
## 🤖 OpenCode 使用示例
|
| 62 |
-
|
| 63 |
-
### 创建新的编程会话
|
| 64 |
-
```bash
|
| 65 |
-
# 创建会话
|
| 66 |
-
curl -u admin:admin123 -X POST \
|
| 67 |
-
-H "Content-Type: application/json" \
|
| 68 |
-
-d '{"title": "AI Coding Session"}' \
|
| 69 |
-
http://localhost:7860/opencode/session
|
| 70 |
-
```
|
| 71 |
-
|
| 72 |
-
### 发送编程请求
|
| 73 |
-
```bash
|
| 74 |
-
# 发送 AI 请求
|
| 75 |
-
curl -u admin:admin123 -X POST \
|
| 76 |
-
-H "Content-Type: application/json" \
|
| 77 |
-
-d '{
|
| 78 |
-
"parts": [
|
| 79 |
-
{"type": "text", "text": "创建一个简单的 Hello World Python 应用"}
|
| 80 |
-
]
|
| 81 |
-
}' \
|
| 82 |
-
http://localhost:7860/opencode/session/{session_id}/message
|
| 83 |
-
```
|
| 84 |
-
|
| 85 |
-
### 搜索和分析代码
|
| 86 |
-
```bash
|
| 87 |
-
# 搜索文件
|
| 88 |
-
curl -u admin:admin123 \
|
| 89 |
-
"http://localhost:7860/opencode/find/file?query=main.py"
|
| 90 |
-
|
| 91 |
-
# 读取文件内容
|
| 92 |
-
curl -u admin:admin123 \
|
| 93 |
-
"http://localhost:7860/opencode/file/content?path=/path/to/file.py"
|
| 94 |
-
```
|
| 95 |
-
|
| 96 |
-
## 🛡️ 安全特性
|
| 97 |
-
|
| 98 |
-
### 1. 认证保护
|
| 99 |
-
- **Basic Auth**: 用户名/密码保护
|
| 100 |
-
- **用户掩码**: 日志中敏感信息已遮蔽
|
| 101 |
-
- **会话管理**: 连接复用和清理
|
| 102 |
-
|
| 103 |
-
### 2. Lua 安全过滤
|
| 104 |
-
- **用户代理检测**: 阻止恶意 bot
|
| 105 |
-
- **请求验证**: 预防恶意请求
|
| 106 |
-
- **日志记录**: 安全事件追踪
|
| 107 |
-
|
| 108 |
-
### 3. API 安全
|
| 109 |
-
- **代理验证**: 只允许 OpenCode API
|
| 110 |
-
- **CORS 控制**: 限制跨域访问
|
| 111 |
-
- **超时控制**: 防止长时间请求
|
| 112 |
-
|
| 113 |
-
## 🚀 部署信息
|
| 114 |
-
|
| 115 |
-
### Docker 配置
|
| 116 |
-
```yaml
|
| 117 |
-
services:
|
| 118 |
-
opencode-nginx:
|
| 119 |
-
build: .
|
| 120 |
-
ports:
|
| 121 |
-
- "7860:7860"
|
| 122 |
-
environment:
|
| 123 |
-
- GATEWAY_HOST=127.0.0.1
|
| 124 |
-
- GATEWAY_PORT=57860
|
| 125 |
-
```
|
| 126 |
-
|
| 127 |
-
### 访问地址
|
| 128 |
-
- **主应用**: http://localhost:7860/
|
| 129 |
-
- **OpenCode API**: http://localhost:7860/opencode/
|
| 130 |
-
- **API 文档**: http://localhost:7860/opencode/doc
|
| 131 |
-
- **健康检查**: http://localhost:7860/health
|
| 132 |
-
|
| 133 |
-
## 🔧 开发和调试
|
| 134 |
-
|
| 135 |
-
### 检查服务状态
|
| 136 |
-
```bash
|
| 137 |
-
# 检查 OpenCode 状态
|
| 138 |
-
curl -s http://127.0.0.1:57860/global/health
|
| 139 |
-
|
| 140 |
-
# 检查 Nginx 状态
|
| 141 |
-
curl -u admin:admin123 http://localhost:7860/health
|
| 142 |
-
|
| 143 |
-
# 查看 Nginx 日志
|
| 144 |
-
docker logs [container_name] | grep nginx
|
| 145 |
-
|
| 146 |
-
# 查看 OpenCode 日志
|
| 147 |
-
docker logs [container_name] | grep opencode
|
| 148 |
-
```
|
| 149 |
-
|
| 150 |
-
### 故障排除
|
| 151 |
-
1. **认证失败**: 检查用户名/密码 (admin/admin123)
|
| 152 |
-
2. **OpenCode 不可达**: 确认内部端口 57860
|
| 153 |
-
3. **API 代理失败**: 检查 nginx 配置中的代理设置
|
| 154 |
-
4. **CORS 错误**: 确认正确的 Origin 头部设置
|
| 155 |
-
|
| 156 |
-
## 📊 性能和监控
|
| 157 |
-
|
| 158 |
-
### 健康检查响应
|
| 159 |
-
```json
|
| 160 |
-
{
|
| 161 |
-
"healthy": true,
|
| 162 |
-
"version": "1.0.220",
|
| 163 |
-
"service": "OpenResty + OpenCode Integration"
|
| 164 |
-
}
|
| 165 |
-
```
|
| 166 |
-
|
| 167 |
-
### 认证头部
|
| 168 |
-
```http
|
| 169 |
-
X-Powered-By: OpenResty
|
| 170 |
-
X-Auth-Type: Basic + Lua
|
| 171 |
-
Server: openresty/1.27.1.2
|
| 172 |
-
```
|
| 173 |
-
|
| 174 |
-
## 🎯 使用场景
|
| 175 |
-
|
| 176 |
-
1. **AI 编程助手**: 通过 API 调用 AI 进行代码生成
|
| 177 |
-
2. **自动化开发**: 集成到 CI/CD 流程
|
| 178 |
-
3. **代码分析**: 自动理解大型代码库
|
| 179 |
-
4. **功能开发**: 快速添加新功能
|
| 180 |
-
5. **Bug 修复**: AI 辅助调试和修复
|
| 181 |
-
|
| 182 |
-
这个集成将强大的 AI 编程能力与安全的企业级 Web 服务器完美结合!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
README.md
CHANGED
|
@@ -6,327 +6,3 @@ colorTo: blue
|
|
| 6 |
sdk: docker
|
| 7 |
pinned: false
|
| 8 |
---
|
| 9 |
-
|
| 10 |
-
# 🤖 OpenCode AI + Nginx Security Integration
|
| 11 |
-
|
| 12 |
-
这个 Hugging Face Space 集成了 [OpenCode](https://opencode.ai) AI 编程代理与安全的企业级 Nginx 服务器,提供完整的 AI 开发平台。
|
| 13 |
-
|
| 14 |
-
## 🎯 功能特性
|
| 15 |
-
|
| 16 |
-
### 🔐 安全防护
|
| 17 |
-
- **HTTP Basic Authentication** (用户名: `admin`, 密码: `admin123`)
|
| 18 |
-
- **Lua 脚本安全过滤** - 防止恶意请求
|
| 19 |
-
- **API 访问控制** - 仅允许授权访问
|
| 20 |
-
- **请求日志记录** - 完整的访问审计
|
| 21 |
-
|
| 22 |
-
### 🤖 AI 编程能力
|
| 23 |
-
- **代码生成和修改** - 基于 LLM 的智能编程
|
| 24 |
-
- **项目分析** - 自动理解代码库结构
|
| 25 |
-
- **多模型支持** - 支持各种 LLM 提供商
|
| 26 |
-
- **实时对话** - 流式 AI 交互
|
| 27 |
-
|
| 28 |
-
### 🛠️ 企业级特性
|
| 29 |
-
- **高可用性** - Nginx 负载均衡
|
| 30 |
-
- **高性能** - 连接池和缓存优化
|
| 31 |
-
- **可扩展** - 模块化架构
|
| 32 |
-
- **监控就绪** - 健康检查和指标
|
| 33 |
-
|
| 34 |
-
## 🚀 快速开始
|
| 35 |
-
|
| 36 |
-
### 📡 API 访问方式
|
| 37 |
-
|
| 38 |
-
#### 1. 主页访问
|
| 39 |
-
```bash
|
| 40 |
-
curl -u admin:admin123 https://airsltd-ocngx.hf.space/
|
| 41 |
-
```
|
| 42 |
-
|
| 43 |
-
#### 2. 健康检查
|
| 44 |
-
```bash
|
| 45 |
-
curl -u admin:admin123 https://airsltd-ocngx.hf.space/health
|
| 46 |
-
```
|
| 47 |
-
|
| 48 |
-
#### 3. OpenCode Web界面
|
| 49 |
-
```bash
|
| 50 |
-
# 访问OpenCode Web界面
|
| 51 |
-
curl -u admin:admin123 https://airsltd-ocngx.hf.space/opencode/web/
|
| 52 |
-
```
|
| 53 |
-
|
| 54 |
-
#### 4. OpenCode API (通过代理)
|
| 55 |
-
```bash
|
| 56 |
-
# API 文档
|
| 57 |
-
curl -u admin:admin123 https://airsltd-ocngx.hf.space/opencode/api/doc
|
| 58 |
-
|
| 59 |
-
# OpenCode 健康检查
|
| 60 |
-
curl -u admin:admin123 https://airsltd-ocngx.hf.space/opencode/api/global/health
|
| 61 |
-
|
| 62 |
-
# 创建 AI 编程会话
|
| 63 |
-
curl -u admin:admin123 -X POST \
|
| 64 |
-
-H "Content-Type: application/json" \
|
| 65 |
-
-d '{"title": "AI Coding Session"}' \
|
| 66 |
-
https://airsltd-ocngx.hf.space/opencode/api/session
|
| 67 |
-
|
| 68 |
-
# 发送 AI 请求
|
| 69 |
-
curl -u admin:admin123 -X POST \
|
| 70 |
-
-H "Content-Type: application/json" \
|
| 71 |
-
-d '{
|
| 72 |
-
"parts": [{"type": "text", "text": "创建一个 Python Hello World 应用"}]
|
| 73 |
-
}' \
|
| 74 |
-
https://airsltd-ocngx.hf.space/opencode/api/session/{session_id}/message
|
| 75 |
-
```
|
| 76 |
-
|
| 77 |
-
## 📋 API 端点
|
| 78 |
-
|
| 79 |
-
### 🔐 认证保护的端点
|
| 80 |
-
|
| 81 |
-
| 端点 | 方法 | 描述 |
|
| 82 |
-
|------|------|------|
|
| 83 |
-
| `/` | GET | nginx主页和介绍 |
|
| 84 |
-
| `/health` | GET | 服务健康检查 |
|
| 85 |
-
| `/opencode/web/` | GET | OpenCode Web界面 |
|
| 86 |
-
| `/opencode/api/*` | ALL | OpenCode API 代理 |
|
| 87 |
-
|
| 88 |
-
### 🤖 OpenCode API
|
| 89 |
-
|
| 90 |
-
#### 核心 API
|
| 91 |
-
```bash
|
| 92 |
-
# 健康检查
|
| 93 |
-
curl -u admin:admin123 https://airsltd-ocngx.hf.space/opencode/api/global/health
|
| 94 |
-
|
| 95 |
-
# API 文档
|
| 96 |
-
curl -u admin:admin123 https://airsltd-ocngx.hf.space/opencode/api/doc
|
| 97 |
-
|
| 98 |
-
# 项目管理
|
| 99 |
-
curl -u admin:admin123 https://airsltd-ocngx.hf.space/opencode/api/project
|
| 100 |
-
|
| 101 |
-
# 会话管理
|
| 102 |
-
curl -u admin:admin123 https://airsltd-ocngx.hf.space/opencode/api/session
|
| 103 |
-
|
| 104 |
-
# 提供商管理
|
| 105 |
-
curl -u admin:admin123 https://airsltd-ocngx.hf.space/opencode/api/provider
|
| 106 |
-
```
|
| 107 |
-
|
| 108 |
-
#### Nginx 原生端点
|
| 109 |
-
```bash
|
| 110 |
-
# 主页
|
| 111 |
-
curl -u admin:admin123 https://airsltd-ocngx.hf.space/
|
| 112 |
-
|
| 113 |
-
# 健康检查
|
| 114 |
-
curl -u admin:admin123 https://airsltd-ocngx.hf.space/health
|
| 115 |
-
```
|
| 116 |
-
|
| 117 |
-
## 🏗️ 架构设计
|
| 118 |
-
|
| 119 |
-
```
|
| 120 |
-
用户请求 → Nginx (7860) → OpenCode (57860) → AI 模型
|
| 121 |
-
↓ ↓ ↓
|
| 122 |
-
Basic Auth → 统一代理 → AI 处理
|
| 123 |
-
Lua 过滤 → 路径重写 → 代码生成
|
| 124 |
-
```
|
| 125 |
-
|
| 126 |
-
### 🔧 新架构特性
|
| 127 |
-
|
| 128 |
-
1. **统一认证**
|
| 129 |
-
- Server级别HTTP Basic Auth
|
| 130 |
-
- 一次登录,全局访问
|
| 131 |
-
- 无需重复认证
|
| 132 |
-
|
| 133 |
-
2. **路径分离**
|
| 134 |
-
- `/` - nginx默认站点
|
| 135 |
-
- `/opencode/web/` - OpenCode Web界面
|
| 136 |
-
- `/opencode/api/` - OpenCode API端点
|
| 137 |
-
|
| 138 |
-
3. **简化代理**
|
| 139 |
-
- 统一端点转发
|
| 140 |
-
- 减少配置复杂度
|
| 141 |
-
- 自动路径重写
|
| 142 |
-
|
| 143 |
-
### 🔧 组件说明
|
| 144 |
-
|
| 145 |
-
1. **Nginx 服务器**
|
| 146 |
-
- 监听端口:7860
|
| 147 |
-
- 认证:HTTP Basic Auth
|
| 148 |
-
- 安全:Lua 脚本过滤
|
| 149 |
-
- 代理:转发到 OpenCode
|
| 150 |
-
|
| 151 |
-
2. **OpenCode 服务器**
|
| 152 |
-
- 监听端口:57860
|
| 153 |
-
- 功能:AI 编程代理
|
| 154 |
-
- API:OpenAPI 3.1 规范
|
| 155 |
-
- 模型:支持多种 LLM
|
| 156 |
-
|
| 157 |
-
## 🛡️ 安全特性
|
| 158 |
-
|
| 159 |
-
### 认证保护
|
| 160 |
-
- ✅ HTTP Basic Auth (admin/admin123)
|
| 161 |
-
- ✅ 用户名日志掩码
|
| 162 |
-
- ✅ 会话管理
|
| 163 |
-
- ✅ 自动清理
|
| 164 |
-
|
| 165 |
-
### 请求过滤
|
| 166 |
-
- ✅ Lua 脚本过滤恶意 User-Agent
|
| 167 |
-
- ✅ CORS 跨域控制
|
| 168 |
-
- ✅ 请求速率限制
|
| 169 |
-
- ✅ 安全头设置
|
| 170 |
-
|
| 171 |
-
### 访问控制
|
| 172 |
-
- ✅ 仅允许授权 API 调用
|
| 173 |
-
- ✅ 请求路径验证
|
| 174 |
-
- ✅ 错误处理和日志
|
| 175 |
-
- ✅ 健康检查监控
|
| 176 |
-
|
| 177 |
-
## 🔧 配置说明
|
| 178 |
-
|
| 179 |
-
### 认证信息
|
| 180 |
-
```
|
| 181 |
-
用户名: admin
|
| 182 |
-
密码: admin123
|
| 183 |
-
```
|
| 184 |
-
|
| 185 |
-
### 环境变量
|
| 186 |
-
```bash
|
| 187 |
-
GATEWAY_HOST=127.0.0.1
|
| 188 |
-
GATEWAY_PORT=57860
|
| 189 |
-
```
|
| 190 |
-
|
| 191 |
-
### Docker 配置
|
| 192 |
-
- **Nginx 端口**: 7860
|
| 193 |
-
- **OpenCode 端口**: 57860
|
| 194 |
-
- **Node.js 环境**: 内置安装
|
| 195 |
-
- **自动启动**: 脚本化管理
|
| 196 |
-
|
| 197 |
-
## 📊 监控和健康检查
|
| 198 |
-
|
| 199 |
-
### 健康检查响应
|
| 200 |
-
```json
|
| 201 |
-
{
|
| 202 |
-
"healthy": true,
|
| 203 |
-
"version": "1.27.1.2",
|
| 204 |
-
"service": "OpenResty + OpenCode Integration"
|
| 205 |
-
}
|
| 206 |
-
```
|
| 207 |
-
|
| 208 |
-
### 认证头部
|
| 209 |
-
```http
|
| 210 |
-
X-Powered-By: OpenResty
|
| 211 |
-
X-Auth-Type: Basic + Lua
|
| 212 |
-
Server: openresty/1.27.1.2
|
| 213 |
-
```
|
| 214 |
-
|
| 215 |
-
## 🧪 使用示例
|
| 216 |
-
|
| 217 |
-
### 1. 基础 AI 对话
|
| 218 |
-
```python
|
| 219 |
-
import requests
|
| 220 |
-
|
| 221 |
-
# 创建会话
|
| 222 |
-
session = requests.post(
|
| 223 |
-
"https://airsltd-ocngx.hf.space/opencode/session",
|
| 224 |
-
auth=("admin", "admin123"),
|
| 225 |
-
json={"title": "Python Development"}
|
| 226 |
-
)
|
| 227 |
-
session_data = session.json()
|
| 228 |
-
|
| 229 |
-
# 发送请求
|
| 230 |
-
response = requests.post(
|
| 231 |
-
f"https://airsltd-ocngx.hf.space/opencode/session/{session_data['id']}/message",
|
| 232 |
-
auth=("admin", "admin123"),
|
| 233 |
-
json={
|
| 234 |
-
"parts": [{"type": "text", "text": "创建一个 Flask Web 应用"}]
|
| 235 |
-
}
|
| 236 |
-
)
|
| 237 |
-
```
|
| 238 |
-
|
| 239 |
-
### 2. 代码分析
|
| 240 |
-
```python
|
| 241 |
-
# 搜索文件
|
| 242 |
-
response = requests.get(
|
| 243 |
-
"https://airsltd-ocngx.hf.space/opencode/find/file",
|
| 244 |
-
auth=("admin", "admin123"),
|
| 245 |
-
params={"query": "main.py"}
|
| 246 |
-
)
|
| 247 |
-
|
| 248 |
-
# 读取文件内容
|
| 249 |
-
response = requests.get(
|
| 250 |
-
"https://airsltd-ocngx.hf.space/opencode/file/content",
|
| 251 |
-
auth=("admin", "admin123"),
|
| 252 |
-
params={"path": "/path/to/file.py"}
|
| 253 |
-
)
|
| 254 |
-
```
|
| 255 |
-
|
| 256 |
-
### 3. 项目管理
|
| 257 |
-
```python
|
| 258 |
-
# 获取项目信息
|
| 259 |
-
response = requests.get(
|
| 260 |
-
"https://airsltd-ocngx.hf.space/opencode/project/current",
|
| 261 |
-
auth=("admin", "admin123")
|
| 262 |
-
)
|
| 263 |
-
```
|
| 264 |
-
|
| 265 |
-
## 🔧 开发和调试
|
| 266 |
-
|
| 267 |
-
### 检查服务状态
|
| 268 |
-
```bash
|
| 269 |
-
# 检查 OpenCode 状态
|
| 270 |
-
curl -s http://127.0.0.1:57860/global/health
|
| 271 |
-
|
| 272 |
-
# 检查 Nginx 状态
|
| 273 |
-
curl -u admin:admin123 http://localhost:7860/health
|
| 274 |
-
|
| 275 |
-
# 查看 Nginx 日志
|
| 276 |
-
docker logs [container_name] | grep nginx
|
| 277 |
-
|
| 278 |
-
# 查看 OpenCode 日志
|
| 279 |
-
docker logs [container_name] | grep opencode
|
| 280 |
-
```
|
| 281 |
-
|
| 282 |
-
### 故障排除
|
| 283 |
-
1. **认证失败** - 检查用户名密码 (admin/admin123)
|
| 284 |
-
2. **OpenCode 不可达** - 确认内部端口 57860
|
| 285 |
-
3. **API 代理失败** - 检查 nginx 配置中的代理设置
|
| 286 |
-
4. **CORS 错误** - 确认正确的 Origin 头部设置
|
| 287 |
-
|
| 288 |
-
## 📈 性能特性
|
| 289 |
-
|
| 290 |
-
- 🚀 **连接池** - Nginx 高性能连接复用
|
| 291 |
-
- ⚡ **缓存优化** - 静态资源缓存
|
| 292 |
-
- 🔄 **负载均衡** - 支持水平扩展
|
| 293 |
-
- 📊 **监控指标** - 实时性能数据
|
| 294 |
-
- 🛡️ **安全加速** - Lua 脚本高效执行
|
| 295 |
-
|
| 296 |
-
## 🎯 应用场景
|
| 297 |
-
|
| 298 |
-
### 1. AI 辅助开发
|
| 299 |
-
- 自动生成业务代码
|
| 300 |
-
- 重构和优化现有代码
|
| 301 |
-
- Bug 修复和调试
|
| 302 |
-
- 代码审查和建议
|
| 303 |
-
|
| 304 |
-
### 2. 自动化开发
|
| 305 |
-
- CI/CD 集成
|
| 306 |
-
- 批量代码生成
|
| 307 |
-
- 测试用例生成
|
| 308 |
-
- 文档自动生成
|
| 309 |
-
|
| 310 |
-
### 3. 代码库分析
|
| 311 |
-
- 大型项目理解
|
| 312 |
-
- 依赖关系分析
|
| 313 |
-
- 架构图生成
|
| 314 |
-
- 最佳实践建议
|
| 315 |
-
|
| 316 |
-
---
|
| 317 |
-
|
| 318 |
-
## 🎉 开始使用
|
| 319 |
-
|
| 320 |
-
这个集成为您提供了一个完整的 AI 开发平台:
|
| 321 |
-
|
| 322 |
-
1. 🔐 **安全访问** - 企业级安全保护
|
| 323 |
-
2. 🤖 **AI 能力** - 强大的编程助手
|
| 324 |
-
3. 🛠️ **可靠性能** - 高性能 Nginx 代理
|
| 325 |
-
4. 📊 **完整监控** - 健康检查和日志
|
| 326 |
-
5. 🔧 **易于集成** - 标准 REST API
|
| 327 |
-
|
| 328 |
-
立即开始您的 AI 开发之旅!
|
| 329 |
-
|
| 330 |
-
📖 详细文档:[OpenCode 官方文档](https://opencode.ai/docs)
|
| 331 |
-
🚀 项目地址:[GitHub 仓库](https://github.com/anomalyco/opencode)
|
| 332 |
-
💬 社区支持:[Discord 频道](https://opencode.ai/discord)
|
|
|
|
| 6 |
sdk: docker
|
| 7 |
pinned: false
|
| 8 |
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SUCCESS_REPORT.md
DELETED
|
@@ -1,112 +0,0 @@
|
|
| 1 |
-
# 🎉 部署成功报告
|
| 2 |
-
|
| 3 |
-
## ✅ 问题解决
|
| 4 |
-
|
| 5 |
-
**502错误已修复!** 原因是nginx配置中的Basic Auth阻止了对`/opencode/`路径的访问。
|
| 6 |
-
|
| 7 |
-
### 🔧 修复内容
|
| 8 |
-
1. **移除server级别的Basic Auth** - 将认证限制到特定路径
|
| 9 |
-
2. **为`/opencode/`路径创建无认证访问** - 允许直接访问OpenCode服务
|
| 10 |
-
3. **保持主页认证** - 维护安全访问控制
|
| 11 |
-
|
| 12 |
-
## 🚀 当前状态
|
| 13 |
-
|
| 14 |
-
### ✅ 所有服务正常运行
|
| 15 |
-
- **Nginx代理**: ✅ 正常运行 (端口7860)
|
| 16 |
-
- **OpenCode服务**: ✅ 正常运行 (端口57860)
|
| 17 |
-
- **Web界面**: ✅ 完全可访问
|
| 18 |
-
- **API端点**: ✅ 全部正常工作
|
| 19 |
-
- **API文档**: ✅ Swagger UI可用
|
| 20 |
-
|
| 21 |
-
### 📊 测试结果
|
| 22 |
-
```
|
| 23 |
-
📡 nginx健康检查: ✅ 正常
|
| 24 |
-
🌐 /opencode/路径访问: ✅ 成功 ({"healthy":true,"version":"1.1.6"})
|
| 25 |
-
🖥️ Web界面访问: ✅ HTML页面正常加载
|
| 26 |
-
📚 API文档访问: ✅ Swagger UI正常工作
|
| 27 |
-
```
|
| 28 |
-
|
| 29 |
-
## 🌱 访问端点
|
| 30 |
-
|
| 31 |
-
### 🎯 主要访问地址
|
| 32 |
-
```
|
| 33 |
-
https://airsltd-ocngx.hf.space/opencode/
|
| 34 |
-
```
|
| 35 |
-
|
| 36 |
-
### 📡 完整端点列表
|
| 37 |
-
```
|
| 38 |
-
Web界面: https://airsltd-ocngx.hf.space/opencode/
|
| 39 |
-
API文档: https://airsltd-ocngx.hf.space/opencode/doc
|
| 40 |
-
健康检查: https://airsltd-ocngx.hf.space/opencode/global/health
|
| 41 |
-
会话管理: https://airsltd-ocngx.hf.space/opencode/session
|
| 42 |
-
项目管理: https://airsltd-ocngx.hf.space/opencode/project
|
| 43 |
-
文件操作: https://airsltd-ocngx.hf.space/opencode/file
|
| 44 |
-
搜索功能: https://airsltd-ocngx.hf.space/opencode/find
|
| 45 |
-
```
|
| 46 |
-
|
| 47 |
-
### 🔐 认证信息
|
| 48 |
-
```
|
| 49 |
-
主页 (/): 需要认证 (admin/admin123)
|
| 50 |
-
OpenCode (/opencode/): 无需认证 - 直接访问
|
| 51 |
-
```
|
| 52 |
-
|
| 53 |
-
## 📱 移动端使用指南
|
| 54 |
-
|
| 55 |
-
### 🎯 手机访问步骤
|
| 56 |
-
1. **打开手机浏览器**
|
| 57 |
-
2. **访问**: `https://airsltd-ocngx.hf.space/opencode/`
|
| 58 |
-
3. **无需认证** - 直接进入AI编程界面
|
| 59 |
-
4. **开始使用** - 完整的移动端AI编程体验
|
| 60 |
-
|
| 61 |
-
### ✨ 移动端功能
|
| 62 |
-
- 📱 **响应式界面** - 完美适配各种屏幕尺寸
|
| 63 |
-
- 💬 **AI对话交互** - 实时编程助手对话
|
| 64 |
-
- 📝 **代码编辑** - 移动端友好的代码编辑器
|
| 65 |
-
- 📁 **项目管理** - 文件和目录管理
|
| 66 |
-
- 📚 **API文档** - 集成的Swagger UI文档
|
| 67 |
-
|
| 68 |
-
## 🎊 成功实现的目标
|
| 69 |
-
|
| 70 |
-
### ✅ 核心目标达成
|
| 71 |
-
1. **API和Web使用相同端口** - 统一端口7860
|
| 72 |
-
2. **不同端点访问** - Web界面和API端点清晰分离
|
| 73 |
-
3. **移动端编程支持** - 手机浏览器完美访问
|
| 74 |
-
4. **无认证直接访问** - OpenCode界面无需登录
|
| 75 |
-
5. **企业级安全** - 主页保持认证保护
|
| 76 |
-
|
| 77 |
-
### 🌟 技术架构
|
| 78 |
-
```
|
| 79 |
-
用户请求 → Nginx (7860) → 路由分发
|
| 80 |
-
↓ ↓
|
| 81 |
-
/opencode/ → OpenCode (57860) → Web界面 + API
|
| 82 |
-
/ → 静态页面 + 认证
|
| 83 |
-
```
|
| 84 |
-
|
| 85 |
-
## 🚀 立即开始使用
|
| 86 |
-
|
| 87 |
-
### 📱 移动端用户
|
| 88 |
-
直接访问:`https://airsltd-ocngx.hf.space/opencode/`
|
| 89 |
-
|
| 90 |
-
### 🖥️ 桌面端用户
|
| 91 |
-
访问主页:`https://airsltd-ocngx.hf.space/` (需要认证)
|
| 92 |
-
或直接访问:`https://airsltd-ocngx.hf.space/opencode/`
|
| 93 |
-
|
| 94 |
-
### 🔌 API集成
|
| 95 |
-
所有API端点可通过:`https://airsltd-ocngx.hf.space/opencode/*` 访问
|
| 96 |
-
|
| 97 |
-
---
|
| 98 |
-
|
| 99 |
-
## 🎉 总结
|
| 100 |
-
|
| 101 |
-
**🚀 增量实现web代理访问,实现在手机上进行界面编程 - 完全成功!**
|
| 102 |
-
|
| 103 |
-
### 🏆 关键成就
|
| 104 |
-
- ✅ **零开发成本** - 利用OpenCode原生界面
|
| 105 |
-
- ✅ **统一架构** - API和Web完美融合
|
| 106 |
-
- ✅ **移动端优化** - 手机编程体验优秀
|
| 107 |
-
- ✅ **安全可控** - 认证机制合理配置
|
| 108 |
-
- ✅ **高性能** - Nginx代理优化
|
| 109 |
-
|
| 110 |
-
**🎯 您现在可以在手机上通过浏览器直接进行AI编程交互了!**
|
| 111 |
-
|
| 112 |
-
访问地址:**https://airsltd-ocngx.hf.space/opencode/**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TEST_REPORT.md
DELETED
|
@@ -1,235 +0,0 @@
|
|
| 1 |
-
# Nginx + OpenCode 集成测试报告
|
| 2 |
-
|
| 3 |
-
## 📋 测试概述
|
| 4 |
-
|
| 5 |
-
本项目已完成全面的nginx配置重构和功能测试,实现了以下核心需求:
|
| 6 |
-
|
| 7 |
-
1. **默认站点设置为nginx** - 根路径 `/` 现在是nginx默认站点
|
| 8 |
-
2. **路径分离** - `/opencode/web/` 和 `/opencode/api/` 分别处理web和api请求
|
| 9 |
-
3. **统一认证** - Server级别Basic Auth,一次登录全局访问
|
| 10 |
-
4. **简化代理** - 从20+个独立端点简化为2个统一端点
|
| 11 |
-
|
| 12 |
-
## 🧪 测试套件
|
| 13 |
-
|
| 14 |
-
### 1. 配置验证测试 (`comprehensive-test.sh`)
|
| 15 |
-
|
| 16 |
-
**测试范围:**
|
| 17 |
-
- ✅ Nginx配置语法和结构 (16项测试)
|
| 18 |
-
- ✅ 认证功能和统一登录 (4项测试)
|
| 19 |
-
- ✅ 路径重写和代理转发 (10项测试)
|
| 20 |
-
- ✅ OpenCode Web端点功能 (7项测试)
|
| 21 |
-
- ✅ OpenCode API端点功能 (6项测试)
|
| 22 |
-
- ✅ 静态资源代理 (6项测试)
|
| 23 |
-
- ✅ 配置简化验证 (10项测试)
|
| 24 |
-
- ✅ 安全配置测试 (8项测试)
|
| 25 |
-
- ✅ 性能配置测试 (10项测试)
|
| 26 |
-
- ✅ 文档和示例测试 (6项测试)
|
| 27 |
-
|
| 28 |
-
**测试结果:**
|
| 29 |
-
- 📊 总测试数:86
|
| 30 |
-
- ✅ 通过测试:86
|
| 31 |
-
- ❌ 失败测试:0
|
| 32 |
-
- 📈 成功率:100%
|
| 33 |
-
|
| 34 |
-
### 2. 运行时功能测试 (`runtime-test.sh`)
|
| 35 |
-
|
| 36 |
-
**测试范围:**
|
| 37 |
-
- 🔍 服务运行状态检查
|
| 38 |
-
- 🔐 认证功能测试
|
| 39 |
-
- 🛣️ 路由和重定向测试
|
| 40 |
-
- 🌐 OpenCode Web端点测试
|
| 41 |
-
- 🔌 OpenCode API端点测试
|
| 42 |
-
- 🌍 CORS功能测试
|
| 43 |
-
- ⚡ 性能和超时测试
|
| 44 |
-
- 🛡️ 安全功能测试
|
| 45 |
-
- 🔗 集成功能测试
|
| 46 |
-
|
| 47 |
-
## 🎯 核心功能验证
|
| 48 |
-
|
| 49 |
-
### ✅ 默认站点配置
|
| 50 |
-
```nginx
|
| 51 |
-
location / {
|
| 52 |
-
root /usr/local/openresty/nginx/html;
|
| 53 |
-
index index.html index.htm;
|
| 54 |
-
# 添加自定义响应头
|
| 55 |
-
add_header X-Powered-By "OpenResty";
|
| 56 |
-
add_header X-Auth-Type "Basic + Lua";
|
| 57 |
-
}
|
| 58 |
-
```
|
| 59 |
-
|
| 60 |
-
### ✅ 统一认证配置
|
| 61 |
-
```nginx
|
| 62 |
-
server {
|
| 63 |
-
# 定义认证区域
|
| 64 |
-
auth_basic "Restricted Area";
|
| 65 |
-
auth_basic_user_file /usr/local/openresty/nginx/conf/.htpasswd;
|
| 66 |
-
|
| 67 |
-
# 使用 Lua 进行更复杂的认证
|
| 68 |
-
access_by_lua_block {
|
| 69 |
-
local headers = ngx.req.get_headers()
|
| 70 |
-
local user_agent = headers["User-Agent"] or ""
|
| 71 |
-
|
| 72 |
-
-- 简单的用户代理检查
|
| 73 |
-
if string.find(user_agent, "bot") then
|
| 74 |
-
ngx.exit(403)
|
| 75 |
-
end
|
| 76 |
-
}
|
| 77 |
-
|
| 78 |
-
# 所有location继承此认证
|
| 79 |
-
# 无需重复配置
|
| 80 |
-
}
|
| 81 |
-
```
|
| 82 |
-
|
| 83 |
-
### ✅ OpenCode Web端点
|
| 84 |
-
```nginx
|
| 85 |
-
location /opencode/web/ {
|
| 86 |
-
# 移除 /opencode/web 前缀
|
| 87 |
-
rewrite ^/opencode/web/(.*) /$1 break;
|
| 88 |
-
|
| 89 |
-
# 代理到 OpenCode 服务器
|
| 90 |
-
proxy_pass http://127.0.0.1:57860;
|
| 91 |
-
# ... 完整代理配置
|
| 92 |
-
}
|
| 93 |
-
```
|
| 94 |
-
|
| 95 |
-
### ✅ OpenCode API端点
|
| 96 |
-
```nginx
|
| 97 |
-
location /opencode/api/ {
|
| 98 |
-
# 移除 /opencode/api 前缀
|
| 99 |
-
rewrite ^/opencode/api/(.*) /$1 break;
|
| 100 |
-
|
| 101 |
-
# 代理到 OpenCode 服务器
|
| 102 |
-
proxy_pass http://127.0.0.1:57860;
|
| 103 |
-
# ... 完整代理配置
|
| 104 |
-
}
|
| 105 |
-
```
|
| 106 |
-
|
| 107 |
-
## 📊 配置简化成果
|
| 108 |
-
|
| 109 |
-
### 代理端点数量对比
|
| 110 |
-
- **修改前:** 20+ 个独立API端点
|
| 111 |
-
- `/global/`, `/session`, `/project`, `/provider`, `/file`, `/find`, `/config`, `/path`, `/pty`, `/experimental`, `/instance`, `/vcs`, `/doc`, `/lsp`, `/mcp`, `/permission`, `/agent`, `/auth`, `/command`, `/event`, `/formatter`, `/log`, `/tui`
|
| 112 |
-
|
| 113 |
-
- **修改后:** 6 个代理端点
|
| 114 |
-
- `/opencode/web/` (统一Web端点)
|
| 115 |
-
- `/opencode/api/` (统一API端点)
|
| 116 |
-
- `/assets/` (静态资源)
|
| 117 |
-
- `/oc-theme-preload.js` (主题文件)
|
| 118 |
-
- `/site.webmanifest` (Web清单)
|
| 119 |
-
- `~ ^/(favicon.*\.(png|svg|ico)|apple-touch-icon\.png)$` (图标文件)
|
| 120 |
-
|
| 121 |
-
### 配置复杂度降低
|
| 122 |
-
- ✅ 统一路径重写规则
|
| 123 |
-
- ✅ 统一代理头部配置
|
| 124 |
-
- ✅ 统一CORS设置
|
| 125 |
-
- ✅ 统一超时配置
|
| 126 |
-
- ✅ 统一性能优化
|
| 127 |
-
|
| 128 |
-
## 🔐 安全特性验证
|
| 129 |
-
|
| 130 |
-
### HTTP Basic Authentication
|
| 131 |
-
- ✅ Server级别认证配置
|
| 132 |
-
- ✅ 一次登录,全局访问
|
| 133 |
-
- ✅ 认证文件存在且格式正确
|
| 134 |
-
|
| 135 |
-
### Lua安全脚本
|
| 136 |
-
- ✅ User-Agent检查
|
| 137 |
-
- ✅ Bot检测和阻止
|
| 138 |
-
- ✅ 403错误返回
|
| 139 |
-
|
| 140 |
-
### 安全头部
|
| 141 |
-
- ✅ `X-Powered-By: OpenResty`
|
| 142 |
-
- ✅ `X-Auth-Type: Basic + Lua`
|
| 143 |
-
|
| 144 |
-
## ⚡ 性能特性验证
|
| 145 |
-
|
| 146 |
-
### 流式响应支持
|
| 147 |
-
- ✅ `proxy_buffering off`
|
| 148 |
-
- ✅ `proxy_cache off`
|
| 149 |
-
- ✅ `proxy_http_version 1.1`
|
| 150 |
-
- ✅ `chunked_transfer_encoding on`
|
| 151 |
-
|
| 152 |
-
### 连接优化
|
| 153 |
-
- ✅ `proxy_set_header Connection ''`
|
| 154 |
-
- ✅ `sendfile on`
|
| 155 |
-
- ✅ `keepalive_timeout 65`
|
| 156 |
-
- ✅ `worker_connections 1024`
|
| 157 |
-
|
| 158 |
-
### 超时配置
|
| 159 |
-
- ✅ `proxy_connect_timeout 60s`
|
| 160 |
-
- ✅ `proxy_send_timeout 300s`
|
| 161 |
-
|
| 162 |
-
## 🌐 访问方式
|
| 163 |
-
|
| 164 |
-
### 认证信息
|
| 165 |
-
```
|
| 166 |
-
用户名: admin
|
| 167 |
-
密码: admin123
|
| 168 |
-
```
|
| 169 |
-
|
| 170 |
-
### 访问地址
|
| 171 |
-
- **主页:** `http://localhost:7860/`
|
| 172 |
-
- **健康检查:** `http://localhost:7860/health`
|
| 173 |
-
- **OpenCode Web:** `http://localhost:7860/opencode/web/`
|
| 174 |
-
- **OpenCode API:** `http://localhost:7860/opencode/api/`
|
| 175 |
-
- **API文档:** `http://localhost:7860/opencode/api/doc`
|
| 176 |
-
|
| 177 |
-
### API端点示例
|
| 178 |
-
- **健康检查:** `http://localhost:7860/opencode/api/global/health`
|
| 179 |
-
- **项目管理:** `http://localhost:7860/opencode/api/project`
|
| 180 |
-
- **会话管理:** `http://localhost:7860/opencode/api/session`
|
| 181 |
-
- **��供商:** `http://localhost:7860/opencode/api/provider`
|
| 182 |
-
|
| 183 |
-
## 🚀 部署和使用
|
| 184 |
-
|
| 185 |
-
### 构建和启动
|
| 186 |
-
```bash
|
| 187 |
-
# 构建Docker镜像
|
| 188 |
-
docker build -t ocngx .
|
| 189 |
-
|
| 190 |
-
# 启动容器
|
| 191 |
-
docker run -p 7860:7860 ocngx
|
| 192 |
-
```
|
| 193 |
-
|
| 194 |
-
### 运行测试
|
| 195 |
-
```bash
|
| 196 |
-
# 配置验证测试
|
| 197 |
-
./comprehensive-test.sh
|
| 198 |
-
|
| 199 |
-
# 运行时功能测试 (需要服务先启动)
|
| 200 |
-
./runtime-test.sh
|
| 201 |
-
```
|
| 202 |
-
|
| 203 |
-
## 📈 测试覆盖率
|
| 204 |
-
|
| 205 |
-
### 功能覆盖率:100%
|
| 206 |
-
- ✅ 所有核心功能已验证
|
| 207 |
-
- ✅ 所有安全特性已验证
|
| 208 |
-
- ✅ 所有性能优化已验证
|
| 209 |
-
- ✅ 所有配置简化已验证
|
| 210 |
-
|
| 211 |
-
### 测试类型覆盖率
|
| 212 |
-
- ✅ 静态配置分析
|
| 213 |
-
- ✅ 语法结构验证
|
| 214 |
-
- ✅ 运行时功能测试
|
| 215 |
-
- ✅ 安全性测试
|
| 216 |
-
- ✅ 性能测试
|
| 217 |
-
- ✅ 集成测试
|
| 218 |
-
|
| 219 |
-
## 🎉 结论
|
| 220 |
-
|
| 221 |
-
**✅ 项目重构成功!**
|
| 222 |
-
|
| 223 |
-
所有86项配置验证测试全部通过,新的nginx配置完全满足需求:
|
| 224 |
-
|
| 225 |
-
1. **默认站点** - 成功设置为nginx
|
| 226 |
-
2. **路径分离** - Web和API端点正确分离
|
| 227 |
-
3. **统一认证** - Server级别认证,一次登录全局访问
|
| 228 |
-
4. **简化代理** - 从20+端点简化为6个端点,配置复杂度大幅降低
|
| 229 |
-
|
| 230 |
-
**🚀 系统已就绪,可以正常使用!**
|
| 231 |
-
|
| 232 |
-
---
|
| 233 |
-
|
| 234 |
-
*测试报告生成时间:$(date)*
|
| 235 |
-
*测试工具:comprehensive-test.sh, runtime-test.sh*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
checkupdate.sh
DELETED
|
@@ -1,16 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
# version_compare.sh
|
| 3 |
-
|
| 4 |
-
CURRENT_VERSION="v"$(curl -s "https://airsltd-ocngx.hf.space/opencode/global/health" -u "admin:admin123" | jq -r '.version')
|
| 5 |
-
LATEST_VERSION=$(curl -s "https://api.github.com/repos/anomalyco/opencode/releases/latest" | jq -r '.tag_name')
|
| 6 |
-
|
| 7 |
-
echo "当前版本: $CURRENT_VERSION"
|
| 8 |
-
echo "最新版本: $LATEST_VERSION"
|
| 9 |
-
|
| 10 |
-
if [ "$CURRENT_VERSION" = "$LATEST_VERSION" ]; then
|
| 11 |
-
echo "✅ 已是最新版本"
|
| 12 |
-
else
|
| 13 |
-
echo "🔄 有新版本可用: $LATEST_VERSION"
|
| 14 |
-
echo "建议执行: opencode update"
|
| 15 |
-
fi
|
| 16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
comprehensive-test.sh
DELETED
|
@@ -1,386 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
|
| 3 |
-
# =============================================================================
|
| 4 |
-
# Nginx + OpenCode 集成测试套件
|
| 5 |
-
# =============================================================================
|
| 6 |
-
|
| 7 |
-
set -e # 遇到错误立即退出
|
| 8 |
-
|
| 9 |
-
# 颜色定义
|
| 10 |
-
RED='\033[0;31m'
|
| 11 |
-
GREEN='\033[0;32m'
|
| 12 |
-
YELLOW='\033[1;33m'
|
| 13 |
-
BLUE='\033[0;34m'
|
| 14 |
-
NC='\033[0m' # No Color
|
| 15 |
-
|
| 16 |
-
# 测试配置
|
| 17 |
-
NGINX_PORT="7860"
|
| 18 |
-
OPENCODE_PORT="57860"
|
| 19 |
-
BASE_URL="http://localhost:${NGINX_PORT}"
|
| 20 |
-
TEST_USER="admin"
|
| 21 |
-
TEST_PASS="admin123"
|
| 22 |
-
|
| 23 |
-
# 测试结果统计
|
| 24 |
-
TOTAL_TESTS=0
|
| 25 |
-
PASSED_TESTS=0
|
| 26 |
-
FAILED_TESTS=0
|
| 27 |
-
TEST_RESULTS=()
|
| 28 |
-
|
| 29 |
-
# 日志函数
|
| 30 |
-
log_info() {
|
| 31 |
-
echo -e "${BLUE}[INFO]${NC} $1"
|
| 32 |
-
}
|
| 33 |
-
|
| 34 |
-
log_success() {
|
| 35 |
-
echo -e "${GREEN}[PASS]${NC} $1"
|
| 36 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 37 |
-
TEST_RESULTS+=("PASS: $1")
|
| 38 |
-
}
|
| 39 |
-
|
| 40 |
-
log_error() {
|
| 41 |
-
echo -e "${RED}[FAIL]${NC} $1"
|
| 42 |
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
| 43 |
-
TEST_RESULTS+=("FAIL: $1")
|
| 44 |
-
}
|
| 45 |
-
|
| 46 |
-
log_warning() {
|
| 47 |
-
echo -e "${YELLOW}[WARN]${NC} $1"
|
| 48 |
-
}
|
| 49 |
-
|
| 50 |
-
# 测试函数
|
| 51 |
-
run_test() {
|
| 52 |
-
local test_name="$1"
|
| 53 |
-
local test_command="$2"
|
| 54 |
-
|
| 55 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 56 |
-
log_info "运行测试: $test_name"
|
| 57 |
-
|
| 58 |
-
if eval "$test_command" >/dev/null 2>&1; then
|
| 59 |
-
log_success "$test_name"
|
| 60 |
-
return 0
|
| 61 |
-
else
|
| 62 |
-
log_error "$test_name"
|
| 63 |
-
return 1
|
| 64 |
-
fi
|
| 65 |
-
}
|
| 66 |
-
|
| 67 |
-
# 1. Nginx配置语法和结构测试
|
| 68 |
-
test_nginx_config() {
|
| 69 |
-
log_info "=== 1. Nginx配置语法和结构测试 ==="
|
| 70 |
-
|
| 71 |
-
# 检查配置文件存在性
|
| 72 |
-
run_test "nginx主配置文件存在" "test -f nginx/nginx.conf"
|
| 73 |
-
run_test "nginx默认配置文件存在" "test -f nginx/conf.d/default.conf"
|
| 74 |
-
run_test "nginx静态文件目录存在" "test -d nginx/html"
|
| 75 |
-
|
| 76 |
-
# 检查配置文件语法
|
| 77 |
-
run_test "nginx主配置语法正确" "grep -q 'events {' nginx/nginx.conf"
|
| 78 |
-
run_test "nginx http配置正确" "grep -q 'http {' nginx/nginx.conf"
|
| 79 |
-
run_test "nginx server配置正确" "grep -q 'server {' nginx/conf.d/default.conf"
|
| 80 |
-
|
| 81 |
-
# 检查关键配置项
|
| 82 |
-
run_test "监听端口7860配置" "grep -q 'listen 7860' nginx/conf.d/default.conf"
|
| 83 |
-
run_test "Basic Auth配置" "grep -q 'auth_basic' nginx/conf.d/default.conf"
|
| 84 |
-
run_test "Lua脚本配置" "grep -q 'access_by_lua_block' nginx/conf.d/default.conf"
|
| 85 |
-
|
| 86 |
-
# 检查端点配置
|
| 87 |
-
run_test "根路径配置" "grep -q 'location / {' nginx/conf.d/default.conf"
|
| 88 |
-
run_test "健康检查端点配置" "grep -q 'location /health' nginx/conf.d/default.conf"
|
| 89 |
-
run_test "OpenCode Web端点配置" "grep -q 'location /opencode/web/' nginx/conf.d/default.conf"
|
| 90 |
-
run_test "OpenCode API端点配置" "grep -q 'location /opencode/api/' nginx/conf.d/default.conf"
|
| 91 |
-
|
| 92 |
-
# 检查代理配置
|
| 93 |
-
run_test "代理到OpenCode配置" "grep -q 'proxy_pass http://127.0.0.1:57860' nginx/conf.d/default.conf"
|
| 94 |
-
run_test "路径重写配置" "grep -q 'rewrite.*break' nginx/conf.d/default.conf"
|
| 95 |
-
|
| 96 |
-
# 检查CORS配置
|
| 97 |
-
run_test "CORS头部配置" "grep -q 'Access-Control-Allow-Origin' nginx/conf.d/default.conf"
|
| 98 |
-
|
| 99 |
-
# 检查重定向配置
|
| 100 |
-
run_test "/opencode重定向配置" "grep -q 'location = /opencode' nginx/conf.d/default.conf"
|
| 101 |
-
}
|
| 102 |
-
|
| 103 |
-
# 2. 认证功能和统一登录测试
|
| 104 |
-
test_authentication() {
|
| 105 |
-
log_info "=== 2. 认证功能和统一登录测试 ==="
|
| 106 |
-
|
| 107 |
-
# 检查认证文件
|
| 108 |
-
run_test "认证密码文件存在" "test -f nginx/.htpasswd"
|
| 109 |
-
|
| 110 |
-
# 检查认证配置在server级别
|
| 111 |
-
run_test "认证配置在server级别" "awk '/server {/,/}/' nginx/conf.d/default.conf | grep -q 'auth_basic'"
|
| 112 |
-
|
| 113 |
-
# 检查没有在location级别重复配置认证
|
| 114 |
-
run_test "location级别无重复认证" "! grep -A 10 'location /' nginx/conf.d/default.conf | grep -q 'auth_basic'"
|
| 115 |
-
|
| 116 |
-
# 检查Lua安全脚本
|
| 117 |
-
run_test "Lua安全过滤配置" "grep -q 'User-Agent' nginx/conf.d/default.conf"
|
| 118 |
-
run_test "Bot检测配置" "grep -q 'bot' nginx/conf.d/default.conf"
|
| 119 |
-
}
|
| 120 |
-
|
| 121 |
-
# 3. 路径重写和代理转发测试
|
| 122 |
-
test_routing() {
|
| 123 |
-
log_info "=== 3. 路径重写和代理转发测试 ==="
|
| 124 |
-
|
| 125 |
-
# 检查Web端点路径重写
|
| 126 |
-
run_test "Web端点路径重写配置" "grep -q 'rewrite.*opencode/web.*break' nginx/conf.d/default.conf"
|
| 127 |
-
|
| 128 |
-
# 检查API端点路径重写
|
| 129 |
-
run_test "API端点路径重写配置" "grep -q 'rewrite.*opencode/api.*break' nginx/conf.d/default.conf"
|
| 130 |
-
|
| 131 |
-
# 检查代理头部配置
|
| 132 |
-
run_test "代理Host头部配置" "grep -q 'proxy_set_header Host' nginx/conf.d/default.conf"
|
| 133 |
-
run_test "代理Real-IP头部配置" "grep -q 'proxy_set_header X-Real-IP' nginx/conf.d/default.conf"
|
| 134 |
-
run_test "代理Forwarded-For头部配置" "grep -q 'proxy_set_header X-Forwarded-For' nginx/conf.d/default.conf"
|
| 135 |
-
|
| 136 |
-
# 检查流式响应支持
|
| 137 |
-
run_test "代理缓冲关闭配置" "grep -q 'proxy_buffering off' nginx/conf.d/default.conf"
|
| 138 |
-
run_test "代理缓存关闭配置" "grep -q 'proxy_cache off' nginx/conf.d/default.conf"
|
| 139 |
-
run_test "HTTP/1.1连接配置" "grep -q 'proxy_http_version 1.1' nginx/conf.d/default.conf"
|
| 140 |
-
|
| 141 |
-
# 检查超时配置
|
| 142 |
-
run_test "连接超时配置" "grep -q 'proxy_connect_timeout' nginx/conf.d/default.conf"
|
| 143 |
-
run_test "发送超时配置" "grep -q 'proxy_send_timeout' nginx/conf.d/default.conf"
|
| 144 |
-
}
|
| 145 |
-
|
| 146 |
-
# 4. OpenCode Web端点功能测试
|
| 147 |
-
test_opencode_web() {
|
| 148 |
-
log_info "=== 4. OpenCode Web端点功能测试 ==="
|
| 149 |
-
|
| 150 |
-
# 检查Web端点配置完整性
|
| 151 |
-
run_test "Web端点CORS配置" "grep -A 20 'location /opencode/web/' nginx/conf.d/default.conf | grep -q 'Access-Control'"
|
| 152 |
-
run_test "Web端点代理配置" "grep -A 20 'location /opencode/web/' nginx/conf.d/default.conf | grep -q 'proxy_pass'"
|
| 153 |
-
run_test "Web端点超时配置" "grep -A 25 'location /opencode/web/' nginx/conf.d/default.conf | grep -q 'proxy_connect_timeout'"
|
| 154 |
-
|
| 155 |
-
# 检查静态资源代理
|
| 156 |
-
run_test "assets目录代理配置" "grep -q 'location /assets/' nginx/conf.d/default.conf"
|
| 157 |
-
run_test "favicon代理配置" "grep -q 'location.*favicon' nginx/conf.d/default.conf"
|
| 158 |
-
run_test "manifest文件代理配置" "grep -q 'site.webmanifest' nginx/conf.d/default.conf"
|
| 159 |
-
}
|
| 160 |
-
|
| 161 |
-
# 5. OpenCode API端点功能测试
|
| 162 |
-
test_opencode_api() {
|
| 163 |
-
log_info "=== 5. OpenCode API端点功能测试 ==="
|
| 164 |
-
|
| 165 |
-
# 检查API端点配置完整性
|
| 166 |
-
run_test "API端点CORS配置" "grep -A 20 'location /opencode/api/' nginx/conf.d/default.conf | grep -q 'Access-Control'"
|
| 167 |
-
run_test "API端点代理配置" "grep -A 20 'location /opencode/api/' nginx/conf.d/default.conf | grep -q 'proxy_pass'"
|
| 168 |
-
run_test "API端点超时配置" "grep -A 25 'location /opencode/api/' nginx/conf.d/default.conf | grep -q 'proxy_connect_timeout'"
|
| 169 |
-
|
| 170 |
-
# 检查API方法支持
|
| 171 |
-
run_test "API支持GET方法" "grep -A 20 'location /opencode/api/' nginx/conf.d/default.conf | grep -q 'GET'"
|
| 172 |
-
run_test "API支持POST方法" "grep -A 20 'location /opencode/api/' nginx/conf.d/default.conf | grep -q 'POST'"
|
| 173 |
-
run_test "API支持PUT方法" "grep -A 20 'location /opencode/api/' nginx/conf.d/default.conf | grep -q 'PUT'"
|
| 174 |
-
run_test "API支持DELETE方法" "grep -A 20 'location /opencode/api/' nginx/conf.d/default.conf | grep -q 'DELETE'"
|
| 175 |
-
}
|
| 176 |
-
|
| 177 |
-
# 6. 静态资源代理测试
|
| 178 |
-
test_static_resources() {
|
| 179 |
-
log_info "=== 6. 静态资源代理测试 ==="
|
| 180 |
-
|
| 181 |
-
# 检查各种静态资源代理配置
|
| 182 |
-
run_test "CSS/JS资源代理" "grep -q 'location /assets/' nginx/conf.d/default.conf"
|
| 183 |
-
run_test "主题预加载JS代理" "grep -q 'oc-theme-preload.js' nginx/conf.d/default.conf"
|
| 184 |
-
run_test "Web Manifest代理" "grep -q 'site.webmanifest' nginx/conf.d/default.conf"
|
| 185 |
-
run_test "Favicon代理" "grep -q 'favicon' nginx/conf.d/default.conf"
|
| 186 |
-
run_test "Apple图标代理" "grep -q 'apple-touch-icon' nginx/conf.d/default.conf"
|
| 187 |
-
|
| 188 |
-
# 检查静态资源代理头部配置
|
| 189 |
-
run_test "静态资源代理头部" "grep -A 10 'location /assets/' nginx/conf.d/default.conf | grep -q 'proxy_set_header'"
|
| 190 |
-
}
|
| 191 |
-
|
| 192 |
-
# 7. 配置简化验证测试
|
| 193 |
-
test_configuration_simplification() {
|
| 194 |
-
log_info "=== 7. 配置简化验证测试 ==="
|
| 195 |
-
|
| 196 |
-
# 统计代理端点数量
|
| 197 |
-
local proxy_count=$(grep -c "proxy_pass http://127.0.0.1:57860" nginx/conf.d/default.conf)
|
| 198 |
-
run_test "代理端点数量合理(<10)" "test $proxy_count -lt 10"
|
| 199 |
-
|
| 200 |
-
# 检查是否使用统一端点
|
| 201 |
-
run_test "使用Web统一端点" "grep -q 'location /opencode/web/' nginx/conf.d/default.conf"
|
| 202 |
-
run_test "使用API统一端点" "grep -q 'location /opencode/api/' nginx/conf.d/default.conf"
|
| 203 |
-
|
| 204 |
-
# 检查重定向配置
|
| 205 |
-
run_test "/opencode重定向到web" "grep -q 'return 301 /opencode/web/' nginx/conf.d/default.conf"
|
| 206 |
-
run_test "/opencode/重定向到web" "grep -q 'return 301 /opencode/web/' nginx/conf.d/default.conf"
|
| 207 |
-
|
| 208 |
-
# 检查没有冗余的单独API端点配置
|
| 209 |
-
local old_endpoints=("/global/" "/session" "/project" "/provider" "/file" "/find" "/config")
|
| 210 |
-
for endpoint in "${old_endpoints[@]}"; do
|
| 211 |
-
run_test "已移除冗余端点$endpoint" "! grep -q 'location $endpoint' nginx/conf.d/default.conf"
|
| 212 |
-
done
|
| 213 |
-
}
|
| 214 |
-
|
| 215 |
-
# 8. 安全配置测试
|
| 216 |
-
test_security() {
|
| 217 |
-
log_info "=== 8. 安全配置测试 ==="
|
| 218 |
-
|
| 219 |
-
# 检查认证配置
|
| 220 |
-
run_test "Basic Auth启用" "grep -q 'auth_basic.*Restricted Area' nginx/conf.d/default.conf"
|
| 221 |
-
run_test "认证密码文件配置" "grep -q 'auth_basic_user_file' nginx/conf.d/default.conf"
|
| 222 |
-
|
| 223 |
-
# 检查Lua安全脚本
|
| 224 |
-
run_test "Lua安全检查启用" "grep -q 'access_by_lua_block' nginx/conf.d/default.conf"
|
| 225 |
-
run_test "User-Agent检查" "grep -q 'User-Agent' nginx/conf.d/default.conf"
|
| 226 |
-
run_test "Bot检测和阻止" "grep -q 'string.find.*bot' nginx/conf.d/default.conf"
|
| 227 |
-
run_test "403错误返回" "grep -q 'ngx.exit(403)' nginx/conf.d/default.conf"
|
| 228 |
-
|
| 229 |
-
# 检查安全头部
|
| 230 |
-
run_test "Powered-By头部" "grep -q 'X-Powered-By.*OpenResty' nginx/conf.d/default.conf"
|
| 231 |
-
run_test "Auth-Type头部" "grep -q 'X-Auth-Type.*Basic' nginx/conf.d/default.conf"
|
| 232 |
-
}
|
| 233 |
-
|
| 234 |
-
# 9. 性能配置测试
|
| 235 |
-
test_performance() {
|
| 236 |
-
log_info "=== 9. 性能配置测试 ==="
|
| 237 |
-
|
| 238 |
-
# 检查性能优化配置
|
| 239 |
-
run_test "sendfile启用" "grep -q 'sendfile.*on' nginx/nginx.conf"
|
| 240 |
-
run_test "keepalive_timeout配置" "grep -q 'keepalive_timeout' nginx/nginx.conf"
|
| 241 |
-
run_test "worker_connections配置" "grep -q 'worker_connections' nginx/nginx.conf"
|
| 242 |
-
|
| 243 |
-
# 检查代理性能配置
|
| 244 |
-
run_test "代理缓冲关闭(流式响应)" "grep -q 'proxy_buffering off' nginx/conf.d/default.conf"
|
| 245 |
-
run_test "代理缓存关闭" "grep -q 'proxy_cache off' nginx/conf.d/default.conf"
|
| 246 |
-
run_test "HTTP/1.1连接复用" "grep -q 'proxy_http_version 1.1' nginx/conf.d/default.conf"
|
| 247 |
-
run_test 'Connection头清空' "grep -q \"proxy_set_header Connection ''\" nginx/conf.d/default.conf"
|
| 248 |
-
|
| 249 |
-
# 检查超时配置
|
| 250 |
-
run_test "连接超时设置" "grep -q 'proxy_connect_timeout' nginx/conf.d/default.conf"
|
| 251 |
-
run_test "发送超时设置" "grep -q 'proxy_send_timeout' nginx/conf.d/default.conf"
|
| 252 |
-
}
|
| 253 |
-
|
| 254 |
-
# 10. 文档和示例测试
|
| 255 |
-
test_documentation() {
|
| 256 |
-
log_info "=== 10. 文档和示例测试 ==="
|
| 257 |
-
|
| 258 |
-
# 检查README文档更新
|
| 259 |
-
run_test "README文档存在" "test -f README.md"
|
| 260 |
-
run_test "README包含新端点说明" "grep -q '/opencode/web/' README.md"
|
| 261 |
-
run_test "README包含API端点说明" "grep -q '/opencode/api/' README.md"
|
| 262 |
-
run_test "README包含认证说明" "grep -q 'admin.*admin123' README.md"
|
| 263 |
-
|
| 264 |
-
# 检查架构图更新
|
| 265 |
-
run_test "README包含架构说明" "grep -q '统一代理' README.md"
|
| 266 |
-
run_test "README包含路径分离说明" "grep -q '路径分离' README.md"
|
| 267 |
-
}
|
| 268 |
-
|
| 269 |
-
# 生成测试报告
|
| 270 |
-
generate_report() {
|
| 271 |
-
log_info "=== 测试报告 ==="
|
| 272 |
-
|
| 273 |
-
echo ""
|
| 274 |
-
echo "=========================================="
|
| 275 |
-
echo " Nginx + OpenCode 测试报告"
|
| 276 |
-
echo "=========================================="
|
| 277 |
-
echo ""
|
| 278 |
-
echo "测试时间: $(date)"
|
| 279 |
-
echo "测试配置: Nginx端口${NGINX_PORT}, OpenCode端口${OPENCODE_PORT}"
|
| 280 |
-
echo ""
|
| 281 |
-
echo "测试统计:"
|
| 282 |
-
echo " 总测试数: ${TOTAL_TESTS}"
|
| 283 |
-
echo " 通过测试: ${PASSED_TESTS}"
|
| 284 |
-
echo " 失败测试: ${FAILED_TESTS}"
|
| 285 |
-
echo " 成功率: $(( PASSED_TESTS * 100 / TOTAL_TESTS ))%"
|
| 286 |
-
echo ""
|
| 287 |
-
|
| 288 |
-
if [ $FAILED_TESTS -eq 0 ]; then
|
| 289 |
-
echo -e "${GREEN}🎉 所有测试通过!${NC}"
|
| 290 |
-
else
|
| 291 |
-
echo -e "${YELLOW}⚠️ 有 ${FAILED_TESTS} 个测试失败${NC}"
|
| 292 |
-
fi
|
| 293 |
-
|
| 294 |
-
echo ""
|
| 295 |
-
echo "详细测试结果:"
|
| 296 |
-
for result in "${TEST_RESULTS[@]}"; do
|
| 297 |
-
if [[ $result == PASS* ]]; then
|
| 298 |
-
echo -e "${GREEN}✅ ${result#PASS: }${NC}"
|
| 299 |
-
else
|
| 300 |
-
echo -e "${RED}❌ ${result#FAIL: }${NC}"
|
| 301 |
-
fi
|
| 302 |
-
done
|
| 303 |
-
|
| 304 |
-
echo ""
|
| 305 |
-
echo "=========================================="
|
| 306 |
-
echo " 配置验证总结"
|
| 307 |
-
echo "=========================================="
|
| 308 |
-
echo ""
|
| 309 |
-
echo "✅ 核心功能验证:"
|
| 310 |
-
echo " - Nginx默认站点配置"
|
| 311 |
-
echo " - OpenCode Web端点 (/opencode/web/)"
|
| 312 |
-
echo " - OpenCode API端点 (/opencode/api/)"
|
| 313 |
-
echo " - 统一认证 (Server级别Basic Auth)"
|
| 314 |
-
echo " - 路径重写和代理转发"
|
| 315 |
-
echo ""
|
| 316 |
-
echo "✅ 安全特性验证:"
|
| 317 |
-
echo " - HTTP Basic Authentication"
|
| 318 |
-
echo " - Lua脚本安全过滤"
|
| 319 |
-
echo " - Bot检测和阻止"
|
| 320 |
-
echo " - 安全头部设置"
|
| 321 |
-
echo ""
|
| 322 |
-
echo "✅ 性能优化验证:"
|
| 323 |
-
echo " - 流式响应支持"
|
| 324 |
-
echo " - 连接复用配置"
|
| 325 |
-
echo " - 超时设置"
|
| 326 |
-
echo " - 缓冲和缓存优化"
|
| 327 |
-
echo ""
|
| 328 |
-
echo "✅ 配置简化验证:"
|
| 329 |
-
echo " - 统一端点转发"
|
| 330 |
-
echo " - 减少代理端点数量"
|
| 331 |
-
echo " - 路径重写配置"
|
| 332 |
-
echo " - 重定向配置"
|
| 333 |
-
echo ""
|
| 334 |
-
|
| 335 |
-
if [ $FAILED_TESTS -eq 0 ]; then
|
| 336 |
-
echo ""
|
| 337 |
-
echo -e "${GREEN}🚀 配置已就绪,可以启动服务!${NC}"
|
| 338 |
-
echo ""
|
| 339 |
-
echo "启动命令:"
|
| 340 |
-
echo " docker build -t ocngx ."
|
| 341 |
-
echo " docker run -p 7860:7860 ocngx"
|
| 342 |
-
echo ""
|
| 343 |
-
echo "访问地址:"
|
| 344 |
-
echo " 主页: http://localhost:7860/ (用户名: admin, 密码: admin123)"
|
| 345 |
-
echo " OpenCode Web: http://localhost:7860/opencode/web/"
|
| 346 |
-
echo " OpenCode API: http://localhost:7860/opencode/api/"
|
| 347 |
-
else
|
| 348 |
-
echo ""
|
| 349 |
-
echo -e "${YELLOW}⚠️ 请修复失败的测试后再启动服务${NC}"
|
| 350 |
-
fi
|
| 351 |
-
}
|
| 352 |
-
|
| 353 |
-
# 主函数
|
| 354 |
-
main() {
|
| 355 |
-
echo "=========================================="
|
| 356 |
-
echo " Nginx + OpenCode 集成测试套件"
|
| 357 |
-
echo "=========================================="
|
| 358 |
-
echo ""
|
| 359 |
-
|
| 360 |
-
# 运行所有测试
|
| 361 |
-
test_nginx_config
|
| 362 |
-
test_authentication
|
| 363 |
-
test_routing
|
| 364 |
-
test_opencode_web
|
| 365 |
-
test_opencode_api
|
| 366 |
-
test_static_resources
|
| 367 |
-
test_configuration_simplification
|
| 368 |
-
test_security
|
| 369 |
-
test_performance
|
| 370 |
-
test_documentation
|
| 371 |
-
|
| 372 |
-
# 生成报告
|
| 373 |
-
generate_report
|
| 374 |
-
|
| 375 |
-
# 返回适当的退出码
|
| 376 |
-
if [ $FAILED_TESTS -eq 0 ]; then
|
| 377 |
-
exit 0
|
| 378 |
-
else
|
| 379 |
-
exit 1
|
| 380 |
-
fi
|
| 381 |
-
}
|
| 382 |
-
|
| 383 |
-
# 如果��接运行此脚本
|
| 384 |
-
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
| 385 |
-
main "$@"
|
| 386 |
-
fi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
deploy-check.sh
DELETED
|
@@ -1,95 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
|
| 3 |
-
# HuggingFace Space 部署验证脚本
|
| 4 |
-
|
| 5 |
-
echo "🔍 验证 HuggingFace Space 部署配置..."
|
| 6 |
-
|
| 7 |
-
# 检查关键文件
|
| 8 |
-
echo "📁 检查关键文件..."
|
| 9 |
-
files_to_check=(
|
| 10 |
-
"Dockerfile"
|
| 11 |
-
"docker-start.sh"
|
| 12 |
-
"nginx/nginx.conf"
|
| 13 |
-
"nginx/conf.d/default.conf"
|
| 14 |
-
"nginx/html/index.html"
|
| 15 |
-
"README.md"
|
| 16 |
-
)
|
| 17 |
-
|
| 18 |
-
for file in "${files_to_check[@]}"; do
|
| 19 |
-
if [ -f "$file" ]; then
|
| 20 |
-
echo "✅ $file 存在"
|
| 21 |
-
else
|
| 22 |
-
echo "❌ $file 缺失"
|
| 23 |
-
exit 1
|
| 24 |
-
fi
|
| 25 |
-
done
|
| 26 |
-
|
| 27 |
-
# 检查 Dockerfile 配置
|
| 28 |
-
echo "🐳 检查 Dockerfile 配置..."
|
| 29 |
-
if grep -q "EXPOSE 7860" Dockerfile; then
|
| 30 |
-
echo "✅ 端口 7860 已暴露"
|
| 31 |
-
else
|
| 32 |
-
echo "❌ 端口配置错误"
|
| 33 |
-
exit 1
|
| 34 |
-
fi
|
| 35 |
-
|
| 36 |
-
if grep -q "opencode-ai" Dockerfile; then
|
| 37 |
-
echo "✅ OpenCode 安装配置正确"
|
| 38 |
-
else
|
| 39 |
-
echo "❌ OpenCode 安装配置缺失"
|
| 40 |
-
exit 1
|
| 41 |
-
fi
|
| 42 |
-
|
| 43 |
-
# 检查启动脚本
|
| 44 |
-
echo "🚀 检查启动脚本..."
|
| 45 |
-
if grep -q "GATEWAY_PORT.*57860" docker-start.sh; then
|
| 46 |
-
echo "✅ OpenCode 端口配置正确"
|
| 47 |
-
else
|
| 48 |
-
echo "❌ OpenCode 端口配置错误"
|
| 49 |
-
exit 1
|
| 50 |
-
fi
|
| 51 |
-
|
| 52 |
-
if grep -q "opencode serve" docker-start.sh; then
|
| 53 |
-
echo "✅ OpenCode 启动命令正确"
|
| 54 |
-
else
|
| 55 |
-
echo "❌ OpenCode 启动命令缺失"
|
| 56 |
-
exit 1
|
| 57 |
-
fi
|
| 58 |
-
|
| 59 |
-
# 检查 nginx 配置
|
| 60 |
-
echo "🌐 检查 nginx 配置..."
|
| 61 |
-
if grep -q "proxy_pass http://127.0.0.1:57860" nginx/conf.d/default.conf; then
|
| 62 |
-
echo "✅ nginx 代理配置正确"
|
| 63 |
-
else
|
| 64 |
-
echo "❌ nginx 代理配置错误"
|
| 65 |
-
exit 1
|
| 66 |
-
fi
|
| 67 |
-
|
| 68 |
-
if grep -q "auth_basic" nginx/conf.d/default.conf; then
|
| 69 |
-
echo "✅ nginx 认证配置正确"
|
| 70 |
-
else
|
| 71 |
-
echo "❌ nginx 认证配置缺失"
|
| 72 |
-
exit 1
|
| 73 |
-
fi
|
| 74 |
-
|
| 75 |
-
# 检查 README.md
|
| 76 |
-
echo "📖 检查 README.md..."
|
| 77 |
-
if grep -q "sdk: docker" README.md; then
|
| 78 |
-
echo "✅ HuggingFace Space 配置正确"
|
| 79 |
-
else
|
| 80 |
-
echo "❌ HuggingFace Space 配置错误"
|
| 81 |
-
exit 1
|
| 82 |
-
fi
|
| 83 |
-
|
| 84 |
-
echo ""
|
| 85 |
-
echo "🎉 所有配置检查通过!"
|
| 86 |
-
echo ""
|
| 87 |
-
echo "📋 部署信息:"
|
| 88 |
-
echo " • Docker 镜像:基于 openresty/openresty"
|
| 89 |
-
echo " • 暴露端口:7860"
|
| 90 |
-
echo " • OpenCode 端口:57860 (内部)"
|
| 91 |
-
echo " • 认证信息:admin/admin123"
|
| 92 |
-
echo " • Web 界面:/opencode/"
|
| 93 |
-
echo " • API 文档:/opencode/doc"
|
| 94 |
-
echo ""
|
| 95 |
-
echo "🚀 准备上传到 HuggingFace Space!"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
docker-start.sh
CHANGED
|
@@ -7,8 +7,8 @@ echo "🚀 Starting OpenResty + OpenCode Integration..."
|
|
| 7 |
# 检查环境变量
|
| 8 |
export GATEWAY_HOST=${GATEWAY_HOST:-127.0.0.1}
|
| 9 |
export GATEWAY_PORT=${GATEWAY_PORT:-3000}
|
| 10 |
-
export USERNAME=${USERNAME:-
|
| 11 |
-
export PASSWORD=${PASSWORD:-
|
| 12 |
|
| 13 |
echo "📍 OpenCode will listen on: ${GATEWAY_HOST}:${GATEWAY_PORT}"
|
| 14 |
echo "🌐 Nginx will listen on: 0.0.0.0:7860"
|
|
@@ -62,7 +62,7 @@ sleep 3
|
|
| 62 |
# 检查 OpenResty 是否正常运行
|
| 63 |
if curl -s http://localhost:7860/health > /dev/null; then
|
| 64 |
echo "✅ OpenResty started successfully"
|
| 65 |
-
echo "🔐 Basic Auth enabled:
|
| 66 |
echo "🌐 Nginx serving: http://localhost:7860"
|
| 67 |
echo "🔗 API Gateway: http://localhost:7860/opencode/"
|
| 68 |
else
|
|
|
|
| 7 |
# 检查环境变量
|
| 8 |
export GATEWAY_HOST=${GATEWAY_HOST:-127.0.0.1}
|
| 9 |
export GATEWAY_PORT=${GATEWAY_PORT:-3000}
|
| 10 |
+
export USERNAME=${USERNAME:-tbs}
|
| 11 |
+
export PASSWORD=${PASSWORD:-tbs123}
|
| 12 |
|
| 13 |
echo "📍 OpenCode will listen on: ${GATEWAY_HOST}:${GATEWAY_PORT}"
|
| 14 |
echo "🌐 Nginx will listen on: 0.0.0.0:7860"
|
|
|
|
| 62 |
# 检查 OpenResty 是否正常运行
|
| 63 |
if curl -s http://localhost:7860/health > /dev/null; then
|
| 64 |
echo "✅ OpenResty started successfully"
|
| 65 |
+
echo "🔐 Basic Auth enabled: tbs/tbs123"
|
| 66 |
echo "🌐 Nginx serving: http://localhost:7860"
|
| 67 |
echo "🔗 API Gateway: http://localhost:7860/opencode/"
|
| 68 |
else
|
final-test.sh
DELETED
|
@@ -1,108 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
|
| 3 |
-
# 完整的最终测试脚本
|
| 4 |
-
|
| 5 |
-
echo "🎯 执行最终完整性测试..."
|
| 6 |
-
echo ""
|
| 7 |
-
|
| 8 |
-
base_url="https://airsltd-ocngx.hf.space"
|
| 9 |
-
|
| 10 |
-
# 测试所有关键端点
|
| 11 |
-
test_endpoints=(
|
| 12 |
-
"/global/health"
|
| 13 |
-
"/path"
|
| 14 |
-
"/pty"
|
| 15 |
-
"/experimental"
|
| 16 |
-
"/instance"
|
| 17 |
-
"/vcs"
|
| 18 |
-
"/session"
|
| 19 |
-
"/project"
|
| 20 |
-
"/provider"
|
| 21 |
-
"/file"
|
| 22 |
-
"/find"
|
| 23 |
-
"/config"
|
| 24 |
-
"/doc"
|
| 25 |
-
)
|
| 26 |
-
|
| 27 |
-
echo "📡 测试所有API端点..."
|
| 28 |
-
failed_count=0
|
| 29 |
-
for endpoint in "${test_endpoints[@]}"; do
|
| 30 |
-
echo -n " $endpoint: "
|
| 31 |
-
response=$(curl -s -w "%{http_code}" "${base_url}${endpoint}")
|
| 32 |
-
http_code="${response: -3}"
|
| 33 |
-
|
| 34 |
-
if [ "$http_code" = "200" ]; then
|
| 35 |
-
echo "✅ 200 OK"
|
| 36 |
-
elif [ "$http_code" = "404" ]; then
|
| 37 |
-
echo "❌ 404 Not Found"
|
| 38 |
-
((failed_count++))
|
| 39 |
-
elif [ "$http_code" = "401" ]; then
|
| 40 |
-
echo "❌ 401 Unauthorized"
|
| 41 |
-
((failed_count++))
|
| 42 |
-
else
|
| 43 |
-
echo "❓ $http_code"
|
| 44 |
-
((failed_count++))
|
| 45 |
-
fi
|
| 46 |
-
done
|
| 47 |
-
|
| 48 |
-
echo ""
|
| 49 |
-
echo "🌐 测试静态资源..."
|
| 50 |
-
static_resources=(
|
| 51 |
-
"/assets/index-OLRiU-d3.js"
|
| 52 |
-
"/assets/index-DViKQ2Re.css"
|
| 53 |
-
"/oc-theme-preload.js"
|
| 54 |
-
"/site.webmanifest"
|
| 55 |
-
"/favicon.ico"
|
| 56 |
-
)
|
| 57 |
-
|
| 58 |
-
for resource in "${static_resources[@]}"; do
|
| 59 |
-
echo -n " $resource: "
|
| 60 |
-
response=$(curl -s -w "%{http_code}" "${base_url}${resource}")
|
| 61 |
-
http_code="${response: -3}"
|
| 62 |
-
|
| 63 |
-
if [ "$http_code" = "200" ]; then
|
| 64 |
-
echo "✅ 200 OK"
|
| 65 |
-
else
|
| 66 |
-
echo "❌ $http_code"
|
| 67 |
-
((failed_count++))
|
| 68 |
-
fi
|
| 69 |
-
done
|
| 70 |
-
|
| 71 |
-
echo ""
|
| 72 |
-
echo "🖥️ 测试主页面..."
|
| 73 |
-
main_response=$(curl -s -w "%{http_code}" "${base_url}/opencode/")
|
| 74 |
-
main_http_code="${main_response: -3}"
|
| 75 |
-
|
| 76 |
-
if [ "$main_http_code" = "200" ]; then
|
| 77 |
-
echo "✅ 主页面 200 OK"
|
| 78 |
-
if echo "${main_response%???}" | grep -q "opencode\|OpenCode"; then
|
| 79 |
-
echo "✅ 页面内容包含OpenCode"
|
| 80 |
-
else
|
| 81 |
-
echo "❌ 页面内容不包含OpenCode"
|
| 82 |
-
((failed_count++))
|
| 83 |
-
fi
|
| 84 |
-
else
|
| 85 |
-
echo "❌ 主页面 $main_http_code"
|
| 86 |
-
((failed_count++))
|
| 87 |
-
fi
|
| 88 |
-
|
| 89 |
-
echo ""
|
| 90 |
-
echo "🎉 测试结果总结..."
|
| 91 |
-
if [ $failed_count -eq 0 ]; then
|
| 92 |
-
echo "🎊 所有测试通过!移动端AI编程平台完全正常工作!"
|
| 93 |
-
echo ""
|
| 94 |
-
echo "📱 用户可以在手机上访问:"
|
| 95 |
-
echo " https://airsltd-ocngx.hf.space/opencode/"
|
| 96 |
-
echo ""
|
| 97 |
-
echo "✨ 功能特性:"
|
| 98 |
-
echo " • 完整的AI编程Web界面"
|
| 99 |
-
echo " • 响应式移动端设计"
|
| 100 |
-
echo " • 实时AI对话交互"
|
| 101 |
-
echo " • 所有API端点正常工作"
|
| 102 |
-
echo " • 静态资源正确加载"
|
| 103 |
-
else
|
| 104 |
-
echo "❌ 发现 $failed_count 个问题,需要进一步修复"
|
| 105 |
-
fi
|
| 106 |
-
|
| 107 |
-
echo ""
|
| 108 |
-
echo "🎯 测试完成!"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
health_check.sh
DELETED
|
@@ -1,60 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
# version_check.sh
|
| 3 |
-
|
| 4 |
-
API_BASE="https://airsltd-ocngx.hf.space/opencode"
|
| 5 |
-
AUTH="-u admin:admin123"
|
| 6 |
-
|
| 7 |
-
echo "=== OpenCode 版本诊断 ==="
|
| 8 |
-
echo "时间: $(date)"
|
| 9 |
-
echo
|
| 10 |
-
|
| 11 |
-
# 1. 健康检查版本
|
| 12 |
-
echo "1. 健康检查版本:"
|
| 13 |
-
HEALTH_VERSION=$(curl -s -X GET "$API_BASE/global/health" $AUTH | jq -r '.version')
|
| 14 |
-
echo " 健康检查返回: $HEALTH_VERSION"
|
| 15 |
-
|
| 16 |
-
# 2. 会话中的版本信息
|
| 17 |
-
echo "2. 检查会话状态:"
|
| 18 |
-
SESSION_STATUS=$(curl -s -X GET "$API_BASE/session/status" $AUTH)
|
| 19 |
-
echo " 会话状态: $SESSION_STATUS"
|
| 20 |
-
|
| 21 |
-
# 3. 创建新会话测试
|
| 22 |
-
echo "3. 创建新会话测试:"
|
| 23 |
-
NEW_SESSION=$(curl -s -X POST "$API_BASE/session" $AUTH -d '{}')
|
| 24 |
-
NEW_SESSION_ID=$(echo "$NEW_SESSION" | jq -r '.id')
|
| 25 |
-
echo " 新会话 ID: $NEW_SESSION_ID"
|
| 26 |
-
echo " 新会话版本: $(echo "$NEW_SESSION" | jq -r '.version')"
|
| 27 |
-
|
| 28 |
-
# 4. 在新会话中询问版本
|
| 29 |
-
echo "4. 在新会话中询问版本:"
|
| 30 |
-
VERSION_QUERY=$(curl -s -X POST "$API_BASE/session/$NEW_SESSION_ID/message" \
|
| 31 |
-
-H "Content-Type: application/json" \
|
| 32 |
-
$AUTH \
|
| 33 |
-
-d '{
|
| 34 |
-
"parts": [
|
| 35 |
-
{
|
| 36 |
-
"type": "text",
|
| 37 |
-
"text": "请告诉我当前 OpenCode 的版本号"
|
| 38 |
-
}
|
| 39 |
-
]
|
| 40 |
-
}')
|
| 41 |
-
|
| 42 |
-
echo " 版本查询响应: $VERSION_QUERY"
|
| 43 |
-
|
| 44 |
-
# 5. 等待并获取回复
|
| 45 |
-
sleep 3
|
| 46 |
-
VERSION_REPLY=$(curl -s -X GET "$API_BASE/session/$NEW_SESSION_ID/message" $AUTH)
|
| 47 |
-
echo " AI 回复的版本: $(echo "$VERSION_REPLY" | jq -r '.[-1].parts[] | select(.type=="text") | .text')"
|
| 48 |
-
|
| 49 |
-
# 6. 检查配置信息
|
| 50 |
-
echo "5. 检查配置信息:"
|
| 51 |
-
CONFIG=$(curl -s -X GET "$API_BASE/config" $AUTH)
|
| 52 |
-
echo " 配置信息: $CONFIG"
|
| 53 |
-
|
| 54 |
-
# 7. 检查事件流中的版本信息
|
| 55 |
-
echo "6. 检查事件流:"
|
| 56 |
-
echo " 监听事件流 10 秒..."
|
| 57 |
-
timeout 10s curl -N "$API_BASE/global/event" $AUTH 2>/dev/null | grep -i version || echo " 未检测到版本事件"
|
| 58 |
-
|
| 59 |
-
echo
|
| 60 |
-
echo "=== 诊断完成 ==="
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hf-spaces-test.sh
DELETED
|
@@ -1,377 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
|
| 3 |
-
# =============================================================================
|
| 4 |
-
# Hugging Face Spaces 部署诊断和测试脚本
|
| 5 |
-
# =============================================================================
|
| 6 |
-
|
| 7 |
-
set -e
|
| 8 |
-
|
| 9 |
-
# 颜色定义
|
| 10 |
-
RED='\033[0;31m'
|
| 11 |
-
GREEN='\033[0;32m'
|
| 12 |
-
YELLOW='\033[1;33m'
|
| 13 |
-
BLUE='\033[0;34m'
|
| 14 |
-
NC='\033[0m'
|
| 15 |
-
|
| 16 |
-
# 测试配置
|
| 17 |
-
BASE_URL="https://airsltd-ocngx.hf.space"
|
| 18 |
-
TEST_USER="admin"
|
| 19 |
-
TEST_PASS="admin123"
|
| 20 |
-
|
| 21 |
-
# 测试结果统计
|
| 22 |
-
TOTAL_TESTS=0
|
| 23 |
-
PASSED_TESTS=0
|
| 24 |
-
FAILED_TESTS=0
|
| 25 |
-
|
| 26 |
-
# 日志函数
|
| 27 |
-
log_info() {
|
| 28 |
-
echo -e "${BLUE}[INFO]${NC} $1"
|
| 29 |
-
}
|
| 30 |
-
|
| 31 |
-
log_success() {
|
| 32 |
-
echo -e "${GREEN}[PASS]${NC} $1"
|
| 33 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 34 |
-
}
|
| 35 |
-
|
| 36 |
-
log_error() {
|
| 37 |
-
echo -e "${RED}[FAIL]${NC} $1"
|
| 38 |
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
| 39 |
-
}
|
| 40 |
-
|
| 41 |
-
log_warning() {
|
| 42 |
-
echo -e "${YELLOW}[WARN]${NC} $1"
|
| 43 |
-
}
|
| 44 |
-
|
| 45 |
-
# HTTP请求测试
|
| 46 |
-
test_http_request() {
|
| 47 |
-
local test_name="$1"
|
| 48 |
-
local url="$2"
|
| 49 |
-
local expected_status="$3"
|
| 50 |
-
local auth="$4"
|
| 51 |
-
local timeout="${5:-30}"
|
| 52 |
-
|
| 53 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 54 |
-
log_info "测试: $test_name"
|
| 55 |
-
|
| 56 |
-
local cmd="curl -s -o /dev/null -w '%{http_code}' --max-time $timeout --connect-timeout 10"
|
| 57 |
-
|
| 58 |
-
if [ "$auth" = "true" ]; then
|
| 59 |
-
cmd="$cmd -u $TEST_USER:$TEST_PASS"
|
| 60 |
-
fi
|
| 61 |
-
|
| 62 |
-
# 添加更多调试信息
|
| 63 |
-
cmd="$cmd -v"
|
| 64 |
-
|
| 65 |
-
local status
|
| 66 |
-
status=$(eval "$cmd '$url'" 2>&1 | tail -n 1)
|
| 67 |
-
|
| 68 |
-
if [ "$status" = "$expected_status" ]; then
|
| 69 |
-
log_success "$test_name (HTTP $status)"
|
| 70 |
-
return 0
|
| 71 |
-
else
|
| 72 |
-
log_error "$test_name (期望: $expected_status, 实际: $status)"
|
| 73 |
-
# 显示详细错误信息
|
| 74 |
-
log_info "详细错误信息:"
|
| 75 |
-
eval "$cmd '$url'" 2>&1 | head -n 10
|
| 76 |
-
return 1
|
| 77 |
-
fi
|
| 78 |
-
}
|
| 79 |
-
|
| 80 |
-
# 连接性测试
|
| 81 |
-
test_connectivity() {
|
| 82 |
-
log_info "=== 1. 连接性测试 ==="
|
| 83 |
-
|
| 84 |
-
# 测试基础连接
|
| 85 |
-
log_info "测试基础连接到 $BASE_URL"
|
| 86 |
-
|
| 87 |
-
local cmd="curl -s --max-time 30 --connect-timeout 10 -I"
|
| 88 |
-
local response
|
| 89 |
-
response=$(eval "$cmd '$BASE_URL'" 2>&1)
|
| 90 |
-
|
| 91 |
-
if echo "$response" | grep -q "HTTP"; then
|
| 92 |
-
log_success "基础连接成功"
|
| 93 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 94 |
-
|
| 95 |
-
# 显示响应头
|
| 96 |
-
log_info "响应头信息:"
|
| 97 |
-
echo "$response" | head -n 5
|
| 98 |
-
else
|
| 99 |
-
log_error "基础连接失败"
|
| 100 |
-
log_error "错误信息: $response"
|
| 101 |
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
| 102 |
-
fi
|
| 103 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 104 |
-
|
| 105 |
-
# 测试DNS解析
|
| 106 |
-
log_info "测试DNS解析..."
|
| 107 |
-
local domain=$(echo "$BASE_URL" | sed 's|https://||' | sed 's|/.*||')
|
| 108 |
-
if nslookup "$domain" >/dev/null 2>&1; then
|
| 109 |
-
log_success "DNS解析成功 ($domain)"
|
| 110 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 111 |
-
else
|
| 112 |
-
log_error "DNS解析失败 ($domain)"
|
| 113 |
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
| 114 |
-
fi
|
| 115 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 116 |
-
}
|
| 117 |
-
|
| 118 |
-
# 服务状态测试
|
| 119 |
-
test_service_status() {
|
| 120 |
-
log_info "=== 2. 服务状态测试 ==="
|
| 121 |
-
|
| 122 |
-
# 测试主页
|
| 123 |
-
test_http_request "主页访问" "$BASE_URL/" "200" "true"
|
| 124 |
-
|
| 125 |
-
# 测试健康检查
|
| 126 |
-
test_http_request "健康检查" "$BASE_URL/health" "200" "true"
|
| 127 |
-
|
| 128 |
-
# 测试无认证访问
|
| 129 |
-
test_http_request "无认证访问主页" "$BASE_URL/" "401" "false"
|
| 130 |
-
}
|
| 131 |
-
|
| 132 |
-
# OpenCode端点测试
|
| 133 |
-
test_opencode_endpoints() {
|
| 134 |
-
log_info "=== 3. OpenCode端点测试 ==="
|
| 135 |
-
|
| 136 |
-
# 测试Web端点
|
| 137 |
-
test_http_request "OpenCode Web界面" "$BASE_URL/opencode/web/" "200" "true"
|
| 138 |
-
|
| 139 |
-
# 测试API端点
|
| 140 |
-
test_http_request "OpenCode API健康检查" "$BASE_URL/opencode/api/global/health" "200" "true"
|
| 141 |
-
|
| 142 |
-
# 测试API文档
|
| 143 |
-
test_http_request "API文档" "$BASE_URL/opencode/api/doc" "200" "true"
|
| 144 |
-
|
| 145 |
-
# 测试重定向
|
| 146 |
-
test_http_request "/opencode 重定向" "$BASE_URL/opencode" "301" "true"
|
| 147 |
-
}
|
| 148 |
-
|
| 149 |
-
# 认证功能测试
|
| 150 |
-
test_authentication() {
|
| 151 |
-
log_info "=== 4. 认证功能测试 ==="
|
| 152 |
-
|
| 153 |
-
# 测试正确认证
|
| 154 |
-
test_http_request "正确认证访问" "$BASE_URL/" "200" "true"
|
| 155 |
-
|
| 156 |
-
# 测试错误认证
|
| 157 |
-
test_http_request "错误认证访问" "$BASE_URL/" "401" "false"
|
| 158 |
-
|
| 159 |
-
# 测试认证头部
|
| 160 |
-
log_info "测试认证头部响应..."
|
| 161 |
-
local cmd="curl -s -I --max-time 30 -u $TEST_USER:$TEST_PASS"
|
| 162 |
-
local headers=$(eval "$cmd '$BASE_URL/'" 2>&1)
|
| 163 |
-
|
| 164 |
-
if echo "$headers" | grep -q "X-Powered-By.*OpenResty"; then
|
| 165 |
-
log_success "认证头部正确"
|
| 166 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 167 |
-
else
|
| 168 |
-
log_error "认证头部缺失"
|
| 169 |
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
| 170 |
-
fi
|
| 171 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 172 |
-
}
|
| 173 |
-
|
| 174 |
-
# 静态资源测试
|
| 175 |
-
test_static_resources() {
|
| 176 |
-
log_info "=== 5. 静态资源测试 ==="
|
| 177 |
-
|
| 178 |
-
# 测试常见静态资源
|
| 179 |
-
local resources=(
|
| 180 |
-
"assets/index.css"
|
| 181 |
-
"assets/index.js"
|
| 182 |
-
"favicon.ico"
|
| 183 |
-
"site.webmanifest"
|
| 184 |
-
)
|
| 185 |
-
|
| 186 |
-
for resource in "${resources[@]}"; do
|
| 187 |
-
test_http_request "静态资源: $resource" "$BASE_URL/$resource" "200" "true" "10" || log_warning "静态资源 $resource 可能不存在"
|
| 188 |
-
done
|
| 189 |
-
}
|
| 190 |
-
|
| 191 |
-
# API功能测试
|
| 192 |
-
test_api_functionality() {
|
| 193 |
-
log_info "=== 6. API功能测试 ==="
|
| 194 |
-
|
| 195 |
-
# 测试API健康检查内容
|
| 196 |
-
log_info "测试API健康检查内容..."
|
| 197 |
-
local cmd="curl -s --max-time 30 -u $TEST_USER:$TEST_PASS"
|
| 198 |
-
local content=$(eval "$cmd '$BASE_URL/opencode/api/global/health'" 2>&1)
|
| 199 |
-
|
| 200 |
-
if echo "$content" | grep -q "healthy\|status\|ok"; then
|
| 201 |
-
log_success "API健康检查内容正确"
|
| 202 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 203 |
-
else
|
| 204 |
-
log_error "API健康检查内容异常"
|
| 205 |
-
log_error "响应内容: $content"
|
| 206 |
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
| 207 |
-
fi
|
| 208 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 209 |
-
|
| 210 |
-
# 测试会话创建
|
| 211 |
-
log_info "测试API会话创建..."
|
| 212 |
-
local cmd="curl -s --max-time 30 -u $TEST_USER:$TEST_PASS -X POST -H 'Content-Type: application/json' -d '{\"title\":\"Test Session\"}'"
|
| 213 |
-
local response=$(eval "$cmd '$BASE_URL/opencode/api/session'" 2>&1)
|
| 214 |
-
|
| 215 |
-
if echo "$response" | grep -q "id\|session"; then
|
| 216 |
-
log_success "API会话创建成功"
|
| 217 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 218 |
-
else
|
| 219 |
-
log_error "API会话创建失败"
|
| 220 |
-
log_error "响应内容: $response"
|
| 221 |
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
| 222 |
-
fi
|
| 223 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 224 |
-
}
|
| 225 |
-
|
| 226 |
-
# 错误处理测试
|
| 227 |
-
test_error_handling() {
|
| 228 |
-
log_info "=== 7. 错误处理测试 ==="
|
| 229 |
-
|
| 230 |
-
# 测试404错误
|
| 231 |
-
test_http_request "404错误处理" "$BASE_URL/nonexistent-page" "404" "true"
|
| 232 |
-
|
| 233 |
-
# 测试无效API端点
|
| 234 |
-
test_http_request "无效API端点" "$BASE_URL/opencode/api/invalid-endpoint" "404" "true"
|
| 235 |
-
}
|
| 236 |
-
|
| 237 |
-
# 性能测试
|
| 238 |
-
test_performance() {
|
| 239 |
-
log_info "=== 8. 性能测试 ==="
|
| 240 |
-
|
| 241 |
-
# 测试响应时间
|
| 242 |
-
log_info "测试主页响应时间..."
|
| 243 |
-
local start_time=$(date +%s%N)
|
| 244 |
-
local cmd="curl -s --max-time 30 -u $TEST_USER:$TEST_PASS"
|
| 245 |
-
eval "$cmd '$BASE_URL/health'" > /dev/null 2>&1
|
| 246 |
-
local end_time=$(date +%s%N)
|
| 247 |
-
local response_time=$(( (end_time - start_time) / 1000000 )) # 转换为毫秒
|
| 248 |
-
|
| 249 |
-
if [ $response_time -lt 10000 ]; then
|
| 250 |
-
log_success "响应时间正常 (${response_time}ms)"
|
| 251 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 252 |
-
else
|
| 253 |
-
log_warning "响应时间较慢 (${response_time}ms)"
|
| 254 |
-
PASSED_TESTS=$((PASSED_TESTS + 1)) # 仍然算通过,只是警告
|
| 255 |
-
fi
|
| 256 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 257 |
-
}
|
| 258 |
-
|
| 259 |
-
# 生成诊断报告
|
| 260 |
-
generate_diagnostic_report() {
|
| 261 |
-
log_info "=== 诊断报告 ==="
|
| 262 |
-
|
| 263 |
-
echo ""
|
| 264 |
-
echo "=========================================="
|
| 265 |
-
echo " Hugging Face Spaces 部署诊断报告"
|
| 266 |
-
echo "=========================================="
|
| 267 |
-
echo ""
|
| 268 |
-
echo "测试时间: $(date)"
|
| 269 |
-
echo "测试目标: $BASE_URL"
|
| 270 |
-
echo "认证信息: $TEST_USER/$TEST_PASS"
|
| 271 |
-
echo ""
|
| 272 |
-
echo "测试统计:"
|
| 273 |
-
echo " 总测试数: ${TOTAL_TESTS}"
|
| 274 |
-
echo " 通过测试: ${PASSED_TESTS}"
|
| 275 |
-
echo " 失败测试: ${FAILED_TESTS}"
|
| 276 |
-
|
| 277 |
-
if [ $TOTAL_TESTS -gt 0 ]; then
|
| 278 |
-
echo " 成功率: $(( PASSED_TESTS * 100 / TOTAL_TESTS ))%"
|
| 279 |
-
fi
|
| 280 |
-
echo ""
|
| 281 |
-
|
| 282 |
-
if [ $FAILED_TESTS -eq 0 ]; then
|
| 283 |
-
echo -e "${GREEN}🎉 所有测试通过!部署成功!${NC}"
|
| 284 |
-
echo ""
|
| 285 |
-
echo -e "${GREEN}✅ 服务正常运行${NC}"
|
| 286 |
-
echo -e "${GREEN}✅ 认证机制工作${NC}"
|
| 287 |
-
echo -e "${GREEN}✅ OpenCode端点可用${NC}"
|
| 288 |
-
echo -e "${GREEN}✅ 代理配置正确${NC}"
|
| 289 |
-
else
|
| 290 |
-
echo -e "${YELLOW}⚠️ 有 ${FAILED_TESTS} 个测试失败${NC}"
|
| 291 |
-
echo ""
|
| 292 |
-
echo -e "${YELLOW}可能的问题:${NC}"
|
| 293 |
-
echo " - 服务还在启动中"
|
| 294 |
-
echo " - 配置文件有误"
|
| 295 |
-
echo " - 网络连接问题"
|
| 296 |
-
echo " - Hugging Face Spaces资源限制"
|
| 297 |
-
fi
|
| 298 |
-
|
| 299 |
-
echo ""
|
| 300 |
-
echo "=========================================="
|
| 301 |
-
echo " 访问地址确认"
|
| 302 |
-
echo "=========================================="
|
| 303 |
-
echo ""
|
| 304 |
-
echo "🌐 主要访问地址:"
|
| 305 |
-
echo " 主页: $BASE_URL/"
|
| 306 |
-
echo " 健康检查: $BASE_URL/health"
|
| 307 |
-
echo " OpenCode Web: $BASE_URL/opencode/web/"
|
| 308 |
-
echo " OpenCode API: $BASE_URL/opencode/api/"
|
| 309 |
-
echo ""
|
| 310 |
-
echo "🔌 API端点示例:"
|
| 311 |
-
echo " 健康检查: $BASE_URL/opencode/api/global/health"
|
| 312 |
-
echo " API文档: $BASE_URL/opencode/api/doc"
|
| 313 |
-
echo " 会话管理: $BASE_URL/opencode/api/session"
|
| 314 |
-
echo ""
|
| 315 |
-
|
| 316 |
-
if [ $FAILED_TESTS -gt 0 ]; then
|
| 317 |
-
echo ""
|
| 318 |
-
echo "=========================================="
|
| 319 |
-
echo " 故障排除建议"
|
| 320 |
-
echo "=========================================="
|
| 321 |
-
echo ""
|
| 322 |
-
echo "🔧 检查步骤:"
|
| 323 |
-
echo "1. 确认Space状态:在Hugging Face查看Space是否正在运行"
|
| 324 |
-
echo "2. 检查构建日志:查看Docker构建是否有错误"
|
| 325 |
-
echo "3. 检查运行日志:查看应用运行日志"
|
| 326 |
-
echo "4. 验证配置��确认nginx配置文件正确"
|
| 327 |
-
echo "5. 网络测试:尝试其他网络环境访问"
|
| 328 |
-
echo ""
|
| 329 |
-
echo "📝 常见问题:"
|
| 330 |
-
echo "- Space还在构建中"
|
| 331 |
-
echo "- 资源限制导致启动失败"
|
| 332 |
-
echo "- 端口配置问题"
|
| 333 |
-
echo "- 认证配置错误"
|
| 334 |
-
fi
|
| 335 |
-
}
|
| 336 |
-
|
| 337 |
-
# 主函数
|
| 338 |
-
main() {
|
| 339 |
-
echo "=========================================="
|
| 340 |
-
echo " Hugging Face Spaces 部署诊断工具"
|
| 341 |
-
echo "=========================================="
|
| 342 |
-
echo ""
|
| 343 |
-
echo "测试目标: $BASE_URL"
|
| 344 |
-
echo "认证信息: $TEST_USER/$TEST_PASS"
|
| 345 |
-
echo ""
|
| 346 |
-
|
| 347 |
-
# 检查必要工具
|
| 348 |
-
if ! command -v curl >/dev/null 2>&1; then
|
| 349 |
-
log_error "curl 命令未找到,请安装 curl"
|
| 350 |
-
exit 1
|
| 351 |
-
fi
|
| 352 |
-
|
| 353 |
-
# 运行所有测试
|
| 354 |
-
test_connectivity
|
| 355 |
-
test_service_status
|
| 356 |
-
test_opencode_endpoints
|
| 357 |
-
test_authentication
|
| 358 |
-
test_static_resources
|
| 359 |
-
test_api_functionality
|
| 360 |
-
test_error_handling
|
| 361 |
-
test_performance
|
| 362 |
-
|
| 363 |
-
# 生成报告
|
| 364 |
-
generate_diagnostic_report
|
| 365 |
-
|
| 366 |
-
# 返回适当的退出码
|
| 367 |
-
if [ $FAILED_TESTS -eq 0 ]; then
|
| 368 |
-
exit 0
|
| 369 |
-
else
|
| 370 |
-
exit 1
|
| 371 |
-
fi
|
| 372 |
-
}
|
| 373 |
-
|
| 374 |
-
# 如果直接运行此脚本
|
| 375 |
-
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
| 376 |
-
main "$@"
|
| 377 |
-
fi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
runtime-test.sh
DELETED
|
@@ -1,423 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
|
| 3 |
-
# =============================================================================
|
| 4 |
-
# Nginx + OpenCode 运行时功能测试套件
|
| 5 |
-
# =============================================================================
|
| 6 |
-
|
| 7 |
-
set -e
|
| 8 |
-
|
| 9 |
-
# 颜色定义
|
| 10 |
-
RED='\033[0;31m'
|
| 11 |
-
GREEN='\033[0;32m'
|
| 12 |
-
YELLOW='\033[1;33m'
|
| 13 |
-
BLUE='\033[0;34m'
|
| 14 |
-
NC='\033[0m'
|
| 15 |
-
|
| 16 |
-
# 测试配置
|
| 17 |
-
NGINX_PORT="7860"
|
| 18 |
-
OPENCODE_PORT="57860"
|
| 19 |
-
BASE_URL="http://localhost:${NGINX_PORT}"
|
| 20 |
-
TEST_USER="admin"
|
| 21 |
-
TEST_PASS="admin123"
|
| 22 |
-
|
| 23 |
-
# 测试结果统计
|
| 24 |
-
TOTAL_TESTS=0
|
| 25 |
-
PASSED_TESTS=0
|
| 26 |
-
FAILED_TESTS=0
|
| 27 |
-
|
| 28 |
-
# 日志函数
|
| 29 |
-
log_info() {
|
| 30 |
-
echo -e "${BLUE}[INFO]${NC} $1"
|
| 31 |
-
}
|
| 32 |
-
|
| 33 |
-
log_success() {
|
| 34 |
-
echo -e "${GREEN}[PASS]${NC} $1"
|
| 35 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 36 |
-
}
|
| 37 |
-
|
| 38 |
-
log_error() {
|
| 39 |
-
echo -e "${RED}[FAIL]${NC} $1"
|
| 40 |
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
| 41 |
-
}
|
| 42 |
-
|
| 43 |
-
log_warning() {
|
| 44 |
-
echo -e "${YELLOW}[WARN]${NC} $1"
|
| 45 |
-
}
|
| 46 |
-
|
| 47 |
-
# 检查服务是否运行
|
| 48 |
-
check_service() {
|
| 49 |
-
local service_name="$1"
|
| 50 |
-
local port="$2"
|
| 51 |
-
local host="${3:-localhost}"
|
| 52 |
-
|
| 53 |
-
if nc -z "$host" "$port" 2>/dev/null; then
|
| 54 |
-
log_success "$service_name 服务运行中 (端口 $port)"
|
| 55 |
-
return 0
|
| 56 |
-
else
|
| 57 |
-
log_error "$service_name 服务未运行 (端口 $port)"
|
| 58 |
-
return 1
|
| 59 |
-
fi
|
| 60 |
-
}
|
| 61 |
-
|
| 62 |
-
# HTTP请求测试
|
| 63 |
-
test_http_request() {
|
| 64 |
-
local test_name="$1"
|
| 65 |
-
local url="$2"
|
| 66 |
-
local expected_status="$3"
|
| 67 |
-
local auth="$4"
|
| 68 |
-
|
| 69 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 70 |
-
log_info "测试: $test_name"
|
| 71 |
-
|
| 72 |
-
local cmd="curl -s -o /dev/null -w '%{http_code}' --max-time 10"
|
| 73 |
-
|
| 74 |
-
if [ "$auth" = "true" ]; then
|
| 75 |
-
cmd="$cmd -u $TEST_USER:$TEST_PASS"
|
| 76 |
-
fi
|
| 77 |
-
|
| 78 |
-
local status=$(eval "$cmd '$url'")
|
| 79 |
-
|
| 80 |
-
if [ "$status" = "$expected_status" ]; then
|
| 81 |
-
log_success "$test_name (HTTP $status)"
|
| 82 |
-
return 0
|
| 83 |
-
else
|
| 84 |
-
log_error "$test_name (期望: $expected_status, 实际: $status)"
|
| 85 |
-
return 1
|
| 86 |
-
fi
|
| 87 |
-
}
|
| 88 |
-
|
| 89 |
-
# 内容测试
|
| 90 |
-
test_http_content() {
|
| 91 |
-
local test_name="$1"
|
| 92 |
-
local url="$2"
|
| 93 |
-
local expected_content="$3"
|
| 94 |
-
local auth="$4"
|
| 95 |
-
|
| 96 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 97 |
-
log_info "测试: $test_name"
|
| 98 |
-
|
| 99 |
-
local cmd="curl -s --max-time 10"
|
| 100 |
-
|
| 101 |
-
if [ "$auth" = "true" ]; then
|
| 102 |
-
cmd="$cmd -u $TEST_USER:$TEST_PASS"
|
| 103 |
-
fi
|
| 104 |
-
|
| 105 |
-
local content=$(eval "$cmd '$url'")
|
| 106 |
-
|
| 107 |
-
if echo "$content" | grep -q "$expected_content"; then
|
| 108 |
-
log_success "$test_name (内容匹配)"
|
| 109 |
-
return 0
|
| 110 |
-
else
|
| 111 |
-
log_error "$test_name (内容不匹配)"
|
| 112 |
-
return 1
|
| 113 |
-
fi
|
| 114 |
-
}
|
| 115 |
-
|
| 116 |
-
# 1. 服务运行状态检查
|
| 117 |
-
test_service_status() {
|
| 118 |
-
log_info "=== 1. 服务运行状态检查 ==="
|
| 119 |
-
|
| 120 |
-
# 检查nginx服务
|
| 121 |
-
check_service "Nginx" "$NGINX_PORT"
|
| 122 |
-
|
| 123 |
-
# 检查OpenCode服务
|
| 124 |
-
check_service "OpenCode" "$OPENCODE_PORT"
|
| 125 |
-
}
|
| 126 |
-
|
| 127 |
-
# 2. 认证功能测试
|
| 128 |
-
test_authentication() {
|
| 129 |
-
log_info "=== 2. 认证功能测试 ==="
|
| 130 |
-
|
| 131 |
-
# 测试无认证访问
|
| 132 |
-
test_http_request "无认证访问主页" "$BASE_URL/" "401" "false"
|
| 133 |
-
test_http_request "无认证访问健康检查" "$BASE_URL/health" "401" "false"
|
| 134 |
-
test_http_request "无认证访问OpenCode Web" "$BASE_URL/opencode/web/" "401" "false"
|
| 135 |
-
test_http_request "无认证访问OpenCode API" "$BASE_URL/opencode/api/global/health" "401" "false"
|
| 136 |
-
|
| 137 |
-
# 测试有认证访问
|
| 138 |
-
test_http_request "认证访问主页" "$BASE_URL/" "200" "true"
|
| 139 |
-
test_http_request "认证访问健康检查" "$BASE_URL/health" "200" "true"
|
| 140 |
-
test_http_request "认证访问OpenCode Web" "$BASE_URL/opencode/web/" "200" "true"
|
| 141 |
-
test_http_request "认证访问OpenCode API健康检查" "$BASE_URL/opencode/api/global/health" "200" "true"
|
| 142 |
-
}
|
| 143 |
-
|
| 144 |
-
# 3. 路由和重定向测试
|
| 145 |
-
test_routing() {
|
| 146 |
-
log_info "=== 3. 路由和重定向测试 ==="
|
| 147 |
-
|
| 148 |
-
# 测试重定向
|
| 149 |
-
test_http_request "/opencode 重定向" "$BASE_URL/opencode" "301" "true"
|
| 150 |
-
test_http_request "/opencode/ 重定向" "$BASE_URL/opencode/" "301" "true"
|
| 151 |
-
|
| 152 |
-
# 测试健康检查
|
| 153 |
-
test_http_content "健康检查内容" "$BASE_URL/health" "OK" "true"
|
| 154 |
-
}
|
| 155 |
-
|
| 156 |
-
# 4. OpenCode Web端点测试
|
| 157 |
-
test_opencode_web() {
|
| 158 |
-
log_info "=== 4. OpenCode Web端点测试 ==="
|
| 159 |
-
|
| 160 |
-
# 测试Web界面访问
|
| 161 |
-
test_http_request "OpenCode Web界面" "$BASE_URL/opencode/web/" "200" "true"
|
| 162 |
-
|
| 163 |
-
# 测试静态资源代理
|
| 164 |
-
test_http_request "静态资源代理" "$BASE_URL/assets/index.css" "200" "true" || log_warning "静态资源可能不存在"
|
| 165 |
-
test_http_request "Favicon代理" "$BASE_URL/favicon.ico" "200" "true" || log_warning "Favicon可能不存在"
|
| 166 |
-
test_http_request "Web Manifest代理" "$BASE_URL/site.webmanifest" "200" "true" || log_warning "Web Manifest可能不存在"
|
| 167 |
-
}
|
| 168 |
-
|
| 169 |
-
# 5. OpenCode API端点测试
|
| 170 |
-
test_opencode_api() {
|
| 171 |
-
log_info "=== 5. OpenCode API端点测试 ==="
|
| 172 |
-
|
| 173 |
-
# 测试API健康检查
|
| 174 |
-
test_http_content "API健康检查" "$BASE_URL/opencode/api/global/health" "healthy" "true"
|
| 175 |
-
|
| 176 |
-
# 测试API文档
|
| 177 |
-
test_http_request "API文档访问" "$BASE_URL/opencode/api/doc" "200" "true"
|
| 178 |
-
|
| 179 |
-
# 测试项目API
|
| 180 |
-
test_http_request "项目API" "$BASE_URL/opencode/api/project" "200" "true"
|
| 181 |
-
|
| 182 |
-
# 测试会话API
|
| 183 |
-
test_http_request "会话API" "$BASE_URL/opencode/api/session" "200" "true"
|
| 184 |
-
|
| 185 |
-
# 测试提供商API
|
| 186 |
-
test_http_request "提供商API" "$BASE_URL/opencode/api/provider" "200" "true"
|
| 187 |
-
}
|
| 188 |
-
|
| 189 |
-
# 6. CORS功能测试
|
| 190 |
-
test_cors() {
|
| 191 |
-
log_info "=== 6. CORS功能测试 ==="
|
| 192 |
-
|
| 193 |
-
# 测试OPTIONS请求
|
| 194 |
-
local cmd="curl -s -o /dev/null -w '%{http_code}' -X OPTIONS --max-time 10 -u $TEST_USER:$TEST_PASS"
|
| 195 |
-
local status=$(eval "$cmd '$BASE_URL/opencode/api/session'")
|
| 196 |
-
|
| 197 |
-
if [ "$status" = "204" ] || [ "$status" = "200" ]; then
|
| 198 |
-
log_success "CORS OPTIONS请求 (HTTP $status)"
|
| 199 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 200 |
-
else
|
| 201 |
-
log_error "CORS OPTIONS请求 (期望: 204/200, 实际: $status)"
|
| 202 |
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
| 203 |
-
fi
|
| 204 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 205 |
-
|
| 206 |
-
# 测试CORS头部
|
| 207 |
-
local cmd="curl -s -I --max-time 10 -u $TEST_USER:$TEST_PASS"
|
| 208 |
-
local headers=$(eval "$cmd '$BASE_URL/opencode/api/session'")
|
| 209 |
-
|
| 210 |
-
if echo "$headers" | grep -q "Access-Control-Allow-Origin"; then
|
| 211 |
-
log_success "CORS头部存在"
|
| 212 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 213 |
-
else
|
| 214 |
-
log_error "CORS头部缺失"
|
| 215 |
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
| 216 |
-
fi
|
| 217 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 218 |
-
}
|
| 219 |
-
|
| 220 |
-
# 7. 性能和超时测试
|
| 221 |
-
test_performance() {
|
| 222 |
-
log_info "=== 7. 性能和超时测试 ==="
|
| 223 |
-
|
| 224 |
-
# 测试响应时间
|
| 225 |
-
local start_time=$(date +%s%N)
|
| 226 |
-
curl -s --max-time 10 -u "$TEST_USER:$TEST_PASS" "$BASE_URL/health" > /dev/null
|
| 227 |
-
local end_time=$(date +%s%N)
|
| 228 |
-
local response_time=$(( (end_time - start_time) / 1000000 )) # 转换为毫秒
|
| 229 |
-
|
| 230 |
-
if [ $response_time -lt 5000 ]; then
|
| 231 |
-
log_success "响应时间测试 (${response_time}ms)"
|
| 232 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 233 |
-
else
|
| 234 |
-
log_warning "响应时间较慢 (${response_time}ms)"
|
| 235 |
-
PASSED_TESTS=$((PASSED_TESTS + 1)) # 仍然算通过,只是警告
|
| 236 |
-
fi
|
| 237 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 238 |
-
}
|
| 239 |
-
|
| 240 |
-
# 8. 安全功能测试
|
| 241 |
-
test_security() {
|
| 242 |
-
log_info "=== 8. 安全功能测试 ==="
|
| 243 |
-
|
| 244 |
-
# 测试错误认证
|
| 245 |
-
local cmd="curl -s -o /dev/null -w '%{http_code}' --max-time 10"
|
| 246 |
-
local status=$(eval "$cmd -u wrong:password '$BASE_URL/'")
|
| 247 |
-
|
| 248 |
-
if [ "$status" = "401" ]; then
|
| 249 |
-
log_success "错误认证拒绝 (HTTP $status)"
|
| 250 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 251 |
-
else
|
| 252 |
-
log_error "错误认证拒绝 (期望: 401, 实际: $status)"
|
| 253 |
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
| 254 |
-
fi
|
| 255 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 256 |
-
|
| 257 |
-
# 测试安全头部
|
| 258 |
-
local cmd="curl -s -I --max-time 10 -u $TEST_USER:$TEST_PASS"
|
| 259 |
-
local headers=$(eval "$cmd '$BASE_URL/'")
|
| 260 |
-
|
| 261 |
-
if echo "$headers" | grep -q "X-Powered-By.*OpenResty"; then
|
| 262 |
-
log_success "安全头部存在"
|
| 263 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 264 |
-
else
|
| 265 |
-
log_error "安全头部缺失"
|
| 266 |
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
| 267 |
-
fi
|
| 268 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 269 |
-
}
|
| 270 |
-
|
| 271 |
-
# 9. 集成功能测试
|
| 272 |
-
test_integration() {
|
| 273 |
-
log_info "=== 9. 集成功能测试 ==="
|
| 274 |
-
|
| 275 |
-
# 测试完整的API调用流程
|
| 276 |
-
log_info "测试API会话创建..."
|
| 277 |
-
|
| 278 |
-
local cmd="curl -s --max-time 10 -u $TEST_USER:$TEST_PASS -X POST -H 'Content-Type: application/json' -d '{\"title\":\"Test Session\"}'"
|
| 279 |
-
local response=$(eval "$cmd '$BASE_URL/opencode/api/session'")
|
| 280 |
-
|
| 281 |
-
if echo "$response" | grep -q "id"; then
|
| 282 |
-
log_success "API会话创建成功"
|
| 283 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 284 |
-
|
| 285 |
-
# 提取session ID进行下一步测试
|
| 286 |
-
local session_id=$(echo "$response" | grep -o '"id":"[^"]*"' | cut -d'"' -f4)
|
| 287 |
-
|
| 288 |
-
if [ -n "$session_id" ]; then
|
| 289 |
-
log_info "测试消息发送到会话 $session_id..."
|
| 290 |
-
|
| 291 |
-
local cmd="curl -s --max-time 10 -u $TEST_USER:$TEST_PASS -X POST -H 'Content-Type: application/json' -d '{\"parts\":[{\"type\":\"text\",\"text\":\"Hello\"}]}'"
|
| 292 |
-
local msg_response=$(eval "$cmd '$BASE_URL/opencode/api/session/$session_id/message'")
|
| 293 |
-
|
| 294 |
-
if echo "$msg_response" | grep -q "id\|message"; then
|
| 295 |
-
log_success "API消息发送成功"
|
| 296 |
-
PASSED_TESTS=$((PASSED_TESTS + 1))
|
| 297 |
-
else
|
| 298 |
-
log_error "API消息发送失败"
|
| 299 |
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
| 300 |
-
fi
|
| 301 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 302 |
-
fi
|
| 303 |
-
else
|
| 304 |
-
log_error "API会话创建失败"
|
| 305 |
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
| 306 |
-
fi
|
| 307 |
-
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
| 308 |
-
}
|
| 309 |
-
|
| 310 |
-
# 生成测试报告
|
| 311 |
-
generate_runtime_report() {
|
| 312 |
-
log_info "=== 运行时测试报告 ==="
|
| 313 |
-
|
| 314 |
-
echo ""
|
| 315 |
-
echo "=========================================="
|
| 316 |
-
echo " 运行时功能测试报告"
|
| 317 |
-
echo "=========================================="
|
| 318 |
-
echo ""
|
| 319 |
-
echo "测���时间: $(date)"
|
| 320 |
-
echo "测试目标: $BASE_URL"
|
| 321 |
-
echo ""
|
| 322 |
-
echo "测试统计:"
|
| 323 |
-
echo " 总测试数: ${TOTAL_TESTS}"
|
| 324 |
-
echo " 通过测试: ${PASSED_TESTS}"
|
| 325 |
-
echo " 失败测试: ${FAILED_TESTS}"
|
| 326 |
-
|
| 327 |
-
if [ $TOTAL_TESTS -gt 0 ]; then
|
| 328 |
-
echo " 成功率: $(( PASSED_TESTS * 100 / TOTAL_TESTS ))%"
|
| 329 |
-
fi
|
| 330 |
-
echo ""
|
| 331 |
-
|
| 332 |
-
if [ $FAILED_TESTS -eq 0 ]; then
|
| 333 |
-
echo -e "${GREEN}🎉 所有运行时测试通过!${NC}"
|
| 334 |
-
echo ""
|
| 335 |
-
echo -e "${GREEN}✅ 服务功能正常${NC}"
|
| 336 |
-
echo -e "${GREEN}✅ 认证机制工作${NC}"
|
| 337 |
-
echo -e "${GREEN}✅ 路由配置正确${NC}"
|
| 338 |
-
echo -e "${GREEN}✅ API端点可用${NC}"
|
| 339 |
-
echo -e "${GREEN}✅ 代理转发正常${NC}"
|
| 340 |
-
else
|
| 341 |
-
echo -e "${YELLOW}⚠️ 有 ${FAILED_TESTS} 个测试失败${NC}"
|
| 342 |
-
echo ""
|
| 343 |
-
echo -e "${YELLOW}请检查:${NC}"
|
| 344 |
-
echo " - 服务是否正常启动"
|
| 345 |
-
echo " - 端口是否被占用"
|
| 346 |
-
echo " - OpenCode是否运行"
|
| 347 |
-
echo " - 网络连接是否正常"
|
| 348 |
-
fi
|
| 349 |
-
|
| 350 |
-
echo ""
|
| 351 |
-
echo "=========================================="
|
| 352 |
-
echo " 访问地址确认"
|
| 353 |
-
echo "=========================================="
|
| 354 |
-
echo ""
|
| 355 |
-
echo "🔐 认证信息:"
|
| 356 |
-
echo " 用户名: $TEST_USER"
|
| 357 |
-
echo " 密码: $TEST_PASS"
|
| 358 |
-
echo ""
|
| 359 |
-
echo "🌐 访问地址:"
|
| 360 |
-
echo " 主页: $BASE_URL/"
|
| 361 |
-
echo " 健康检查: $BASE_URL/health"
|
| 362 |
-
echo " OpenCode Web: $BASE_URL/opencode/web/"
|
| 363 |
-
echo " OpenCode API: $BASE_URL/opencode/api/"
|
| 364 |
-
echo " API文档: $BASE_URL/opencode/api/doc"
|
| 365 |
-
echo ""
|
| 366 |
-
echo "📊 API端点示例:"
|
| 367 |
-
echo " 健康检查: $BASE_URL/opencode/api/global/health"
|
| 368 |
-
echo " 项目管理: $BASE_URL/opencode/api/project"
|
| 369 |
-
echo " 会话管理: $BASE_URL/opencode/api/session"
|
| 370 |
-
echo " 提供商: $BASE_URL/opencode/api/provider"
|
| 371 |
-
echo ""
|
| 372 |
-
|
| 373 |
-
if [ $FAILED_TESTS -eq 0 ]; then
|
| 374 |
-
echo -e "${GREEN}🚀 系统已就绪,可以正常使用!${NC}"
|
| 375 |
-
fi
|
| 376 |
-
}
|
| 377 |
-
|
| 378 |
-
# 主函数
|
| 379 |
-
main() {
|
| 380 |
-
echo "=========================================="
|
| 381 |
-
echo " Nginx + OpenCode 运行时功能测试"
|
| 382 |
-
echo "=========================================="
|
| 383 |
-
echo ""
|
| 384 |
-
echo "测试目标: $BASE_URL"
|
| 385 |
-
echo "认证信息: $TEST_USER/$TEST_PASS"
|
| 386 |
-
echo ""
|
| 387 |
-
|
| 388 |
-
# 检查必要工具
|
| 389 |
-
if ! command -v curl >/dev/null 2>&1; then
|
| 390 |
-
log_error "curl 命令未找到,请安装 curl"
|
| 391 |
-
exit 1
|
| 392 |
-
fi
|
| 393 |
-
|
| 394 |
-
if ! command -v nc >/dev/null 2>&1; then
|
| 395 |
-
log_warning "nc 命令未找到,跳过端口检查"
|
| 396 |
-
fi
|
| 397 |
-
|
| 398 |
-
# 运行所有测试
|
| 399 |
-
test_service_status
|
| 400 |
-
test_authentication
|
| 401 |
-
test_routing
|
| 402 |
-
test_opencode_web
|
| 403 |
-
test_opencode_api
|
| 404 |
-
test_cors
|
| 405 |
-
test_performance
|
| 406 |
-
test_security
|
| 407 |
-
test_integration
|
| 408 |
-
|
| 409 |
-
# 生成报告
|
| 410 |
-
generate_runtime_report
|
| 411 |
-
|
| 412 |
-
# 返回适当的退出码
|
| 413 |
-
if [ $FAILED_TESTS -eq 0 ]; then
|
| 414 |
-
exit 0
|
| 415 |
-
else
|
| 416 |
-
exit 1
|
| 417 |
-
fi
|
| 418 |
-
}
|
| 419 |
-
|
| 420 |
-
# 如果直接运行此脚本
|
| 421 |
-
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
| 422 |
-
main "$@"
|
| 423 |
-
fi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test-api-endpoints.sh
DELETED
|
@@ -1,54 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
|
| 3 |
-
# 测试API端点访问
|
| 4 |
-
|
| 5 |
-
echo "🔍 测试OpenCode API端点访问..."
|
| 6 |
-
|
| 7 |
-
base_url="https://airsltd-ocngx.hf.space"
|
| 8 |
-
|
| 9 |
-
# 测试各个API端点
|
| 10 |
-
test_endpoints=(
|
| 11 |
-
"/global/health"
|
| 12 |
-
"/global/event"
|
| 13 |
-
"/session"
|
| 14 |
-
"/project"
|
| 15 |
-
"/provider"
|
| 16 |
-
"/file"
|
| 17 |
-
"/find"
|
| 18 |
-
"/config"
|
| 19 |
-
"/doc"
|
| 20 |
-
)
|
| 21 |
-
|
| 22 |
-
echo "📡 测试API端点..."
|
| 23 |
-
for endpoint in "${test_endpoints[@]}"; do
|
| 24 |
-
echo -n " $endpoint: "
|
| 25 |
-
response=$(curl -s -w "%{http_code}" "${base_url}${endpoint}")
|
| 26 |
-
http_code="${response: -3}"
|
| 27 |
-
|
| 28 |
-
if [ "$http_code" = "200" ]; then
|
| 29 |
-
echo "✅ 200 OK"
|
| 30 |
-
elif [ "$http_code" = "404" ]; then
|
| 31 |
-
echo "❌ 404 Not Found"
|
| 32 |
-
elif [ "$http_code" = "401" ]; then
|
| 33 |
-
echo "❌ 401 Unauthorized"
|
| 34 |
-
elif [ "$http_code" = "405" ]; then
|
| 35 |
-
echo "✅ 405 Method Not Allowed (正常,端点存在但不支持GET)"
|
| 36 |
-
else
|
| 37 |
-
echo "❓ $http_code"
|
| 38 |
-
fi
|
| 39 |
-
done
|
| 40 |
-
|
| 41 |
-
echo ""
|
| 42 |
-
echo "🌐 测试主页面和关键功能..."
|
| 43 |
-
main_response=$(curl -s -w "%{http_code}" "${base_url}/opencode/")
|
| 44 |
-
main_http_code="${main_response: -3}"
|
| 45 |
-
|
| 46 |
-
if [ "$main_http_code" = "200" ]; then
|
| 47 |
-
echo "✅ 主页面 200 OK"
|
| 48 |
-
else
|
| 49 |
-
echo "❌ 主页面 $main_http_code"
|
| 50 |
-
fi
|
| 51 |
-
|
| 52 |
-
echo ""
|
| 53 |
-
echo "🎯 测试完成!"
|
| 54 |
-
echo "📱 如果所有API端点都是200,则Web界面应该完全正常工作"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test-connection.sh
DELETED
|
@@ -1,70 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
|
| 3 |
-
# 测试脚本:验证OpenCode服务内部连接
|
| 4 |
-
|
| 5 |
-
echo "🔍 测试OpenCode服务内部连接..."
|
| 6 |
-
|
| 7 |
-
# 测试1: 检查nginx是否正常运行
|
| 8 |
-
echo "📡 测试1: nginx健康检查"
|
| 9 |
-
if curl -s https://airsltd-ocngx.hf.space/health > /dev/null; then
|
| 10 |
-
echo "✅ nginx服务正常"
|
| 11 |
-
else
|
| 12 |
-
echo "❌ nginx服务异常"
|
| 13 |
-
exit 1
|
| 14 |
-
fi
|
| 15 |
-
|
| 16 |
-
# 测试2: 检查/opencode/路径是否现在可以访问(无认证)
|
| 17 |
-
echo "🌐 测试2: /opencode/路径访问"
|
| 18 |
-
response=$(curl -s -w "%{http_code}" https://airsltd-ocngx.hf.space/opencode/global/health)
|
| 19 |
-
http_code="${response: -3}"
|
| 20 |
-
body="${response%???}"
|
| 21 |
-
|
| 22 |
-
if [ "$http_code" = "200" ]; then
|
| 23 |
-
echo "✅ OpenCode服务可访问"
|
| 24 |
-
echo "📊 响应: $body"
|
| 25 |
-
elif [ "$http_code" = "401" ]; then
|
| 26 |
-
echo "❌ 仍然需要认证 - 配置未生效"
|
| 27 |
-
echo "📊 响应: $body"
|
| 28 |
-
elif [ "$http_code" = "502" ]; then
|
| 29 |
-
echo "❌ OpenCode服务未启动或代理失败"
|
| 30 |
-
echo "📊 响应: $body"
|
| 31 |
-
else
|
| 32 |
-
echo "❓ 未知状态码: $http_code"
|
| 33 |
-
echo "📊 响应: $body"
|
| 34 |
-
fi
|
| 35 |
-
|
| 36 |
-
# 测试3: 检查Web界面
|
| 37 |
-
echo "🖥️ 测试3: Web界面访问"
|
| 38 |
-
web_response=$(curl -s -w "%{http_code}" https://airsltd-ocngx.hf.space/opencode/)
|
| 39 |
-
web_http_code="${web_response: -3}"
|
| 40 |
-
web_body="${web_response%???}"
|
| 41 |
-
|
| 42 |
-
if [ "$web_http_code" = "200" ] && echo "$web_body" | grep -q "html"; then
|
| 43 |
-
echo "✅ Web界面正常加载"
|
| 44 |
-
echo "📊 页面类型: HTML"
|
| 45 |
-
elif [ "$web_http_code" = "200" ] && echo "$web_body" | grep -q "healthy"; then
|
| 46 |
-
echo "✅ OpenCode API响应正常"
|
| 47 |
-
echo "📊 响应类型: JSON API"
|
| 48 |
-
else
|
| 49 |
-
echo "❌ Web界面加载失败"
|
| 50 |
-
echo "📊 状态码: $web_http_code"
|
| 51 |
-
echo "📊 响应预览: ${web_body:0:100}..."
|
| 52 |
-
fi
|
| 53 |
-
|
| 54 |
-
# 测试4: 检查API文档
|
| 55 |
-
echo "📚 测试4: API文档访问"
|
| 56 |
-
doc_response=$(curl -s -w "%{http_code}" https://airsltd-ocngx.hf.space/opencode/doc)
|
| 57 |
-
doc_http_code="${doc_response: -3}"
|
| 58 |
-
|
| 59 |
-
if [ "$doc_http_code" = "200" ]; then
|
| 60 |
-
echo "✅ API文档可访问"
|
| 61 |
-
elif [ "$doc_http_code" = "404" ]; then
|
| 62 |
-
echo "❌ API文档端点不存在"
|
| 63 |
-
else
|
| 64 |
-
echo "❓ API文档状态: $doc_http_code"
|
| 65 |
-
fi
|
| 66 |
-
|
| 67 |
-
echo ""
|
| 68 |
-
echo "🎯 测试完成!"
|
| 69 |
-
echo "📱 如果所有测试通过,可以在手机浏览器中访问:"
|
| 70 |
-
echo " https://airsltd-ocngx.hf.space/opencode/"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test-nginx-config.sh
DELETED
|
@@ -1,62 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
|
| 3 |
-
echo "=== 测试新的nginx配置 ==="
|
| 4 |
-
|
| 5 |
-
echo "1. 检查配置文件语法..."
|
| 6 |
-
# 简单检查配置文件语法
|
| 7 |
-
if [ -f "nginx/nginx.conf" ] && [ -f "nginx/conf.d/default.conf" ]; then
|
| 8 |
-
echo "✅ 配置文件存在"
|
| 9 |
-
else
|
| 10 |
-
echo "❌ 配置文件缺失"
|
| 11 |
-
exit 1
|
| 12 |
-
fi
|
| 13 |
-
|
| 14 |
-
echo "2. 验证端点配置..."
|
| 15 |
-
# 检查关键端点配置
|
| 16 |
-
echo "检查 /opencode/web/ 端点配置..."
|
| 17 |
-
if grep -q "location /opencode/web/" nginx/conf.d/default.conf; then
|
| 18 |
-
echo "✅ /opencode/web/ 端点已配置"
|
| 19 |
-
else
|
| 20 |
-
echo "❌ /opencode/web/ 端点未找到"
|
| 21 |
-
fi
|
| 22 |
-
|
| 23 |
-
echo "检查 /opencode/api/ 端点配置..."
|
| 24 |
-
if grep -q "location /opencode/api/" nginx/conf.d/default.conf; then
|
| 25 |
-
echo "✅ /opencode/api/ 端点已配置"
|
| 26 |
-
else
|
| 27 |
-
echo "❌ /opencode/api/ 端点未找到"
|
| 28 |
-
fi
|
| 29 |
-
|
| 30 |
-
echo "3. 验证认证配置..."
|
| 31 |
-
# 检查认证配置
|
| 32 |
-
if grep -q "auth_basic" nginx/conf.d/default.conf; then
|
| 33 |
-
echo "✅ HTTP Basic Auth已配置"
|
| 34 |
-
else
|
| 35 |
-
echo "❌ HTTP Basic Auth未找到"
|
| 36 |
-
fi
|
| 37 |
-
|
| 38 |
-
echo "4. 检查代理简化..."
|
| 39 |
-
# 统计代理端点数量
|
| 40 |
-
proxy_count=$(grep -c "proxy_pass http://127.0.0.1:57860" nginx/conf.d/default.conf)
|
| 41 |
-
echo "当前代理端点数量: $proxy_count"
|
| 42 |
-
|
| 43 |
-
echo "5. 验证重定向配置..."
|
| 44 |
-
if grep -q "location = /opencode" nginx/conf.d/default.conf; then
|
| 45 |
-
echo "✅ /opencode 重定向已配置"
|
| 46 |
-
else
|
| 47 |
-
echo "❌ /opencode 重定向未找到"
|
| 48 |
-
fi
|
| 49 |
-
|
| 50 |
-
echo ""
|
| 51 |
-
echo "=== 配置总结 ==="
|
| 52 |
-
echo "✅ 默认站点: nginx (根路径 /)"
|
| 53 |
-
echo "✅ OpenCode Web端点: /opencode/web/"
|
| 54 |
-
echo "✅ OpenCode API端点: /opencode/api/"
|
| 55 |
-
echo "✅ 统一认证: server级别Basic Auth"
|
| 56 |
-
echo "✅ 简化代理: 使用统一端点转发"
|
| 57 |
-
echo ""
|
| 58 |
-
echo "=== 访问方式 ==="
|
| 59 |
-
echo "主页: http://localhost:7860/ (需要认证)"
|
| 60 |
-
echo "OpenCode Web: http://localhost:7860/opencode/web/ (需要认证)"
|
| 61 |
-
echo "OpenCode API: http://localhost:7860/opencode/api/ (需要认证)"
|
| 62 |
-
echo "健康检查: http://localhost:7860/health (需要认证)"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test-static-resources.sh
DELETED
|
@@ -1,54 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
|
| 3 |
-
# 测试静态资源访问
|
| 4 |
-
|
| 5 |
-
echo "🔍 测试OpenCode静态资源访问..."
|
| 6 |
-
|
| 7 |
-
base_url="https://airsltd-ocngx.hf.space"
|
| 8 |
-
|
| 9 |
-
# 测试各个静态资源端点
|
| 10 |
-
test_resources=(
|
| 11 |
-
"/assets/index-OLRiU-d3.js"
|
| 12 |
-
"/assets/index-DViKQ2Re.css"
|
| 13 |
-
"/oc-theme-preload.js"
|
| 14 |
-
"/site.webmanifest"
|
| 15 |
-
"/favicon.ico"
|
| 16 |
-
"/favicon-96x96.png"
|
| 17 |
-
)
|
| 18 |
-
|
| 19 |
-
echo "📦 测试静态资源端点..."
|
| 20 |
-
for resource in "${test_resources[@]}"; do
|
| 21 |
-
echo -n " $resource: "
|
| 22 |
-
response=$(curl -s -w "%{http_code}" "${base_url}${resource}")
|
| 23 |
-
http_code="${response: -3}"
|
| 24 |
-
|
| 25 |
-
if [ "$http_code" = "200" ]; then
|
| 26 |
-
echo "✅ 200 OK"
|
| 27 |
-
elif [ "$http_code" = "404" ]; then
|
| 28 |
-
echo "❌ 404 Not Found"
|
| 29 |
-
elif [ "$http_code" = "401" ]; then
|
| 30 |
-
echo "❌ 401 Unauthorized"
|
| 31 |
-
else
|
| 32 |
-
echo "❓ $http_code"
|
| 33 |
-
fi
|
| 34 |
-
done
|
| 35 |
-
|
| 36 |
-
echo ""
|
| 37 |
-
echo "🌐 测试主页面加载..."
|
| 38 |
-
main_response=$(curl -s -w "%{http_code}" "${base_url}/opencode/")
|
| 39 |
-
main_http_code="${main_response: -3}"
|
| 40 |
-
|
| 41 |
-
if [ "$main_http_code" = "200" ]; then
|
| 42 |
-
echo "✅ 主页面 200 OK"
|
| 43 |
-
if echo "${main_response%???}" | grep -q "opencode"; then
|
| 44 |
-
echo "✅ 页面内容正常"
|
| 45 |
-
else
|
| 46 |
-
echo "❌ 页面内容异常"
|
| 47 |
-
fi
|
| 48 |
-
else
|
| 49 |
-
echo "❌ 主页面 $main_http_code"
|
| 50 |
-
fi
|
| 51 |
-
|
| 52 |
-
echo ""
|
| 53 |
-
echo "🎯 测试完成!"
|
| 54 |
-
echo "📱 如果所有静态资源都是200,则Web界面应该完全正常工作"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test_integration.sh
DELETED
|
@@ -1,85 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
|
| 3 |
-
# 测试脚本:验证 OpenCode + Nginx 集成
|
| 4 |
-
|
| 5 |
-
echo "🧪 Testing OpenCode + Nginx Integration"
|
| 6 |
-
echo "======================================"
|
| 7 |
-
|
| 8 |
-
# 检查环境
|
| 9 |
-
echo "📋 Environment Check:"
|
| 10 |
-
echo " • OpenCode will be installed in Docker"
|
| 11 |
-
echo " • Nginx will listen on port 7860"
|
| 12 |
-
echo " • OpenCode will listen on port 57860"
|
| 13 |
-
echo " • Basic Auth: admin/admin123"
|
| 14 |
-
echo ""
|
| 15 |
-
|
| 16 |
-
# 测试计划
|
| 17 |
-
echo "🎯 Test Plan:"
|
| 18 |
-
echo " 1. Docker build and run"
|
| 19 |
-
echo " 2. Nginx authentication test"
|
| 20 |
-
echo " 3. OpenCode proxy test"
|
| 21 |
-
echo " 4. API documentation access"
|
| 22 |
-
echo " 5. End-to-end AI coding test"
|
| 23 |
-
echo ""
|
| 24 |
-
|
| 25 |
-
# 预期的 API 端点
|
| 26 |
-
echo "📡 Expected Endpoints:"
|
| 27 |
-
echo " • Main Site: http://localhost:7860/"
|
| 28 |
-
echo " • Health Check: http://localhost:7860/health"
|
| 29 |
-
echo " • OpenCode API: http://localhost:7860/opencode/"
|
| 30 |
-
echo " • OpenCode Docs: http://localhost:7860/opencode/doc"
|
| 31 |
-
echo " • Global Health: http://localhost:7860/opencode/global/health"
|
| 32 |
-
echo ""
|
| 33 |
-
|
| 34 |
-
# 测试命令模板
|
| 35 |
-
echo "🧪 Test Commands:"
|
| 36 |
-
echo ""
|
| 37 |
-
|
| 38 |
-
echo "# 1. Nginx Health Check"
|
| 39 |
-
echo "curl -u admin:admin123 http://localhost:7860/health"
|
| 40 |
-
echo ""
|
| 41 |
-
|
| 42 |
-
echo "# 2. OpenCode Health Check (through proxy)"
|
| 43 |
-
echo "curl -u admin:admin123 http://localhost:7860/opencode/global/health"
|
| 44 |
-
echo ""
|
| 45 |
-
|
| 46 |
-
echo "# 3. API Documentation"
|
| 47 |
-
echo "curl -u admin:admin123 http://localhost:7860/opencode/doc"
|
| 48 |
-
echo ""
|
| 49 |
-
|
| 50 |
-
echo "# 4. Create AI Coding Session"
|
| 51 |
-
echo "curl -u admin:admin123 -X POST \\"
|
| 52 |
-
echo " -H 'Content-Type: application/json' \\"
|
| 53 |
-
echo " -d '{\"title\": \"AI Development Session\"}' \\"
|
| 54 |
-
echo " http://localhost:7860/opencode/session"
|
| 55 |
-
echo ""
|
| 56 |
-
|
| 57 |
-
echo "# 5. Send AI Request"
|
| 58 |
-
echo "# (Replace {session_id} with actual session ID from previous command)"
|
| 59 |
-
echo "curl -u admin:admin123 -X POST \\"
|
| 60 |
-
echo " -H 'Content-Type: application/json' \\"
|
| 61 |
-
echo " -d '{"
|
| 62 |
-
echo " \"parts\": ["
|
| 63 |
-
echo " {\"type\": \"text\", \"text\": \"Create a Python Flask web app with Hello World\"}"
|
| 64 |
-
echo " ]"
|
| 65 |
-
echo " }' \\"
|
| 66 |
-
echo " http://localhost:7860/opencode/session/{session_id}/message"
|
| 67 |
-
echo ""
|
| 68 |
-
|
| 69 |
-
echo "# 6. List Projects"
|
| 70 |
-
echo "curl -u admin:admin123 http://localhost:7860/opencode/project"
|
| 71 |
-
echo ""
|
| 72 |
-
|
| 73 |
-
echo "# 7. Check Providers"
|
| 74 |
-
echo "curl -u admin:admin123 http://localhost:7860/opencode/provider"
|
| 75 |
-
echo ""
|
| 76 |
-
|
| 77 |
-
echo "📊 Expected Responses:"
|
| 78 |
-
echo " • Nginx should return: OK"
|
| 79 |
-
echo " • OpenCode should return: {\"healthy\":true,\"version\":\"1.x.x\"}"
|
| 80 |
-
echo " • Auth failures should return: 401 Unauthorized"
|
| 81 |
-
echo " • API should return JSON responses"
|
| 82 |
-
echo ""
|
| 83 |
-
|
| 84 |
-
echo "🚀 Ready to deploy!"
|
| 85 |
-
echo "Run: docker build -t opencode-nginx . && docker run -p 7860:7860 opencode-nginx"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|