This commit is contained in:
eric
2026-05-16 19:24:30 -05:00
parent 19beec12a5
commit 75a0ca4e31
260 changed files with 51345 additions and 1 deletions

View File

@@ -0,0 +1,6 @@
{
"address": "0.0.0.0",
"port": 80,
"baseURL": "",
"log": "stdout"
}

View File

@@ -0,0 +1,22 @@
version: "3.3"
services:
filebrowser:
image: filebrowser/filebrowser:latest
container_name: live-filebrowser
restart: unless-stopped
ports:
- "${FILEBROWSER_PORT:-8082}:80"
volumes:
- ./database:/database
- ./config:/config
- ../..:/srv/app
- "${SHELLCRASH_DIR:-/etc/ShellCrash}:/srv/shellcrash"
- /home/live:/srv/home-live
command:
- --database
- /database/filebrowser.db
- --config
- /config/settings.json
- --root
- /srv

View File

@@ -0,0 +1,34 @@
- Infrastructure:
- Live Console:
href: http://__HOST__:8001
description: Douyin / YouTube / HDMI orchestration
- WebTTY:
href: http://__HOST__:7681
description: Browser terminal as live user
- Cockpit:
href: https://__HOST__:9090
description: System administration
- File Browser:
href: http://__HOST__:8082
description: Beginner-friendly file manager
- ShellCrash:
href: http://__HOST__:8001
description: Rules and YAML editing from the main console
- Netdata:
href: http://__HOST__:19999
description: Metrics and health monitoring
- mitmproxy:
href: http://__HOST__:8086
description: Web proxy capture and traffic inspection
- VS Code Server:
href: http://__HOST__:8440
description: Browser IDE mounted to the live workspace
- Uptime Kuma:
href: http://__HOST__:3001
description: Endpoint health checks and alert dashboards
- SRS:
href: http://__HOST__:8080
description: FLV and HLS preview endpoint
- OpenClaw:
href: http://__HOST__:18789
description: Automation gateway and web workspace

View File

@@ -0,0 +1,7 @@
title: Live Control Hub
description: Unified LAN dashboard for streaming, networking, and device control
color: slate
layout:
Infrastructure:
style: row
columns: 3

View File

@@ -0,0 +1,4 @@
- resources:
cpu: true
memory: true
disk: /

View File

@@ -0,0 +1,14 @@
version: "3.3"
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: live-homepage
restart: unless-stopped
ports:
- "${HOMEPAGE_PORT:-80}:3000"
environment:
HOMEPAGE_ALLOWED_HOSTS: "*"
volumes:
- ./config:/app/config
- /var/run/docker.sock:/var/run/docker.sock:ro

View File

@@ -0,0 +1,26 @@
version: "3.3"
services:
mitmproxy:
image: mitmproxy/mitmproxy:latest
container_name: live-mitmproxy
restart: unless-stopped
command:
- mitmweb
- --web-host
- 0.0.0.0
- --web-port
- "8081"
- --listen-host
- 0.0.0.0
- --listen-port
- "8080"
- --set
- web_open_browser=false
- --set
- block_global=false
ports:
- "${MITMPROXY_WEB_PORT:-8086}:8081"
- "${MITMPROXY_PROXY_PORT:-8087}:8080"
volumes:
- ./data:/home/mitmproxy/.mitmproxy

1
d2ypp2/services/neko/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
data/

View File

