انتقل إلى المحتوى الرئيسي انتقل إلى الملاحة انتقل إلى التذييل

مرجع الخادم

تخطيط المجلدات، وأوامر renet، وخدمات systemd، وسير العمل على الخادم البعيد.

مرجع الخادم

اتصل عبر SSH بخادم Rediacc وإليك ما ستعمل معه: تخطيط المجلدات وأوامر renet وخدمات systemd وسير العمل الذي ستحتاج إليه.

يدير معظم المستخدمين الخوادم من خلال rdc من جهاز العمل الخاص بهم ولا يحتاجون إلى هذه الصفحة. هي موجودة لتصحيح الأخطاء المتقدم أو عندما تحتاج إلى العمل مباشرة على الخادم.

للاطلاع على البنية العامة، راجع البنية التحتية. للتعرف على الفرق بين rdc و renet، راجع rdc مقابل renet.

تخطيط المجلدات

/mnt/rediacc/                          # Main datastore
├── repositories/                      # Encrypted disk images (LUKS)
│   └── {uuid}                         # Each is a loop device image
├── mounts/                            # Mount points for decrypted repos
│   └── {uuid}/
│       ├── .rediacc.json              # Service → IP slot mapping
│       ├── .rediacc/docker/           # Docker daemon data (images, containers)
│       └── {service-name}/            # Service directory
│           ├── docker-compose.yml     # Compose definition
│           ├── Rediaccfile            # Lifecycle hooks (bash)
│           └── data/                  # Persistent data
├── immovable/                         # Read-only shared content
├── .credentials/                      # Encrypted secrets
└── .backup-*/                         # BTRFS snapshots

/opt/rediacc/proxy/                    # Traefik reverse proxy
├── docker-compose.yml
├── config.env                         # CERTBOT_EMAIL, CF_DNS_API_TOKEN
├── letsencrypt/                       # ACME certificates
└── traefik/dynamic/                   # Dynamic route files

/run/rediacc/docker-{id}.sock          # Per-network Docker sockets
/var/lib/rediacc/router/               # Router state (port allocations)

أوامر renet

renet هو الملف الثنائي على جانب الخادم. جميع الأوامر تتطلب صلاحيات الجذر (sudo).

دورة حياة المستودع

# List all repositories
renet repository list

# Show repository details
renet repository status --name {uuid}

# Start a repository (mount + run Rediaccfile up)
renet repository up --name {uuid} --network-id {id} --password-stdin

# Stop a repository (run Rediaccfile down)
renet repository down --name {uuid} --network-id {id}

# Create a new repository
renet repository create --name {uuid} --network-id {id} --size 2G --encrypted

# Fork (instant copy using BTRFS reflinks)
renet repository fork --source {uuid} --target {new-uuid}

# Expand a running repository (no downtime)
renet repository expand --name {uuid} --size 4G

# Delete a repository and all its data
renet repository delete --name {uuid} --network-id {id}

Docker Compose

تنفيذ أوامر compose على عملية Docker daemon الخاصة بمستودع معين:

sudo renet compose -- up -d
sudo renet compose -- down
sudo renet compose -- logs -f
sudo renet compose -- config

تنفيذ أوامر Docker مباشرة:

sudo renet docker --network-id {id} -- ps
sudo renet docker --network-id {id} -- logs -f {container}
sudo renet docker --network-id {id} -- exec -it {container} bash

يمكنك أيضًا استخدام مقبس Docker مباشرةً:

DOCKER_HOST=unix:///run/rediacc/docker-{id}.sock docker ps

قم دائمًا بتشغيل compose من المجلد الذي يحتوي على docker-compose.yml، وإلا لن يتمكن Docker من العثور على الملف.

عزل نظام الملفات

# التحقق من دعم Landlock
renet sandbox-exec --detect

# تشغيل أمر داخل عزل Landlock (يُستخدم داخليًا)
renet sandbox-exec --allow-rw /path --allow-ro /usr --allow-exec /bin -- command

يطبق sandbox-exec قيود نظام الملفات الخاصة بـ Landlock LSM، ثم ينفذ الأمر المحدد. يُستدعى تلقائيًا بواسطة sandbox-gateway (معالج SSH ForceCommand) لجميع اتصالات مستوى المستودع.

المحور لكل مستخدم (بيئات التطوير)

يمنح Hub كل مستخدم daemon Docker خاصًا به لبيئات التطوير، مستقلًا عن daemons FlavorRediacc الخاصة بكل مستودع.

# تثبيت / إزالة وحدات systemd الخاصة بـ Hub لكل مستخدم
sudo renet hub install
sudo renet hub uninstall

# تنظيف daemons Hub الخاملة لكل مستخدم
sudo renet hub gc

تعمل الـ daemons تحت أحد نوعين، يُحدد عبر --flavor:

# daemon معزول لكل مستودع (bridge=none, iptables=false) — الافتراضي
sudo renet daemon start-foreground --flavor=rediacc ...

# daemon Hub لكل مستخدم (bridge=docker0, iptables=true, live-restore=true)
sudo renet daemon start-foreground --flavor=hub ...

