كيفية جعل قاعدة البيانات (أو جزء منها) متاحة لمعالج بيانات سحابي؟

كنت مهتمًا باستخدام خدمات ETL مثل Stitch Data أو Skyvia لدمج مصادر بيانات مختلفة (بما في ذلك قاعدة بيانات Discourse الخاصة بي)، لكن شخصًا ما في Skyvia أخبرني أن هذا غير ممكن:

يمكن لـ Skyvia الاتصال بـ PostgreSQL عبر SSH، ومع ذلك لا يمكن الاتصال به عندما يكون داخل حاوية Docker بينما خادم SSH ليس داخل الحاوية بل أمامها.

هذه هي متطلباتهم للاتصال بـ PostgreSQL.

هل هناك حل بديل واضح؟

يمكنك تمكين SSH في حاوية Discourse (على منفذ غير قياسي) ثم السماح لهم بالاتصال هناك. أعتقد أنه قد يكون هناك مثال في دليل العينات الخاص بـ Discourse_docker.

شكرًا لك، جاى. لقد انتهيت باستخدام docker-ssh مع مصادقة المفتاح العام. :+1:

يبدو أنني أفتقر إلى مفهوم رئيسي، حيث أستطيع الاتصال عبر SSH باستخدام المنفذ المخصص ثم تنفيذ الأمر su postgres -c 'psql discourse' دون أي مشكلة. يعمل كل شيء في هذا النهج المكون من خطوتين، لكنني أعتقد أن ما أحتاجه للاتصال مباشرة عبر pgAdmin (على سبيل المثال) هو شيء مختلف قليلاً.

هذا هو الأمر الذي أستخدمه لتعريض منفذ مخصص:

