تثبيت Discourse للتطوير باستخدام Docker

قد يكون السبب الجذري هو أن pg15 قام بتعديل قواعد المصادقة الافتراضية.

مسار ملف التكوين: /etc/postgresql/15/main/pg_hba.conf

محتوى الملف كما يلي:

# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host all all 0.0.0.0/0 md5
# IPv6 local connections:
host all all ::/0 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256

الأمر الذي تم تنفيذه للنسخ الاحتياطي هو:

pg_dump --schema=public -T public.pg_* --file=‘/src/tmp/backups/default/2026-02-02-063003/dump.sql.gz’ --no-owner --no-privileges --verbose --compress=4 --username=postgres discourse_development

بسبب القاعدة local all postgres peer، أدى الأمر أعلاه إلى حدوث خطأ: Peer authentication failed for user "postgres"

فكرة الحل: تغيير peer إلى trust، للسماح لجميع الأوامر المحلية بالمرور. أي أن جميع الأوامر لن تحتاج إلى مصادقة بعد الآن (ولا تحتاج إلى إدخال كلمة مرور).

الخطوات المحددة:

  1. نسخ /etc/postgresql/15/main/pg_hba.conf من الحاوية إلى الجهاز المحلي

sudo docker cp discourse_dev:/etc/postgresql/15/main/pg_hba.conf ~/discourse/data/pg_hba.conf

منح الأذونات 644

sudo chmod 644 ~/discourse/data/pg_hba.conf

تعديل تكوين data/pg_hba.conf

# Database administrative login by Unix domain socket
local   all   postgres   trust
  1. تعديل ملف d/boot_dev لربط data/pg_hba.conf بالحاوية، لتجاوز ملف التكوين الافتراضي لـ pg.
docker run -d \
    -p $local_publish:8025:8025 \
    -p $local_publish:3000:3000 \
    -p $local_publish:4200:4200 \
    -p $local_publish:9292:9292 \
    -p $local_publish:9405:9405 \
    -v "$DATA_DIR:/shared/postgres_data:delegated" \
    # السطر التالي هو الإضافة الجديدة، لربط ملف التكوين بالحاوية، وإعطاء الحاوية إذن قراءة فقط
    -v "$SOURCE_DIR/data/pg_hba.conf:/etc/postgresql/15/main/pg_hba.conf:ro" \
    -v "$SOURCE_DIR:/src:delegated" \
    -e UNICORN_BIND_ALL=true \
    $mount_plugin_symlinks \
    $ENV_ARGS \
    --hostname=discourse \
    --name=discourse_dev \
    --restart=always \
    discourse/discourse_dev:release /sbin/boot
  1. إيقاف وحذف الحاوية الحالية، ثم إنشاء حاوية جديدة
d/shotdown_dev
d/boot_dev
  1. بعد إعادة الإنشاء، قم بتشغيل تطبيقات الواجهة الأمامية والخلفية، واختبر ما إذا كان النسخ الاحتياطي يعمل بشكل طبيعي
d/rails s

# التنفيذ في سطر أوامر آخر
d/ember-cli

في صفحة النسخ الاحتياطي، انقر فوق “نسخ احتياطي”، انتظر بضع ثوانٍ، ثم تحقق من قائمة ملفات النسخ الاحتياطي.

إعجاب واحد (1)

بناءً على الخبرة المذكورة أعلاه، أصبح من الممكن الآن تحقيق الرغبة في الاتصال بقاعدة بيانات postgreSQL داخل Docker باستخدام عميل قاعدة بيانات محلي.

تعديل التكوين في ملف d/boot_dev كما يلي:

docker run -d \
    -p $local_publish:8025:8025 \
    -p $local_publish:3000:3000 \
    -p $local_publish:4200:4200 \
    -p $local_publish:9292:9292 \
    -p $local_publish:9405:9405 \
    # إضافة تعيين المنفذ
    -p $local_publish:55432:5432 \
    -v "$DATA_DIR:/shared/postgres_data:delegated" \
    # الاحتفاظ بتعيين ملف التكوين
    -v "$SOURCE_DIR/data/pg_hba.conf:/etc/postgresql/15/main/pg_hba.conf:ro" \
    -v "$SOURCE_DIR:/src:delegated" \
    -e UNICORN_BIND_ALL=true \
    $mount_plugin_symlinks \
    $ENV_ARGS \
    --hostname=discourse \
    --name=discourse_dev \
    --restart=always \
    discourse/discourse_dev:release /sbin/boot

السماح بجميع الاتصالات بـ pg:

في ملف data/pg_hba.conf، قم بتعديل التكوين كما يلي:

# IPv4 local connections:
host all all 0.0.0.0/0 trust
# IPv6 local connections:
host all all ::/0 trust

إعادة البناء

d/shutdown_dev
d/boot_dev

يمكن الآن الاتصال باستخدام عميل قاعدة بيانات محلي