يُتيح نوع hub شبكة bridge العادية حتى تتمتع الحاويات التي يشغّلها المستخدم باتصال خارجي؛ أما نوع rediacc فيفرض عزل loopback بين المستودعات. تُكتب سجلات تدقيق Hub في /var/log/rediacc/hub/<user>.log.

الأعلام:

  • --allow-rw، --allow-ro، --allow-exec: قواعد مسارات Landlock
  • --home-overlay: تركيب OverlayFS فوق المجلد الرئيسي لعزل الكتابة لكل مستودع
  • --sandbox-dir: مساحة عمل لكل مستودع (<datastore>/.interim/sandbox/<name>/)
  • --work-dir: تعيين دليل العمل وتحميل .envrc لبيئة المستودع
  • --run-as: إسقاط الامتيازات للمستخدم المستهدف بعد الإعداد
  • --reset-home: مسح طبقة التراكب الرئيسية لكل مستودع للبدء من جديد

sandbox-gateway هو معالج SSH ForceCommand المعين عبر command= في authorized_keys. يُشغّل مفتاح SSH الخاص بكل مستودع البوابة مع اسم المستودع المضمّن فيه، وهو أمر لا يمكن للعميل تزويره. تقوم البوابة ببناء وسائط sandbox-exec وتنفيذها عبر sudo.

الوكيل والتوجيه

renet proxy status          # Check Traefik + router health
renet proxy routes          # Show all configured routes
renet proxy refresh         # Refresh routes from running containers
renet proxy up / down       # Start/stop Traefik
renet proxy logs            # View proxy logs

يتم اكتشاف المسارات تلقائيًا من تسميات الحاويات. راجع الشبكات لمعرفة كيفية تكوين تسميات Traefik.

حالة النظام

renet ps                    # Overall system status
renet list all              # Everything: system, containers, repositories
renet list containers       # All containers across all Docker daemons
renet list repositories     # Repository status and disk usage
renet list system           # CPU, memory, disk, network
renet ips --network-id {id} # IP allocations for a network

إدارة العمليات الخلفية

يعمل كل مستودع بعملية Docker daemon خاصة به. يمكنك إدارتها بشكل فردي:

renet daemon status --network-id {id}    # Docker daemon health
renet daemon start  --network-id {id}    # Start daemon
renet daemon stop   --network-id {id}    # Stop daemon
renet daemon logs   --network-id {id}    # Daemon logs

النسخ الاحتياطي والاستعادة

إرسال النسخ الاحتياطية إلى جهاز آخر أو إلى التخزين السحابي:

# Push to remote machine (SSH + rsync)
renet backup push --name {uuid} --network-id {id} --target machine \
  --dest-host {host} --dest-user {user} --dest-path /mnt/rediacc --dest {uuid}.backup

# Push to cloud storage (rclone)
renet backup push --name {uuid} --network-id {id} --target storage \
  --dest {uuid}.backup --rclone-backend {backend} --rclone-bucket {bucket}

# Pull from remote
renet backup pull --name {uuid} --network-id {id} --source machine \
  --src-host {host} --src-user {user} --src-path /mnt/rediacc --src {uuid}.backup

# List remote backups
renet backup list --source machine --src-host {host} --src-user {user} --src-path /mnt/rediacc

يجب على معظم المستخدمين استخدام rdc repo push/pull بدلاً من ذلك. تتعامل أوامر rdc مع بيانات الاعتماد وتحليل الأجهزة تلقائيًا.

نقاط التحقق (CRIU)

تحفظ نقاط التحقق حالة الحاويات قيد التشغيل بحيث يمكن استعادتها لاحقًا:

renet checkpoint create    --network-id {id}   # Save running container state
renet checkpoint restore   --network-id {id}   # Restore from checkpoint
renet checkpoint validate  --network-id {id}   # Check checkpoint integrity

الصيانة

renet prune --dry-run       # Preview orphaned networks and IPs
renet prune                 # Clean up orphaned resources
renet datastore status      # BTRFS datastore health
renet datastore validate    # Filesystem integrity check
renet datastore expand      # Expand the datastore online

طبقات مخزن البيانات (Ceph RBD)

مخزن البيانات إما محلي (BTRFS مدعوم بجهاز loop على قرص الجهاز، الافتراضي) أو مدعوم بعنقود Ceph خارجي عبر صورة RBD. تُختار الطبقة عند init:

# الطبقة المحلية (الافتراضية)
renet datastore init --size 50G

# طبقة Ceph RBD: BTRFS على صورة RBD مُعيَّنة من عنقود Ceph خارجي
renet datastore init --backend ceph --pool rbd --image {name} --cluster ceph

على طبقة Ceph، يستخدم التفريع وإلغاء التفريع أوليات النسخ عند الكتابة الخاصة بـ RBD بدلاً من reflinks الخاصة بـ BTRFS:

renet datastore fork   --source {image} --target {new-image}   # لقطة RBD -> حماية -> استنساخ
renet datastore unfork --image {image}                         # تفكيك استنساخ بترتيب التبعية

