هل من الممكن الاتصال بقاعدة البيانات مباشرة من تطبيق منفصل؟

سيكون التطبيق خارج حاوية Docker الخاصة بـ Discourse ولكن على نفس الخادم. إذا كان الأمر كذلك، هل يمكن لأي شخص مشاركة بعض التفاصيل حول كيفية القيام بذلك أو توجيهي إلى دليل أو تعليمات من فضلك؟

هل ستكون هناك أي عيوب في القيام بذلك بدلاً من استخدام إضافة/واجهة برمجة التطبيقات (DE)؟

تشمل العيوب في الغالب حقيقة أن مثل هذا الاتصال يمكن استخدامه للوصول للكتابة. هل هذا مطلب؟

إذا كانت تكاملاتك تحتاج إلى وصول للكتابة إلى قاعدة البيانات، ففكر في كتابة ملحق يكشف فقط عن العمليات التي تحتاجها.

ليس شرطًا إلزاميًا، لكنني لا بأس به كعيب :slight_smile:

بدأت باستخدام إضافة DE الخاصة بكم، لكن للأسف أعتقد أن حالتي ستحتاج إلى اتصال مباشر، لأنني أُرسل عددًا كبيرًا جدًا من الطلبات عبر واجهة برمجة التطبيقات لبعض صفحاتي (وهذا مع وجودي أنا فقط على الموقع). معظمها استعلامات مخصصة، لذا لست متأكدًا مما إذا كان ذلك يؤثر. مع ذلك، ما زلت أحب إضافة DE!
هل تودون معرفة أفضل طريقة للاتصال بقاعدة بيانات Postgres مباشرةً خارج الحاوية؟ كلا المنتدى والموقع موجودان على نفس الخادم، إذا كان ذلك يساعد.


تعديل: أعتقد أنني أواجه حدًا لمعدل الطلبات مع إضافة DE، لكنني متأكد من أنني رأيت سام يقول إنه إذا كانت الطلبات قادمة من نفس الخادم فلا ينطبق حد معدل الطلبات - هل لا يزال هذا هو الحال؟

على الرغم من إمكانية ذلك، قد تقوم التطبيق الآخر باكتساب أقفال على الجداول وعرقلة عمل Discourse بالطريقة المعتادة.

يمكنك إما اختيار إضافة جديدة تضيف نقاط واجهة برمجة التطبيقات (API) اللازمة التي تحتاجها، أو الغوص بشكل كامل في إنشاء مثيل PostgreSQL آخر يقوم بمزامنة Discourse الخاص بك، حيث يمكنك ربط تطبيقك به.

شكرًا لك على المعلومات يا رافائيل، سأستخدم جمل SELECT حصريًا، وبما أني أعرف أنها لا تسبب قفلًا، فسأحتاج فقط للقلق بشأن تغييرات الجدول على جانب Discourse (أي عند الترقية) وإمكانية إيقاف التطبيق الآخر مؤقتًا. هل سيخفف ذلك من مخاوف القفل؟

بشأن نسخ قاعدة البيانات، يبدو هذا خيارًا مثيرًا للاهتمام — هل يمكن تنفيذه أثناء التشغيل بحيث لا يتأخر سوى بضع دقائق؟ (أحتاج إلى جلب أحدث المواضيع بشكل متكرر — تقريبًا كل صفحة في الموقع تحتوي عليها، على الرغم من أنني أقوم بالتخزين المؤقت لمدة دقيقتين، لكنها تختلف حسب الصفحة/المعايير، وسيكون هناك مئات من هذه الأنواع من الصفحات). أيضًا، قد يتوقف هذا الخيار عن العمل عندما تكبر قاعدة البيانات؟ (في منتدى Discourse آخر، قاعدة بياناتي بالفعل بضع جيجابايت).

(لا أعتقد أن إنشاء إضافة سيكون خيارًا هنا، لأنني لا أرى كيف يمكن أن يكون أفضل من إضافة Data Explorer، بل إن إضافة DE شبه مثالية — باستثناء هذه المشكلة.)

هل لدى أحدكم أي أفكار حول سبب عدم عمل هذا، من فضلكم؟

اتبعت بعض المشاركات التي نشرها @pfaffman و @Nacho_Caballero في هذا الموضوع: https://meta.discourse.org/t/how-to-make-the-database-or-part-of-it-accessible-to-a-cloud-data-processor/147915، بالإضافة إلى مشاركة @mpalmer في هذا الموضوع: Accessing to the database from outside the container - #4 by mpalmer.