docker run -d -p 2222:22 \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v ~/.ssh/authorized_keys:/authorized_keys \
        --name my-sshd \
        -e FILTERS={\"name\":[\"^/app$\"]} -e AUTH_MECHANISM=publicKey \
        -e AUTHORIZED_KEYS=/authorized_keys \
        jeroenpeeters/docker-ssh

وهو ما يسمح لي لاحقًا بالقيام بذلك مباشرة (بدون تشغيل حاوية Docker عبر launcher enter app):

ssh whatever@host -p 2222
su postgres -c 'psql discourse'

لقد جربت عدة أشياء، لكن دون نجاح. أشعر أنه يجب أن تكون هناك طريقة لتنفيذ ssh whatever@host -p XXXX والاتصال مباشرة بقاعدة البيانات (وهو ما يتوقعه pgAdmin على الأرجح).

هل تواجه مشكلة في الاتصال أم مشكلة في الأذونات؟

يمكنني الاتصال عبر سطر الأوامر باستخدام ssh ثم psql. لكنني غير قادر على الاتصال عبر pgAdmin.

تحتاج إلى تعريض منفذ PostgreSQL مباشرةً لتمكين الاتصال عبر pgAdmin.

في ملف app.yml، في الأعلى، ترى أن المنفذين 80 و 443 مفتوحين. يمكنك إضافة سطر آخر للمنفذ 5432 الخاص بـ PostgreSQL.

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

إذا كان كل ما تحتاجه هو بعض التقارير العرضية، فقد يكون تحميل ملفات CSV من مستكشف البيانات ثم استيرادها في الأداة المفضلة لديك كافيًا. يمكنك أيضًا نسخ نسخ احتياطية من Discourse (دون تضمين الملفات المرفقة)، وهي بصيغة تصدير PostgreSQL القياسية. وبمجرد امتلاكها، يمكنك استعادتها إلى مثيل PostgreSQL محلي للتحليل.

شكرًا لك، رافائيل

لقد قمت بذلك وأعدت بناء الحاوية. لكن هذا لا يزال لا يعمل (لدي عنوان IP الفعلي بدلاً من XX.XX.XX.XX)

وفي تبويب نفق SSH:

هذا هو الخطأ الذي أحصل عليه

بخصوص هذا، أفهم أن ذلك يعني طبقة حماية أقل، لكنه لا يزال يتطلب امتلاك مفتاح SSH الخاص، أليس كذلك؟

إذا أضفت 5432 إلى ملف app.yml، فسيتم تعريضه مباشرة دون الحاجة إلى نفق SSH.

لا يمكنني تقديم نصيحة حول نفق SSH لـ pgAdmin، حيث لم أستخدمه من قبل. أفترض أنه يتوقع أن يكون المنفذ للاستماع إلى الاتصالات المحلية، لذا لا حاجة لتعريضه للإنترنت.

جرب ما يلي:

expose:
  - "80:80"
  - "443:443"
  - "5432"

لكن لا يوجد كلمة مرور لـ Postgres لأنه يتطلب أن يكون المستخدم خبيرًا (superuser): فملف pg_hba.conf يحتوي على أذونات اتصال “local” مضبوطة على “peer”، مما يعني أنها تعتمد على مستخدم UNIX، وهو ما يتطلب تسجيل الدخول عبر SSH، أليس كذلك؟

هذا لا يعمل: psql -h XX.XX.XX.XX -p 5432 -U postgres -d discourse

يمكنك الاتصال بـ psql كمستخدم خارق

./launcher enter app
su postgres
psql

ثم إنشاء المستخدم المطلوب مع الأذونات اللازمة لتقاريرك.

حسناً، لا أواجه أي مشكلة في الاتصال من حاوية التطبيق Docker. مشكلتي تكمن في الاتصال مباشرة بقاعدة بيانات PostgreSQL من جهاز محلي (لأستطيع استخدام pgAdmin) أو من معالج بيانات سحابي مثل Stitch. كلاهما يتوقع عنوان IP للمضيف وبيانات اعتماد SSH، لكنني لم أتمكن من جعلهما يعملان (أحصل على الخطأ الذي أشرت إليه أعلاه).

الشيء الوحيد الذي تمكنت من فعله هو استخدام docker-ssh للوصول مباشرة إلى حاوية التطبيق Docker (عبر المفتاح العام) من جهاز محلي (بدون تنفيذ launcher enter app)، لكنني ما زلت بحاجة إلى تنفيذ su postgres 'psql discourse' للوصول إلى قاعدة البيانات، وهو ما أفترض أنه المشكلة مع pgAdmin/Stitch — فهما يتوقعان اتصالاً مباشراً.

هل جربت إنشاء PostgreSQL جديد مع كلمة مرور وتزويد الخدمة بها؟

نعم، لديهم إجراء طويل.

لكن لدي نفس المشكلة ببساطة عند استخدام pgAdmin من جهاز الكمبيوتر المحلي الخاص بي.

أعتقد أن كيفية الانتقال من حاوية مستقلة إلى حاويات ويب وبيانات منفصلة قد تحتوي على تعليمات لتعيين كلمة مرور.

أيضًا، أعتقد أنه يمكنك ربط منفذ postgres فقط بـ 127.0.0.1.

expose:
  - "80:80"
  - "443:443"
  - "127.0.0.1:5432:5432"

لقد قررت أن أتردد قليلاً لأرى ما إذا كان بإمكاني الاتصال بقاعدة البيانات دون تعريض أي منافذ. :grin:

عندما أدخل إلى الحاوية، أرى هذا:

# netstat -lp | grep postgres
tcp        0      0 0.0.0.0:postgresql      0.0.0.0:*               LISTEN      -
tcp6       0      0 [::]:postgresql         [::]:*                  LISTEN      -
unix  2      [ ACC ]     STREAM     LISTENING     263612292 -                    /var/run/postgresql/.s.PGSQL.5432

إذا خرجت من الحاوية وأصبحت في الخادم البعيد (ولست على جهاز الكمبيوتر المحلي بعد)، ألا يجب أن أتمكن من الاتصال باستخدام هذا؟

/var/discourse# psql -h localhost -d discourse -U postgres

المشكلة هي أنني أحصل على مطالبة بكلمة مرور. وبما أن مستخدم 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، لكنني أعتقد أنني بحاجة إلى التعامل مع الخطوة الأولى أولاً. أي مساعدة مقدرة.

حسناً، لقد عرفت الأمر أخيراً :tada:

لقد غيّرت هذا:

إلى هذا - "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

إذا كان أي شخص يحاول فعل ذلك وواجه أي مشاكل، فلا تتردد في إخباري.