Skip to main content

A secure QUIC-based RPC server for NanaSQLite

Project description

NanaSQLite-Server

English | 日本語


English

A secure, high-performance, QUIC-based RPC server for NanaSQLite.

⚠️ Security Warning

The security of this server depends on the method structure of the NanaSQLite class. While we use a dynamic protection mechanism, updates to NanaSQLite may introduce new methods that could potentially bypass current security restrictions. Always review the FORBIDDEN_METHODS in server.py when updating the underlying nanasqlite library.

Current Supported NanaSQLite Version: v1.3.2+

Features

  • QUIC Protocol: Built on top of HTTP/3 technology for low latency and high reliability.
  • Ed25519 Passkey Authentication: Secure challenge-response authentication.
  • Performance: Optimized with ormsgpack for ultra-fast message serialization.
  • Concurrency & Safety: Thread-safe operations using RLock and optimized with WAL mode.
  • Reliability: Enhanced task management for Python 3.13+ compatibility.
  • Role-Based Access Control (RBAC): Manage allowed/forbidden methods per account.
  • Multi-DB Support: Securely access multiple databases within a designated directory.
  • Cross-Platform: Fully optimized for Windows, Linux, and macOS.

Quick Start

pip install nanasqlite-server
nanasqlite-cert-gen
nanasqlite-key-gen
nanasqlite-server

Multi-Database & RBAC Configuration

Configure accounts and database access in accounts.json:

{
    "db_dir": "./data",
    "accounts": [
        {
            "name": "admin",
            "public_key": "ssh-ed25519 ...",
            "allowed_methods": null,
            "allowed_dbs": ["main.sqlite", "logs.sqlite"]
        },
        {
            "name": "readonly_user",
            "public_key": "ssh-ed25519 ...",
            "allowed_methods": ["get_item_async", "list_tables"],
            "allowed_dbs": ["main.sqlite"]
        }
    ]
}

Note: db_dir is the base directory. Remote clients can only access databases explicitly listed in their allowed_dbs.

Client Usage Example

import asyncio
from nanasqlite_server.client import RemoteNanaSQLite

async def main():
    # Specify connection info
    db = RemoteNanaSQLite(host="127.0.0.1", port=4433)
    
    # Connect and authenticate (requires nana_private.pem)
    await db.connect()
    
    # Perform data operations (async methods)
    await db.set_item_async("key", "value")
    val = await db.get_item_async("key")
    print(f"Read back: {val}")
    
    # Close connection
    await db.close()

if __name__ == "__main__":
    asyncio.run(main())

Note: If no database is specified by the client and the account has no allowed_dbs restriction, the database specified by the server's --db option (default: server_db.sqlite) will be used.

Concurrency & Locking Design

NanaSQLite-Server uses a high-concurrency model optimized for safety:

  • Threadpool Offloading: All database operations are offloaded to a shared thread pool (default 10 workers) to prevent blocking the async event loop.
  • Per-DB Locking: Each database instance is protected by a thread-safe RLock. Multiple readers/writers are safely queued.
  • WAL Mode: Databases are initialized in WAL (Write-Ahead Logging) mode, allowing concurrent reads even during write operations.

日本語

NanaSQLite のためのセキュアで高速な QUIC ベースの RPC サーバーです。

⚠️ セキュリティに関する重要な警告

このサーバーのセキュリティは NanaSQLite クラスのメソッド構造に依存しています。動的な保護メカニズムを採用していますが、NanaSQLite のアップデートにより、現在の制限を回避できる新しいメソッドが導入される可能性があります。 nanasqlite ライブラリを更新する際は、必ず server.py 内の FORBIDDEN_METHODS を確認し、必要に応じて更新してください。

現在対応している NanaSQLite バージョン: v1.3.2+

特徴

  • QUIC プロトコル: HTTP/3 テクノロジーをベースにした低遅延で信頼性の高い通信。
  • Ed25519 パスキー認証: チャレンジ/レスポンス方式によるセキュアな認証。
  • パフォーマンス: ormsgpack による超高速なメッセージシリアライズ。
  • 並行性と安全性: RLock によるスレッドセーフな操作と WAL モードによる最適化。
  • 信頼性: Python 3.13+ 対応のタスク管理強化により、安定した長時間稼働を実現。
  • ロールベースアクセス制御 (RBAC): アカウントごとの許可/禁止メソッドの管理。
  • マルチDB対応: 指定したディレクトリ内の複数のDBへ安全にアクセス。
  • マルチプラットフォーム: Windows, Linux, macOS に完全対応。

