first commit
This commit is contained in:
commit
669f49b1d6
342 files changed
+320811
No files matched your search
@@ -0,0 +1,505 @@
|
||||
# Android Studio C 盘空间清理
|
||||
|
||||
> 适用系统:Windows 10/11,PowerShell。
|
||||
> 本文结合 2026-06-30 本机实测结果整理,重点服务 Android Studio、Gradle、Android SDK 占用排查和安全清理。
|
||||
|
||||
---
|
||||
|
||||
## 一、问题背景
|
||||
|
||||
Android Studio 开发环境会在 C 盘积累大量文件,常见来源包括:
|
||||
|
||||
| 现象 | 常见原因 | 影响 |
|
||||
|---|---|---|
|
||||
| C 盘空间不足 | Android SDK、Gradle 缓存、Android Studio 缓存持续增长 | 无法安装新软件或更新系统 |
|
||||
| 构建速度变慢 | 缓存损坏、旧版本依赖堆积 | 编译失败或反复下载依赖 |
|
||||
| IDE 启动变慢 | 索引、插件、日志、缓存过多 | Android Studio / VS Code 响应变慢 |
|
||||
| 模拟器占用大 | system-images、AVD 镜像、快照文件堆积 | C 盘快速膨胀 |
|
||||
|
||||
本机实测:
|
||||
|
||||
| 时间 | C 盘剩余空间 | 说明 |
|
||||
|---|---:|---|
|
||||
| 清理前 | `10.63 GB` | C 盘接近紧张 |
|
||||
| 第一批安全缓存清理后 | `15.40 GB` | 释放 `4.77 GB` |
|
||||
| 第二批 Gradle 缓存清理后 | `22.05 GB` | 追加释放 `6.65 GB` |
|
||||
|
||||
---
|
||||
|
||||
## 二、清理原则
|
||||
|
||||
### 2.1 先扫描,后清理
|
||||
|
||||
清理前必须先确认:
|
||||
|
||||
1. 当前 C 盘剩余空间。
|
||||
2. 哪些目录占用最高。
|
||||
3. 目标目录是否是缓存、临时文件或可重新下载的数据。
|
||||
4. 是否需要备份。
|
||||
5. 是否会影响当前 Android / Gradle 项目构建。
|
||||
|
||||
### 2.2 删除前确认备份
|
||||
|
||||
本地删除操作执行前必须明确询问:
|
||||
|
||||
```text
|
||||
是否先备份?
|
||||
```
|
||||
|
||||
如果用户明确回复“不备份”,再执行清理。
|
||||
如果目录可能包含账号数据、聊天记录、工程源码、SDK 必需组件,不应直接删除。
|
||||
|
||||
### 2.3 清理风险分级
|
||||
|
||||
| 等级 | 类型 | 示例 | 建议 |
|
||||
|---|---|---|---|
|
||||
| 低风险 | 临时文件、下载缓存、可再生安装包缓存 | `Temp`、`npm-cache`、VS Code 扩展安装包缓存 | 可直接清理 |
|
||||
| 中低风险 | 构建缓存 | `.gradle\caches`、`.gradle\daemon`、`.gradle\wrapper` | 可清理,但下次构建会重新下载 |
|
||||
| 中风险 | SDK 可选组件 | NDK、system-images、旧版 build-tools | 需要确认开发需求 |
|
||||
| 高风险 | 配置、账号、聊天、项目数据 | Tencent、kingsoft、Android Studio 配置、工程目录 | 不建议手动删除 |
|
||||
|
||||
---
|
||||
|
||||
## 三、常见占用目录
|
||||
|
||||
### 3.1 Android 开发相关目录
|
||||
|
||||
| 目录 | 变量表示 | 说明 | 本机实测 |
|
||||
|---|---|---|---:|
|
||||
| Android SDK | `%LOCALAPPDATA%\Android\Sdk` | SDK、平台、构建工具、模拟器镜像 | `7.72 GB` |
|
||||
| Android Studio 缓存 | `%LOCALAPPDATA%\Google\AndroidStudio2025.2.2` | IDE 索引、插件、缓存 | `4.92 GB` |
|
||||
| Gradle 缓存 | `%USERPROFILE%\.gradle` | Gradle 依赖、Wrapper、Daemon | 清理前约 `6.5 GB` |
|
||||
| Android Studio 程序 | `%ProgramFiles%\Android` | IDE 安装目录 | `3.09 GB` |
|
||||
| Android 配置 | `%USERPROFILE%\.android` | AVD 配置、adb key 等 | 本机较小 |
|
||||
|
||||
### 3.2 本机当前高占用目录
|
||||
|
||||
清理两批缓存后,C 盘主要占用如下:
|
||||
|
||||
| 路径 | 占用 | 判断 |
|
||||
|---|---:|---|
|
||||
| `C:\Users` | `52.19 GB` | 用户数据最大头 |
|
||||
| `C:\Program Files` | `22.38 GB` | 程序安装目录 |
|
||||
| `C:\Windows` | `22.06 GB` | 系统目录,不建议手动动 |
|
||||
| `C:\Program Files (x86)` | `5.22 GB` | 32 位程序 |
|
||||
| `C:\ProgramData` | `4.28 GB` | 程序公共数据 |
|
||||
|
||||
`Administrator\AppData` 仍是重点:
|
||||
|
||||
| 路径 | 占用 | 说明 |
|
||||
| ------------------------------ | --------: | ----------------------- |
|
||||
| `AppData\Local\Android` | `7.72 GB` | Android SDK |
|
||||
| `AppData\Local\Google` | `7.43 GB` | Chrome + Android Studio |
|
||||
| `AppData\Roaming\Tencent` | `3.05 GB` | 微信/企微/腾讯相关数据 |
|
||||
| `AppData\Local\Packages` | `2.28 GB` | Windows 应用数据 |
|
||||
| `AppData\Local\Microsoft` | `2.28 GB` | Edge、WinGet、系统应用缓存等 |
|
||||
| `AppData\Roaming\kingsoft` | `2.06 GB` | WPS 相关数据 |
|
||||
| `AppData\Roaming\TDAppDesktop` | `1.74 GB` | 腾讯文档 |
|
||||
|
||||
---
|
||||
|
||||
## 四、PowerShell 扫描命令
|
||||
|
||||
### 4.1 查看 C 盘总空间
|
||||
|
||||
```powershell
|
||||
Get-PSDrive -Name C |
|
||||
Select-Object `
|
||||
@{Name='UsedGB';Expression={[math]::Round($_.Used/1GB,2)}}, `
|
||||
@{Name='FreeGB';Expression={[math]::Round($_.Free/1GB,2)}}, `
|
||||
@{Name='TotalGB';Expression={[math]::Round(($_.Used+$_.Free)/1GB,2)}} |
|
||||
Format-List
|
||||
```
|
||||
|
||||
### 4.2 扫描 C 盘根目录占用
|
||||
|
||||
```powershell
|
||||
$rows = @()
|
||||
Get-ChildItem -LiteralPath 'C:\' -Force -ErrorAction SilentlyContinue |
|
||||
Where-Object { -not ($_.Attributes -band [IO.FileAttributes]::ReparsePoint) } |
|
||||
ForEach-Object {
|
||||
$sum = 0
|
||||
if ($_.PSIsContainer) {
|
||||
$sum = (Get-ChildItem -LiteralPath $_.FullName -Force -Recurse -File -ErrorAction SilentlyContinue |
|
||||
Measure-Object -Property Length -Sum).Sum
|
||||
} else {
|
||||
$sum = $_.Length
|
||||
}
|
||||
if ($null -eq $sum) { $sum = 0 }
|
||||
$rows += [PSCustomObject]@{
|
||||
Path = $_.FullName
|
||||
SizeGB = [math]::Round(($sum / 1GB), 2)
|
||||
}
|
||||
}
|
||||
|
||||
$rows | Sort-Object SizeGB -Descending | Select-Object -First 25 | Format-Table -AutoSize
|
||||
```
|
||||
|
||||
### 4.3 扫描 Android / Gradle 相关目录
|
||||
|
||||
```powershell
|
||||
$paths = @(
|
||||
"$env:LOCALAPPDATA\Android\Sdk",
|
||||
"$env:LOCALAPPDATA\Google\AndroidStudio2025.2.2",
|
||||
"$env:USERPROFILE\.gradle",
|
||||
"$env:USERPROFILE\.android",
|
||||
"$env:ProgramFiles\Android"
|
||||
)
|
||||
|
||||
$rows = @()
|
||||
foreach ($p in $paths) {
|
||||
if (Test-Path -LiteralPath $p) {
|
||||
$sum = (Get-ChildItem -LiteralPath $p -Force -Recurse -File -ErrorAction SilentlyContinue |
|
||||
Measure-Object -Property Length -Sum).Sum
|
||||
if ($null -eq $sum) { $sum = 0 }
|
||||
$rows += [PSCustomObject]@{
|
||||
Path = $p
|
||||
SizeGB = [math]::Round(($sum / 1GB), 2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$rows | Sort-Object SizeGB -Descending | Format-Table -AutoSize
|
||||
```
|
||||
|
||||
### 4.4 扫描 SDK 子目录
|
||||
|
||||
```powershell
|
||||
$sdk = "$env:LOCALAPPDATA\Android\Sdk"
|
||||
|
||||
Get-ChildItem -LiteralPath $sdk -Force -ErrorAction SilentlyContinue |
|
||||
Where-Object { $_.PSIsContainer } |
|
||||
ForEach-Object {
|
||||
$sum = (Get-ChildItem -LiteralPath $_.FullName -Force -Recurse -File -ErrorAction SilentlyContinue |
|
||||
Measure-Object -Property Length -Sum).Sum
|
||||
if ($null -eq $sum) { $sum = 0 }
|
||||
[PSCustomObject]@{
|
||||
Path = $_.FullName
|
||||
SizeGB = [math]::Round(($sum / 1GB), 2)
|
||||
}
|
||||
} |
|
||||
Sort-Object SizeGB -Descending |
|
||||
Format-Table -AutoSize
|
||||
```
|
||||
|
||||
### 4.5 扫描 Gradle 子目录
|
||||
|
||||
```powershell
|
||||
$gradle = "$env:USERPROFILE\.gradle"
|
||||
|
||||
Get-ChildItem -LiteralPath $gradle -Force -ErrorAction SilentlyContinue |
|
||||
ForEach-Object {
|
||||
$sum = 0
|
||||
if ($_.PSIsContainer) {
|
||||
$sum = (Get-ChildItem -LiteralPath $_.FullName -Force -Recurse -File -ErrorAction SilentlyContinue |
|
||||
Measure-Object -Property Length -Sum).Sum
|
||||
} else {
|
||||
$sum = $_.Length
|
||||
}
|
||||
if ($null -eq $sum) { $sum = 0 }
|
||||
[PSCustomObject]@{
|
||||
Path = $_.FullName
|
||||
SizeGB = [math]::Round(($sum / 1GB), 2)
|
||||
}
|
||||
} |
|
||||
Sort-Object SizeGB -Descending |
|
||||
Format-Table -AutoSize
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、安全清理清单
|
||||
|
||||
### 5.1 第一批:低风险缓存
|
||||
|
||||
本机已执行,实际释放 `4.77 GB`。
|
||||
|
||||
| 路径 | 清理前 | 清理后 | 风险 |
|
||||
|---|---:|---:|---|
|
||||
| `%LOCALAPPDATA%\Temp` | `1.40 GB` | `0.05 GB` | 低 |
|
||||
| `%APPDATA%\npm-cache` | `1.09 GB` | `0 GB` | 低 |
|
||||
| `%APPDATA%\Code\CachedExtensionVSIXs` | `1.12 GB` | `0 GB` | 低 |
|
||||
| `%LOCALAPPDATA%\tdappdesktop-updater` | `0.43 GB` | `0 GB` | 低 |
|
||||
| `%LOCALAPPDATA%\timetrack-ui-updater` | `0.29 GB` | `0 GB` | 低 |
|
||||
| `%LOCALAPPDATA%\obsidian-updater` | `0.28 GB` | `0 GB` | 低 |
|
||||
| `%LOCALAPPDATA%\@getpaseodesktop-updater` | `0.21 GB` | `0 GB` | 低 |
|
||||
|
||||
### 5.2 第二批:Gradle 缓存
|
||||
|
||||
本机已执行,实际释放 `6.65 GB`。
|
||||
|
||||
| 路径 | 清理前 | 清理后 | 风险 |
|
||||
|---|---:|---:|---|
|
||||
| `%USERPROFILE%\.gradle\caches` | `4.81 GB` | `0 GB` | 中低 |
|
||||
| `%USERPROFILE%\.gradle\daemon` | `0.30 GB` | `0 GB` | 低 |
|
||||
| `%USERPROFILE%\.gradle\wrapper` | `1.39 GB` | `0 GB` | 中低 |
|
||||
|
||||
影响:
|
||||
|
||||
- 下次 Android / Gradle 项目构建会重新下载 Gradle 发行包和依赖。
|
||||
- 第一次构建会明显变慢。
|
||||
- 依赖重新下载完成后恢复正常。
|
||||
|
||||
---
|
||||
|
||||
## 六、安全清理脚本
|
||||
|
||||
### 6.1 第一批低风险缓存
|
||||
|
||||
执行前请先确认:已决定不备份,且目标路径与清单一致。
|
||||
|
||||
```powershell
|
||||
$targets = @(
|
||||
"$env:LOCALAPPDATA\Temp",
|
||||
"$env:APPDATA\npm-cache",
|
||||
"$env:APPDATA\Code\CachedExtensionVSIXs",
|
||||
"$env:LOCALAPPDATA\tdappdesktop-updater",
|
||||
"$env:LOCALAPPDATA\timetrack-ui-updater",
|
||||
"$env:LOCALAPPDATA\obsidian-updater",
|
||||
"$env:LOCALAPPDATA\@getpaseodesktop-updater"
|
||||
)
|
||||
|
||||
foreach ($target in $targets) {
|
||||
if (-not (Test-Path -LiteralPath $target)) { continue }
|
||||
$resolved = (Resolve-Path -LiteralPath $target -ErrorAction Stop).ProviderPath.TrimEnd('\')
|
||||
$expected = $target.TrimEnd('\')
|
||||
if ($resolved -ne $expected) {
|
||||
throw "Refusing to clean unexpected path: $resolved"
|
||||
}
|
||||
|
||||
Get-ChildItem -LiteralPath $resolved -Force -ErrorAction SilentlyContinue |
|
||||
ForEach-Object {
|
||||
Remove-Item -LiteralPath $_.FullName -Recurse -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 6.2 第二批 Gradle 缓存
|
||||
|
||||
```powershell
|
||||
$targets = @(
|
||||
"$env:USERPROFILE\.gradle\caches",
|
||||
"$env:USERPROFILE\.gradle\daemon",
|
||||
"$env:USERPROFILE\.gradle\wrapper"
|
||||
)
|
||||
|
||||
foreach ($target in $targets) {
|
||||
if (-not (Test-Path -LiteralPath $target)) { continue }
|
||||
$resolved = (Resolve-Path -LiteralPath $target -ErrorAction Stop).ProviderPath.TrimEnd('\')
|
||||
$expected = $target.TrimEnd('\')
|
||||
if ($resolved -ne $expected) {
|
||||
throw "Refusing to clean unexpected path: $resolved"
|
||||
}
|
||||
|
||||
Get-ChildItem -LiteralPath $resolved -Force -ErrorAction SilentlyContinue |
|
||||
ForEach-Object {
|
||||
Remove-Item -LiteralPath $_.FullName -Recurse -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 6.3 清理后复查
|
||||
|
||||
```powershell
|
||||
Get-PSDrive -Name C |
|
||||
Select-Object `
|
||||
@{Name='UsedGB';Expression={[math]::Round($_.Used/1GB,2)}}, `
|
||||
@{Name='FreeGB';Expression={[math]::Round($_.Free/1GB,2)}}, `
|
||||
@{Name='TotalGB';Expression={[math]::Round(($_.Used+$_.Free)/1GB,2)}} |
|
||||
Format-List
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 七、Android SDK 按需清理
|
||||
|
||||
Android SDK 不建议直接整目录删除,应优先通过 Android Studio 的 SDK Manager 管理。
|
||||
|
||||
菜单路径:
|
||||
|
||||
```text
|
||||
Tools -> SDK Manager
|
||||
```
|
||||
|
||||
### 7.1 可按需删除的 SDK 组件
|
||||
|
||||
| 组件 | 路径 | 是否可删 | 判断标准 |
|
||||
|---|---|---|---|
|
||||
| NDK | `%LOCALAPPDATA%\Android\Sdk\ndk` | 按需 | 不做 JNI/C/C++/Rust/Flutter Native 时可删 |
|
||||
| system-images | `%LOCALAPPDATA%\Android\Sdk\system-images` | 按需 | 只用真机调试时可删 |
|
||||
| 旧版 platforms | `%LOCALAPPDATA%\Android\Sdk\platforms` | 按需 | 不维护旧 Android 版本时可删 |
|
||||
| 旧版 build-tools | `%LOCALAPPDATA%\Android\Sdk\build-tools` | 按需 | 项目未指定旧版本时可删 |
|
||||
| sources | `%LOCALAPPDATA%\Android\Sdk\sources` | 可选 | 不需要查看源码时可删 |
|
||||
|
||||
### 7.2 不建议手动删除的 SDK 组件
|
||||
|
||||
| 组件 | 原因 |
|
||||
|---|---|
|
||||
| `platform-tools` | 包含 `adb`,真机调试必需 |
|
||||
| 当前项目使用的 `platforms` | 编译目标依赖 |
|
||||
| 当前项目使用的 `build-tools` | 构建依赖 |
|
||||
| 当前项目使用的 NDK 版本 | Native 编译依赖 |
|
||||
|
||||
### 7.3 SDK Manager 清理步骤
|
||||
|
||||
1. 打开 Android Studio。
|
||||
2. 进入 `Tools -> SDK Manager`。
|
||||
3. 在 `SDK Platforms` 中取消不需要的旧 Android 版本。
|
||||
4. 在 `SDK Tools` 中勾选 `Show Package Details`。
|
||||
5. 取消不需要的旧版 Build Tools、NDK、Command-line Tools。
|
||||
6. 点击 `Apply`,由 Android Studio 执行卸载。
|
||||
|
||||
---
|
||||
|
||||
## 八、Android Studio 缓存处理
|
||||
|
||||
### 8.1 IDE 缓存目录
|
||||
|
||||
本机 Android Studio 缓存目录:
|
||||
|
||||
```text
|
||||
%LOCALAPPDATA%\Google\AndroidStudio2025.2.2
|
||||
```
|
||||
|
||||
实测占用约 `4.92 GB`。
|
||||
|
||||
不建议直接删除整个目录,因为它可能包含:
|
||||
|
||||
- IDE 索引缓存
|
||||
- 插件缓存
|
||||
- 本地历史
|
||||
- 项目打开记录
|
||||
- 配置状态
|
||||
|
||||
### 8.2 推荐操作
|
||||
|
||||
优先使用 Android Studio 内置功能:
|
||||
|
||||
```text
|
||||
File -> Invalidate Caches...
|
||||
```
|
||||
|
||||
适用场景:
|
||||
|
||||
- 索引异常。
|
||||
- IDE 明显卡顿。
|
||||
- 频繁出现缓存相关构建问题。
|
||||
|
||||
影响:
|
||||
|
||||
- Android Studio 会重建索引。
|
||||
- 首次重新打开项目会慢。
|
||||
- 比手动删除整个目录安全。
|
||||
|
||||
---
|
||||
|
||||
## 九、不建议直接清理的目录
|
||||
|
||||
| 路径 | 原因 |
|
||||
|---|---|
|
||||
| `%LOCALAPPDATA%\Android\Sdk` 整目录 | 会破坏 Android 开发环境 |
|
||||
| `%LOCALAPPDATA%\Google\AndroidStudio*` 整目录 | 可能丢配置和索引状态 |
|
||||
| `%APPDATA%\Tencent` | 可能包含微信/企微聊天和账号数据 |
|
||||
| `%APPDATA%\kingsoft` | 可能包含 WPS 文档、账号、模板数据 |
|
||||
| `%APPDATA%\TDAppDesktop` | 可能包含腾讯文档本地数据 |
|
||||
| `%ProgramFiles%\WindowsApps` | Windows 应用系统目录 |
|
||||
| `C:\Windows\WinSxS` | 系统组件存储,本机 DISM 显示不推荐清理 |
|
||||
| `C:\Program Files\Android` | Android Studio 程序目录,清理应通过卸载器 |
|
||||
|
||||
---
|
||||
|
||||
## 十、清理决策流程
|
||||
|
||||
```text
|
||||
1. 先扫描 C 盘空间
|
||||
|
|
||||
v
|
||||
2. 找到占用最高目录
|
||||
|
|
||||
v
|
||||
3. 判断目录类型
|
||||
|-- 临时文件 / 缓存 / 安装残留 -> 可列入低风险清理
|
||||
|-- Gradle 缓存 -> 可清理,但提醒下次构建会变慢
|
||||
|-- SDK 可选组件 -> 询问是否需要 Native / 模拟器 / 旧版本
|
||||
|-- 聊天、账号、配置、工程源码 -> 不直接清理
|
||||
|
|
||||
v
|
||||
4. 删除前确认是否备份
|
||||
|
|
||||
v
|
||||
5. 精确校验目标路径后执行清理
|
||||
|
|
||||
v
|
||||
6. 复查 C 盘剩余空间和目标目录残留
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十一、常见问题 FAQ
|
||||
|
||||
### Q1:清理 Gradle 后项目无法立即编译?
|
||||
|
||||
原因:依赖和 Gradle Wrapper 被清理,需要重新下载。
|
||||
|
||||
处理:
|
||||
|
||||
```powershell
|
||||
cd <项目目录>
|
||||
.\gradlew.bat build
|
||||
```
|
||||
|
||||
如果下载慢,检查代理、Gradle 镜像源和网络。
|
||||
|
||||
### Q2:清理后模拟器无法启动?
|
||||
|
||||
原因:可能删除了 system-images 或 AVD 镜像。
|
||||
|
||||
处理:
|
||||
|
||||
```text
|
||||
Tools -> SDK Manager -> SDK Platforms / SDK Tools
|
||||
```
|
||||
|
||||
重新安装对应系统镜像。
|
||||
|
||||
### Q3:Native 项目编译失败?
|
||||
|
||||
原因:NDK 被删除或版本不匹配。
|
||||
|
||||
处理:
|
||||
|
||||
1. 查看项目 `local.properties`、`build.gradle` 或 `gradle.properties` 中指定的 NDK 版本。
|
||||
2. 通过 SDK Manager 重新安装对应 NDK。
|
||||
|
||||
### Q4:能不能直接删除整个 Android SDK?
|
||||
|
||||
不建议。除非确定不再做 Android 开发,或者准备完整重装 Android Studio 和 SDK。
|
||||
|
||||
### Q5:能不能清理 `WindowsApps` 或 `WinSxS`?
|
||||
|
||||
不建议手动清理。
|
||||
|
||||
- `WindowsApps` 是 Microsoft Store / Windows 应用目录。
|
||||
- `WinSxS` 是系统组件存储,应通过系统工具或 DISM 判断。
|
||||
- 本机 DISM 结果显示:`推荐使用组件存储清理:否`。
|
||||
|
||||
---
|
||||
|
||||
## 十二、下一步建议
|
||||
|
||||
当前本机已清理低风险缓存和 Gradle 缓存,C 盘剩余空间从 `10.63 GB` 提升到 `22.05 GB`。
|
||||
|
||||
后续如果还要继续释放空间,建议顺序:
|
||||
|
||||
1. 用 SDK Manager 检查 Android SDK 是否存在不用的旧版平台、Build Tools、NDK、system-images。
|
||||
2. 检查是否仍需要本机所有 Android Studio / Java / WSL / 360 / 腾讯文档程序。
|
||||
3. 对 Tencent、kingsoft、TDAppDesktop 只做软件内清理,不直接删目录。
|
||||
4. 对 Android Studio 执行 `Invalidate Caches`,不要手动删除整个配置目录。
|
||||
|
||||
---
|
||||
|
||||
## 十三、关联记录
|
||||
|
||||
- 本次实际清理:低风险缓存释放 `4.77 GB`,Gradle 缓存释放 `6.65 GB`。
|
||||
- 当前 C 盘:总计 `118.24 GB`,剩余 `22.05 GB`。
|
||||
- 整理依据:本机 PowerShell 扫描结果、Windows 删除安全确认流程、Android Studio / Gradle 常见缓存机制。
|
||||
@@ -0,0 +1,134 @@
|
||||
# CPA(CLIProxyAPI)部署全流程
|
||||
|
||||
把 Google AI Pro 订阅转成 API,给 Codex / Claude Code 用。
|
||||
实测时间:2026-11-05,VPS:腾讯云新加坡 Ubuntu 24.04(43.156.118.130)。
|
||||
|
||||
最终链路:
|
||||
- 直连:Codex → `localhost:8317`(SSH 隧道)→ CPA → Google
|
||||
- 经 NewAPI:Codex → `https://api.trivoo.website` → NewAPI → CPA → Google
|
||||
|
||||
---
|
||||
|
||||
## 一、前置条件
|
||||
|
||||
1. VPS 上已有 Docker、NewAPI(`new-api` 容器在跑)
|
||||
2. Google AI Pro 订阅有效
|
||||
3. 本地有 `deploy-cpa.sh` 和 `tunnel.bat`(放同一目录,如 `F:\AI\docker\cpa-deploy\`)
|
||||
|
||||
---
|
||||
|
||||
## 二、部署 CPA
|
||||
|
||||
### 1. 开隧道
|
||||
双击 `tunnel.bat`,输入 VPS 的 ubuntu 用户密码(输入时不显示字符,输完回车)。
|
||||
**"没反应"是正常的**——隧道建好就是静默挂着。窗口保持开着。
|
||||
|
||||
### 2. 跑部署脚本
|
||||
新开 PowerShell:
|
||||
```powershell
|
||||
(Get-Content F:\AI\docker\cpa-deploy\deploy-cpa.sh) -join "`n" | ssh ubuntu@43.156.118.130 "sudo bash -s"
|
||||
```
|
||||
|
||||
### 3. 检查输出
|
||||
- `cli-proxy-api | Up`,6 个端口全绑 `127.0.0.1`(8317/8085/1455/54545/51121/11451)
|
||||
- 无 key → HTTP 401,有 key → HTTP 200
|
||||
- 输出两把钥匙,收好(也在服务器 `/opt/cpa/KEYS.txt`):
|
||||
- `MGMT_KEY`:进管理面板用
|
||||
- `CPA_API_KEY`(`sk-cpa-` 开头):给 NewAPI 渠道 / 直连用
|
||||
|
||||
---
|
||||
|
||||
## 三、面板登录排障(必看,有坑)
|
||||
|
||||
浏览器开 `http://localhost:8317/management.html`(隧道必须开着),输 MGMT_KEY。
|
||||
|
||||
### 坑 1:403 "remote management disabled"
|
||||
原因是部署脚本生成的 `config.yaml` 里 `management.allow-remote: false` 把管理 API 整个关了。
|
||||
修复(SSH 到服务器,root):
|
||||
```bash
|
||||
sed -i 's/allow-remote: false/allow-remote: true/' /opt/cpa/config.yaml
|
||||
cd /opt/cpa && docker compose restart
|
||||
```
|
||||
**安全性**:端口本来就只绑了 `127.0.0.1`(`docker ps` 可验证),公网连不进来,改成 `true` 也只有隧道能进。
|
||||
|
||||
### 坑 2:别用 `grep -v 'key'` 看配置
|
||||
配置里的 `secret-key` 存的是 bcrypt 哈希,`grep -v 'key'` 会把它过滤掉,让你误以为没配。看完整配置直接 `cat`。
|
||||
|
||||
### 坑 3:不要手动往配置里加明文 secret-key
|
||||
CPA 启动时会自动把明文哈希后写回,手动加会导致 `mapping key "secret-key" already defined` 重复键,容器起不来(restart 循环)。
|
||||
|
||||
---
|
||||
|
||||
## 四、OAuth 登录(Antigravity)
|
||||
|
||||
1. 面板左侧 **OAuth 登录**
|
||||
2. 找到 **Antigravity**,点 `+`,弹窗里点 **打开链接**
|
||||
3. Google 授权页选 Pro 账号 → 允许
|
||||
4. 跳回 `localhost:1455` 显示 **Authentication successful!** 即成功
|
||||
5. 面板 **认证文件** 页能看到 Antigravity 凭证
|
||||
|
||||
---
|
||||
|
||||
## 五、Codex 直连 CPA(同事的野路子,最快)
|
||||
|
||||
ccswitch → Codex 供应商 → 新建:
|
||||
- 名称:`cpa.gemini`
|
||||
- API 请求地址:`http://localhost:8317/v1`
|
||||
- API Key:`CPA_API_KEY`
|
||||
- 模型列表:点"获取模型列表",选 `gemini-3-flash` / `gemini-3.8-flash-high` 等真名
|
||||
|
||||
**前提**:tunnel.bat 一直开着。
|
||||
|
||||
### 排障
|
||||
- Codex 报 `404 (no body)`:模型名不对。浏览器开 `http://localhost:8317/v1/models`,返回 `{"error":"Missing API key"}` 说明端点正常,只是缺 key;然后去 ccswitch 里重新拉模型列表。
|
||||
- `429 Too Many Requests`:Google 限流,等几分钟再试,别连续刷。
|
||||
|
||||
---
|
||||
|
||||
## 六、走 NewAPI(公网,不用开隧道)
|
||||
|
||||
### 1. NewAPI 建渠道
|
||||
渠道 → 添加渠道 → 选 **OpenAI** 类型(Codex 说 OpenAI 协议):
|
||||
- 名称:`CPA-Gemini-OpenAI`
|
||||
- API 地址:`http://cli-proxy-api:8317`(**不要加 `/v1`**,页面有提示)
|
||||
- API 密钥:`CPA_API_KEY`
|
||||
- 模型:**从上游获取**,会拉到 8 个(2 个 Claude + 5 个 Gemini 真名 + 1 个 OpenAI),勾选 5 个 Gemini
|
||||
- 分组 `default`,启用,创建 → 测试
|
||||
|
||||
> 注意:Anthropic 类型的渠道拉到的是混淆过的 Claude 壳名字(`claude-fable-5-dd-...`),OpenAI 类型拉到的是 Gemini 真名。给 Codex 用选 OpenAI 类型。
|
||||
|
||||
### 2. ccswitch 加供应商
|
||||
- 名称:`newapi-gemini`
|
||||
- API 请求地址:`https://api.trivoo.website/v1`
|
||||
- API Key:你的 NewAPI token(`sk-` 开头,之前配 DeepSeek 用的那个)
|
||||
- 模型:获取列表,选 gemini 模型
|
||||
|
||||
### 3. 验证
|
||||
NewAPI → 使用日志,能看到成功的调用记录(模型、Token、耗时)即跑通。
|
||||
|
||||
---
|
||||
|
||||
## 七、两条路怎么选
|
||||
|
||||
| | 直连 CPA | 经 NewAPI |
|
||||
|---|---|---|
|
||||
| 地址 | `localhost:8317/v1` | `api.trivoo.website/v1` |
|
||||
| 隧道 | 必须一直开 | 不用 |
|
||||
| 延迟 | 少一跳 | 多一跳 |
|
||||
| 管理 | 无 | NewAPI 统一看日志/计费 |
|
||||
|
||||
不冲突,可并存,ccswitch 里切换供应商就行。
|
||||
|
||||
---
|
||||
|
||||
## 八、跟 Claude Code 的关系
|
||||
|
||||
本流程是给 **Codex** 用的(OpenAI 协议)。如果也要给 Claude Code 用:
|
||||
- NewAPI 里再建一个 **Anthropic** 类型渠道,API 地址 `http://cli-proxy-api:8317`(不加 `/v1`),模型从上游拉(会是 Claude 壳名字,全选)
|
||||
- ccswitch 里 Claude Code 供应商指向 `https://api.trivoo.website`
|
||||
|
||||
---
|
||||
|
||||
## 九、一句话总结
|
||||
|
||||
部署(隧道+脚本)→ 面板 `allow-remote: true` → OAuth 登录 Antigravity → Codex 直连 `localhost:8317/v1` 或经 NewAPI(OpenAI 类型渠道)。429 等几分钟,404 检查模型名。
|
||||
@@ -0,0 +1,101 @@
|
||||
|
||||
当使用 `git clone` 遇到 `Permission denied` 或一直提示输入密码时,通常是因为本地没有配置 SSH 密钥。请按以下步骤操作:
|
||||
|
||||
## 1. 检查并生成 SSH 密钥
|
||||
|
||||
### 检查现有密钥
|
||||
|
||||
```bash
|
||||
ls -al ~/.ssh
|
||||
```
|
||||
|
||||
查看是否有 `id_ed25519` 或 `id_rsa` 等文件。
|
||||
|
||||
### 生成新密钥
|
||||
|
||||
```bash
|
||||
ssh-keygen -t ed25519 -C "your_email@example.com"
|
||||
```
|
||||
|
||||
**注意:**
|
||||
|
||||
- 执行后全程按回车键即可
|
||||
- 不要随意输入其他字符作为文件名
|
||||
- 如果使用自定义用户目录,路径会是 `/personal/你的用户名/.ssh/id_ed25519`
|
||||
|
||||
## 2. 获取公钥内容
|
||||
|
||||
```bash
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
```
|
||||
|
||||
**关键步骤:**
|
||||
|
||||
- 打印出以 `ssh-ed25519` 开头的公钥内容
|
||||
- 完整复制整行内容(包括开头和结尾)
|
||||
- 如果路径不同,请使用实际路径
|
||||
|
||||
## 3. 添加公钥到远程 Git 服务器
|
||||
|
||||
### 操作步骤:
|
||||
|
||||
1. 登录公司的 Git 平台(如 GitLab、Gitea 等)
|
||||
2. 进入个人设置 -> **SSH Keys (SSH 公钥)**
|
||||
3. 将第2步复制的整行内容粘贴进去
|
||||
4. 保存设置
|
||||
|
||||
## 4. 启动代理并加载私钥
|
||||
|
||||
```bash
|
||||
eval "$(ssh-agent -s)"
|
||||
ssh-add ~/.ssh/id_ed25519
|
||||
```
|
||||
|
||||
**注意事项:**
|
||||
|
||||
- 如果使用自定义路径,需要指定完整绝对路径
|
||||
- 例如:`/personal/donghongzhi/.ssh/id_ed25519`
|
||||
- 如果遇到代理连接问题,先执行 `eval "$(ssh-agent -s)"`
|
||||
|
||||
## 5. 测试与克隆
|
||||
|
||||
### 测试连接(可选)
|
||||
|
||||
```bash
|
||||
ssh -T git@<公司Git服务器IP>
|
||||
```
|
||||
|
||||
### 正常拉取代码
|
||||
|
||||
```bash
|
||||
git clone git@<公司Git服务器IP>:<项目路径>.git
|
||||
```
|
||||
|
||||
## 常见问题处理
|
||||
|
||||
### 问题1:代理连接失败
|
||||
|
||||
**错误信息:** `Could not open a connection to your authentication agent`
|
||||
|
||||
**解决方案:**
|
||||
|
||||
```bash
|
||||
eval "$(ssh-agent -s)"
|
||||
```
|
||||
|
||||
### 问题2:权限被拒绝
|
||||
|
||||
**错误信息:** `Permission denied (publickey)`
|
||||
|
||||
**排查步骤:**
|
||||
|
||||
1. 确认公钥已正确添加到Git服务器
|
||||
2. 检查私钥是否已加载:`ssh-add -l`
|
||||
3. 验证SSH配置:`ssh -v git@<服务器IP>`
|
||||
|
||||
## 小贴士
|
||||
|
||||
- **换电脑/重装系统时:** 只需重新走一遍这套流程
|
||||
- **密钥管理:** 建议为不同设备生成不同的密钥对
|
||||
- **安全性:** 私钥文件请妥善保管,不要泄露
|
||||
- **路径问题:** 注意检查实际的用户目录路径
|
||||
@@ -0,0 +1,64 @@
|
||||
# 会话记录总结:大模型 API 中转与 Docker 部署指南
|
||||
|
||||
本文件记录了关于开源大模型 API 网关(`new-api`)、相关生态工具、Docker 部署环境选择以及如何在 Linux 上进行操作的完整对话过程。
|
||||
|
||||
---
|
||||
|
||||
## 1. 核心仓库分析:New API 与 Sub2API 的区别
|
||||
- **QuantumNous/new-api (New API)**:
|
||||
- **定位**:专业、通用的企业级/团队级自托管 AI API 网关。
|
||||
- **核心**:基于官方 API Key 进行路由分发、负载均衡、高可用及精细化计费/额度管理。几乎无封号风险。
|
||||
- **Wei-Shaw/sub2api (Sub2API)**:
|
||||
- **定位**:主打订阅池化(拼车共享)的一站式 AI API 中转服务。
|
||||
- **核心**:将网页端包月账号(如 ChatGPT Plus、Claude Pro)通过协议逆向转为标准 API 共享使用。极易触发风控封号。
|
||||
|
||||
---
|
||||
|
||||
## 2. 边缘工具生态链(5个开源仓库分析)
|
||||
- **`farion1231/cc-switch`**:跨平台的桌面端 API 调度与外壳管理工具,用于一键切换命令行工具的 API 供应商及 MCP 插件。
|
||||
- **`totec448-spec/chat-on-steroids`**:将网页版 ChatGPT 结合浏览器扩展与本地 MCP 协议,赋予其读写本地代码和执行终端命令能力的本地编程助手。
|
||||
- **`fb0sh/MCPod`**:用于打包、运行和管理本地 MCP Server 的容器化或后端轻量环境。
|
||||
- **`router-for-me/CLIProxyAPI`**:底层的协议转译与中转核心,将各大厂命令行工具或免费测试通道包装为标准的 OpenAI/Claude API。
|
||||
- **`linguo2625469/workbuddy2api-panel`**:腾讯 CodeBuddy 的逆向网关与自动化任务管理面板(内置自动做任务脚本,现已停更)。
|
||||
|
||||
---
|
||||
|
||||
## 3. 部署环境与操作系统选择
|
||||
- **系统核心原则**:Docker 的核心技术强依赖 Linux 内核。
|
||||
- **服务器系统建议**:
|
||||
- **强烈反对**:在旧版 Windows Server 2012 上强行部署。
|
||||
- **强烈推荐**:**Ubuntu 24.04 LTS** 或 Debian 12。如果购买的是 Windows 系统服务器,可在腾讯云后台免费一键重装为 Linux。
|
||||
- **硬件替代方案**:使用同事的 **Mac mini** 运行 Docker Desktop 也是极佳且稳定的本地服务器选择。
|
||||
|
||||
---
|
||||
|
||||
## 4. New API 服务器端部署全流程(Linux + Docker)
|
||||
|
||||
1. **配置域名解析**:
|
||||
- 在域名注册商处添加 A 记录,将子域名(例如 `api.trivoo.online`)解析至服务器公网 IP。
|
||||
2. **安装 Docker 基础环境**:
|
||||
```bash
|
||||
curl -fsSL https://get.docker.com | bash
|
||||
sudo systemctl enable --now docker
|
||||
```
|
||||
3. **拉取代码并配置密钥**:
|
||||
```bash
|
||||
git clone https://github.com/QuantumNous/new-api.git
|
||||
cd new-api
|
||||
openssl rand -hex 32
|
||||
```
|
||||
修改 `docker-compose.yml`,设置 `SESSION_SECRET`、HTTPS 信任域名及数据库/Redis 密码。
|
||||
4. **启动后台容器**:
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
5. **配置 Nginx 与 HTTPS**:
|
||||
- 安装 Nginx 和 Certbot,配置反向代理将流量转发至 `http://127.0.0.1:3000` 并签发 SSL 证书。
|
||||
6. **后台初始化与调用**:
|
||||
- 访问域名创建管理员账号,添加上链渠道(官方 API Key),生成分发令牌即可在客户端调用。
|
||||
|
||||
---
|
||||
|
||||
## 5. 远程访问与 Linux 运维互动
|
||||
- **访问方式**:Linux 服务器通常通过命令行操作。初学者可直接使用腾讯云后台自带的 **Workbench(网页终端)**,无需在本地下载复杂软件。
|
||||
- **AI 运维模式**:用户只需负责打开终端,将报错或需求交由 AI,“复制粘贴”AI 提供的标准命令,即可轻松实现无痛部署。
|
||||
@@ -0,0 +1,320 @@
|
||||
# New API 专属大模型网关搭建与 HTTPS 上线全流程实战指南
|
||||
|
||||
> **实战环境记录**
|
||||
> - **云服务器**:腾讯云新加坡轻量应用服务器(Ubuntu 24.04 LTS,2核 2G 内存,公网 IP:`43.156.118.130`)
|
||||
> - **共存服务**:Xray Shadowsocks 代理服务(端口 `8388`,全程独立运行,互不干扰)
|
||||
> - **域名提供商**:Spaceship(根域名:`trivoo.website`,网关二级子域名:`api.trivoo.website`)
|
||||
> - **网关核心**:New API(官方镜像 `calciumion/new-api:latest`,Docker 容器化 + 内置 SQLite 持久化)
|
||||
> - **反代与加密**:Nginx 反向代理 + Let's Encrypt 权威 SSL 证书(Certbot 自动化定时续期)
|
||||
|
||||
---
|
||||
|
||||
## 目录
|
||||
- [一、全局架构与准备工作](#一全局架构与准备工作)
|
||||
- [二、第一阶段:域名注册与 DNS 解析配置](#二第一阶段域名注册与-dns-解析配置)
|
||||
- [三、第二阶段:云服务器防火墙安全配置](#三第二阶段云服务器防火墙安全配置)
|
||||
- [四、第三阶段:New API 容器化部署](#四第三阶段new-api-容器化部署)
|
||||
- [五、第四阶段:Nginx 反向代理与 SSL 证书自动化](#五第四阶段nginx-反向代理与-ssl-证书自动化)
|
||||
- [六、第五阶段:New API 初始化与渠道配置](#六第五阶段new-api-初始化与渠道配置)
|
||||
- [七、第六阶段:客户端接入与高频踩坑排错手册](#七第六阶段客户端接入与高频踩坑排错手册)
|
||||
- [八、第七阶段:日常运维、安全加固与一键清理](#八第七阶段日常运维安全加固与一键清理)
|
||||
|
||||
---
|
||||
|
||||
## 一、全局架构与准备工作
|
||||
|
||||
本方案采用**“单容器 SQLite + Nginx 本地反代 + Certbot 自动化证书”**的生产级架构:
|
||||
|
||||
```
|
||||
[ 客户端 (Cline / Cherry Studio / 代码) ]
|
||||
│ HTTPS (端口 443)
|
||||
▼
|
||||
[ Nginx 反向代理 (api.trivoo.website) ] ── (自动申请/更新 Let's Encrypt 证书)
|
||||
│ HTTP (仅监听 127.0.0.1:3000,外部无法直连)
|
||||
▼
|
||||
[ New API 容器 (calciumion/new-api:latest) ]
|
||||
│
|
||||
┌─────────┴─────────┐
|
||||
▼ ▼
|
||||
[ 官方 DeepSeek API ] [ 自定义第三方聚合上游 ]
|
||||
```
|
||||
|
||||
### 核心设计优势:
|
||||
1. **轻量省资源**:相比 PostgreSQL + Redis 的重型部署,内置 SQLite 单容器仅占几十兆内存,完美兼容 2G 内存低配服务器,与已有代理服务(如 Xray)和谐共存。
|
||||
2. **端口安全性**:New API 容器端口严格绑定在 `127.0.0.1:3000`,外部网络无法绕过 HTTPS 直接访问,防止明文直连与未授权嗅探。
|
||||
3. **流式传输优化**:Nginx 明确关闭 `proxy_buffering`,保障大模型打字机流式输出(SSE)流畅无卡顿。
|
||||
|
||||
---
|
||||
|
||||
## 二、第一阶段:域名注册与 DNS 解析配置
|
||||
|
||||
### 1. 域名选购(以 Spaceship 为例)
|
||||
1. 访问 [Spaceship 官网](https://www.spaceship.com/) 并注册/登录账号;
|
||||
2. 搜索低成本优质后缀(如 `.website`、`.top`、`.xyz` 等,首年特价通常仅约 6~10 元人民币);
|
||||
3. 选定域名(本次实战选定 `trivoo.website`,首年仅 7.88 元含 ICANN 认证工本费);
|
||||
4. 通过绑定的 **支付宝(Alipay)** 扫码付款完成购买。
|
||||
5. **重要防扣费设置**:购买完成后,在域名列表的 `Auto-renew` 列将开关拨至 **Off**,避免次年按原价自动续费。
|
||||
|
||||
### 2. 添加 DNS A 记录解析
|
||||
1. 在 Spaceship 控制台点击域名右侧的 **Advanced DNS ↗**;
|
||||
2. 点击 **Add Record**(或点击下方小圆圈 `A`):
|
||||
- **Type**:`A`
|
||||
- **Host**:`api`(即二级子域名,完整网址为 `api.trivoo.website`)
|
||||
- **Value / Target IP**:`43.156.118.130`(你的云服务器公网 IP)
|
||||
- **TTL**:保持默认或选择 `30 min` / `1 min`
|
||||
3. 点击 **Add / Save** 保存,等待右侧出现绿色的 `ADDED` 提示。
|
||||
|
||||
---
|
||||
|
||||
## 三、第二阶段:云服务器防火墙安全配置
|
||||
|
||||
登录 [腾讯云轻量服务器控制台](https://console.cloud.tencent.com/lighthouse) -> 点击目标实例 -> **防火墙**,确保以下规则已放行:
|
||||
|
||||
| 应用类型 | 协议 | 端口 | 策略 | 作用说明 |
|
||||
| :--- | :--- | :--- | :--- | :--- |
|
||||
| Linux 登录 | TCP | 22 | 允许 | SSH 远程登录维护 |
|
||||
| HTTP | TCP | 80 | 允许 | Certbot 申请 SSL 证书及 HTTP-01 验证 |
|
||||
| HTTPS | TCP | 443 | 允许 | 安全加密 Web 访问及客户端 API 调用 |
|
||||
| 自定义 | TCP | 8388 | 允许 | 已有的 Xray / Shadowsocks 梯子服务 |
|
||||
|
||||
> **安全注意**:不要在公网防火墙中开放 `3000` 端口。生产环境下 3000 端口只走服务器内部回环转发,所有外网流量统一由 443 端口接入。
|
||||
|
||||
---
|
||||
|
||||
## 四、第三阶段:New API 容器化部署
|
||||
|
||||
### 1. 登录服务器并切换 root 权限
|
||||
在本地终端执行:
|
||||
```bash
|
||||
ssh ubuntu@43.156.118.130
|
||||
sudo -i
|
||||
```
|
||||
*(必须通过 `sudo -i` 确保提示符为 `root@...:~#`,避免因普通权限导致 Permission Denied)*
|
||||
|
||||
### 2. 初始化目录并生成专属随机密钥
|
||||
```bash
|
||||
# 创建持久化数据与日志目录
|
||||
mkdir -p /opt/new-api/data /opt/new-api/logs
|
||||
cd /opt/new-api
|
||||
|
||||
# 生成 64 位密码级随机安全会话密钥
|
||||
echo "SESSION_SECRET=$(openssl rand -hex 32)" > .env
|
||||
chmod 600 .env
|
||||
```
|
||||
|
||||
### 3. 编写安全生产型 docker-compose.yml
|
||||
```bash
|
||||
cat > /opt/new-api/docker-compose.yml <<'EOF'
|
||||
services:
|
||||
new-api:
|
||||
image: calciumion/new-api:latest
|
||||
container_name: new-api
|
||||
restart: unless-stopped
|
||||
command: --log-dir /app/logs
|
||||
|
||||
# 严格绑定回环地址,禁止公网直连 3000
|
||||
ports:
|
||||
- "127.0.0.1:3000:3000"
|
||||
|
||||
volumes:
|
||||
- ./data:/data
|
||||
- ./logs:/app/logs
|
||||
|
||||
environment:
|
||||
- TZ=Asia/Shanghai
|
||||
- ERROR_LOG_ENABLED=true
|
||||
- BATCH_UPDATE_ENABLED=true
|
||||
- NODE_NAME=new-api-sg-1
|
||||
- STREAMING_TIMEOUT=300
|
||||
- "SESSION_SECRET=${SESSION_SECRET:?未设置 SESSION_SECRET,请检查 .env}"
|
||||
- SESSION_COOKIE_SECURE=true
|
||||
- SESSION_COOKIE_TRUSTED_URL=https://api.trivoo.website
|
||||
- TRUSTED_PROXIES=127.0.0.1,172.17.0.0/16
|
||||
|
||||
# 内存保护上限(防止高并发下拖垮同机代理服务)
|
||||
mem_limit: 800m
|
||||
EOF
|
||||
```
|
||||
|
||||
### 4. 启动容器与状态检查
|
||||
```bash
|
||||
cd /opt/new-api
|
||||
docker compose up -d
|
||||
docker ps
|
||||
```
|
||||
回显中显示 `new-api` 状态为 `Up` 且端口为 `127.0.0.1:3000->3000/tcp` 即代表容器启动成功。
|
||||
|
||||
---
|
||||
|
||||
## 五、第四阶段:Nginx 反向代理与 SSL 证书自动化
|
||||
|
||||
### 1. 安装 Nginx 与 Certbot 证书套件
|
||||
```bash
|
||||
apt update && apt install -y nginx certbot python3-certbot-nginx
|
||||
```
|
||||
|
||||
### 2. 写入 Nginx 站点配置
|
||||
创建反向代理配置文件 `/etc/nginx/sites-available/api.trivoo.website`:
|
||||
```bash
|
||||
cat > /etc/nginx/sites-available/api.trivoo.website <<'EOF'
|
||||
map $http_upgrade $connection_upgrade {
|
||||
default upgrade;
|
||||
'' close;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name api.trivoo.website;
|
||||
|
||||
# 允许大文件上传(如语音转录、多模态图片)
|
||||
client_max_body_size 100m;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:3000;
|
||||
proxy_http_version 1.1;
|
||||
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# WebSocket 协议支持(Realtime / Responses 升级通道)
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection $connection_upgrade;
|
||||
|
||||
# 核心:关闭缓冲以支持打字机流式响应(SSE)
|
||||
proxy_buffering off;
|
||||
proxy_cache off;
|
||||
proxy_read_timeout 1800s;
|
||||
proxy_send_timeout 1800s;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
```
|
||||
|
||||
### 3. 启用站点并检查语法
|
||||
```bash
|
||||
ln -sf /etc/nginx/sites-available/api.trivoo.website /etc/nginx/sites-enabled/
|
||||
nginx -t && systemctl reload nginx
|
||||
```
|
||||
*(必须看到 `syntax is ok` 与 `test is successful`)*
|
||||
|
||||
### 4. 一键自动签发 Let's Encrypt 证书并启用 HTTPS
|
||||
```bash
|
||||
certbot --nginx -d api.trivoo.website --non-interactive --agree-tos -m admin@trivoo.website --redirect
|
||||
```
|
||||
执行完毕后出现:
|
||||
`Congratulations! You have successfully enabled HTTPS on https://api.trivoo.website`
|
||||
此时证书已自动安装,并已创建 systemd 自动续期定时器。
|
||||
|
||||
---
|
||||
|
||||
## 六、第五阶段:New API 初始化与渠道配置
|
||||
|
||||
### 1. 首次访问与系统向导
|
||||
浏览器访问:`https://api.trivoo.website`
|
||||
1. **数据库检查**:自动检测出 SQLite,直接点击「下一步」;
|
||||
2. **管理员账户**:设定管理员用户名和高强度密码;
|
||||
3. **完成初始化**:进入控制台主界面。
|
||||
|
||||
### 2. 接入官方渠道(以 DeepSeek 官方为例)
|
||||
1. 左侧菜单栏点击 **「渠道」** -> 右上角 **「创建渠道」**;
|
||||
2. **类型**:选择 `DeepSeek`;
|
||||
3. **API 密钥**:填入 DeepSeek 官方以 `sk-` 开头的 API Key;
|
||||
4. **模型**:点击快捷操作中的 **「填入相关模型」**,框内自动出现 `deepseek-chat` 与 `deepseek-reasoner` 标签;
|
||||
5. 点击最底部 **「提交」**;
|
||||
6. 在渠道列表中点击该卡片右上角的 **仪表盘图标(测速)**,出现绿色延迟(如 `554ms`)代表渠道通信成功。
|
||||
|
||||
### 3. 接入第三方自定义渠道(以 `apikey.fan` 聚合服务为例)
|
||||
1. 点击 **「创建渠道」** -> 类型选 **`高级自定义`**(或 OpenAI 兼容);
|
||||
2. **API 地址**:填入服务商的基础网关地址(如 `https://api.apikey.fan`);
|
||||
3. **API 密钥**:填入该服务商提供的密钥;
|
||||
4. **模型**:手动输入该上游支持的具体模型名(如 `gpt-5.6-terra`),**按回车确认生成标签**;
|
||||
5. 点击提交并点击测试图标,验证连通性。
|
||||
|
||||
### 4. 生成调用令牌(分发密钥)
|
||||
1. 左侧菜单栏点击 **「常规」 -> 「API 密钥」**(或「令牌」);
|
||||
2. 点击右上角 **「创建密钥」**;
|
||||
3. 设定名称(如 `default-token`),额度设为无限或指定额度;
|
||||
4. 提交后在列表中点击 **「复制」**,获取专属于该网关的 `sk-xxxx` 令牌。
|
||||
|
||||
---
|
||||
|
||||
## 七、第六阶段:客户端接入与高频踩坑排错手册
|
||||
|
||||
### 1. 客户端标准配置示例
|
||||
|
||||
在任何支持第三方 API 的客户端(如 Cline、NextChat、Cherry Studio、Chatbox 等)中配置:
|
||||
|
||||
- **接口地址 / Base URL**:`https://api.trivoo.website/v1`
|
||||
- **API Key**:填入后台生成的 `sk-xxxx` 令牌
|
||||
- **模型名称**:填入渠道中已有的有效模型(如 `deepseek-chat` 或 `gpt-5.6-terra`)
|
||||
|
||||
---
|
||||
|
||||
### 2. 实战高频报错与精准排错对照
|
||||
|
||||
#### ❌ 错误 1:`404 Invalid URL (POST /v1/v1/messages)`
|
||||
* **现象**:客户端报错 404,请求路径出现重复的 `/v1/v1`。
|
||||
* **原因**:部分遵循 Anthropic / Claude 协议的客户端(如某些版本的 Cline),内部会自动为地址补全 `/v1/messages`。如果你在配置的 Base URL 中包含了 `/v1`,拼接后就会变成 `/v1/v1/messages`。
|
||||
* **解决方案**:将客户端的 API 地址末尾的 `/v1` 删掉,改为 `https://api.trivoo.website`。
|
||||
|
||||
#### ❌ 错误 2:`503 No available channel for model xxx under group default`
|
||||
* **现象**:客户端发起调用,返回 `model_not_found`。
|
||||
* **原因**:客户端发送的模型请求名称(例如 `gpt-5.6-terra`),在 New API 的所有可用渠道模型列表中都不存在。
|
||||
* **解决方案**:
|
||||
- **方案 A(改客户端)**:将客户端的模型名称改为渠道真实支持的名字(如 `deepseek-chat`);
|
||||
- **方案 B(改网关重定向)**:在 New API 对应渠道编辑页中,点击「设置模型重定向」,将外部请求的 `gpt-5.6-terra` 重定向映射到后端的 `deepseek-chat`。
|
||||
|
||||
#### ❌ 错误 3:`Permission denied` / `No such file or directory`
|
||||
* **现象**:在服务器终端执行 Docker 或 Nginx 配置命令时报错。
|
||||
* **原因**:新开的 SSH 会话默认处于普通用户 `ubuntu` 权限。
|
||||
* **解决方案**:执行命令前务必先输入 `sudo -i` 切换到 `root` 账户。
|
||||
|
||||
#### ❌ 错误 4:Spaceship 登录报 `Invalid username or password`
|
||||
* **现象**:明明输入了正确邮箱和密码,却无法登录 Spaceship。
|
||||
* **原因**:Spaceship 强制要求在第一栏输入当初注册时设置的 **Username(用户名,如 `Beyond`)**,不支持直接使用邮箱登录。
|
||||
* **解决方案**:在注册邮件中查找用户名,使用纯用户名登录。
|
||||
|
||||
---
|
||||
|
||||
## 八、第七阶段:日常运维、安全加固与一键清理
|
||||
|
||||
### 1. 生产环境安全加固(必做)
|
||||
* **关闭公开注册**:
|
||||
进入后台 `https://api.trivoo.website` -> **「系统设置」 -> 「登录注册」** -> 将 **「允许新用户注册」彻底关闭**。
|
||||
*(防止域名暴露在公网后被爬虫扫描并注册账号白嫖接口额度)*
|
||||
* **SSL 自动续期确认**:
|
||||
Certbot 已经注册了 systemd 定时任务,可通过以下命令测试自动续期机制:
|
||||
```bash
|
||||
certbot renew --dry-run
|
||||
```
|
||||
|
||||
### 2. 日常启停与重启
|
||||
```bash
|
||||
# 暂停 New API 网关(保留所有数据,释放 CPU/内存占用)
|
||||
cd /opt/new-api && docker compose stop && systemctl stop nginx
|
||||
|
||||
# 重新启动 New API 网关
|
||||
cd /opt/new-api && docker compose start && systemctl start nginx
|
||||
|
||||
# 查看实时运行日志
|
||||
cd /opt/new-api && docker compose logs -f --tail=100 new-api
|
||||
```
|
||||
|
||||
### 3. 一键卸载与彻底清理(恢复纯净服务器)
|
||||
如果后续需要腾空服务器,执行以下步骤可在 1 分钟内完全清理痕迹,且**完全不影响服务器原有的代理与 SSH 服务**:
|
||||
|
||||
```bash
|
||||
# 1. 停止并销毁容器及持久化目录
|
||||
cd /opt/new-api && docker compose down
|
||||
rm -rf /opt/new-api
|
||||
|
||||
# 2. 卸载 Nginx 站点配置
|
||||
rm -f /etc/nginx/sites-enabled/api.trivoo.website /etc/nginx/sites-available/api.trivoo.website
|
||||
systemctl reload nginx
|
||||
|
||||
# 3. 删除 Let's Encrypt 证书记录(可选)
|
||||
certbot delete --cert-name api.trivoo.website
|
||||
```
|
||||
同时登录 Spaceship 域名控制台,将 `api.trivoo.website` 的 A 记录直接点击删除即可。
|
||||
@@ -0,0 +1,66 @@
|
||||
# Git 常用命令
|
||||
|
||||
> 开发中最常用的命令,简洁实用
|
||||
|
||||
---
|
||||
|
||||
## 日常操作
|
||||
|
||||
| 场景 | 命令 |
|
||||
|------|------|
|
||||
| **拉取代码** | `git pull` |
|
||||
| **查看状态** | `git status` |
|
||||
| **添加修改** | `git add .` |
|
||||
| **提交** | `git commit -m "说明"` |
|
||||
| **推送** | `git push` |
|
||||
|
||||
---
|
||||
|
||||
## 分支操作
|
||||
|
||||
| 场景 | 命令 |
|
||||
|------|------|
|
||||
| **查看分支** | `git branch -a` |
|
||||
| **创建分支** | `git checkout -b <分支名>` |
|
||||
| **切换分支** | `git checkout <分支名>` |
|
||||
| **合并分支** | `git merge <分支名>` |
|
||||
| **删除分支** | `git branch -d <分支名>` |
|
||||
|
||||
---
|
||||
|
||||
## 撤销操作
|
||||
|
||||
| 场景 | 命令 |
|
||||
|------|------|
|
||||
| **撤销修改** | `git restore <文件>` |
|
||||
| **取消add** | `git restore --staged <文件>` |
|
||||
| **回退上次提交** | `git reset --soft HEAD~1` |
|
||||
| **暂存工作** | `git stash` |
|
||||
| **恢复暂存** | `git stash pop` |
|
||||
|
||||
---
|
||||
|
||||
## 查看信息
|
||||
|
||||
| 场景 | 命令 |
|
||||
| ------------ | ---------------------------- |
|
||||
| **提交历史** | `git log --oneline` |
|
||||
| **最近5条** | `git log -5 --oneline` |
|
||||
| **文件修改历史** | `git log -p <文件>` |
|
||||
| **查看差异** | `git diff` |
|
||||
| 指定提交者 查看提交记录 | git log --author=lihai --all |
|
||||
| | |
|
||||
|
||||
---
|
||||
|
||||
## 一句话流程
|
||||
|
||||
```
|
||||
每天开始:git pull
|
||||
完成任务:git add . && git commit -m "说明" && git push
|
||||
切换任务:git stash && git checkout <分支>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
> 💡 不记得命令用 `git help` 查看
|
||||
+214
@@ -0,0 +1,214 @@
|
||||
# 工时填写
|
||||
|
||||
## 下次怎么叫 AI 填写
|
||||
|
||||
推荐直接这样说:
|
||||
|
||||
```text
|
||||
填写工时,时间从 6月26日 到 6月30日,不备份,填完提交审核。
|
||||
日志按工时考核月取 Obsidian 日志文件,内容按日期下面编号行原样填写,不带日期标题。
|
||||
```
|
||||
|
||||
如果不确定是否备份,可以这样说:
|
||||
|
||||
```text
|
||||
填写工时,时间从 7月26日 到 7月30日。先问我要不要备份。
|
||||
```
|
||||
|
||||
## 固定路径
|
||||
|
||||
- Obsidian 根目录:`F:\AI\Obsidian`
|
||||
- 工时日志目录:`F:\AI\Obsidian\日志\2026`
|
||||
- 工时工具:`D:\softWare\timetrack-ui\项目工时管理.exe`
|
||||
- 长期记录:`F:\AI\Obsidian\agent.md`
|
||||
|
||||
换电脑后如果路径变了,先告诉 AI 新路径。
|
||||
|
||||
## 日志文件选择规则
|
||||
|
||||
工时系统按考核月统计,周期通常是:
|
||||
|
||||
- 上月 26 日到本月 25 日,属于本月考核月。
|
||||
|
||||
因此日志文件按考核月取:
|
||||
|
||||
- `2026-05-26` 到 `2026-06-25`:取 `日志6月.md`
|
||||
- `2026-06-26` 到 `2026-07-25`:取 `日志7月.md`
|
||||
- `2026-07-26` 到 `2026-08-25`:取 `日志8月.md`
|
||||
|
||||
例如用户说“填写 6月26日到6月30日”,应取:
|
||||
|
||||
```text
|
||||
F:\AI\Obsidian\日志\2026\日志7月.md
|
||||
```
|
||||
|
||||
## 工作内容提取规则
|
||||
|
||||
日志格式示例:
|
||||
|
||||
```text
|
||||
06.13 周六:
|
||||
1.流转:
|
||||
2.解决: 、
|
||||
3.新增语音可见即可说功能
|
||||
4.车控模块添加可见即可说的功能
|
||||
5.分析鱼快倒车来电声音会从车机发出
|
||||
```
|
||||
|
||||
提交到工时系统时只填日期标题下面的编号内容:
|
||||
|
||||
```text
|
||||
1.流转:
|
||||
2.解决: 、
|
||||
3.新增语音可见即可说功能
|
||||
4.车控模块添加可见即可说的功能
|
||||
5.分析鱼快倒车来电声音会从车机发出
|
||||
```
|
||||
|
||||
注意:
|
||||
|
||||
- 不填写 `06.13 周六:` 这种日期标题。
|
||||
- 保留 `1.流转:`。
|
||||
- 保留 `2.解决:`,即使后面为空或只有符号。
|
||||
- 保留编号行原始顺序。
|
||||
- 去掉日期段落之间多余空行。
|
||||
- 不要自己改写、总结或删减工作内容。
|
||||
|
||||
## 填写原则
|
||||
|
||||
只提交同时满足以下条件的日期:
|
||||
|
||||
- HR 系统有考勤工时。
|
||||
- 日志内容非空。
|
||||
- 工时系统当前未登记或未提交。
|
||||
|
||||
跳过以下日期:
|
||||
|
||||
- HR 工时为空或系统提示“没有考勤工时”。
|
||||
- 日志为空。
|
||||
- 已提交审核或已审核通过。
|
||||
|
||||
默认填写:
|
||||
|
||||
- 项目名称:固定选择 `座舱类迭代项目集`。
|
||||
- 比例:`100%`
|
||||
- 单日一条明细。
|
||||
- 工作内容:取日志中对应日期编号行。
|
||||
- 提交后点击或调用“提交审核”。
|
||||
|
||||
项目注意事项:
|
||||
|
||||
- 用户已明确要求项目名称必须选择 `座舱类迭代项目集`。
|
||||
- 如果系统配置或接口逻辑会把项目自动校正到其他项目,应先停止提交并告诉用户,不要继续按错误项目提交。
|
||||
- 提交后必须查询详情确认项目名称或项目 ID 对应的是 `座舱类迭代项目集`。
|
||||
|
||||
## 工时工具连接方式
|
||||
|
||||
优先使用 Electron 调试接口,比坐标点击稳定。
|
||||
|
||||
如果工时工具已打开但调试端口不可用,可以重启并带调试端口:
|
||||
|
||||
```powershell
|
||||
$exe = 'D:\softWare\timetrack-ui\项目工时管理.exe'
|
||||
Get-Process | Where-Object { $_.Path -eq $exe } | Stop-Process -Force
|
||||
Start-Sleep -Seconds 2
|
||||
Start-Process -FilePath $exe -ArgumentList '--remote-debugging-port=9222','--remote-allow-origins=*'
|
||||
```
|
||||
|
||||
检查调试端口:
|
||||
|
||||
```powershell
|
||||
Invoke-RestMethod -Uri 'http://127.0.0.1:9222/json/version'
|
||||
Invoke-RestMethod -Uri 'http://127.0.0.1:9222/json/list'
|
||||
```
|
||||
|
||||
页面通常类似:
|
||||
|
||||
```text
|
||||
file:///D:/softWare/timetrack-ui/resources/app.asar/dist/index.html#/home
|
||||
```
|
||||
|
||||
## 常用接口线索
|
||||
|
||||
在页面上下文中调用接口,使用工具已有登录态,不要打印 token、密码或刷新令牌。
|
||||
|
||||
常用接口:
|
||||
|
||||
```text
|
||||
GET /act/xmProjectWorktime/getHomeCalendarWorkTime/{考核月}
|
||||
GET /act/xmProject/xmProjectList?userId={userId}&workDate={YYYY-MM-DD}
|
||||
GET /act/hrUserWorktime/detail?userId={userId}&workDate={YYYY-MM-DD}
|
||||
GET /act/xmProjectWorktime/{id}
|
||||
POST /act/xmProjectWorktime/save
|
||||
```
|
||||
|
||||
注意:
|
||||
|
||||
- 真正提交审核使用 `POST /act/xmProjectWorktime/save`。
|
||||
- 不要直接用 `/act/xmProjectWorktime/checkSubmitTask` 代替提交,之前直接调用会返回权限不足。
|
||||
- 如果接口返回“用户凭证已过期”,优先让工具刷新登录态,或让用户重新登录;不要记录或展示密码/token。
|
||||
|
||||
## 提交 Payload 参考
|
||||
|
||||
字段形状参考:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "",
|
||||
"state": "",
|
||||
"userId": "1399",
|
||||
"deptId": 0,
|
||||
"workDate": "2026-06-26",
|
||||
"hrHours": "8",
|
||||
"totalHours": "",
|
||||
"agentFlag": 0,
|
||||
"detailList": [
|
||||
{
|
||||
"id": "",
|
||||
"workId": "",
|
||||
"projectId": "项目ID",
|
||||
"hours": "",
|
||||
"ratio": 100,
|
||||
"workContent": "日志编号内容",
|
||||
"remark": ""
|
||||
}
|
||||
],
|
||||
"createdBy": "",
|
||||
"createdTime": "",
|
||||
"updatedBy": "",
|
||||
"updatedTime": "",
|
||||
"appVersion": 1
|
||||
}
|
||||
```
|
||||
|
||||
## 提交后校验
|
||||
|
||||
提交后必须重新查日历和详情:
|
||||
|
||||
- `checkFlag: 3` 表示等待审核/已提交审核。
|
||||
- 有 `id`、`lastTaskId`、`procInstId` 说明流程已生成。
|
||||
- 再查详情确认 `workContent`、`projectId`、`ratio` 写入正确。
|
||||
|
||||
最终回复用户时列出:
|
||||
|
||||
- 总共提交几条。
|
||||
- 成功日期。
|
||||
- 跳过日期和原因。
|
||||
- 每天实际提交的工作内容。
|
||||
- 每天实际选择的项目名称、比例和 HR 工时。
|
||||
- 明确告诉用户“填写了什么”,包括实际写入系统的工作内容。
|
||||
- 如果发现系统自动校正项目或内容与预期不一致,要说明并标记为风险。
|
||||
|
||||
## 已知经验
|
||||
|
||||
- 2026-06-25 已提交审核,`checkFlag=3`。
|
||||
- 2026-06-26 到 2026-06-30 已提交审核,共 5 条。
|
||||
- 2026-07 考核月系统配置曾将项目从 `座舱类迭代项目集` 自动校正为 `基于国产高性能SOC边缘算力的设备自主诊断与预警系统`。用户后续明确要求项目名称必须选择 `座舱类迭代项目集`,如果再次出现自动校正,应先停止并告知用户。
|
||||
|
||||
## 安全要求
|
||||
|
||||
- 操作开始前先确认是否备份,除非用户已明确说“不备份”。
|
||||
- 不在文档中保存密码、token、refresh token、验证码。
|
||||
- 不覆盖用户已有日志内容。
|
||||
- 不删除或回退用户文件。
|
||||
- 完成后把关键结果追加到 `agent.md`。
|
||||
+191
@@ -0,0 +1,191 @@
|
||||
# 梯子搭建流程(实测可用)
|
||||
|
||||
> 服务器:腾讯云新加坡轻量服务器,Ubuntu 24.04,IP:`43.156.118.130`
|
||||
> 方案:手动安装 Xray + Shadowsocks(不用 3x-ui 面板)
|
||||
> 实测:Clash 延迟 122ms,ip.sb 显示新加坡 IP,可正常上网
|
||||
|
||||
---
|
||||
|
||||
## 一、服务器购买(详细)
|
||||
|
||||
- **购买地址**:腾讯云国内站轻量服务器 https://cloud.tencent.com/product/lighthouse
|
||||
- **地域**:新加坡(必须选海外地域;上海/北京/广州等国内地域做不了梯子)
|
||||
- **镜像**:Ubuntu 24.04 LTS
|
||||
- **套餐**:入门型,2核CPU / 2GB内存 / 40GB SSD / 20Mbps峰值带宽 / 每月0.5TB流量,**30元/月**
|
||||
- **购买时长**:先买 **1个月**试用(30元),好用再续年付
|
||||
- **避坑**:
|
||||
- 别买"锐驰型"(35元/月那档,2核1G,不带流量包说明,不合适)
|
||||
- 秒杀页的国内地域套餐(上海/北京/广州)再便宜也不能买
|
||||
- 国际站(tencentcloud.com)注册需要+852号码,收不到验证码,走不通,直接用国内站
|
||||
- **SSH 登录**:腾讯云 Ubuntu 镜像默认禁 root 登录,用 `ubuntu` 用户:`ssh ubuntu@服务器IP`,密码是购买时设的那个,进去后再 `sudo -i` 切 root
|
||||
|
||||
> 本次实测服务器 IP:`43.156.118.130`,1个月试用到期约 2026-12-03,到期前评估是否续费。
|
||||
|
||||
---
|
||||
|
||||
## 二、云服务商防火墙放行端口
|
||||
|
||||
腾讯云控制台 → 服务器 → 防火墙 → 添加规则:
|
||||
|
||||
| 端口 | 协议 | 策略 |
|
||||
|------|------|------|
|
||||
| 22 | TCP | 允许 |
|
||||
| 8388 | TCP | 允许 |
|
||||
| 8388 | UDP | 允许 |
|
||||
|
||||
来源空着不填(默认所有 IP)。
|
||||
|
||||
---
|
||||
|
||||
## 三、SSH 连上服务器
|
||||
|
||||
本地打开 PowerShell:
|
||||
|
||||
```powershell
|
||||
ssh ubuntu@43.156.118.130
|
||||
```
|
||||
|
||||
输入密码后,再切换到 root:
|
||||
|
||||
```bash
|
||||
sudo -i
|
||||
```
|
||||
|
||||
> 如果家里直连 SSH 超时,改用腾讯云网页控制台里的登录方式,效果一样。
|
||||
|
||||
---
|
||||
|
||||
## 四、生成密码并写 Xray 配置
|
||||
|
||||
**第 1 步:生成密码**(自己记下来,别发给别人):
|
||||
|
||||
```bash
|
||||
PASS=$(openssl rand -base64 16); echo "你的密码是:$PASS"
|
||||
```
|
||||
|
||||
忘记密码时可随时查看:
|
||||
|
||||
```bash
|
||||
cat /root/xray-ss.json | grep password
|
||||
```
|
||||
|
||||
**第 2 步:写配置文件**(整段复制粘贴回车):
|
||||
|
||||
```bash
|
||||
cat > /root/xray-ss.json <<EOF
|
||||
{
|
||||
"log": {"loglevel": "warning"},
|
||||
"inbounds": [
|
||||
{
|
||||
"port": 8388,
|
||||
"protocol": "shadowsocks",
|
||||
"settings": {
|
||||
"method": "aes-256-gcm",
|
||||
"password": "$PASS",
|
||||
"network": "tcp,udp"
|
||||
}
|
||||
}
|
||||
],
|
||||
"outbounds": [{"protocol": "freedom"}]
|
||||
}
|
||||
EOF
|
||||
```
|
||||
|
||||
> 注意:第 1 步和第 2 步要在同一个 SSH 窗口里做,否则 `$PASS` 变量对不上。
|
||||
|
||||
**第 3 步:下载 Xray**(如果还没有):
|
||||
|
||||
```bash
|
||||
mkdir -p /usr/local/x-ui/bin
|
||||
cd /tmp
|
||||
curl -Ls -o xray.zip https://github.com/XTLS/Xray-core/releases/latest/download/Xray-linux-64.zip
|
||||
unzip -o xray.zip xray -d /usr/local/x-ui/bin/
|
||||
chmod +x /usr/local/x-ui/bin/xray-linux-amd64
|
||||
```
|
||||
|
||||
> 本次实测用的是 Xray v26.6.27(从 3x-ui 安装包里直接拿的二进制文件)。
|
||||
|
||||
---
|
||||
|
||||
## 五、设为开机自启(systemd)
|
||||
|
||||
```bash
|
||||
cat > /etc/systemd/system/xray-ss.service <<EOF
|
||||
[Unit]
|
||||
Description=Xray Shadowsocks
|
||||
After=network.target
|
||||
[Service]
|
||||
ExecStart=/usr/local/x-ui/bin/xray-linux-amd64 -c /root/xray-ss.json
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl daemon-reload
|
||||
systemctl enable xray-ss
|
||||
systemctl start xray-ss
|
||||
sleep 2; systemctl is-active xray-ss
|
||||
```
|
||||
|
||||
最后输出 `active` 就是成功。验证端口在监听:
|
||||
|
||||
```bash
|
||||
ss -tlnp | grep 8388
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、Clash 客户端配置
|
||||
|
||||
Clash Verge → 订阅 → 新建本地配置文件,粘贴以下内容(`password` 换成你自己的密码):
|
||||
|
||||
```yaml
|
||||
proxies:
|
||||
- name: SS-Manual
|
||||
type: ss
|
||||
server: 43.156.118.130
|
||||
port: 8388
|
||||
cipher: aes-256-gcm
|
||||
password: "填你的密码"
|
||||
udp: true
|
||||
|
||||
proxy-groups:
|
||||
- name: PROXY
|
||||
type: select
|
||||
proxies:
|
||||
- SS-Manual
|
||||
|
||||
rules:
|
||||
- MATCH,PROXY
|
||||
```
|
||||
|
||||
保存 → 选中该配置 → 代理页测速,能出延迟数字就是通了。
|
||||
|
||||
---
|
||||
|
||||
## 七、验证真正可用
|
||||
|
||||
1. Clash 首页打开**系统代理**开关
|
||||
2. 浏览器打开 `google.com`,能打开即成功
|
||||
3. 打开 `ip.sb`,显示 `43.156.118.130 / 新加坡` 即确认流量走了服务器
|
||||
|
||||
---
|
||||
|
||||
## 八、常见问题
|
||||
|
||||
- **Clash 测速超时**:先对密码(服务器 `/root/xray-ss.json` 里的必须和 Clash 里一字不差),再查云防火墙 8388 有没有放行
|
||||
- **SSH 连不上**:换腾讯云网页控制台登录
|
||||
- **服务器重启后节点没了**:检查 `systemctl is-active xray-ss`,不是 active 就 `systemctl start xray-ss`
|
||||
- **想改密码**:改 `/root/xray-ss.json` 里的 password,然后 `systemctl restart xray-ss`,Clash 里同步改
|
||||
|
||||
---
|
||||
|
||||
## 九、备注:为什么不用 3x-ui
|
||||
|
||||
3x-ui v3.11.0 面板装完后,VLESS+Reality(443)和 Shadowsocks(8388)都调不通:TCP 端口能连上,但协议层握手超时,服务器日志无报错。尝试过的排查:
|
||||
|
||||
- 确认防火墙放行、Xray 在监听、密钥成对匹配
|
||||
- Xray 从 v26.10.21 降级到 v26.6.27(排除 ML-KEM 兼容问题)
|
||||
- 重启服务器、换 v2rayN 客户端交叉验证、重建入站
|
||||
|
||||
全部无效。绕开 3x-ui、手动跑 Xray 后一次就通,判定为 3x-ui v3.x 的 bug。如需面板,慎用 v3.11.0。
|
||||
Reference in new issue
Block a user