تثبيت Discourse على CloudPanel

:warning: طريقة التثبيت هذه غير معتمدة رسميًا. استخدمها على مسؤوليتك الخاصة.

يوصي فريق Discourse فقط بالتثبيت باستخدام دليل التثبيت الرسمي

:information_source: هذا تثبيت غير مدعوم، وهو مناسب للأشخاص الذين لديهم خبرة مع CloudPanel، وهم مسؤولو أنظمة ذوو خبرة، ومعتادون على Docker ووكلاء العكس (Reverse Proxies)، وقد أكملوا بنجاح تثبيتًا قياسيًا.

لماذا CloudPanel

لماذا قد ترغب في تثبيت منتدى Discourse على خادم VPS أو خادم مخصص يعمل بنظام CloudPanel؟

إليك أسبابي:

أفضل استخدام واجهة رسومية لإدارة الخادم والموقع. لقد استخدمت معظم لوحات تحكم استضافة الويب في وقت ما أو آخر.

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

أقوم بتطوير واستضافة وإدارة العديد من مدونات Ghost، ومواقع Wordpress، ومواقع Drupal، وأنواع أخرى من المواقع بالإضافة إلى منتديات Discourse. أحتاج حقًا إلى خادم واحد فقط يمكنني فيه استضافة منتديات Discourse جنبًا إلى جنب مع مدونات Ghost ومواقع Wordpress وDrupal الخاصة بي. (لا أريد دفع ثمن وصيانة خادم منفصل لكل مثيل من مثيلات Discourse.)

يتضمن CloudPanel (فوريًا من الصندوق) Nginx مدمجًا وواجهة بسيطة لإعداد وإدارة وكلاء العكس (Reverse Proxies) الضرورية لتشغيل مثيل واحد أو أكثر من Discourse على نفس الخادم أو مع أنواع أخرى من المواقع.

لا يوفر فريق Discourse (أو موظفو منتدى Meta هنا) دعمًا لبيئات خوادم بديلة مثل Cpanel أو Plesk أو (كما في هذه الحالة) CloudPanel، أو غيرها التي تظهر من سطر الأوامر.

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

[إذا جرب أي شخص هذه الطريقة، يرجى إخباري بكيفية نجاحها أو إذا كان بإمكاني تحسين هذا الدرس! :heart_eyes: ]

تثبيت Docker

في Putty (أو أي طرفية أخرى)، من دليل الجذر، قم بتشغيل

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io

إنشاء موقع وكيل عكسي في CloudPanel

→ نضغط على زر + Add Site

لمثيل Discourse الخاص بي، أستخدم اسم النطاق الخاص بي noobish.me، لذا من الآن فصاعدًا، أينما رأيت ذلك في بقية هذه التعليمات، استبدل noobish.me باسم نطاقك الفعلي (على سبيل المثال، yoursite.com)

→ نقوم بإنشاء موقع “Reverse Proxy Site” جديد في CloudPanel للنطاق الذي نريد فيه استضافة منتدى Discourse (بالطبع يجب أن يشير سجل DNS A للنطاق إلى عنوان IP نفسه الخاص بـ CloudPanel لدينا.)

إعداد النطاق وتفعيل SSL

لموقعي، أستخدم خوادم الأسماء الخاصة بـ Cloudflare لتوجيه النطاق. في Cloudflare، قمت بتعيين SSL إلى Full أو Full (strict).

كما قمت بإنشاء قاعدة صفحة Cloudflare. قم بزيارة هذا المنشور لمعرفة السبب.

أستخدم أيضًا شهادة أصل SSL مجانية من Cloudflare لنطاقاتي، والتي قمت بـ “استيرادها” إلى CloudPanel ضمن إعدادات الموقع “SSL/TLS” لذلك الموقع (عن طريق لصق الشهادة والمفتاح الخاص اللذين قمت بتحميلهما لنطاق اسمي من حساب Cloudflare الخاص بي.)

تثبيت Discourse

العودة إلى Putty (أو أي طرفية أخرى)، من دليل الجذر (c d Enter للعودة إلى الجذر) → قم بتثبيت تثبيت Discourse القياسي باستخدام هذه الأوامر…

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

Enter

cd /var/discourse

Enter

chmod 700 containers

نسخ إعدادات Standalone

الآن نقوم بنسخ الملف /var/discourse/standalone.yml إلى /var/discourse/containers/ باسم app.yml قبل تحريره وفقًا لإعدادات موقعنا.

cp /var/discourse/samples/standalone.yml /var/discourse/containers/app.yml

تحرير ملف app.yml

بالإضافة إلى تعديل ملف app.yml وفقًا لإعدادات موقعنا المحددة، نحتاج إلى تغيير 3 أشياء أخرى في ذلك الملف قبل حفظه…