@@ -0,0 +1,85 @@
#!/bin/sh
set -eu
family="${1:-chromium}"
start_url="${NEKO_START_URL:-about:blank}"
arch="$(uname -m 2>/dev/null || echo unknown)"
prune_path() {
target="${1:-}"
[ -n "$target" ] || return 0
[ -e "$target" ] || return 0
rm -rf "$target"
}
find_bin() {
if [ "$family" = "google-chrome" ]; then
command -v google-chrome 2>/dev/null || command -v google-chrome-stable 2>/dev/null || true
else
command -v chromium 2>/dev/null || command -v chromium-browser 2>/dev/null || true
fi
}
browser_bin="$(find_bin)"
if [ -z "$browser_bin" ]; then
exit 0
fi
profile_dir="/home/neko/.config/chromium"
if [ "$family" = "google-chrome" ]; then
profile_dir="/home/neko/.config/google-chrome"
fi
render_mode="${NEKO_BROWSER_RENDER_MODE:-auto}"
render_flags="--disable-gpu --use-gl=swiftshader --enable-unsafe-swiftshader"
session_flags=""
case "$render_mode" in
auto)
case "$arch:$family" in
x86_64:google-chrome|amd64:google-chrome)
render_flags="--disable-gpu --disable-software-rasterizer"
session_flags="--bwsi"
;;
esac
;;
gpu)
render_flags=""
;;
legacy|x11|disable-gpu)
render_flags="--disable-gpu --disable-software-rasterizer"
;;
software|swiftshader)
render_flags="--disable-gpu --use-gl=swiftshader --enable-unsafe-swiftshader"
;;
esac
mkdir -p "$profile_dir"
prune_path "$profile_dir/SingletonCookie"
prune_path "$profile_dir/SingletonLock"
prune_path "$profile_dir/SingletonSocket"
prune_path "$profile_dir/SingletonStartupLock"
prune_path "$profile_dir/BrowserMetrics"
prune_path "$profile_dir/Crash Reports"
prune_path "$profile_dir/Crashpad"
prune_path "$profile_dir/ShaderCache"
prune_path "$profile_dir/GrShaderCache"
prune_path "$profile_dir/GraphiteDawnCache"
prune_path "$profile_dir/Default/Cache"
prune_path "$profile_dir/Default/Code Cache"
prune_path "$profile_dir/Default/GPUCache"
prune_path "$profile_dir/Default/DawnGraphiteCache"
prune_path "$profile_dir/Default/DawnWebGPUCache"
exec "$browser_bin" \
${render_flags} \
--window-position=0,0 \
--display="${DISPLAY:?DISPLAY is required}" \
--user-data-dir="$profile_dir" \
--password-store=basic \
--no-first-run \
${session_flags} \
--start-maximized \
--force-dark-mode \
--disable-file-system \
--disable-dev-shm-usage \
"$start_url"

View File

@@ -0,0 +1,33 @@
[program:chromium]
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s"
command=/usr/bin/chromium
--window-position=0,0
--display=%(ENV_DISPLAY)s
--user-data-dir=/home/neko/.config/chromium
--no-first-run
--start-maximized
--bwsi
--force-dark-mode
--disable-file-system
--disable-gpu
--disable-software-rasterizer
--disable-dev-shm-usage
stopsignal=INT
autorestart=true
priority=800
user=%(ENV_USER)s
stdout_logfile=/var/log/neko/chromium.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
redirect_stderr=true
[program:openbox]
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s"
command=/usr/bin/openbox --config-file /etc/neko/openbox.xml
autorestart=true
priority=300
user=%(ENV_USER)s
stdout_logfile=/var/log/neko/openbox.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
redirect_stderr=true

View File

