كنت مهتمًا باستخدام خدمات ETL مثل Stitch Data أو Skyvia لدمج مصادر بيانات مختلفة (بما في ذلك قاعدة بيانات Discourse الخاصة بي)، لكن شخصًا ما في Skyvia أخبرني أن هذا غير ممكن:
يمكن لـ Skyvia الاتصال بـ PostgreSQL عبر SSH، ومع ذلك لا يمكن الاتصال به عندما يكون داخل حاوية Docker بينما خادم SSH ليس داخل الحاوية بل أمامها.
يمكنك تمكين SSH في حاوية Discourse (على منفذ غير قياسي) ثم السماح لهم بالاتصال هناك. أعتقد أنه قد يكون هناك مثال في دليل العينات الخاص بـ Discourse_docker.
يبدو أنني أفتقر إلى مفهوم رئيسي، حيث أستطيع الاتصال عبر SSH باستخدام المنفذ المخصص ثم تنفيذ الأمر su postgres -c 'psql discourse' دون أي مشكلة. يعمل كل شيء في هذا النهج المكون من خطوتين، لكنني أعتقد أن ما أحتاجه للاتصال مباشرة عبر pgAdmin (على سبيل المثال) هو شيء مختلف قليلاً.
وهو ما يسمح لي لاحقًا بالقيام بذلك مباشرة (بدون تشغيل حاوية Docker عبر launcher enter app):
ssh whatever@host -p 2222
su postgres -c 'psql discourse'
لقد جربت عدة أشياء، لكن دون نجاح. أشعر أنه يجب أن تكون هناك طريقة لتنفيذ ssh whatever@host -p XXXX والاتصال مباشرة بقاعدة البيانات (وهو ما يتوقعه pgAdmin على الأرجح).
تحتاج إلى تعريض منفذ PostgreSQL مباشرةً لتمكين الاتصال عبر pgAdmin.
في ملف app.yml، في الأعلى، ترى أن المنفذين 80 و 443 مفتوحين. يمكنك إضافة سطر آخر للمنفذ 5432 الخاص بـ PostgreSQL.
ومع ذلك، فإن هذا على الأرجح فكرة سيئة للغاية. فقد انتقلت قاعدة البيانات من قبول الاتصالات المحلية فقط إلى التعرض للإنترنت بأكمله.
إذا كان كل ما تحتاجه هو بعض التقارير العرضية، فقد يكون تحميل ملفات CSV من مستكشف البيانات ثم استيرادها في الأداة المفضلة لديك كافيًا. يمكنك أيضًا نسخ نسخ احتياطية من Discourse (دون تضمين الملفات المرفقة)، وهي بصيغة تصدير PostgreSQL القياسية. وبمجرد امتلاكها، يمكنك استعادتها إلى مثيل PostgreSQL محلي للتحليل.
إذا أضفت 5432 إلى ملف app.yml، فسيتم تعريضه مباشرة دون الحاجة إلى نفق SSH.
لا يمكنني تقديم نصيحة حول نفق SSH لـ pgAdmin، حيث لم أستخدمه من قبل. أفترض أنه يتوقع أن يكون المنفذ للاستماع إلى الاتصالات المحلية، لذا لا حاجة لتعريضه للإنترنت.
لكن لا يوجد كلمة مرور لـ Postgres لأنه يتطلب أن يكون المستخدم خبيرًا (superuser): فملف pg_hba.conf يحتوي على أذونات اتصال “local” مضبوطة على “peer”، مما يعني أنها تعتمد على مستخدم UNIX، وهو ما يتطلب تسجيل الدخول عبر SSH، أليس كذلك؟
هذا لا يعمل: psql -h XX.XX.XX.XX -p 5432 -U postgres -d discourse
حسناً، لا أواجه أي مشكلة في الاتصال من حاوية التطبيق Docker. مشكلتي تكمن في الاتصال مباشرة بقاعدة بيانات PostgreSQL من جهاز محلي (لأستطيع استخدام pgAdmin) أو من معالج بيانات سحابي مثل Stitch. كلاهما يتوقع عنوان IP للمضيف وبيانات اعتماد SSH، لكنني لم أتمكن من جعلهما يعملان (أحصل على الخطأ الذي أشرت إليه أعلاه).
الشيء الوحيد الذي تمكنت من فعله هو استخدام docker-ssh للوصول مباشرة إلى حاوية التطبيق Docker (عبر المفتاح العام) من جهاز محلي (بدون تنفيذ launcher enter app)، لكنني ما زلت بحاجة إلى تنفيذ su postgres 'psql discourse' للوصول إلى قاعدة البيانات، وهو ما أفترض أنه المشكلة مع pgAdmin/Stitch — فهما يتوقعان اتصالاً مباشراً.
المشكلة هي أنني أحصل على مطالبة بكلمة مرور. وبما أن مستخدم postgres ليس لديه كلمة مرور، حاولت إنشاء مستخدم مختلف وتعيين كلمة مرور له:
CREATE USER whatever_user WITH ENCRYPTED PASSWORD '<whatever password>';
GRANT CONNECT ON DATABASE discourse TO whatever_user;
GRANT USAGE ON SCHEMA public TO whatever_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO whatever_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO whatever_user;
أضفت سطرًا لذلك المستخدم مع md5 في pg_hba.conf وأعدت تشغيل PG باستخدام الأمر service postgresql restart
# Database administrative login by Unix domain socket
local all postgres peer
local all whatever_user md5
ومع ذلك، عندما أحاول الاتصال من الخادم البعيد، أحصل على فشل في المصادقة:
# psql -h localhost -d discourse -U whatever_user
Password for user whatever_user:
psql: FATAL: password authentication failed for user "whatever_user"
FATAL: password authentication failed for user "whatever_user"
ما الذي أفتقده؟ أحاول على الأقل أن أتمكن من الاتصال بقاعدة البيانات من نفس الخادم. ستكون الخطوة الثانية هي فعل نفس الشيء باستخدام نفق SSH، لكنني أعتقد أنني بحاجة إلى التعامل مع الخطوة الأولى أولاً. أي مساعدة مقدرة.
إلى هذا - "127.0.0.1:5433:5432" لأنني حصلت على خطأ يشير إلى أن المنفذ مستخدم بالفعل.
أعدت بناء الحاوية وتحققت من أن المنفذ مفتوح بالفعل:
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
whatever_id local_discourse/app "/sbin/boot" 20 minutes ago Up 20 minutes 127.0.0.1:5433->5432/tcp app
أصبحت الآن قادراً على إنشاء نفق SSH والاتصال من خادمي البعيد باستخدام مستخدم مع كلمة مرور:
# إنشاء النفق (يمكنك أيضاً استخدام ssh -f لتشغيله في الخلفية)
ssh -v -N -L 5433:localhost:5433 SERVER_IP_ADDRESS
# الاتصال في علامة تبويب أخرى وإدخال كلمة المرور
psql -h localhost -d discourse -U whatever_user -p 5433
إذا كان أي شخص يحاول فعل ذلك وواجه أي مشاكل، فلا تتردد في إخباري.