استخدام Nginx Proxy Manager لإدارة مواقع متعددة مع Discourse

تحتاج إلى التأكد من أن كلا الحاويتين على نفس شبكة Docker. إذا لم يكن لديك NPM يعمل، فأنت لا تواجه مشكلة في تكوين Discourse (حتى الآن).

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

لقد نسيت عن طريق الخطأ شبكة ماريا دي بي دوكر؛ ولكن بعد إضافة
network_mode: bridge
لا يزال لدي خطأ npm في الاتصال بقاعدة بيانات ديسكورس؛

  environment:
      DB_MYSQL_HOST: "172.17.0.2" # حاوية البيانات - ولكنني أتلقى خطأ (خطأ connect ECONNREFUSED 172.17.0.2:3306) عند تمكينها.
#      DB_MYSQL_HOST: "db" قاعدة بيانات npm الافتراضية (خارج ديسكورس).
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "h4xb0xr1z__0k"
      DB_MYSQL_NAME: "npm"

عندما تعمل npm وماريا؛ سجلات ماريا جيدة… ولكن npm
error connect ECONNREFUSED 172.17.0.2:3306
هل هناك أي شيء مفقود؟

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

ملف docker-compose الخاص بي

version: "3"
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    network_mode: bridge
    restart: unless-stopped
    ports:
    
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port

    environment:
      DB_MYSQL_HOST: "172.17.0.2" #data container - but i receive error ( connect ECONNREFUSED 172.17.0.2:3306 ) when enabled.
#      DB_MYSQL_HOST: "db" default npm databse (outside discourse).
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "mypassword"
      DB_MYSQL_NAME: "npm"

    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
#    depends_on:
#      - db

  db:
    image: 'mariadb:latest'
    restart: unless-stopped
    network_mode: bridge
    environment:
      MYSQL_ROOT_PASSWORD: 'mypassword'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'mypassword'
    volumes:
      - ./data/mysql:/var/lib/mysql

لدي discourse يعمل مع data + web-only؛ خريطة عناوين IP بعد npm و maria تبدو كالتالي:

data container IP: 172.17.0.2
web_only container IP: 172.17.0.3
npm container IP: 172.17.0.5
maria data (npm) IP: 172.17.0.4
إعجاب واحد (1)

مرحباً @tophee

هل يمكنك تقديم توصيتك بشأن استخدام SQLite مع NPM، نظرًا لأنه أسهل وأكثر موثوقية للعمل معه مقارنة بمشاكل mariadb؛

لقد قمت بإعداد NPM مع SQLite وكل شيء يعمل بشكل جيد، بما في ذلك مضيف nginx الافتراضي، وشهادة SSL، وما إلى ذلك… ولكني أريد التأكد من كيفية ربط قاعدة بيانات discourse بـ NPM؟ نظرًا لأنني أحصل على خطأ 502 لإعداد NPM مع موقع discourse.

ملف docker-compose الخاص بي

version: "3"
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: always
    network_mode: bridge    #-- تم إضافة هذه الشبكة للسماح لـ NPM بأن يكون في نفس شبكة discourse، والآن يرى كل منهما الآخر.
    ports:
      # منفذ HTTP العام:
      - '80:80'
      # منفذ HTTPS العام:
      - '443:443'
      # منفذ الويب الإداري:
      - '81:81'
    environment:
      DB_SQLITE_FILE: "/data/database.sqlite"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

لا، توصيتي هي استخدام الإعداد القياسي لـ NPM ما لم تكن تعرف ما تفعله. هذا هو السبب في أنني أستخدم الإعداد القياسي.

لا تحتاج إلى الخطوة 3 إذا قمت بتوصيل حاوية discourse عبر websocket.

هذا بسبب

هل أنت متأكد من أن 172.17.0.2 هي حاوية قاعدة البيانات الخاصة بك؟ - على أي حال: يمكنك تخطي هذه المشكلة عن طريق ترك NPM على شبكته الخاصة وتوصيل discourse عبر web socket.

إعجابَين (2)

شكراً @tophee على التوضيح، لقد قمت بتصحيح كل شيء، ولكن يبدو أنني لم أستخدم websocket وركزت على المنفذ مع إعداد npm وحاويات discourse؛