@@ -0,0 +1,80 @@
x-neko-common: &neko-common
image: "${NEKO_IMAGE:-ghcr.io/m1k1o/neko/chromium:3.0.0}"
restart: unless-stopped
shm_size: "${NEKO_SHM_SIZE:-2gb}"
cap_add:
- SYS_ADMIN
x-neko-env: &neko-env
DISPLAY: ":99.0"
NEKO_DESKTOP_SCREEN: "${NEKO_DESKTOP_SCREEN}"
NEKO_SERVER_BIND: ":8080"
NEKO_MEMBER_PROVIDER: "multiuser"
NEKO_MEMBER_MULTIUSER_USER_PASSWORD: "${NEKO_USER_PASS}"
NEKO_MEMBER_MULTIUSER_ADMIN_PASSWORD: "${NEKO_ADMIN_PASS}"
NEKO_WEBRTC_ICELITE: "${NEKO_WEBRTC_ICELITE}"
NEKO_WEBRTC_NAT1TO1: "${NEKO_WEBRTC_NAT1TO1}"
NEKO_PLUGINS_ENABLED: "${NEKO_PLUGINS_ENABLED}"
NEKO_PLUGINS_DIR: "/etc/neko/plugins/"
NEKO_START_URL: "${NEKO_START_URL}"
services:
neko1:
<<: *neko-common
container_name: live-neko-1
environment:
<<: *neko-env
NEKO_WEBRTC_EPR: "${NEKO_WEBRTC_EPR_1}"
NEKO_WEBRTC_TCPMUX: "${NEKO_WEBRTC_TCPMUX_1}"
NEKO_WEBRTC_UDPMUX: "${NEKO_WEBRTC_UDPMUX_1}"
ports:
- "${NEKO_HTTP_PORT_1}:8080"
- "${NEKO_WEBRTC_TCPMUX_1}:${NEKO_WEBRTC_TCPMUX_1}/tcp"
- "${NEKO_WEBRTC_UDPMUX_1}:${NEKO_WEBRTC_UDPMUX_1}/udp"
- "${NEKO_WEBRTC_UDP_RANGE_1}:${NEKO_WEBRTC_UDP_RANGE_1}/udp"
volumes:
- "${NEKO_PROFILE_HOST_DIR_1}:/home/neko/.config/chromium"
- "${NEKO_PROFILE_HOST_DIR_1}:/home/neko/.config/google-chrome"
- "./policies:/etc/chromium/policies/managed:ro"
- "./policies:/etc/opt/chrome/policies/managed:ro"
- "./${NEKO_BROWSER_SUPERVISOR_CONF}:/etc/neko/supervisord/browser.conf:ro"
neko2:
<<: *neko-common
container_name: live-neko-2
environment:
<<: *neko-env
NEKO_WEBRTC_EPR: "${NEKO_WEBRTC_EPR_2}"
NEKO_WEBRTC_TCPMUX: "${NEKO_WEBRTC_TCPMUX_2}"
NEKO_WEBRTC_UDPMUX: "${NEKO_WEBRTC_UDPMUX_2}"
ports:
- "${NEKO_HTTP_PORT_2}:8080"
- "${NEKO_WEBRTC_TCPMUX_2}:${NEKO_WEBRTC_TCPMUX_2}/tcp"
- "${NEKO_WEBRTC_UDPMUX_2}:${NEKO_WEBRTC_UDPMUX_2}/udp"
- "${NEKO_WEBRTC_UDP_RANGE_2}:${NEKO_WEBRTC_UDP_RANGE_2}/udp"
volumes:
- "${NEKO_PROFILE_HOST_DIR_2}:/home/neko/.config/chromium"
- "${NEKO_PROFILE_HOST_DIR_2}:/home/neko/.config/google-chrome"
- "./policies:/etc/chromium/policies/managed:ro"
- "./policies:/etc/opt/chrome/policies/managed:ro"
- "./${NEKO_BROWSER_SUPERVISOR_CONF}:/etc/neko/supervisord/browser.conf:ro"
neko3:
<<: *neko-common
container_name: live-neko-3
environment:
<<: *neko-env
NEKO_WEBRTC_EPR: "${NEKO_WEBRTC_EPR_3}"
NEKO_WEBRTC_TCPMUX: "${NEKO_WEBRTC_TCPMUX_3}"
NEKO_WEBRTC_UDPMUX: "${NEKO_WEBRTC_UDPMUX_3}"
ports:
- "${NEKO_HTTP_PORT_3}:8080"
- "${NEKO_WEBRTC_TCPMUX_3}:${NEKO_WEBRTC_TCPMUX_3}/tcp"
- "${NEKO_WEBRTC_UDPMUX_3}:${NEKO_WEBRTC_UDPMUX_3}/udp"
- "${NEKO_WEBRTC_UDP_RANGE_3}:${NEKO_WEBRTC_UDP_RANGE_3}/udp"
volumes:
- "${NEKO_PROFILE_HOST_DIR_3}:/home/neko/.config/chromium"
- "${NEKO_PROFILE_HOST_DIR_3}:/home/neko/.config/google-chrome"
- "./policies:/etc/chromium/policies/managed:ro"
- "./policies:/etc/opt/chrome/policies/managed:ro"
- "./${NEKO_BROWSER_SUPERVISOR_CONF}:/etc/neko/supervisord/browser.conf:ro"

