Compare commits

..
Author SHA1 Message Date
RoyirinRosmontis c2c3bd1426 修复:
- 打包路径兼容 Nuitka:识别 __compiled__,无 sys._MEIPASS 时回退 __file__ 所在目录(onefile 解压临时目录);新增 build_nuitka.bat(PyQt5 插件、内置 config.json、输出名不变)
2026-08-26 14:56:06 +08:00
RoyirinRosmontis 2aeb327638 新增功能:
- 切换节点后把当前节点域名记录到用户设置(settings.json 的 current_node),下次启动自动继续使用上次选中的节点(按域名匹配,节点表变化时安全回退第一条)
2026-08-26 14:39:57 +08:00
RoyirinRosmontis 717b7569de 更新 server_config/nginx/nginx.conf 2026-08-26 11:32:44 +08:00
2 changed files with 29 additions and 8 deletions
+26 -4
View File
@@ -28,11 +28,12 @@ C_TEXT = "#333333" # 正文
C_SUBTEXT = "#889099" # 次要文字
# ── 路径 ──────────────────────────────────────────────
# frozen=True 表示已被 PyInstaller 打包为 EXE:
# BASE_DIR -> EXE 解压出的临时目录(_MEIPASS)
# 已被打包为 EXE(PyInstaller 的 sys.frozen / Nuitka 的 __compiled__):
# BASE_DIR -> 内置数据目录:PyInstaller 用 _MEIPASS,Nuitka onefile 用
# __file__ 所在解压临时目录(无 _MEIPASS 时回退)
# PERSIST_DIR -> EXE 所在目录,服务安装等需要持久化的操作都放这里
if getattr(sys, 'frozen', False):
BASE_DIR = Path(sys._MEIPASS)
if getattr(sys, 'frozen', False) or "__compiled__" in globals():
BASE_DIR = Path(getattr(sys, "_MEIPASS", None) or Path(__file__).resolve().parent)
PERSIST_DIR = Path(sys.executable).resolve().parent
else:
BASE_DIR = Path(__file__).resolve().parent
@@ -88,6 +89,8 @@ def _load_nodes():
if not isinstance(data, list):
raise ValueError("nodes.json 顶层应为节点数组")
_NODES = data
if not _SELECTED_RESTORED:
_restore_selected_node(_NODES) # 恢复上次使用的节点
log(f"已加载节点配置: {len(_NODES)} 个 ({path})")
if data and not str(data[0].get("domain") or "").strip():
log_red("节点未填写域名:请配置 config.json 的 nodes_url 在线更新,"
@@ -97,6 +100,7 @@ def _load_nodes():
return _NODES
_SELECTED_NODE = 0 # 当前选中节点下标(默认第一条)
_SELECTED_RESTORED = False # 启动时是否已按设置恢复过上次选中的节点
def _current_node():
"""当前使用的节点:默认取列表第一个;无节点时返回 None。"""
@@ -121,8 +125,26 @@ def _switch_node(index):
log("已在当前节点")
return False
_SELECTED_NODE = index
_save_current_node(nodes[index].get("domain") or "") # 记录到设置,下次启动恢复
return True
def _restore_selected_node(nodes):
"""首次加载时按设置里记录的 current_node(域名)恢复上次选中的节点。"""
global _SELECTED_NODE, _SELECTED_RESTORED
_SELECTED_RESTORED = True
saved = str(_settings_load().get("current_node") or "")
for i, n in enumerate(nodes):
if saved and str(n.get("domain") or "") == saved:
_SELECTED_NODE = i
return
_SELECTED_NODE = 0
def _save_current_node(domain):
"""把当前选中节点域名写入设置文件(下次启动自动继续使用)。"""
data = _settings_load()
data["current_node"] = str(domain or "")
_settings_save(data)
def _reload_nodes():
"""强制重新读取 nodes.json(菜单打开时调用,外部改动即时生效)。"""
global _NODES
+3 -4
View File
@@ -56,15 +56,14 @@ http {
}
}
# 443 端口:iam.aeolianchi.me HTTPS 站点 + 认证 CONNECT 代理
server {
listen 443 ssl;
http2 on;
server_name iam.aeolianchi.me;
server_name XXX;
root /var/www/html;
ssl_certificate /etc/nginx/ssl/iam.aeolianchi.me/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/iam.aeolianchi.me/privkey.pem;
ssl_certificate /etc/nginx/ssl/XXX/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/XXX/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:10m;