# NanoKVM サーバー

これは NanoKVM のバックエンドサーバーの実装です。

詳細なドキュメントについては、[Wiki](https://wiki.sipeed.com/nanokvm) を参照してください。

## 構造

```shell
server
├── common       // 共通ユーティリティコンポーネント
├── config       // サーバー設定
├── dl_lib       // 共有オブジェクトライブラリ
├── include      // 共有オブジェクトのヘッダーファイル
├── logger       // ロギングシステム
├── middleware   // サーバーミドルウェアコンポーネント
├── proto        // API リクエスト/レスポンス定義
├── router       // API ルートハンドラ
├── service      // コアサービスの実装
├── utils        // ユーティリティ関数
└── main.go
```

## 設定

設定ファイルのパスは `/etc/kvm/server.yaml` です。

```yaml
proto: http
port:
    http: 80
    https: 443
cert:
    crt: server.crt
    key: server.key

# ログレベル (debug/info/warn/error)
# 注意: 本番環境では 'info' または 'error' を使用し、'debug' は開発環境でのみ使用してください
logger:
    level: info
    file: stdout

# 認証設定 (enable/disable)
# 注意: 認証を無効にするのは開発環境でのみ行ってください
authentication: enable

jwt:
   # JWT 秘密鍵の設定。 空のままにすると、サーバー起動時にランダムな 64 バイトの鍵が自動的に生成されます。
   secretKey: ""
   # JWT トークンの有効期限（秒単位）。 デフォルト: 2678400 (31 日)
   refreshTokenDuration: 2678400
   # ユーザーがログアウトすると、すべての JWT トークンが無効になります。 デフォルト: true
   revokeTokensOnLogout: true

# カスタム STUN サーバーのアドレス
stun: stun.l.google.com:19302

# カスタム TURN サーバーのアドレスと認証情報
turn:
    turnAddr: turn.cloudflare.com:3478
    turnUser: example_user
    turnCred: example_cred
```

## コンパイルとデプロイ

注意: Linux オペレーティングシステム (x86-64) を使用してください。このビルドプロセスは ARM、Windows、macOS では互換性がありません。

1. ツールチェーンのインストール
    1. 以下のリンクからツールチェーンをダウンロードします: [ダウンロードリンク](https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/03/07/16/host-tools.tar.gz)。
    2. ファイルを解凍し、`host-tools/gcc/riscv64-linux-musl-x86_64/bin` ディレクトリを PATH 環境変数に追加します。
    3. `riscv64-unknown-linux-musl-gcc -v` を実行します。バージョン情報が表示されれば、インストールは成功です。

2. プロジェクトのコンパイル
    1. プロジェクトのルートディレクトリから `cd server` を実行します。
    2. `go mod tidy` を実行して Go の依存関係をインストールします。
    3. `CGO_ENABLED=1 GOOS=linux GOARCH=riscv64 CC=riscv64-unknown-linux-musl-gcc CGO_CFLAGS="-mcpu=c906fdv -march=rv64imafdcv0p7xthead -mcmodel=medany -mabi=lp64d" go build` を実行してプロジェクトをコンパイルします。
    4. コンパイルが完了すると、`NanoKVM-Server` という名前の実行ファイルが生成されます。

3. RPATH の変更
    1. `sudo apt install patchelf` または `pip install patchelf` を実行して patchelf をインストールします。
    2. `patchelf --version` を実行します。バージョンが 0.14 以上であることを確認します。
    3. `patchelf --add-rpath \$ORIGIN/dl_lib NanoKVM-Server` を実行して、実行ファイルの RPATH を変更します。

4. アプリケーションのデプロイ
    1. デプロイ前に、ブラウザでアプリケーションを最新バージョンに更新します。手順は[こちら](https://wiki.sipeed.com/hardware/en/kvm/NanoKVM/system/updating.html)を参照してください。
    2. コンパイルして生成された `NanoKVM-Server` ファイルを使用して、NanoKVM の `/kvmapp/server/` ディレクトリ内の元のファイルを置き換えます。
    3. NanoKVM で `/etc/init.d/S95nanokvm restart` を実行してサービスを再起動します。

## 手動更新

> ファイルのアップロードには SSH が必要です。Web 設定で有効にしてください: `設定 > SSH`

1. [GitHub](https://github.com/sipeed/NanoKVM/releases) から最新のアプリケーションをダウンロードします。
2. ダウンロードしたファイルを解凍し、解凍したフォルダーの名前を `kvmapp` に変更します。
3. NanoKVM 上の既存の `/kvmapp` ディレクトリをバックアップし、新しい `kvmapp` フォルダーに置き換えます。
4. NanoKVM で `/etc/init.d/S95nanokvm restart` を実行してサービスを再起動します。
