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

دليل الترحيل

ترحيل المشاريع الحالية إلى مستودعات Rediacc المشفرة.

دليل الترحيل

قم بترحيل مشروع حالي, الملفات وخدمات Docker وقواعد البيانات, من خادم تقليدي أو بيئة تطوير محلية إلى مستودع Rediacc مشفر.

المتطلبات الأساسية

  • تثبيت واجهة سطر الأوامر rdc (التثبيت)
  • إضافة جهاز وتجهيزه (الإعداد)
  • مساحة قرص كافية على الخادم لمشروعك (تحقق باستخدام rdc machine status)

الخطوة 1: إنشاء مستودع

أنشئ مستودعاً مشفراً بحجم يناسب مشروعك. خصص مساحة إضافية لصور Docker وبيانات الحاويات.

rdc repo create --name my-project -m server-1 --size 20G

نصيحة: يمكنك تغيير الحجم لاحقاً باستخدام rdc repo resize إذا لزم الأمر، لكن يجب إلغاء تحميل المستودع أولاً. من الأسهل البدء بمساحة كافية.

الخطوة 2: رفع الملفات

استخدم rdc repo sync upload لنقل ملفات مشروعك إلى المستودع.

# معاينة ما سيتم نقله (بدون إجراء تغييرات)
rdc repo sync upload -m server-1 -r my-project --local ./my-project --dry-run

# رفع الملفات
rdc repo sync upload -m server-1 -r my-project --local ./my-project

يجب أن يكون المستودع محمّلاً قبل الرفع. إذا لم يكن محمّلاً بالفعل:

rdc repo mount --name my-project -m server-1

لعمليات المزامنة اللاحقة حيث تريد أن يطابق المحتوى البعيد دليلك المحلي تماماً:

rdc repo sync upload -m server-1 -r my-project --local ./my-project --mirror

يحذف خيار --mirror الملفات على الخادم البعيد التي لا توجد محلياً. استخدم --dry-run أولاً للتحقق.

الخطوة 3: إصلاح ملكية الملفات

تصل الملفات المرفوعة بمعرّف المستخدم المحلي الخاص بك (مثل 1000). يستخدم Rediacc مستخدماً موحداً (UID 7111) بحيث يتمتع VS Code وجلسات الطرفية والأدوات جميعها بوصول متسق. شغّل أمر الملكية للتحويل:

rdc repo ownership --name my-project -m server-1

استثناء مدرك لـ Docker

إذا كانت حاويات Docker قيد التشغيل (أو تم تشغيلها سابقاً)، يكتشف أمر الملكية تلقائياً أدلة البيانات القابلة للكتابة الخاصة بها ويتخطاها. هذا يمنع تعطيل الحاويات التي تدير ملفاتها الخاصة بمعرّفات مستخدم مختلفة (مثل MariaDB يستخدم UID 999، وNextcloud يستخدم UID 33).

يعرض الأمر تقريراً بما يفعله:

Excluding Docker volume: database/data
Excluding Docker volume: redis/data
Ownership set to UID 7111 (245 changed, 4 skipped, 0 errors)

متى يتم التشغيل

  • بعد رفع الملفات, لتحويل معرّف المستخدم المحلي إلى 7111
  • بعد بدء الحاويات, إذا كنت تريد استثناء أدلة أحجام Docker تلقائياً. إذا لم تكن الحاويات قد بدأت بعد، فلا توجد أحجام للاستثناء وسيتم تغيير ملكية جميع الأدلة (وهذا مقبول, ستعيد الحاويات إنشاء بياناتها عند أول تشغيل)

وضع الإجبار

لتخطي اكتشاف أحجام Docker وتغيير ملكية كل شيء، بما في ذلك أدلة بيانات الحاويات:

rdc repo ownership --name my-project -m server-1

تحذير: قد يؤدي هذا إلى تعطيل الحاويات قيد التشغيل. أوقفها أولاً باستخدام rdc repo down إذا لزم الأمر.

معرّف مستخدم مخصص

لتعيين معرّف مستخدم غير القيمة الافتراضية 7111:

rdc repo ownership --name my-project -m server-1 --uid 1000

الخطوة 4: إعداد Rediaccfile