مشكلتي التي واجهتها مع NPM كانت مع نفق CloudFlared Argo، بعد الانتهاء من إعداد NPM، SSL، كل شيء.. تمكنت من تشغيل نفق CloudFlared argo ولكن المشكلة كانت أن CloudFlared لا يمكن تشغيله كوكيل ثانوي، حيث نحتاج إلى تعطيل NPM ليكون أمام الويب الأصلي؛ الخطأ الذي حصلت عليه من CloudFlare هو هذا:

Error 1000: DNS points to prohibited IP

بعد البحث عن هذا الخطأ مع cloudflare؛ أعطاني هذا:

There is a reverse-proxy at your origin that sends the request back through the Cloudflare proxy. Instead of using a reverse-proxy, contact your hosting provider or site administrator to configure an HTTP redirect at your origin.

كيف يمكننا تعطيل NPM كوكيل عكسي؟

هدفي هو جعل عنوان IP الأصلي يعمل بدون NPM “أثناء” تثبيت وعمل NPM؛ حتى نتمكن من جعل cloudflared يتواصل مع خادمنا؟

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

قم بإلغاء تثبيت NPM. الهدف الكامل من NPM هو العمل كوكيل عكسي. إذا كنت لا تريد وكيلًا عكسيًا، فقم بإيقافه.

لا أفهم النقطة تمامًا وهذا بالتأكيد ليس شيئًا لدي أي معرفة به. يجب عليك على الأرجح التحقق من منتدى NPM أو شيء من هذا القبيل. هذا لا علاقة له بـ discourse.

إعجابَين (2)

لقد قمت بالفعل بفتح هناك؛ وأنا أناقش هنا أيضًا، ونعم، لقد قمت بتعطيله بعد يومين من التجربة؛ لكنني سأضيف كيفية إضافة دعم منفذ مخصص مع Discourse و NPM هنا، نظرًا لأن هذا الموضوع يدعم فقط nginx المقبس مع npm؛

شكرا.

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

لا. لا يدعم المقابس فقط إلا إذا اتبعت تعليمات المقابس. يقول إنه ليس عليك استخدام المقابس:

عندما اختبرت هذا آخر مرة، عمل بشكل جيد باستخدام منفذ كما هو مقترح.

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

لقد ساعدتني هذه التعليمات في إعداد Discourse باستخدام Nginx Proxy Manager.
ومع ذلك، يعرض المتصفح أخطاء “محتوى مختلط” عند محاولة تحميل الخطوط والصور من http.

يمكنك “فرض https” في الروابط باستخدام الخيار هنا:

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

واو، هذا موضوع معقد للغاية مع الكثير من الشروط والاستثناءات.

اليوم حاولت أيضًا إعداد الأمر وفشلت فشلاً ذريعًا. التعليمات لديها نوايا حسنة، ولكن في رأيي ليست سهلة الفهم / الإدراك.

عندما أعمل مع Docker، أريد عادةً أن تعمل الحاويات بشكل منفصل / معزول عن بعضها البعض. لا الكثير من التبعيات والمتطلبات المسبقة و"نقاط الفشل الوحيدة". ولكن هذه هي بالضبط المشاكل التي يسببها النهج: NPM أداة رائعة. لا أفهم لماذا يجب علي إجراء تعديلات خاصة على تكوين Docker الخاص بها من Proxy Manager لجعل Discourse سعيدًا وتزويده بالشهادات. في المنزل، أستخدم أيضًا NPM لنطاق DynDNS الخاص بي حتى أتمكن من تعيين الخدمات والمضيفين بمرونة في أي وقت. ولدي بعض منها عامة (Home Assistant، Grafana، …).

أردت دمج مثيلي Discourse الخاصين بي اليوم. لقد استأجرت خادمًا سحابيًا خصيصًا من Hetzner/ألمانيا. لهذا السبب لم يتم تثبيت Discourse مسبقًا، كما تفترض التعليمات.

أتمنى أن تقدم Discourse رسميًا التثبيت مع NPM افتراضيًا. أو على الأقل لا تسبب الكثير من المتاعب مع البرنامج النصي ./discourse-setup.

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

دليل صغير لتثبيت نسخ متعددة :disguised_face:

في هذه الحالة، سنبدأ بتثبيت خادم جديد ونرغب في استعادة نسخة قديمة لاحقًا.

