استخدم Caddy بدلاً من NGINX كوكيل عكسي لك

إليك بعض الملاحظات حول كيفية تشغيل نسخة اختبارية من ديسكورس (Discourse) باستخدام خادم كادي (Caddy Server).

أشياء رائعة حول كادي (Caddy):

السلبيات:

  • ليست مثبتة مثل أباتشي (apache) و nginx وشركاهما.

كيفية القيام بذلك

تحضير ديسكورس (Discourse)

أولاً، تحتاج إلى تطبيق هذه التغييرات على ملف app.yml الخاص بك:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml" # <<<----- هذا جديد

## اترك هذين معلقين
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"

## اترك هذين معلقين
expose:
#  - "8080:80"   # http
#  - "443:443" # https

env:
  ## يجب أن يكون هذا معلقاً
  #LETSENCRYPT_ACCOUNT_EMAIL: mymail@gmail.com
  ## هذا مطلوب لتجنب تحذيرات المحتوى المختلط عند وجوده خلف وكيل عكسي
  DISCOURSE_FORCE_HTTPS: true

تحضير كادي (Caddy)

على روح ديسكورس، دعونا نضع كادي (Caddy) في صورة دوكر (Docker) أيضاً :whale2:

أولاً، قم بالإعداد باستخدام:

mkdir -p /var/caddy/data /var/caddy/config
nano /var/caddy/Caddyfile

أضف ما يلي إلى ملف Caddyfile (باستخدام بناء جملة Caddy v2):

{
  email MYEMAILHERE@gmail.com
}

forum.example.com { # النطاق الخاص بك هنا
  reverse_proxy unix//sock/nginx.http.sock
}

احفظ واخرج.

لنجرب

الآن تحتاج إلى إعادة بناء ديسكورس:

cd /var/discourse
./launcher rebuild app

ثم قم بتشغيل كادي (Caddy):

docker run -d \
    -v /var/caddy/Caddyfile:/etc/caddy/Caddyfile \
    -v /var/caddy/data:/data \
    -v /var/caddy/config:/config \
    -v /var/discourse/shared/standalone:/sock \
    -p 80:80 -p 443:443 \
    -p 443:443/udp \
    --restart=always \
    --name caddy \
    caddy:latest

في النهاية، يجب أن يكون منتدىك متاحًا على النطاق الخاص بك، باستخدام SSL + HTTP2 + QUIC. لا يمكنك أن تكون أكثر عصرية من هذا.

21 إعجابًا

I run Caddy’s Discourse forums with this Caddyfile and no container:

forum.caddyserver.com

timeouts off
proxy / localhost:8080 {
	transparent
}

I just set up Discourse (with one easy tweak) and ran Caddy on the host machine.

^ This setup has been tested, and I can confirm it has been running with no glitches for months.

12 إعجابًا

I like how you’ve proxied to the socket and left the ports unexposed.

Neat little guide that one can use as a guideline to easily incorporate their Discourse installation to an existing Caddy proxy, too. Cheers!

3 إعجابات

But using nginx, as I can see now.

Well, I have more than 1 Discourse install with Caddy in the front, but I didn’t bother to replace the server header and it still shows nginx. Can be the same. Or they are just using the simple Discourse install and have no need to run a reverse proxy at all in the front.

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

My Discourse sites behind Caddy show nginx as the server too. I guess that transparent setting might make Caddy, uh, transparent.

3 إعجابات

That might be a bug from a recent change, it didn’t used to do that. :thinking:

إعجابَين (2)

Dear @Falco

Thank you so much for your posting.

I would like to install discourse using caddy condition, but I was confused with your docker command.

I never heard about the caddy, so I follow the digital ocean document

My question is, in the current server situation, Should I change the path
from etc/Caddyfile to /etc/caddy/Caddyfile?

docker run -d \
    -v /var/caddy/Caddyfile:/etc/Caddyfile \
    -v /var/caddy:/root/.caddy \
    -v /var/discourse/shared/standalone:/sock \
    -p 80:80 -p 443:443 \
    -p 80:80/udp -p 443:443/udp \
    --restart=always \
    --name caddy \
    --entrypoint "/usr/local/bin/caddy" \
    abiosoft/caddy -quic -email MYEMAILHERE@gmail.com -agree --conf /etc/Caddyfile --log stdout

Sincerely

هذا لا يعمل على الخادم الخاص بي. بالنسبة لي، استخدمت:

unix:/var/discourse/shared/standalone/nginx.http.sock

وهذا لـ caddy v1. بالنسبة لـ caddy v2، يرجى استخدام:

unix//var/discourse/shared/standalone/nginx.http.sock

فقط استبدل “:” بـ “/”.

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

هذا المسار يعمل إذا كنت تتبع الدليل في OP وتشغل Caddy في دوكر وتثبت وحدات التخزين كما هو محدد. إذا لم تكن تتبع الدليل، فستكون هناك مسارات مختلفة، نعم.

3 إعجابات

تم الآن تسمية نطاق المنتدى والنطاق الفرعي الخاص بهم ضمن هذا.

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