أنشئ ملف Rediaccfile في جذر مشروعك. هذا السكربت بلغة Bash يحدد كيفية بدء خدماتك وإيقافها.

#!/bin/bash

up() {
    renet compose -- up -d
}

down() {
    renet compose -- down
}

الدوال الثلاث لدورة الحياة:

الدالةالغرضسلوك الخطأ
up()بدء الخدماتفشل الجذر حرج؛ فشل الأدلة الفرعية يُسجّل ويستمر
down()إيقاف الخدماتبأفضل جهد: يحاول دائماً تنفيذ الكل

مهم: استخدم دائماً renet compose -- بدلاً من docker compose في Rediaccfile الخاص بك. يفرض غلاف renet compose شبكة المضيف، وقدرات CRIU للحفظ/الاستعادة، وتخصيص عناوين IP، واكتشاف الخدمات المطلوب من renet-proxy. استخدام docker compose مباشرة يتجاوز كل هذا وسيتم رفضه أثناء التحقق.

لا تستخدم أبداً sudo docker أيضاً, يعيد sudo تعيين متغيرات البيئة بما في ذلك DOCKER_HOST، مما يؤدي إلى إنشاء الحاويات على Docker daemon الخاص بالنظام بدلاً من daemon المعزول للمستودع. تعمل دوال Rediaccfile بالفعل بصلاحيات كافية.

انظر الخدمات للحصول على تفاصيل كاملة حول ملفات Rediaccfile وتخطيطات الخدمات المتعددة وترتيب التنفيذ.

الخطوة 5: تهيئة شبكة الخدمات

يشغّل Rediacc Docker daemon معزولاً لكل مستودع. تستخدم الخدمات network_mode: host وتربط بعناوين loopback فريدة بحيث يمكنها استخدام المنافذ القياسية دون تعارضات بين المستودعات.

تكييف docker-compose.yml

قبل (التقليدي):

services:
  postgres:
    image: postgres:16
    ports:
      - "5432:5432"
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: secret

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

  app:
    image: my-app:latest
    ports:
      - "8080:8080"
    environment:
      DATABASE_URL: postgresql://postgres:secret@postgres:5432/mydb
      REDIS_URL: redis://redis:6379

بعد (Rediacc):

services:
  postgres:
    image: postgres:16
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: secret
    command: -c listen_addresses=${POSTGRES_IP} -c port=5432

  redis:
    image: redis:7-alpine
    command: redis-server --bind ${REDIS_IP} --port 6379

  app:
    image: my-app:latest
    environment:
      DATABASE_URL: postgresql://postgres:secret@${POSTGRES_IP}:5432/mydb
      REDIS_URL: redis://${REDIS_IP}:6379
      LISTEN_ADDR: ${APP_IP}:8080

التغييرات الرئيسية:

  1. إزالة تعيينات ports:, renet compose يستخدم شبكة المضيف ويزيل تعيينات المنافذ تلقائياً
  2. إزالة network_mode: host, renet compose يضيف هذا تلقائياً
  3. إزالة restart: always أو restart: unless-stopped, تتعارض مع CRIU checkpoint/restore (يقوم Docker بتشغيل الحاويات تلقائياً قبل أن يتمكن checkpoint restore من العمل). استخدم restart: on-failure إذا كنت تحتاج سلوك إعادة التشغيل، أو احذفه بالكامل, تدير up()/down() في Rediaccfile دورة حياة الحاوية
  4. ربط الخدمات بمتغيرات البيئة ${SERVICE_IP} (يتم حقنها تلقائياً بواسطة Rediacc)
  5. الإشارة إلى الخدمات الأخرى بعنوان IP الخاص بها بدلاً من أسماء Docker DNS (مثل ${POSTGRES_IP} بدلاً من postgres)

يتم إنشاء متغيرات {SERVICE}_IP تلقائياً من أسماء الخدمات في ملف compose الخاص بك. قاعدة التسمية: أحرف كبيرة، استبدال الشرطات بشرطات سفلية، وإضافة لاحقة _IP. على سبيل المثال، listmonk-app يصبح LISTMONK_APP_IP.

انظر شبكة الخدمات للتفاصيل حول تعيين عناوين IP و.rediacc.json.

الخطوة 6: بدء الخدمات

