يظهر Discourse عنوان IP الخاص بالخادم/localhost كعنوان IP للمستخدم

مرحباً، لقد قمت بنشر Discourse على خادمي الخاص، كل شيء يعمل بشكل طبيعي باستثناء اكتشاف عنوان IP الخاص بالمستخدم، لقد قمت حتى بإنشاء برنامج نصي بلغة PHP (خارج حاوية Docker) للحصول على جميع الرؤوس حيث يمكن أن يكون عنوان IP:

REMOTE_ADDR: 212.58.xxx.xxx
SERVER_PORT: 80
SERVER_ADDR: 85.25.xxx.xxx
SERVER_SOFTWARE: Apache:
HTTP_CF_CONNECTING_IP: 212.58.xxx.xxx
HTTP_CDN_LOOP: cloudflare
HTTP_X_REAL_IP: 162.158.xxx.xxx

التفاصيل:
الخادم لديه لوحة تحكم BrainyCP مثبتة مع Apache و Nginx (حالياً يستخدم الموقع Nginx، والذي يقوم بالوكالة العكسية لحاوية Docker)
HTTP_CF_CONNECTING_IP يعطي 127.0.0.1 داخل حاوية Docker، ولكن خارجها لديهم قيم طبيعية
بدون تغيير الرأس باستخدام أوامر مخصصة، يعرض Discourse عنوان IP الخاص بالخادم.

(قريباً سأضيف المزيد من التفاصيل حيث أن نسخة Discourse الخاصة بي تعيد البناء الآن)

لست متأكدًا حقًا من إعدادك، لكنني لاحظت Cloudflare في منشورك. هل أضفت قالب CloudFlare إلى ملف app.yml الخاص بك؟

  - "templates/cloudflare.template.yml"

تعديل: استخدمت علامات اقتباس خاطئة " "

لا، لقد أضفته إلى قائمة القوالب، والآن أنتظر إعادة البناء

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

تم إعادة بنائه، ولكنه لا يزال يعرض عنوان IP الخاص بالخادم (لقد علقت الأوامر المخصصة

## أي أوامر مخصصة لتشغيلها بعد البناء
run:
  - exec: echo "بداية الأوامر المخصصة"
  ## إذا كنت ترغب في تعيين عنوان البريد الإلكتروني 'من' لتسجيلك الأول، قم بإلغاء التعليق والتغيير:
  ## بعد الحصول على البريد الإلكتروني الأول للتسجيل، أعد التعليق على السطر. يحتاج فقط إلى التشغيل مرة واحدة.
  - exec: rails r "SiteSetting.notification_email='noreply@zeronet.space'"
  #- replace:
  #   filename: /etc/nginx/conf.d/discourse.conf
  #   from: "types {"
  #   to: |
  #     set_real_ip_from 85.25.134.45;
  #     real_ip_header CF-Connection-IP;
  #     real_ip_recursive on;
  #     types {
  #- replace:
  #   filename: /etc/nginx/conf.d/discourse.conf
  #   from: $proxy_add_x_forwarded_for
  #   to: $send_http_cf_connection_ip;
  #   global: true
  - exec: echo "نهاية الأوامر المخصصة"

هل أحتاج إلى إلغاء التعليق عليها؟ (أريد أيضًا أن ألاحظ أنها لم تعمل حتى قبل أن أضيف قالب cloudflare إلى app.yml))

Uncommented, $sent_http_cf_connection_ip يعطي 127.0.0.1
image

من المحتمل أن Nginx يبلغ عن 127.0.0.1 وليس Discourse نفسه، ستحتاج على الأرجح إلى إعداد realip في nginx

لقد أضفت بالفعل cloudflare.template.yml الذي يضيف توجيهات realip، ولكنه لا يزال لا يعمل.
لقد قمت حتى بإزالة الأوامر المخصصة التي تتغير إلى ترويسة مخصصة، والآن يبلغ Discourse عن عنوان IP الخاص بالخادم لجميع المستخدمين بدلاً من localhost.

وهذا هو إعداد Nginx للمجال zeronet.space الذي تم إنشاؤه بواسطة اللوحة نفسها