View File

@@ -0,0 +1,33 @@
[program:google-chrome]
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s"
command=/usr/bin/google-chrome
--window-position=0,0
--display=%(ENV_DISPLAY)s
--user-data-dir=/home/neko/.config/google-chrome
--no-first-run
--start-maximized
--bwsi
--force-dark-mode
--disable-file-system
--disable-gpu
--disable-software-rasterizer
--disable-dev-shm-usage
stopsignal=INT
autorestart=true
priority=800
user=%(ENV_USER)s
stdout_logfile=/var/log/neko/google-chrome.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
redirect_stderr=true
[program:openbox]
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s"
command=/usr/bin/openbox --config-file /etc/neko/openbox.xml
autorestart=true
priority=300
user=%(ENV_USER)s
stdout_logfile=/var/log/neko/openbox.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
redirect_stderr=true

View File

@@ -0,0 +1,21 @@
{
"ExtensionInstallForcelist": [
"dhdgffkkebhmkfjojejmpbldmpobfkfo;https://clients2.google.com/service/update2/crx"
],
"ExtensionInstallAllowlist": ["*"],
"ExtensionInstallBlocklist": [],
"DownloadRestrictions": 0,
"AllowFileSelectionDialogs": true,
"URLAllowlist": ["file:///home/neko/Downloads/*"],
"DefaultCookiesSetting": 1,
"RestoreOnStartup": 1,
"AutoplayAllowed": true,
"DefaultPopupsSetting": 1,
"DefaultNotificationsSetting": 1,
"VideoCaptureAllowed": true,
"AudioCaptureAllowed": true,
"VideoCaptureAllowedUrls": ["https://*.google.com/*", "https://*.youtube.com/*"],
"AudioCaptureAllowedUrls": ["https://*.google.com/*", "https://*.youtube.com/*"],
"DeveloperToolsAvailability": 2,
"DefaultGeolocationSetting": 1
}

View File

@@ -0,0 +1,39 @@
version: "3.3"
services:
openclaw-gateway:
image: "${OPENCLAW_IMAGE:-ghcr.io/openclaw/openclaw:latest}"
container_name: live-openclaw
restart: unless-stopped
init: true
environment:
HOME: /home/node
TERM: xterm-256color
OPENCLAW_GATEWAY_TOKEN: "${OPENCLAW_GATEWAY_TOKEN:-12345678}"
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS: "${OPENCLAW_ALLOW_INSECURE_PRIVATE_WS:-1}"
TZ: "${OPENCLAW_TZ:-UTC}"
volumes:
- "${OPENCLAW_CONFIG_DIR:-/var/lib/live-openclaw/config}:/home/node/.openclaw"
- "${OPENCLAW_WORKSPACE_DIR:-/var/lib/live-openclaw/workspace}:/home/node/.openclaw/workspace"
ports:
- "${OPENCLAW_GATEWAY_PORT:-18789}:18789"
- "${OPENCLAW_BRIDGE_PORT:-18790}:18790"
command:
- node
- dist/index.js
- gateway
- --allow-unconfigured
- --bind
- "${OPENCLAW_GATEWAY_BIND:-lan}"
- --port
- "18789"
healthcheck:
test:
- CMD
- node
- -e
- fetch('http://127.0.0.1:18789/healthz').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))
interval: 30s
timeout: 5s
retries: 5
start_period: 20s

View File

