# البنية التحتية

تشرح هذه الصفحة كيف يعمل Rediacc من الداخل: بنية الأداتين، اكتشاف المحوّلات، نموذج الأمان، وهيكل الإعدادات.

## Full Stack Overview

Traffic flows from the internet through a reverse proxy, into isolated Docker daemons, each backed by encrypted storage:

![Full Stack Architecture](/img/arch-full-stack.svg)

Each repository gets its own Docker daemon, loopback IP subnet (/26 = 64 IPs), and LUKS-encrypted BTRFS volume. The route server discovers running containers across all daemons and feeds routing configuration to Traefik.

## بنية الأداتين

يستخدم Rediacc ملفين تنفيذيين يعملان معاً عبر SSH:

![بنية الأداتين](/img/arch-two-tool.svg)

- **rdc** يعمل على محطة عملك (macOS أو Linux أو Windows). يقرأ الإعدادات المحلية، ويتصل بالأجهزة البعيدة عبر SSH، ويستدعي أوامر renet.
- **renet** يعمل على الخادم البعيد بصلاحيات الجذر. يدير صور الأقراص المشفرة بـ LUKS، وعمليات Docker المعزولة، وتنسيق الخدمات، وإعدادات الوكيل العكسي.

كل أمر تكتبه محلياً يُترجم إلى استدعاء SSH ينفّذ renet على الجهاز البعيد. لن تحتاج أبداً إلى الاتصال بالخوادم يدوياً عبر SSH.

للاطلاع على قاعدة إبهام موجهة للمشغّل، راجع [rdc vs renet](/ar/docs/rdc-vs-renet). يمكنك أيضاً استخدام `rdc ops` لتشغيل مجموعة VM محلية للاختبار, راجع [الأجهزة الافتراضية التجريبية](/ar/docs/experimental-vms).

## الإعداد

تُخزَّن جميع حالات CLI في ملفات إعداد JSON مسطّحة تحت `~/.config/rediacc/`.

### محوّل المحلي (الافتراضي)

الافتراضي للاستضافة الذاتية. تعيش جميع الحالات في ملف إعداد على محطة عملك (مثلاً `~/.config/rediacc/rediacc.json`).

- اتصالات SSH مباشرة بالأجهزة
- لا حاجة لخدمات خارجية
- مستخدم واحد، محطة عمل واحدة
- يُنشأ الإعداد الافتراضي تلقائياً عند أول استخدام لسطر الأوامر. تُنشأ الإعدادات المسمّاة باستخدام `rdc config init <name>`

### محوّل السحابة (تجريبي)

يُفعَّل تلقائياً عند احتواء الإعداد على حقلَي `apiUrl` و `token`. يستخدم واجهة برمجة تطبيقات Rediacc لإدارة الحالة والتعاون الجماعي.

- تُخزَّن الحالة في واجهة برمجة التطبيقات السحابية
- فرق متعددة المستخدمين مع التحكم في الوصول بناءً على الأدوار
- وحدة تحكم ويب للإدارة المرئية
- يُعدّ باستخدام `rdc auth login`

> **ملاحظة:** أوامر محوّل السحابة تجريبية. فعّلها بتعيين `REDIACC_EXPERIMENTAL=1`.

يستخدم كلا المحوّلَين نفس أوامر سطر الأوامر. يؤثر المحوّل فقط على مكان تخزين الحالة وكيفية عمل المصادقة.

## مستخدم rediacc

عند تشغيل `rdc config machine setup`، يُنشئ renet مستخدم نظام باسم `rediacc` على الخادم البعيد:

- **UID**: 7111
- **Shell**: `/sbin/nologin` (لا يمكن تسجيل الدخول عبر SSH)
- **الغرض**: يمتلك ملفات المستودعات ويشغّل دوال Rediaccfile

لا يمكن الوصول إلى مستخدم `rediacc` عبر SSH مباشرة. بدلاً من ذلك، يتصل rdc بمستخدم SSH الذي قمت بتهيئته (مثل `deploy`)، وينفّذ renet عمليات المستودع عبر `sudo -u rediacc /bin/sh -c '...'`. هذا يعني:

1. يحتاج مستخدم SSH الخاص بك إلى صلاحيات `sudo`
2. جميع بيانات المستودع مملوكة لـ `rediacc`، وليس لمستخدم SSH الخاص بك
3. دوال Rediaccfile (`up()` و `down()`) تعمل بصفة `rediacc`