عذرًا على إحياء المواضيع القديمة، أحاول جعل Caddy يعمل مع Discourse. في إعدادات Caddy الخاصة بك، تستخدم “proxy”، ولكن عندما أستخدمها، تقول إن هناك خطأ في بناء الجملة وأنها غير صالحة. ألم يتم تغيير “proxy” الآن إلى “reverse_proxy”؟

هذا هو الإعداد الخاص بي:

forum.example.com {
    reverse_proxy / unix//var/discourse/shared/standalone/nginx.http.sock {
        transparent
    }
}

أعتقد ذلك. هل جربته؟

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

شكرا مات!
يمكنني تأكيد أن إعداد عدم وجود حاوية لا يزال يعمل في عام 2025 :smiley:

forum.website.com {
        reverse_proxy localhost:8080
}

استخدام “proxy” فقط لم ينجح.

يعمل بشكل رائع بالنسبة لي أيضًا!

ومع ذلك، تلقيت تحذيرات “محتوى مختلط” بعد هذا الإعداد المباشر للغاية:


لحل هذه المشكلة، اضطررت إلى إضافة توجيه إضافي إلى قسم env في ملف التكوين (app.yml أو web_only.yml):

# FORCE SSL
DISCOURSE_FORCE_HTTPS: true

للمرجع، هذه هي الخطوات الحالية لإعداد غير مُعتمد على Docker باستخدام Caddy كوكيل عكسي:

1) ضبط ملف إعداد Discourse

  • التعليق على الشهادات
    templates:
    #  - "templates/web.ssl.template.yml"
    #  - "templates/web.letsencrypt.ssl.template.yml"
    
  • تغيير تعيين المنفذ وتعطيل تعيين 443
    expose:
    - "8080:80"   # http
    # - "443:443" # https
    
  • فرض HTTPS لتقديم الملفات الثابتة
    env:
    DISCOURSE_FORCE_HTTPS: true
    

2) إعادة بناء Discourse

./launcher rebuild app

3) إعداد Caddy

  • تثبيت Caddy، باستخدام الإعدادات الافتراضية الرسمية فقط: Install — Caddy Documentation

  • ضبط /etc/caddy/Caddyfile

    forum.example.com {
          reverse_proxy localhost:8080
    }
    

    إذا كان لديك مواقع متعددة، يمكنك فقط سرد نطاقاتك:

    forum.example.com, forum2.example.com, forum3.example.com {
          reverse_proxy localhost:8080
    }
    

    يمكنك أيضًا تشغيل systemctl status caddy للتحقق من موقع ملف الإعداد الافتراضي.

4) تشغيل Caddy

systemctl start caddy

إعادة تحميل الإعدادات بعد التغييرات:

cd /etc/caddy
caddy reload
4 إعجابات

مرحباً، شكراً لك على هذا البرنامج التعليمي.

هل هناك أي ميزة في استخدام Caddy لإعداد غير متعدد المواقع؟ أداء أو أي شيء آخر؟

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

إعجابَين (2)

لقد فعلت شيئًا مشابهًا لهذا في إعداد متعدد المواقع لتبسيط إعداد SSL…
… ولكن تم التحديث إلى Caddy v2، واستخدام docker-compose مع إعداد متعدد المواقع.

في web.yml:

  • استخدام templates/web.socketed.template.yml فقط وعدم وجود ملفات yml لـ SSL.
  • التعليق على المنافذ \"443:443\" و \"80:80\" وما إلى ذلك.
  • إضافة DISCOURSE_HOSTNAME_ALIASES و DISCOURSE_FORCE_HTTPS: true

يستخدم هذا أحدث إصدار من Caddy 2، وهذا هو السبب في أنه قد يبدو مختلفًا عن بعض تكوينات Caddy v1 المذكورة أعلاه في هذا الموضوع.

هذا هو ملف bash الذي يقوم بإنشاء الملفات ذات الصلة في البداية وتشغيل caddy:

#!/usr/bin/env bash

# إنشاء الدلائل الضرورية
mkdir -p /var/caddy
mkdir -p /var/caddy/data
mkdir -p /var/caddy/config



# إنشاء Caddyfile المبسط
cat > /var/caddy/Caddyfile << 'EOF'
{
    email your-email-address-here@example.com
}

community1.example.com, community2.example.com, community3.example.com {
    reverse_proxy unix//sock/nginx.http.sock
}
EOF

# إنشاء docker-compose.yml
cat > /var/caddy/docker-compose.yml << 'EOF'
services:
  caddy:
    image: caddy:latest
    container_name: caddy-proxy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - /var/caddy/Caddyfile:/etc/caddy/Caddyfile
      - /var/caddy/data:/data
      - /var/caddy/config:/config
      - /var/discourse/shared/standalone:/sock
EOF

# الانتقال إلى دليل caddy والبدء
cd /var/caddy

# تشغيل Caddy
docker compose up -d
إعجابَين (2)

شكرًا لك! أريد التبديل إلى Caddy من Nginx. لا يزال لديك unix//sock/nginx.http.sock - هل تستخدم كلًا من Nginx و Caddy معًا؟