@@ -0,0 +1,41 @@
listen 1935;
max_connections 1000;
daemon off;
srs_log_tank console;
http_api {
enabled on;
listen 1985;
}
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
srt_server {
enabled on;
listen 10080;
}
vhost __defaultVhost__ {
tcp_nodelay on;
min_latency on;
play {
gop_cache off;
queue_length 1;
}
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
hls {
enabled on;
hls_path ./objs/nginx/html;
hls_fragment 3;
hls_window 18;
}
}

View File

@@ -0,0 +1,51 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>SRS · Live Hub</title>
<style>
:root { color-scheme: dark; }
body { font-family: system-ui, sans-serif; max-width: 42rem; margin: 2rem auto; padding: 0 1rem;
background: #0c0c0f; color: #e4e4e7; line-height: 1.5; }
h1 { font-size: 1.25rem; margin-bottom: 0.5rem; }
p { color: #a1a1aa; font-size: 0.9rem; }
ul { padding-left: 1.2rem; }
a { color: #7dd3fc; text-decoration: none; }
a:hover { text-decoration: underline; }
.card { border: 1px solid #27272a; border-radius: 0.75rem; padding: 1rem 1.25rem; margin-top: 1rem;
background: #18181b; }
code { background: #27272a; padding: 0.1em 0.35em; border-radius: 0.25rem; font-size: 0.85em; }
</style>
</head>
<body>
<h1>SRS 流媒体(本机)</h1>
<p>此页由仓库内 <code>services/srs/data/index.html</code> 提供;静态目录挂载后根路径不再 404。</p>
<div class="card">
<p><strong>常用入口</strong></p>
<ul>
<li><a id="api-versions" href="#">SRS HTTP API — 版本信息 (JSON)</a></li>
<li><a id="api-summaries" href="#">SRS — 摘要接口</a></li>
</ul>
</div>
<div class="card">
<p><strong>端口说明(默认)</strong></p>
<ul>
<li><code>1935</code> RTMP 推/拉流</li>
<li><code>1985</code> HTTP API</li>
<li><code>8080</code> 本页与 HLS/HTTP 静态</li>
<li><code>10080/udp</code> SRT</li>
</ul>
</div>
<script>
(function () {
var h = location.hostname || "live.local";
var api = "http://" + h + ":1985";
var av = document.getElementById("api-versions");
var as = document.getElementById("api-summaries");
if (av) { av.href = api + "/api/v1/versions"; }
if (as) { as.href = api + "/api/v1/summaries"; }
})();
</script>
</body>
</html>

View File

@@ -0,0 +1,16 @@
version: "3.3"
services:
srs:
image: ossrs/srs:5
container_name: live-srs
restart: unless-stopped
ports:
- "${SRS_RTMP_PORT:-1935}:1935"
- "${SRS_API_PORT:-1985}:1985"
- "${SRS_HTTP_PORT:-8080}:8080"
- "${SRS_SRT_PORT:-10080}:10080/udp"
volumes:
- ./conf/srs.conf:/usr/local/srs/conf/live.conf:ro
- ./data:/usr/local/srs/objs/nginx/html
command: ["./objs/srs", "-c", "conf/live.conf"]

View File

@@ -0,0 +1,11 @@
version: "3.3"
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: live-uptime-kuma
restart: unless-stopped
ports:
- "${UPTIME_KUMA_PORT:-3001}:3001"
volumes:
- ./data:/app/data

View File

@@ -0,0 +1,21 @@
version: "3.3"
services:
code-server:
image: codercom/code-server:latest
container_name: live-code-server
restart: unless-stopped
environment:
PASSWORD: "${VSCODE_SERVER_PASSWORD:-12345678}"
HOME: /home/coder
command:
- --bind-addr
- 0.0.0.0:8080
- --auth
- password
- /workspace
ports:
- "${VSCODE_SERVER_PORT:-8440}:8080"
volumes:
- ./config:/home/coder/.local/share/code-server
- ../..:/workspace