خلاصات ICS مُصادق عليها لأحداث التقويم الخاصة

تمت إعادة تقديم تصدير ICS العام مؤخرًا عبر

GET /discourse-post-event/events.ics، وهو تحسن رائع بعد العمل المنجز في

إعادة إضافة تصدير ICS الكامل.

في الوقت الحالي، يبدو أن نقطة النهاية هذه مقتصرة على الأحداث المرئية للمستخدمين المجهولين. نتيجة لذلك، لا يمكن الاشتراك في الأحداث الموجودة في الفئات الخاصة أو الفئات المقيدة من المجموعة الافتراضية everyone في تطبيقات التقويم الخارجية (مثل تقويم Google، وOutlook).

هل سيكون من الممكن دعم الوصول المصادق عليه إلى نقطة النهاية هذه، على غرار الطريقة التي يتعامل بها Discourse مع خلاصات RSS/Atom الخاصة (على سبيل المثال، عبر رمز مميز لكل مستخدم أو مفتاح واجهة برمجة تطبيقات للقراءة فقط)؟

هذا لن يغير أي قواعد أذونات - بل سيسمح فقط لتطبيقات التقويم بالوصول إلى الأحداث التي تم تخويل المستخدم برؤيتها بالفعل.

أنا أطرح هذا كطلب منفصل ومحدد النطاق بعد إعادة تقديم موجز ICS العام، كما تم اقتراحه سابقًا.

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

بعد التعمق في الكود، انتهى بي الأمر ببرمجة وكيل بسيط للغاية يتعامل مع العقبات المختلفة اللازمة لإنشاء مفتاح واجهة برمجة تطبيقات للمستخدم وتمريره إلى واجهة برمجة التطبيقات؛ كما أنه ينشئ رابطًا يحتاج المستخدمون إلى لصقه في تطبيقات التقويم الخاصة بهم:

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

لقد أضفت ذلك في وقت سابق من هذا الأسبوع في طلب السحب هذا. ومع ذلك، فإن بيئة عمل إنشاء مفاتيح واجهة برمجة تطبيقات المستخدم ليست مثالية للمستخدمين غير التقنيين. لجعل هذا سلسًا، أتابع بما يلي:

والذي يحاول جعل هذا الأمر سهل الاستخدام قدر الإمكان

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

لقد دمجت هذه الميزة للتو، هل يمكنك تجربتها يا @Ethsim2؟

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

شكرًا لك - يمكنني تأكيد أن خلاصتي المُصادق عليها يتم إنشاؤها بشكل صحيح من جهتي الآن.
تبدو المشكلة المتبقية في توافق العميل: لا يبدو أن تقويم Google أو Outlook سعيد بالاشتراك مباشرةً في خلاصة ICS مُصادق عليها بهذا الشكل، لذا سأقوم في الوقت الحالي بتجاوز المشكلة عن طريق وضع وكيل عكسي (reverse proxy) من Nginx على مستوى المضيف أمام تثبيت Discourse ذي الحاوية الواحدة وتقديم ملف .ics عادي هناك بدلاً من ذلك.

نظرًا لأنني أستخدم الإعداد القياسي للحاوية الواحدة، أعتقد أن هذا يعني نقل المنافذ 80/443 بعيدًا عن الحاوية، وجعل Discourse يستمع إلى منفذ داخلي عالٍ، ثم جعل وكيل Nginx العكسي (host Nginx proxy) يمرر المنتدى وكذلك يقدم مسار خلاصة التقويم الثابتة.

تقريبًا، الأوامر التي أتوقع استخدامها هي:

# 1. تثبيت وكيل Nginx و Certbot على المضيف
sudo apt update
sudo apt install -y nginx snapd
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -sf /snap/bin/certbot /usr/bin/certbot

# 2. إيقاف حاوية Discourse لتحرير المنافذ 80/443
cd /var/discourse
sudo ./launcher stop app

# 3. تعديل ملف تهيئة الحاوية لجعل Discourse لا يربط مباشرةً بـ 80/443
sudo nano /var/discourse/containers/app.yml

ثم في app.yml قم بتغيير قسم العرض (expose) من:

expose:
  - "80:80"
  - "443:443"

إلى شيء مثل:

expose:
  - "127.0.0.1:8080:80"

وإذا كانت موجودة، قم بإزالة قوالب SSL / Let’s Encrypt للحاوية بحيث يتم إنهاء TLS على وكيل Nginx العكسي للمضيف بدلاً من ذلك.

ثم أعد البناء:

