mirror of
https://github.com/Comfy-Org/ComfyUI-Manager.git
synced 2026-07-02 04:39:21 +08:00
feat: Simple reserve proxy for china users
This commit is contained in:
parent
7d5e990aa9
commit
289052e824
@ -37,6 +37,11 @@ cache_dir = os.path.join(comfyui_manager_path, '.cache')
|
|||||||
cached_config = None
|
cached_config = None
|
||||||
js_path = None
|
js_path = None
|
||||||
|
|
||||||
|
reverse_proxies = {
|
||||||
|
'ghproxy-mirror': 'https://mirror.ghproxy.com/https://github.com/REPO_NAME',
|
||||||
|
'hf-mirror': 'https://hf-mirror.com/REPO_NAME'
|
||||||
|
}
|
||||||
|
|
||||||
comfy_ui_required_revision = 1930
|
comfy_ui_required_revision = 1930
|
||||||
comfy_ui_required_commit_datetime = datetime(2024, 1, 24, 0, 0, 0)
|
comfy_ui_required_commit_datetime = datetime(2024, 1, 24, 0, 0, 0)
|
||||||
|
|
||||||
@ -84,6 +89,26 @@ def get_installed_packages():
|
|||||||
return pip_map
|
return pip_map
|
||||||
|
|
||||||
|
|
||||||
|
def try_to_use_reverse_proxy(url):
|
||||||
|
policy = get_config()['reverse_proxy_policy']
|
||||||
|
if not policy:
|
||||||
|
return url
|
||||||
|
|
||||||
|
if reverse_proxy := reverse_proxies.get(policy, 'both'):
|
||||||
|
print(f"Reverse proxy is '{policy}'")
|
||||||
|
repo_name = url.split("/", 3)[-1]
|
||||||
|
if policy == 'both':
|
||||||
|
if url.startswith('https://github.com'):
|
||||||
|
return reverse_proxies['ghproxy-mirror'].replace("REPO_NAME", repo_name)
|
||||||
|
elif url.startswith('https://huggingface.co'):
|
||||||
|
return reverse_proxies['hf-mirror'].replace("REPO_NAME", repo_name)
|
||||||
|
else:
|
||||||
|
if ((url.startswith('https://github.com') and policy == 'ghproxy-mirror') or
|
||||||
|
(url.startswith('https://huggingface.co') and policy == 'hf-mirror')):
|
||||||
|
return reverse_proxy.replace("REPO_NAME", repo_name)
|
||||||
|
return url
|
||||||
|
|
||||||
|
|
||||||
def clear_pip_cache():
|
def clear_pip_cache():
|
||||||
global pip_map
|
global pip_map
|
||||||
pip_map = None
|
pip_map = None
|
||||||
@ -201,6 +226,7 @@ def write_config():
|
|||||||
"file_logging": get_config()['file_logging'],
|
"file_logging": get_config()['file_logging'],
|
||||||
'default_ui': get_config()['default_ui'],
|
'default_ui': get_config()['default_ui'],
|
||||||
'component_policy': get_config()['component_policy'],
|
'component_policy': get_config()['component_policy'],
|
||||||
|
'reverse_proxy_policy': get_config()['reverse_proxy_policy'],
|
||||||
'double_click_policy': get_config()['double_click_policy'],
|
'double_click_policy': get_config()['double_click_policy'],
|
||||||
'windows_selector_event_loop_policy': get_config()['windows_selector_event_loop_policy'],
|
'windows_selector_event_loop_policy': get_config()['windows_selector_event_loop_policy'],
|
||||||
'model_download_by_agent': get_config()['model_download_by_agent'],
|
'model_download_by_agent': get_config()['model_download_by_agent'],
|
||||||
@ -236,6 +262,7 @@ def read_config():
|
|||||||
'file_logging': default_conf['file_logging'].lower() == 'true' if 'file_logging' in default_conf else True,
|
'file_logging': default_conf['file_logging'].lower() == 'true' if 'file_logging' in default_conf else True,
|
||||||
'default_ui': default_conf['default_ui'] if 'default_ui' in default_conf else 'none',
|
'default_ui': default_conf['default_ui'] if 'default_ui' in default_conf else 'none',
|
||||||
'component_policy': default_conf['component_policy'] if 'component_policy' in default_conf else 'workflow',
|
'component_policy': default_conf['component_policy'] if 'component_policy' in default_conf else 'workflow',
|
||||||
|
'reverse_proxy_policy': default_conf['reverse_proxy_policy'] if 'reverse_proxy_policy' in default_conf else 'none',
|
||||||
'double_click_policy': default_conf['double_click_policy'] if 'double_click_policy' in default_conf else 'copy-all',
|
'double_click_policy': default_conf['double_click_policy'] if 'double_click_policy' in default_conf else 'copy-all',
|
||||||
'windows_selector_event_loop_policy': default_conf['windows_selector_event_loop_policy'].lower() == 'true' if 'windows_selector_event_loop_policy' in default_conf else False,
|
'windows_selector_event_loop_policy': default_conf['windows_selector_event_loop_policy'].lower() == 'true' if 'windows_selector_event_loop_policy' in default_conf else False,
|
||||||
'model_download_by_agent': default_conf['model_download_by_agent'].lower() == 'true' if 'model_download_by_agent' in default_conf else False,
|
'model_download_by_agent': default_conf['model_download_by_agent'].lower() == 'true' if 'model_download_by_agent' in default_conf else False,
|
||||||
@ -254,6 +281,7 @@ def read_config():
|
|||||||
'file_logging': True,
|
'file_logging': True,
|
||||||
'default_ui': 'none',
|
'default_ui': 'none',
|
||||||
'component_policy': 'workflow',
|
'component_policy': 'workflow',
|
||||||
|
'reverse_proxy_policy': 'none',
|
||||||
'double_click_policy': 'copy-all',
|
'double_click_policy': 'copy-all',
|
||||||
'windows_selector_event_loop_policy': False,
|
'windows_selector_event_loop_policy': False,
|
||||||
'model_download_by_agent': False,
|
'model_download_by_agent': False,
|
||||||
@ -519,6 +547,8 @@ def gitclone_install(files, instant_execution=False, msg_prefix=''):
|
|||||||
|
|
||||||
if url.endswith("/"):
|
if url.endswith("/"):
|
||||||
url = url[:-1]
|
url = url[:-1]
|
||||||
|
|
||||||
|
url = try_to_use_reverse_proxy(url)
|
||||||
try:
|
try:
|
||||||
print(f"Download: git clone '{url}'")
|
print(f"Download: git clone '{url}'")
|
||||||
repo_name = os.path.splitext(os.path.basename(url))[0]
|
repo_name = os.path.splitext(os.path.basename(url))[0]
|
||||||
@ -659,6 +689,8 @@ def gitclone_fix(files, instant_execution=False):
|
|||||||
|
|
||||||
if url.endswith("/"):
|
if url.endswith("/"):
|
||||||
url = url[:-1]
|
url = url[:-1]
|
||||||
|
|
||||||
|
url = try_to_use_reverse_proxy(url)
|
||||||
try:
|
try:
|
||||||
repo_name = os.path.splitext(os.path.basename(url))[0]
|
repo_name = os.path.splitext(os.path.basename(url))[0]
|
||||||
repo_path = os.path.join(custom_nodes_path, repo_name)
|
repo_path = os.path.join(custom_nodes_path, repo_name)
|
||||||
|
|||||||
@ -145,6 +145,8 @@ def set_default_ui_mode(mode):
|
|||||||
def set_component_policy(mode):
|
def set_component_policy(mode):
|
||||||
core.get_config()['component_policy'] = mode
|
core.get_config()['component_policy'] = mode
|
||||||
|
|
||||||
|
def set_reverse_proxy_policy(policy):
|
||||||
|
core.get_config()['reverse_proxy_policy'] = policy
|
||||||
|
|
||||||
def set_double_click_policy(mode):
|
def set_double_click_policy(mode):
|
||||||
core.get_config()['double_click_policy'] = mode
|
core.get_config()['double_click_policy'] = mode
|
||||||
@ -653,7 +655,6 @@ async def save_snapshot(request):
|
|||||||
except:
|
except:
|
||||||
return web.Response(status=400)
|
return web.Response(status=400)
|
||||||
|
|
||||||
|
|
||||||
def unzip_install(files):
|
def unzip_install(files):
|
||||||
temp_filename = 'manager-temp.zip'
|
temp_filename = 'manager-temp.zip'
|
||||||
for url in files:
|
for url in files:
|
||||||
@ -778,7 +779,6 @@ def copy_set_active(files, is_disable, js_path_name='.'):
|
|||||||
print(f"{action_name} was successful.")
|
print(f"{action_name} was successful.")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
@PromptServer.instance.routes.post("/customnode/install")
|
@PromptServer.instance.routes.post("/customnode/install")
|
||||||
async def install_custom_node(request):
|
async def install_custom_node(request):
|
||||||
if not is_allowed_security_level('middle'):
|
if not is_allowed_security_level('middle'):
|
||||||
@ -999,6 +999,8 @@ async def install_model(request):
|
|||||||
model_url = json_data['url']
|
model_url = json_data['url']
|
||||||
if not core.get_config()['model_download_by_agent'] and (
|
if not core.get_config()['model_download_by_agent'] and (
|
||||||
model_url.startswith('https://github.com') or model_url.startswith('https://huggingface.co') or model_url.startswith('https://heibox.uni-heidelberg.de')):
|
model_url.startswith('https://github.com') or model_url.startswith('https://huggingface.co') or model_url.startswith('https://heibox.uni-heidelberg.de')):
|
||||||
|
model_url = core.try_to_use_reverse_proxy(model_url)
|
||||||
|
|
||||||
model_dir = get_model_dir(json_data)
|
model_dir = get_model_dir(json_data)
|
||||||
download_url(model_url, model_dir, filename=json_data['filename'])
|
download_url(model_url, model_dir, filename=json_data['filename'])
|
||||||
if model_path.endswith('.zip'):
|
if model_path.endswith('.zip'):
|
||||||
@ -1092,6 +1094,16 @@ async def component_policy(request):
|
|||||||
|
|
||||||
return web.Response(status=200)
|
return web.Response(status=200)
|
||||||
|
|
||||||
|
@PromptServer.instance.routes.get("/manager/reverse_proxy/policy")
|
||||||
|
async def reverse_proxy_policy(request):
|
||||||
|
if "value" in request.rel_url.query:
|
||||||
|
set_reverse_proxy_policy(request.rel_url.query['value'])
|
||||||
|
core.write_config()
|
||||||
|
else:
|
||||||
|
return web.Response(text=core.get_config()['reverse_proxy_policy'], status=200)
|
||||||
|
|
||||||
|
return web.Response(status=200)
|
||||||
|
|
||||||
|
|
||||||
@PromptServer.instance.routes.get("/manager/dbl_click/policy")
|
@PromptServer.instance.routes.get("/manager/dbl_click/policy")
|
||||||
async def dbl_click_policy(request):
|
async def dbl_click_policy(request):
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import { OpenArtShareDialog } from "./comfyui-share-openart.js";
|
|||||||
import { CustomNodesManager } from "./custom-nodes-manager.js";
|
import { CustomNodesManager } from "./custom-nodes-manager.js";
|
||||||
import { SnapshotManager } from "./snapshot.js";
|
import { SnapshotManager } from "./snapshot.js";
|
||||||
import { ModelInstaller } from "./model-downloader.js";
|
import { ModelInstaller } from "./model-downloader.js";
|
||||||
import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models, show_message } from "./common.js";
|
import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models, show_message, set_reverse_proxy_policy } from "./common.js";
|
||||||
import { ComponentBuilderDialog, load_components, set_component_policy, getPureName } from "./components-manager.js";
|
import { ComponentBuilderDialog, load_components, set_component_policy, getPureName } from "./components-manager.js";
|
||||||
import { set_double_click_policy } from "./node_fixer.js";
|
import { set_double_click_policy } from "./node_fixer.js";
|
||||||
|
|
||||||
@ -920,6 +920,28 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
set_component_policy(event.target.value);
|
set_component_policy(event.target.value);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// reverse-proxy policy
|
||||||
|
let reverse_proxy_combo = document.createElement("select");
|
||||||
|
reverse_proxy_combo.setAttribute("title", "If you are in China, you can use this option to enable reverse-proxy to download custom nodes and models.");
|
||||||
|
reverse_proxy_combo.className = "cm-menu-combo";
|
||||||
|
reverse_proxy_combo.appendChild($el('option', { value: 'none', text: 'Reverse Proxy: None' }, []));
|
||||||
|
reverse_proxy_combo.appendChild($el('option', { value: 'ghproxy-mirror', text: 'Reverse Proxy: GHProxy Mirror to GitHub' }, []));
|
||||||
|
reverse_proxy_combo.appendChild($el('option', { value: 'hf-mirror', text: 'Reverse Proxy: HF-Mirror to HuggingFace' }, []));
|
||||||
|
reverse_proxy_combo.appendChild($el('option', { value: 'both', text: 'Reverse Proxy: Both' }, []));
|
||||||
|
|
||||||
|
api.fetchApi('/manager/reverse_proxy/policy')
|
||||||
|
.then(response => response.text())
|
||||||
|
.then(data => {
|
||||||
|
reverse_proxy_combo.value = data;
|
||||||
|
set_reverse_proxy_policy(data);
|
||||||
|
})
|
||||||
|
|
||||||
|
reverse_proxy_combo.addEventListener('change', function (event) {
|
||||||
|
api.fetchApi(`/manager/reverse_proxy/policy?value=${event.target.value}`);
|
||||||
|
set_reverse_proxy_policy(event.target.value);
|
||||||
|
})
|
||||||
|
|
||||||
|
// double-click policy
|
||||||
let dbl_click_policy_combo = document.createElement("select");
|
let dbl_click_policy_combo = document.createElement("select");
|
||||||
dbl_click_policy_combo.setAttribute("title", "Sets the behavior when you double-click the title area of a node.");
|
dbl_click_policy_combo.setAttribute("title", "Sets the behavior when you double-click the title area of a node.");
|
||||||
dbl_click_policy_combo.className = "cm-menu-combo";
|
dbl_click_policy_combo.className = "cm-menu-combo";
|
||||||
@ -970,6 +992,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
default_ui_combo,
|
default_ui_combo,
|
||||||
share_combo,
|
share_combo,
|
||||||
component_policy_combo,
|
component_policy_combo,
|
||||||
|
reverse_proxy_combo,
|
||||||
dbl_click_policy_combo,
|
dbl_click_policy_combo,
|
||||||
$el("br", {}, []),
|
$el("br", {}, []),
|
||||||
|
|
||||||
|
|||||||
11
js/common.js
11
js/common.js
@ -65,6 +65,17 @@ export async function install_pip(packages) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let reverse_proxy_policy = "none"
|
||||||
|
try {
|
||||||
|
api.fetchApi('/manager/reverse_proxy/policy')
|
||||||
|
.then(response => response.text())
|
||||||
|
.then(data => { reverse_proxy_policy = data; });
|
||||||
|
}
|
||||||
|
catch {}
|
||||||
|
export function set_reverse_proxy_policy(v) {
|
||||||
|
reverse_proxy_policy = v;
|
||||||
|
}
|
||||||
|
|
||||||
export async function install_via_git_url(url, manager_dialog) {
|
export async function install_via_git_url(url, manager_dialog) {
|
||||||
if(!url) {
|
if(!url) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user