Template
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6206697e3b | ||
|
|
4c19099b04 | ||
|
|
80160d0ef4 | ||
|
|
ac76a0e540 |
@@ -222,6 +222,17 @@ GitHub Actions workflows in `.github/workflows/`:
|
|||||||
|
|
||||||
## 📋 Fix / changelog (this fork)
|
## 📋 Fix / changelog (this fork)
|
||||||
|
|
||||||
|
### v2.3.0
|
||||||
|
* **Cascade removed** — double-VPN feature dropped from the panel (manager, API, UI, i18n).
|
||||||
|
|
||||||
|
### v2.2.1
|
||||||
|
* **Cascade egress verify fix**: bind curl to ENTRY `awg0`/`wg0` IP (client-subnet policy route), not cascade peer Address.
|
||||||
|
* Soft-warn (no rollback) when policy route via `cascade` is OK but public-IP echo services fail.
|
||||||
|
|
||||||
|
### v2.2.0
|
||||||
|
* **Cascade (double VPN) restored** — later removed in **v2.3.0**.
|
||||||
|
* Inspired by [ryderams/amneziawg-cascade](https://github.com/ryderams/amneziawg-cascade); logic ran over panel SSH (**no remote curl|bash**).
|
||||||
|
|
||||||
### v2.1.0
|
### v2.1.0
|
||||||
* **NaiveProxy — stable**: production-ready install (Caddy + klzgrad/forwardproxy), share links always include `:443`.
|
* **NaiveProxy — stable**: production-ready install (Caddy + klzgrad/forwardproxy), share links always include `:443`.
|
||||||
* **Client notes (important)**:
|
* **Client notes (important)**:
|
||||||
@@ -253,7 +264,7 @@ GitHub Actions workflows in `.github/workflows/`:
|
|||||||
### v1.6.0
|
### v1.6.0
|
||||||
* **3x-ui multi-panel**: register several 3x-ui servers in Settings; pick a panel and load VLESS inbounds over its API when creating users/invites (share link comes from 3x-ui).
|
* **3x-ui multi-panel**: register several 3x-ui servers in Settings; pick a panel and load VLESS inbounds over its API when creating users/invites (share link comes from 3x-ui).
|
||||||
* **Docker / CI**: refreshed `Dockerfile` + compose, `.env.example`, CI checks, GHCR image workflow.
|
* **Docker / CI**: refreshed `Dockerfile` + compose, `.env.example`, CI checks, GHCR image workflow.
|
||||||
* **Cascade removed** for now (pending redesign — showed active while internet often did not work).
|
* **Cascade** was temporarily removed in this release (briefly restored in v2.2.x, removed again in **v2.3.0**).
|
||||||
* **WG/AWG backups**: ZIP export of client `.conf` + restore with loading feedback.
|
* **WG/AWG backups**: ZIP export of client `.conf` + restore with loading feedback.
|
||||||
* **API performance**: in-memory data cache, faster server check/stats.
|
* **API performance**: in-memory data cache, faster server check/stats.
|
||||||
* **Share / guest**: one-tap “Copy key”.
|
* **Share / guest**: one-tap “Copy key”.
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ else:
|
|||||||
application_path = os.path.dirname(__file__)
|
application_path = os.path.dirname(__file__)
|
||||||
|
|
||||||
DATA_FILE = os.path.join(application_path, 'data.json') # legacy JSON; used only for one-shot import / export
|
DATA_FILE = os.path.join(application_path, 'data.json') # legacy JSON; used only for one-shot import / export
|
||||||
CURRENT_VERSION = "v2.1.0"
|
CURRENT_VERSION = "v2.3.0"
|
||||||
RELEASES_REPO_URL = "https://git.evilfox.cc/test2/Amnezia-Web-Panel-main"
|
RELEASES_REPO_URL = "https://git.evilfox.cc/test2/Amnezia-Web-Panel-main"
|
||||||
RELEASES_API_LATEST = "https://git.evilfox.cc/api/v1/repos/test2/Amnezia-Web-Panel-main/releases/latest"
|
RELEASES_API_LATEST = "https://git.evilfox.cc/api/v1/repos/test2/Amnezia-Web-Panel-main/releases/latest"
|
||||||
BIN_DIR = os.environ.get('TUNNEL_BIN_DIR', os.path.join(application_path, 'bin'))
|
BIN_DIR = os.environ.get('TUNNEL_BIN_DIR', os.path.join(application_path, 'bin'))
|
||||||
@@ -151,7 +151,7 @@ def load_translations():
|
|||||||
if f.endswith('.json'):
|
if f.endswith('.json'):
|
||||||
lang = f.split('.')[0]
|
lang = f.split('.')[0]
|
||||||
try:
|
try:
|
||||||
with open(os.path.join(trans_dir, f), 'r', encoding='utf-8') as tf:
|
with open(os.path.join(trans_dir, f), 'r', encoding='utf-8-sig') as tf:
|
||||||
TRANSLATIONS[lang] = json.load(tf)
|
TRANSLATIONS[lang] = json.load(tf)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error loading translation {f}: {e}")
|
logger.error(f"Error loading translation {f}: {e}")
|
||||||
@@ -1742,7 +1742,6 @@ class HysteriaSettingsRequest(BaseModel):
|
|||||||
email: Optional[str] = None
|
email: Optional[str] = None
|
||||||
renew_ssl: bool = False
|
renew_ssl: bool = False
|
||||||
|
|
||||||
|
|
||||||
class ProtocolRequest(BaseModel):
|
class ProtocolRequest(BaseModel):
|
||||||
protocol: str = 'awg'
|
protocol: str = 'awg'
|
||||||
|
|
||||||
@@ -2300,7 +2299,7 @@ async def server_detail(request: Request, server_id: int):
|
|||||||
return RedirectResponse(url='/')
|
return RedirectResponse(url='/')
|
||||||
server = data['servers'][server_id]
|
server = data['servers'][server_id]
|
||||||
users_list = data.get('users', [])
|
users_list = data.get('users', [])
|
||||||
return tpl(request, 'server.html', server=server, server_id=server_id, users=users_list, all_servers=data['servers'])
|
return tpl(request, 'server.html', server=server, server_id=server_id, users=users_list)
|
||||||
|
|
||||||
|
|
||||||
@app.get('/users', response_class=HTMLResponse, tags=["System Templates"])
|
@app.get('/users', response_class=HTMLResponse, tags=["System Templates"])
|
||||||
@@ -3231,6 +3230,7 @@ async def api_hysteria_update_settings(request: Request, server_id: int, req: Hy
|
|||||||
return JSONResponse({'error': str(e)}, status_code=500)
|
return JSONResponse({'error': str(e)}, status_code=500)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@app.post('/api/servers/{server_id}/uninstall', tags=["Protocols"])
|
@app.post('/api/servers/{server_id}/uninstall', tags=["Protocols"])
|
||||||
async def api_uninstall_protocol(request: Request, server_id: int, req: ProtocolRequest):
|
async def api_uninstall_protocol(request: Request, server_id: int, req: ProtocolRequest):
|
||||||
if not _check_admin(request):
|
if not _check_admin(request):
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% from "macros/icons.html" import icon %}
|
{% from "macros/icons.html" import icon %}
|
||||||
|
|
||||||
{% block title_extra %} — {{ server.name }}{% endblock %}
|
{% block title_extra %} — {{ server.name }}{% endblock %}
|
||||||
@@ -2965,6 +2965,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ========== Init ==========
|
// ========== Init ==========
|
||||||
applyInstalledAppsVisibility();
|
applyInstalledAppsVisibility();
|
||||||
checkServer();
|
checkServer();
|
||||||
|
|||||||
+577
-577
File diff suppressed because it is too large
Load Diff
+520
-520
File diff suppressed because it is too large
Load Diff
+520
-520
File diff suppressed because it is too large
Load Diff
+577
-577
File diff suppressed because it is too large
Load Diff
+520
-520
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user