cd /var/discourse
sudo ./launcher rebuild app

ثم أنشئ موقعًا على مستوى المضيف لـ Nginx مثل:

sudo nano /etc/nginx/sites-available/discourse

مع شيء يشبه:

server {
    listen 80;
    listen [::]:80;
    server_name forum.example.com;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /private-calendar/ethan.ics {
        alias /var/www/private-calendar/ethan.ics;
        default_type text/calendar;
        add_header Content-Type "text/calendar; charset=utf-8";
    }
}

قم بتمكينه وإعادة التحميل:

sudo mkdir -p /var/www/private-calendar
sudo mkdir -p /var/www/certbot
sudo ln -s /etc/nginx/sites-available/discourse /etc/nginx/sites-enabled/discourse
sudo nginx -t
sudo systemctl reload nginx

ثم احصل على شهادة Let’s Encrypt باستخدام Certbot ودعه يقوم بتحديث إعداد Nginx:

sudo certbot --nginx -d forum.example.com
sudo nginx -t
sudo systemctl reload nginx

بعد ذلك، عادةً ما يتضمن إعداد Nginx كتلة خادم HTTPS أيضًا، على سبيل المثال:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name forum.example.com;

    ssl_certificate /etc/letsencrypt/live/forum.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/forum.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /private-calendar/ethan.ics {
        alias /var/www/private-calendar/ethan.ics;
        default_type text/calendar;
        add_header Content-Type "text/calendar; charset=utf-8";
    }
}

عند هذه النقطة، يمكنني استخدام برنامج نصي/مؤقت على المضيف لجلب خلاصة ICS المُصادق عليها من Discourse وكتابتها في:

/var/www/private-calendar/ethan.ics

والتي يمكن لتقويم Google / Outlook الاشتراك فيها كرابط URL لخلاصة ICS عامة عادية.
لذا، من وجهة نظري، يبدو جانب Discourse قد تم حله الآن؛ الفجوة المتبقية عمليًا هي أن عملاء التقويم الرئيسيين لا يتعاملون مع خلاصات ICS المُصادق عليها بشكل جيد، ولهذا السبب ألجأ إلى نهج الوكيل العام/الملف الثابت في الوقت الحالي.

أفترض أيضًا أن Certbot هو المسار الأبسط هنا، لأنه يمكنه إدارة إصدار/تجديد Let’s Encrypt مباشرةً مقابل وكيل Nginx للمضيف. يمكنني أيضًا استخدام acme.sh، لكن انطباعي هو أنه سيكون خيارًا يدويًا أكثر منه المسار الأكثر وضوحًا لهذا الإعداد المحدد.

انتظر ماذا؟

أنا أستخدمه مع تقويمي على Google بشكل جيد، وكذلك بعض زملائي.

ما هو الجزء منه غير المتوافق مع تقويم Google!؟

آه - شكرًا لك، هذا يساعد في تضييق نطاق المشكلة.

من جانبي، يوافق تقويم Google على رابط الاشتراك (عبر “From URL”)، ولكن السلوك الذي أراه هو:

  • تتم إضافة التقويم بنجاح
  • ومع ذلك، فإنه لا يعرض أي أحداث على الإطلاق

لذا، إنها ليست حالة رفض الرابط - بل هي أقرب إلى أن يكون الموجز فارغًا من منظور Google.

بالنظر إلى أن ملف ICS الخام يحتوي بوضوح على إدخالات VEVENT (على سبيل المثال مع UID وDTSTART وSUMMARY، إلخ)، فإن هذا يجعلني أعتقد أنه قد يكون شيئًا مثل:

  • قيام Google بتصفية الأحداث الماضية (معظم بيانات الاختبار الخاصة بي تاريخية)
  • أو شيء يتعلق بكيفية تفسير الموجز (على سبيل المثال، النطاق الزمني، أو التخزين المؤقت، أو الرؤوس)

أخبرني إذا كان هناك أي شيء محدد تود مني التحقق منه في الموجز نفسه.

إعجابَين (2)

هل يمكنك التحقق من /logs بحثًا عن أخطاء؟ لقد أصلحت للتو خطأً تسبب في فشل التغذية بسبب تكرار الأحداث القديمة.

إذا كان الخطأ هو نفسه، فأنت بحاجة إلى التحديث.

سأحتاج إلى البحث سابقاً، قبل الساعة 7 مساءً، حيث أن هناك العديد من التحذيرات/الأخطاء المتعلقة بـ Discourse AI - حد الرمز (token limit)

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