[{"data":1,"prerenderedAt":698},["ShallowReactive",2],{"doc-\u002Fdocs\u002Fworkstations\u002Ftelemetry-and-terminal":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"body":10,"_type":692,"_id":693,"_source":694,"_file":695,"_stem":696,"_extension":697},"\u002Fworkstations\u002Ftelemetry-and-terminal","workstations",false,"","Web Terminal & Live Telemetry","In-browser interactive terminal sessions, real-time SSE metrics, and live stdout\u002Fstderr log streaming.",{"type":11,"children":12,"toc":681},"root",[13,21,34,38,45,50,92,101,108,280,283,289,294,319,325,561,564,570,591,618,624,675],{"type":14,"tag":15,"props":16,"children":18},"element","h1",{"id":17},"web-terminal-live-telemetry",[19],{"type":20,"value":8},"text",{"type":14,"tag":22,"props":23,"children":24},"p",{},[25,32],{"type":14,"tag":26,"props":27,"children":29},"code",{"className":28},[],[30],{"type":20,"value":31},"webtop-manage",{"type":20,"value":33}," integrates low-overhead, browser-native developer tools directly into the management dashboard.",{"type":14,"tag":35,"props":36,"children":37},"hr",{},[],{"type":14,"tag":39,"props":40,"children":42},"h2",{"id":41},"️-in-browser-websocket-web-terminal",[43],{"type":20,"value":44},"🖥️ In-Browser WebSocket Web Terminal",{"type":14,"tag":22,"props":46,"children":47},{},[48],{"type":20,"value":49},"Open a direct interactive root shell into any running workstation without configuring SSH keys or running terminal emulators on your local machine:",{"type":14,"tag":51,"props":52,"children":53},"ol",{},[54,76],{"type":14,"tag":55,"props":56,"children":57},"li",{},[58,60,66,68,74],{"type":20,"value":59},"Click the ",{"type":14,"tag":61,"props":62,"children":63},"strong",{},[64],{"type":20,"value":65},"Terminal",{"type":20,"value":67}," icon (",{"type":14,"tag":26,"props":69,"children":71},{"className":70},[],[72],{"type":20,"value":73},">_",{"type":20,"value":75},") on any running instance card.",{"type":14,"tag":55,"props":77,"children":78},{},[79,81,90],{"type":20,"value":80},"The interactive modal launches an integrated ",{"type":14,"tag":61,"props":82,"children":83},{},[84],{"type":14,"tag":26,"props":85,"children":87},{"className":86},[],[88],{"type":20,"value":89},"xterm.js",{"type":20,"value":91}," console session connected over secure WebSockets.",{"type":14,"tag":93,"props":94,"children":96},"pre",{"code":95},"┌─────────────────────────────────────────────────────────────┐\n│ Interactive Terminal — sonic-ubuntu-850               [✕]   │\n├─────────────────────────────────────────────────────────────┤\n│ [webtop-manage] Connecting to interactive shell...          │\n│ [Connected] Interactive session ready.                      │\n│                                                             │\n│ abc@sonic-ubuntu-850:~$ uname -a                            │\n│ Linux sonic-ubuntu-850 6.6.137 #1 SMP PREEMPT x86_64 GNU    │\n│ abc@sonic-ubuntu-850:~$ docker --version                    │\n│ Docker version 24.0.7, build afdd53b                        │\n│ abc@sonic-ubuntu-850:~$ _                                   │\n└─────────────────────────────────────────────────────────────┘\n",[97],{"type":14,"tag":26,"props":98,"children":99},{"__ignoreMap":7},[100],{"type":20,"value":95},{"type":14,"tag":102,"props":103,"children":105},"h3",{"id":104},"technical-protocol-details",[106],{"type":20,"value":107},"Technical Protocol Details",{"type":14,"tag":109,"props":110,"children":111},"ul",{},[112,130,164,254],{"type":14,"tag":55,"props":113,"children":114},{},[115,120,122,128],{"type":14,"tag":61,"props":116,"children":117},{},[118],{"type":20,"value":119},"Endpoint:",{"type":20,"value":121}," ",{"type":14,"tag":26,"props":123,"children":125},{"className":124},[],[126],{"type":20,"value":127},"GET \u002Fapi\u002Finstances\u002F{id}\u002Fterminal",{"type":20,"value":129}," (WS upgrade)",{"type":14,"tag":55,"props":131,"children":132},{},[133,138,140,146,148,154,156,162],{"type":14,"tag":61,"props":134,"children":135},{},[136],{"type":20,"value":137},"PTY Execution:",{"type":20,"value":139}," Uses Docker Go SDK ",{"type":14,"tag":26,"props":141,"children":143},{"className":142},[],[144],{"type":20,"value":145},"ContainerExecCreate",{"type":20,"value":147}," to spawn ",{"type":14,"tag":26,"props":149,"children":151},{"className":150},[],[152],{"type":20,"value":153},"\u002Fbin\u002Fbash",{"type":20,"value":155}," with fallback to ",{"type":14,"tag":26,"props":157,"children":159},{"className":158},[],[160],{"type":20,"value":161},"\u002Fbin\u002Fsh",{"type":20,"value":163},".",{"type":14,"tag":55,"props":165,"children":166},{},[167,172,174],{"type":14,"tag":61,"props":168,"children":169},{},[170],{"type":20,"value":171},"Dynamic Window Resizing:",{"type":20,"value":173}," The browser window automatically transmits PTY dimensions when resized:\n",{"type":14,"tag":93,"props":175,"children":179},{"code":176,"language":177,"meta":7,"className":178,"style":7},"{ \"type\": \"resize\", \"cols\": 120, \"rows\": 40 }\n","json","language-json shiki shiki-themes github-dark github-dark github-light",[180],{"type":14,"tag":26,"props":181,"children":182},{"__ignoreMap":7},[183],{"type":14,"tag":184,"props":185,"children":188},"span",{"class":186,"line":187},"line",1,[189,195,201,206,212,217,222,226,231,235,240,244,249],{"type":14,"tag":184,"props":190,"children":192},{"style":191},"--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E",[193],{"type":20,"value":194},"{ ",{"type":14,"tag":184,"props":196,"children":198},{"style":197},"--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5",[199],{"type":20,"value":200},"\"type\"",{"type":14,"tag":184,"props":202,"children":203},{"style":191},[204],{"type":20,"value":205},": ",{"type":14,"tag":184,"props":207,"children":209},{"style":208},"--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62",[210],{"type":20,"value":211},"\"resize\"",{"type":14,"tag":184,"props":213,"children":214},{"style":191},[215],{"type":20,"value":216},", ",{"type":14,"tag":184,"props":218,"children":219},{"style":197},[220],{"type":20,"value":221},"\"cols\"",{"type":14,"tag":184,"props":223,"children":224},{"style":191},[225],{"type":20,"value":205},{"type":14,"tag":184,"props":227,"children":228},{"style":197},[229],{"type":20,"value":230},"120",{"type":14,"tag":184,"props":232,"children":233},{"style":191},[234],{"type":20,"value":216},{"type":14,"tag":184,"props":236,"children":237},{"style":197},[238],{"type":20,"value":239},"\"rows\"",{"type":14,"tag":184,"props":241,"children":242},{"style":191},[243],{"type":20,"value":205},{"type":14,"tag":184,"props":245,"children":246},{"style":197},[247],{"type":20,"value":248},"40",{"type":14,"tag":184,"props":250,"children":251},{"style":191},[252],{"type":20,"value":253}," }\n",{"type":14,"tag":55,"props":255,"children":256},{},[257,262,264,270,272,278],{"type":14,"tag":61,"props":258,"children":259},{},[260],{"type":20,"value":261},"Security & CSWSH Protection:",{"type":20,"value":263}," The server verifies the ",{"type":14,"tag":26,"props":265,"children":267},{"className":266},[],[268],{"type":20,"value":269},"Origin",{"type":20,"value":271}," header against loopback origins and ",{"type":14,"tag":26,"props":273,"children":275},{"className":274},[],[276],{"type":20,"value":277},"r.Host",{"type":20,"value":279},", preventing unauthorized cross-site hijacking.",{"type":14,"tag":35,"props":281,"children":282},{},[],{"type":14,"tag":39,"props":284,"children":286},{"id":285},"real-time-live-telemetry-gauges",[287],{"type":20,"value":288},"📈 Real-Time Live Telemetry Gauges",{"type":14,"tag":22,"props":290,"children":291},{},[292],{"type":20,"value":293},"Each instance card on the dashboard features live CPU and Memory meters that update continuously over Server-Sent Events:",{"type":14,"tag":93,"props":295,"children":298},{"code":296,"language":20,"meta":7,"className":297,"style":7},"CPU     [█████████░░░░░░░░░░░░░░░░░░░░░]  2.4%\nMemory  [████████████████░░░░░░░░░░░░░]  384 MB (19%)\n","language-text shiki shiki-themes github-dark github-dark github-light",[299],{"type":14,"tag":26,"props":300,"children":301},{"__ignoreMap":7},[302,310],{"type":14,"tag":184,"props":303,"children":304},{"class":186,"line":187},[305],{"type":14,"tag":184,"props":306,"children":307},{},[308],{"type":20,"value":309},"CPU     [█████████░░░░░░░░░░░░░░░░░░░░░]  2.4%\n",{"type":14,"tag":184,"props":311,"children":313},{"class":186,"line":312},2,[314],{"type":14,"tag":184,"props":315,"children":316},{},[317],{"type":20,"value":318},"Memory  [████████████████░░░░░░░░░░░░░]  384 MB (19%)\n",{"type":14,"tag":102,"props":320,"children":322},{"id":321},"telemetry-stream-mechanism",[323],{"type":20,"value":324},"Telemetry Stream Mechanism",{"type":14,"tag":109,"props":326,"children":327},{},[328,352,370],{"type":14,"tag":55,"props":329,"children":330},{},[331,335,336,342,344,350],{"type":14,"tag":61,"props":332,"children":333},{},[334],{"type":20,"value":119},{"type":20,"value":121},{"type":14,"tag":26,"props":337,"children":339},{"className":338},[],[340],{"type":20,"value":341},"GET \u002Fapi\u002Finstances\u002F{id}\u002Fstats",{"type":20,"value":343}," (",{"type":14,"tag":26,"props":345,"children":347},{"className":346},[],[348],{"type":20,"value":349},"text\u002Fevent-stream",{"type":20,"value":351},")",{"type":14,"tag":55,"props":353,"children":354},{},[355,360,362,368],{"type":14,"tag":61,"props":356,"children":357},{},[358],{"type":20,"value":359},"Low Daemon Overhead:",{"type":20,"value":361}," Reads native Docker container stats streams with ",{"type":14,"tag":26,"props":363,"children":365},{"className":364},[],[366],{"type":20,"value":367},"\u003C 15MB",{"type":20,"value":369}," daemon RAM footprint.",{"type":14,"tag":55,"props":371,"children":372},{},[373,378],{"type":14,"tag":61,"props":374,"children":375},{},[376],{"type":20,"value":377},"Calculated Data Format:",{"type":14,"tag":93,"props":379,"children":381},{"code":380,"language":177,"meta":7,"className":178,"style":7},"event: stats\ndata: {\n  \"cpu_percent\": 2.4,\n  \"memory_usage_mb\": 384.2,\n  \"memory_limit_mb\": 4096.0,\n  \"memory_percent\": 9.38,\n  \"network_rx_mb\": 1.25,\n  \"network_tx_mb\": 0.84,\n  \"pids\": 32\n}\n",[382],{"type":14,"tag":26,"props":383,"children":384},{"__ignoreMap":7},[385,393,401,424,446,468,490,512,534,552],{"type":14,"tag":184,"props":386,"children":387},{"class":186,"line":187},[388],{"type":14,"tag":184,"props":389,"children":390},{"style":191},[391],{"type":20,"value":392},"event: stats\n",{"type":14,"tag":184,"props":394,"children":395},{"class":186,"line":312},[396],{"type":14,"tag":184,"props":397,"children":398},{"style":191},[399],{"type":20,"value":400},"data: {\n",{"type":14,"tag":184,"props":402,"children":404},{"class":186,"line":403},3,[405,410,414,419],{"type":14,"tag":184,"props":406,"children":407},{"style":197},[408],{"type":20,"value":409},"  \"cpu_percent\"",{"type":14,"tag":184,"props":411,"children":412},{"style":191},[413],{"type":20,"value":205},{"type":14,"tag":184,"props":415,"children":416},{"style":197},[417],{"type":20,"value":418},"2.4",{"type":14,"tag":184,"props":420,"children":421},{"style":191},[422],{"type":20,"value":423},",\n",{"type":14,"tag":184,"props":425,"children":427},{"class":186,"line":426},4,[428,433,437,442],{"type":14,"tag":184,"props":429,"children":430},{"style":197},[431],{"type":20,"value":432},"  \"memory_usage_mb\"",{"type":14,"tag":184,"props":434,"children":435},{"style":191},[436],{"type":20,"value":205},{"type":14,"tag":184,"props":438,"children":439},{"style":197},[440],{"type":20,"value":441},"384.2",{"type":14,"tag":184,"props":443,"children":444},{"style":191},[445],{"type":20,"value":423},{"type":14,"tag":184,"props":447,"children":449},{"class":186,"line":448},5,[450,455,459,464],{"type":14,"tag":184,"props":451,"children":452},{"style":197},[453],{"type":20,"value":454},"  \"memory_limit_mb\"",{"type":14,"tag":184,"props":456,"children":457},{"style":191},[458],{"type":20,"value":205},{"type":14,"tag":184,"props":460,"children":461},{"style":197},[462],{"type":20,"value":463},"4096.0",{"type":14,"tag":184,"props":465,"children":466},{"style":191},[467],{"type":20,"value":423},{"type":14,"tag":184,"props":469,"children":471},{"class":186,"line":470},6,[472,477,481,486],{"type":14,"tag":184,"props":473,"children":474},{"style":197},[475],{"type":20,"value":476},"  \"memory_percent\"",{"type":14,"tag":184,"props":478,"children":479},{"style":191},[480],{"type":20,"value":205},{"type":14,"tag":184,"props":482,"children":483},{"style":197},[484],{"type":20,"value":485},"9.38",{"type":14,"tag":184,"props":487,"children":488},{"style":191},[489],{"type":20,"value":423},{"type":14,"tag":184,"props":491,"children":493},{"class":186,"line":492},7,[494,499,503,508],{"type":14,"tag":184,"props":495,"children":496},{"style":197},[497],{"type":20,"value":498},"  \"network_rx_mb\"",{"type":14,"tag":184,"props":500,"children":501},{"style":191},[502],{"type":20,"value":205},{"type":14,"tag":184,"props":504,"children":505},{"style":197},[506],{"type":20,"value":507},"1.25",{"type":14,"tag":184,"props":509,"children":510},{"style":191},[511],{"type":20,"value":423},{"type":14,"tag":184,"props":513,"children":515},{"class":186,"line":514},8,[516,521,525,530],{"type":14,"tag":184,"props":517,"children":518},{"style":197},[519],{"type":20,"value":520},"  \"network_tx_mb\"",{"type":14,"tag":184,"props":522,"children":523},{"style":191},[524],{"type":20,"value":205},{"type":14,"tag":184,"props":526,"children":527},{"style":197},[528],{"type":20,"value":529},"0.84",{"type":14,"tag":184,"props":531,"children":532},{"style":191},[533],{"type":20,"value":423},{"type":14,"tag":184,"props":535,"children":537},{"class":186,"line":536},9,[538,543,547],{"type":14,"tag":184,"props":539,"children":540},{"style":197},[541],{"type":20,"value":542},"  \"pids\"",{"type":14,"tag":184,"props":544,"children":545},{"style":191},[546],{"type":20,"value":205},{"type":14,"tag":184,"props":548,"children":549},{"style":197},[550],{"type":20,"value":551},"32\n",{"type":14,"tag":184,"props":553,"children":555},{"class":186,"line":554},10,[556],{"type":14,"tag":184,"props":557,"children":558},{"style":191},[559],{"type":20,"value":560},"}\n",{"type":14,"tag":35,"props":562,"children":563},{},[],{"type":14,"tag":39,"props":565,"children":567},{"id":566},"live-container-logs-console",[568],{"type":20,"value":569},"📜 Live Container Logs Console",{"type":14,"tag":22,"props":571,"children":572},{},[573,575,581,583,589],{"type":20,"value":574},"Stream real-time ",{"type":14,"tag":26,"props":576,"children":578},{"className":577},[],[579],{"type":20,"value":580},"stdout",{"type":20,"value":582}," and ",{"type":14,"tag":26,"props":584,"children":586},{"className":585},[],[587],{"type":20,"value":588},"stderr",{"type":20,"value":590}," logs for troubleshooting application startup and background processes:",{"type":14,"tag":51,"props":592,"children":593},{},[594,605],{"type":14,"tag":55,"props":595,"children":596},{},[597,598,603],{"type":20,"value":59},{"type":14,"tag":61,"props":599,"children":600},{},[601],{"type":20,"value":602},"Live Logs",{"type":20,"value":604}," icon on any instance card.",{"type":14,"tag":55,"props":606,"children":607},{},[608,610,616],{"type":20,"value":609},"The log viewer opens an SSE stream (",{"type":14,"tag":26,"props":611,"children":613},{"className":612},[],[614],{"type":20,"value":615},"GET \u002Fapi\u002Finstances\u002F{id}\u002Flogs?tail=150",{"type":20,"value":617},").",{"type":14,"tag":102,"props":619,"children":621},{"id":620},"console-controls",[622],{"type":20,"value":623},"Console Controls",{"type":14,"tag":109,"props":625,"children":626},{},[627,637,647,665],{"type":14,"tag":55,"props":628,"children":629},{},[630,635],{"type":14,"tag":61,"props":631,"children":632},{},[633],{"type":20,"value":634},"Pause \u002F Resume Stream",{"type":20,"value":636},": Freeze the stream to inspect errors without autoscroll interruptions.",{"type":14,"tag":55,"props":638,"children":639},{},[640,645],{"type":14,"tag":61,"props":641,"children":642},{},[643],{"type":20,"value":644},"Real-time Filter",{"type":20,"value":646},": Live search through buffered logs by keyword.",{"type":14,"tag":55,"props":648,"children":649},{},[650,655,657,663],{"type":14,"tag":61,"props":651,"children":652},{},[653],{"type":20,"value":654},"Download",{"type":20,"value":656},": Export the full log buffer as a clean ",{"type":14,"tag":26,"props":658,"children":660},{"className":659},[],[661],{"type":20,"value":662},".txt",{"type":20,"value":664}," file for external debugging.",{"type":14,"tag":55,"props":666,"children":667},{},[668,673],{"type":14,"tag":61,"props":669,"children":670},{},[671],{"type":20,"value":672},"Clear",{"type":20,"value":674},": Wipe the visual console buffer.",{"type":14,"tag":676,"props":677,"children":678},"style",{},[679],{"type":20,"value":680},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":7,"searchDepth":403,"depth":403,"links":682},[683,686,689],{"id":41,"depth":312,"text":44,"children":684},[685],{"id":104,"depth":403,"text":107},{"id":285,"depth":312,"text":288,"children":687},[688],{"id":321,"depth":403,"text":324},{"id":566,"depth":312,"text":569,"children":690},[691],{"id":620,"depth":403,"text":623},"markdown","content:2.workstations:3.telemetry-and-terminal.md","content","2.workstations\u002F3.telemetry-and-terminal.md","2.workstations\u002F3.telemetry-and-terminal","md",1787169590134]