diff --git a/README.md b/README.md
index f9ec10b..8860573 100644
--- a/README.md
+++ b/README.md
@@ -6,38 +6,38 @@ NanoKVM

-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)

-## ๐ค 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
-======
-
-
-
-
-
-
-
-[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 (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 ใใผใใฆใงใขใใฉใใใใฉใผใ
-
-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
-======
-
-
-
-
-
-
-
-[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-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)
-
-
-
-## ๐ค ๊ธฐ์ฌ
-
-์ฌ๋ฌ๋ถ์ ๊ธฐ์ฌ๋ฅผ ํ์ํฉ๋๋ค! ๋์์ ์ค ์ ์๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
-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
-======
-
-
-
-
-
-
-
-[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-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)
-
-
-
-## ๐ค ่ดก็ฎไปฃ็
-
-ๆไปฌๅๅๆฌข่ฟไปปไฝไบบๆฅ่ดก็ฎไปฃ็ ๏ผๆจๅฏไปฅ้่ฟไปฅไธๆนๅผๆไพๅธฎๅฉ๏ผ
-
-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
+
+
+ }>Upload Server (Binary)
+
+
+ }>Upload Web (tar.gz)
+
+
+
+
+