أنا أستخدم DBeaver هنا

  1. منفذ قاعدة البيانات 55432، متطابق مع ما هو موجود في d/boot_dev. هنا هو 55432 لتجنب التعارض مع ما هو موجود محليًا.
  2. اسم قاعدة البيانات
  3. يوصى بتحديد “إظهار جميع قواعد البيانات”
  4. اسم المستخدم
  5. اختبر ما إذا كان الاتصال ممكنًا
  6. انقر فوق “موافق” للحفظ

أخيرًا، يمكنني الآن عرض البيانات في قاعدة البيانات محليًا بسعادة.

إعجاب واحد (1)

هل من الطبيعي ألا يعرض هذا التثبيت القائمة بشكل صحيح؟

مرحبًا، على الرغم من أن كل شيء يبدو أنه يعمل بعد اتباع هذا الدليل على جهاز Ubuntu 26.04، إلا أنه لا يبدو أن أي بريد إلكتروني يتم إرساله.

لقد قمت بتشغيل d/mailhog في نافذة طرفية مخصصة، وأرى فيها كود HTML/CSS للبريد الإلكتروني المرسَل بعد تسجيل مستخدم تجريبي، لكن المستخدم لا يستقبل أي شيء على عنوان البريد الإلكتروني الذي قدمته…

ما الذي فاتني وكيف يمكنني إصلاح ذلك؟ :folded_hands:

يجب أن تظهر الرسالة في http://localhost:8025 كما أعتقد (منفذ Mailhog).

هذه ليست تثبيتًا للإصدار الإنتاجي، لذا لن تُرسل أي رسائل بريد إلكتروني عبر الإنترنت. ولإرسالها، تحتاج إلى تثبيت كامل للإصدار الإنتاجي وأيضًا خدمة بريد إلكتروني متوافقة (والتي تتطلب في أيامنا هذه عادةً أموالًا حقيقية، إذ إن إدارة الثقة تكلف ثمنًا :money_bag:).

إعجاب واحد (1)

شكرًا لك @merefield، لقد لاحظت localhost:8025 بالفعل، لكن لسبب ما لم يكن يعمل، والآن كل شيء على ما يرام.

إعجاب واحد (1)

هل تعمل هذه الحل؟ لم أتمكن من تجاوز d/boot_dev --init.

تحديث:
أرى الآن، إذا لم يكن معرف المطور (UID) الخاص بك هو 1000، مثل مستخدم discourse في حاوية discourse_dev، فإن هذا الأمر يبدو أنه يفشل.

uid=1000(discourse) gid=1000(discourse) groups=1000(discourse)

مجموعة من المشاكل التي واجهتها
nastee@station ~/vendsrc/discourse > ./d/boot_dev --init
استخدام المصدر في: /home/nastee/vendsrc/discourse
استخدام البيانات في:   /home/nastee/vendsrc/discourse/data/postgres
الإصدار: جاري السحب من discourse/discourse_dev
.....
التلخيص: sha256:e118af085d4be0486d4d9bfa83ac1c519d9975bed9a08180d10d5ad7c508632c
الحالة: تم تنزيل صورة أحدث لـ discourse/discourse_dev:release
docker.io/discourse/discourse_dev:release
f517752802e70b8a9110972bb3ddc0e9343d0c430603e4a9ae3eacc5ec69a2cf
جاري تثبيت المكتبات...
حدث خطأ أثناء محاولة الكتابة إلى `/src/Gemfile.lock`. ومن المرجح أنك بحاجة إلى منح صلاحيات الكتابة لهذا المسار.

شكرًا لـ: There was an error while trying to write to `/src/Gemfile.lock`. It is likely that you need to grant write permissions for that path - #2 by jacque006

قمت بتعيين أذونات الملف إلى 777 (مكروه)، وفعلت ذلك، فأصبح بإمكانه تثبيت المكتبات الآن، لكن عملية docker exec التالية تحاول الكتابة إلى مجلد المصدر ولا تستطيع ذلك لأنه لا يعمل كمستخدمي، لذا أحصل على:

 EACCES  EACCES: تم رفض الإذن، open '/src/_tmp_82_62be1aeb82e80c1d1054dac8bdbc5923'

حسناً، لماذا لا؟ sudo chmod 4777 . حيث . هو مجلد المصدر الذي قمت باستنساخه وأعمل فيه d/

مما قادني إلى:

 EACCES  خطأ أثناء محاولة إنشاء رابط رمزي لـ "../../../node_modules/.pnpm/prettier@3.8.1/node_modules/prettier" إلى "/src/docs/developer-guides/node_modules/prettier". حدث الخطأ أثناء محاولة إنشاء المجلد الأب للهدف الرابط الرمزي. التفاصيل: خطأ: EACCES: تم رفض الإذن، mkdir '/src/docs/developer-guides/node_modules'

بعد الاصطدام بمشكلة أذونات أخرى والاستسلام لـ chmod 777 -R .

وانتهى الأمر في النهاية بـ:

فشل الاتصال بالخادم عبر المقبس "/var/run/postgresql/.s.PGSQL.5432": لا يوجد ملف أو دليل