لا تفتح عُقد Ceph أبداً LUKS (لا توجد طبقة LUKS لكل صورة في هذه الطبقة)، لذا يتبع بصمة ذاكرتها ضبط عملية Ceph الخلفية (osd_memory_target)، لا رياضيات KDF. يمكن لعميل ثانٍ تعيين نفس صورة RBD للقراءة فقط مع طبقة تراكب محلية للنسخ عند الكتابة، وهو مسار التوسع للقراءة الغالبة.

Kubernetes (renet kube)

على عقدة عنقود، يُغلِّف renet k3s بنفس الطريقة التي يُغلِّف بها Docker. renet kube هو نظير compose: يحقن KUBECONFIG ويطبّق البيانات أو مخططات Helm من up() الخاصة بملف Rediaccfile.

sudo renet kube apply -f manifests/     # التطبيق داخل فضاء أسماء المستودع
sudo renet kube -- get pods             # التمرير إلى kubectl في فضاء الأسماء المثبَّت

تعيش حالة العنقود في صور نسخ عند الكتابة مدعومة بمخزن البيانات (يرتبط --data-dir الخاص بـ k3s داخل نقطة تحميل الصورة)، وهو ما يسمح لعنقود كامل بالتفرع والهجرة. الأحجام الثابتة هي وحدات نسخ عند الكتابة منفصلة: صور RBD على Ceph (فضاء أسماء RADOS واحد لكل نسخة عنقود ولكل تفريع)، أو ملفات صور صغيرة لمخزن البيانات عبر موفر PV محلي على الطبقة المحلية. سير العمل من جهة المستخدم موجود في دليل Kubernetes؛ تُوجِّه CLI هذه المسارات عبر rdc cluster وأوامر rdc repo المتوافقة مع العناقيد.

خدمات systemd

ينشئ كل مستودع وحدات systemd التالية:

الوحدةالغرض
rediacc-docker-{id}.serviceعملية Docker daemon معزولة
rediacc-docker-{id}.socketتفعيل مقبس Docker API
rediacc-loopback-{id}.serviceإعداد عنوان IP الاسترجاعي
rediacc-k3s-{id}.serviceعقدة k3s لكل عنقود (مضيفات العناقيد فقط)

الخدمات العامة المشتركة بين جميع المستودعات:

الوحدةالغرض
rediacc-router.serviceاكتشاف المسارات (المنفذ 7111)
rediacc-autostart.serviceتحميل المستودعات عند الإقلاع
rediacc-autostart-reconcile.serviceالمُوفِّق الدوري للتشغيل التلقائي (يُشغَّل بواسطة المؤقت أدناه)
rediacc-autostart-reconcile.timerيُطلق renet repository reconcile تقريباً كل 3 دقائق لاسترداد مستودعات التشغيل التلقائي التي توقفت بعد الإقلاع

سير العمل الشائعة

نشر خدمة جديدة

  1. إنشاء مستودع مشفر:
    renet repository create --name {uuid} --network-id {id} --size 2G --encrypted
  2. تحميله وإضافة ملفات docker-compose.yml و Rediaccfile و .rediacc.json.
  3. تشغيله:
    renet repository up --name {uuid} --network-id {id} --password-stdin

الوصول إلى حاوية قيد التشغيل

sudo renet docker --network-id {id} -- exec -it {container} bash

العثور على مقبس Docker الذي يشغّل حاوية

for sock in /run/rediacc/docker-*.sock; do
  result=$(DOCKER_HOST=unix://$sock docker ps --format '{{.Names}}' 2>/dev/null | grep {name})
  [ -n "$result" ] && echo "Found on: $sock"
done

إعادة إنشاء خدمة بعد تغيير التكوين

sudo renet compose -- up -d

قم بتشغيل هذا من المجلد الذي يحتوي على docker-compose.yml. يتم إعادة إنشاء الحاويات المُعدّلة تلقائيًا.

فحص جميع الحاويات عبر جميع العمليات الخلفية

renet list containers

نصائح

  • استخدم دائمًا sudo لأوامر renet compose و renet repository و renet docker، فهي تحتاج صلاحيات الجذر لعمليات LUKS و Docker
  • الفاصل -- مطلوب قبل تمرير الوسائط إلى renet compose و renet docker
  • قم بتشغيل compose من المجلد الذي يحتوي على docker-compose.yml
  • تعيينات فتحات .rediacc.json ثابتة، لا تغيّرها بعد النشر
  • استخدم مسارات /run/rediacc/docker-{id}.sock (قد يغيّر systemd مسارات /var/run/ القديمة)
  • قم بتشغيل renet prune --dry-run من وقت لآخر للعثور على الموارد المعزولة
  • لقطات BTRFS (renet backup) سريعة وقليلة التكلفة، استخدمها قبل إجراء تغييرات محفوفة بالمخاطر
  • المستودعات مشفرة بـ LUKS، فقدان كلمة المرور يعني فقدان البيانات