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

Here are some notes about how I got my test Discourse instance running with Caddy Server.

Cool stuff about Caddy:

Cons:

  • Not as battle tested as apache, nginx and cia.

How To

Preparing Discourse

First, you need to apply this changes to your 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" # <<<----- THIS IS NEW

## Let this two commented out
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"

## Let this two commented out 
expose:
#  - "8080:80"   # http
#  - "443:443" # https

env:
  ## This should be commented out too
  #LETSENCRYPT_ACCOUNT_EMAIL: mymail@gmail.com

Preparing Caddy

In the spirit of Discourse, let’s put Caddy in a Docker image too :whale2:

First prepare with:

mkdir /var/caddy
nano /var/caddy/Caddyfile

Add the following to the Caddyfile

forum.example.com # your domain here

proxy / unix:/sock/nginx.http.sock {
  transparent
}

Save and exit.

Let’s test

Now you need to rebuild Discourse:

/var/discourse
./launcher rebuild app

And then run Caddy:

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/bin/caddy" \
    abiosoft/caddy -quic -email MYEMAILHERE@gmail.com -agree --conf /etc/Caddyfile --log stdout

After all, your forum should be avaliable at your domain, using SSL + HTTP2 + QUIC. You can’t more hipster than that.

19 إعجابًا

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.

10 إعجابات

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
إعجابَين (2)

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

هل هناك أي ميزة في استخدام 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)