الخطوة 0: النسخ الاحتياطي!!!

قم بتنزيل النسخة الاحتياطية. ستحتاجها لاحقًا.

الخطوة 1: NGINX Proxy Manager

mkdir -p /opt/nginx-proxy-manager
cd /opt/nginx-proxy-manager
nano docker-compose.yml
version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: always
    ports:
      - '80:80'    # http / reserved!
      - '81:81'    # web-admin port
      - '443:443'  # https / reserved!
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

وأخيرًا: docker-compose up -d

(للمزيد من الأشخاص الكسالى، مثلي أحيانًا، فقط استخدم casaOS (على أي منفذ آخر غير ≠ 80/81/443). فقط تأكد من أنك تستخدم بيانات اعتماد تسجيل دخول آمنة ومضيف وكيل إضافي مع شهادة SSL الخاصة بك لطبقة إضافية من الأمان. يمكنك حتى إعداد بعض قواعد جدار الحماية إذا كنت تعرف ما تفعله.)

الخطوة 2: تثبيت Docker على خادم Ubuntu

sudo apt update && apt upgrade -y

sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt update
sudo apt-get install docker-ce docker-ce-cli containerd.io

الخطوة 3: إعداد تثبيت Discourse

git clone https://github.com/discourse/discourse_docker.git /var/discourse

cp /var/discourse/samples/standalone.yml /var/discourse/containers/app1.yml
nano /var/discourse/containers/app1.yml

cp /var/discourse/samples/standalone.yml /var/discourse/containers/app2.yml
nano /var/discourse/containers/app2.yml

قم بإجراء أي تغييرات ضرورية على ملفات app.yml الخاصة بك. يتضمن ذلك منافذ مختلفة مكشوفة لكل نسخة (نعم، يمكنك حتى استخدامها للصيانة)، وإعدادات البريد، وما إلى ذلك.
على سبيل المثال، تحصل app1 على المنفذ 8080/1443 و app2 تحصل على المنفذ 8081/2443 لـ http/https.

/var/discourse/launcher rebuild app1
/var/discourse/launcher rebuild app2

الخطوة 4: أخيرًا وليس آخرًا، تكوين NGINX Proxy Manager

شاهد هذا لفهم أساسي لاستخدام NGINX Proxy Manager.

كل ما عليك فعله هو توجيه إدخالات مضيف الوكيل الخاص بك إلى كل نسخة (منفذ http، على سبيل المثال 8080 و 8081 مع عنوان IP المحلي أو العام الخاص بك، هذا قرارك) وستتمكن من الحصول على شهادات Let’s Encrypt مجانية لكل نسخة ونطاق. فقط تأكد من تمكين Force SSL وما إلى ذلك.

الخطوة 5: تم. اشرب كوبًا من القهوة.

في حالتي، يعمل بشكل مثالي.

قد تكون هناك بعض المشكلات البسيطة مع تبعيات البرامج المثبتة مسبقًا، لكنني متأكد من أنك ستجد حلاً. لا تغضب مني بسبب نصيحتي حول casaOS. ولكن بالنسبة للأشخاص الذين يحبون اللعب بخوادمهم، واستخدام جميع الموارد المتاحة بطريقة سهلة الاستخدام وآمنة، أنا متأكد من أنك ستجد إدارة Docker هذه مثيرة للاهتمام.

الخطوة 6: أخيرًا، استعادة النسخ الاحتياطية السابقة الخاصة بك.

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

هل يمكنني دمج هذا باستخدام نفق Cloudflare للنطاق؟

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

بالتأكيد، لم لا؟

فقط تأكد من أنك ستكشف المنفذ الصحيح وتضبط هذا المنفذ لمجالك في أنفاق Cloudflare.

شخصيًا، لا أفضل هذا الحل لأنه يجعلني معتمدًا على Cloudflare وكل وكيل نفق يفتح ثقبًا :hole: في جدار الحماية الخاص بي، مما يجعلني أشعر وكأنني أقوم بتثبيت حصان طروادة.

تعد إدارة جدار الحماية أمرًا ضروريًا لمسؤولي الخوادم. سيكون لديك بعض الواجبات المنزلية للقيام بها قبل كشف المواقع لـ DMZ.