server {
	listen 85.25.xxx.xx:443 ssl http2;
	server_name  zeronet.space www.zeronet.space;
	root  /home/ay0ks/workspace/sites/zeronet.space;
	
	# ssl on;
	ssl_certificate  /etc/certs/ay0ks/zeronet.space_1655753906.crt;
	ssl_certificate_key /etc/certs/ay0ks/zeronet.space_1655753906.key;
	#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	#ssl_ciphers  "HIGH:!RC4:!aNULL:!MD5:!kEDH";
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
	ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:ECDHE:!COMPLEMENTOFDEFAULT;
	ssl_prefer_server_ciphers on;
	
	add_header Strict-Transport-Security 'max-age=604800';
	
	access_log /etc/nginx/vhost_logs/zeronet.space_access;
	error_log /etc/nginx/vhost_logs/zeronet.space_error;
	
	location ~ /.well-known {
		allow all;
	}
	
	location ~ /\\.ht {
		deny all;
		access_log off;
		log_not_found off;
	}

	location / {
		root /home/ay0ks/workspace/sites/zeronet.space;
		proxy_pass http://85.25.xxx.xx:31080; # Discourse is deployed on ports 31080/31443
		proxy_redirect     off;
		proxy_force_ranges on;
		proxy_set_header   Host $host;
		proxy_set_header   X-Real-IP $remote_addr;
		proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header   X-Forwarded-Proto $scheme;
		proxy_set_header   HTTPS $scheme;
		
		proxy_cache off;
		proxy_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";
		#access_log /etc/nginx/vhost_logs//home/ay0ks/workspace/sites/zeronet.space;
		
		proxy_cache_valid 3s;
		proxy_cache_min_uses 2;
		# proxy_cache_lock on;
		# proxy_cache_use_stale error timeout;
		# proxy_cache_use_stale updating http_502 http_504;
		limit_conn lone 100;
		# limit_req zone=ltwo burst=10;
		
		client_body_buffer_size    128k;
		client_max_body_size       1024m;
		proxy_connect_timeout      180;
		proxy_send_timeout         180;
		proxy_read_timeout         180;
		send_timeout               180;
		
		proxy_buffer_size          4k;
		proxy_buffers              8 32k;
		proxy_busy_buffers_size    68k;
		proxy_temp_file_write_size 10m;
	}

	# error_page  404              /404.html;
	# error_page   500 502 503 504  /50x.html;
}

وأريد أيضًا ملاحظة “مسار” الطلب:
User -> Cloudflare -> Server(Nginx -> Docker -> Discourse)
ولاحظ أن عنوان IP للمستخدم مرئي خارج Docker في ترويسة Cloudflare CF-Connecting-IP

لا أعرف الكثير عن كيفية عمل خاصية IP الحقيقي لـ Cloudflare، لكن شكّي هو أن Nginx الخاص بـ Discourse سيحتاج إلى set_real_ip_from ليكون عنوان IP الذي يراه Nginx الخاص بالوكيل الخاص بك. 127.0.0.1؟ عنوان داخلي آخر؟ العنوان العام؟ لست متأكدًا مما سيراه.\n\nبمجرد معرفة هذا العنوان، أعتقد أن ما سأفعله هو ترك قالب Cloudflare موجودًا، ثم إضافة replace جديد لـ set_real_ip_from فقط.\n\nبالإضافة إلى ذلك، سيحتاج Nginx الخاص بالوكيل الخاص بك إلى تكوينه لتمرير ترويسة CF-Connecting-IP إذا لم يكن مكوّنًا بالفعل للقيام بذلك أو لا يقوم بذلك افتراضيًا. لا يمكنني المساعدة حقًا في هذا الجزء.

نفس المسار الذي سلكته، كانت مشكلتي هي أن nginx لم يتم تكوينه لاستقبال عنوان IP الخاص بـ docker كنطاق لتعيين realip عليه.

set_real_ip_from 172.18.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
set_real_ip_from 172.18.0.0/16;

لذا، أذهب: المستخدم > Cloudflare > خادم Nginx (SWAG Docker) > Discourse

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Real-IP $remote_addr;
templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Uncomment these two lines if you wish to add Lets Encrypt (https)
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"
#  - "templates/web.socketed.template.yml"
  - "templates/cloudflare.template.yml"
4 إعجابات

قد يكون هذا هو سبب مشاكلك. حاول إعداد Discourse على خادم بدون أي لوحات أو وكلاء عكسيين مثبتين وقم بالإبلاغ عما إذا كنت تواجه نفس المشكلة.

كخطوة أولى، ابدأ بتعديل كتلة الموقع لـ Discourse لتتوافق مع التفاصيل المقدمة هنا: Run other websites on the same machine as Discourse

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

هذا ليس حلاً للمشكلة، فبشراء خادم مخصص جديد بسعر 30 يورو شهريًا يمكن حل أي شيء (لن يكون هذا الموضوع موجودًا حينها).

سأحاول نشر النتائج هنا

هل أحتاج أيضًا إلى إضافة رؤوس في تكوين Nginx الخاص بـ Discourse؟ (داخل دوكر) لأنها لا تزال تظهر لي عنوان الخادم بدلاً من عناوين المستخدمين

بناءً على مسارك، هذا لا معنى له بالنسبة لي.

nginx الخاص بك يذهب إلى discourse إلى docker، لماذا سيستخدم discourse nginx الخاص به أيضًا؟

لا أعرف، لقد أضفت توجيهات Nginx الخاصة بك إلى توجيهاتي عبر اللوحة (تحققت أيضًا من خلال ssh)، لكنها لا تزال تعرض عنوان IP الخاص بالخادم.

هذا هو ملف app.yml الخاص بي:

## هذا هو قالب حاوية Discourse المستقل والمتكامل
##
## بعد إجراء تغييرات على هذا الملف، يجب عليك إعادة البناء
## /var/discourse/launcher rebuild app
##
## كن حذرًا جدًا عند التحرير!
## ملفات YAML حساسة للغاية للأخطاء في المسافات البيضاء أو المحاذاة!
## قم بزيارة http://www.yamllint.com/ للتحقق من صحة هذا الملف حسب الحاجة

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/cloudflare.template.yml"
## قم بإلغاء التعليق على هذين السطرين إذا كنت ترغب في إضافة Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## ما هي منافذ TCP/IP التي يجب أن تعرضها هذه الحاوية؟
## إذا كنت تريد أن تشارك Discourse منفذًا مع خادم ويب آخر مثل Apache أو nginx،
## راجع https://meta.discourse.org/t/17247 للحصول على التفاصيل
expose:
  - "31080:80"   # http
  - "31443:443" # https

params:
  db_default_text_search_config: "pg_catalog.russian"

  ## قم بتعيين db_shared_buffers إلى حد أقصى 25٪ من إجمالي الذاكرة.
  ## سيتم تعيينه تلقائيًا بواسطة bootstrap بناءً على ذاكرة الوصول العشوائي المكتشفة، أو يمكنك تجاوزها
  db_shared_buffers: "4096MB"

  ## يمكن أن يحسن أداء الفرز، ولكنه يضيف استخدام الذاكرة لكل اتصال
  #db_work_mem: "40MB"

  ## أي مراجعة Git يجب أن تستخدمها هذه الحاوية؟ (الافتراضي: tests-passed)
  #version: tests-passed

env:
  LC_ALL: ru_RU.UTF-8
  LANG: ru_RU.UTF-8
  LANGUAGE: ru_RU.UTF-8
  DISCOURSE_DEFAULT_LOCALE: ru

  ## كم عدد طلبات الويب المتزامنة التي يتم دعمها؟ يعتمد على الذاكرة وأنوى وحدة المعالجة المركزية.
  ## سيتم تعيينه تلقائيًا بواسطة bootstrap بناءً على وحدات المعالجة المركزية المكتشفة، أو يمكنك تجاوزها
  UNICORN_WORKERS: 8

  ## TODO: اسم النطاق الذي ستستجيب له هذه النسخة من Discourse
  ## مطلوب. لن يعمل Discourse مع رقم IP عادي.
  DISCOURSE_HOSTNAME: 'zeronet.space'

  ## قم بإلغاء التعليق إذا كنت تريد بدء تشغيل الحاوية بنفس
  ## اسم المضيف (-h) المحدد أعلاه (الافتراضي "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: قائمة بالبريد الإلكتروني مفصولة بفواصل سيتم جعلها مسؤولة ومطورة
  ## عند التسجيل الأولي مثال 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'contact@zeronet.space'

  ## TODO: خادم البريد SMTP المستخدم للتحقق من الحسابات الجديدة وإرسال الإشعارات
  # عنوان SMTP واسم المستخدم وكلمة المرور مطلوبة
  # تحذير الحرف '#' في كلمة مرور SMTP يمكن أن يسبب مشاكل!
  DISCOURSE_SMTP_ADDRESS: smtp.zeronet.space
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: noreply@zeronet.space
  DISCOURSE_SMTP_PASSWORD: "xxxxxxx"
  DISCOURSE_SMTP_ENABLE_START_TLS: true
  DISCOURSE_SMTP_AUTHENTICATION: login
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
  DISCOURSE_NOTIFICATION_EMAIL: "noreply@zeronet.space"
  #DISCOURSE_SMTP_DOMAIN: "zeronet.space"

  ## إذا أضفت قالب Lets Encrypt، قم بإلغاء التعليق أدناه للحصول على شهادة SSL مجانية
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## عنوان CDN http أو https لهذه النسخة من Discourse (تم تكوينه للسحب)
  ## راجع https://meta.discourse.org/t/14857 للحصول على التفاصيل
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## مفتاح MaxMind geolocation IP للبحث عن عنوان IP
  ## راجع https://meta.discourse.org/t/-/137387/23 للحصول على التفاصيل
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## الحاوية Docker عديمة الحالة؛ يتم تخزين جميع البيانات في /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## الإضافات هنا
## راجع https://meta.discourse.org/t/19157 للحصول على التفاصيل
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## أي أوامر مخصصة لتشغيلها بعد البناء
run:
  - exec: echo "Beginning of custom commands"
  ## إذا كنت تريد تعيين عنوان البريد الإلكتروني 'من' للتسجيل الأول الخاص بك، قم بإلغاء التعليق والتغيير:
  ## بعد الحصول على البريد الإلكتروني الأول للتسجيل، أعد التعليق على السطر. يحتاج إلى التشغيل مرة واحدة فقط.
  - exec: rails r "SiteSetting.notification_email='noreply@zeronet.space'"
  - exec: echo "End of custom commands"

تم ربط الإجابة أعلاه. أنت بحاجة إلى شيء كهذا.

4 إعجابات

لقد أصلح هذا مشاكل اكتشاف عنوان IP (الآن كل شيء يعمل بشكل طبيعي) ولكن الآن بعض الصور لا يتم تحميلها

تحرير: كانت هذه مشكلة في ذاكرة التخزين المؤقت، والآن كل شيء يعمل! شكراً لكم جميعاً!

إعجابَين (2)

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.