> ## Documentation Index
> Fetch the complete documentation index at: https://shinydapps-bd9fa40b.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# دليل الترحيل

> الانتقال من وضع Managed إلى وضع Soberano، والترقية بين الإصدارات، أو تبديل مزودي Lightning — بدون توقف.

## Managed → Soberano (رسوم 0%، حضانة كاملة)

بدأت بـ `ManagedProvider` لأنه أسرع طريقة للتشغيل. عندما تكون مستعدًا للحضانة الكاملة ورسوم 0%، يتمثل الترحيل في سطر واحد.

<Steps>
  <Step title="إعداد مزود Lightning الخاص بك">
    اختر مزود soberano. [Blink](https://dashboard.blink.sv) مجاني، بدون KYC، وإعداد فوري.

    ```bash theme={null}
    # Blink: create account → API Keys → copy key + wallet ID
    BLINK_API_KEY=blink_xxxxxxxxxxxxxxxxxxxxxxxx
    BLINK_WALLET_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    ```
  </Step>

  <Step title="تبديل المزود — سطر واحد">
    ```typescript theme={null}
    // Before
    import { ManagedProvider } from 'l402-kit';
    const lightning = ManagedProvider.fromAddress('you@yourdomain.com');

    // After
    import { BlinkProvider } from 'l402-kit';
    const lightning = new BlinkProvider(
      process.env.BLINK_API_KEY!,
      process.env.BLINK_WALLET_ID!,
    );
    ```

    ```python theme={null}
    # Before
    from l402kit import ManagedProvider
    lightning = ManagedProvider.from_address("you@yourdomain.com")

    # After
    from l402kit.providers.blink import BlinkProvider
    lightning = BlinkProvider(
        api_key=os.environ["BLINK_API_KEY"],
        wallet_id=os.environ["BLINK_WALLET_ID"],
    )
    ```

    كل شيء آخر — إعداد الوسيط، التحقق من الرمز، كود نقطة النهاية — يبقى كما هو تمامًا.
  </Step>

  <Step title="النشر">
    الرموز الصادرة عن المزود المُدار **تستمر في العمل** بعد الترحيل. التحقق هو تشفير بحت (`SHA256(preimage) == paymentHash`) — ولا يعتمد على أي مزود أنشأ الفاتورة.

    لا توجد نافذة ترحيل، ولا توقف، ولا قاعدة بيانات تحتاج إلى تحديث.
  </Step>
</Steps>

<Note>
  الرموز المدفوعة مسبقًا الصادرة تحت ManagedProvider تبقى صالحة بعد تبديل المزودين. يحتوي macaroon فقط على تجزئة وتاريخ انتهاء صلاحية — لا توجد بيانات خاصة بالمزود.
</Note>

***

## التبديل بين مزودي soberano

نفس النمط — قم بتبديل نسخة المزود، ولا شيء آخر يتغير.

```typescript theme={null}
// Blink → LNbits
import { LNbitsProvider } from 'l402-kit';
const lightning = new LNbitsProvider(
  process.env.LNBITS_KEY!,
  process.env.LNBITS_URL ?? 'https://legend.lnbits.com',
);

// Blink → OpenNode
import { OpenNodeProvider } from 'l402-kit';
const lightning = new OpenNodeProvider(process.env.OPENNODE_KEY!, false);
```

***

## v1.x → v1.8 (الإصدار الحالي)

لا توجد تغييرات جذرية. SDK مضاف — مزودون جدد، أدوات وكيل جديدة، محولات إعادة تشغيل جديدة. قم بالترقية باستخدام:

```bash theme={null}
npm install l402-kit@latest
pip install --upgrade l402kit
cargo update l402kit
go get github.com/shinydapps/l402-kit/go@latest
```

إذا حددت إصدارًا معينًا، تحقق من [سجل التغييرات](https://github.com/ShinyDapps/l402-kit/releases) لمعرفة ما هو جديد.

***

## ترحيل الإطار

### Express → Fastify

```typescript theme={null}
// Express
app.get('/api', l402({ priceSats: 10, lightning }), handler);

// Fastify
import { l402Fastify } from 'l402-kit/fastify';

fastify.get('/api', {
  preHandler: l402Fastify({ priceSats: 10, lightning }),
}, handler);
```

### Express → Hono (Cloudflare Workers)

```typescript theme={null}
import { Hono } from 'hono';
import { l402Hono } from 'l402-kit/hono';

const app = new Hono();
app.use('/api/*', l402Hono({ priceSats: 10, lightning }));
app.get('/api/data', (c) => c.json({ data: 'paid' }));
```

### Flask → FastAPI

```python theme={null}
# Flask
from l402kit.flask import l402_required

@app.route('/api')
@l402_required(price_sats=10, lightning=provider)
def handler():
    return jsonify({'data': 'paid'})

# FastAPI
from l402kit import l402_required

@app.get('/api')
@l402_required(price_sats=10, lightning=provider)
async def handler():
    return {'data': 'paid'}
```

***

## ترحيل مخزن إعادة التشغيل

### الذاكرة المؤقتة → Supabase

قم بتعيين متغيرات البيئة — يكتشف الوسيط ذلك تلقائيًا ويتبدّل:

```bash theme={null}
SUPABASE_URL=https://xxx.supabase.co
SUPABASE_ANON_KEY=your_anon_key
```

الرموز الجارية تستمر في العمل. يبدأ مخزن Supabase في التسجيل من اللحظة التي يصبح فيها نشطًا — لا توجد بيانات تاريخية تحتاج إلى ترحيل.

### الذاكرة المؤقتة → Redis

```typescript theme={null}
import { Redis } from 'ioredis';
import { RedisReplayAdapter } from 'l402-kit';

const redis = new Redis(process.env.REDIS_URL!);

app.get('/api', l402({
  priceSats: 10,
  lightning,
  replayAdapter: new RedisReplayAdapter(redis),
}), handler);
```

<CardGroup cols={2}>
  <Card title="المزودون" icon="plug" href="/providers">
    جميع خيارات المزودين وإعداداتهم
  </Card>

  <Card title="دليل الإنتاج" icon="rocket" href="/guides/production">
    قائمة مراجعة النشر
  </Card>
</CardGroup>