قم بتحميل المستودع (إذا لم يكن محمّلاً بالفعل) وابدأ جميع الخدمات:

rdc repo up --name my-project -m server-1 --mount

سيقوم هذا بما يلي:

  1. تحميل المستودع المشفر
  2. بدء Docker daemon المعزول
  3. إنشاء .rediacc.json تلقائياً مع تعيينات عناوين IP للخدمات
  4. تشغيل up() من جميع ملفات Rediaccfile

تحقق من أن الحاويات تعمل:

rdc machine containers server-1

الخطوة 7: تفعيل البدء التلقائي (اختياري)

بشكل افتراضي، يجب تحميل المستودعات وبدء تشغيلها يدوياً بعد إعادة تشغيل الخادم. فعّل البدء التلقائي حتى تبدأ خدماتك تلقائياً:

rdc repo autostart enable --name my-project -m server-1

سيُطلب منك إدخال عبارة مرور المستودع.

ملاحظة أمنية: يخزّن البدء التلقائي ملف مفتاح LUKS على الخادم. أي شخص لديه صلاحيات root يمكنه تحميل المستودع بدون عبارة المرور. انظر البدء التلقائي للتفاصيل.

سيناريوهات الترحيل الشائعة

WordPress / PHP مع قاعدة بيانات

my-wordpress/
├── Rediaccfile
├── docker-compose.yml
├── app/                    # ملفات WordPress (UID 33 عند التشغيل)
├── database/data/          # بيانات MariaDB (UID 999 عند التشغيل)
└── wp-content/uploads/     # ملفات المستخدمين المرفوعة
  1. ارفع ملفات مشروعك
  2. ابدأ الخدمات أولاً (rdc repo up) حتى تنشئ الحاويات أدلة بياناتها
  3. شغّل إصلاح الملكية, يتم استثناء أدلة بيانات MariaDB والتطبيق تلقائياً

Node.js / Python مع Redis

my-api/
├── Rediaccfile
├── docker-compose.yml
├── src/                    # الكود المصدري للتطبيق
├── node_modules/           # التبعيات
└── redis-data/             # بيانات Redis المستمرة (UID 999 عند التشغيل)
  1. ارفع مشروعك (فكّر في استثناء node_modules وسحبها في up())
  2. شغّل إصلاح الملكية بعد بدء الحاويات

مشروع Docker مخصص

لأي مشروع يحتوي على خدمات Docker:

  1. ارفع ملفات المشروع
  2. كيّف docker-compose.yml (انظر الخطوة 5)
  3. أنشئ Rediaccfile بدوال دورة الحياة
  4. شغّل إصلاح الملكية
  5. ابدأ الخدمات

استكشاف الأخطاء وإصلاحها

رفض الإذن بعد الرفع

لا تزال الملفات تحمل معرّف المستخدم المحلي الخاص بك. شغّل أمر الملكية:

rdc repo ownership --name my-project -m server-1

الحاوية لا تبدأ

تحقق من أن الخدمات تربط بعنوان IP المعيّن لها، وليس 0.0.0.0 أو localhost:

# تحقق من عناوين IP المعيّنة
rdc term connect -m server-1 -r my-project -c "cat .rediacc.json"

# تحقق من سجلات الحاوية
rdc term connect -m server-1 -r my-project -c "docker logs <container-name>"

تعارض المنافذ بين المستودعات

يحصل كل مستودع على عناوين loopback فريدة. إذا رأيت تعارضات في المنافذ، تحقق من أن docker-compose.yml يستخدم ${SERVICE_IP} للربط بدلاً من 0.0.0.0. الخدمات المربوطة بـ 0.0.0.0 تستمع على جميع الواجهات وستتعارض مع المستودعات الأخرى.

إصلاح الملكية يعطّل الحاويات

إذا شغّلت rdc repo ownership وتوقفت حاوية عن العمل، فقد تم تغيير ملكية ملفات بيانات الحاوية. أوقف الحاوية واحذف دليل بياناتها وأعد تشغيلها, ستعيد الحاوية إنشاءه:

rdc repo down --name my-project -m server-1
# احذف دليل بيانات الحاوية (مثل database/data)
rdc repo up --name my-project -m server-1