پلتفرم افزونه
یک افزونه برنامهای جداست: پروسه یا کانتینر خودش، پایگاه دادهی خودش و رابط خودش. پنل هیچوقت کد آن را اجرا نمیکند، صفحههایش را درون صفحههای خودش نشان نمیدهد و هیچ دادهای از آن نگه نمیدارد. کاری که پنل میکند این است که آن را ثبت کند، دقیقاً همان دسترسیای را که تأیید کردهاید به آن بدهد، و مراقبش باشد. این صفحه توضیح میدهد چطور. نصب یک افزونه در نصب افزونه و صفحهی افزونهها آمده است؛ نوشتن یک افزونه در ساختن افزونه.
چه چیزی میشود به یک افزونه داد
دو چیز، و نه چیز دیگری:
- یک توکن API با مجموعهای از مجوزها (scopeها)، هر کدام با دلیلی که افزونه برایش میآورد. افزونه از راه همان API که بقیه استفاده میکنند پنل را میخواند و تغییر میدهد.
- یک وبهوک که رویدادهایی را که نام برده دریافت میکند. هر رویداد مجوزی را لازم دارد که به افزونه اجازه دهد چیزی را که رویداد دربارهاش است بخواند، و اگر آن مجوز جزو مجوزهای درخواستیاش نباشد manifest رد میشود.
اطلاعات پایهی یک کاربر، مثل اطلاعات تماس، در ستونهای خود پنل هستند که افزونه با توکنش میخواند و مینویسد. هر چیز دیگری که افزونه باید نگه دارد، مثل سفارشها و پرداختهای یک فروشگاه، در پایگاه دادهی خود افزونه میماند.
manifest
هر افزونه خودش را در یک manifest توصیف میکند: شناسه، نام و نسخهاش، مجوزهایی که میخواهد با دلیل هر کدام، رویدادهایی که میخواهد، مسیرهای راهاندازی، وبهوک و سلامتش، یک محدودیت نرخ برای توکنش، و طرز نصبش. همین فایل در مخزن عمومی افزونه است، جایی که فهرست افزونهها و فرم نصب آن را میخوانند، و افزونهی در حال اجرا هم آن را سرو میکند، جایی که ثبت آن را میخواند. قالب کامل در مانیفست افزونه آمده است.
امضاها و اعتماد
یک manifest فقط با امضایش مورد اعتماد است:
| نوع | امضاشده با | ثبت میشود |
|---|---|---|
| رسمی | کلید نکسورا | با کد ادعایش |
| تأییدشده | کلید توسعهدهندهاش، که فهرست افزونهها ضامنش است | با کد ادعایش؛ صفحهی رضایت توسعهدهنده را نام میبرد |
| بیامضا یا غیررسمی | هیچکس که پنل به او اعتماد داشته باشد | دستی، بهعنوان افزونهی خودتان |
امضا همهی فیلدها را پوشش میدهد، پس تغییر هر کدام آن را میشکند. checksumهای یک نسخه با همان کلید امضا میشوند، و پنل فقط وقتی خودش افزونهای را روی یک سرور نصب میکند که فایلها با آنها جور باشند.
ثبت با کد ادعا
- افزونه با یک کد ادعای یکبارمصرف شروع میشود که آن را در لاگش یا روی صفحهی خودش نشان میدهد. وقتی پنل آن را نصب میکند، خود پنل کد را میسازد و از قبل میداندش.
- پنل manifest را از آدرس افزونه میخواند، امضا را بررسی میکند و صفحهی رضایت را نشان میدهد: هر مجوز با دلیلش، هر رویداد، محدودیت نرخ، و اینکه چه کسی امضایش کرده است.
- شما تأیید میکنید. پنل manifest را دوباره میخواند و بررسی میکند که دقیقاً همان سندی باشد که صفحه نشان داده، سپس دقیقاً همان توکن و همان وبهوک را میسازد و همراه کد ادعا به مسیر راهاندازی افزونه تحویل میدهد.
- افزونه آنها را فقط با کد خودش میپذیرد. اگر پاسخی جز موفقیت بدهد (مثلاً کد نادرست)، پنل چیزی را که همین الان ساخته حذف میکند. ثبت ناموفق هیچ اثری به جا نمیگذارد.
پنل یک توکن فعال برای افزونه میفرستد، پس فقط وقتی روی http:// ساده با افزونه حرف میزند که هر آدرسی که آن resolve میشود روی همین سرور، یک شبکهی خصوصی یا یک شبکهی کانتینر باشد. هر جای دیگر افزونه باید روی https:// باشد.
مجوزها متعلق به ردیف افزونهاند
بعد از ثبت، توکن و وبهوک در اختیار ردیف افزونه در سرویسها ← افزونهها هستند:
- زیر توکنهای API و وبهوکها با نام افزونه علامتخورده ظاهر میشوند، و آنجا نمیشود ویرایششان کرد، چرخاندشان یا حذفشان کرد.
- توکن به مالک پنل وابسته است، نه به کسی که تأیید را زده، پس وقتی آن ادمین برود به کار ادامه میدهد، و اگر مالکیت را منتقل کنید همراه آن جابهجا میشود.
- حذف اول به افزونه خبر میدهد، سپس توکن و وبهوکش را حذف میکند. هر چه افزونه دربارهی کاربرهای شما در پایگاه دادهی خودش ذخیره کرده آنجا میماند، پس ثبت دوباره آن را پیدا میکند.
سلامت
وقتی manifest یک مسیر سلامت نام ببرد، پنل هر دقیقه از آن میپرسد. پاسخ 200 یعنی سالم.
- دو پرسش ناموفق پشت سر هم افزونه را با آخرین خطا ناسالم علامت میزند و یک بار
panel.addon_unhealthyایجاد میکند. - 200 بعدی آن را برمیگرداند و
panel.addon_recoveredایجاد میکند.
این وضعیت در پایگاه داده نگه داشته میشود، پس ریاستارت پنل هیچکدام از دو رویداد را تکرار نمیکند. از افزونهای که مسیر سلامت ندارد هیچوقت پرسیده نمیشود.
تعلیق
تعلیق یک افزونه را بدون حذفش متوقف میکند: توکنش فوراً از کار میافتد و وبهوکش دیگر دریافت نمیکند. رویدادهایی که در زمان تعلیق ایجاد شوند برایش نگه داشته نمیشوند. از افزونهی تعلیقشده سلامتش پرسیده نمیشود. ازسرگیری هر دو را دوباره روشن میکند.
بهروزرسانیها هیچوقت خودبهخود مجوزی را گسترش نمیدهند
پنل manifest یک افزونهی امضاشده را هر ساعت دوباره میخواند، و هر وقت بررسی بهروزرسانی را بزنید.
- نسخهای که چیزی بیشتر از آنچه افزونه دارد نمیخواهد خودبهخود اعمال میشود.
- نسخهای که مجوز، رویداد یا محدودیت نرخ بیشتری میخواهد منتظر میماند. افزونه دقیقاً همان چیزی را که دارد نگه میدارد، ردیفش بهروزرسانی … منتظر است را نشان میدهد،
panel.addon_update_waitingیک بار ایجاد میشود، و بازبینی فقط چیزهایی را که بهروزرسانی اضافه میکند، هر کدام با دلیلش، برای تأیید شما فهرست میکند. - نسخهای که توکن یا وبهوکی میخواهد که افزونه هرگز نداشته را نمیشود در جا تأیید کرد: اطلاعات ورودش کد ادعایی را لازم داشت که افزونه قبلاً مصرف کرده است. افزونه را حذف کنید و دوباره ثبتش کنید.
گواهی از پنل
افزونهای که HTTPS سرو میکند میتواند بهجای گرفتن گواهی برای خودش، گواهیاش را از مخزن خود پنل بگیرد. پنل آن را صادر و تمدید میکند؛ افزونه هر چند دقیقه آن را دریافت میکند، پیش از ثبت با کد ادعایش و بعد از آن با توکنش، و یک نسخه نگه میدارد تا حتی وقتی پنل از کار افتاده با HTTPS بالا بیاید. آنوقت به پورت ۸۰ یا ۴۴۳ خودش نیازی ندارد، پس چند افزونه میتوانند یک سرور را با پنل شریک شوند.
برای افزونهای روی سروری دیگر، فقط گواهیهایی پیشنهاد میشوند که سرور پنل اثباتشان نکرده است: آنهایی که با چالش DNS صادر شدهاند، خودامضا یا بارگذاریشده. گواهی HTTPS خود پنل هرگز به افزونهای روی سرور دیگر داده نمیشود، چون کلیدش به آن سرور اجازه میداد خودش را جای پنل جا بزند. این در هر دریافت دوباره بررسی میشود. ببینید گواهیها، صدور و تمدید.
نصب روی سرور خود پنل
وقتی پنل مستقیم روی یک سرور لینوکس اجرا میشود (نه در کانتینر)، میتواند افزونهای را کنار خودش نصب کند، بدون SSH: اسکریپت نصب افزونه را بعد از بررسی نسخه با checksumهای امضاشدهاش بهعنوان root اجرا میکند، و افزونه گواهیاش را از پنل میگیرد. از راه SSH به سرور دیگر همان بررسیها اعمال میشوند؛ کلید میزبان سرور در اولین تماس به خاطر سپرده میشود و گذرواژه یا کلید SSH هرگز ذخیره نمیشود.
صفحههای مرتبط
- گذرگاه رویداد: رویدادها چطور به وبهوک یک افزونه میرسند.
- مدل امنیتی: توکنهای API و scopeها.
- دایرکتوری افزونهها: فهرست افزونهها و سطحهایش.