تحت قسم templates: نحتاج إلى إضافة

  - "templates/web.socketed.template.yml"

لأنني أستخدم Cloudflare، تحت قسم templates: أضيف أيضًا

  - "templates/cloudflare.template.yml"

تحت قسم expose: نحتاج إلى التعليق على

  #- "80:80"   # http
  #- "443:443" # https

تحت قسم env: نحتاج إلى إضافة

   DISCOURSE_FORCE_HTTPS: true
للمرجعية، يمكنك النقر هنا لرؤية محتوى ملف app.yml الخاص بي الذي يعمل على noobish.me حيث أستخدم كلًا من Cloudflare و Mailgun...
## هذا هو قالب حاوية Docker المستقلة لـ 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/web.socketed.template.yml"
  - "templates/cloudflare.template.yml"

params:
  db_default_text_search_config: "pg_catalog.english"

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

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

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

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  DISCOURSE_FORCE_HTTPS: true

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

  ## TODO: اسم النطاق الذي ستستجيب له هذه المثيلة من Discourse
## مطلوب. لن يعمل Discourse مع عنوان IP عاري.
  DISCOURSE_HOSTNAME: 'noobish.me'

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

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

  ## TODO: خادم البريد SMTP المستخدم للتحقق من الحسابات الجديدة وإرسال الإشعارات
# عنوان SMTP واسم المستخدم وكلمة المرور مطلوبة
# تحذير: قد يسبب حرف '#' في كلمة مرور SMTP مشاكل!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: postmaster@noobish.me
  DISCOURSE_SMTP_PASSWORD:  pYdRLyQW
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (اختياري، الافتراضي true)
  #DISCOURSE_SMTP_DOMAIN: noobish.me    # (مطلوب من بعض مقدمي الخدمة)
  DISCOURSE_NOTIFICATION_EMAIL: noreply@noobish.me    # (العنوان المرسل منه الإشعارات)

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

  ## مفتاح عنوان IP الجغرافي من Maxmind للبحث عن عناوين 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='info@unconfigured.discourse.org'"
  - exec: echo "End of custom commands"

ثم نحفظ ونخرج من ملف app.yml…

CTRL-X

y

Enter

بعد ذلك نحدد صلاحيات ملف app.yml…

chmod o-rwx containers/app.yml

ثم…

تهيئة التطبيق

cd /var/discourse
./launcher bootstrap app

سيستغرق هذا وقتًا طويلاً. في نهاية عملية التهيئة، سيُطلب منك:

./launcher start app

تحرير ملف Vhost

الآن نعود إلى CloudPanel ونلصق الكود أدناه في “Vhost Editor” لموقع Discourse الخاص بنا (مستبدلاً ما هو موجود بالفعل). بالطبع استبدل yoursite.com باسم نطاقك الفعلي.

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  {{ssl_certificate_key}}
  {{ssl_certificate}}
  server_name yoursite.com;
  {{root}}

  {{nginx_access_log}}
  {{nginx_error_log}}

  if ($scheme != "https") {
    rewrite ^ https://$host$uri permanent;
  }

  location ~ /.well-known {
    auth_basic off;
    allow all;
  }

  {{settings}}

  add_header Cache-Control no-transform;

  location / {
                proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
                proxy_set_header Host $http_host;
                proxy_http_version 1.1;
                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;

  }
}

إعادة تشغيل Nginx

بعد ذلك نحتاج إلى إعادة تشغيل Nginx، وهو ما يمكننا فعله بالنقر على زر في منطقة الإدارة الخاصة بـ CloudPanel…

تهانينا!

الآن، في متصفحنا، يمكننا الذهاب إلى عنوان URL لموقعنا وتشغيل معالج إعداد Discourse…

العيش بسلام

الآن يمكنني استضافة موقع Discourse وإدارته بنفسي جنبًا إلى جنب مع مواقع Ghost وWordpress وDrupal وأنواع أخرى من المواقع باستخدام لوحة إدارة نظيفة وخفيفة، مع حاجة دنيا مستقبلاً لاستخدام الطرفية/سطر الأوامر.


لتثبيت مثيلات إضافية من Discourse…

3 إعجابات

يجب عليك حذف هذه الخطوات وإنشاء app.yml دون توليد هذا الخطأ. إنه مربك.

(إذا كنت ستستبدل الملف بأكمله، فلماذا تنسخ المثال؟) الشيء الأفضل الذي يجب فعله هو تحديد ما يجب تغييره من العينة الموجودة. يبدو أنه قالب المقبس وفرض https.

