الأدلة التقنية

NocoDB على خادمك: جداول على طريقة Airtable وبيانات تبقى في حوزتك

إذا كانت بيانات فريقك في ملفات Excel مشتركة أو في Airtable، فهذا الدليل ينقلها إلى NocoDB على سيرفرك مع PostgreSQL، ويشرح حساب المدير ورمز الـ API والنسخ الاحتياطي والتحديث.

NocoDB على خادمك: جداول على طريقة Airtable وبيانات تبقى في حوزتك

في كثير من الشركات تجد أن بيانات العملاء والمخزون والطلبات تعيش في ملفات Excel على مجلد مشترك Shared Drive أو تتنقل بين الموظفين في البريد، وهذا هو الحل الأول الذي يبدأ به الجميع لأنه لا يحتاج إلى أي إعداد، ولكن مع الوقت سوف تجد أن لا أحد يعرف أين أحدث نسخة من الملف، وأن موظفين عدلا الملف نفسه في الوقت نفسه فضاعت تعديلات أحدهما، وأن الملف لا يتحقق من أي قيمة تكتب فيه، فيضع أحدهم البريد في عمود الهاتف ولا يعترض عليه أحد، والسبب أن ملف الجداول Spreadsheet صمم للحسابات وليس لحفظ بيانات يعمل عليها فريق كامل.

📌
في 4 أكتوبر 2020 أعلنت هيئة الصحة العامة في إنجلترا Public Health England أن 15,841 حالة إصابة بكورونا بين 25 سبتمبر و2 أكتوبر لم تدخل في الأرقام اليومية، وكما شرحت BBC فالسبب أن الهيئة كانت تجمع نتائج المختبرات في قوالب Excel بالصيغة القديمة XLS التي لا تتسع لأكثر من 65 ألف سطر تقريباً، فكان كل ما يزيد على ذلك يسقط من الملف دون أي رسالة خطأ، والدرس أن ملف الجداول ليس قاعدة بيانات، فهو لا يرفض ما لا يتسع له ولا يخبرك بما فقدته.

لذلك ينتقل الفريق عادة إلى الحل الثاني، وهو خدمة سحابية مثل Airtable تعطيه جداول مشتركة يعدل فيها الجميع في الوقت نفسه، وهذا يحل مشكلة النسخ المتعددة، ولكنه يأتي بمشكلة أخرى، وهي أن بيانات عملائك أصبحت على سيرفرات Servers شركة أخرى خارج سيطرتك، وأنك تدفع اشتراكاً عن كل مستخدم، وكلما كبر الفريق كبرت الفاتورة.

والحل الأنسب في رأينا هو أن تشغل الأداة نفسها على سيرفرك، وهنا يأتي دور NocoDB الذي يعطيك جداول Tables تشبه Airtable في الاستخدام، وفيه أنواع متعددة من الحقول Fields منها البريد والعملة وقوائم الاختيار والمرفقات والروابط Links بين الجداول، ويمكنك أن تعرض الجدول الواحد بعدة طرق Views مثل الشبكة Grid والنموذج Form والمعرض Gallery وKanban والتقويم، وتحدد صلاحيات Permissions كل عضو، ويصلك مع كل جدول واجهة REST API جاهزة، والبيانات كلها تبقى في قاعدة PostgreSQL تملكها أنت.

وقد يتساءل البعض: هل ما زال NocoDB مفتوح المصدر Open Source كما كان؟ والإجابة أن المشروع غير رخصته License في 9 يناير 2026 من AGPL-3.0 إلى Sustainable Use License، وهي رخصة تسمح لك بقراءة الكود وتعديله ولكنها تضع قيوداً على الاستخدام التجاري، لذلك لم يعد NocoDB مفتوح المصدر بالمعنى الدقيق، وهذا يعني لك عملياً أنك تستطيع تشغيله على سيرفرك لعمل شركتك الداخلي أو لاستخدامك الشخصي دون أي رسوم مهما كان حجم شركتك، أما إذا أردت أن تقدمه لعملائك كخدمة مستضافة Hosted Service أو تعطيهم دخولاً مباشراً إليه فسوف تحتاج إلى رخصة تجارية Commercial License.