يضمن هذا الفصل أن بيانات المستودع لها ملكية متسقة بغض النظر عن مستخدم SSH الذي يديرها.

## عزل Docker

يحصل كل مستودع على عملية Docker معزولة خاصة به. عند تحميل مستودع، يبدأ renet عملية `dockerd` مخصصة بمقبس فريد:

![عزل Docker](/img/arch-docker-isolation.svg)

```
/var/run/rediacc/docker-{networkId}.sock
```

على سبيل المثال، مستودع بمعرّف شبكة `2816` يستخدم:
```
/var/run/rediacc/docker-2816.sock
```

هذا يعني:
- الحاويات من مستودعات مختلفة لا يمكنها رؤية بعضها البعض
- كل مستودع له ذاكرة تخزين مؤقت خاصة للصور والشبكات والأحجام
- عملية Docker المضيفة (إن وُجدت) منفصلة تماماً

تُعيّن متغير البيئة `DOCKER_HOST` تلقائياً للمقبس الصحيح في دوال Rediaccfile.

## تشفير LUKS

المستودعات هي صور أقراص مشفرة بـ LUKS مخزّنة على مخزن بيانات الخادم (الافتراضي: `/mnt/rediacc`). كل مستودع:

1. لديه عبارة مرور تشفير مُولّدة عشوائياً ("بيانات الاعتماد")
2. يُخزّن كملف: `{datastore}/repos/{guid}.img`
3. يُحمّل عبر `cryptsetup` عند الوصول إليه

تُخزّن بيانات الاعتماد في ملف الإعداد الخاص بك ولكن **لا تُخزّن أبداً** على الخادم. بدون بيانات الاعتماد، لا يمكن قراءة بيانات المستودع. عند تفعيل التشغيل التلقائي، يُخزّن ملف مفتاح LUKS ثانوي على الخادم للسماح بالتحميل التلقائي عند الإقلاع.

## هيكل الإعدادات

كل إعداد هو ملف JSON مسطّح مخزّن في `~/.config/rediacc/`. الإعداد الافتراضي هو `rediacc.json`؛ تستخدم الإعدادات المسمّاة الاسم كاسم للملف (مثلاً `production.json`). فيما يلي مثال مشروح:

```json
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "version": 1,
  "ssh": {
    "privateKeyPath": "/home/you/.ssh/id_ed25519"
  },
  "machines": {
    "prod-1": {
      "ip": "203.0.113.50",
      "user": "deploy",
      "port": 22,
      "datastore": "/mnt/rediacc",
      "knownHosts": "203.0.113.50 ssh-ed25519 AAAA..."
    }
  },
  "storages": {
    "backblaze": {
      "provider": "b2",
      "vaultContent": { "...": "..." }
    }
  },
  "repositories": {
    "webapp": {
      "repositoryGuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "credential": "base64-encoded-random-passphrase",
      "networkId": 2816
    }
  },
  "nextNetworkId": 2880,
  "universalUser": "rediacc"
}
```

**الحقول الرئيسية:**

| الحقل | الوصف |
|-------|-------|
| `id` | معرّف فريد لملف الإعداد هذا |
| `version` | إصدار مخطط ملف الإعداد |
| `ssh.privateKeyPath` | مفتاح SSH الخاص المستخدم لجميع اتصالات الأجهزة |
| `machines.<name>.user` | اسم مستخدم SSH للاتصال بالجهاز |
| `machines.<name>.knownHosts` | مفاتيح مضيف SSH من `ssh-keyscan` |
| `repositories.<name>.repositoryGuid` | معرّف UUID يحدد صورة القرص المشفرة |
| `repositories.<name>.credential` | عبارة مرور تشفير LUKS (**لا تُخزّن على الخادم**) |
| `repositories.<name>.networkId` | يحدد الشبكة الفرعية لعناوين IP (2816 + n*64)، يُعيَّن تلقائياً |
| `nextNetworkId` | عدّاد عام لتعيين معرّفات الشبكة |
| `universalUser` | تجاوز مستخدم النظام الافتراضي (`rediacc`) |

> يحتوي هذا الملف على بيانات حساسة (مسارات مفاتيح SSH، بيانات اعتماد LUKS). يُخزّن بصلاحيات `0600` (قراءة/كتابة للمالك فقط). لا تشاركه أو تضعه في نظام التحكم بالإصدارات.