From 6b763899427ec66e49563e6cad1b099405a0c792 Mon Sep 17 00:00:00 2001 From: LGram16 Date: Wed, 10 Dec 2025 22:50:35 +0900 Subject: [PATCH] initial commit --- README.md | 148 ++++++++-------- README_JA.md | 129 -------------- README_KO.md | 139 --------------- README_ZH.md | 139 --------------- server/proto/application.go | 1 + server/router/application.go | 2 + server/service/application/manual_update.go | 161 ++++++++++++++++++ server/service/application/version.go | 3 +- server/service/extensions/tailscale/cli.go | 4 +- server/utils/copy_file.go | 39 +++++ web/src/api/application.ts | 28 +++ .../desktop/menu/settings/update/index.tsx | 93 +++++++++- 12 files changed, 393 insertions(+), 493 deletions(-) delete mode 100644 README_JA.md delete mode 100644 README_KO.md delete mode 100644 README_ZH.md create mode 100644 server/service/application/manual_update.go create mode 100644 server/utils/copy_file.go diff --git a/README.md b/README.md index f9ec10b..8860573 100644 --- a/README.md +++ b/README.md @@ -6,38 +6,38 @@ NanoKVM ![](https://wiki.sipeed.com/hardware/assets/NanoKVM/introduce/NanoKVM_3.png)

- ๐Ÿš€ Quick Start + ๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ | - ๐Ÿ› ๏ธ Hardware Details + ๐Ÿ› ๏ธ ํ•˜๋“œ์›จ์–ด ์ •๋ณด | - ๐Ÿ’พ Firmware Releases + ๐Ÿ’พ ํŽŒ์›จ์–ด ๋ฆด๋ฆฌ์ฆˆ

-English | [ไธญๆ–‡](./README_ZH.md) | [ๆ—ฅๆœฌ่ชž](./README_JA.md) | [ํ•œ๊ตญ์–ด](./README_KO.md) +[English](./README.md) | [ไธญๆ–‡](./README_ZH.md) | [ๆ—ฅๆœฌ่ชž](./README_JA.md) | ํ•œ๊ตญ์–ด -## ๐ŸŒŸ What is NanoKVM? +## ๐ŸŒŸ NanoKVM์ด ๋ฌด์—‡์ธ๊ฐ€์š”? -NanoKVM is a series of compact, open-source IP-KVM devices. Built upon the LicheeRV Nano (RISC-V), NanoKVM allows you to remotely access and control computers as if you were sitting right in front of them โ€“ perfect for managing servers, embedded systems, or any headless machine. +NanoKVM์€ ์†Œํ˜• ์˜คํ”ˆ ์†Œ์Šค IP-KVM ์žฅ์น˜ ์‹œ๋ฆฌ์ฆˆ์ž…๋‹ˆ๋‹ค. LicheeRV Nano(RISC-V)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ NanoKVM์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งˆ์น˜ ์ปดํ“จํ„ฐ ์•ž์— ๋ฐ”๋กœ ์•‰์•„์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์›๊ฒฉ์œผ๋กœ ์ปดํ“จํ„ฐ์— ์ ‘๊ทผํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด ์„œ๋ฒ„, ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ ๋˜๋Š” ๋ชจ๋“  ํ—ค๋“œ๋ฆฌ์Šค ๋จธ์‹ ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค. -## ๐Ÿ“ฆ Product Family +## ๐Ÿ“ฆ ์ œํ’ˆ๊ตฐ -We offer several NanoKVM versions to suit your needs: +๋‹ค์–‘ํ•œ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๋Ÿฌ NanoKVM ๋ฒ„์ „์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค: -* **NanoKVM-Cube Lite:** A barebones kit for DIY enthusiasts and enterprise users needing bulk deployment. -* **NanoKVM-Cube Full:** A complete package with a sleek case, accessories, and a pre-flashed system SD card. Ready to use out-of-the-box, ideal for individual users. -* **NanoKVM-PCIe:** A unique form factor with a PCIe bracket for internal chassis mounting, drawing power directly from a PCIe slot. And add optional WiFi and PoE functions. +* **NanoKVM-Cube Lite:** DIY ์‚ฌ์šฉ์ž ๋ฐ ๋Œ€๋Ÿ‰ ๋ฐฐํฌ๊ฐ€ ํ•„์š”ํ•œ ๊ธฐ์—…์šฉ์„ ์œ„ํ•œ ์ตœ์†Œ ๊ตฌ์„ฑ ํ‚คํŠธ์ž…๋‹ˆ๋‹ค. +* **NanoKVM-Cube Full:** ์„ธ๋ จ๋œ ์ผ€์ด์Šค, ์•ก์„ธ์„œ๋ฆฌ, ์‚ฌ์ „ ํ”Œ๋ž˜์‹œ๋œ ์‹œ์Šคํ…œ SD ์นด๋“œ๊ฐ€ ํฌํ•จ๋œ ์™„์ „ ๊ตฌ์„ฑ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ด‰ ํ›„ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ์ธ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. +* **NanoKVM-PCIe:** ๋…ํŠนํ•œ ํผํŒฉํ„ฐ๋กœ, PCIe ๋ธŒ๋ž˜ํ‚ท์„ ํ†ตํ•ด ์„€์‹œ ๋‚ด๋ถ€์— ์žฅ์ฐฉํ•˜๋ฉฐ, ์ „์›์ธ PCIe ์Šฌ๋กฏ์—์„œ ์ง์ ‘ ๊ณต๊ธ‰๋ฐ›์Šต๋‹ˆ๋‹ค. ์„ ํƒ์ ์œผ๋กœ WiFi์™€ PoE ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -### ๐Ÿš€ NanoKVM-Pro: The 4K Powerhouse +### ๐Ÿš€ NanoKVM-Pro: 4K๋ฅผ ์œ„ํ•œ ํŒŒ์›Œ ๋จธ์‹  -Based on popular demand, we've upgraded NanoKVM to the **NanoKVM-Pro**: +๋Œ€์ค‘์ ์ธ ์ˆ˜์š”๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ, NanoKVM์„ **NanoKVM-Pro**๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค: -* **Resolution Upgrade:** From 1080P to stunning **4K@30fps / 2K@60fps**. -* **Network Upgrade:** Blazing fast **GbE + PoE + WiFi 6** (up from 100M Ethernet). -* **Latency Upgrade:** Encoder accelerated latency reduced from 100-150ms to **50-100ms**. +* **ํ•ด์ƒ๋„ ์—…๊ทธ๋ ˆ์ด๋“œ:** 1080P์—์„œ ๋†€๋ผ์šด **4K@30fps / 2K@60fps**๊นŒ์ง€. +* **๋„คํŠธ์›Œํฌ ์—…๊ทธ๋ ˆ์ด๋“œ:** ์ดˆ๊ณ ์† **GbE + PoE + WiFi 6** (100M ์ด๋”๋„ท ๋Œ€๋น„ ํ–ฅ์ƒ). +* **์ง€์—ฐ ์‹œ๊ฐ„ ์—…๊ทธ๋ ˆ์ด๋“œ:** ์ธ์ฝ”๋” ๊ฐ€์† ์ง€์—ฐ์‹œ๊ฐ„์ด 100-150ms์—์„œ **50-100ms**๋กœ ๊ฐ์†Œ. -> The NanoKVM-Pro is now available for pre-sale! [Click here for product details](https://sipeed.com/nanokvm/pro). +> NanoKVM-Pro๊ฐ€ ์˜ˆ์•ฝ ํŒ๋งค ์ค‘์ž…๋‹ˆ๋‹ค! [์ œํ’ˆ ์„ธ๋ถ€ ์ •๋ณด๋Š” ์—ฌ๊ธฐ๋ฅผ ํด๋ฆญํ•˜์„ธ์š”](https://sipeed.com/nanokvm/pro).
@@ -45,95 +45,95 @@ Based on popular demand, we've upgraded NanoKVM to the **NanoKVM-Pro**:
-## ๐Ÿ› ๏ธ Technical Specifications +## ๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์‚ฌ์–‘ -| Product | NanoKVM-Pro | NanoKVM (Cube/PCIe) | GxxKVM | JxxKVM | +| ์ œํ’ˆ | NanoKVM-Pro | NanoKVM (Cube/PCIe) | GxxKVM | JxxKVM | |------------------- |-------------------------------------- |---------------------------------- |----------------------------------- |------------------------------------ | -| Core | AX631 2xA53 1.5G | SG2002 1xC906 1.0G | RV1126 4xA7 1.5G | RV1106 1xA7 1.2G | -| Memory & Storage | 1G LPDDR4X + 32G eMMC | 256M DDR3 + 32G microSD | 1G DDR3 + 8G eMMc | 256M DDR3 + 16G eMMC | -| System | NanoKVM / PiKVM | NanoKVM | GxxKVM | JxxKVM | -| Resolution | 4K@30fps / 2K@60fps | 1080P@60fps | 4K@30fps / 2K@60fps | 1080P@60fps | -| HDMI Loopout | 4K loopout | x | x | x | -| Video Encoding | MJPEG / H.264 / H.265 | MJPEG / H264 | MJPEG / H264 | MJPEG / H264 | -| Audio Transmit | โœ“ | x | โœ“ | x | +| ์ฝ”์–ด | AX631 2xA53 1.5G | SG2002 1xC906 1.0G | RV1126 4xA7 1.5G | RV1106 1xA7 1.2G | +| ๋ฉ”๋ชจ๋ฆฌ & ์ €์žฅ ๊ณต๊ฐ„ | 1G LPDDR4X + 32G eMMC | 256M DDR3 + 32G microSD | 1G DDR3 + 8G eMMc | 256M DDR3 + 16G eMMC | +| ์‹œ์Šคํ…œ | NanoKVM / PiKVM | NanoKVM | GxxKVM | JxxKVM | +| ํ•ด์ƒ๋„ | 4K@30fps / 2K@60fps | 1080P@60fps | 4K@30fps / 2K@60fps | 1080P@60fps | +| HDMI ๋ฃจํ”„์•„์›ƒ | 4K ๋ฃจํ”„์•„์›ƒ | x | x | x | +| ์˜์ƒ ์ธ์ฝ”๋”ฉ | MJPEG / H.264 / H.265 | MJPEG / H264 | MJPEG / H264 | MJPEG / H264 | +| ์˜ค๋””์˜ค ์ „์†ก | โœ“ | x | โœ“ | x | | UEFI / BIOS | โœ“ | โœ“ | โœ“ | โœ“ | -| Emulated USB Keyboard & Mouse | โœ“ | โœ“ | โœ“ | โœ“ | -| Emulated USB ISO | โœ“ | โœ“ | โœ“ | โœ“ | +| USB ํ‚ค๋ณด๋“œ & ๋งˆ์šฐ์Šค ์—๋ฎฌ๋ ˆ์ด์…˜ | โœ“ | โœ“ | โœ“ | โœ“ | +| USB ISO ์—๋ฎฌ๋ ˆ์ด์…˜ | โœ“ | โœ“ | โœ“ | โœ“ | | IPMI | โœ“ | โœ“ | โœ“ | x | | Wake-on-LAN | โœ“ | โœ“ | โœ“ | โœ“ | -| Web Terminal | โœ“ | โœ“ | โœ“ | โœ“ | -| Serial Terminal | 3 channels | 2 channels | x | 1 channel | -| Custom Scripts | โœ“ | โœ“ | x | x | -| Storage | 32G eMMC 300MB/s | 32G MicroSD 12MB/s | 8G eMMC 120MB/s | 8G eMMC 60MB/s | -| Ethernet | 1000M | 100M | 1000M | 100M | -| PoE | Optional | Optional | x | x | -| WiFi | Optional WiFi6 | Optional WiFi6 | x | x | -| ATX Power Control | โœ“ | โœ“ | Extra $15 | Extra $10 | -| Display | 1.47" 320x172 LCD / 0.96" 128x64 OLED | 0.96" 128x64 OLED | - | 1.68" 280x240 | -| More Features | Sync LED Strip / Smart Assistant | - | - | - | -| Power Consumption | 0.4A@5V | 0.2A@5V | 0.4A@5V | 0.2A@5V | -| Power Input | USB-C or PoE | USB-C | USB-C | USB-C | -| Dimensions | 65x65x26mm | 40x36x36mm | 80x60x17.5mm | 60x43x(24~31)mm | -| Price | ~~$79~~ $69 ATX / ~~$89~~ $79 Desk | $25 Lite / $50 Full(with ATX) | $89 no ATX / $102 with ATX | $69 no ATX / $79 with ATX | +| ์›น ํ„ฐ๋ฏธ๋„ | โœ“ | โœ“ | โœ“ | โœ“ | +| ์‹œ๋ฆฌ์–ผ ํ„ฐ๋ฏธ๋„ | 3 ์ฑ„๋„ | 2 ์ฑ„๋„ | x | 1 ์ฑ„๋„ | +| ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํฌ๋ฆฝํŠธ | โœ“ | โœ“ | x | x | +| ์ €์žฅ ๊ณต๊ฐ„ | 32G eMMC 300MB/s | 32G MicroSD 12MB/s | 8G eMMC 120MB/s | 8G eMMC 60MB/s | +| ์ด๋”๋„ท | 1000M | 100M | 1000M | 100M | +| PoE | ์˜ต์…˜ | ์˜ต์…˜ | x | x | +| WiFi | WiFi6 ์˜ต์…˜ | WiFi6 ์˜ต์…˜ | x | x | +| ATX ์ „์› ์กฐ์ž‘ | โœ“ | โœ“ | $15 ์ถ”๊ฐ€ | $10 ์ถ”๊ฐ€ | +| ๋””์Šคํ”Œ๋ ˆ์ด | 1.47" 320x172 LCD / 0.96" 128x64 OLED | 0.96" 128x64 OLED | - | 1.68" 280x240 | +| ๊ธฐํƒ€ ๊ธฐ๋Šฅ | LED ์ค„ ๋™๊ธฐํ™” / ์Šค๋งˆํŠธ ์–ด์‹œ์Šคํ„ดํŠธ | - | - | - | +| ์ „๋ ฅ ์†Œ๋น„๋Ÿ‰ | 0.4A@5V | 0.2A@5V | 0.4A@5V | 0.2A@5V | +| ์ „์› ์ž…๋ ฅ | USB-C ๋˜๋Š” PoE | USB-C | USB-C | USB-C | +| ํฌ๊ธฐ | 65x65x26mm | 40x36x36mm | 80x60x17.5mm | 60x43x(24~31)mm | +| ๊ฐ€๊ฒฉ | ~~$79~~ $69 ATX / ~~$89~~ $79 Desk | $25 Lite / $50 Full(with ATX) | ATX ๋ฏธ์‚ฌ์šฉ ์‹œ $89 / ATX ์‚ฌ์šฉ ์‹œ $102 | ATX ๋ฏธ์‚ฌ์šฉ ์‹œ $69 / ATX ์‚ฌ์šฉ ์‹œ $79 | -## ๐Ÿ“‚ Project Structure +## ๐Ÿ“‚ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ``` shell -โ”œโ”€โ”€ kvmapp # APP update package -โ”‚ โ”œโ”€โ”€ jpg_stream # Compatible for direct updates from very old versions -โ”‚ โ”œโ”€โ”€ kvm_new_app # Triggers necessary components for kvm_system update -โ”‚ โ”œโ”€โ”€ kvm_system # kvm_system application -โ”‚ โ”œโ”€โ”€ server # NanoKVM front-end and back-end applications -โ”‚ โ””โ”€โ”€ system # Necessary system components -โ”œโ”€โ”€ web # NanoKVM front-end -โ”œโ”€โ”€ server # NanoKVM back-end -โ”œโ”€โ”€ support # Auxiliary functions (image subsystem, system status, system updates, screen, keys, etc.) +โ”œโ”€โ”€ kvmapp # APP ์—…๋ฐ์ดํŠธ ํŒจํ‚ค์ง€ +โ”‚ โ”œโ”€โ”€ jpg_stream # ๋งค์šฐ ์˜ค๋ž˜๋œ ๋ฒ„์ „์—์„œ๋„ ์ง์ ‘ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ˜ธํ™˜๋จ +โ”‚ โ”œโ”€โ”€ kvm_new_app # kvm_system ์—…๋ฐ์ดํŠธ์— ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•จ +โ”‚ โ”œโ”€โ”€ kvm_system # kvm_system ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ +โ”‚ โ”œโ”€โ”€ server # NanoKVM ํ”„๋ก ํŠธ ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ +โ”‚ โ””โ”€โ”€ system # ํ•„์š”ํ•œ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ +โ”œโ”€โ”€ web # NanoKVM ํ”„๋ก ํŠธ์—”๋“œ +โ”œโ”€โ”€ server # NanoKVM ๋ฐฑ์—”๋“œ +โ”œโ”€โ”€ support # ๋ณด์กฐ ๊ธฐ๋Šฅ (์ด๋ฏธ์ง€ ํ•˜์œ„ ์‹œ์Šคํ…œ, ์‹œ์Šคํ…œ ์ƒํƒœ, ์‹œ์Šคํ…œ ์—…๋ฐ์ดํŠธ, ํ™”๋ฉด, ํ‚ค, ๊ธฐํƒ€.) โ”‚ โ”œโ”€โ”€ sg2002 # NanoKVM-Lite/Full/PCIe โ”‚ โ””โ”€โ”€ h618 # NanoKVM-Pro โ”œโ”€โ”€ ... ``` -## ๐Ÿ”ฉ Hardware Platform (NanoKVM Cube/PCIe) +## ๐Ÿ”ฉ ํ•˜๋“œ์›จ์–ด ํ”Œ๋žซํผ (NanoKVM Cube/PCIe) -NanoKVM is based on Sipeed [LicheeRV Nano](https://wiki.sipeed.com/hardware/zh/lichee/RV_Nano/1_intro.html)๏ผŒyou can find specifications, schematics, and dimensional drawings [here](http://cn.dl.sipeed.com/shareURL/LICHEE/LicheeRV_Nano). +NanoKVM์€ Sipeed [LicheeRV Nano](https://wiki.sipeed.com/hardware/zh/lichee/RV_Nano/1_intro.html)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ๏ผŒ[์—ฌ๊ธฐ](http://cn.dl.sipeed.com/shareURL/LICHEE/LicheeRV_Nano)์—์„œ ์‚ฌ์–‘, ๋„์‹, ์น˜์ˆ˜, ๋„๋ฉด์€ ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -The NanoKVM Lite is constructed by the LicheeRV Nano and HDMItoCSI board, and the NanoKVM FULL adds the NanoKVM-A/B board and shell to the NanoKVM Lite. The HDMItoCSI board is used to convert the HDMI signal; NanoKVM-A, including OLED, ATX control output (USB Type-C interface), auxiliary power supply and ATX power on/off and reset buttons; The NanoKVM-B is connected to the plate at one end and the computer at the other end is connected to the computer ATX-Pin, which is used to remotely control the power of the computer. +NanoKVM Lite๋Š” LicheeRV Nano์™€ HDMItoCSI ๋ณด๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, NanoKVM FULL์€ NanoKVM Lite์— NasnoKVM-A/B ๋ณด๋“œ์™€ ์ผ€์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. HDMItoCSI ๋ณด๋“œ๋Š” HDMI ์‹ ํ˜ธ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ  NanoKVM-A๋Š” OLED, ATX ์ „์› ์ถœ๋ ฅ (USB Type-C ์ธํ„ฐํŽ˜์ด์Šค), ๋ณด์กฐ ์ „์› ๊ณต๊ธ‰ ์žฅ์น˜, ATX ์ „์› ์ผœ๊ธฐ/๋„๊ธฐ ๋ฐ ๋ฆฌ์…‹ ๋ฒ„ํŠผ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. NanoKVM-B๋Š” ํ•œ์ชฝ ๋์ด ์ปดํ“จํ„ฐ์™€ ์—ฐ๊ฒฐ๋˜๊ณ  ๋‹ค๋ฅธ ํ•œ์ชฝ ๋์€ ์ปดํ“จํ„ฐ์˜ ATX ํ•€์— ์—ฐ๊ฒฐ๋˜์–ด ์ปดํ“จํ„ฐ์˜ ์ „์›์„ ์›๊ฒฉ์œผ๋กœ ์ œ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. -The NanoKVM image is built on LicheeRV Nano SDK and MaixCDK, and is compatible with materials that use the LicheeRV Nano, opposite the KVM software cannot be used with the LicheeRV Nano or other SG2002 products. If you would like to build an HDMI input application on LicheeRV Nano or MaixCam, please contact us for technical support. +NanoKVM ์ด๋ฏธ์ง€๋Š” LicheeRV Nano SDK์™€ MaixCDK๋กœ ๊ตฌ์ถ•๋˜์—ˆ์œผ๋ฉฐ, LicheeRV Nano๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž์žฌ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— KVM ์†Œํ”„ํŠธ์›จ์–ด๋Š” LicheeRV Nano๋‚˜ ๋‹ค๋ฅธ SG2002 ์ œํ’ˆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ LicheeRV Nano๋‚˜ MaixCam์—์„œ HDMI ์ž…๋ ฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด, ๊ธฐ์ˆ  ์ง€์›์— ๋ฌธ์˜ํ•ด ์ฃผ์„ธ์š”. -Note: Out of the 256MB memory in SG2002, 158MB is currently allocated for the multimedia subsystem, which NanoKVM will use for video image acquisition and processing. +์ฐธ๊ณ : SG2002์˜ 256MB ๋ฉ”๋ชจ๋ฆฌ ์ค‘์— 158MB๋Š” ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ํ•˜์œ„ ํด๋”์— ํ• ๋‹น๋˜์–ด ์žˆ์œผ๋ฉฐ, NanoKVM์€ ๋น„๋””์˜ค ์ด๋ฏธ์ง€ ํš๋“๊ณผ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. -* [NanoKVM-A Schematic](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_A_30111.pdf) -* [NanoKVM-B Schematic](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_B_30131.pdf) -* [NanoKVM img](https://github.com/sipeed/NanoKVM/releases/tag/NanoKVM) +* [NanoKVM-A ๋„์‹](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_A_30111.pdf) +* [NanoKVM-B ๋„์‹](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_B_30131.pdf) +* [NanoKVM ์ด๋ฏธ์ง€](https://github.com/sipeed/NanoKVM/releases/tag/NanoKVM) ![NanoKVM PCB Pinout](https://wiki.sipeed.com/hardware/zh/kvm/assets/NanoKVM/1_intro/NanoKVM_2.jpg) -## ๐Ÿค Contributing +## ๐Ÿค ๊ธฐ์—ฌ -We welcome contributions! Here's how you can help: +์—ฌ๋Ÿฌ๋ถ„์˜ ๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: -1. Fork the repository. -2. Create a feature branch. -3. Commit your changes. -4. Push to the branch. -5. Open a Pull Request. +1. ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํฌํฌํ•˜์„ธ์š” +2. ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“œ์„ธ์š” +3. ๋ณ€๊ฒฝํ•œ ๊ฒƒ์„ ์ปค๋ฐ‹ํ•˜์„ธ์š” +4. ๋ธŒ๋žœ์น˜๋กœ ํ‘ธ์‹œํ•˜์„ธ์š” +5. ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š” Please keep your pull requests small and focused to facilitate easier review and merging. -> ๐ŸŽ **Contributors who submit high-quality Pull Requests may receive a NanoKVM Cube, PCIe, or Pro as a token of our appreciation!** +> ๐ŸŽ **๊ณ ํ’ˆ์งˆ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ์ถœํ•œ ๊ธฐ์—ฌ์ž๋Š” ๊ฐ์‚ฌ์˜ ํ‘œ์‹œ๋กœ NanoKVM Cube, PCIe, ๋˜๋Š” Pro๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!** -## ๐Ÿ›’ Where to Buy +## ๐Ÿ›’ ์–ด๋””์„œ ๊ตฌ๋งคํ•˜๋‚˜์š”? -* [Aliexpress(global except USA&Russia)](https://www.aliexpress.com/item/1005007369816019.html) +* [Aliexpress(๋ฏธ๊ตญ&๋Ÿฌ์‹œ์•„๋ฅผ ์ œ์™ธํ•œ ์ „ ์„ธ๊ณ„)](https://www.aliexpress.com/item/1005007369816019.html) * [ๆท˜ๅฎ](https://item.taobao.com/item.htm?id=811206560480) -* [Preorder (any other country that not support in Aliexpress or Taobao)](https://sipeed.com/nanokvm) +* [์‚ฌ์ „ ์ฃผ๋ฌธ (Aliexpress๋‚˜ Taobao๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ตญ๊ฐ€)](https://sipeed.com/nanokvm) -## ๐Ÿ’ฌ Community & Support +## ๐Ÿ’ฌ ์ปค๋ฎค๋‹ˆํ‹ฐ & ์ง€์› * [MaixHub Discussion](https://maixhub.com/discussion/nanokvm) * QQ group: 703230713 -## ๐Ÿ“œ License +## ๐Ÿ“œ ๋ผ์ด์„ผ์Šค -This project is licensed under the GPL-3.0 License - see the LICENSE file for details. +์ด ํ”„๋กœ์ ํŠธ๋Š” GPL-3.0 ๋ผ์ด์„ผ์Šค์— ๋”ฐ๋ผ ๋ผ์ด์„ผ์Šค๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”. diff --git a/README_JA.md b/README_JA.md deleted file mode 100644 index b880048..0000000 --- a/README_JA.md +++ /dev/null @@ -1,129 +0,0 @@ -NanoKVM -====== - -
- -![](https://wiki.sipeed.com/hardware/assets/NanoKVM/introduce/NanoKVM_3.png) - -

- ใ‚ฏใ‚คใƒƒใ‚ฏใ‚นใ‚ฟใƒผใƒˆ - | - ใƒใƒผใƒ‰ใ‚ฆใ‚งใ‚ข -

- -[English](./README.md) | [ไธญๆ–‡](./README_ZH.md) | ๆ—ฅๆœฌ่ชž | [ํ•œ๊ตญ์–ด](./README_KO.md) - -
- -> NanoKVM ใฏ [RISC-V](https://en.wikipedia.org/wiki/RISC-V) ใ‚’ๆญ่ผ‰ใ—ใฆใ„ใพใ™๏ผ -> ไฝฟ็”จไธญใซๅ•้กŒใ‚„ๆๆกˆใŒใ‚ใ‚‹ๅ ดๅˆใฏใ€ใ“ใ“ใง issue ใ‚’ๆๅ‡บใ™ใ‚‹ใ‹ใ€[MaixHub Discussion](https://maixhub.com/discussion/nanokvm) ใงใŠ็Ÿฅใ‚‰ใ›ใใ ใ•ใ„ใ€‚ - -## ใ‚ชใƒผใƒ—ใƒณใ‚ฝใƒผใ‚น & ใ‚ณใƒณใƒˆใƒชใƒ“ใƒฅใƒผใ‚ทใƒงใƒณ - -### 2025.02.19 ๆ›ดๆ–ฐ - -NanoKVM ใฎใ™ในใฆใฎใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใฏใ‚ชใƒผใƒ—ใƒณใ‚ฝใƒผใ‚นๅŒ–ใ•ใ‚ŒใฆใŠใ‚Šใ€[front-end](https://github.com/sipeed/NanoKVM/tree/main/web)ใ€[back-end](https://github.com/sipeed/NanoKVM/tree/main/server)ใ€[kvm_vision](https://github.com/sipeed/NanoKVM/tree/main/vision/components/kvm)ใ€[kvm_mmf](https://github.com/sipeed/NanoKVM/tree/main/vision/components/kvm_mmf)ใ€[kvm_system](https://github.com/sipeed/NanoKVM/tree/main/support)ใ€[kvmapp update package](https://github.com/sipeed/NanoKVM-System/tree/main/kvmapp)ใ€[system sdk](https://github.com/sipeed/LicheeRV-Nano-Build/tree/NanoKVM)ใ€[packaging methods](https://github.com/sipeed/LicheeRV-Nano-Build/blob/NanoKVM/kvm/NanoKVM_img.sh)ใŒๅซใพใ‚Œใพใ™ใ€‚ - -### 2025.02.14 ๆ›ดๆ–ฐ - -ๆœ€ๆ–ฐใฎใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใƒใƒผใ‚ธใƒงใƒณ v2.1.6 ใซใฏใ€ๅคšใใฎใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃๅผทๅŒ–ใจใƒใ‚ฐไฟฎๆญฃใŒ่ฟฝๅŠ ใ•ใ‚Œใฆใ„ใ‚‹ใŸใ‚ใ€ไธ€่ˆฌใฎใƒฆใƒผใ‚ถใƒผใฏใ“ใฎใƒใƒผใ‚ธใƒงใƒณไปฅ้™ใธใฎใ‚ขใƒƒใƒ—ใ‚ฐใƒฌใƒผใƒ‰ใ‚’ใŠๅ‹งใ‚ใ—ใพใ™ใ€‚ - -### 2025.02.05 ๆ›ดๆ–ฐ - -ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚’ๆ‡ธๅฟตใ—ใฆใ„ใ‚‹ใƒฆใƒผใ‚ถใƒผใฏใ€ใ“ใฎ issue ใ‚’ใŠ่ชญใฟใใ ใ•ใ„: ใ€ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใซ้–ขใ™ใ‚‹ใ™ในใฆใฎๆ‡ธๅฟตไบ‹้ …ใซใคใ„ใฆ่ชฌๆ˜Žใ•ใ‚Œใฆใ„ใพใ™ใ€‚ -GitHub ใฏใ€ใ‚ชใƒผใƒ—ใƒณใง้€ๆ˜Žๆ€งใฎใ‚ใ‚‹ใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ใจใ—ใฆใ€ใ„ใ‚ใ‚†ใ‚‹ใ€Œใƒใƒƒใ‚ฏใƒ‰ใ‚ขใ€ใฎๆ‡ธๅฟตไบ‹้ …ใ‚’่ญฐ่ซ–ใ™ใ‚‹ๅ ดใ‚’ๆไพ›ใ—ใฆใ„ใพใ™ใ€‚ใ‚ชใƒผใƒ—ใƒณใ‚ฝใƒผใ‚นใงใ‚ใ‚‹ใ“ใจใซใ‚ˆใ‚Šใ€่ฃฝๅ“ใฎใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใŒใ•ใ‚‰ใซๅผทๅŒ–ใ•ใ‚Œใพใ™๏ผ - -### 2024.10.18 ๆ›ดๆ–ฐ - -10/08ใซใƒใƒƒใ‚ฏใ‚จใƒณใƒ‰ใ‚ณใƒผใƒ‰ใ‚’ใ‚ชใƒผใƒ—ใƒณใ‚ฝใƒผใ‚นๅŒ–ใ—ใพใ—ใŸใ€‚ใ™ใใซPRใ‚’ๆๅ‡บใ—ใฆใใ‚ŒใŸCivilใซๆ„Ÿ่ฌใ—ใพใ™ใ€‚ๆœ€ๆ–ฐใฎNanoKVM-PCIeใ‚’ๅ ฑ้…ฌใจใ—ใฆๆไพ›ใ—ใพใ™๏ผ -10ๆœˆไธญๆ—ฌใฎใƒใƒƒใƒใฏใƒ†ใ‚นใƒˆใจใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใƒณใ‚ฐใ‚’้–‹ๅง‹ใ—ใฆใŠใ‚Šใ€10/01ไปฅๅ‰ใฎใปใจใ‚“ใฉใฎๆณจๆ–‡ใฏๆฌก้€ฑใจๆฌกใ€…้€ฑใซๅ‡บ่ทใ•ใ‚Œใพใ™ใ€‚ -10/01ไปฅ้™ใ€ใ‚ขใƒชใ‚จใ‚ฏใ‚นใƒ—ใƒฌใ‚นใฎๅ‡บ่ทๆ—ฅใฏ12ๆœˆใซๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸใ€‚ใ“ใ‚Œใฏไฟๅฎˆ็š„ใช็ดๆœŸใงใ™ใ€‚10ๆœˆใฎๆณจๆ–‡ใฏ11/15ใ€œ12/15ใฎ้–“ใซ็™บ้€ใ•ใ‚Œใ‚‹ไบˆๅฎšใงใ™ใ€‚ - -## ็ดนไป‹ - -Lichee NanoKVMใฏใ€LicheeRV Nanoใ‚’ใƒ™ใƒผใ‚นใซใ—ใŸIP-KVM่ฃฝๅ“ใงใ€LicheeRV Nanoใฎๆฅตๅฐใ‚ตใ‚คใ‚บใจๅผทๅŠ›ใชๆฉŸ่ƒฝใ‚’็ถ™ๆ‰ฟใ—ใฆใ„ใพใ™ใ€‚ -Lichee NanoKVMใฏ2ใคใฎใƒใƒผใ‚ธใƒงใƒณใŒใ‚ใ‚Šใพใ™๏ผš -NanoKVM LiteใฏๅŸบๆœฌๆง‹ๆˆใงใ€ไธ€ๅฎšใฎDIY่ƒฝๅŠ›ใ‚’ๆŒใคๅ€‹ไบบใƒฆใƒผใ‚ถใƒผใ‚„ๅคง้‡ใฎใƒ‹ใƒผใ‚บใ‚’ๆŒใคไผๆฅญใƒฆใƒผใ‚ถใƒผใซ้ฉใ—ใฆใ„ใพใ™ใ€‚ -NanoKVM FullใฏๅฎŒๅ…จ็‰ˆใงใ€ๆด—็ทดใ•ใ‚ŒใŸใ‚ฑใƒผใ‚นใจๅฎŒๅ…จใชใ‚ขใ‚ฏใ‚ปใ‚ตใƒชใƒผใ‚’ๅ‚™ใˆใ€่ตทๅ‹•ๆ™‚ใซใ™ใใซไฝฟ็”จใงใใ‚‹ใ‚ทใ‚นใƒ†ใƒ ใƒŸใƒฉใƒผใ‚ซใƒผใƒ‰ใŒๅ†…่”ตใ•ใ‚ŒใฆใŠใ‚Šใ€ๅ€‹ไบบใƒฆใƒผใ‚ถใƒผใซๆŽจๅฅจใ•ใ‚Œใพใ™ใ€‚ - -![NanoKVM ๅˆ†่งฃ็”ปๅƒ](https://wiki.sipeed.com/hardware/zh/kvm/assets/NanoKVM/1_intro/NanoKVM_1.jpg) - -## ๆŠ€่ก“ไป•ๆง˜ - -| ่ฃฝๅ“ | NanoKVM (Lite) | NanoKVM (Full) | PiKVM V4 | -|----------------------- |-------------------------------------- |---------------------------------- |----------------------------------- | -| ่จˆ็ฎ—ใƒฆใƒ‹ใƒƒใƒˆ | LicheeRV Nano(RISCV) | LicheeRV Nano(RISCV) | CM4 (ARM) | -| ่งฃๅƒๅบฆ | 1080P @ 60fps | 1080P @ 60fps | 1080P @ 60fps | -| ใƒ“ใƒ‡ใ‚ชใ‚จใƒณใ‚ณใƒผใƒ‡ใ‚ฃใƒณใ‚ฐ | MJPEG, H264 | MJPEG, H264 | MJPEG, H264 | -| ใƒ“ใƒ‡ใ‚ช้…ๅปถ | 90๏ฝž230ms | 90๏ฝž230ms | 100๏ฝž230ms | -| UEFI/BIOS | โœ“ | โœ“ | โœ“ | -| ไปฎๆƒณHID | โœ“ | โœ“ | โœ“ | -| ไปฎๆƒณCD-ROM | โœ“ | โœ“ | โœ“ | -| IPMI | โœ“ | โœ“ | โœ“ | -| Wake-on-LAN | โœ“ | โœ“ | โœ“ | -| ETH | 100M/10M | 100M/10M | 1000M/100M/10M | -| ATX้›ปๆบๅˆถๅพก | ใชใ—ใ€ใƒฆใƒผใ‚ถใƒผใŒ่‡ชๅˆ†ใงๆŽฅ็ถš | USBใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚นIOๅˆถๅพกใƒœใƒผใƒ‰ | RJ-45ใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚นIOๅˆถๅพกใƒœใƒผใƒ‰ | -| OLED | ใชใ—ใ€ใƒฆใƒผใ‚ถใƒผใŒ่‡ชๅˆ†ใงๆŽฅ็ถš | 128x64 0.96" ็™ฝ | 128x32 0.91" ็™ฝ | -| UART | 2 | 2 | 1 | -| TFใ‚ซใƒผใƒ‰ | ใชใ— | โœ“ | โœ“ | -| ๆ‹กๅผต | ใชใ— | PoE | WiFi/LTE | -| ๆถˆ่ฒป้›ปๅŠ› | 0.2A@5V | 0.2A@5V | ใƒ”ใƒผใ‚ฏๆ™‚ 2.6A@5V | -| ้›ปๆบๅ…ฅๅŠ› | PC USBใง็ตฆ้›ปๅฏ่ƒฝ | PC USBใพใŸใฏ่ฃœๅŠฉ้›ปๆบ | DC 5V 3A้›ปๆบใŒๅฟ…่ฆ | -| ๅ†ทๅด | ้™้Ÿณใƒ•ใ‚กใƒณใƒฌใ‚น | ้™้Ÿณใƒ•ใ‚กใƒณใƒฌใ‚น | ใƒ•ใ‚กใƒณๅ†ทๅด | -| ใ‚ตใ‚คใ‚บ | 23x37x15mm ๏ฝž1/30 PiKVM V4ใ‚ตใ‚คใ‚บ | 40x36x36mm ๏ฝž1/7 PiKVM V4ใ‚ตใ‚คใ‚บ | 120x68x44mm | - -![NanoKVM PCB ใƒ”ใƒณ้…็ฝฎ](https://wiki.sipeed.com/hardware/zh/kvm/assets/NanoKVM/1_intro/NanoKVM_2.jpg) - -## NanoKVM ใƒใƒผใƒ‰ใ‚ฆใ‚งใ‚ขใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ  - -NanoKVMใฏSipeed [LicheeRV Nano](https://wiki.sipeed.com/hardware/zh/lichee/RV_Nano/1_intro.html)ใซๅŸบใฅใ„ใฆใŠใ‚Šใ€ไป•ๆง˜ใ€ๅ›ž่ทฏๅ›ณใ€ๅฏธๆณ•ๅ›ณใฏ[ใ“ใกใ‚‰](http://cn.dl.sipeed.com/shareURL/LICHEE/LicheeRV_Nano)ใง็ขบ่ชใงใใพใ™ใ€‚ - -NanoKVM LiteใฏLicheeRV NanoใจHDMItoCSIใƒœใƒผใƒ‰ใงๆง‹ๆˆใ•ใ‚Œใ€NanoKVM FULLใฏNanoKVM LiteใซNanoKVM-A/Bใƒœใƒผใƒ‰ใจใ‚ทใ‚งใƒซใ‚’่ฟฝๅŠ ใ—ใฆใ„ใพใ™ใ€‚HDMItoCSIใƒœใƒผใƒ‰ใฏHDMIไฟกๅทใ‚’ๅค‰ๆ›ใ™ใ‚‹ใŸใ‚ใซไฝฟ็”จใ•ใ‚Œใพใ™ใ€‚NanoKVM-AใซใฏOLEDใ€ATXๅˆถๅพกๅ‡บๅŠ›๏ผˆUSB Type-Cใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚น๏ผ‰ใ€่ฃœๅŠฉ้›ปๆบไพ›็ตฆใŠใ‚ˆใณATX้›ปๆบใ‚ชใƒณ/ใ‚ชใƒ•ใŠใ‚ˆใณใƒชใ‚ปใƒƒใƒˆใƒœใ‚ฟใƒณใŒๅซใพใ‚Œใฆใ„ใพใ™ใ€‚NanoKVM-Bใฏไธ€็ซฏใŒAใƒœใƒผใƒ‰ใซๆŽฅ็ถšใ•ใ‚Œใ€ไป–็ซฏใŒใ‚ณใƒณใƒ”ใƒฅใƒผใ‚ฟใฎATXใƒ”ใƒณใซๆŽฅ็ถšใ•ใ‚Œใ€ใ‚ณใƒณใƒ”ใƒฅใƒผใ‚ฟใฎ้›ปๆบใ‚’ใƒชใƒขใƒผใƒˆใงๅˆถๅพกใ—ใพใ™ใ€‚ - -NanoKVMใ‚คใƒกใƒผใ‚ธใฏLicheeRV Nano SDKใŠใ‚ˆใณMaixCDKใซๅŸบใฅใ„ใฆๆง‹็ฏ‰ใ•ใ‚ŒใฆใŠใ‚Šใ€LicheeRV Nanoใ‚’ไฝฟ็”จใ™ใ‚‹่ณ‡ๆ–™ใจไบ’ๆ›ๆ€งใŒใ‚ใ‚Šใพใ™ใ€‚้€†ใซใ€KVMใ‚ฝใƒ•ใƒˆใ‚ฆใ‚งใ‚ขใฏLicheeRV Nanoใ‚„ไป–ใฎSG2002่ฃฝๅ“ใงใฏไฝฟ็”จใงใใพใ›ใ‚“ใ€‚LicheeRV Nanoใ‚„MaixCamใงHDMIๅ…ฅๅŠ›ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚’ๆง‹็ฏ‰ใ—ใŸใ„ๅ ดๅˆใฏใ€ๆŠ€่ก“ใ‚ตใƒใƒผใƒˆใ‚’ๅ—ใ‘ใ‚‹ใŸใ‚ใซใŠๅ•ใ„ๅˆใ‚ใ›ใใ ใ•ใ„ใ€‚ - -ๆณจ๏ผšSG2002ใฎ256MBใƒกใƒขใƒชใฎใ†ใกใ€็พๅœจ158MBใŒใƒžใƒซใƒใƒกใƒ‡ใ‚ฃใ‚ขใ‚ตใƒ–ใ‚ทใ‚นใƒ†ใƒ ใซๅ‰ฒใ‚Šๅฝ“ใฆใ‚‰ใ‚ŒใฆใŠใ‚Šใ€NanoKVMใฏใƒ“ใƒ‡ใ‚ช็”ปๅƒใฎๅ–ๅพ—ใจๅ‡ฆ็†ใซใ“ใฎใƒกใƒขใƒชใ‚’ไฝฟ็”จใ—ใพใ™ใ€‚ - -+ [NanoKVM-A ๅ›ž่ทฏๅ›ณ](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_A_30111.pdf) -+ [NanoKVM-B ๅ›ž่ทฏๅ›ณ](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_HDMI_MIPI_31011.pdf) -+ [NanoKVM ใ‚คใƒกใƒผใ‚ธใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰](https://github.com/sipeed/NanoKVM/releases/tag/NanoKVM) - -## ใƒญใƒผใƒ‰ใƒžใƒƒใƒ— - -### Q1 2025 - -**ๆ”นๅ–„:** - -- [x] HDMI ใƒขใ‚ธใƒฅใƒผใƒซใ‚’ใƒชใƒ•ใ‚กใ‚ฏใ‚ฟใƒชใƒณใ‚ฐใ—ใ€libmaixcam_lib.so ใฎไพๅญ˜้–ขไฟ‚ใ‚’ๅ‰Š้™ค -- [x] SSH ใ‚’ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใง็„กๅŠนใซใ—ใ€Web UI ใซๆœ‰ๅŠน/็„กๅŠนใฎๅˆ‡ใ‚Šๆ›ฟใˆใ‚’่ฟฝๅŠ  -- [x] Tailscale ใ‚’ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใง็„กๅŠนใซใ—ใ€Web UI ใซๆœ‰ๅŠน/็„กๅŠนใฎๅˆ‡ใ‚Šๆ›ฟใˆใ‚’่ฟฝๅŠ  -- [x] ่จญๅฎšใƒ•ใ‚กใ‚คใƒซใซ JWT ่จญๅฎšใ‚ชใƒ—ใ‚ทใƒงใƒณใ‚’่ฟฝๅŠ  -- [x] bcrypt ใ‚’ๅˆฉ็”จใ—ใŸใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ‚นใƒˆใƒฌใƒผใ‚ธใฎใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃไฟ่ญท - -**้…ๅธƒ:** - -- [x] GitHub ็ตŒ็”ฑใงใฎใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณ้…ๅธƒ -- [x] ใ‚ชใƒณใƒฉใ‚คใƒณใงใฎๆ›ดๆ–ฐใฎ้š›ใซๆ•ดๅˆๆ€งใƒใ‚งใƒƒใ‚ฏใ‚’ๅฎŸๆ–ฝ -- [ ] ใ‚ชใƒ•ใƒฉใ‚คใƒณใงใฎๆ›ดๆ–ฐใ‚’ใ‚ตใƒใƒผใƒˆ - -**ใƒใ‚ฐไฟฎๆญฃ:** - -- [x] DNS ใฎๅ•้กŒใ‚’ไฟฎๆญฃ -- [x] CSRF ใฎ่„†ๅผฑๆ€งใ‚’ไฟฎๆญฃ - -**ๆฉŸ่ƒฝ** - -- [ ] [79](https://github.com/sipeed/NanoKVM/issues/79) Zerotier ใ‚’ใ‚ตใƒใƒผใƒˆ -- [ ] [99](https://github.com/sipeed/NanoKVM/issues/99) WireGuard ใ‚’ใ‚ตใƒใƒผใƒˆ -- [ ] [249](https://github.com/sipeed/NanoKVM/issues/249) Mouse Jiggler ใ‚’่ฟฝๅŠ  - -## ่ณผๅ…ฅๆ–นๆณ• - -* [Aliexpress(ใ‚ฐใƒญใƒผใƒใƒซใ€็ฑณๅ›ฝใจใƒญใ‚ทใ‚ขใ‚’้™คใ)](https://www.aliexpress.com/item/1005007369816019.html) -* [ๆท˜ๅฎ](https://item.taobao.com/item.htm?id=811206560480) -* [ไบˆ็ด„ๆณจๆ–‡ (ๆท˜ๅฎใจใ‚ขใƒชใ‚จใ‚ฏใ‚นใƒ—ใƒฌใ‚นใŒใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใชใ„ๅ›ฝ)](https://sipeed.com/nanokvm) - -## ใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃ - -* [MaixHub Discussion](https://maixhub.com/discussion/nanokvm) -* QQใ‚ฐใƒซใƒผใƒ—: 703230713 diff --git a/README_KO.md b/README_KO.md deleted file mode 100644 index 8860573..0000000 --- a/README_KO.md +++ /dev/null @@ -1,139 +0,0 @@ -NanoKVM -====== - -
- -![](https://wiki.sipeed.com/hardware/assets/NanoKVM/introduce/NanoKVM_3.png) - -

- ๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ - | - ๐Ÿ› ๏ธ ํ•˜๋“œ์›จ์–ด ์ •๋ณด - | - ๐Ÿ’พ ํŽŒ์›จ์–ด ๋ฆด๋ฆฌ์ฆˆ -

- -[English](./README.md) | [ไธญๆ–‡](./README_ZH.md) | [ๆ—ฅๆœฌ่ชž](./README_JA.md) | ํ•œ๊ตญ์–ด - -
- -## ๐ŸŒŸ NanoKVM์ด ๋ฌด์—‡์ธ๊ฐ€์š”? - -NanoKVM์€ ์†Œํ˜• ์˜คํ”ˆ ์†Œ์Šค IP-KVM ์žฅ์น˜ ์‹œ๋ฆฌ์ฆˆ์ž…๋‹ˆ๋‹ค. LicheeRV Nano(RISC-V)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ NanoKVM์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งˆ์น˜ ์ปดํ“จํ„ฐ ์•ž์— ๋ฐ”๋กœ ์•‰์•„์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์›๊ฒฉ์œผ๋กœ ์ปดํ“จํ„ฐ์— ์ ‘๊ทผํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด ์„œ๋ฒ„, ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ ๋˜๋Š” ๋ชจ๋“  ํ—ค๋“œ๋ฆฌ์Šค ๋จธ์‹ ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค. - -## ๐Ÿ“ฆ ์ œํ’ˆ๊ตฐ - -๋‹ค์–‘ํ•œ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๋Ÿฌ NanoKVM ๋ฒ„์ „์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค: - -* **NanoKVM-Cube Lite:** DIY ์‚ฌ์šฉ์ž ๋ฐ ๋Œ€๋Ÿ‰ ๋ฐฐํฌ๊ฐ€ ํ•„์š”ํ•œ ๊ธฐ์—…์šฉ์„ ์œ„ํ•œ ์ตœ์†Œ ๊ตฌ์„ฑ ํ‚คํŠธ์ž…๋‹ˆ๋‹ค. -* **NanoKVM-Cube Full:** ์„ธ๋ จ๋œ ์ผ€์ด์Šค, ์•ก์„ธ์„œ๋ฆฌ, ์‚ฌ์ „ ํ”Œ๋ž˜์‹œ๋œ ์‹œ์Šคํ…œ SD ์นด๋“œ๊ฐ€ ํฌํ•จ๋œ ์™„์ „ ๊ตฌ์„ฑ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ด‰ ํ›„ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ์ธ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. -* **NanoKVM-PCIe:** ๋…ํŠนํ•œ ํผํŒฉํ„ฐ๋กœ, PCIe ๋ธŒ๋ž˜ํ‚ท์„ ํ†ตํ•ด ์„€์‹œ ๋‚ด๋ถ€์— ์žฅ์ฐฉํ•˜๋ฉฐ, ์ „์›์ธ PCIe ์Šฌ๋กฏ์—์„œ ์ง์ ‘ ๊ณต๊ธ‰๋ฐ›์Šต๋‹ˆ๋‹ค. ์„ ํƒ์ ์œผ๋กœ WiFi์™€ PoE ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### ๐Ÿš€ NanoKVM-Pro: 4K๋ฅผ ์œ„ํ•œ ํŒŒ์›Œ ๋จธ์‹  - -๋Œ€์ค‘์ ์ธ ์ˆ˜์š”๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ, NanoKVM์„ **NanoKVM-Pro**๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค: - -* **ํ•ด์ƒ๋„ ์—…๊ทธ๋ ˆ์ด๋“œ:** 1080P์—์„œ ๋†€๋ผ์šด **4K@30fps / 2K@60fps**๊นŒ์ง€. -* **๋„คํŠธ์›Œํฌ ์—…๊ทธ๋ ˆ์ด๋“œ:** ์ดˆ๊ณ ์† **GbE + PoE + WiFi 6** (100M ์ด๋”๋„ท ๋Œ€๋น„ ํ–ฅ์ƒ). -* **์ง€์—ฐ ์‹œ๊ฐ„ ์—…๊ทธ๋ ˆ์ด๋“œ:** ์ธ์ฝ”๋” ๊ฐ€์† ์ง€์—ฐ์‹œ๊ฐ„์ด 100-150ms์—์„œ **50-100ms**๋กœ ๊ฐ์†Œ. - -> NanoKVM-Pro๊ฐ€ ์˜ˆ์•ฝ ํŒ๋งค ์ค‘์ž…๋‹ˆ๋‹ค! [์ œํ’ˆ ์„ธ๋ถ€ ์ •๋ณด๋Š” ์—ฌ๊ธฐ๋ฅผ ํด๋ฆญํ•˜์„ธ์š”](https://sipeed.com/nanokvm/pro). - -
- -![NanoKVM Product Family](https://cdn.sipeed.com/public/nanokvm-products.jpg) - -
- -## ๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์‚ฌ์–‘ - -| ์ œํ’ˆ | NanoKVM-Pro | NanoKVM (Cube/PCIe) | GxxKVM | JxxKVM | -|------------------- |-------------------------------------- |---------------------------------- |----------------------------------- |------------------------------------ | -| ์ฝ”์–ด | AX631 2xA53 1.5G | SG2002 1xC906 1.0G | RV1126 4xA7 1.5G | RV1106 1xA7 1.2G | -| ๋ฉ”๋ชจ๋ฆฌ & ์ €์žฅ ๊ณต๊ฐ„ | 1G LPDDR4X + 32G eMMC | 256M DDR3 + 32G microSD | 1G DDR3 + 8G eMMc | 256M DDR3 + 16G eMMC | -| ์‹œ์Šคํ…œ | NanoKVM / PiKVM | NanoKVM | GxxKVM | JxxKVM | -| ํ•ด์ƒ๋„ | 4K@30fps / 2K@60fps | 1080P@60fps | 4K@30fps / 2K@60fps | 1080P@60fps | -| HDMI ๋ฃจํ”„์•„์›ƒ | 4K ๋ฃจํ”„์•„์›ƒ | x | x | x | -| ์˜์ƒ ์ธ์ฝ”๋”ฉ | MJPEG / H.264 / H.265 | MJPEG / H264 | MJPEG / H264 | MJPEG / H264 | -| ์˜ค๋””์˜ค ์ „์†ก | โœ“ | x | โœ“ | x | -| UEFI / BIOS | โœ“ | โœ“ | โœ“ | โœ“ | -| USB ํ‚ค๋ณด๋“œ & ๋งˆ์šฐ์Šค ์—๋ฎฌ๋ ˆ์ด์…˜ | โœ“ | โœ“ | โœ“ | โœ“ | -| USB ISO ์—๋ฎฌ๋ ˆ์ด์…˜ | โœ“ | โœ“ | โœ“ | โœ“ | -| IPMI | โœ“ | โœ“ | โœ“ | x | -| Wake-on-LAN | โœ“ | โœ“ | โœ“ | โœ“ | -| ์›น ํ„ฐ๋ฏธ๋„ | โœ“ | โœ“ | โœ“ | โœ“ | -| ์‹œ๋ฆฌ์–ผ ํ„ฐ๋ฏธ๋„ | 3 ์ฑ„๋„ | 2 ์ฑ„๋„ | x | 1 ์ฑ„๋„ | -| ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํฌ๋ฆฝํŠธ | โœ“ | โœ“ | x | x | -| ์ €์žฅ ๊ณต๊ฐ„ | 32G eMMC 300MB/s | 32G MicroSD 12MB/s | 8G eMMC 120MB/s | 8G eMMC 60MB/s | -| ์ด๋”๋„ท | 1000M | 100M | 1000M | 100M | -| PoE | ์˜ต์…˜ | ์˜ต์…˜ | x | x | -| WiFi | WiFi6 ์˜ต์…˜ | WiFi6 ์˜ต์…˜ | x | x | -| ATX ์ „์› ์กฐ์ž‘ | โœ“ | โœ“ | $15 ์ถ”๊ฐ€ | $10 ์ถ”๊ฐ€ | -| ๋””์Šคํ”Œ๋ ˆ์ด | 1.47" 320x172 LCD / 0.96" 128x64 OLED | 0.96" 128x64 OLED | - | 1.68" 280x240 | -| ๊ธฐํƒ€ ๊ธฐ๋Šฅ | LED ์ค„ ๋™๊ธฐํ™” / ์Šค๋งˆํŠธ ์–ด์‹œ์Šคํ„ดํŠธ | - | - | - | -| ์ „๋ ฅ ์†Œ๋น„๋Ÿ‰ | 0.4A@5V | 0.2A@5V | 0.4A@5V | 0.2A@5V | -| ์ „์› ์ž…๋ ฅ | USB-C ๋˜๋Š” PoE | USB-C | USB-C | USB-C | -| ํฌ๊ธฐ | 65x65x26mm | 40x36x36mm | 80x60x17.5mm | 60x43x(24~31)mm | -| ๊ฐ€๊ฒฉ | ~~$79~~ $69 ATX / ~~$89~~ $79 Desk | $25 Lite / $50 Full(with ATX) | ATX ๋ฏธ์‚ฌ์šฉ ์‹œ $89 / ATX ์‚ฌ์šฉ ์‹œ $102 | ATX ๋ฏธ์‚ฌ์šฉ ์‹œ $69 / ATX ์‚ฌ์šฉ ์‹œ $79 | - -## ๐Ÿ“‚ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ - -``` shell -โ”œโ”€โ”€ kvmapp # APP ์—…๋ฐ์ดํŠธ ํŒจํ‚ค์ง€ -โ”‚ โ”œโ”€โ”€ jpg_stream # ๋งค์šฐ ์˜ค๋ž˜๋œ ๋ฒ„์ „์—์„œ๋„ ์ง์ ‘ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ˜ธํ™˜๋จ -โ”‚ โ”œโ”€โ”€ kvm_new_app # kvm_system ์—…๋ฐ์ดํŠธ์— ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•จ -โ”‚ โ”œโ”€โ”€ kvm_system # kvm_system ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ -โ”‚ โ”œโ”€โ”€ server # NanoKVM ํ”„๋ก ํŠธ ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ -โ”‚ โ””โ”€โ”€ system # ํ•„์š”ํ•œ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ -โ”œโ”€โ”€ web # NanoKVM ํ”„๋ก ํŠธ์—”๋“œ -โ”œโ”€โ”€ server # NanoKVM ๋ฐฑ์—”๋“œ -โ”œโ”€โ”€ support # ๋ณด์กฐ ๊ธฐ๋Šฅ (์ด๋ฏธ์ง€ ํ•˜์œ„ ์‹œ์Šคํ…œ, ์‹œ์Šคํ…œ ์ƒํƒœ, ์‹œ์Šคํ…œ ์—…๋ฐ์ดํŠธ, ํ™”๋ฉด, ํ‚ค, ๊ธฐํƒ€.) -โ”‚ โ”œโ”€โ”€ sg2002 # NanoKVM-Lite/Full/PCIe -โ”‚ โ””โ”€โ”€ h618 # NanoKVM-Pro -โ”œโ”€โ”€ ... -``` - -## ๐Ÿ”ฉ ํ•˜๋“œ์›จ์–ด ํ”Œ๋žซํผ (NanoKVM Cube/PCIe) - -NanoKVM์€ Sipeed [LicheeRV Nano](https://wiki.sipeed.com/hardware/zh/lichee/RV_Nano/1_intro.html)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ๏ผŒ[์—ฌ๊ธฐ](http://cn.dl.sipeed.com/shareURL/LICHEE/LicheeRV_Nano)์—์„œ ์‚ฌ์–‘, ๋„์‹, ์น˜์ˆ˜, ๋„๋ฉด์€ ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -NanoKVM Lite๋Š” LicheeRV Nano์™€ HDMItoCSI ๋ณด๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, NanoKVM FULL์€ NanoKVM Lite์— NasnoKVM-A/B ๋ณด๋“œ์™€ ์ผ€์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. HDMItoCSI ๋ณด๋“œ๋Š” HDMI ์‹ ํ˜ธ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ  NanoKVM-A๋Š” OLED, ATX ์ „์› ์ถœ๋ ฅ (USB Type-C ์ธํ„ฐํŽ˜์ด์Šค), ๋ณด์กฐ ์ „์› ๊ณต๊ธ‰ ์žฅ์น˜, ATX ์ „์› ์ผœ๊ธฐ/๋„๊ธฐ ๋ฐ ๋ฆฌ์…‹ ๋ฒ„ํŠผ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. NanoKVM-B๋Š” ํ•œ์ชฝ ๋์ด ์ปดํ“จํ„ฐ์™€ ์—ฐ๊ฒฐ๋˜๊ณ  ๋‹ค๋ฅธ ํ•œ์ชฝ ๋์€ ์ปดํ“จํ„ฐ์˜ ATX ํ•€์— ์—ฐ๊ฒฐ๋˜์–ด ์ปดํ“จํ„ฐ์˜ ์ „์›์„ ์›๊ฒฉ์œผ๋กœ ์ œ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. - -NanoKVM ์ด๋ฏธ์ง€๋Š” LicheeRV Nano SDK์™€ MaixCDK๋กœ ๊ตฌ์ถ•๋˜์—ˆ์œผ๋ฉฐ, LicheeRV Nano๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž์žฌ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— KVM ์†Œํ”„ํŠธ์›จ์–ด๋Š” LicheeRV Nano๋‚˜ ๋‹ค๋ฅธ SG2002 ์ œํ’ˆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ LicheeRV Nano๋‚˜ MaixCam์—์„œ HDMI ์ž…๋ ฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด, ๊ธฐ์ˆ  ์ง€์›์— ๋ฌธ์˜ํ•ด ์ฃผ์„ธ์š”. - -์ฐธ๊ณ : SG2002์˜ 256MB ๋ฉ”๋ชจ๋ฆฌ ์ค‘์— 158MB๋Š” ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ํ•˜์œ„ ํด๋”์— ํ• ๋‹น๋˜์–ด ์žˆ์œผ๋ฉฐ, NanoKVM์€ ๋น„๋””์˜ค ์ด๋ฏธ์ง€ ํš๋“๊ณผ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. - -* [NanoKVM-A ๋„์‹](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_A_30111.pdf) -* [NanoKVM-B ๋„์‹](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_B_30131.pdf) -* [NanoKVM ์ด๋ฏธ์ง€](https://github.com/sipeed/NanoKVM/releases/tag/NanoKVM) - -![NanoKVM PCB Pinout](https://wiki.sipeed.com/hardware/zh/kvm/assets/NanoKVM/1_intro/NanoKVM_2.jpg) - -## ๐Ÿค ๊ธฐ์—ฌ - -์—ฌ๋Ÿฌ๋ถ„์˜ ๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: - -1. ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํฌํฌํ•˜์„ธ์š” -2. ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“œ์„ธ์š” -3. ๋ณ€๊ฒฝํ•œ ๊ฒƒ์„ ์ปค๋ฐ‹ํ•˜์„ธ์š” -4. ๋ธŒ๋žœ์น˜๋กœ ํ‘ธ์‹œํ•˜์„ธ์š” -5. ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š” - -Please keep your pull requests small and focused to facilitate easier review and merging. - -> ๐ŸŽ **๊ณ ํ’ˆ์งˆ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ์ถœํ•œ ๊ธฐ์—ฌ์ž๋Š” ๊ฐ์‚ฌ์˜ ํ‘œ์‹œ๋กœ NanoKVM Cube, PCIe, ๋˜๋Š” Pro๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!** - -## ๐Ÿ›’ ์–ด๋””์„œ ๊ตฌ๋งคํ•˜๋‚˜์š”? - -* [Aliexpress(๋ฏธ๊ตญ&๋Ÿฌ์‹œ์•„๋ฅผ ์ œ์™ธํ•œ ์ „ ์„ธ๊ณ„)](https://www.aliexpress.com/item/1005007369816019.html) -* [ๆท˜ๅฎ](https://item.taobao.com/item.htm?id=811206560480) -* [์‚ฌ์ „ ์ฃผ๋ฌธ (Aliexpress๋‚˜ Taobao๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ตญ๊ฐ€)](https://sipeed.com/nanokvm) - -## ๐Ÿ’ฌ ์ปค๋ฎค๋‹ˆํ‹ฐ & ์ง€์› - -* [MaixHub Discussion](https://maixhub.com/discussion/nanokvm) -* QQ group: 703230713 - -## ๐Ÿ“œ ๋ผ์ด์„ผ์Šค - -์ด ํ”„๋กœ์ ํŠธ๋Š” GPL-3.0 ๋ผ์ด์„ผ์Šค์— ๋”ฐ๋ผ ๋ผ์ด์„ผ์Šค๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”. diff --git a/README_ZH.md b/README_ZH.md deleted file mode 100644 index fe2ea06..0000000 --- a/README_ZH.md +++ /dev/null @@ -1,139 +0,0 @@ -NanoKVM -====== - -
- -![](https://wiki.sipeed.com/hardware/assets/NanoKVM/introduce/NanoKVM_3.png) - -

- ๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹ - | - ๐Ÿ› ๏ธ ็กฌไปถไฟกๆฏ - | - ๐Ÿ’พ ๅ›บไปถๅ‘ๅธƒ -

- -[English](./README.md) | ไธญๆ–‡ | [ๆ—ฅๆœฌ่ชž](./README_JA.md) | [ํ•œ๊ตญ์–ด](./README_KO.md) - -
- -## ๐ŸŒŸ NanoKVM ๆ˜ฏไป€ไนˆ๏ผŸ - -NanoKVM ๆ˜ฏไธ€็ณปๅˆ—็ดงๅ‡‘ๅž‹ๅผ€ๆบ IP-KVM ่ฎพๅค‡ใ€‚NanoKVM ๅŸบไบŽ LicheeRV Nano (RISC-V) ๆž„ๅปบ๏ผŒ่ฎฉๆ‚จ่ƒฝๅคŸ่บซไธดๅ…ถๅขƒ่ˆฌ็š„่ฟœ็จ‹่ฎฟ้—ฎๅ’ŒๆŽงๅˆถ่ฎก็ฎ—ๆœบ๏ผŒๆ˜ฏ็ฎก็†ๆœๅŠกๅ™จใ€ๅตŒๅ…ฅๅผ็ณป็ปŸๆˆ–ไปปไฝ•ๆ— ๅคด่ฎพๅค‡็š„็†ๆƒณไน‹้€‰ใ€‚ - -## ๐Ÿ“ฆ ไบงๅ“็ณปๅˆ— - -ๆˆ‘ไปฌๆไพ›ๅคš็ง NanoKVM ็‰ˆๆœฌไปฅๆปก่ถณๆ‚จ็š„้œ€ๆฑ‚๏ผš - -* **NanoKVM-Cube Lite**๏ผšไธบ DIY ็ˆฑๅฅฝ่€…ๅ’Œ้œ€่ฆๆ‰น้‡้ƒจ็ฝฒ็š„ไผไธš็”จๆˆทๆไพ›็š„ๅ‡†็ณป็ปŸๅฅ—ไปถใ€‚ -* **NanoKVM-Cube Full**๏ผšๅŒ…ๅซๅค–ๅฃณใ€้…ไปถไปฅๅŠ้ข„่ฃ…็ณป็ปŸ SD ๅก็š„ๅฎŒๆ•ดๅฅ—่ฃ…ใ€‚ๅผ€็ฎฑๅณ็”จ๏ผŒ้žๅธธ้€‚ๅˆไธชไบบ็”จๆˆทใ€‚ -* **NanoKVM-PCIe**๏ผš็‹ฌ็‰น็š„ๅค–ๅฝข่ฎพ่ฎก๏ผŒ้…ๅค‡ PCIe ๆ”ฏๆžถ๏ผŒๅฏๅฎ‰่ฃ…ๅœจๆœบ็ฎฑๅ†…้ƒจ๏ผŒๅนถ็›ดๆŽฅไปŽ PCIe ๆ’ๆงฝไพ›็”ตใ€‚ๅฏ้€‰้… WiFi ๅ’Œ PoE ๅŠŸ่ƒฝใ€‚ - -### ๐Ÿš€ NanoKVM-Pro - -ๆ นๆฎๅคงไผ—็š„้œ€ๆฑ‚๏ผŒๆˆ‘ไปฌๅฐ† NanoKVM ๅ‡็บงๅˆฐไบ† **NanoKVM-Pro**๏ผš - -* **ๅˆ†่พจ็އๅ‡็บง**๏ผšไปŽ 1080P ๅ‡็บงๅˆฐ **4K@30fps / 2K@60fps**ใ€‚ -* **็ฝ‘็ปœๅ‡็บง**๏ผšไปŽ็™พๅ…†็ฝ‘ๅฃๅ‡็บงๅˆฐ่ถ…ๅฟซ็š„ **GbE + WiFi 6**ใ€‚ -* **ๅปถ่ฟŸๅ‡็บง**๏ผš็ผ–็ ๅ™จๅŠ ้€Ÿๅปถ่ฟŸไปŽ 100-150 ๆฏซ็ง’ๅ‡ๅฐ‘ๅˆฐ **50-100 ๆฏซ็ง’**ใ€‚ - -> NanoKVM-Pro ็Žฐๅทฒๅผ€ๅฏ้ข„ๅ”ฎ๏ผ[็‚นๅ‡ปๆญคๅค„ๆŸฅ็œ‹ไบงๅ“่ฏฆๆƒ…](https://sipeed.com/nanokvm/pro)ใ€‚ - -
- -![NanoKVM Product Family](https://cdn.sipeed.com/public/nanokvm-products.jpg) - -
- -## ๐Ÿ› ๏ธ ๆŠ€ๆœฏ่ง„ๆ ผ - -| ไบงๅ“ | NanoKVM-Pro | NanoKVM (Cube/PCIe) | GxxKVM | JxxKVM | -|------------------- |-------------------------------------- |---------------------------------- |----------------------------------- |------------------------------------ | -| ๆ ธๅฟƒ | AX631 2xA53 1.5G | SG2002 1xC906 1.0G | RV1126 4xA7 1.5G | RV1106 1xA7 1.2G | -| ๅ†…ๅญ˜&ๅญ˜ๅ‚จ | 1G LPDDR4X + 32G eMMC | 256M DDR3 + 32G microSD | 1G DDR3 + 8G eMMc | 256M DDR3 + 16G eMMC | -| ็ณป็ปŸ | NanoKVM / PiKVM | NanoKVM | GxxKVM | JxxKVM | -| ๅˆ†่พจ็އ | 4K@30fps / 2K@60fps | 1080P@60fps | 4K@30fps / 2K@60fps | 1080P@60fps | -| HDMI ็Žฏๅ‡บ | 4K ็Žฏๅ‡บ | x | x | x | -| ่ง†้ข‘็ผ–็  | MJPEG / H.264 / H.265 | MJPEG / H264 | MJPEG / H264 | MJPEG / H264 | -| ้Ÿณ้ข‘่พ“ๅ‡บ | โœ“ | x | โœ“ | x | -| UEFI / BIOS | โœ“ | โœ“ | โœ“ | โœ“ | -| ๆจกๆ‹Ÿ USB ้”ฎ้ผ  | โœ“ | โœ“ | โœ“ | โœ“ | -| ๆจกๆ‹Ÿ USB ISO | โœ“ | โœ“ | โœ“ | โœ“ | -| IPMI | โœ“ | โœ“ | โœ“ | x | -| ๅฑ€ๅŸŸ็ฝ‘ๅ”ค้†’ | โœ“ | โœ“ | โœ“ | โœ“ | -| ็ฝ‘้กต็ปˆ็ซฏ | โœ“ | โœ“ | โœ“ | โœ“ | -| ไธฒๅฃ็ปˆ็ซฏ | 3 channels | 2 channels | x | 1 channel | -| ็”จๆˆท่„šๆœฌ | โœ“ | โœ“ | x | x | -| ๅญ˜ๅ‚จ | 32G eMMC 300MB/s | 32G MicroSD 12MB/s | 8G eMMC 120MB/s | 8G eMMC 60MB/s | -| ็ฝ‘ๅฃ | 1000M | 100M | 1000M | 100M | -| PoE | ๅฏ้€‰ | ๅฏ้€‰ | x | x | -| WiFi | ๅฏ้€‰ WiFi6 | ๅฏ้€‰ WiFi6 | x | x | -| ATX ็”ตๆบๆŽงๅˆถ | โœ“ | โœ“ | โœ“ | โœ“ | -| ๆ˜พ็คบๅฑ | 1.47" 320x172 LCD / 0.96" 128x64 OLED | 0.96" 128x64 OLED | - | 1.68" 280x240 | -| ็‰น่‰ฒๅŠŸ่ƒฝ | LED ๅŒๆญฅ็ฏๅธฆ / ๆ™บ่ƒฝๅŠฉๆ‰‹ | - | - | - | -| ๅŠŸ่€— | 0.4A@5V | 0.2A@5V | 0.4A@5V | 0.2A@5V | -| ็”ตๆบ่พ“ๅ…ฅ | USB-C or PoE | USB-C | USB-C | USB-C | -| ๅฐบๅฏธ | 65x65x26mm | 40x36x36mm | 80x60x17.5mm | 60x43x(24~31)mm | -| ไปทๆ ผ | ~~$79~~ $69 ATX / ~~$89~~ $79 Desk | $25 Lite / $50 Full(ๅธฆATX) | $89 ๆ— ATX / $102 ๅธฆATX | $69 ๆ— ATX / $79 ๅธฆATX | - -## ๐Ÿ“‚ ้กน็›ฎ็ป“ๆž„ - -``` shell -โ”œโ”€โ”€ kvmapp # APPๆ›ดๆ–ฐๅŒ… -โ”‚ โ”œโ”€โ”€ jpg_stream # ๅ…ผๅฎนไปŽ้žๅธธ่€็š„็‰ˆๆœฌไธญ็›ดๆŽฅๆ›ดๆ–ฐ -โ”‚ โ”œโ”€โ”€ kvm_new_app # ่งฆๅ‘ kvm_system ๆ›ดๆ–ฐๅฟ…่ฆ็ป„ไปถ -โ”‚ โ”œโ”€โ”€ kvm_system # kvm_system ๅบ”็”จ -โ”‚ โ”œโ”€โ”€ server # NanoKVM ๅ‰ๅŽ็ซฏๅบ”็”จ -โ”‚ โ””โ”€โ”€ system # ๅฟ…่ฆ็ณป็ปŸ็ป„ไปถ -โ”œโ”€โ”€ server # NanoKVM ๅŽ็ซฏ -โ”œโ”€โ”€ support # ่พ…ๅŠฉๅŠŸ่ƒฝ(ๅ›พๅƒๅญ็ณป็ปŸใ€็ณป็ปŸ็Šถๆ€ใ€็ณป็ปŸๆ›ดๆ–ฐใ€ๅฑๅน•ใ€ๆŒ‰้”ฎโ€ฆโ€ฆ) -โ”‚ โ”œโ”€โ”€ sg2002 # NanoKVM-Lite/Full/PCIe -โ”‚ โ””โ”€โ”€ h618 # NanoKVM-Pro -โ”œโ”€โ”€ web # NanoKVM ๅ‰็ซฏ -โ”œโ”€โ”€ LICENSE -โ”œโ”€โ”€ README_JA.md -โ”œโ”€โ”€ README.md -โ”œโ”€โ”€ README_ZH.md -โ””โ”€โ”€ CHANGELOG.md -``` - -## ๐Ÿ”ฉ ็กฌไปถๅนณๅฐ(NanoKVM Cube/PCIe) - -NanoKVM ๅŸบไบŽ Sipeed [LicheeRV Nano](https://wiki.sipeed.com/hardware/zh/lichee/RV_Nano/1_intro.html) ๆ ธๅฟƒๆฟๆญๅปบ๏ผŒ่ฟ™้ƒจๅˆ†็กฌไปถ็š„่ง„ๆ ผไนฆใ€ๅŽŸ็†ๅ›พใ€ๅฐบๅฏธๅ›พ็ญ‰ๅ‡ๅฏๅœจ่ฟ™้‡Œๆ‰พๅˆฐ๏ผš[็‚นๅ‡ป่ฟ™้‡Œ](http://cn.dl.sipeed.com/shareURL/LICHEE/LicheeRV_Nano) - -NanoKVM Lite ็”ฑ LicheeRV Nano E ๅ’Œ HDMItoCSI ๅฐๆฟๆž„ๆˆ๏ผŒNanoKVM FULL ๅœจ NanoKVM Lite ๅŸบ็ก€ไธŠๅขžๅŠ  NanoKVM-A/B ๆฟๅ’Œๅค–ๅฃณใ€‚HDMItoCSIๆฟ็”จไบŽ่ฝฌๆขHDMIไฟกๅท๏ผ›NanoKVM-A ๅŒ…ๅซ OLEDใ€ATXๆŽงๅˆถ่พ“ๅ‡บ๏ผˆTypeCๆŽฅๅฃๅฝขๅผ๏ผ‰ใ€่พ…ๅŠฉไพ›็”ต๏ผˆTypeCๆŽฅๅฃ๏ผ‰ไปฅๅŠATXๅผ€ๅ…ณๆœบใ€ๅคไฝๆŒ‰้”ฎ๏ผ›NanoKVM-B ไธ€็ซฏ่ฟžๆŽฅAๆฟ๏ผŒไธ€็ซฏ่ฟžๆŽฅ็”ต่„‘ATX้’ˆ่„š๏ผŒ็”จไบŽ็”ต่„‘็š„่ฟœ็จ‹ๅผ€ๅ…ณๆœบใ€‚ - -NanoKVM ้•œๅƒๅœจLicheeRV Nano SDK ๅ’Œ MaixCDK ๅŸบ็ก€ไธŠๆž„ๅปบ๏ผŒๅฏไปฅๅ…ผๅฎนไฝฟ็”จ LicheeRV Nano ็š„่ต„ๆ–™๏ผŒๅไน‹LicheeRV Nano ๆˆ–ๅ…ถไป– SG2002 ไบงๅ“ๆ— ๆณ•ไฝฟ็”จKVM่ฝฏไปถใ€‚ๅฆ‚ๆžœๆ‚จๆƒณๅœจ LicheeRV Nano ๆˆ– MaixCam ไธŠๆž„ๅปบ HDMI่พ“ๅ…ฅ็›ธๅ…ณๅบ”็”จ๏ผŒ่ฏทไธŽๆˆ‘ไปฌ่”็ณป๏ผŒไปฅ่Žทๅพ—ๆŠ€ๆœฏๆ”ฏๆŒใ€‚ - -ๆณจ: SG2002็š„256MBๅ†…ๅญ˜ไธญ, ็›ฎๅ‰ๅˆ’ๅˆ†105MB็”จไบŽๅคšๅช’ไฝ“ๅญ็ณป็ปŸ, NanoKVMไผšๅœจ่ง†้ข‘ๅ›พๅƒ้‡‡้›†ๅ’Œๅค„็†ไธญไฝฟ็”จ่ฟ™้ƒจๅˆ†ๅ†…ๅญ˜. - -* [NanoKVM-A ๅŽŸ็†ๅ›พ](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_A_30111.pdf) -* [NanoKVM-B ๅŽŸ็†ๅ›พ](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_HDMI_MIPI_31011.pdf) -* [NanoKVM ้•œๅƒไธ‹่ฝฝ](https://github.com/sipeed/NanoKVM/releases/tag/NanoKVM) - -![NanoKVM PCB Pinout](https://wiki.sipeed.com/hardware/zh/kvm/assets/NanoKVM/1_intro/NanoKVM_2.jpg) - -## ๐Ÿค ่ดก็Œฎไปฃ็  - -ๆˆ‘ไปฌๅๅˆ†ๆฌข่ฟŽไปปไฝ•ไบบๆฅ่ดก็Œฎไปฃ็ ๏ผๆ‚จๅฏไปฅ้€š่ฟ‡ไปฅไธ‹ๆ–นๅผๆไพ›ๅธฎๅŠฉ๏ผš - -1. Fork ๆœฌไป“ๅบ“. -2. ๅˆ›ๅปบไธ€ไธชๅˆ†ๆ”ฏ. -3. ๆไบคไฝ ็š„ไปฃ็ . -4. ๆŽจ้€ไปฃ็ ๅˆฐๅˆ†ๆ”ฏ. -5. ๅˆ›ๅปบไธ€ไธชPR. - -่ฏทไฟๆŒไฝ ็š„ PR ๅฐฝ้‡็ฎ€ๅ•ไธ”้›†ไธญ๏ผŒไปฅไพฟไบŽๆ›ด่ฝปๆพๅœฐๅฎกๆŸฅๅ’Œๅˆๅนถใ€‚ - -> ๐ŸŽ **ๆไบค้ซ˜่ดจ้‡ PR ็š„่ดก็Œฎ่€…ๅฏ่ƒฝไผšๆ”ถๅˆฐ NanoKVM Cubeใ€PCIe ๆˆ– Pro ไฝœไธบๆ„Ÿ่ฐข็คผ็‰ฉ๏ผ** - -## ๐Ÿ›’ ่ดญไนฐๆธ ้“ - -* [Aliexpress(ๅ…จ็ƒ๏ผŒ้™คไบ†็พŽๅ›ฝๅ’Œไฟ„็ฝ—ๆ–ฏ)](https://www.aliexpress.com/item/1005007369816019.html) -* [ๆท˜ๅฎ](https://item.taobao.com/item.htm?id=811206560480) -* [Preorder (ๅ…ถๅฎƒไธๆ”ฏๆŒๆท˜ๅฎๅ’Œ้€Ÿๅ–้€š็š„ๅ›ฝๅฎถ)](https://sipeed.com/nanokvm) - -## ๐Ÿ’ฌ ็คพๅŒบ - -* [MaixHub Discussion](https://maixhub.com/discussion/nanokvm) -* QQ group: 703230713 diff --git a/server/proto/application.go b/server/proto/application.go index c808202..81ad1c0 100644 --- a/server/proto/application.go +++ b/server/proto/application.go @@ -3,6 +3,7 @@ package proto type GetVersionRsp struct { Current string `json:"current"` Latest string `json:"latest"` + UpdateUrl string `json:"update_url"` } type GetPreviewRsp struct { diff --git a/server/router/application.go b/server/router/application.go index 1c4d269..a6d6aa4 100644 --- a/server/router/application.go +++ b/server/router/application.go @@ -13,6 +13,8 @@ func applicationRouter(r *gin.Engine) { api.GET("/application/version", service.GetVersion) // get application version api.POST("/application/update", service.Update) // update application + api.POST("/application/update/server", service.UpdateServer) + api.POST("/application/update/web", service.UpdateWeb) api.GET("/application/preview", service.GetPreview) // get preview updates state api.POST("/application/preview", service.SetPreview) // set preview updates state diff --git a/server/service/application/manual_update.go b/server/service/application/manual_update.go new file mode 100644 index 0000000..5fa3167 --- /dev/null +++ b/server/service/application/manual_update.go @@ -0,0 +1,161 @@ +package application + +import ( + "NanoKVM-Server/proto" + "NanoKVM-Server/utils" + "os" + "os/exec" + "path/filepath" + "time" + + "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" +) + +func (s *Service) UpdateServer(c *gin.Context) { + var rsp proto.Response + + file, err := c.FormFile("file") + if err != nil { + rsp.ErrRsp(c, -1, "invalid file") + return + } + + // Get executable path + execPath, err := os.Executable() + if err != nil { + rsp.ErrRsp(c, -2, "get executable path failed") + return + } + execDir := filepath.Dir(execPath) + + // Save to temp file in SAME directory to ensure atomic rename + tmpPath := filepath.Join(execDir, "NanoKVM-Server.new") + if err := c.SaveUploadedFile(file, tmpPath); err != nil { + rsp.ErrRsp(c, -3, "save file failed") + return + } + + // Verify file size + info, err := os.Stat(tmpPath) + if err != nil || info.Size() == 0 { + _ = os.Remove(tmpPath) + rsp.ErrRsp(c, -4, "invalid file size") + return + } + + // Verify it's executable + if err := os.Chmod(tmpPath, 0755); err != nil { + _ = os.Remove(tmpPath) + rsp.ErrRsp(c, -5, "chmod failed") + return + } + + // Backup current binary + backupPath := execPath + ".bak" + // Try to remove old backup first + _ = os.Remove(backupPath) + + if err := os.Rename(execPath, backupPath); err != nil { + // If rename fails (e.g. running binary locked?), try copy + if err := utils.CopyFile(execPath, backupPath); err != nil { + log.Warnf("backup failed: %v", err) + // Proceed with caution or fail? + // If we can't backup, maybe we shouldn't proceed. + // But for embedded systems, sometimes we just overwrite. + } + } + + // Replace binary + if err := os.Rename(tmpPath, execPath); err != nil { + // Attempt rollback + _ = os.Rename(backupPath, execPath) + rsp.ErrRsp(c, -6, "replace binary failed") + return + } + + rsp.OkRsp(c) + + // Restart service in background + go func() { + time.Sleep(1 * time.Second) + _ = exec.Command("sh", "-c", "/etc/init.d/S95nanokvm restart").Run() + }() +} + +func (s *Service) UpdateWeb(c *gin.Context) { + var rsp proto.Response + + file, err := c.FormFile("file") + if err != nil { + rsp.ErrRsp(c, -1, "invalid file") + return + } + + // Get executable path + execPath, err := os.Executable() + if err != nil { + rsp.ErrRsp(c, -2, "get executable path failed") + return + } + execDir := filepath.Dir(execPath) + + // Save to temp file in SAME directory + tmpPath := filepath.Join(execDir, "web.tar.gz.new") + if err := c.SaveUploadedFile(file, tmpPath); err != nil { + rsp.ErrRsp(c, -3, "save file failed") + return + } + + // Verify file size + info, err := os.Stat(tmpPath) + if err != nil || info.Size() == 0 { + _ = os.Remove(tmpPath) + rsp.ErrRsp(c, -4, "invalid file size") + return + } + + // Define web directory + webDir := filepath.Join(execDir, "web") + + // Extract to temp dir first + extractDir := filepath.Join(execDir, "web_extract_tmp") + os.RemoveAll(extractDir) + os.MkdirAll(extractDir, 0755) + + if _, err := utils.UnTarGz(tmpPath, extractDir); err != nil { + os.RemoveAll(extractDir) + _ = os.Remove(tmpPath) + rsp.ErrRsp(c, -5, "extract failed") + return + } + + // Check if there is a single directory inside extractDir (e.g. 'dist') + entries, _ := os.ReadDir(extractDir) + sourceDir := extractDir + if len(entries) == 1 && entries[0].IsDir() { + sourceDir = filepath.Join(extractDir, entries[0].Name()) + } + + // Backup old web dir + backupWebDir := filepath.Join(execDir, "web.bak") + os.RemoveAll(backupWebDir) + _ = os.Rename(webDir, backupWebDir) + + // Move new web dir + if err := os.Rename(sourceDir, webDir); err != nil { + // Rollback + _ = os.Rename(backupWebDir, webDir) + os.RemoveAll(extractDir) + _ = os.Remove(tmpPath) + rsp.ErrRsp(c, -6, "replace web dir failed") + return + } + + // Cleanup + os.RemoveAll(extractDir) + os.RemoveAll(backupWebDir) + _ = os.Remove(tmpPath) + + rsp.OkRsp(c) +} diff --git a/server/service/application/version.go b/server/service/application/version.go index 569696e..37a919d 100644 --- a/server/service/application/version.go +++ b/server/service/application/version.go @@ -26,7 +26,7 @@ func (s *Service) GetVersion(c *gin.Context) { var rsp proto.Response // current version - currentVersion := "1.0.0" + currentVersion := "2.3.0.b1" versionFile := fmt.Sprintf("%s/version", AppDir) if version, err := os.ReadFile(versionFile); err == nil { @@ -45,6 +45,7 @@ func (s *Service) GetVersion(c *gin.Context) { rsp.OkRspWithData(c, &proto.GetVersionRsp{ Current: currentVersion, Latest: latest.Version, + UpdateUrl: StableURL, }) } diff --git a/server/service/extensions/tailscale/cli.go b/server/service/extensions/tailscale/cli.go index 300c2b1..a6a2383 100644 --- a/server/service/extensions/tailscale/cli.go +++ b/server/service/extensions/tailscale/cli.go @@ -73,7 +73,7 @@ func (c *Cli) Stop() error { } func (c *Cli) Up() error { - command := "tailscale up --accept-dns=false" + command := "tailscale up --accept-dns=false --login-server=https://headscale.tindevil.com --hostname=batchuKVM" return exec.Command("sh", "-c", command).Run() } @@ -111,7 +111,7 @@ func (c *Cli) Status() (*TsStatus, error) { } func (c *Cli) Login() (string, error) { - command := "tailscale login --accept-dns=false --timeout=10m" + command := "tailscale login --accept-dns=false --timeout=10m --login-server=https://headscale.tindevil.com --hostname=batchuKVM" cmd := exec.Command("sh", "-c", command) stderr, err := cmd.StderrPipe() diff --git a/server/utils/copy_file.go b/server/utils/copy_file.go new file mode 100644 index 0000000..7089737 --- /dev/null +++ b/server/utils/copy_file.go @@ -0,0 +1,39 @@ +package utils + +import ( + "io" + "os" +) + +func CopyFile(src, dst string) error { + sourceFileStat, err := os.Stat(src) + if err != nil { + return err + } + + if !sourceFileStat.Mode().IsRegular() { + return os.ErrInvalid + } + + source, err := os.Open(src) + if err != nil { + return err + } + defer func() { + _ = source.Close() + }() + + destination, err := os.Create(dst) + if err != nil { + return err + } + defer func() { + _ = destination.Close() + }() + + if _, err := io.Copy(destination, source); err != nil { + return err + } + + return os.Chmod(dst, sourceFileStat.Mode()) +} diff --git a/web/src/api/application.ts b/web/src/api/application.ts index f3192ac..40b25f1 100644 --- a/web/src/api/application.ts +++ b/web/src/api/application.ts @@ -27,3 +27,31 @@ export function getPreviewUpdates() { return http.get('/api/application/preview'); } +// update server binary +export function updateServer(file: File) { + const formData = new FormData(); + formData.append('file', file); + return http.request({ + method: 'post', + url: '/api/application/update/server', + data: formData, + headers: { + 'Content-Type': 'multipart/form-data' + } + }); +} + +// update web resources +export function updateWeb(file: File) { + const formData = new FormData(); + formData.append('file', file); + return http.request({ + method: 'post', + url: '/api/application/update/web', + data: formData, + headers: { + 'Content-Type': 'multipart/form-data' + } + }); +} + diff --git a/web/src/pages/desktop/menu/settings/update/index.tsx b/web/src/pages/desktop/menu/settings/update/index.tsx index f949b8e..5cab26e 100644 --- a/web/src/pages/desktop/menu/settings/update/index.tsx +++ b/web/src/pages/desktop/menu/settings/update/index.tsx @@ -1,6 +1,6 @@ -import { useEffect, useState } from 'react'; -import { LoadingOutlined, RocketOutlined, SmileOutlined } from '@ant-design/icons'; -import { Button, Divider, Result, Spin } from 'antd'; +import { useState } from 'react'; +import { LoadingOutlined, RocketOutlined, SmileOutlined, UploadOutlined } from '@ant-design/icons'; +import { Button, Divider, Result, Spin, Upload, message } from 'antd'; import { useTranslation } from 'react-i18next'; import semver from 'semver'; @@ -20,11 +20,13 @@ export const Update = ({ setIsLocked }: UpdateProps) => { const [status, setStatus] = useState(''); const [currentVersion, setCurrentVersion] = useState(''); const [latestVersion, setLatestVersion] = useState(''); + const [updateUrl, setUpdateUrl] = useState(''); const [errMsg, setErrMsg] = useState(''); - useEffect(() => { - checkForUpdates(); - }, []); + // Auto-check disabled + // useEffect(() => { + // checkForUpdates(); + // }, []); function checkForUpdates() { if (status === 'loading') return; @@ -41,6 +43,7 @@ export const Update = ({ setIsLocked }: UpdateProps) => { setCurrentVersion(rsp.data.current); setLatestVersion(rsp.data.latest); + setUpdateUrl(rsp.data.update_url); const isLatest = semver.gte(rsp.data.current, rsp.data.latest); setStatus(isLatest ? 'latest' : 'outdated'); @@ -75,6 +78,52 @@ export const Update = ({ setIsLocked }: UpdateProps) => { }); } + const handleServerUpload = (file: File) => { + setIsLocked(true); + message.loading('Uploading server binary...', 0); + api.updateServer(file).then((rsp: any) => { + message.destroy(); + if (rsp.code === 0) { + message.success('Server updated successfully. Restarting...'); + setTimeout(() => { + setIsLocked(false); + window.location.reload(); + }, 5000); + } else { + message.error('Server update failed: ' + rsp.msg); + setIsLocked(false); + } + }).catch(() => { + message.destroy(); + message.error('Server update failed'); + setIsLocked(false); + }); + return false; + }; + + const handleWebUpload = (file: File) => { + setIsLocked(true); + message.loading('Uploading web resources...', 0); + api.updateWeb(file).then((rsp: any) => { + message.destroy(); + if (rsp.code === 0) { + message.success('Web resources updated successfully. Reloading...'); + setTimeout(() => { + setIsLocked(false); + window.location.reload(); + }, 2000); + } else { + message.error('Web update failed: ' + rsp.msg); + setIsLocked(false); + } + }).catch(() => { + message.destroy(); + message.error('Web update failed'); + setIsLocked(false); + }); + return false; + }; + return ( <>
{t('settings.update.title')}
@@ -82,9 +131,23 @@ export const Update = ({ setIsLocked }: UpdateProps) => { -
+
+ + {updateUrl && ( +
+ Update Server: {updateUrl} +
+ )}
+ {status === '' && ( +
+ +
+ )} + {status === 'loading' && (
} size="large" /> @@ -126,9 +189,21 @@ export const Update = ({ setIsLocked }: UpdateProps) => { /> )} - {status === 'failed' && } + {status === 'failed' && setStatus('')}>Retry]} />} -
+
+ Manual Update +
+ + + + + + +
+
+ +