ويناسب NocoDB قواعد البيانات Databases التشغيلية الصغيرة والمتوسطة التي يديرها موظفون لا يبرمجون، مثل نظام CRM بسيط أو سجل للأصول أو متابعة للطلبات، ولكنه لا يحل محل تطبيق مبني لغرض محدد إذا احتاج العمل إلى منطق معقد، ولا محل قاعدة بيانات تحليلية Analytical Database فيها ملايين السجلات Records. ولاحظ أن بعض الميزات مقصورة على النسخ المدفوعة، مثل إدارة الفرق والمزامنة Sync ولوحات المؤشرات Dashboards، وسوف تجدها في الواجهة UI وعليها علامة Business.

وسوف نناقش في هذا المقال ما يلي:

  • تثبيت NocoDB مع PostgreSQL وRedis عبر Docker Compose خلف الـ Reverse Proxy، ومعنى كل متغير في الإعداد.
  • إنشاء حساب المدير الأول وإغلاق التسجيل المفتوح قبل أن يسبقك إليه أحد.
  • إنشاء أول قاعدة Base وجدول، ثم رمز API تقرأ به البيانات وتضيفها من أدوات الأتمتة.
  • النسخ الاحتياطي والاستعادة والتحديث، وأشهر المشكلات وحلولها.

ما تحتاجه قبل أن تبدأ Requirements

  • سيرفر مثبت عليه Docker وCompose، وإذا لم تثبته بعد فابدأ بدليل تثبيت Docker على Ubuntu.
  • الموارد Resources: يستهلك الـ Container الخاص بـ NocoDB قرابة 620 ميجابايت من الذاكرة RAM، وPostgreSQL قرابة 75 ميجابايت، وRedis قرابة 12 ميجابايت، لذلك خصص للخدمة 2 GB من الذاكرة على الأقل حتى يبقى لها هامش عندما يكثر المستخدمون.
  • نطاق Domain مثل data.example.com، وReverse Proxy يعمل بـ HTTPS مثل Nginx Proxy Manager ومتصل بشبكة Docker باسم proxy.
  • خادم بريد SMTP إذا أردت أن تدعو الأعضاء بالبريد وأن يستعيدوا كلمات المرور بأنفسهم.

تثبيت NocoDB بـ Docker Compose

نبدأ بإنشاء مجلد للخدمة يحفظ فيه ملف Compose وملف الأسرار:

sudo mkdir -p /opt/nocodb
sudo chown $USER: /opt/nocodb
cd /opt/nocodb

بعد ذلك تحتاج إلى سرين Secrets تمررهما إلى الـ Containers عبر متغيرات البيئة Environment Variables، وهما كلمة مرور PostgreSQL، وسر توقيع جلسات الدخول JWT. وإذا لم تحدد سر JWT فسوف يولده NocoDB بنفسه، ولكن تثبيته في ملف .env يجعله جزءاً من إعدادك الذي تنسخه وتنقله معك، فلا تنقطع جلسات المستخدمين حين تنقل الخدمة إلى سيرفر آخر أو تعيد بناءها:

cat > .env <<EOF
POSTGRES_PASSWORD=$(openssl rand -hex 24)
NC_AUTH_JWT_SECRET=$(openssl rand -hex 32)
EOF
chmod 600 .env

واستخدمنا الخيار -hex لأن كلمة المرور تدخل في رابط الاتصال NC_DB، والرموز مثل @ و/ و& تكسر هذا الرابط، أما الحروف والأرقام الست عشرية فلا تسبب أي مشكلة.

الآن سوف ننشئ الملف /opt/nocodb/compose.yaml، ويمكنك مقارنته بما في دليل التثبيت الرسمي بـ Docker Compose وأمثلة Compose الرسمية:

services:
  nocodb:
    image: nocodb/nocodb:2026.09.1
    container_name: nocodb
    restart: unless-stopped
    environment:
      NC_DB: "pg://db:5432?u=nocodb&p=${POSTGRES_PASSWORD}&d=nocodb"
      NC_AUTH_JWT_SECRET: ${NC_AUTH_JWT_SECRET}
      NC_REDIS_URL: redis://redis:6379
      NC_SITE_URL: https://data.example.com
      NC_DISABLE_TELE: "true"
      NC_DISABLE_MUX: "true"
    volumes:
      - nocodb_data:/usr/app/data
    networks:
      - internal
      - proxy
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test: ["CMD-SHELL", "wget -q --tries=1 --spider http://localhost:8080/api/v1/health || exit 1"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s

  db:
    image: postgres:17.11
    container_name: nocodb-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: nocodb
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: nocodb
    volumes:
      - pg_data:/var/lib/postgresql/data
    networks:
      - internal
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U nocodb -d nocodb"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:8.6.7
    container_name: nocodb-redis
    restart: unless-stopped
    volumes:
      - redis_data:/data
    networks:
      - internal
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  nocodb_data:
    name: nocodb_data
  pg_data:
    name: nocodb_pg
  redis_data:
    name: nocodb_redis

networks:
  internal: {}
  proxy:
    external: true

في الإعداد أعلاه لاحظ التالي:

  • NC_DB يجعل PostgreSQL القاعدة الأساسية لـ NocoDB، ففيها تحفظ بيانات التعريف Metadata أي المستخدمون والقواعد والعروض، وجداولك نفسها أيضاً، ولكل قاعدة مخطط Schema مستقل. وإذا لم تحدد هذا المتغير فسوف يستخدم NocoDB ملف SQLite داخل الـ Container، وهذا لا يصلح إلا للتجربة.
  • Redis للتخزين المؤقت Cache وطوابير المهام Job Queues، وهو يسرع الواجهة حين يكثر المستخدمون، ورغم أنه اختياري فالأمثلة الرسمية تتضمنه. والاسم الحالي لهذا المتغير في التوثيق هو NC_CACHE_REDIS_URL، والاسم NC_REDIS_URL الذي نستخدمه هنا وفي الأمثلة الرسمية ما زال مدعوماً.
  • NC_SITE_URL هو الرابط العام للخدمة، ومنه يبني NocoDB روابط رسائل الدعوة واستعادة كلمة المرور ورابط صفحة توثيق الـ API، وقد تجده في الشروحات القديمة باسمه السابق NC_PUBLIC_URL الذي ما زال مدعوماً.
  • NC_DISABLE_TELE يوقف إرسال بيانات الاستخدام المجهولة Telemetry إلى الشركة، وهذا منطقي لأنك تستضيف الأداة بنفسك حتى تبقى بياناتك عندك. أما NC_DISABLE_MUX فنقلناه كما هو من المثال الرسمي.
  • nocodb_data فيه المرفقات Attachments المرفوعة إذا لم تستخدم تخزين S3، وملفات محلية أخرى.
  • الملف لا ينشر أي منفذ Port على المضيف Host، والسبب أن الـ Reverse Proxy يصل إلى nocodb:8080 عبر شبكة proxy، وإذا أردت أن تجرب قبل إعداده فأضف ports: ["127.0.0.1:8080:8080"] وادخل عبر نفق SSH Tunnel.
  • المثال الرسمي يضيف Container رابعاً باسم worker للمهام التي تعمل في الخلفية Background Jobs مثل الاستيراد والتصدير، ولكن الـ Container الرئيسي ينفذ هذه المهام بنفسه إذا لم يوجد worker، لذلك نكتفي به على سيرفر صغير، وتضيف الـ worker عندما يكبر الحمل.

بعد ذلك أنشئ شبكة proxy إذا لم تكن موجودة، وشغل الخدمات:

docker network create proxy
docker compose up -d
docker compose ps
docker compose logs --tail 5 nocodb

والمخرج سوف يكون كما يلي:

nocodb         Up About a minute (healthy)
nocodb-db      Up 2 minutes (healthy)
nocodb-redis   Up 2 minutes (healthy)
...
App started successfully.

الإقلاع الأول Startup يأخذ دقيقة أو دقيقتين، والسبب أن NocoDB ينشئ فيه جداول النظام System Tables في PostgreSQL. وبعدها أنشئ في الـ Reverse Proxy مضيفاً من نوع Proxy Host للنطاق data.example.com يوجه الطلبات إلى http://nocodb:8080، واطلب له شهادة Let's Encrypt Certificate، وفعل Force SSL وWebsockets Support، والخيار الأخير ضروري حتى تعمل التحديثات الحية Real-time Updates في الجداول، فبدونه لن يرى الموظف تعديل زميله حتى يعيد تحميل الصفحة.

إنشاء حساب المدير الأول Admin Account

افتح https://data.example.com، ولاحظ أن أول من يسجل يصبح المدير الأعلى Super Admin للسيرفر كله، وأن التسجيل يبقى مفتوحاً لأي شخص بعده، لذلك سجل فوراً بعد تشغيل الخدمة حتى لا يسبقك أحد إذا كان الرابط مفتوحاً للعموم:

شاشة SIGN UP في NocoDB مع حقلي البريد وكلمة المرور
التسجيل الأول: هذا الحساب يصبح المدير الأعلى

بعد ذلك يسألك NocoDB عن غرض الاستخدام، ويمكنك تخطي السؤال بالزر Skip، ثم تصل إلى مساحة العمل Workspace الافتراضية وفيها قاعدة نموذجية باسم «Getting Started». وقبل أن تبدأ العمل قم بثلاثة أمور:

  • عطل التسجيل المفتوح Open Signup من Settings أسفل يسار الواجهة، حتى لا يدخل أحد إلا بدعوة، ويمكنك تثبيت ذلك في الإعداد بمتغير البيئة NC_INVITE_ONLY_SIGNUP: "true".
  • اضبط SMTP من الإعدادات حتى تصل الدعوات ورسائل استعادة كلمة المرور.
  • فعل التحقق بخطوتين Two-Factor Authentication من إعدادات الحساب ثم Security إذا كانت نسختك تتيحه.

إنشاء أول قاعدة Base وجدول

الـ Base في NocoDB تقابل «الملف» في Airtable، أي مجموعة جداول مترابطة لها أعضاؤها وصلاحياتها. اضغط New Base وأعطها اسماً مناسباً، وفي مثالنا سميناها CRM:

نافذة Create Base في NocoDB مع اسم القاعدة CRM
قاعدة جديدة باسم CRM

وداخل القاعدة اختر Create New Table واكتب اسم الجدول Customers، وإذا كانت بياناتك الآن في ملف CSV أو Excel فاختر Import Data، فهذه أسرع طريقة لنقل جداول البيانات Spreadsheets إلى NocoDB دون أن تعيد كتابتها:

نافذة Create Table داخل قاعدة CRM مع خيارات إنشاء جدول أو استيراد بيانات
إنشاء جدول جديد أو استيراده من ملف

أضف الحقول من رأس الجدول بزر + الذي بجانب آخر عمود Column، وفي مثالنا أربعة حقول: Email من نوع Email، وCompany نص Text، وStatus قائمة اختيار Single Select فيها Lead وCustomer وChurned، وDeal عملة Currency. واختر النوع الصحيح لكل حقل، والسبب أن NocoDB يعتمد عليه في التحقق Validation من صيغة البريد، وتلوين عناصر القوائم، وفرز الأرقام وجمعها بدقة، وهذا بالضبط ما كان ينقص ملف Excel على المجلد المشترك.

عرض الشبكة لجدول Customers في NocoDB مع أعمدة الاسم والبريد والشركة والحالة وقيمة الصفقة
جدول العملاء في عرض الشبكة مع قوائم الاختيار الملونة وحقل العملة

وفوق الجدول شريط أدوات Toolbar فيه Filter وSort وGroup، وكل ما تضبطه منها يحفظ مع العرض، ويمكنك أن تنشئ للجدول نفسه أكثر من عرض، مثلاً عرض Kanban مجمع حسب الحالة لفريق المبيعات، أو نموذج Form عام يستقبل الطلبات الجديدة دون أن يعطي مرسلها أي صلاحية على الجدول.

ربط NocoDB بأدواتك عبر رمز API

كل جدول له واجهة REST جاهزة، وبها تربط NocoDB بأدوات الأتمتة Automation مثل n8n أو بتطبيقاتك. ولإنشاء رمز Token افتح قائمة الحساب أسفل اليسار، ثم Account Settings ثم API Tokens، واضغط زر إنشاء رمز جديد Create New API Token، وسم الرمز باسم الجهة التي سوف تستخدمه حتى تعرفه لاحقاً في القائمة:

نافذة Token created successfully في NocoDB مع تحذير بأن الرمز لن يظهر مرة أخرى (الرمز مموه)
الرمز يظهر مرة واحدة فقط، فانسخه فوراً إلى مدير الأسرار Secrets Manager، وقد موهناه في الصورة
قائمة API Tokens في NocoDB مع رمز n8n-automation وزر التعطيل والحذف
قائمة الرموز: يمكنك تعطيل أي رمز أو حذفه دون أن يتأثر غيره
🛑
الرمز في النسخة المجانية يحمل صلاحيات صاحبه كاملة على كل القواعد المتاحة له، ولا تنتهي صلاحيته أبداً، والرموز المحددة الصلاحيات Fine-grained Tokens وتاريخ الانتهاء متاحة فقط في النسخ المرخصة. لذلك لا تنشئ رموز الأتمتة بحساب المدير الأعلى، وإنما أنشئ مستخدماً مخصصاً للتكامل Integration، وادعه إلى القاعدة المطلوبة وحدها بدور Editor أو Viewer، ثم أنشئ الرمز من حسابه، واجعل لكل تكامل رمزاً خاصاً به حتى تستطيع إبطال أحدها دون تعطيل البقية، واحذف أي رمز توقفت عن استخدامه.

يرسل الرمز في الترويسة Header xc-token، ومعرف الجدول Table ID تجده في رابط المتصفح أو في تبويب Details ثم APIs، وهناك أيضاً أمثلة جاهزة. والمثال التالي يقرأ السجلات التي حالتها Lead ويعيد منها حقلين فقط:

NC_TOKEN=ضع-الرمز-هنا
TABLE_ID=mt945qa9swr9dj6
curl -s -H "xc-token: $NC_TOKEN" "https://data.example.com/api/v2/tables/$TABLE_ID/records?where=(Status,eq,Lead)&fields=Title,Deal"

والمخرج سوف يكون كما يلي:

{"list":[{"Title":"عمر حداد","Deal":4500},{"Title":"ليلى يوسف","Deal":8000}],"pageInfo":{"totalRows":2,"page":1,"pageSize":25,"isFirstPage":true,"isLastPage":true}}

وهذا مثال يضيف سجلات دفعة واحدة، حيث ترسل مصفوفة JSON Array فيها سجل أو أكثر:

curl -s -X POST -H "xc-token: $NC_TOKEN" -H 'Content-Type: application/json' "https://data.example.com/api/v2/tables/$TABLE_ID/records" -d '[{"Title":"هند العلي","Email":"[email protected]","Company":"شركة المثال","Status":"Customer","Deal":21500}]'

والمخرج هو معرف كل سجل جديد:

[{"Id":9}]

في الأمثلة أعلاه لاحظ التالي:

  • قيمة حقل الاختيار يجب أن تكون أحد الخيارات المعرفة مسبقاً، وإلا رفض NocoDB الطلب برسالة Invalid option(s) ... provided for column "Status"، وهذا هو التحقق الذي لن تجده في ملف Excel.
  • الطلب الذي يحمل رمزاً خاطئاً أو لا يحمل رمزاً يعود بالحالة 401.
  • المسار /api/v2 ما زال يعمل، وهناك إصدار أحدث من الواجهة بالمسار /api/v3 بصيغة مختلفة للمخرج، فإذا بدأت تكاملاً جديداً فراجع توثيق الـ REST APIs قبل أن تختار بينهما.
  • إذا أرسلت نصاً عربياً من طرفية Terminal على Windows فتأكد أن ترميزها Encoding هو UTF-8، وإلا فسوف تصل الحروف علامات استفهام.

كيف تتأكد أن كل شيء يعمل

  • الأمر docker compose ps يعرض الخدمات الثلاث بحالة healthy.
  • الأمر curl -s https://data.example.com/api/v1/health يعيد {"message":"OK",...}.
  • الجداول محفوظة في PostgreSQL وليس في SQLite، والأمر docker compose exec db psql -U nocodb -d nocodb -Atc "select schemaname, tablename from pg_tables where tablename = 'Customers'" يعرض جدولك داخل مخطط يحمل معرف القاعدة.
  • طلب الـ API الذي يحمل الرمز يعود بالحالة 200، والطلب الذي لا يحمله يعود بالحالة 401.
  • بعد قصر التسجيل على الدعوات يرفض NocoDB أي محاولة تسجيل من نافذة خاصة في المتصفح.
  • افتح الجدول في نافذتين وعدل سجلاً في إحداهما، فإذا ظهر التعديل في الأخرى مباشرة فالـ Websockets تعمل عبر الـ Reverse Proxy.

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

النسخة الاحتياطية الكاملة لـ NocoDB تتكون من أربعة أشياء: قاعدة PostgreSQL كاملة لأن فيها التعريفات والبيانات معاً، ومجلد nocodb_data الذي فيه المرفقات، والملفان compose.yaml و.env. ولا تنس الملف الأخير، والسبب أن فيه كلمة مرور القاعدة التي يحتاجها NC_DB، وسر JWT الذي بدونه تنقطع جلسات الدخول بعد الاستعادة، أما رموز الـ API فمحفوظة في القاعدة نفسها وتعود معها. وتفريغ القاعدة Dump يتم بالصيغة المخصصة لـ PostgreSQL والخدمة تعمل كما يلي:

cd /opt/nocodb
mkdir -p backups
docker compose exec -T db pg_dump -U nocodb -Fc nocodb > backups/nocodb-$(date +%F).dump
docker run --rm -v nocodb_data:/data:ro -v "$PWD/backups":/backup alpine:3.24 tar czf /backup/nocodb-files-$(date +%F).tar.gz -C /data .

وللاستعادة على سيرفر جديد انسخ compose.yaml و.env، وشغل القاعدة وحدها، واستعد التفريغ بالأداة pg_restore، وبعدها استعد المرفقات ثم شغل التطبيق:

docker compose up -d db
docker compose exec -T db pg_restore -U nocodb -d nocodb --clean --if-exists --no-owner < backups/nocodb-2026-09-26.dump
docker run --rm -v nocodb_data:/data -v "$PWD/backups":/backup alpine:3.24 tar xzf /backup/nocodb-files-2026-09-26.tar.gz -C /data
docker compose up -d

وبعد الاستعادة قارن عدد السجلات في جداولك بما كان في الأصل، وجرب الاستعادة على سيرفر اختبار كل بضعة أشهر، والسبب أن النسخة الاحتياطية التي لم تجرب استعادتها لا يمكن الاعتماد عليها يوم تحتاجها. وللنسخ اليومي الآلي استخدم أداة مثل restic مع cron، وانقل النسخ خارج السيرفر.

تحديث NocoDB إلى إصدار أحدث Upgrade

إصدارات NocoDB تصدر بوتيرة سريعة، وأرقامها مبنية على التاريخ مثل 2026.09.0، وكل إصدار يطبق ترحيلات Migrations على قاعدة التعريفات عند الإقلاع، وبعدها لا يمكنك العودة إلى إصدار أقدم إلا من نسخة احتياطية، لذلك خذ نسخة احتياطية قبل كل تحديث، والخطوات كما يلي:

  1. اقرأ ملاحظات الإصدار Release Notes، وخاصة ما يخص متغيرات البيئة التي ألغيت أو تغيرت أسماؤها.
  2. خذ تفريغاً للقاعدة كما في القسم السابق.
  3. غير الوسم Tag في compose.yaml إلى الإصدار الجديد، ثم نفذ الأوامر التالية:
cd /opt/nocodb
docker compose pull
docker compose up -d
docker compose logs -f nocodb

وانتظر حتى تظهر الرسالة App started successfully. وتصبح الحالة healthy. أما PostgreSQL فتحديثه داخل الفرع 17، من 17.11 إلى 17.12 مثلاً، يكفيه تغيير الوسم، ولكن الانتقال إلى إصدار رئيسي Major Version جديد مثل 18 يتطلب تفريغاً ثم استعادة، والسبب أن ملفات البيانات لا تتوافق بين الإصدارات الرئيسية، ولاحظ أيضاً أن الـ Image الخاصة بـ PostgreSQL 18 غيرت مسار البيانات الافتراضي، فلا تغير الوسم إلى 18 على نفس الـ Volume.

مشكلات شائعة وحلولها

NocoDB لا يبدأ بسبب خطأ في الاتصال بالقاعدة

راجع السجلات Logs بالأمر docker compose logs nocodb، وغالباً سوف تجد السبب واحداً من اثنين: الأول أن كلمة المرور فيها رموز تكسر رابط NC_DB، والحل أن تولدها بالخيار -hex، والثاني أنك غيرت POSTGRES_PASSWORD بعد تهيئة القاعدة، وPostgreSQL لا يقرأ هذا المتغير إلا عند الإنشاء الأول، فتبقى كلمة المرور القديمة هي الصحيحة داخل القاعدة.

صفحة فارغة أو أخطاء CORS خلف الـ Reverse Proxy

تأكد أن NC_SITE_URL يطابق النطاق الذي تفتحه حرفاً بحرف ومعه https://، ثم أعد إنشاء الـ Container بعد التعديل، وإذا لم تظهر التحديثات الحية ففعل Websockets Support في الـ Reverse Proxy.

الدعوات ورسائل استعادة كلمة المرور لا تصل

هناك سببان محتملان: SMTP غير مضبوط، أو NC_SITE_URL غير مضبوط فتخرج الرسائل بروابط خاطئة، لذلك اضبط البريد من إعدادات المدير ثم أرسل رسالة اختبار. وإذا فقدت كلمة مرور المدير الأعلى والبريد غير مضبوط، فضع NC_ADMIN_EMAIL وNC_ADMIN_PASSWORD معاً في البيئة، وأعد إنشاء الـ Container حتى يعين كلمة مرور ذلك الحساب، ثم احذف المتغيرين. ولاحظ أن كلمة المرور يجب أن تكون 8 حروف على الأقل وفيها حرف كبير ورقم ورمز، وأنك إذا وضعت البريد وحده فسوف يتوقف NocoDB عند الإقلاع برسالة Missing admin password.

الواجهة بطيئة مع الجداول الكبيرة

تأكد أن Redis متصل عبر NC_REDIS_URL، وأن ذاكرة الـ Container كافية بالأمر docker stats، والجداول التي فيها عشرات الآلاف من السجلات تستفيد من الفهارس Indexes في PostgreSQL على الأعمدة التي تفرز وتصفي بها كثيراً.

فشل رفع مرفق كبير

الحد يأتي غالباً من الـ Reverse Proxy أو من Cloudflare، وتجد تفاصيله في دليل حدود حجم رفع الملفات، ولكن لـ NocoDB نفسه أيضاً حد لحجم جسم الطلب Request Body وقيمته الافتراضية 1 ميجابايت، وترفعه بالمتغير NC_REQUEST_BODY_SIZE الموثق مع بقية متغيرات البيئة.

الخلاصة

وصلنا لنهاية الموضوع، وأهم ما فيه:

  • ملفات Excel المشتركة لا تتحقق من البيانات ولا تمنع تعارض التعديلات، وAirtable يحل ذلك ولكن بياناتك تبقى عند شركة أخرى وتدفع عن كل مستخدم، وNocoDB يعطيك تجربة قريبة منه وبياناتك في PostgreSQL على سيرفرك.
  • رخصة NocoDB منذ يناير 2026 هي Sustainable Use License، وهي تسمح بالاستخدام الداخلي دون رسوم، وتمنع بيعه كخدمة لعملائك دون رخصة تجارية.
  • ثبت NC_AUTH_JWT_SECRET وNC_SITE_URL في الإعداد، وولد كلمة مرور القاعدة بالخيار -hex.
  • سجل حساب المدير فور التشغيل، ثم أغلق التسجيل المفتوح بـ NC_INVITE_ONLY_SIGNUP.
  • رموز الـ API في النسخة المجانية كاملة الصلاحيات ولا تنتهي، لذلك أنشئها من مستخدم مخصص لكل تكامل.
  • انسخ القاعدة والمرفقات و.env معاً، وجرب الاستعادة، وخذ نسخة قبل كل تحديث لأن الترحيلات لا رجوع عنها إلا من النسخة الاحتياطية.

سجل التحديثات

  • سبتمبر 2026: كتابة الدليل واختباره على NocoDB 2026.09.0 مع PostgreSQL 17.11.
  • أكتوبر 2026: مراجعة الدليل وتحديثه إلى NocoDB 2026.09.1، وإضافة تغيير الرخصة إلى Sustainable Use License، وتصحيح ما يتأثر بسر JWT عند الاستعادة، وتوضيح صلاحيات رموز الـ API ودور الـ worker.
نشرة عرب رووت | ArabRoot

معرفة تستحق مكاناً في بريدك.

مقالات مختارة وأدوات مفيدة وأفكار لمشروعك القادم، في رسالة واحدة كل أسبوع.

يمكنك إلغاء الاشتراك متى شئت. الخصوصية

تم استلام طلبك. افتح بريدك واضغط رابط التأكيد لإتمام الاشتراك.