أولاً، قمت بتعديل ملف app.yml بإضافة التالي:

expose:
  - "127.0.0.2:5432:5432"

ثم أعيد بناء الحاوية. داخل الحاوية، قمت بتعيين كلمة مرور لمستخدم postgres، وتمكنت من الاتصال باستخدام الأمر التالي من داخل الحاوية:

psql -h localhost -d discourse -U postgres

ومع ذلك، عند الخروج من الحاوية ومحاولة الاتصال، أحصل على الرسالة التالية:

# psql -h 127.0.0.2 -p 5432 -d discourse -U postgres
psql: server closed the connection unexpectedly
	This probably means the server terminated abnormally
	before or while processing the request.

كما جربت تغيير المنفذ إلى رقم آخر، لكن النتيجة كانت نفسها. حصلت على عنوان IP 127 من أمر docker ps وفحصت إعدادات الشبكة (لدي ثلاث نسخ مستقلة من Discourse تعمل).

إذا قمت بتغيير عنوان IP (إلى عنوان أحد منتديات Discourse الأخرى)، أحصل على استجابة مختلفة (أكثر فورية) كالتالي:

# psql -h 127.0.0.3 -p 5432 -d discourse -U postgres
psql: could not connect to server: Connection refused
	Is the server running on host "127.0.0.3" and accepting
	TCP/IP connections on port 5432?

هل لدى أحدكم أي أفكار حول ما قد يكون خاطئًا؟ البحث في Google عن عبارة psql: server closed the connection unexpectedly يشير إلى وجود مشكلة في الشبكة - هل أحتاج إلى تعديل أي شيء آخر داخل الحاوية؟

الطريقة التي نجحت بها في ذلك (من خارج الحاوية) هي استخدام نفق SSH. لقد قمت فعليًا بإنشاء مستخدم جديد بدلاً من استخدام postgres، ولديني منافذ مخصصة لـ SSH و postgres، لكن هذا يجب أن يعمل مع إعدادك:

ssh -L 5432:localhost:5432 EXTERNAL_VPS_IP "psql -U postgres -d discourse -h localhost"

EXTERNAL_VPS_IP هو عنوان IP الذي تستخدمه للاتصال بخادمك البعيد.

إذا لم ينجح الأمر بعد، فقد ترغب في تجربة تغيير عنوان IP المكشوف في app.yml لاستخدام عنوان IP الخاص بـ جسر docker بدلاً من عنوان IP الداخلي للحاوية الذي حصلت عليه من docker ps. لست متأكدًا مما إذا كان هذا مطلوبًا، لكن هذا هو الإعداد الذي أستخدمه:

expose:
  - "127.0.0.1:5432:5432"
# أو إذا كنت تستخدم منفذًا مخصصًا:  - "127.0.0.1:CUSTOM_PORT:5432"

تذكر إعادة بناء الحاوية بعد ذلك.

أخبرني كيف تسير الأمور. استغرق مني وقتًا طويلاً جدًا لجعل كل شيء يعمل (وكان الأمر بسيطًا للغاية عند التفكير فيه)، لذا يسعدني مساعدتك.

شكرًا لك على المعلومات @Nacho_Caballero… خاصة الرابط حول docker!

يبدو أن النصيحة في موضوعك (وفي الموضوع الآخر) كانت صحيحة، فأنت تحتاج إلى:

expose:
  - "127.17.0.1:5432:5432"

…كما ورد في ذلك الرابط، سيقوم Docker تلقائيًا بتحويل الاتصال إلى عنوان IP الصحيح للحاوية الخاصة بك (وهو أمر منطقي نظرًا لأن هذه العناوين ديناميكية - وهو ما كنت أتساءل عنه). أعتقد أن هذا كل ما هو مطلوب لمعظم الإعدادات.

لقد جربت ذلك بالفعل - لذا قد تتساءل ما كانت مشكلتي. جدار الحماية الخاص بي! (ظننت أنني عرفت خطأ psql: server closed the connection unexpectedly!)

تم حل كل شيء الآن - شكرًا لكم جميعًا :blush:

جيد أن نعرف ذلك! يسعدني أنك عثرت على الحل. هل جدارتك النارية هي iptables؟ وكيف قمت بفتح المنفذ؟

أستخدم firewalld، ولكن لـ iptables، يجب أن يعمل شيء مثل هذا:

iptables -A INPUT -p tcp --dport xxxx -j ACCEPT
iptables -A OUTPUT -p tcp --dport xxxx -j ACCEPT