mirror of
https://github.com/baoweise-bot/aimili-vpngate.git
synced 2026-09-06 08:07:04 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
23909c5337 | ||
|
|
839d528250 | ||
|
|
731965696a | ||
|
|
64bc4c0037 | ||
|
|
d875529083 | ||
|
|
97fc3374f1 |
@@ -7,9 +7,9 @@ on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
release_tag:
|
||||
description: Existing formal tag to publish, for example v2.1.4
|
||||
description: Existing formal tag to publish, for example v2.1.5
|
||||
required: true
|
||||
default: v2.1.4
|
||||
default: v2.1.5
|
||||
type: string
|
||||
|
||||
concurrency:
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
**简体中文** · [English](docs/README.en.md) · [日本語](docs/README.ja.md) · [한국어](docs/README.ko.md)
|
||||
|
||||
[快速安装](#quick-install) · [完整安装](#installation) · [连接使用](#connection) · [VPS 推荐](#vps) · [社区入口](#community) · [法律声明](#legal)
|
||||
[快速安装](#quick-install) · [完整安装](#installation) · [连接使用](#connection) · [服务商推荐](#vps) · [社区入口](#community) · [法律声明](#legal)
|
||||
|
||||
[](https://339936.xyz)
|
||||
[](https://t.me/arestemple)
|
||||
@@ -19,42 +19,15 @@
|
||||
</div>
|
||||
|
||||
<a id="vps"></a>
|
||||
## VPS 推荐
|
||||
## 服务商推荐
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td width="50%" valign="top">
|
||||
<h3 align="center">BandwagonHost 搬瓦工</h3>
|
||||
<p align="center">
|
||||
<img alt="CN2 GIA" src="https://img.shields.io/badge/电信-CN2_GIA-dc2626?style=flat-square">
|
||||
<img alt="联通 9929" src="https://img.shields.io/badge/联通-9929-f97316?style=flat-square">
|
||||
<img alt="移动 CMIN2" src="https://img.shields.io/badge/移动-CMIN2-16a34a?style=flat-square">
|
||||
</p>
|
||||
<p><strong>主要特点</strong></p>
|
||||
<ul>
|
||||
<li>电信 CN2 GIA、联通 9929、移动 CMIN2 等三网极品优化线路。</li>
|
||||
<li>低延迟、高稳定性,跨境链路质量出色。</li>
|
||||
<li>适合 TikTok 直播运营、海外带货和长期出海业务。</li>
|
||||
</ul>
|
||||
<p align="center"><a href="https://bandwagonhost.com/aff.php?aff=81790"><img alt="查看 BandwagonHost" src="https://img.shields.io/badge/立即查看-BandwagonHost-dc2626?style=for-the-badge"></a></p>
|
||||
</td>
|
||||
<td width="50%" valign="top">
|
||||
<h3 align="center">RackNerd</h3>
|
||||
<p align="center">
|
||||
<img alt="4000GB 每月流量" src="https://img.shields.io/badge/每月流量-4000GB-0284c7?style=flat-square">
|
||||
<img alt="大流量" src="https://img.shields.io/badge/优势-大流量-0ea5e9?style=flat-square">
|
||||
<img alt="高性价比" src="https://img.shields.io/badge/价格-高性价比-2563eb?style=flat-square">
|
||||
</p>
|
||||
<p><strong>主要特点</strong></p>
|
||||
<ul>
|
||||
<li>每月 4000GB 大流量,流量余量更充足。</li>
|
||||
<li>价格实惠,流量与配置的性价比突出。</li>
|
||||
<li>部署成本低,适合需要长期稳定运行的服务。</li>
|
||||
</ul>
|
||||
<p align="center"><a href="https://my.racknerd.com/aff.php?aff=18708"><img alt="查看 RackNerd" src="https://img.shields.io/badge/立即查看-RackNerd-0284c7?style=for-the-badge"></a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
| 商家 | 推荐理由 | 入口 |
|
||||
| --- | --- | --- |
|
||||
| **BandwagonHost** | 电信 CN2 GIA、联通 9929、移动 CMIN2 三网优化线路;低延迟、高稳定性,适合 TikTok 直播、海外带货和长期出海业务。 | [立即查看](https://bandwagonhost.com/aff.php?aff=81790) |
|
||||
| **RackNerd** | 每月 4000GB 大流量,价格与配置性价比突出;部署成本低,适合需要长期稳定运行的服务。 | [立即查看](https://my.racknerd.com/aff.php?aff=18708) |
|
||||
| **OpenMili** | OpenMili Ai 中转站 5.6 Sol & Images 2.0 Pro美区原价 0.12倍率 不掺假、不降智,接受压力测试!| [立即查看](https://openmili.com/) |
|
||||
|
||||
部分链接为推广链接,通过这些链接购买不会增加你的费用。
|
||||
|
||||
AimiliVPN 使用 Python 标准库管理 VPNGate 节点,提供节点获取与检测、连接切换、Web 管理后台,以及共用一个端口的 HTTP、HTTPS 网站代理和 SOCKS5 代理服务。
|
||||
|
||||
@@ -273,7 +246,6 @@ ssh -N \
|
||||
| Telegram 群 | 即时交流 | [t.me/arestemple](https://t.me/arestemple) |
|
||||
| YouTube 教程 | 安装和使用视频 | [观看视频](https://www.youtube.com/watch?v=s-ATfXR8BpI) |
|
||||
| GitHub Issues | 可复现的问题与功能建议 | [提交 Issue](https://github.com/baoweise-bot/aimili-vpngate/issues) |
|
||||
| 电子邮箱 | Bug 反馈与联系 | [yaohunse7@gmail.com](mailto:yaohunse7@gmail.com) |
|
||||
|
||||
<a id="legal"></a>
|
||||
## 使用范围与法律声明
|
||||
|
||||
+9
-6
@@ -1,12 +1,15 @@
|
||||
# AimiliVPN V2.1.4 正式版
|
||||
# AimiliVPN V2.1.5 正式版
|
||||
|
||||
V2.1.4 包含 V2.1.3 的全部稳定性、安全性和节点识别改进,并修复正式版重新安装验收中发现的手动断开状态遗漏。
|
||||
V2.1.5 包含 V2.1.4 的全部稳定性、安全性和节点识别改进,并修复正式版重新安装验收中发现的失败切换恢复遗漏。
|
||||
|
||||
## V2.1.4 热修复
|
||||
## V2.1.5 热修复
|
||||
|
||||
- 修复点击“断开连接”后 OpenVPN、活动节点和 table 100 已清理,但 Web API 的 `tunnel_ready` / `proxy_ready` 仍短暂保留为 `true` 的问题。
|
||||
- 手动断开现在统一复用完整连接状态清理流程;活动节点、连接中状态、隧道、代理出口、出口 IP 与路由规则会同步归零。
|
||||
- 新增手动断开状态回归测试,并在真实 VPS 上完成断开与重新连接复验。
|
||||
- 修复手动切换失败、原节点恢复失败且连续 3 个备用节点也失效后,日志提示后台重新加载但实际没有启动补位任务的问题。
|
||||
- 备用节点耗尽后现在会启动唯一后台节点补齐线程,按退避间隔重新同步并尝试连接,避免一直等到下一轮周期采集。
|
||||
- 新增自动切换耗尽回归测试,并在真实 VPS 上验证补位线程会创建且不会重复启动。
|
||||
|
||||
## IP 类型识别
|
||||
|
||||
@@ -37,7 +40,7 @@ V2.1.4 包含 V2.1.3 的全部稳定性、安全性和节点识别改进,并
|
||||
|
||||
## 验证与兼容性
|
||||
|
||||
- 本地 Python 单元测试 52/52 通过,Python 编译、Dashboard JavaScript 语法、安装脚本语法和补丁格式检查通过。
|
||||
- 本地 Python 单元测试 53/53 通过,Python 编译、Dashboard JavaScript 语法、安装脚本语法和补丁格式检查通过。
|
||||
- Ubuntu 22.04 x86_64 VPS 已完成真实卸载、重新安装、节点源、连接切换、代理出口、Web API、权限和路由残留验证。
|
||||
- 发布流水线会在 Python 3.9、3.11、3.13 上运行完整测试。
|
||||
- Docker 会分别构建验证 `linux/amd64`、`linux/386`、`linux/arm64`、`linux/arm/v7`,并发布统一多架构镜像清单。
|
||||
@@ -50,8 +53,8 @@ V2.1.4 包含 V2.1.3 的全部稳定性、安全性和节点识别改进,并
|
||||
|
||||
## 下载与更新
|
||||
|
||||
- GitHub Release:`aimilivpn-v2.1.4-linux-source.tar.gz` 和 `sha256sums.txt`。
|
||||
- GHCR:`2.1.4`、`2.1`、`latest` 多架构镜像标签。
|
||||
- GitHub Release:`aimilivpn-v2.1.5-linux-source.tar.gz` 和 `sha256sums.txt`。
|
||||
- GHCR:`2.1.5`、`2.1`、`latest` 多架构镜像标签。
|
||||
|
||||
Python 源码安装更新:
|
||||
|
||||
|
||||
+8
-37
@@ -10,7 +10,7 @@
|
||||
|
||||
[简体中文](../README.md) · **English** · [日本語](README.ja.md) · [한국어](README.ko.md)
|
||||
|
||||
[Quick install](#quick-install) · [Installation](#installation) · [Connection](#connection) · [VPS offers](#vps) · [Community](#community) · [Legal notice](#legal)
|
||||
[Quick install](#quick-install) · [Installation](#installation) · [Connection](#connection) · [Recommended services](#vps) · [Community](#community) · [Legal notice](#legal)
|
||||
|
||||
[](https://339936.xyz)
|
||||
[](https://t.me/arestemple)
|
||||
@@ -46,44 +46,15 @@ The installer prints the complete Web URL, private path, username, and password.
|
||||
> Enable TUN/TAP in the VPS control panel and verify that `/dev/net/tun` exists. The Web dashboard uses TCP `8787` by default; restrict firewall access to your own IP whenever possible.
|
||||
|
||||
<a id="vps"></a>
|
||||
## VPS Offers
|
||||
## Recommended Services
|
||||
|
||||
The following are affiliate links. Using them does not increase your price.
|
||||
| Provider | Type | Why we recommend it | Link |
|
||||
| --- | --- | --- | --- |
|
||||
| **BandwagonHost** | VPS | Optimized China Telecom CN2 GIA, China Unicom 9929, and China Mobile CMIN2 routes; low latency and strong stability for TikTok Live, cross-border commerce, and long-running global services. | [View offer](https://bandwagonhost.com/aff.php?aff=81790) |
|
||||
| **RackNerd** | VPS | 4000GB of monthly traffic with strong value for the price; low deployment costs for services that need to run continuously. | [View offer](https://my.racknerd.com/aff.php?aff=18708) |
|
||||
| **OpenMili** | AI relay | Direct GPT model access without model substitution, a low-cost 1:2 rate, and image generation support. | [Visit OpenMili](https://openmili.com/) |
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td width="50%" valign="top">
|
||||
<h3 align="center">BandwagonHost</h3>
|
||||
<p align="center">
|
||||
<img alt="CN2 GIA" src="https://img.shields.io/badge/China_Telecom-CN2_GIA-dc2626?style=flat-square">
|
||||
<img alt="China Unicom 9929" src="https://img.shields.io/badge/China_Unicom-9929-f97316?style=flat-square">
|
||||
<img alt="China Mobile CMIN2" src="https://img.shields.io/badge/China_Mobile-CMIN2-16a34a?style=flat-square">
|
||||
</p>
|
||||
<p><strong>Highlights</strong></p>
|
||||
<ul>
|
||||
<li>Premium CN2 GIA, China Unicom 9929, and China Mobile CMIN2 optimized routes.</li>
|
||||
<li>Low latency, high stability, and excellent cross-border route quality.</li>
|
||||
<li>Strong connectivity for TikTok live operations, cross-border e-commerce, and long-running global services.</li>
|
||||
</ul>
|
||||
<p align="center"><a href="https://bandwagonhost.com/aff.php?aff=81790"><img alt="View BandwagonHost" src="https://img.shields.io/badge/View-BandwagonHost-dc2626?style=for-the-badge"></a></p>
|
||||
</td>
|
||||
<td width="50%" valign="top">
|
||||
<h3 align="center">RackNerd</h3>
|
||||
<p align="center">
|
||||
<img alt="4000GB monthly traffic" src="https://img.shields.io/badge/Monthly_Traffic-4000GB-0284c7?style=flat-square">
|
||||
<img alt="High traffic" src="https://img.shields.io/badge/Advantage-High_Traffic-0ea5e9?style=flat-square">
|
||||
<img alt="Value" src="https://img.shields.io/badge/Pricing-High_Value-2563eb?style=flat-square">
|
||||
</p>
|
||||
<p><strong>Highlights</strong></p>
|
||||
<ul>
|
||||
<li>4000GB of monthly traffic with generous transfer headroom.</li>
|
||||
<li>Affordable pricing and a strong traffic-to-cost ratio.</li>
|
||||
<li>Low deployment cost for services that need to run continuously.</li>
|
||||
</ul>
|
||||
<p align="center"><a href="https://my.racknerd.com/aff.php?aff=18708"><img alt="View RackNerd" src="https://img.shields.io/badge/View-RackNerd-0284c7?style=for-the-badge"></a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
Some links are affiliate links. Using them does not increase your price.
|
||||
|
||||
Before purchasing, confirm that the selected plan permits TUN/TAP, OpenVPN, and the required network protocols. An affiliate link is not a guarantee that a specific plan will work.
|
||||
|
||||
|
||||
+8
-37
@@ -10,7 +10,7 @@
|
||||
|
||||
[简体中文](../README.md) · [English](README.en.md) · **日本語** · [한국어](README.ko.md)
|
||||
|
||||
[クイックインストール](#quick-install) · [インストール](#installation) · [接続方法](#connection) · [VPS](#vps) · [コミュニティ](#community) · [法的通知](#legal)
|
||||
[クイックインストール](#quick-install) · [インストール](#installation) · [接続方法](#connection) · [おすすめサービス](#vps) · [コミュニティ](#community) · [法的通知](#legal)
|
||||
|
||||
[](https://339936.xyz)
|
||||
[](https://t.me/arestemple)
|
||||
@@ -45,44 +45,15 @@ bash <(curl -Ls https://raw.githubusercontent.com/baoweise-bot/aimili-vpngate/ma
|
||||
> VPS の管理画面で TUN/TAP を有効にし、`/dev/net/tun` が存在することを確認してください。Web のデフォルトポートは TCP `8787` です。可能な限り自分の IP だけを許可してください。
|
||||
|
||||
<a id="vps"></a>
|
||||
## VPS の案内
|
||||
## おすすめサービス
|
||||
|
||||
以下はアフィリエイトリンクです。リンク経由でも購入価格は上がりません。
|
||||
| サービス | 種類 | おすすめポイント | リンク |
|
||||
| --- | --- | --- | --- |
|
||||
| **BandwagonHost** | VPS | China Telecom CN2 GIA、China Unicom 9929、China Mobile CMIN2 の最適化回線。低遅延で安定しており、TikTok ライブ、越境 EC、長期的な海外向けサービスに適しています。 | [詳細を見る](https://bandwagonhost.com/aff.php?aff=81790) |
|
||||
| **RackNerd** | VPS | 月間 4000GB の大容量トラフィックと高いコストパフォーマンス。継続稼働するサービスの導入コストを抑えられます。 | [詳細を見る](https://my.racknerd.com/aff.php?aff=18708) |
|
||||
| **OpenMili** | AI 中継 | GPT モデルを差し替えずに提供する AI 中継サービス。低価格な 1:2 レートで、画像生成にも対応しています。 | [OpenMili を見る](https://openmili.com/) |
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td width="50%" valign="top">
|
||||
<h3 align="center">BandwagonHost</h3>
|
||||
<p align="center">
|
||||
<img alt="CN2 GIA" src="https://img.shields.io/badge/China_Telecom-CN2_GIA-dc2626?style=flat-square">
|
||||
<img alt="China Unicom 9929" src="https://img.shields.io/badge/China_Unicom-9929-f97316?style=flat-square">
|
||||
<img alt="China Mobile CMIN2" src="https://img.shields.io/badge/China_Mobile-CMIN2-16a34a?style=flat-square">
|
||||
</p>
|
||||
<p><strong>主な特長</strong></p>
|
||||
<ul>
|
||||
<li>CN2 GIA、China Unicom 9929、China Mobile CMIN2 の高品質な最適化回線。</li>
|
||||
<li>低遅延、高い安定性、優れた国際経路品質。</li>
|
||||
<li>TikTok ライブ運営、越境 EC、長期的な海外向け事業に適した回線。</li>
|
||||
</ul>
|
||||
<p align="center"><a href="https://bandwagonhost.com/aff.php?aff=81790"><img alt="BandwagonHost" src="https://img.shields.io/badge/View-BandwagonHost-dc2626?style=for-the-badge"></a></p>
|
||||
</td>
|
||||
<td width="50%" valign="top">
|
||||
<h3 align="center">RackNerd</h3>
|
||||
<p align="center">
|
||||
<img alt="4000GB monthly traffic" src="https://img.shields.io/badge/Monthly_Traffic-4000GB-0284c7?style=flat-square">
|
||||
<img alt="High traffic" src="https://img.shields.io/badge/Advantage-High_Traffic-0ea5e9?style=flat-square">
|
||||
<img alt="Value" src="https://img.shields.io/badge/Pricing-High_Value-2563eb?style=flat-square">
|
||||
</p>
|
||||
<p><strong>主な特長</strong></p>
|
||||
<ul>
|
||||
<li>月間 4000GB の大容量トラフィック。</li>
|
||||
<li>手頃な価格と優れたトラフィック対コスト比。</li>
|
||||
<li>継続稼働するサービスの導入コストを抑えやすい構成。</li>
|
||||
</ul>
|
||||
<p align="center"><a href="https://my.racknerd.com/aff.php?aff=18708"><img alt="RackNerd" src="https://img.shields.io/badge/View-RackNerd-0284c7?style=for-the-badge"></a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
一部のリンクはアフィリエイトリンクです。リンク経由でも購入価格は上がりません。
|
||||
|
||||
購入前に、対象プランが TUN/TAP、OpenVPN、必要なプロトコルを許可していることを確認してください。
|
||||
|
||||
|
||||
+8
-37
@@ -10,7 +10,7 @@
|
||||
|
||||
[简体中文](../README.md) · [English](README.en.md) · [日本語](README.ja.md) · **한국어**
|
||||
|
||||
[빠른 설치](#quick-install) · [설치](#installation) · [연결](#connection) · [VPS](#vps) · [커뮤니티](#community) · [법적 고지](#legal)
|
||||
[빠른 설치](#quick-install) · [설치](#installation) · [연결](#connection) · [추천 서비스](#vps) · [커뮤니티](#community) · [법적 고지](#legal)
|
||||
|
||||
[](https://339936.xyz)
|
||||
[](https://t.me/arestemple)
|
||||
@@ -45,44 +45,15 @@ bash <(curl -Ls https://raw.githubusercontent.com/baoweise-bot/aimili-vpngate/ma
|
||||
> VPS 제어판에서 TUN/TAP을 활성화하고 `/dev/net/tun`이 존재하는지 확인하십시오. Web 기본 포트는 TCP `8787`이며 가능하면 자신의 IP만 허용하십시오.
|
||||
|
||||
<a id="vps"></a>
|
||||
## VPS 안내
|
||||
## 추천 서비스
|
||||
|
||||
아래 링크는 제휴 링크이며, 이를 통해 구매해도 가격은 올라가지 않습니다.
|
||||
| 서비스 | 유형 | 추천 이유 | 링크 |
|
||||
| --- | --- | --- | --- |
|
||||
| **BandwagonHost** | VPS | China Telecom CN2 GIA, China Unicom 9929, China Mobile CMIN2 최적화 회선. 지연 시간이 짧고 안정적이며 TikTok 라이브, 해외 전자상거래 및 장기 글로벌 서비스에 적합합니다. | [자세히 보기](https://bandwagonhost.com/aff.php?aff=81790) |
|
||||
| **RackNerd** | VPS | 월 4000GB의 넉넉한 트래픽과 뛰어난 비용 효율. 장기 실행 서비스의 배포 비용을 낮추기 좋습니다. | [자세히 보기](https://my.racknerd.com/aff.php?aff=18708) |
|
||||
| **OpenMili** | AI 중계 | GPT 모델을 바꾸지 않고 제공하는 AI 중계 서비스. 저렴한 1:2 요율과 이미지 생성 기능을 지원합니다. | [OpenMili 방문](https://openmili.com/) |
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td width="50%" valign="top">
|
||||
<h3 align="center">BandwagonHost</h3>
|
||||
<p align="center">
|
||||
<img alt="CN2 GIA" src="https://img.shields.io/badge/China_Telecom-CN2_GIA-dc2626?style=flat-square">
|
||||
<img alt="China Unicom 9929" src="https://img.shields.io/badge/China_Unicom-9929-f97316?style=flat-square">
|
||||
<img alt="China Mobile CMIN2" src="https://img.shields.io/badge/China_Mobile-CMIN2-16a34a?style=flat-square">
|
||||
</p>
|
||||
<p><strong>주요 특징</strong></p>
|
||||
<ul>
|
||||
<li>CN2 GIA, China Unicom 9929, China Mobile CMIN2 프리미엄 최적화 회선.</li>
|
||||
<li>낮은 지연 시간, 높은 안정성, 뛰어난 국제 경로 품질.</li>
|
||||
<li>TikTok 라이브 운영, 해외 전자상거래 및 장기 글로벌 서비스에 적합한 연결 품질.</li>
|
||||
</ul>
|
||||
<p align="center"><a href="https://bandwagonhost.com/aff.php?aff=81790"><img alt="BandwagonHost" src="https://img.shields.io/badge/View-BandwagonHost-dc2626?style=for-the-badge"></a></p>
|
||||
</td>
|
||||
<td width="50%" valign="top">
|
||||
<h3 align="center">RackNerd</h3>
|
||||
<p align="center">
|
||||
<img alt="4000GB monthly traffic" src="https://img.shields.io/badge/Monthly_Traffic-4000GB-0284c7?style=flat-square">
|
||||
<img alt="High traffic" src="https://img.shields.io/badge/Advantage-High_Traffic-0ea5e9?style=flat-square">
|
||||
<img alt="Value" src="https://img.shields.io/badge/Pricing-High_Value-2563eb?style=flat-square">
|
||||
</p>
|
||||
<p><strong>주요 특징</strong></p>
|
||||
<ul>
|
||||
<li>월 4000GB의 넉넉한 트래픽.</li>
|
||||
<li>합리적인 가격과 뛰어난 트래픽 대비 비용 효율.</li>
|
||||
<li>장기 실행 서비스의 배포 비용을 낮추기 좋은 구성.</li>
|
||||
</ul>
|
||||
<p align="center"><a href="https://my.racknerd.com/aff.php?aff=18708"><img alt="RackNerd" src="https://img.shields.io/badge/View-RackNerd-0284c7?style=for-the-badge"></a></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
일부 링크는 제휴 링크이며, 이를 통해 구매해도 가격은 올라가지 않습니다.
|
||||
|
||||
구매 전에 선택한 요금제가 TUN/TAP, OpenVPN 및 필요한 네트워크 프로토콜을 허용하는지 확인하십시오.
|
||||
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
# AimiliVPN V2.1.5 正式版验收报告
|
||||
|
||||
测试日期:2026-08-27 至 2026-08-28(Asia/Shanghai)
|
||||
测试版本:`2.1.5`
|
||||
Git 提交:`97fc337`
|
||||
测试环境:Ubuntu 22.04.1 LTS、Linux 5.15、x86_64、Python 3.10、OpenVPN 2.5.11
|
||||
|
||||
> 本报告不记录 VPS SSH 密码、Web 登录凭据、安全路径或完整管理地址。
|
||||
|
||||
## 1. 结论
|
||||
|
||||
V2.1.5 已通过本地自动化、GitHub Actions 多版本/多架构构建,以及 Ubuntu x86_64 VPS 的完整卸载、公开脚本重装和真实网络验收。
|
||||
|
||||
本轮原计划复验 V2.1.3,但正式安装检查发现手动断开后 `proxy_ready` 没有同步清零,因此未改写旧标签,而是发布 V2.1.4。随后 V2.1.4 的失败切换压力测试又发现:原节点和 3 个备用节点均失败后,日志提示会后台补齐,实际却直接返回。该遗漏已修复并按不可变发行原则发布为 V2.1.5。
|
||||
|
||||
正式 V2.1.5 最终状态:服务 active/enabled,官方 HTTPS 节点源正常,97 个节点覆盖 9 个国家,六项后台服务全部 running,HTTP/SOCKS5 真实出口一致,连接状态、策略路由和断开清理正常。
|
||||
|
||||
## 2. 发布产物
|
||||
|
||||
- GitHub Actions:`33123598394`,结论 `success`。
|
||||
- Python 3.9、3.11、3.13:完整测试通过。
|
||||
- Docker `linux/amd64`、`linux/386`、`linux/arm64`、`linux/arm/v7`:分别构建并导入验证通过。
|
||||
- GHCR 多架构索引摘要:`sha256:46b8f73ebb93ef308ef5bd51b649ce5030ab19ea7eff984e7525f9e7cb84044a`。
|
||||
- GitHub Release:`v2.1.5`,非草稿、非预发布,并为当前 latest。
|
||||
- 源码包:`aimilivpn-v2.1.5-linux-source.tar.gz`。
|
||||
- 源码包 SHA-256:`e2cbcbb35558c34fed6083047bbb730fc9d43bd3537eb301538a1b01ff7f9363`,下载后与 `sha256sums.txt` 完全一致。
|
||||
- Actions 使用 `actions/checkout@v7`、`actions/setup-python@v7` 等当前运行时版本,本次没有 Node.js 20 弃用失败。
|
||||
|
||||
## 3. 自动化检查
|
||||
|
||||
- `python -m unittest discover -s tests -v`:53/53 通过。
|
||||
- `python -m py_compile`:核心 Python 模块全部通过。
|
||||
- Dashboard JavaScript:由单元测试提取脚本并执行 Node.js 语法检查,通过。
|
||||
- `docker compose -f compose.yaml config`:通过。
|
||||
- `bash -n install.sh`:在 VPS Bash 环境通过。
|
||||
- `git diff --check`:通过。
|
||||
- 发行压缩包本地预构建:文件名、版本号和校验文件正确。
|
||||
|
||||
## 4. 完整卸载与公开脚本重装
|
||||
|
||||
两次执行项目自带 `ml uninstall` 后分别确认:
|
||||
|
||||
- `/opt/aimilivpn`、`ml`、systemd unit 和 `/etc/sysctl.d/99-aimilivpn.conf` 均不存在。
|
||||
- OpenVPN 进程为 0,`tun0` 不存在。
|
||||
- table 100 路由为 0,table 100 策略规则为 0。
|
||||
- systemd 返回 inactive,unit 文件不存在。
|
||||
|
||||
随后严格执行 README 的无人值守 GitHub 安装方式:
|
||||
|
||||
```bash
|
||||
AIMILIVPN_NONINTERACTIVE=1 bash <(curl -Ls https://raw.githubusercontent.com/baoweise-bot/aimili-vpngate/main/install.sh)
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
- 版本 `2.1.5`,提交 `97fc337`。
|
||||
- 服务 active/enabled,首次连接在安装器等待窗口内完成。
|
||||
- `ui_auth.json` 权限为 `0600`,所有者为 root。
|
||||
- 默认 Web 端口 8787、代理端口 7928。
|
||||
- 更新检查返回当前版本与 latest 均为 `2.1.5`,`update_available=false`。
|
||||
|
||||
## 5. 节点源与回退
|
||||
|
||||
| 场景 | 实际来源 | 候选数 | 结果 |
|
||||
| --- | --- | ---: | --- |
|
||||
| 默认正式服务 | `official_https` | 97 | 通过 |
|
||||
| 强制官方 HTTPS 失败 | `official_http` | 97 | 通过 |
|
||||
| 强制两个官方源失败 | `github_pages_https` | 98 | 通过 |
|
||||
| GitHub Pages HTTP 地址 | 最终跳转 HTTPS | 98 | 通过,但不是真正明文镜像 |
|
||||
| 四个网络源全部失败 | `local_cache` | 97 | 通过 |
|
||||
| 网络源失败且无最近缓存 | `bundled_initial` | 99 | 通过 |
|
||||
|
||||
四个公开 URL 均从 VPS 返回 HTTP 200 和合法 VPNGate CSV。官方 HTTP/HTTPS 均保留;GitHub Pages HTTP 由平台强制跳转 HTTPS,本地最近有效快照和内置初始快照承担无网络兜底。
|
||||
|
||||
国家发现范围实测:选择 `JP` 后得到 58 个节点且全部为日本,配置持久化为 `JP`;清空后恢复 97 个节点、9 个国家。筛选在来源成功判定后执行,没有把“所选国家当前为 0 个节点”误判成来源失败。
|
||||
|
||||
## 6. IP 类型识别
|
||||
|
||||
正式安装的 97 个节点分类如下:
|
||||
|
||||
| 类型 | 数量 | 置信度约束 |
|
||||
| --- | ---: | --- |
|
||||
| 住宅 | 81 | 中置信度 |
|
||||
| 移动 | 1 | 高置信度 |
|
||||
| 机房 | 15 | 高置信度 |
|
||||
|
||||
严格住宅路由可接受节点为 82 个,全部属于住宅/移动且置信度为中或高。主来源冲突节点会使用第二情报源复核,不能复核的项目保持 unknown/低置信度,不会直接放入严格住宅路由。
|
||||
|
||||
## 7. 连接、切换与断开
|
||||
|
||||
### 7.1 状态门控
|
||||
|
||||
真实切换轮询中,连接建立前持续返回:
|
||||
|
||||
- `is_connecting=true`
|
||||
- 活动节点 0
|
||||
- `tunnel_ready=false`
|
||||
- `proxy_ready=false`
|
||||
- `proxy_ok=false`
|
||||
|
||||
只有 OpenVPN、策略路由和真实代理出口全部验证通过后,才变为活动节点 1 且三个 readiness 状态为 true。失败节点不会提前显示成已连接。
|
||||
|
||||
### 7.2 手动断开
|
||||
|
||||
调用 `/api/disconnect` 后实测:
|
||||
|
||||
- 活动节点 0,`is_connecting=false`。
|
||||
- `tunnel_ready/proxy_ready/proxy_ok` 全部为 false。
|
||||
- OpenVPN 进程 0,`tun0` 不存在。
|
||||
- table 100 路由和策略规则均为 0。
|
||||
- `/api/test_proxy` 返回 `ERR_ROUTE_DEV_NOT_FOUND`,没有保留旧出口假状态。
|
||||
- `connection_enabled=false` 已持久化。
|
||||
|
||||
### 7.3 失败恢复与后台补位
|
||||
|
||||
V2.1.4 压力测试复现:目标节点失败,原节点恢复失败,随后 3 个备用节点也失败;旧代码只打印“后台重新加载节点”并直接返回,最长可能等到下一轮 21 分钟采集。
|
||||
|
||||
V2.1.5 修复后:
|
||||
|
||||
- 连续失败分支调用 `schedule_background_refill()`。
|
||||
- 同一时间只允许一个补位线程,退避间隔为 60、120、300 秒。
|
||||
- 单元测试确认耗尽分支必定调度补位。
|
||||
- VPS 隔离运行确认补位线程已创建、存活且未被取消。
|
||||
- 正式安装中,原节点重新拨号失败后系统保持全部 readiness 为 false,后台重新同步节点,最终自动连接到新的日本节点并恢复 HTTP/SOCKS5 出口。
|
||||
|
||||
## 8. 代理、路由与服务
|
||||
|
||||
- VPS 直连出口与 VPN 代理出口不同。
|
||||
- HTTP 与 SOCKS5 返回相同 VPN 出口。
|
||||
- `/api/test_proxy` 返回成功、出口 IP 和实测延迟。
|
||||
- 成功连接时 table 100 有 1 条默认路由和 1 条策略规则,不重复叠加。
|
||||
- Web、代理、OpenVPN、节点同步、出口检测、延迟测速共 6 项服务全部 running。
|
||||
- OpenVPN 日志包含 `VERIFY KU OK` 与 `VERIFY EKU OK`,没有旧的服务器证书用途警告。
|
||||
- 代理端口提交为 Web 端口时返回 HTTP 400;配置仍为 8787/7928,没有静默改写。
|
||||
|
||||
## 9. Web 前端
|
||||
|
||||
静态、自动化和真实 Chromium 交互检查已通过:
|
||||
|
||||
- 延迟列、官方预估延迟提示、国旗、国家多选、测试/收藏/切换按钮存在。
|
||||
- 国家面板层级、复选框自绘、分页、请求去重、页面隐藏时暂停轮询和日志行数上限均有回归覆盖。
|
||||
- 登录页和 Dashboard 不再使用 `backdrop-filter` 或固定背景,降低 Edge/Chromium GPU 卡死风险。
|
||||
- Dashboard 内联 JavaScript 语法通过 Node.js 检查。
|
||||
- Web API 登录、节点、网关、日志、更新、刷新、断开、连接和代理检测已从 VPS 真实调用通过。
|
||||
- 使用项目真实 `Handler` 和隔离临时数据启动本地实例,以 97 个模拟节点完成 Chromium 桌面和移动视口登录交互;测试账号仅在本地临时实例中存在,退出后已销毁。
|
||||
- 节点表实际呈现 7 列,实测延迟与“仅供参考、非本机实测”的官方预估延迟同时正确显示;日本、韩国、美国国旗和中文国家名正常,检测/收藏/切换三个按钮完整。
|
||||
- 国家多选面板显示国旗、中文国名和节点数量;选择日本后即时缩减为 33 个日本节点,清空后恢复 97 个节点,分页分别显示 50/47 行。
|
||||
- 层叠上下文实测为 `.toolbar z-index: 50`、国家面板 `z-index: 1000`;面板与表格相交区域的顶层命中元素属于国家面板,未再被表格遮挡。
|
||||
- Web 更新检测返回“当前 V2.1.5 正式版 已是最新正式版”;网关与日志面板均能打开并渲染后端结果。
|
||||
- 移动视口下工具栏控件没有越界,国家面板完整位于视口内;经过一次自动轮询周期后页面仍可在约 0.6 秒内完成连续交互,浏览器控制台错误/警告为 0。
|
||||
|
||||
安全边界:本轮没有在浏览器中提交正式 VPS 新生成的安全路径、账号或密码,因为该动作需要用户在提交前即时确认。正式 VPS 的同一组 Web API 已通过服务端本机登录会话完成真实调用验收;浏览器交互部分使用上述隔离实例验证,不把未执行的线上凭据提交描述为已完成。
|
||||
|
||||
## 10. 当前状态与边界
|
||||
|
||||
报告写入时:
|
||||
|
||||
- VPS 运行 GitHub 公开脚本安装的 V2.1.5,而不是本地临时目录。
|
||||
- 服务 active/enabled,活动 VPN、HTTP/SOCKS5 出口正常。
|
||||
- 节点来源为官方 HTTPS,配置恢复为全部国家、自动路由、全部 IP 类型。
|
||||
- 临时防火墙规则为 0;没有修改宿主机 Docker 服务或其他项目。
|
||||
|
||||
未覆盖边界:
|
||||
|
||||
- 实体 VPS 为 Ubuntu x86_64;ARM、386 和其他发行版由 CI 构建/导入验证,不等同于对应实体机长期运行。
|
||||
- VPS 无可用公网 IPv6,未验证公网 IPv6 入站或 IPv6 VPN 出口。
|
||||
- 未进行数天级持续运行和 GitHub Actions 定时任务准点率统计。
|
||||
- Edge 实机需要连接 Edge 浏览器扩展;本轮使用可用的 Chromium 浏览器内核进行 Web 交互。
|
||||
+2
-2
@@ -204,9 +204,9 @@ def get_app_version():
|
||||
try:
|
||||
with open(os.path.join(INSTALL_DIR, "VERSION"), "r", encoding="utf-8") as f:
|
||||
version = f.read().strip().lstrip("vV")
|
||||
return version or "2.1.4"
|
||||
return version or "2.1.5"
|
||||
except Exception:
|
||||
return "2.1.4"
|
||||
return "2.1.5"
|
||||
|
||||
def load_ui_cfg():
|
||||
import json
|
||||
|
||||
@@ -631,6 +631,16 @@ class ManagerLogicTests(unittest.TestCase):
|
||||
connect_mock.assert_called_once_with("old-node")
|
||||
auto_switch_mock.assert_not_called()
|
||||
|
||||
def test_auto_switch_exhaustion_schedules_background_refill(self) -> None:
|
||||
with (
|
||||
mock.patch.object(manager, "schedule_background_refill", return_value=True) as schedule_mock,
|
||||
mock.patch.object(manager, "log_to_json") as log_mock,
|
||||
):
|
||||
manager.auto_switch_node(attempt=3)
|
||||
|
||||
schedule_mock.assert_called_once_with()
|
||||
log_mock.assert_called_once_with("INFO", "Main", "连续自动切换失败,已启动唯一后台节点补齐任务")
|
||||
|
||||
def test_physical_interface_detection_is_cached(self) -> None:
|
||||
original_cache = manager.vpn_utils.physical_interface_cache
|
||||
manager.vpn_utils.physical_interface_cache = (None, 0.0)
|
||||
@@ -828,8 +838,8 @@ class ManagerLogicTests(unittest.TestCase):
|
||||
self.assertEqual(519, entries[-1]["index"])
|
||||
|
||||
def test_web_update_controls_only_expose_stable_main_channel(self) -> None:
|
||||
self.assertEqual("2.1.4", manager.APP_VERSION)
|
||||
self.assertEqual("V2.1.4 正式版", manager.APP_VERSION_LABEL)
|
||||
self.assertEqual("2.1.5", manager.APP_VERSION)
|
||||
self.assertEqual("V2.1.5 正式版", manager.APP_VERSION_LABEL)
|
||||
self.assertIn("检测更新", manager.INDEX_HTML)
|
||||
self.assertIn("/api/check_update", manager.INDEX_HTML)
|
||||
self.assertIn("/tree/main", manager.INDEX_HTML)
|
||||
@@ -874,7 +884,7 @@ class ManagerLogicTests(unittest.TestCase):
|
||||
def test_release_workflow_uses_full_patch_version(self) -> None:
|
||||
workflow_text = (manager.ROOT_DIR / ".github" / "workflows" / "release.yml").read_text(encoding="utf-8")
|
||||
|
||||
self.assertIn("default: v2.1.4", workflow_text)
|
||||
self.assertIn("default: v2.1.5", workflow_text)
|
||||
self.assertIn("AimiliVPN V$(tr -d '\\r\\n' < VERSION) 正式版", workflow_text)
|
||||
self.assertNotIn("cut -d. -f1,2 VERSION", workflow_text)
|
||||
|
||||
@@ -901,8 +911,8 @@ class ManagerLogicTests(unittest.TestCase):
|
||||
|
||||
def test_latest_release_check_reports_current_formal_version(self) -> None:
|
||||
release = {
|
||||
"tag_name": "v2.1.4",
|
||||
"name": "AimiliVPN V2.1.4 正式版",
|
||||
"tag_name": "v2.1.5",
|
||||
"name": "AimiliVPN V2.1.5 正式版",
|
||||
"draft": False,
|
||||
"prerelease": False,
|
||||
}
|
||||
@@ -910,7 +920,7 @@ class ManagerLogicTests(unittest.TestCase):
|
||||
result = manager.check_latest_release()
|
||||
|
||||
self.assertFalse(result["update_available"])
|
||||
self.assertEqual("V2.1.4 正式版", result["current_version_label"])
|
||||
self.assertEqual("V2.1.5 正式版", result["current_version_label"])
|
||||
|
||||
def test_latest_release_check_reports_source_update_command(self) -> None:
|
||||
release = {"tag_name": "v2.2.0", "draft": False, "prerelease": False}
|
||||
|
||||
+6
-4
@@ -141,7 +141,7 @@ UPDATE_COMMAND = (
|
||||
)
|
||||
|
||||
ROOT_DIR = Path(sys.executable).resolve().parent if globals().get("__compiled__") else Path(__file__).resolve().parent
|
||||
DEFAULT_APP_VERSION = "2.1.4"
|
||||
DEFAULT_APP_VERSION = "2.1.5"
|
||||
try:
|
||||
_version_text = (ROOT_DIR / "VERSION").read_text(encoding="utf-8").strip()
|
||||
except OSError:
|
||||
@@ -2122,6 +2122,8 @@ def schedule_background_refill() -> bool:
|
||||
def auto_switch_node(attempt: int = 0) -> None:
|
||||
if attempt >= 3:
|
||||
print("[自动切换] 连续切换失败已达 3 次,停止切换以防止主线程死锁,将在后台重新加载节点...", flush=True)
|
||||
if schedule_background_refill():
|
||||
log_to_json("INFO", "Main", "连续自动切换失败,已启动唯一后台节点补齐任务")
|
||||
return
|
||||
|
||||
ui_cfg = load_ui_config()
|
||||
@@ -4165,12 +4167,12 @@ INDEX_HTML = r"""<!doctype html>
|
||||
<div class="dropdown">
|
||||
<button id="github_btn" class="btn-primary" type="button" aria-expanded="false" aria-controls="github_dropdown" style="background: rgba(255, 255, 255, 0.08); border: 1px solid var(--border-color); color: var(--text-primary);">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 16 16" style="vertical-align: middle; margin-right: 4px;"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"/></svg>
|
||||
<span id="github_version_label">V2.1.4 正式版</span>
|
||||
<span id="github_version_label">V2.1.5 正式版</span>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" style="width:12px; height:12px; margin-left: 2px;" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="3"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7" /></svg>
|
||||
</button>
|
||||
<div id="github_dropdown" class="dropdown-content github-dropdown">
|
||||
<div class="version-current">
|
||||
<div id="current_version_label" class="version-current-label">V2.1.4 正式版</div>
|
||||
<div id="current_version_label" class="version-current-label">V2.1.5 正式版</div>
|
||||
<div id="deployment_mode_label" class="version-current-meta">Python 源码部署 · 更新通道:main</div>
|
||||
</div>
|
||||
<button id="check_update_btn" type="button" onclick="checkForUpdate(event)">
|
||||
@@ -4997,7 +4999,7 @@ function stableSortNodes() {
|
||||
}
|
||||
|
||||
function render(){
|
||||
const versionLabel = state.app_version_label || "V2.1.4 正式版";
|
||||
const versionLabel = state.app_version_label || "V2.1.5 正式版";
|
||||
if ($("github_version_label")) $("github_version_label").textContent = versionLabel;
|
||||
if ($("current_version_label")) $("current_version_label").textContent = versionLabel;
|
||||
if ($("deployment_mode_label")) {
|
||||
|
||||
Reference in New Issue
Block a user