feat: 프린터실 카메라 웹코덱(WebRTC/MSE) 전환 + K2 콤보 카메라 프록시, 옛 3D프린터 앱 제거

- go2rtc가 CORS/Origin 체크로 브라우저 직접접속을 막던 문제 해결: 클라이언트
  스크립트를 벤더링해 같은 오리진으로 서빙하고, WS는 게이트웨이 프록시
  (attachGo2rtcWsProxy)가 Origin을 다시 써서 우회. CCTV 앱의 프린터실 카메라
  라이브뷰가 MJPEG 대신 WebRTC/MSE를 쓰도록 전환(대역폭 절감).
- go2rtc mjpeg 트랜스코더가 멈추는 경우를 감지해 자동 재기동하는
  /api/nvr/mjpeg-health 엔드포인트 추가.
- 신규 3D프린터(K2 콤보, Klipper 스탠드얼론)의 내장 WebRTC 카메라 시그널링을
  프록시하는 /api/k2/webrtc-signal 추가 — 홈클로가 HTTPS로 서빙되는데 카메라가
  평문 HTTP만 지원해 브라우저 mixed-content 차단을 우회하기 위함.
- 옛 3D프린터(단종된 Anet A8 Plus, OctoPrint) 앱과 홈 드롭다운 링크 제거.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PppKcQmeTJDQCpfcgKietu
This commit is contained in:
kim
2026-09-18 22:40:10 +09:00
co-authored by Claude Sonnet 5
parent e7a86d6f2d
commit a8149c136a
10 changed files with 1045 additions and 66 deletions
+4 -1
View File
@@ -131,7 +131,8 @@ import { summarizeSkillForApi } from '../tools/skills.js';
import { getToolRegistry } from '../tools/registry.js';
import { registerSettingsRoutes } from './routes/settings.js';
import { registerImagegenRoutes } from './routes/imagegen.js';
import { registerNvrRoutes } from './routes/nvr.js';
import { registerNvrRoutes, attachGo2rtcWsProxy } from './routes/nvr.js';
import { registerK2Routes } from './routes/routes-k2.js';
import {
browserOpen,
browserSnapshot,
@@ -3561,6 +3562,7 @@ async function runTaskHeartbeat(): Promise<void> {
registerSettingsRoutes(app);
registerImagegenRoutes(app);
registerNvrRoutes(app);
registerK2Routes(app);
// Fetch available Ollama models (proxies Ollama /api/tags), with vision capability flag
app.get('/api/ollama/models', async (_req, res) => {
@@ -4646,6 +4648,7 @@ attachAndroidWsProxy(server, getSessionUser);
attachAndroidConsoleWsProxy(server, getSessionUser);
attachComfyUIWsProxy(server, getSessionUserFromUpgradeReq);
attachVoiceRealtimeWsProxy(server, getSessionUserFromUpgradeReq);
attachGo2rtcWsProxy(server, getSessionUserFromUpgradeReq);
wss.on('error', (err: any) => {
if (err?.code === 'EADDRINUSE') {
console.error(`[Gateway] Port ${HOST}:${PORT} is already in use.`);