クイックスタート

pip install nanasqlite-server
# 証明書と鍵の生成
nanasqlite-cert-gen
nanasqlite-key-gen
# サーバーの起動
nanasqlite-server

マルチDB & RBAC 設定

accounts.json でアカウントとアクセス可能なDBを構成します。

{
    "db_dir": "./data",
    "accounts": [
        {
            "name": "admin",
            "public_key": "ssh-ed25519 ...",
            "allowed_methods": null,
            "allowed_dbs": ["main.sqlite", "logs.sqlite"]
        },
        {
            "name": "readonly_user",
            "public_key": "ssh-ed25519 ...",
            "allowed_methods": ["get_item_async", "list_tables"],
            "allowed_dbs": ["main.sqlite"]
        }
    ]
}

注: db_dir はベースディレクトリです。クライアントは allowed_dbs に明記されたDBにのみアクセス可能です。

許可メソッドのカスタマイズ

プログラムからサーバーを起動する場合、許可または禁止するメソッドをカスタマイズできます。

import asyncio
from nanasqlite_server.server import main

async def start_server():
    # 'close' を明示的に許可し、'__setitem__' を禁止する例
    await main(
        allowed_methods={"close"},
        forbidden_methods={"__setitem__"}
    )

if __name__ == "__main__":
    asyncio.run(start_server())

クライアントの使用例

import asyncio
from nanasqlite_server.client import RemoteNanaSQLite

async def main():
    # 接続情報の指定
    db = RemoteNanaSQLite(host="127.0.0.1", port=4433)
    
    # 接続と認証(秘密鍵 nana_private.pem が必要)
    await db.connect()
    
    # 非同期メソッドによるデータ操作
    await db.set_item_async("key", "value")
    val = await db.get_item_async("key")
    print(f"Read back: {val}")
    
    # 終了
    await db.close()

if __name__ == "__main__":
    asyncio.run(main())

並行処理とロック設計

NanaSQLite-Server は安全性を最優先した並行処理モデルを採用しています。

  • スレッドプール・オフロード: すべての DB 操作は共有スレッドプール(デフォルト10ワーカー)にオフロードされ、非同期イベントループをブロックしません。
  • DB単位のロック: 各 DB インスタンスは RLock で保護されており、同一 DB への同時アクセスは適切にキューイングされ安全に実行されます。
  • WAL モード: DB は WAL (Write-Ahead Logging) モードで動作し、書き込み操作中であっても読み取りを妨げない設計になっています。

License

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nanasqlite_server-1.2.1.tar.gz (33.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nanasqlite_server-1.2.1-py3-none-any.whl (22.9 kB view details)

Uploaded Python 3

File details

Details for the file nanasqlite_server-1.2.1.tar.gz.

File metadata

  • Download URL: nanasqlite_server-1.2.1.tar.gz
  • Upload date:
  • Size: 33.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for nanasqlite_server-1.2.1.tar.gz
Algorithm Hash digest
SHA256 d8590a7df07fb7790ad39e5b4a87c578b58d6e1b69eb24c3725a9a1a4504b457
MD5 ffe8b044f1d2b50d57ef97f1b88133ad
BLAKE2b-256 c0c66ddbbe86ae24853cdbab946596a1a56b79a2bc1931dca8fddb13cc5f5c25

See more details on using hashes here.

Provenance

The following attestation bundles were made for nanasqlite_server-1.2.1.tar.gz:

Publisher: ci.yml on disnana/NanaSQLite-Server

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nanasqlite_server-1.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for nanasqlite_server-1.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5c1f96204eb008445773a93c7096eaca63a4be1e63353aaed65894f8498e94ee
MD5 b7d7bc6ebb605749a208aa143d792d2f
BLAKE2b-256 72c049469f8f1e0f057e364c69ebe1118f66d29ce6498a2e91e37437fda89b62

See more details on using hashes here.

Provenance

The following attestation bundles were made for nanasqlite_server-1.2.1-py3-none-any.whl:

Publisher: ci.yml on disnana/NanaSQLite-Server

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page