هذا يمنحك نسختين من postgres، والتي تستخدم ذاكرة وصول عشوائي أكثر مما تستخدمه نسخة واحدة من postgres. إنه يعمل، ولكنه ليس أفضل ممارسة.

هناك عدد من الأشياء التي تجعل هذا ليس مثالاً جيدًا يجب اتباعه وسيكون من الصعب جدًا دعمه. أنا سعيد لأنك توصلت إلى حل لك، لكنني لا أعتقد أن هذا مسار جيد لإرسال الناس إليه.

3 إعجابات

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

هل يمكنك توضيح سبب اعتقادك هذا؟

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

إعجابَين (2)

شكراً مرة أخرى @pfaffman – لقد بسّطت الإجراء الآن وأزلت القسم الخاص بإضافة موقع Discourse ثانٍ على نفس الخادم.

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

لقد تلقيت هذه الرسالة

sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io
usage: gpg [options] --dearmor [file]
curl: (23) Failed writing body

لماذا؟

أهلاً أنطونيو. مرحباً بك.

يبدو أن هذه مشكلة دوكر وليست مشكلة تتعلق بـ Discourse. من الأفضل لك البحث باستخدام نظام التشغيل الخاص بك وتحديث docker-ce بدلاً من السؤال هنا.

هل تحاول استخدام Discourse؟ أم CloudPanel؟

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

لقد اتبعت الدليل هنا للتو. قمت بتشغيل الأمر الأول، لتثبيت دوكر، واستجاب الخادم بهذا
الأمر هو:

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

لا ينبغي أن تكون هناك شرطات مائلة عكسية في نهاية كل سطر من هذه الأسطر. الشرطة المائلة العكسية تهرب من سطر جديد، مما يعني أن الصدفة تعامل السطر التالي على أنه استمرار لنفس السطر.

في هذه الحالة، سيؤدي ذلك إلى محاولة تشغيل هذا كأمر واحد وهو مصدر الخطأ:
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable\"

مجرد إزالة هذه الشرطات المائلة العكسية في نهاية الأسطر سيحل هذه المشكلة:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io
إعجابَين (2)

شكرا لك، الآن يعمل بشكل جيد

إعجابَين (2)

شكراً لك @Simon_Manning – لقد قمت بإزالة الشرطات المائلة العكسية في مقتطف الشفرة في البرنامج التعليمي للمنشور العلوي.

إعجابَين (2)

عذرًا، لقد واجهت هذا الخطأ الآن: FAILED

Pups::ExecError: /usr/local/bin/ruby -e 'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end' failed with return #<Process::Status: pid 112 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params "/usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end'"
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
214c73c4474ed59e7b6fb7f42143ce126d2b453022b08770da3af31ca2fdaaba

لا أعرف CloudPanel، ولكن رسائل الخطأ تبدو واضحة بذاتها:

'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end'
'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end'\"

يبدو أن بريدك الإلكتروني لم يتم تكوينه أثناء ./discourse-setup أو داخل app.yml (يمكنك تعديله يدويًا في أي وقت). :thinking:

إعجابَين (2)

عذرًا للجميع، أنا أستاذ في مدرسة فيرمي الثانوية وأحاول تثبيت مجتمع “ديسكورس” لمدرستنا. نظرًا لأننا نستخدم لوحات سحابية، فقد اتبعت هذا الدليل ولكن يبدو أن هناك شيئًا مفقودًا. هل من الممكن الحصول على المساعدة ودليل أكثر تفصيلاً لأتبعه؟ ألف شكر.

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

أعتقد أن استخدام تثبيت متقدم قد لا يكون ما تبحث عنه إذا لم تكن لديك الكثير من المعرفة في إدارة الأنظمة. نقطة أخرى مهمة يجب مراعاتها هي أن مثل هذا التثبيت سيقع تحت #unsupported-install، مما يجعل من غير المرجح الحصول على المساعدة هنا إذا واجهت مشكلات.

إذا كانت لديك الميزانية ويعتمد ذلك على حجم مجتمعك، فقد يكون من الأفضل استضافة Discourse على خادم آخر واتباع التثبيت القياسي.

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

عذرًا، ولماذا تُستخدم خدمة كهذه؟ في رأيي، ربما الدليل ليس مفصلاً للغاية، فهو مُعد لمسؤولي النظام، وسيكون كافياً ببساطة الإشارة إلى الخطوات المختلفة. حيثما أتيت، يُقال: لا أحد يولد متعلمًا. شكرًا لمساعدتك ووقتك.

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

هذا صحيح تمامًا. لهذا السبب تم التوصية بالتثبيت القياسي.

وهذا، @denvergeeks هو السبب في أنني لم أعتقد أن إنشاء دليل كهذا كانت فكرة جيدة في المقام الأول. من الصعب كتابته، ومن الصعب صيانته، وأنت الشخص الوحيد الذي يمكنه التحقق منه.

4 إعجابات

أنا آسف ولكنني لا أتفق. أنا أستخدم بالفعل لوحة التحكم السحابية مع نطاقات مختلفة، علاوة على ذلك، سيعمل مجتمع المناقشة على نطاق فرعي ثم يكون افتراض المؤلف واضحًا جدًا (الدليل مخصص لأولئك الذين يستخدمون لوحة التحكم السحابية مع خدمات مختلفة مثبتة على VPS). كل ما يتطلبه الأمر هو القليل من الجهد لتفصيل كل شيء بشكل أفضل. على أي حال، فإن مشاركة المعرفة هي أساس المجتمعات، وإلا لكنت قد اشتريت برنامجًا مثبتًا وجاهزًا للاستخدام بالفعل. على أي حال، لا أريد إزعاج أي شخص، إذا كان من الممكن الحصول على المساعدة، فشكرًا لك، وإلا فلن أزعجك مرة أخرى.

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

@denvergeeks إعداد البريد الإلكتروني أمر بالغ الأهمية للتشغيل العادي وعلى الرغم من وجود رابط للتثبيت القياسي، فإن الطريقة التي تمت بها كتابة الدليل حاليًا تتجاوز إعداد البريد الإلكتروني بالإضافة إلى معلومات أخرى متنوعة قد تكون مهمة لإعدادات معينة.

أتساءل عما إذا كان الأمر يستحق استبدال أقسام تثبيت ديسكورس حتى تهيئة التطبيق بشيء أقرب إلى:

تثبيت وتهيئة ديسكورس

اتبع التثبيت القياسي من خلال الخطوات 1-6

قم بتنفيذ الأشياء الموجودة حاليًا في تعديل ملف app.yml

إعادة بناء ديسكورس:

./launcher rebuild app

ثم في قسم تهانينا!، أضف سطرًا بعد لقطة الشاشة لتقول شيئًا مثل “تابع بقية وثائق التثبيت القياسي”. في الأساس، أعد صياغة الدليل لتقديم خطوات إضافية تعزز التثبيت القياسي بدلاً من تقديم تعليمات تثبيت بديلة.

أعتقد أن المعلومات التي قدمتها حول CloudPanel مفيدة للغاية والتعليمات واضحة، ويمكن أن يستفيد جانب Discourse فقط من وجود تباعد أقل عن التثبيت القياسي لجعله أكثر أمانًا بالإضافة إلى علامة #unsupported-install لتوضيح (بشكل أوضح) أن هنا توجد مخاطر.

إعجابَين (2)

ينحرف النقاش نوعًا ما عن الموضوع الأصلي، ولكن كن مطمئنًا بأننا سعداء بالمساعدة. :slight_smile:

لتلخيص الأمر:

إذا كانت لديك معرفة أساسية بتقنية المعلومات، يمكنك اتباع التثبيت القياسي. ستحتاج أيضًا إلى اسم نطاق، وتكوين خدمة إرسال البريد الإلكتروني مثل Mailgun (دليل هنا: Configure Mailgun for email when using Digital Ocean for DNS).

لاحظ أننا عادةً لا نساعد في الأمور التي تقع خارج نطاق هذا المنتدى. على سبيل المثال، سؤال “كيف أسجل اسم نطاق؟” لن يكون مناسبًا هنا.

إذا لم تكن لديك معرفة أساسية بتقنية المعلومات وتعتمد على ميزانيتك، يمكنك طلب الدعم المدفوع على Marketplace.

أخيرًا، يمكنك أيضًا إلقاء نظرة على خطط Discourse المُدارة والمدفوعة، حيث سيتم التعامل مع كل شيء تقريبًا من قبلنا وستحصل على وصول إلى دعم فريقنا.

أيضًا، اعلم أننا نقدم خصومات للأغراض التعليمية، بما أنك ذكرت أنها لمدرستك:

هل هناك خصومات تعليمية أو للمنظمات غير الربحية؟

نعم! إذا كنت معترفًا بك قانونيًا كمؤسسة تعليمية، فنحن نقدم خصمًا بنسبة 85٪. إذا كنت معترفًا بك قانونيًا كمنظمة غير ربحية معفاة من الضرائب الفيدرالية، فنحن نقدم خصمًا بنسبة 50٪. تنطبق هذه الخصومات فقط على خططنا الأساسية والاحترافية وخطط الأعمال، ولا يمكن دمجها مع خصومات أخرى، ويجب دفعها عبر بطاقة الخصم/الائتمان شهريًا أو سنويًا. اتصل بنا بعد بدء تجربتك وسنضيف الخصم إلى حسابك.

4 إعجابات