سرور مجازی

  • ۰
  • ۰

 چگونه سرورهای اوبونتو 20.04 را به روز نگه داریم

ورود به سایت

معرفی

در این آموزش، بهترین روش ها را برای به روز نگه داشتن سرورهای اوبونتو 20.04 خود بررسی خواهید کرد. درست مانند تقویت امنیت شبکه، گام‌های زیادی وجود دارد که می‌توانید برای اطمینان از اینکه سرورهایتان بدون مداخله در آینده به کار امن خود ادامه می‌دهند، انجام دهید.

تعدادی ابزار و پیکربندی وجود دارد که می‌توانید آن‌ها را برای اکثر سرورهای اوبونتو، فراتر از آنچه که به طور خودکار برای شما پیکربندی شده است، اعمال کنید. اگر مدیریت سرور خود را انجام می‌دهید، وصله دستی همه محیط‌هایتان می‌تواند بسیار مخرب و مستعد خطا باشد.

این آموزش شامل موارد زیر خواهد بود: آزمایش راه‌اندازی مجدد برازنده به دنبال بهترین شیوه‌ها برای مدیریت برنامه، برای به حداقل رساندن هرگونه عوارض ناشی از به‌روزرسانی‌های تعمیر و نگهداری، پیکربندی به‌روزرسانی‌های خودکار برای اکثر بسته‌ها و کتابخانه‌های در حال اجرا بر روی دستگاه شما وصله هسته زنده، و سایر بهترین روش‌ها در مورد به‌روزرسانی‌های هسته

پیش نیازها

یک سرور اوبونتو 20.04 و یک کاربر غیر ریشه با امتیازات sudo.

مرحله 1 – پیروی از بهترین روش ها برای مدیریت برنامه

بخش اساسی پیکربندی سرور برای ارتقای خودکار اطمینان از اینکه همه برنامه‌های در حال اجرا بر روی سرور قادر به راه‌اندازی صحیح پس از توقف برنامه‌ریزی نشده یا راه‌اندازی مجدد هستند، است. مدیران بسته لینوکس طوری طراحی شده‌اند که بدون اختلال در پس‌زمینه اجرا شوند تا تعمیر و نگهداری لازم با هزینه‌های اضافی همراه نباشد. با وجود این، یکی از رایج‌ترین دلایل برای نداشتن یک استراتژی به‌روزرسانی خوب، نگرانی در مورد نحوه رفتار سرور شما پس از راه‌اندازی مجدد است.

در صورت امکان، برنامه های موجود در پشته شما باید توسط سیستم init سرور شما مدیریت شود، که در اکثر توزیع های لینوکس مدرن از جمله اوبونتو سیستمی است. Systemd دستور systemctl را برای تعامل با سرویس های در حال اجرا و راه اندازی مجدد خودکار آنها در صورت نیاز ارائه می دهد. تقریباً تمام نرم افزارهایی که از طریق مدیریت بسته شما نصب می شوند و برای اجرا در پس زمینه طراحی می شوند، باید به طور خودکار یک سرویس systemd و یک فایل واحد پیکربندی را به عنوان بهترین روش ارائه دهند.

هنگام اجرای نرم افزار خود، یا نرم افزار مستقر شده از مخازن Git، ایده بدی نیست که فایل های واحد خود را برای ادغام با systemd بنویسید. به عنوان یک جایگزین سبک، ممکن است ترجیح دهید از ابزاری مانند سرپرست استفاده کنید. همچنین می‌توانید از زمان‌بندی cron سیستم خود با دستور reboot@ استفاده کنید.

پس از اینکه پیکربندی در جای خود قرار گرفت، مطمئن شوید که آن را از طریق راه اندازی مجدد تست کنید. می‌توانید با اجرای sudo shutdown now -r راه‌اندازی مجدد کنید، که فرآیندهای در حال اجرا شما را کاملاً متوقف می‌کند و بلافاصله راه‌اندازی مجدد می‌شود. همچنین می‌توانید به‌جای زمان کنونی، زمان را به hh:mm یا چند دقیقه از هم‌اکنون تعیین کنید تا در آینده راه‌اندازی مجدد را برنامه‌ریزی کنید. استقرار تولید معمولاً پس از قطعی های برنامه ریزی نشده نیازی به توجه شما ندارد و همه سرویس ها و نقاط پایانی لازم باید به طور خودکار بازیابی شوند.

اکنون که مطمئن شده‌اید محیط شما با راه‌اندازی مجدد تعمیر و نگهداری مشکلی نخواهد داشت، در مرحله بعد، نحوه برنامه‌ریزی به‌روزرسانی‌های خودکار را خواهید آموخت.

مرحله 2 – پیکربندی ارتقاءهای بدون نظارت

مدیر بسته اوبونتو، apt، دارای یک گردش کار کاملاً ثابت برای انجام یک ارتقاء کامل سیستم است. ابتدا، آپدیت apt را اجرا می‌کنید تا لیست بسته‌های خود را به‌روزرسانی کنید، و سپس، apt upgrade را بدون مشخص کردن بسته‌ای اجرا می‌کنید تا هر بسته در سیستم را ارتقا دهید. اگر با بسته‌های شخص ثالث تداخل نسخه داشته باشید یا اگر عمداً برخی از بسته‌ها را ارتقا نداده‌اید، این گردش کار ممکن است کمی متفاوت باشد، اما دستورات اصلی یکسان هستند.

اوبونتو یک ابزار منحصر به فرد به نام ارتقاهای بدون نظارت را به منظور بازیابی و نصب خودکار وصله های امنیتی و سایر ارتقاءهای ضروری برای سرور شما فراهم می کند. اکثر سرورهای اوبونتو با این ابزار به صورت خودکار نصب و پیکربندی می شوند، اما می توانید آن را با دستورات apt زیر نصب کنید:

sudo apt update
sudo apt install unattended-upgrades

پس از نصب، می توانید بررسی کنید که آیا سرویس ارتقاء بدون نظارت با استفاده از systemctl اجرا می شود:

sudo systemctl status unattended-upgrades.service

پیکربندی پیش‌فرض به‌روزرسانی‌های بدون نظارت به‌طور خودکار رفع اشکال و به‌روزرسانی‌های امنیتی را برای اکثر بسته‌های موجود در مخازن اوبونتو بازیابی می‌کند. با این حال، اگر از نسخه‌های قدیمی‌تر برخی بسته‌ها برای جلوگیری از تغییرات بالادستی استفاده می‌کنید، یا اگر سرور شما علاوه بر اوبونتو از مخازن بسته شخص ثالث استفاده می‌کند، می‌توانید سرویس ارتقاء بدون نظارت را پیکربندی کنید.

پیکربندی آن در /etc/apt/apt.conf.d/50unattended-upgrades ذخیره می شود. این فایل را با استفاده از nano یا ویرایشگر متن مورد علاقه خود باز کنید:

sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

فایل به خوبی حاشیه نویسی شده است، و می توانید خطوط بسیاری از نظرات کد (با //) را ببینید که عملکرد آن را توضیح می دهند. اولین بلوک پیکربندی، بسته‌هایی را که به‌طور خودکار به‌روزرسانی می‌شوند، بررسی می‌کند و با الگوی نام‌های مخزن بسته اوبونتو مطابقت دارد. فایل‌های موجود در مخزن هسته و مخزن -security به طور پیش‌فرض به‌روزرسانی می‌شوند، اما خطوط حاوی مخازن -updates، -proposed و -backports به‌طور پیش‌فرض نظر داده می‌شوند.

این مخازن به‌طور پیش‌فرض غیرفعال هستند، زیرا به احتمال زیاد حاوی تغییرات قطعی در بسته‌های نصب‌شده شما هستند. برای اینکه به صورت دستی آنها را برای ارتقای بدون نظارت فعال کنید، می توانید نمادهای // نظر را از این خطوط حذف کنید.

در پایین تر از فایل، تعدادی گزینه با ضامن تنظیمات درست / نادرست وجود دارد. به عنوان مثال، پس از نصب بسته هایی که برای اعمال نیاز به راه اندازی مجدد دارند، یک جابجایی برای راه اندازی مجدد خودکار وجود دارد. می توانید این گزینه را با حذف علامت // و تغییر false به true فعال کنید. با این حال، انجام این کار باعث می شود سرور شما در فواصل غیرقابل پیش بینی از دسترس خارج شود. اگر این گزینه را فعال کردید، مطمئن شوید که برنامه‌ها یا کاربران شما می‌توانند خرابی را تحمل کنند.

پس از اتمام ویرایش فایل را ذخیره کرده و ببندید. اگر از nano استفاده می کنید، Ctrl+X را فشار دهید، سپس وقتی از شما خواسته شد، Y و سپس Enter را فشار دهید.

اگر تغییراتی در پیکربندی ایجاد کردید، سرویس ارتقاهای بدون نظارت را مجدداً بارگیری کنید تا اعمال شود:

sudo systemctl reload unattended-upgrades.service

اکنون باید راه‌حل‌هایی برای اطمینان از دریافت به‌روزرسانی‌های امنیتی ضروری همه بسته‌های روی سرور بدون هیچ گونه مداخله اضافی داشته باشید. در مرحله آخر، یاد خواهید گرفت که چگونه هسته خود را به روز نگه دارید، و چگونه می توانید راه اندازی مجدد سرور را در مواقع ضروری مدیریت کنید.

مرحله 3 – به روز رسانی و LivePatching هسته

کمتر از بسته های دیگر، باید هسته سیستم خود را به روز کنید. هسته لینوکس شامل (تقریبا) تمام درایورهای سخت افزاری در حال اجرا است و مسئول بیشتر تعاملات سطح پایین سیستم است. به‌روزرسانی‌های هسته معمولاً فقط در صورتی ضروری هستند که آسیب‌پذیری با مشخصات بالایی برای رفع آن وجود داشته باشد، اگر نیاز به استفاده از یک ویژگی عمومی جدید هسته دارید، یا اگر هسته شما آنقدر قدیمی شده است که خطر انباشته شدن باگ‌ها و آسیب‌پذیری‌ها وجود دارد. شما ممکن است آگاه نباشید

هیچ روش جهانی برای زمان بندی خودکار به روز رسانی هسته لینوکس وجود ندارد. این به این دلیل است که به‌روزرسانی‌های هسته از گذشته نیازمند راه‌اندازی مجدد کامل سیستم بوده‌اند و زمان‌بندی راه‌اندازی مجدد بدون ایجاد فرضیاتی در مورد محیط شما غیرممکن است. انتظار می‌رود که بسیاری از سرورها تا حد امکان در دسترس بودن 24 ساعته و 7 روز هفته را ارائه دهند و راه‌اندازی مجدد می‌تواند مدت زمان نامعلومی طول بکشد یا نیاز به مداخله دستی داشته باشد.

اگر می‌خواهید مدتی از کار افتادگی را تحمل کنید، به‌روزرسانی هسته‌تان ساده است: به‌روزرسانی‌های apt بدون نظارت را می‌توان برای نصب و آماده‌سازی هسته‌های جدید به همراه بسته‌های دیگر پیکربندی کرد و پس از راه‌اندازی مجدد، سرور شما باید به‌طور خودکار از هسته جدید استفاده کند. اکثر استقرارهای تولید به پیچیدگی بیشتری در مورد راه اندازی مجدد مانند این نیاز دارند تا از در دسترس بودن سرویس اطمینان حاصل شود. به عنوان مثال، شما ممکن است از یک متعادل کننده بار برای هدایت خودکار ترافیک به سرورهایی استفاده کنید که می توانند عملکردهای یکسانی را در یک استقرار مقیاس افقی ارائه دهند، در حالی که آنها به صورت جداگانه به ترتیب راه اندازی مجدد می شوند، تا از هرگونه خرابی قابل مشاهده جلوگیری شود.

فعال کردن Livepatch برای اطمینان از Uptime سرور در طول به روز رسانی هسته

برای جلوگیری از خرابی در هنگام ارتقای هسته، می توانید از ویژگی هسته لینوکس به نام وصله زنده استفاده کنید. این ویژگی امکان پیاده سازی به روز رسانی هسته را بدون راه اندازی مجدد می دهد. دو نگهدارنده اصلی برای وصله‌های زنده هسته وجود دارد: Canonical، که سرویس Livepatch خود را برای اوبونتو ارائه می‌کند، و KernelCare که اوبونتو را علاوه بر سایر توزیع‌های اصلی لینوکس پشتیبانی می‌کند. هر دو برای استفاده نیاز به ثبت نام دارند و فقط سرویس Canonical برای استفاده فردی رایگان است.

می توانید برای یک کلید Livepatch در https://auth.livepatch.canonical.com/ ثبت نام کنید. پس از ثبت نام، می توانید بسته snap canonical-livepatch را نصب کنید. Snap یکی دیگر از مدیریت بسته های اوبونتو است که در کنار apt اجرا می شود.

sudo snap install canonical-livepatch

می‌توانید با استفاده از کلید وب‌سایت آن‌ها، با فرمان یک خطی، canonical-livepatch را فعال کنید:

sudo canonical-livepatch enable your-key

خروجی باید حاوی پیام Successfully enabled device باشد. این سرویس باید از این پس بدون هیچ گونه مداخله دیگری در پس زمینه اجرا شود و می توانید وضعیت آن را با استفاده از وضعیت canonical-livepatch بررسی کنید:

sudo canonical-livepatch status

شما اکنون به‌روزرسانی‌های خودکار هسته را برای سرور خود پیکربندی کرده‌اید، به این معنی که دیگر نیازی به راه‌اندازی مجدد برای حفظ یک محیط امن و به‌روز نیست.

نتیجه

در این آموزش، چندین استراتژی را برای به روز نگه داشتن سرورهای اوبونتو به طور خودکار بررسی کردید. همچنین برخی از تفاوت های ظریف مخازن بسته، به روز رسانی هسته و مدیریت راه اندازی مجدد سرور را یاد گرفتید. همه اینها اصول مهم DevOps و کار با سرورها به طور گسترده تر هستند و تقریباً تمام پیکربندی های تولید بر اساس این مفاهیم اصلی هستند.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:LivePatching هستهاتصال به سرور مجازیبه روز رسانی سرورخرید سرور مجازیراه اندازی سرورسرور مجازیسرورهای اوبونتو 20.04فعال کردن Livepatch

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه نصب و پیکربندی Nextcloud در اوبونتو 20.04

ورود به سایت

معرفی

Nextcloud، یک فورک از ownCloud، یک سرور به اشتراک گذاری فایل است که به شما امکان می دهد محتوای شخصی خود، مانند اسناد و تصاویر، را در یک مکان متمرکز مانند Dropbox ذخیره کنید. تفاوت با Nextcloud این است که همه ویژگی های آن منبع باز هستند. همچنین کنترل و امنیت داده های حساس شما را به شما باز می گرداند، بنابراین استفاده از سرویس میزبانی ابری شخص ثالث را حذف می کند.

در این آموزش، ما یک نمونه Nextcloud را روی سرور اوبونتو 20.04 نصب و پیکربندی می کنیم.

پیش نیازها

 

برای تکمیل مراحل این راهنما، به موارد زیر نیاز دارید:

کاربر و فایروال غیر ریشه‌دار sudo که روی سرور شما پیکربندی شده است: می‌توانید یک کاربر با امتیازات sudo ایجاد کنید و با دنبال کردن تنظیمات اولیه سرور با اوبونتو 20.04، یک فایروال اساسی راه‌اندازی کنید.
(اختیاری) نام دامنه ای که به سرور شما اشاره می کند: ما اتصالات را به نصب Nextcloud با TLS/SSL ایمن می کنیم. اگر سرور شما نام دامنه داشته باشد، Nextcloud می تواند یک گواهی SSL رایگان و قابل اعتماد از Let’s Encrypt را تنظیم و مدیریت کند. در غیر این صورت، Nextcloud می تواند یک گواهی SSL با امضای خود تنظیم کند که می تواند اتصالات را رمزگذاری کند، اما به طور پیش فرض در مرورگرهای وب قابل اعتماد نخواهد بود.
پس از انجام مراحل بالا، برای یادگیری نحوه راه اندازی Nextcloud بر روی سرور خود، ادامه دهید.

مرحله 1 – نصب Nextcloud

ما Nextcloud را با استفاده از سیستم بسته بندی Snap نصب خواهیم کرد. این سیستم بسته‌بندی که به‌طور پیش‌فرض در اوبونتو 20.04 موجود است، به سازمان‌ها اجازه می‌دهد تا نرم‌افزار را به همراه تمام وابستگی‌ها و پیکربندی‌های مرتبط، در یک واحد مستقل با به‌روزرسانی‌های خودکار ارسال کنند. این بدان معناست که به جای نصب و پیکربندی یک سرور وب و پایگاه داده و سپس پیکربندی برنامه Nextcloud برای اجرا بر روی آن، می‌توانیم بسته snap را نصب کنیم که سیستم‌های زیربنایی را به طور خودکار مدیریت می‌کند.

برای دانلود بسته Nextcloud snap و نصب آن بر روی سیستم، تایپ کنید:

sudo snap install nextcloud

بسته Nextcloud دانلود و بر روی سرور شما نصب خواهد شد. با فهرست کردن تغییرات مرتبط با snap می‌توانید تأیید کنید که فرآیند نصب با موفقیت انجام شده است:

snap changes nextcloud

 

Output

ID   Status  Spawn               Ready               Summary
4    Done    today at 16:12 UTC  today at 16:12 UTC  Install "nextcloud" snap

وضعیت و خلاصه نشان می دهد که نصب بدون هیچ مشکلی انجام شده است.

دریافت اطلاعات اضافی درباره Nextcloud Snap

اگر اطلاعات بیشتری در مورد Nextcloud snap می‌خواهید، چند دستور وجود دارد که می‌تواند مفید باشد.

دستور snap info می تواند توضیحات، دستورات مدیریت Nextcloud موجود، و همچنین نسخه نصب شده و کانال snap را که ردیابی می شود به شما نشان دهد:

snap info nextcloud

اسنپ‌ها می‌توانند اتصالاتی را که پشتیبانی می‌کنند تعریف کنند، که شامل یک شکاف و دوشاخه است که وقتی به هم متصل می‌شود، دسترسی فوری به قابلیت‌ها یا سطوح دسترسی خاص را می‌دهد. به عنوان مثال، اسنپ هایی که باید به عنوان مشتری شبکه عمل کنند، باید اتصال شبکه را داشته باشند. برای اینکه ببینید این snap چه اتصالاتی را تعریف می کند، تایپ کنید:

snap connections nextcloud

 

Output

Interface        Plug                       Slot           Notes
network          nextcloud:network          :network       -
network-bind     nextcloud:network-bind     :network-bind  -
removable-media  nextcloud:removable-media  -              -

برای اطلاع از همه خدمات و برنامه‌های خاصی که این اسنپ ارائه می‌کند، می‌توانید با تایپ کردن، نگاهی به فایل تعریف snap بیندازید:

cat /snap/nextcloud/current/meta/snap.yaml

این به شما این امکان را می‌دهد تا در صورت نیاز به کمک برای رفع اشکال، اجزای جداگانه موجود در اسنپ را ببینید.

مرحله 2 – پیکربندی یک حساب اداری

چند راه مختلف برای پیکربندی Nextcloud snap وجود دارد. در این راهنما، به جای ایجاد یک کاربر مدیریتی از طریق رابط وب، یک کاربر در خط فرمان ایجاد می کنیم تا از پنجره کوچکی که در آن صفحه ثبت نام مدیر برای هرکسی که از آدرس IP یا نام دامنه سرور شما بازدید می کند در دسترس باشد، جلوگیری کنیم.

برای پیکربندی Nextcloud ب

ا یک حساب کاربری جدید، از دستور nextcloud.manual-install استفاده کنید. شما باید یک نام کاربری و یک رمز عبور را به عنوان آرگومان وارد کنید:

sudo nextcloud.manual-install sammy password

پیام زیر نشان می دهد که Nextcloud به درستی پیکربندی شده است:

 

Output

Nextcloud was successfully installed

اکنون که Nextcloud نصب شده است، باید دامنه های مورد اعتماد را طوری تنظیم کنیم که Nextcloud با استفاده از نام دامنه یا آدرس IP سرور به درخواست ها پاسخ دهد.

مرحله 3 – تنظیم دامنه های مورد اعتماد

هنگام نصب از خط فرمان، Nextcloud نام میزبان هایی را که نمونه به آنها پاسخ می دهد محدود می کند. به‌طور پیش‌فرض، این سرویس تنها به درخواست‌های ارسال شده به نام میزبان «localhost» پاسخ می‌دهد. ما از طریق نام دامنه یا آدرس IP سرور به Nextcloud دسترسی خواهیم داشت، بنابراین باید این تنظیم را برای پذیرش این نوع درخواست‌ها تنظیم کنیم.

با پرس و جو کردن مقدار آرایه trusted_domains می توانید تنظیمات فعلی را مشاهده کنید:

sudo nextcloud.occ config:system:get trusted_domains

 

Output

localhost

در حال حاضر، فقط localhost به عنوان اولین مقدار در آرایه وجود دارد. می‌توانیم یک ورودی برای نام دامنه یا آدرس IP سرور خود با تایپ کردن اضافه کنیم:

sudo nextcloud.occ config:system:set trusted_domains 1 –value=example.com

 

Output

System config value trusted_domains => 1 set to string example.com

اگر دوباره دامنه های مورد اعتماد را پرس و جو کنیم، خواهیم دید که اکنون دو ورودی داریم:

sudo nextcloud.occ config:system:get trusted_domains

 

Output

localhost
example.com

اگر نیاز به افزودن راه دیگری برای دسترسی به نمونه Nextcloud دارید، می‌توانید با اجرای مجدد دستور config:system:set با یک عدد فهرست افزایش‌یافته («1» در دستور اول) و تنظیم مقدار — دامنه‌ها یا آدرس‌های اضافی اضافه کنید. .

مرحله 4 – ایمن سازی رابط وب Nextcloud با SSL

قبل از شروع استفاده از Nextcloud، باید رابط وب را ایمن کنیم.

اگر یک نام دامنه مرتبط با سرور Nextcloud خود دارید، snap Nextcloud می تواند به شما کمک کند یک گواهی SSL قابل اعتماد را از Let’s Encrypt دریافت و پیکربندی کنید. اگر سرور Nextcloud شما نام دامنه ندارد، Nextcloud می تواند یک گواهی امضا شده را پیکربندی کند که ترافیک وب شما را رمزگذاری می کند اما به طور خودکار توسط مرورگر وب شما قابل اعتماد نخواهد بود.

با در نظر گرفتن این موضوع، بخش زیر را دنبال کنید که با سناریوی شما مطابقت دارد.

گزینه 1: راه اندازی SSL با Let’s Encrypt

اگر یک نام دامنه مرتبط با سرور Nextcloud خود دارید، بهترین گزینه برای ایمن سازی رابط وب خود دریافت گواهی Let’s Encrypt SSL است.

با باز کردن پورت‌هایی در فایروال که Let’s Encrypt برای تأیید مالکیت دامنه استفاده می‌کند، شروع کنید. با این کار صفحه ورود Nextcloud شما به صورت عمومی قابل دسترسی خواهد بود، اما از آنجایی که ما قبلاً یک حساب سرپرست پیکربندی شده‌ایم، هیچ‌کس نمی‌تواند نصب را هک کند:

sudo ufw allow 80,443/tcp

سپس، با تایپ کردن، یک گواهی Let’s Encrypt درخواست کنید:

sudo nextcloud.enable-https lets-encrypt

ابتدا از شما سوال می شود که آیا سرور شما شرایط لازم برای درخواست گواهی از سرویس Let’s Encrypt را دارد یا خیر:

 

Output

In order for Let's Encrypt to verify that you actually own the
domain(s) for which you're requesting a certificate, there are a
number of requirements of which you need to be aware:

1. In order to register with the Let's Encrypt ACME server, you must
   agree to the currently-in-effect Subscriber Agreement located
   here:

       https://letsencrypt.org/repository/

   By continuing to use this tool you agree to these terms. Please
   cancel now if otherwise.

2. You must have the domain name(s) for which you want certificates
   pointing at the external IP address of this machine.

3. Both ports 80 and 443 on the external IP address of this machine
   must point to this machine (e.g. port forwarding might need to be
   setup on your router).

Have you met these requirements? (y/n)

برای ادامه y را تایپ کنید.

در مرحله بعد، از شما خواسته می شود یک آدرس ایمیل برای استفاده برای عملیات بازیابی ارائه دهید:

 

Output

Please enter an email address (for urgent notices or key recovery):

ایمیل خود را وارد کنید و برای ادامه Enter را فشار دهید.

در نهایت، نام دامنه مرتبط با سرور Nextcloud خود را وارد کنید:

 

Output

Please enter your domain name(s) (space-separated): example.com

گواهی Let’s Encrypt شما درخواست می شود و به شرطی که همه چیز به خوبی پیش برود، نمونه داخلی آپاچی مجدداً راه اندازی می شود تا بلافاصله SSL پیاده سازی شود:

 

Output

Attempting to obtain certificates... done
Restarting apache... done

اکنون می توانید به مرحله بعدی بروید تا برای اولین بار وارد Nextcloud شوید.

گزینه 2: راه اندازی SSL با گواهی خود امضا شده

اگر سرور Nextcloud شما نام دامنه ندارد، همچنان می‌توانید با ایجاد یک گواهی SSL خودامضا، رابط وب را ایمن کنید. این گواهی اجازه دسترسی به رابط وب را از طریق یک اتصال رمزگذاری شده می دهد، اما نمی تواند هویت سرور شما را تأیید کند، بنابراین مرورگر شما احتمالاً هشداری را نمایش می دهد.

برای ایجاد یک گواهی خودامضا و پیکربندی Nextcloud برای استفاده از آن، تایپ کنید:

sudo nextcloud.enable-https self-signed

 

Output

Generating key and self-signed certificate... done
Restarting apache... done

خروجی بالا نشان می دهد که Nextcloud یک گواهی امضا شده را تولید و فعال کرده است.

اکنون که رابط امن است، پورت های وب را در فایروال باز کنید تا به رابط وب اجازه دسترسی داشته باشید:

sudo ufw allow 80,443/tcp

اکنون برای اولین بار آماده ورود به Nextcloud هستید.

مرحله 5 – وارد شدن به رابط وب Nextcloud

اکنون که Nextcloud پیکربندی شده است، از نام دامنه یا آدرس IP سرور خود در مرورگر وب خود بازدید کنید:

https://example.com

از آنجایی که قبلاً یک حساب مدیر را از خط فرمان پیکربندی کرده اید، به صفحه ورود به Nextcloud هدایت می شوید. اعتبارنامه هایی را که برای کاربر مدیریت ایجاد کرده اید وارد کنید:

برای ورود به رابط وب Nextcloud روی دکمه ورود به سیستم کلیک کنید.

اولین باری که وارد می شوید، پنجره ای با چند متن مقدماتی و پیوندهایی به کلاینت های مختلف Nextcloud نمایش داده می شود که می توان از آنها برای دسترسی به نمونه Nextcloud خود استفاده کرد:

 

برای دانلود هر کلاینت مورد علاقه خود کلیک کنید یا با کلیک بر روی X در گوشه سمت راست بالا از پنجره خارج شوید. شما به رابط اصلی Nextcloud هدایت می شوید، جایی که می توانید شروع به آپلود و مدیریت فایل ها کنید:

نصب شما اکنون کامل و ایمن شده است. برای آشنایی بیشتر با ویژگی ها و عملکرد سیستم جدید خود، می توانید رابط کاربری را بررسی کنید.

نتیجه

Nextcloud می‌تواند قابلیت‌های سرویس‌های ذخیره‌سازی ابری شخص ثالث را تکرار کند. محتوا را می توان بین کاربران یا به صورت خارجی با URL های عمومی به اشتراک گذاشت. مزیت Nextcloud این است که اطلاعات به صورت امن در مکانی که شما کنترل می کنید ذخیره می شود.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:ایجاد سرور مجازیبپیکربندی Nextcloud snapتنظیمات اولیه سرور مجازیخرید سرور مجازی نامحدودراه اندازی SSLسرور اوبونتو 20.04سیستم بسته بندی Snapفروش سرور مجازینصب و پیکربندی Nextcloud

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از MongoDB در یک برنامه Flask

ورود به سایت

معرفی

در برنامه های تحت وب، معمولاً به یک پایگاه داده نیاز دارید که مجموعه ای سازمان یافته از داده ها است. شما از یک پایگاه داده برای ذخیره و نگهداری داده های پایدار استفاده می کنید که می توانند به طور موثر بازیابی و دستکاری شوند. به عنوان مثال، در یک برنامه رسانه های اجتماعی، شما یک پایگاه داده دارید که در آن داده های کاربر (اطلاعات شخصی، پست ها، نظرات، دنبال کنندگان) به گونه ای ذخیره می شود که می توان به طور موثر دستکاری کرد. بسته به شرایط و شرایط مختلف می‌توانید داده‌ها را به پایگاه داده اضافه کنید، آن‌ها را بازیابی کنید، تغییر دهید یا حذف کنید. در یک برنامه وب، این الزامات ممکن است یک کاربر باشد که یک پست جدید اضافه می کند، یک پست را حذف می کند یا حساب خود را حذف می کند، که ممکن است پست های آنها را حذف کند یا نکند. اقداماتی که برای دستکاری داده ها انجام می دهید به ویژگی های خاصی در برنامه شما بستگی دارد. به عنوان مثال، ممکن است نخواهید کاربران پست هایی بدون عنوان اضافه کنند.

Flask یک چارچوب وب سبک وزن پایتون است که ابزارها و ویژگی های مفیدی را برای ایجاد برنامه های کاربردی وب در زبان پایتون ارائه می دهد. MongoDB یک برنامه پایگاه داده NoSQL برای همه منظوره، سند محور است که از اسناد JSON مانند برای ذخیره داده ها استفاده می کند. برخلاف روابط جدولی که در پایگاه‌های اطلاعاتی رابطه‌ای استفاده می‌شود، اسناد JSON مانند امکان ایجاد طرح‌واره‌های انعطاف‌پذیر و پویا را در عین سادگی حفظ می‌کنند. به طور کلی، پایگاه های داده NoSQL توانایی مقیاس افقی را دارند که آنها را برای داده های بزرگ و برنامه های بلادرنگ مناسب می کند.

در این آموزش، شما یک برنامه وب لیست کارهای کوچک می سازید که نحوه استفاده از کتابخانه PyMongo را نشان می دهد، یک درایور پایگاه داده MongoDB که به شما امکان می دهد با پایگاه داده MongoDB خود در پایتون تعامل داشته باشید. شما از آن با Flask برای انجام کارهای اساسی مانند اتصال به یک سرور پایگاه داده، ایجاد مجموعه هایی که گروهی از اسناد را در MongoDB ذخیره می کنند، درج داده ها در یک مجموعه، و بازیابی و حذف داده ها از یک مجموعه استفاده خواهید کرد.

پیش نیازها

  • یک محیط برنامه نویسی محلی Python 3، آموزش توزیع خود را در نحوه نصب و راه اندازی یک محیط برنامه نویسی محلی برای سری Python 3 دنبال کنید. در این آموزش ما دایرکتوری پروژه خود را flask_app می نامیم.
  • MongoDB روی دستگاه محلی شما نصب شده است. راهنمای نحوه نصب MongoDB در اوبونتو 20.04 را برای تنظیم پایگاه داده MongoDB خود دنبال کنید.
  • درک مفاهیم پایه فلاسک، مانند مسیرها، توابع مشاهده، و الگوها. اگر با Flask آشنایی ندارید، نحوه ایجاد اولین برنامه وب خود با استفاده از Flask و Python و نحوه استفاده از الگوها در یک برنامه Flask را بررسی کنید.
  • درک مفاهیم اولیه HTML برای آگاهی از پیشینه، می‌توانید مجموعه آموزش نحوه ساخت یک وب‌سایت با HTML را مرور کنید.

مرحله 1 – راه اندازی PyMongo و Flask

در این مرحله Flask و کتابخانه PyMongo را نصب خواهید کرد.

با فعال شدن محیط مجازی، از pip برای نصب Flask و PyMongo استفاده کنید:

pip install Flask pymongo

پس از اتمام نصب با موفقیت، در انتهای خروجی خطی مشابه شکل زیر مشاهده خواهید کرد:

 

Output

Successfully installed Flask-2.0.2 Jinja2-3.0.3 MarkupSafe-2.0.1 Werkzeug-2.0.2 click-8.0.3 itsdangerous-2.0.1 pymongo-4.0.1

اکنون که بسته های پایتون مورد نیاز را نصب کرده اید، به سرور MongoDB خود متصل می شوید و یک مجموعه ایجاد می کنید.

مرحله 2 – اتصال به سرور MongoDB و ایجاد یک مجموعه

در این مرحله، از کتابخانه PyMongo برای ایجاد یک کلاینت استفاده می‌کنید که از آن برای تعامل با سرور MongoDB، ایجاد یک پایگاه داده، و سپس ایجاد مجموعه‌ای برای ذخیره کارهای خود استفاده می‌کنید.

با فعال بودن محیط برنامه نویسی خود، فایلی به نام app.py را برای ویرایش در پوشه flask_app خود باز کنید:

nano app.py

این فایل کلاس و راهنماهای لازم را از Flask و کتابخانه PyMongo وارد می کند. شما با سرور MongoDB خود برای ایجاد یک پایگاه داده و ایجاد مجموعه ای برای کارها تعامل خواهید داشت. کد زیر را به app.py اضافه کنید:

flask_app/app.py

from flask import Flask
from pymongo import MongoClient

app = Flask(__name__)

client = MongoClient('localhost', 27017)

db = client.flask_db
todos = db.todos

ذخیره کنید و فایل را ببندید.

در اینجا شما کلاس Flask را وارد می کنید، که از آن برای ایجاد یک نمونه برنامه کاربردی Flask به نام app استفاده می کنید.

شما MongoClient را وارد می کنید که از آن برای ایجاد یک شی کلاینت برای نمونه MongoDB به نام کلاینت استفاده می کنید، که به شما امکان می دهد با سرور MongoDB خود ارتباط برقرار کنید و با آن تعامل داشته باشید. وقتی MongoClient را نمونه‌سازی می‌کنید، آن را به میزبان سرور MongoDB خود، که در مورد ما localhost است، و پورت را که در اینجا 27017 است، منتقل می‌کنید.

سپس از نمونه مشتری برای ایجاد یک پایگاه داده MongoDB به نام flask_db استفاده می کنید و یک مرجع به آن را در متغیری به نام db ذخیره می کنید.

سپس مجموعه ای به نام todos در پایگاه داده flask_db با استفاده از متغیر db ایجاد می کنید. مجموعه ها گروهی از اسناد را در MongoDB ذخیره می کنند، مانند جداول در پایگاه های داده رابطه ای.

در MongoDB، پایگاه داده ها و مجموعه ها با تنبلی ایجاد می شوند. این به این معنی است که حتی اگر فایل app.py را اجرا کنید، تا زمانی که اولین سند ایجاد نشود، هیچ یک از کدهای مربوط به پایگاه داده اجرا نخواهد شد. شما یک برنامه کوچک Flask با صفحه ای ایجاد خواهید کرد که به کاربران اجازه می دهد در مرحله بعد اسناد todo را در مجموعه کارهای شما وارد کنند. هنگامی که اولین سند todo اضافه شد، پایگاه داده flask_db و مجموعه todos در سرور MongoDB شما ایجاد می شود.

برای دریافت لیستی از پایگاه های داده فعلی خود، یک ترمینال جدید باز کنید و پوسته mongo را با استفاده از دستور زیر راه اندازی کنید:

mongo

یک اعلان باز می شود، می توانید پایگاه داده خود را با استفاده از دستور زیر بررسی کنید:

show dbs

خروجی، اگر نصب جدیدی از MongoDB باشد، مدیریت، پیکربندی و پایگاه داده محلی را فهرست می کند.

متوجه خواهید شد که flask_db هنوز وجود ندارد. پوسته مونگو را در پنجره ترمینال بگذارید و به مرحله بعد ادامه دهید.

مرحله 3 – ایجاد یک صفحه وب برای افزودن و نمایش کارها

در این مرحله، یک صفحه وب با یک فرم وب ایجاد می‌کنید که به کاربران اجازه می‌دهد تا کارها را اضافه کرده و در همان صفحه نمایش دهند.

با فعال بودن محیط برنامه نویسی، فایل app.py خود را برای ویرایش باز کنید:

nano app.py

ابتدا موارد وارداتی زیر را از فلاسک اضافه کنید:

flask_app/app.py

from flask import Flask, render_template, request, url_for, redirect
from pymongo import MongoClient

# ...

در اینجا، تابع render_template() کمکی را که برای رندر یک قالب HTML استفاده می کنید، شی درخواست برای دسترسی به داده هایی که کاربر ارسال می کند، تابع url_for() برای تولید URL و تابع redirect() برای تغییر مسیر کاربر وارد می کنید. پس از افزودن یک کار به صفحه فهرست بازگردید.

سپس مسیر زیر را در انتهای فایل اضافه کنید:

flask_app/app.py

# ...


@app.route('/', methods=('GET', 'POST'))
def index():
    return render_template('index.html')

ذخیره کنید و فایل را ببندید.

در این مسیر، تاپل (“GET”، “POST”) را به پارامتر متد ارسال می کنید تا درخواست های GET و POST را مجاز کنید. درخواست های GET برای بازیابی داده ها از سرور استفاده می شود. درخواست های POST برای ارسال داده ها به یک مسیر خاص استفاده می شود. به طور پیش فرض، فقط درخواست های GET مجاز هستند. هنگامی که کاربر برای اولین بار مسیر / را با استفاده از یک درخواست GET درخواست می کند، یک فایل الگو به نام index.html ارائه می شود. شما بعداً این مسیر را برای رسیدگی به درخواست‌های POST برای زمانی که کاربران فرم وب را برای ایجاد کارهای جدید پر کرده و ارسال می‌کنند، ویرایش خواهید کرد.

سپس یک پوشه templates در پوشه flask_app خود و الگوی index.html که در مسیر قبلی به آن اشاره کردید ایجاد کنید:

mkdir templates
nano templates/index.html

کد زیر را داخل فایل index.html اضافه کنید:

flask_app/templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>FlaskApp</title>
    <style>
        .todo {
            padding: 20px;
            margin: 10px;
            background-color: #eee;
        }
    </style>
</head>
<body>
    <h1>FlaskTODO</h1>
    <hr>
    <div class="content">
    <form method="post">
        <p>
            <b><label for="content">Todo content</label></b>
        </p>
        <p>
            <input type="text" name="content"
                placeholder="Todo Content"></input>
        </p>

        <p>
            <b><label for="degree">Degree</label></b>
        </p>
        <p>
            <input id="degree-0" name="degree" required type="radio" value="Important">
            <label for="degree-0">Important</label>
        </p>
        <p>
            <input id="degree-1" name="degree" required type="radio" value="Unimportant">
            <label for="degree-1">Unimportant</label>
        </p>
        <button type="submit">Submit</button>
    </form>
    </div>
</body>
</html>

ذخیره کنید و فایل را ببندید.

در اینجا شما یک صفحه اصلی HTML با عنوان، چند سبک، عنوان و یک فرم وب دارید. در فرم وب، ویژگی متد را برای ارسال نشان می دهید که فرم درخواست POST ارسال می کند. شما یک فیلد ورودی متنی برای محتوای todo با محتوای نام دارید که برای دسترسی به داده های عنوان در مسیر / از آن استفاده می کنید. شما همچنین دو دکمه رادیویی HTML با درجه نام دارید که به کاربر امکان می‌دهد درجه اهمیت هر مورد را مشخص کند: آنها می‌توانند گزینه مهم یا گزینه غیرممکن را هنگام ایجاد کار انتخاب کنند. در آخر، شما یک دکمه ارسال در انتهای فرم دارید.

در حالی که در دایرکتوری flask_app خود با محیط مجازی فعال هستید، با استفاده از متغیر محیطی FLASK_APP به Flask در مورد برنامه (در این مورد app.py) بگویید. سپس متغیر محیطی FLASK_ENV را روی توسعه تنظیم کنید تا برنامه در حالت توسعه اجرا شود و به دیباگر دسترسی پیدا کنید. برای اطلاعات بیشتر در مورد اشکال زدا Flask، به نحوه رسیدگی به خطاها در یک برنامه فلاسک مراجعه کنید. برای این کار از دستورات زیر استفاده کنید:

export FLASK_APP=app
export FLASK_ENV=development

بعد، برنامه را اجرا کنید:

flask run

با اجرای سرور توسعه، با استفاده از مرورگر خود از URL زیر دیدن کنید:

http://127.0.0.1:5000/

صفحه فهرست را با یک فیلد ورودی برای محتوای todo، دو دکمه رادیویی برای درجه اهمیت و یک دکمه ارسال خواهید دید.

برای اطلاعات بیشتر در مورد فرم های وب، نحوه استفاده از فرم های وب در یک برنامه فلاسک را ببینید. برای یک روش پیشرفته تر و ایمن تر برای مدیریت فرم های وب، به نحوه استفاده و اعتبارسنجی فرم های وب با Flask-WTF مراجعه کنید.

اگر فرم را پر کنید و ارسال کنید، با ارسال یک درخواست POST به سرور، هیچ اتفاقی نمی افتد زیرا شما درخواست های POST را در مسیر / رسیدگی نکرده اید.

سرور را در حال اجرا بگذارید و یک پنجره ترمینال جدید باز کنید.

برای رسیدگی به درخواست POST که کاربر ارسال می کند، app.py را باز کنید، آنها را به مجموعه کارها اضافه کنید و در صفحه فهرست نمایش دهید:

nano app.py

مسیر / را به شکل زیر ویرایش کنید:

flask_app/app.py

@app.route('/', methods=('GET', 'POST'))
def index():
    if request.method=='POST':
        content = request.form['content']
        degree = request.form['degree']
        todos.insert_one({'content': content, 'degree': degree})
        return redirect(url_for('index'))

    all_todos = todos.find()
    return render_template('index.html', todos=all_todos)

ذخیره کنید و فایل را ببندید.

در این تغییرات، شما درخواست های POST را در داخل شرط if request.method == ‘POST’ مدیریت می کنید. شما محتوای todo و درجه اهمیتی که کاربر ارسال می کند را از شی request.form استخراج می کنید.

شما از متد insert_one() در مجموعه todos برای اضافه کردن یک سند todo به آن استفاده می کنید. شما داده‌های todo را در فرهنگ لغت پایتون ارائه می‌دهید، «محتوا» را روی مقداری که کاربر در قسمت متن برای محتوای todo ارسال کرده است، تنظیم می‌کنید و کلید «درجه» را روی مقدار دکمه رادیویی که کاربر انتخاب می‌کند، تنظیم می‌کنید. سپس به صفحه فهرست هدایت می‌شوید، که صفحه را تازه می‌کند و آیتم جدید اضافه شده را نمایش می‌دهد.

برای نمایش تمام کارهای ذخیره شده، از متد find() خارج از کدی که مسئول رسیدگی به درخواست‌های POST است استفاده می‌کنید، که تمام اسناد todo موجود در مجموعه todos را برمی‌گرداند. کارهایی را که از پایگاه داده دریافت می کنید در متغیری به نام all_todos ذخیره می کنید و سپس فراخوانی تابع render_template() را ویرایش می کنید تا لیست اسناد todo را به قالب index.html منتقل کنید، که در قالب در متغیری به نام موجود خواهد بود. کارها

اگر صفحه فهرست را بازخوانی کنید، ممکن است پیامی از مرورگر دریافت کنید که از شما می خواهد ارسال مجدد فرم را تأیید کنید. اگر بپذیرید، مورد todo که قبلاً قبل از رسیدگی به درخواست‌های POST ارسال کرده‌اید، سپس به پایگاه داده اضافه می‌شود، زیرا کد رسیدگی به فرم‌ها اکنون در مسیر وجود دارد.

از آنجایی که صفحه فهرست هنوز کدی برای نمایش موارد انجام کار ندارد، موردی که اضافه کردید قابل مشاهده نخواهد بود. اگر به مرورگر اجازه ارسال مجدد فرم شما را داده‌اید، می‌توانید با باز کردن پوسته مونگو و اتصال به پایگاه داده flask_db با استفاده از دستور زیر، داده‌های تازه اضافه شده را مشاهده کنید:

use flask_db

سپس از تابع find() برای دریافت همه موارد todo در پایگاه داده استفاده کنید:

db.todos.find()

اگر داده‌ای دوباره ارسال شد، آن را اینجا در خروجی خود خواهید دید.

سپس، قالب index.html را باز کنید تا محتویات لیست کارهایی که به آن ارسال کرده اید نمایش داده شود:

nano templates/index.html

فایل را با اضافه کردن یک شکست <hr> و یک حلقه Jinja برای بعد از فرم ویرایش کنید، به طوری که فایل به شکل زیر باشد:

flask_app/templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>FlaskApp</title>
    <style>
        .todo {
            padding: 20px;
            margin: 10px;
            background-color: #eee;
        }
    </style>
</head>
<body>
    <h1>FlaskTODO</h1>
    <hr>
    <div class="content">
    <form method="post">
        <p>
            <b><label for="content">Todo content</label></b>
        </p>
        <p>
            <input type="text" name="content"
                placeholder="Todo Content"></input>
        </p>

        <p>
            <b><label for="degree">Degree</label></b>
        </p>
        <p>
            <input id="degree-0" name="degree" required type="radio" value="Important">
            <label for="degree-0">Important</label>
        </p>
        <p>
            <input id="degree-1" name="degree" required type="radio" value="Unimportant">
            <label for="degree-1">Unimportant</label>
        </p>
        <button type="submit">Submit</button>
    </form>
    <hr>
    {% for todo in todos %}
        <div class="todo">
            <p>{{ todo['content'] }} <i>({{ todo['degree']}})</i></p>
        </div>
    {% endfor %}

    </div>
</body>
</html>

ذخیره کنید و فایل را ببندید.

در این فایل، یک تگ <hr> اضافه می‌کنید تا فرم وب و لیست کارها را جدا کنید.

شما از یک حلقه for در خط {% for todo in todos %} برای عبور از هر مورد در لیست کارها استفاده می کنید. شما محتوای todo و درجه اهمیت را در یک تگ <p> نمایش می دهید.

اکنون صفحه فهرست خود را بازخوانی کنید، فرم وب را پر کنید و آن را ارسال کنید. کارهایی که اضافه کردید را در زیر فرم خواهید دید. در مرحله بعد، دکمه ای اضافه می کنید که به کاربران اجازه می دهد کارهای موجود را حذف کنند.

مرحله 4 – حذف Todos

در این مرحله، مسیری را اضافه می‌کنید که به کاربران اجازه می‌دهد تا با استفاده از یک دکمه، کارها را حذف کنند.

ابتدا، یک مسیر /id/delete جدید اضافه می‌کنید که درخواست‌های POST را می‌پذیرد. تابع view delete() جدید شما شناسه کاری را که باید از URL حذف شود دریافت می کند، سپس از آن شناسه برای حذف آن استفاده کنید.

برای حذف یک todo، شناسه آن را به عنوان یک رشته دریافت می‌کنید و باید قبل از ارسال آن به روش حذف مجموعه، آن را به ObjectId تبدیل کنید. بنابراین باید کلاس ObjectId() را از ماژول bson وارد کنید، که کدگذاری و رمزگشایی BSON (Binary JSON) را مدیریت می کند.

برای ویرایش app.py را باز کنید:

nano app.py

ابتدا وارد کردن زیر را در بالای فایل اضافه کنید:

flask_app/app.py

from bson.objectid import ObjectId

# ...

این کلاس ObjectId() است که از آن برای تبدیل شناسه رشته ها به اشیاء ObjectId استفاده می کنید.

سپس مسیر زیر را در پایان اضافه کنید:

flask_app/app.py

# ...


@app.post('/<id>/delete/')
def delete(id):
    todos.delete_one({"_id": ObjectId(id)})
    return redirect(url_for('index'))

ذخیره کنید و فایل را ببندید.

در اینجا، به جای استفاده از دکوراتور معمولی app.route، از دکوراتور app.post معرفی شده در Flask نسخه 2.0.0 استفاده می کنید که میانبرهایی را برای روش های رایج HTTP اضافه می کند. برای مثال، @app.post(“/login”) یک میانبر برای @app.route(“/login”، method=[“POST”]) است. این بدان معناست که این تابع view فقط درخواست‌های POST را می‌پذیرد، و پیمایش به مسیر /ID/delete در مرورگر شما، خطای 405 Method Not Allowed را برمی‌گرداند، زیرا مرورگرهای وب به‌طور پیش‌فرض درخواست‌های GET را دارند. برای حذف یک todo، کاربر روی دکمه ای کلیک می کند که درخواست POST را به این مسیر ارسال می کند.

تابع شناسه سند کاری را که باید حذف شود دریافت می کند. شما این شناسه را به متد ()delete_one در مجموعه todos ارسال می‌کنید و شناسه رشته‌ای را که دریافت می‌کنید با استفاده از کلاس ObjectId() که قبلاً وارد کرده‌اید به ObjectId تبدیل می‌کنید.

پس از حذف سند todo، کاربر را به صفحه فهرست هدایت می کنید.

سپس، قالب index.html را ویرایش کنید تا دکمه Delete Todo اضافه شود:

nano templates/index.html

حلقه for را با افزودن یک تگ <form> جدید ویرایش کنید:

flask_app/templates/index.html

    {% for todo in todos %}
        <div class="todo">
            <p>{{ todo['content'] }} <i>({{ todo['degree']}})</i></p>
            <form method="POST" action="{{ url_for('delete', id=todo['_id']) }}" >
                <input type="submit" value="Delete Todo"
                       onclick="return confirm('Are you sure you want to delete this entry?')">
            </form>
        </div>
    {% endfor %}

ذخیره کنید و فایل را ببندید.

در اینجا، یک فرم وب دارید که یک درخواست POST را به تابع view delete() ارسال می کند. شما به todo[‘_id’] منتقل می‌کنید تا کاری را که حذف می‌شود، مشخص کنید. شما از متد ()firm موجود در مرورگرهای وب برای نمایش پیام تایید قبل از ارسال درخواست استفاده می کنید.

اکنون صفحه فهرست خود را بازخوانی کنید و دکمه Delete Todo را در زیر هر مورد انجام دهید. روی آن کلیک کنید و حذف را تایید کنید. شما به صفحه فهرست هدایت می شوید و کار دیگر در آنجا وجود نخواهد داشت.

اکنون راهی برای حذف کارهای ناخواسته از پایگاه داده mongoDB خود در برنامه Flask خود دارید.

برای تایید حذف، پوسته مونگو خود را باز کنید و از تابع find() استفاده کنید:

db.todos.find()

باید ببینید که مواردی که حذف کرده اید دیگر در مجموعه کارهای شما نیستند.

نتیجه

شما یک برنامه وب کوچک Flask برای مدیریت کارهای انجام دادید که با پایگاه داده MongoDB ارتباط برقرار می کند. شما یاد گرفتید که چگونه به یک سرور پایگاه داده MongoDB متصل شوید، مجموعه هایی ایجاد کنید که گروهی از اسناد را ذخیره می کنند، داده ها را در یک مجموعه وارد کنید، و داده ها را از یک مجموعه بازیابی و حذف کنید.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:اتصال به سرور MongoDBاتصال به سرور مجازیبرنامه Flaskبرنامه های کاربردی وبپایتونحذف Todosخرید سرور مجازیخرید سرور مجازی قویراه اندازی PyMongoسرور مجازینحوه استفاده از MongoDB

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه نصب Hadoop در حالت مستقل در اوبونتو 20.04

ورود به سایت

معرفی

Hadoop یک چارچوب برنامه نویسی مبتنی بر جاوا است که از پردازش و ذخیره مجموعه داده های بسیار بزرگ در مجموعه ای از ماشین های ارزان قیمت پشتیبانی می کند. این اولین پروژه بزرگ منبع باز در زمینه بازی کلان داده بود و توسط بنیاد نرم افزار آپاچی حمایت می شود.

Hadoop از چهار لایه اصلی تشکیل شده است:

Hadoop Common مجموعه ای از ابزارها و کتابخانه هایی است که از ماژول های دیگر Hadoop پشتیبانی می کند.
HDFS که مخفف Hadoop Distributed File System است، مسئول ماندگاری داده ها روی دیسک است.
YARN، مخفف Yet Another Resource Negotiator، «سیستم عامل» برای HDFS است.
MapReduce مدل پردازش اصلی برای خوشه‌های Hadoop است. کار را در خوشه یا نقشه توزیع می کند، سپس نتایج را از گره ها به یک پاسخ به یک پرس و جو سازماندهی و کاهش می دهد. بسیاری از مدل‌های پردازشی دیگر برای نسخه 3.x Hadoop در دسترس هستند.
راه اندازی خوشه های Hadoop نسبتاً پیچیده است، بنابراین پروژه شامل یک حالت مستقل است که برای یادگیری در مورد Hadoop، انجام عملیات ساده و اشکال زدایی مناسب است.

در این آموزش، Hadoop را در حالت مستقل نصب می‌کنید و یکی از نمونه‌های برنامه MapReduce را اجرا می‌کنید تا نصب را تأیید کنید.

پیش نیازها

برای دنبال کردن این آموزش، شما نیاز دارید:

سرور اوبونتو 20.04 با کاربر غیر ریشه با امتیازات sudo: می‌توانید در راهنمای راه‌اندازی سرور اولیه با اوبونتو 20.04 درباره نحوه راه‌اندازی کاربری با این امتیازات بیشتر بدانید.
همچنین ممکن است دوست داشته باشید نگاهی به مقدمه ای بر مفاهیم و اصطلاحات کلان داده یا مقدمه ای بر هادوپ بیندازید.

پس از تکمیل پیش نیازها، برای شروع به عنوان کاربر sudo خود وارد شوید.

مرحله 1 – نصب جاوا

برای شروع، لیست بسته ما را به روز می کنید و OpenJDK، کیت توسعه پیش فرض جاوا را در اوبونتو 20.04 نصب می کنید:

sudo apt update
sudo apt install default-jdk

پس از اتمام نصب، بیایید نسخه را بررسی کنیم.

java -version

 

Output

openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.13+8-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)

این خروجی تأیید می کند که OpenJDK با موفقیت نصب شده است.

مرحله 2 – نصب Hadoop

با جاوا در جای خود، از صفحه انتشارات Apache Hadoop دیدن خواهید کرد تا آخرین نسخه پایدار را بیابید.

برای نسخه ای که می خواهید نصب کنید به باینری بروید. در این راهنما شما Hadoop 3.3.1 را نصب خواهید کرد، اما می توانید شماره نسخه های موجود در این راهنما را با یکی از دلخواه خود جایگزین کنید.

در صفحه بعد، کلیک راست کرده و پیوند را به باینری انتشار کپی کنید.

در سرور، از wget برای واکشی آن استفاده خواهید کرد:

wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz

برای اینکه مطمئن شوید فایلی که دانلود کرده اید تغییر نکرده است، یک بررسی سریع با استفاده از SHA-512 یا الگوریتم هش ایمن 512 انجام خواهید داد. به صفحه انتشار بازگردید، سپس کلیک راست کرده و پیوند را در کپی کنید. فایل چک‌سوم برای نسخه باینری که دانلود کرده‌اید:

باز هم از wget در سرور ما برای دانلود فایل استفاده خواهید کرد:

wget https://downloads.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz.sha512

سپس تأیید را اجرا کنید:

shasum -a 512 hadoop-3.3.1.tar.gz

 

Output

2fd0bf74852c797dc864f373ec82ffaa1e98706b309b30d1effa91ac399b477e1accc1ee74d4ccbb1db7da1c5c541b72e4a834f131a99f2814b030fbd043df66  hadoop-3.3.1.tar.gz

این مقدار را با مقدار SHA-512 در فایل .sha512 مقایسه کنید:

cat hadoop-3.3.1.tar.gz.sha512

~/hadoop-3.3.1.tar.gz.sha512

...
SHA512 (hadoop-3.3.1.tar.gz) = 2fd0bf74852c797dc864f373ec82ffaa1e98706b309b30d1effa91ac399b477e1accc1ee74d4ccbb1db7da1c5c541b72e4a834f131a99f2814b030fbd043df66
...

خروجی دستوری که در برابر فایلی که از mirror دانلود کرده اید اجرا می کنید باید با مقدار فایلی که از apache.org دانلود کرده اید مطابقت داشته باشد.

اکنون که تأیید کرده اید که فایل خراب یا تغییر نکرده است، می توانید آن را استخراج کنید:

tar -xzvf hadoop-3.3.1.tar.gz

خروجی دستوری که در برابر فایلی که از mirror دانلود کرده اید اجرا می کنید باید با مقدار فایلی که از apache.org دانلود کرده اید مطابقت داشته باشد.

اکنون که تأیید کرده اید که فایل خراب یا تغییر نکرده است، می توانید آن را استخراج کنید:

sudo mv hadoop-3.3.1 /usr/local/hadoop

با نصب نرم افزار، آماده پیکربندی محیط آن هستید.

مرحله 3 – پیکربندی جاوا خانه Hadoop

Hadoop نیاز دارد که مسیر جاوا را به عنوان یک متغیر محیطی یا در فایل پیکربندی Hadoop تنظیم کنید.

مسیر جاوا /usr/bin/java یک پیوند نمادین به /etc/alternatives/java است که به نوبه خود یک پیوند نمادین به باینری پیش فرض جاوا است. شما از readlink با پرچم -f برای دنبال کردن هر پیوند نمادین در هر قسمت از مسیر، به صورت بازگشتی استفاده خواهید کرد. سپس، از sed برای برش bin/java از خروجی استفاده خواهید کرد تا مقدار صحیح JAVA_HOME را به ما بدهید.

برای یافتن مسیر پیش فرض جاوا

readlink -f /usr/bin/java | sed “s:bin/java::”

 

Output

/usr/lib/jvm/java-11-openjdk-amd64/

می‌توانید این خروجی را برای تنظیم خانه جاوای Hadoop روی این نسخه خاص کپی کنید، که تضمین می‌کند اگر جاوا پیش‌فرض تغییر کند، این مقدار تغییر نخواهد کرد. همچنین، می‌توانید از دستور readlink به صورت پویا در فایل استفاده کنید تا Hadoop به‌طور خودکار از هر نسخه جاوا که به‌عنوان پیش‌فرض سیستم تنظیم شده است استفاده کند.

برای شروع، hadoop-env.sh را باز کنید:

sudo nano /usr/local/hadoop/etc/hadoop/hadoop-env.sh

سپس با انتخاب یکی از گزینه های زیر فایل را تغییر دهید:

گزینه 1: یک مقدار استاتیک تنظیم کنید

/usr/local/hadoop/etc/hadoop/hadoop-env.sh

 . . .
#export JAVA_HOME=
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
 . . .

گزینه 2: از Readlink برای تنظیم ارزش به صورت پویا استفاده کنید

/usr/local/hadoop/etc/hadoop/hadoop-env.sh

 . . .
#export JAVA_HOME=
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
 . . .

اگر در یافتن این خطوط مشکل دارید، از CTRL+W برای جستجوی سریع متن استفاده کنید. پس از اتمام کار، با CTRL+X خارج شوید و فایل خود را ذخیره کنید.

مرحله 4 – اجرای Hadoop

اکنون باید بتوانید Hadoop را اجرا کنید:

/usr/local/hadoop/bin/hadoop

 

Output

Usage: hadoop [OPTIONS] SUBCOMMAND [SUBCOMMAND OPTIONS]
 or    hadoop [OPTIONS] CLASSNAME [CLASSNAME OPTIONS]
  where CLASSNAME is a user-provided Java class

  OPTIONS is none or any of:

--config dir                     Hadoop config directory
--debug                          turn on shell script debug mode
--help                           usage information
buildpaths                       attempt to add class files from build tree
hostnames list[,of,host,names]   hosts to use in slave mode
hosts filename                   list of hosts to use in slave mode
loglevel level                   set the log4j level for this command
workers                          turn on worker mode

  SUBCOMMAND is one of:
. . .

این خروجی به این معنی است که Hadoop را با موفقیت پیکربندی کرده اید تا در حالت مستقل اجرا شود.

با اجرای نمونه برنامه MapReduce که با آن ارسال می شود، مطمئن خواهید شد که Hadoop به درستی کار می کند. برای انجام این کار، یک دایرکتوری به نام input در فهرست اصلی خود ایجاد کنید و فایل های پیکربندی Hadoop را در آن کپی کنید تا از آن فایل ها به عنوان داده استفاده کنید.

mkdir ~/input
cp /usr/local/hadoop/etc/hadoop/*.xml ~/input

در مرحله بعد، می توانید از دستور زیر برای اجرای برنامه MapReduce hadoop-mapreduce-examples، یک بایگانی جاوا با چندین گزینه استفاده کنید:

/usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar grep ~/input ~/grep_example ‘allowed[.]*’

این برنامه grep را فراخوانی می کند، یکی از نمونه های متعدد موجود در نمونه های hadoop-mapreduce، و به دنبال آن دایرکتوری ورودی، ورودی و دایرکتوری خروجی grep_example. برنامه MapReduce grep مطابقت های یک کلمه تحت اللفظی یا عبارت منظم را می شمارد. در نهایت، عبارت منظم allow[.]* برای یافتن رخدادهای کلمه مجاز در داخل یا در انتهای یک جمله اعلانی داده می شود. این عبارت به حروف کوچک و بزرگ حساس است، بنابراین اگر در ابتدای جمله با حروف بزرگ نوشته می شد، کلمه ای را پیدا نمی کنید.

هنگامی که کار تکمیل می شود، خلاصه ای از آنچه پردازش شده و خطاهایی که با آن مواجه شده است ارائه می دهد، اما این شامل نتایج واقعی نیست.

 

Output

 . . .
   File System Counters
        FILE: Number of bytes read=1200956
        FILE: Number of bytes written=3656025
        FILE: Number of read operations=0
        FILE: Number of large read operations=0
        FILE: Number of write operations=0
    Map-Reduce Framework
        Map input records=2
        Map output records=2
        Map output bytes=33
        Map output materialized bytes=43
        Input split bytes=114
        Combine input records=0
        Combine output records=0
        Reduce input groups=2
        Reduce shuffle bytes=43
        Reduce input records=2
        Reduce output records=2
        Spilled Records=4
        Shuffled Maps =1
        Failed Shuffles=0
        Merged Map outputs=1
        GC time elapsed (ms)=41
        Total committed heap usage (bytes)=403800064
    Shuffle Errors
        BAD_ID=0
        CONNECTION=0
        IO_ERROR=0
        WRONG_LENGTH=0
        WRONG_MAP=0
        WRONG_REDUCE=0
    File Input Format Counters
        Bytes Read=147
    File Output Format Counters
        Bytes Written=34

نتایج در دایرکتوری خروجی ذخیره می شوند و با اجرای cat در فهرست خروجی قابل بررسی هستند:

cat ~/grep_example/*

 

Output

22    allowed.
1    allowed

وظیفه MapReduce 19 مورد از کلمه مجاز را پیدا کرد و سپس یک نقطه و یک مورد در جایی که نبود. اجرای برنامه نمونه تأیید می کند که نصب مستقل ما به درستی کار می کند و کاربران غیرمجاز در سیستم می توانند Hadoop را برای کاوش یا اشکال زدایی اجرا کنند.

نتیجه

در این آموزش، Hadoop را در حالت مستقل نصب کرده اید و با اجرای یک برنامه نمونه ارائه شده آن را تأیید کرده اید.

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/ 

برچسب‌ها:VPS یا سرور مجازیاتصال به سرور مجازی لینوکساجرای Hadoopپیکربندی جاواخرید سرور مجازیخرید سرور مجازی آمریکاراه اندازی اولیه سرورنصب Hadoopنصب سرور اوبونتو 20.04

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از تاریخ و زمان در Go

ورود به سایت

معرفی

نرم افزار به گونه ای طراحی شده است که انجام کار را آسان تر می کند، و برای بسیاری از افراد، شامل تعامل با تاریخ و زمان می شود. مقادیر تاریخ و زمان در همه جا در نرم افزار مدرن نشان داده می شود. به عنوان مثال، پیگیری زمان نیاز خودرو به خدمات و اطلاع دادن به مالک، پیگیری تغییرات در پایگاه داده برای ایجاد گزارش حسابرسی، یا فقط مقایسه یک زمان با زمان دیگر برای تعیین مدت زمان طول کشیده یک فرآیند. بنابراین، بازیابی زمان جاری، دستکاری مقادیر زمان برای استخراج اطلاعات از آنها و نمایش آنها به کاربران در قالبی قابل فهم از ویژگی های ضروری یک برنامه کاربردی است.

در این آموزش، شما یک برنامه Go ایجاد می‌کنید تا زمان محلی فعلی رایانه خود را دریافت کنید، سپس آن را با فرمتی که برای مردم راحت‌تر خوانده شود، روی صفحه چاپ کنید. در مرحله بعد، رشته ای را برای استخراج اطلاعات تاریخ و زمان تفسیر می کنید. شما همچنین مقادیر تاریخ و زمان را بین دو منطقه زمانی ترجمه می‌کنید، همچنین مقادیر زمانی را برای تعیین فاصله بین دو زمان اضافه یا کم می‌کنید.

پیش نیازها

Go نسخه 1.16 یا بالاتر نصب شده است، که می توانید با دنبال کردن سری ما، نحوه نصب و راه اندازی یک محیط برنامه نویسی محلی برای Go، این کار را انجام دهید.

دریافت زمان فعلی

در این بخش، زمان فعلی را با استفاده از بسته زمانی Go دریافت خواهید کرد. بسته زمانی در کتابخانه استاندارد Go انواع توابع مربوط به تاریخ و زمان را ارائه می‌کند و می‌تواند برای نمایش یک نقطه خاص در زمان با استفاده از نوع time.Time استفاده شود. علاوه بر زمان و تاریخ، می‌تواند اطلاعاتی در مورد منطقه زمانی که تاریخ و زمان نمایش داده شده در آن قرار دارد نیز در خود جای دهد.

برای شروع ایجاد برنامه ای برای کاوش بسته زمانی، باید یک دایرکتوری برای فایل ها ایجاد کنید. این دایرکتوری را می توان در هر جایی که می خواهید در رایانه خود ایجاد کرد، اما بسیاری از توسعه دهندگان تمایل دارند برای پروژه های خود دایرکتوری داشته باشند. در این آموزش از دایرکتوری به نام پروژه ها استفاده می کنید.

دایرکتوری پروژه ها را بسازید و به آن بروید:

mkdir projects

cd projects

هنگامی که فهرست پروژه خود را ایجاد کردید، یک فایل main.go را با استفاده از nano یا ویرایشگر دلخواه خود باز کنید:

nano main.go

در فایل main.go، یک تابع اصلی اضافه کنید که زمان جاری را دریافت کرده و آن را چاپ می کند:

projects/datetime/main.go

package main

import (
	"fmt"
	"time"
)

func main() {
	currentTime := time.Now()
	fmt.Println("The time is", currentTime)
}

در این برنامه تابع time.Now از بسته زمان برای دریافت زمان محلی فعلی به عنوان مقدار time.Time استفاده می شود و سپس آن را در متغیر currentTime ذخیره می کند. هنگامی که در متغیر ذخیره شد، تابع fmt.Println، CurrentTime را با استفاده از فرمت خروجی رشته پیش فرض time.Time روی صفحه چاپ می کند.

برنامه را با استفاده از go run با فایل main.go اجرا کنید:

go run main.go

خروجی که تاریخ و زمان فعلی شما را نشان می دهد مشابه این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT m=+0.000066626

خروجی تاریخ و زمان فعلی شما را نشان می دهد که با مثال متفاوت است. علاوه بر این، منطقه زمانی که مشاهده می کنید (-0500 CDT در این خروجی) احتمالاً متفاوت خواهد بود، زیرا time.Now() زمان را در منطقه زمانی محلی برمی گرداند.

همچنین ممکن است متوجه یک مقدار m= در خروجی خود شوید. این مقدار ساعت یکنواخت است و به صورت داخلی توسط Go هنگام اندازه گیری تفاوت در زمان استفاده می شود. ساعت یکنواخت برای جبران هرگونه تغییر احتمالی در تاریخ و زمان ساعت سیستم کامپیوتر در حین اجرای برنامه طراحی شده است. با استفاده از ساعت یکنواخت، یک مقدار time.Now در مقایسه با زمان. اکنون مقدار پنج دقیقه بعد همچنان به نتیجه صحیح ختم می شود (فاصله پنج دقیقه)، حتی اگر ساعت سیستم برای رایانه یک ساعت به جلو تغییر کند. یا در طی آن فاصله پنج دقیقه ای به عقب برگردید. برای کد یا مثال‌های موجود در این آموزش، نیازی به درک کامل آن ندارید، اما اگر می‌خواهید درباره ساعت‌های یکنواخت و نحوه استفاده Go از آن‌ها بیشتر بدانید، بخش ساعت‌های یکنواخت در مستندات بسته زمانی جزئیات بیشتری را ارائه می‌دهد.

اکنون، در حالی که زمان فعلی نمایش داده شده است، ممکن است برای کاربران مفید نباشد. ممکن است فرمت مورد نظر شما نباشد، یا ممکن است قسمت‌های بیشتری از تاریخ یا ساعت را شامل شود که می‌خواهید نمایش دهید.

خوشبختانه، نوع time.Time شامل روش های مختلفی برای به دست آوردن قسمت های خاصی از تاریخ یا ساعت مورد نظر شما است. به عنوان مثال، اگر فقط می‌خواهید بخش سال متغیر currentTime را بدانید، می‌توانید از روش Year استفاده کنید یا ساعت جاری را با استفاده از روش Hour دریافت کنید.

فایل main.go خود را دوباره باز کنید و چند روش time.Time را به خروجی خود اضافه کنید تا ببینید چه چیزی تولید می کنند:

projects/datetime/main.go

...

func main() {
	currentTime := time.Now()
	fmt.Println("The time is", currentTime)
	
	fmt.Println("The year is", currentTime.Year())
	fmt.Println("The month is", currentTime.Month())
	fmt.Println("The day is", currentTime.Day())
	fmt.Println("The hour is", currentTime.Hour())
	fmt.Println("The minute is", currentTime.Hour())
	fmt.Println("The second is", currentTime.Second())
}

سپس با استفاده از go run دوباره برنامه خود را اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT m=+0.000066626
The year is 2021
The month is August
The day is 15
The hour is 14
The minute is 14
The second is 45

مانند خروجی قبلی، تاریخ و زمان فعلی شما با مثال متفاوت خواهد بود، اما قالب باید مشابه باشد. این بار در خروجی، تاریخ و زمان کامل را مانند قبل می بینید، اما فهرستی از سال، ماه، روز ماه، ساعت، دقیقه و ثانیه نیز دارید. توجه داشته باشید که به جای چاپ ماه به عنوان یک عدد (مانند تاریخ کامل)، به عنوان رشته انگلیسی اوت ظاهر می شود. این به این دلیل است که روش Month ماه را به‌عنوان یک زمان برمی‌گرداند. نوع ماه به‌جای یک عدد، و آن نوع برای چاپ نام کامل انگلیسی زمانی که به صورت رشته‌ای چاپ می‌شود طراحی شده است.

اکنون، فایل main.go را دوباره در برنامه خود به‌روزرسانی کنید و خروجی‌های تابع مختلف را با یک فراخوانی تابع به fmt.Printf جایگزین کنید، بنابراین می‌توانید تاریخ و زمان فعلی را در قالبی نزدیک‌تر به آنچه می‌خواهید نمایش دهید چاپ کنید. یک کاربر:

projects/datetime/main.go

...

func main() {
	currentTime := time.Now()
	fmt.Println("The time is", currentTime)
	
	fmt.Printf("%d-%d-%d %d:%d:%d\n",
		currentTime.Year(),
		currentTime.Month(),
		currentTime.Day(),
		currentTime.Hour(),
		currentTime.Hour(),
		currentTime.Second())
}

هنگامی که به روز رسانی های خود را در فایل main.go ذخیره کردید، آن را با استفاده از دستور go run مانند قبل اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT m=+0.000066626
2021-8-15 14:14:45

این بار ممکن است خروجی شما به چیزی که می‌خواهید نزدیک‌تر باشد، اما هنوز چند چیز وجود دارد که می‌توان در مورد خروجی اصلاح کرد. ماه اکنون دوباره در قالب عددی نمایش داده می‌شود، زیرا قالب fmt.Printf از %d برای نشان دادن زمان استفاده می‌کند. نوع ماه باید از یک عدد استفاده کند نه رشته، اما فقط به صورت تک رقمی نشان داده می‌شود. اگر می‌خواهید دو رقم نمایش داده شود، می‌توانید فرمت fmt.Printf را برای گفتن آن تغییر دهید، اما اگر بخواهید به جای زمان ۲۴ ساعته همانطور که در خروجی بالا نشان داده شده است، یک زمان ۱۲ ساعته را نیز نشان دهید، چطور؟ با استفاده از روش fmt.Printf، شما باید برای محاسبه آن، ریاضی خود را انجام دهید. چاپ تاریخ و زمان با استفاده از fmt.Printf امکان پذیر است، اما همانطور که می بینید، در نهایت می تواند دست و پا گیر شود. با انجام این کار، می‌توانید برای هر قسمتی که می‌خواهید نمایش دهید تعداد زیادی خط داشته باشید، یا باید تعدادی از محاسبات خود را برای تعیین اینکه چه چیزی را نمایش دهید انجام دهید.

در این قسمت برنامه جدیدی برای دریافت زمان فعلی با استفاده از time.Now ایجاد کردید. هنگامی که زمان فعلی را داشتید، سپس از عملکردهای مختلفی مانند سال و ساعت در زمان. نوع زمان برای چاپ اطلاعات مربوط به زمان فعلی استفاده کردید. با این حال، نمایش آن در یک قالب سفارشی شروع به کار زیادی کرد. برای آسان‌تر کردن این نوع کار رایج، بسیاری از زبان‌های برنامه‌نویسی، از جمله Go، روش خاصی را برای قالب‌بندی تاریخ‌ها و زمان‌ها ارائه می‌کنند، مشابه روشی که fmt.Printf می‌تواند برای قالب‌بندی یک رشته استفاده شود.

چاپ و قالب بندی تاریخ های خاص

علاوه بر سال، ساعت و سایر روش‌های مرتبط با داده که نوع time.Time ارائه می‌کند، روشی به نام Format را نیز ارائه می‌کند. متد Format به شما امکان می‌دهد یک رشته طرح‌بندی، شبیه به فرمت fmt.Printf یا fmt.Sprintf ارائه دهید، که به روش Format می‌گوید که چگونه می‌خواهید تاریخ و زمان چاپ شود. در این بخش، خروجی زمانی را که در بخش گذشته اضافه کرده‌اید، تکرار می‌کنید، اما به روشی بسیار مختصرتر با استفاده از روش Format.

با این حال، قبل از استفاده از روش Format، اگر هر بار که برنامه را اجرا می‌کنید تغییری نمی‌کند، بهتر است ببینید که چگونه Format بر خروجی یک تاریخ و زمان تأثیر می‌گذارد. تا به حال، شما زمان فعلی را با استفاده از زمان دریافت می‌کردید. اکنون، بنابراین هر بار که آن را اجرا می‌کردید، عدد متفاوتی نشان داده می‌شد. بسته Go time یک تابع مفید دیگر را ارائه می دهد، تابع time.Date، که به شما امکان می دهد تاریخ و زمان خاصی را برای نمایش زمان تعیین کنید.

برای شروع استفاده از time.Date به جای time.Now در برنامه خود، فایل main.go را دوباره باز کنید و آن را به روز کنید تا جایگزین time.Now با time.Date شود:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local)
	fmt.Println("The time is", theTime)
}

پارامترهای تابع time.Date شامل سال، ماه، روز ماه، ساعت، دقیقه و ثانیه از تاریخ و زمانی است که می‌خواهید زمان. زمان برای آن تعیین کنید. اولین پارامتر از دو پارامتر آخر برای نانوثانیه ها محاسبه می شود و آخرین پارامتر منطقه زمانی برای ایجاد زمان است. استفاده از مناطق زمانی خود بعداً در این آموزش پوشش داده شده است.

پس از ذخیره به روز رسانی ها، برنامه خود را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT

خروجی‌ای که می‌بینید اکنون باید به خروجی بالا نزدیک‌تر باشد، زیرا هنگام اجرای برنامه از تاریخ و زمان محلی خاصی به جای تاریخ فعلی استفاده می‌کنید. (بسته به منطقه زمانی که رایانه شما روی آن تنظیم شده است، منطقه زمانی ممکن است متفاوت نشان داده شود.) فرمت خروجی همچنان شبیه آنچه قبلا دیده اید به نظر می رسد زیرا هنوز از فرمت زمان پیش فرض استفاده می کند. اکنون که یک تاریخ و زمان استاندارد برای کار با آن دارید، می توانید از آن برای شروع به تغییر نحوه قالب بندی زمان هنگام نمایش با استفاده از روش Format استفاده کنید.

سفارشی کردن رشته های تاریخ با استفاده از روش قالب

بسیاری از زبان‌های برنامه‌نویسی دیگر روشی مشابه برای قالب‌بندی تاریخ‌ها و زمان‌ها برای نمایش دارند، اما روشی که Go طرح‌بندی آن فرمت‌ها را می‌سازد ممکن است کمی متفاوت از آنچه شما به آن عادت کرده‌اید، باشد، اگر از آن‌ها در زبان‌های دیگر استفاده کرده باشید. در زبان‌های دیگر، قالب‌بندی تاریخ از سبکی مشابه نحوه عملکرد Printf در Go استفاده می‌کند، با یک کاراکتر % و به دنبال آن یک حرف نشان‌دهنده بخشی از تاریخ یا زمان برای درج. به عنوان مثال، یک سال 4 رقمی ممکن است با %Y نشان داده شود. اما در Go، این بخش‌های تاریخ یا زمان با کاراکترهایی نشان داده می‌شوند که تاریخ خاصی را نشان می‌دهند. برای گنجاندن یک سال 4 رقمی در قالب تاریخ Go، در واقع باید سال 2006 را در خود رشته قرار دهید. مزیت این نوع چیدمان این است که آنچه در کد می بینید در واقع نشان دهنده چیزی است که در خروجی خواهید دید. وقتی بتوانید نمایشی از خروجی خود را مشاهده کنید، بررسی مجدد اینکه قالب شما با آنچه به دنبال آن هستید مطابقت دارد آسان تر می شود و همچنین درک خروجی برنامه را برای سایر توسعه دهندگان بدون اجرای برنامه آسان تر می کند. اول برنامه

تاریخ خاصی که Go برای طرح‌بندی تاریخ و زمان در قالب‌بندی رشته استفاده می‌کند، 01/02 03:04:05 06 -0700 است. اگر به هر جزء تاریخ و زمان نگاه کنید، خواهید دید که برای هر قسمت یک عدد افزایش می یابد. ماه اول در 01 می آید، پس از آن روز ماه در 02، سپس ساعت در 03، دقیقه در 04، دوم در 05، سال در 06 (یا 2006) و، در نهایت، منطقه زمانی در 07. به خاطر سپردن این ترتیب، ایجاد قالب‌های تاریخ و زمان را در آینده آسان‌تر می‌کند. نمونه‌هایی از گزینه‌های موجود برای قالب‌بندی را نیز می‌توانید در اسناد بسته زمانی Go پیدا کنید.

اکنون، از این روش جدید Format برای تکرار و پاکسازی قالب تاریخی که در بخش آخر چاپ کرده اید استفاده کنید. برای نمایش به چندین خط و فراخوانی تابع نیاز داشت و استفاده از روش Format باید کپی کردن آن را بسیار ساده تر و تمیزتر کند.

فایل main.go را باز کنید و یک تماس جدید fmt.Println اضافه کنید و آن را با تاریخ فرمت شده با استفاده از روش Format به Time ارسال کنید:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local)
	fmt.Println("The time is", theTime)

	fmt.Println(theTime.Format("2006-1-2 15:4:5"))
}

اگر به طرح مورد استفاده برای قالب نگاه کنید، خواهید دید که از همان زمان از بالا برای تعیین نحوه قالب بندی تاریخ و زمان استفاده می کند (2 ژانویه 2006). نکته ای که باید به آن توجه کرد این است که ساعت به جای 03 مانند مثال قبلی از 15 استفاده می کند. این نشان می دهد که شما می خواهید ساعت به جای 12 ساعت در قالب 24 ساعته نمایش داده شود.

برای دیدن خروجی از این فرمت جدید، برنامه خود را ذخیره کرده و با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT
2021-8-15 14:30:45

خروجی ای که اکنون می بینید مشابه خروجی انتهای بخش قبلی خواهد بود، اما انجام آن بسیار ساده تر بود. تنها چیزی که نیاز داشتید یک خط کد و یک رشته طرح بندی بود. تابع Format بقیه کارها را برای شما انجام می دهد.

بسته به تاریخ یا زمانی که نمایش می‌دهید، استفاده از قالبی با طول متغیر مانند فرمتی که هنگام چاپ مستقیم اعداد با آن به پایان رسید، ممکن است برای خود، کاربران یا سایر کدهایی که سعی در خواندن مقدار دارند، خواندن آن دشوار باشد. استفاده از 1 برای قالب ماه باعث می شود که مارس به صورت 3 نمایش داده شود، در حالی که اکتبر از دو کاراکتر استفاده می کند و به صورت 10 نشان داده می شود. اکنون main.go را باز کنید و با طرح بندی ساختارمندتر، یک خط اضافی به برنامه خود اضافه کنید. در این چیدمان، یک پیشوند 0 روی کامپوننت ها قرار دهید و ساعت را برای استفاده از قالب 12 ساعته به روز کنید:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local)
	fmt.Println("The time is", theTime)

	fmt.Println(theTime.Format("2006-1-2 15:4:5"))
	fmt.Println(theTime.Format("2006-01-02 03:04:05 pm"))
}

پس از ذخیره کد خود، دوباره برنامه را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT
2021-8-15 14:30:45
2021-08-15 02:30:45 pm

خواهید دید که با افزودن یک پیشوند 0 به اعداد در رشته طرح بندی، 8 ماه در خروجی جدید به 08 تبدیل می شود تا با چیدمان مطابقت داشته باشد. ساعت که اکنون در قالب 12 ساعته است، پیشوند 0 خود را نیز دارد. با این حال، در پایان، آنچه در خروجی مشاهده می کنید، فرمتی را که در کد می بینید منعکس می کند، بنابراین در صورت نیاز، تغییر قالب آسان تر است.

بسیاری از اوقات، تاریخ‌های قالب‌بندی شده برای تفسیر برنامه‌های دیگر در نظر گرفته شده‌اند، و هر بار که می‌خواهید از آن‌ها استفاده کنید، ایجاد مجدد آن فرمت‌ها می‌تواند بار سنگینی باشد. در برخی موارد، می توانید از یک قالب از پیش تعریف شده استفاده کنید.

با استفاده از فرمت از پیش تعریف شده

بسیاری از قالب‌های تاریخ معمولاً مورد استفاده قرار می‌گیرند، مانند مهرهای زمانی برای پیام‌های گزارش، و ایجاد مجدد آن‌ها هر بار که می‌خواهید از آن‌ها استفاده کنید، ممکن است دردسرساز شود. برای برخی از این موارد، بسته زمانی شامل فرمت های از پیش تعریف شده ای است که می توانید استفاده کنید.

یکی از قالب‌های موجود و اغلب مورد استفاده، فرمت تعریف‌شده در RFC 3339 است. RFC سندی است که برای تعریف نحوه عملکرد استانداردها در اینترنت استفاده می‌شود و RFC‌های دیگر می‌توانند بر روی یکدیگر ایجاد کنند. یک RFC وجود دارد که نحوه عملکرد HTTP را تعریف می کند (RFC 2616)، برای مثال، و دیگرانی که در بالای آن برای تعریف بیشتر HTTP ساخته می شوند. بنابراین، در مورد RFC 3339، RFC یک قالب استاندارد برای استفاده برای مهرهای زمانی در اینترنت تعریف می‌کند. این قالب در سراسر اینترنت شناخته شده و به خوبی پشتیبانی می شود، بنابراین شانس دیدن آن در جای دیگر زیاد است.

هر یک از قالب‌های زمانی از پیش تعریف‌شده در بسته زمانی با یک رشته const به نام قالبی که نشان می‌دهند نشان داده می‌شوند. فرمت RFC 3339 دو فرمت در دسترس دارد، یکی به نام time.RFC3339 و دیگری به نام time.RFC3339Nano. تفاوت فرمت ها در این است که نسخه time.RFC3339Nano شامل نانوثانیه در فرمت است.

اکنون فایل main.go خود را دوباره باز کنید و برنامه خود را به روز کنید تا از فرمت time.RFC3339Nano برای خروجی آن استفاده کنید:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local)
	fmt.Println("The time is", theTime)
	
	fmt.Println(theTime.Format(time.RFC3339Nano))
}

از آنجایی که قالب‌های از پیش تعریف‌شده مقادیر رشته‌ای با قالب مورد نظر هستند، فقط باید قالبی را که معمولاً استفاده می‌کنید با یکی از آنها جایگزین کنید.

برای دیدن خروجی، برنامه خود را با go run دوباره اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT
2021-08-15T14:30:45.0000001-05:00

اگر بخواهید مقدار زمانی را به عنوان رشته در جایی ذخیره کنید، از فرمت RFC 3339 استفاده می شود. این می تواند توسط بسیاری از زبان های برنامه نویسی و برنامه های کاربردی دیگر خوانده شود، و به همان اندازه فشرده است که تاریخ و زمان می تواند در قالب رشته ای انعطاف پذیر باشد.

در این بخش، برنامه خود را به روز کردید تا از روش Format برای چاپ تاریخ و زمان استفاده کنید. استفاده از این طرح‌بندی انعطاف‌پذیر به کد شما اجازه می‌دهد شبیه به خروجی نهایی باشد. در نهایت، شما از یکی از رشته های چیدمان از پیش تعریف شده برای چاپ تاریخ و زمان با استفاده از قالبی که به خوبی پشتیبانی می شود استفاده کردید. در بخش بعدی، برنامه خود را به‌روزرسانی می‌کنید تا همان مقدار رشته را به یک مقدار time.Time تبدیل کنید که می‌توانید با آن کار کنید.

تجزیه تاریخ و زمان در رشته ها

اغلب هنگام توسعه برنامه‌ها، با تاریخ‌هایی مواجه می‌شوید که به‌عنوان مقادیر رشته‌ای نشان داده می‌شوند که باید به نحوی آن‌ها را تفسیر کنید. گاهی اوقات، شما باید قسمت تاریخ مقدار را بدانید، گاهی اوقات ممکن است نیاز به دانستن بخش زمانی داشته باشید، و برخی دیگر ممکن است به کل مقدار نیاز داشته باشید. بسته Go time علاوه بر استفاده از روش Format برای ایجاد مقادیر رشته ای از مقادیر time.Time، تابع time.Parse را برای تبدیل یک رشته به مقدار time.Time ارائه می دهد. تابع time.Parse شبیه به روش Format عمل می کند، به این صورت که طرح تاریخ و زمان مورد انتظار و همچنین مقدار رشته را به عنوان پارامتر می گیرد.

اکنون فایل main.go را در برنامه خود باز کنید و آن را به روز کنید تا از تابع time.Parse برای تجزیه یک timeString به متغیر time.Time استفاده کنید:

projects/datetime/main.go

...

func main() {
	timeString := "2021-08-15 02:30:45"
	theTime, err := time.Parse("2006-01-02 03:04:05", timeString)
	if err != nil {
		fmt.Println("Could not parse time:", err)
	}
	fmt.Println("The time is", theTime)
	
	fmt.Println(theTime.Format(time.RFC3339Nano))
}

برخلاف روش Format، متد time.Parse همچنین در صورتی که مقدار رشته ارسال شده با طرح ارائه شده به عنوان پارامتر اول مطابقت نداشته باشد، مقدار خطای احتمالی را برمی گرداند. اگر به چیدمان استفاده شده نگاه کنید، می بینید که چیدمان داده شده به time.Parse از همان 1 برای ماه، 2 برای روز ماه و غیره استفاده می کند که در متد Format استفاده می شود.

پس از ذخیره به روز رسانی های خود، می توانید برنامه به روز شده خود را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 02:30:45 +0000 UTC
2021-08-15T02:30:45Z

در این خروجی باید به چند نکته توجه کرد. یکی این که منطقه زمانی که از timeString تجزیه می‌شود از منطقه زمانی پیش‌فرض استفاده می‌کند که یک افست +0 است و به عنوان زمان جهانی هماهنگ (UTC) شناخته می‌شود. از آنجایی که نه مقدار زمان و نه چیدمان شامل منطقه زمانی نمی شود، تابع time.Parse نمی داند که با کدام منطقه زمانی مرتبط شود. اگر زمانی به آن نیاز داشتید، بسته زمانی شامل یک تابع time.ParseInLocation می‌شود تا بتوانید مکان مورد استفاده را ارائه دهید. بخش دیگری که باید به آن توجه کرد در خروجی RFC 3339 است. خروجی از طرح‌بندی نانو RFC3339 استفاده می‌کند، اما خروجی شامل هیچ نانوثانیه‌ای نمی‌شود. این به این دلیل است که تابع time.Parse هیچ نانوثانیه‌ای را تجزیه نمی‌کند، بنابراین مقدار روی پیش‌فرض 0 تنظیم می‌شود. وقتی نانوثانیه‌ها 0 هستند، فرمت time.RFC3339Nano شامل نانوثانیه‌ها در خروجی نمی‌شود.

متد time.Parse همچنین می‌تواند از هر یک از طرح‌بندی‌های زمانی از پیش تعریف‌شده ارائه شده در بسته زمان هنگام تجزیه یک مقدار رشته استفاده کند. برای مشاهده این موضوع در عمل، فایل main.go خود را باز کنید و مقدار timeString را به روز کنید تا با خروجی time.RFC3339Nano قبل از آن مطابقت داشته باشد و پارامتر time.Parse را برای مطابقت به روز کنید:

projects/datetime/main.go

...

func main() {
	timeString := "2021-08-15T14:30:45.0000001-05:00"
	theTime, err := time.Parse(time.RFC3339Nano, timeString)
	if err != nil {
		fmt.Println("Could not parse time:", err)
	}
	fmt.Println("The time is", theTime)
	
	fmt.Println(theTime.Format(time.RFC3339Nano))
}

هنگامی که کد را به روز کردید، می توانید برنامه خود را ذخیره کرده و با استفاده از go run دوباره اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT
2021-08-15T14:30:45.0000001-05:00

این بار، خروجی از روش Format نشان می دهد که time.Parse توانست هم منطقه زمانی و هم نانوثانیه های timeString را تجزیه کند.

در این بخش، از تابع time.Parse برای تجزیه یک مقدار رشته تاریخ و زمان فرمت شده دلخواه و همچنین یک طرح از پیش تعریف شده استفاده کردید. با این حال، تا کنون، با مناطق زمانی مختلفی که دیده‌اید تعاملی نداشته‌اید. مجموعه دیگری از ویژگی‌هایی که Go برای زمان ارائه می‌کند. نوع زمان، امکان تبدیل بین مناطق زمانی مختلف است، همانطور که در بخش بعدی خواهید دید.

کار با مناطق زمانی

هنگام توسعه یک برنامه با کاربران در سراسر جهان، یا حتی در چند منطقه زمانی، یک روش معمول این است که تاریخ ها و زمان ها را با استفاده از زمان جهانی هماهنگ (UTC) ذخیره کنید و سپس در صورت لزوم به زمان محلی کاربر تبدیل کنید. این اجازه می دهد تا داده ها در یک فرمت ثابت ذخیره شوند و محاسبات بین آنها را آسان تر می کند، زیرا تبدیل تنها زمانی لازم است که تاریخ و زمان را به کاربر نمایش دهد.

در بخش‌های قبلی این آموزش، برنامه‌ای ایجاد کردید که عمدتاً بر اساس زمان‌های منطقه زمانی محلی شما کار می‌کرد. برای صرفه جویی در زمان خود. مقادیر زمان به عنوان UTC، ابتدا باید آنها را به UTC تبدیل کنید. شما این کار را با استفاده از روش UTC انجام خواهید داد، که یک کپی از زمانی که آن را فراخوانی می کنید، اما در UTC را برمی گرداند.

اکنون، فایل main.go خود را باز کنید تا برنامه خود را به روز کنید تا از روش UTC در theTime برای برگرداندن نسخه UTC زمان استفاده کنید:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local)
	fmt.Println("The time is", theTime)
	fmt.Println(theTime.Format(time.RFC3339Nano))
	
	utcTime := theTime.UTC()
	fmt.Println("The UTC time is", utcTime)
	fmt.Println(utcTime.Format(time.RFC3339Nano))
}

این بار برنامه شما theTime را به‌عنوان زمان. مقدار زمان در منطقه زمانی محلی شما ایجاد می‌کند، آن را در دو قالب مختلف چاپ می‌کند، سپس از روش UTC برای ترجمه آن زمان از زمان محلی شما به زمان UTC استفاده می‌کند.

برای دیدن خروجی برنامه، می توانید آن را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT
2021-08-15T14:30:45.0000001-05:00
The UTC time is 2021-08-15 19:30:45.0000001 +0000 UTC
2021-08-15T19:30:45.0000001Z

خروجی شما بسته به منطقه زمانی محلی شما متفاوت خواهد بود، اما در خروجی بالا، خواهید دید که اولین باری که چاپ می شود در CDT (زمان نوری مرکزی آمریکای شمالی) است که 5- ساعت از UTC فاصله دارد. هنگامی که متد UTC فراخوانی شد و زمان UTC چاپ شد، می توانید ببینید که ساعت در زمان از 14 به 19 می رسد، زیرا تبدیل زمان به UTC پنج ساعت اضافه می کند.

همچنین می‌توان یک زمان UTC را به زمان محلی با استفاده از روش محلی در یک زمان. زمان به همان روش تبدیل کرد. فایل main.go خود را دوباره باز کنید و آن را به روز کنید تا یک تماس به روش محلی در utcTime اضافه کنید تا آن را به منطقه زمانی محلی خود تبدیل کنید:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local)
	fmt.Println("The time is", theTime)
	fmt.Println(theTime.Format(time.RFC3339Nano))
	
	utcTime := theTime.UTC()
	fmt.Println("The UTC time is", utcTime)
	fmt.Println(utcTime.Format(time.RFC3339Nano))

	localTime := utcTime.Local()
	fmt.Println("The Local time is", localTime)
	fmt.Println(localTime.Format(time.RFC3339Nano))
}

هنگامی که فایل شما ذخیره شد، برنامه خود را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT
2021-08-15T14:30:45.0000001-05:00
The UTC time is 2021-08-15 19:30:45.0000001 +0000 UTC
2021-08-15T19:30:45.0000001Z
The Local time is 2021-08-15 14:30:45.0000001 -0500 CDT
2021-08-15T14:30:45.0000001-05:00

خواهید دید که زمان UTC دوباره به منطقه زمانی محلی شما تبدیل شده است. در خروجی بالا، تبدیل UTC به CDT به این معنی است که پنج ساعت از UTC کم شده است و ساعت را از 19 به 14 تغییر می دهد.

در این بخش، شما برنامه خود را برای تبدیل تاریخ و زمان بین منطقه زمانی محلی خود و منطقه زمانی استاندارد UTC با استفاده از روش UTC به روز کردید، سپس دوباره با استفاده از روش محلی برگشتید.

هنگامی که مقادیر تاریخ و زمان خود را در دسترس قرار دادید، تعدادی ویژگی اضافی وجود دارد که بسته Go time ارائه می دهد که می تواند در برنامه های شما مفید باشد. یکی از این ویژگی ها تعیین این است که آیا زمان معین قبل یا بعد از دیگری است.

مقایسه دو بار

مقایسه دو تاریخ با یکدیگر، به دلیل همه متغیرهایی که باید در هنگام مقایسه آنها در نظر گرفته شوند، گاهی اوقات به طرز فریبنده ای دشوار است. به عنوان مثال، نیاز به در نظر گرفتن مناطق زمانی، یا این واقعیت که ماه ها تعداد روزهای متفاوتی از یکدیگر دارند. بسته زمان چند روش را برای آسان تر کردن این کار ارائه می دهد.

بسته زمان دو روش برای آسان‌تر کردن این مقایسه‌ها ارائه می‌کند: روش‌های قبل و بعد، که در نوع time.Time در دسترس هستند. این روش‌ها هر دو یک مقدار زمانی واحد را می‌پذیرند و بسته به اینکه زمانی که فراخوانی می‌شوند قبل یا بعد از زمان ارائه شده باشد، true یا false را برمی‌گردانند.

برای مشاهده نمونه ای از این توابع در عمل، فایل main.go خود را باز کنید و آن را به روز کنید تا شامل دو تاریخ مختلف باشد، سپس از قبل و بعد برای مقایسه آن تاریخ ها برای دیدن خروجی استفاده کنید:

projects/datetime/main.go

...

func main() {
	firstTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.UTC)
	fmt.Println("The first time is", firstTime)

	secondTime := time.Date(2021, 12, 25, 16, 40, 55, 200, time.UTC)
	fmt.Println("The second time is", secondTime)

	fmt.Println("First time before second?", firstTime.Before(secondTime))
	fmt.Println("First time after second?", firstTime.After(secondTime))

	fmt.Println("Second time before first?", secondTime.Before(firstTime))
	fmt.Println("Second time after first?", secondTime.After(firstTime))
}

هنگامی که فایل خود را به روز کردید، آن را ذخیره کرده و با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The first time is 2021-08-15 14:30:45.0000001 +0000 UTC
The second time is 2021-12-25 16:40:55.0000002 +0000 UTC
First time before second? true
First time after second? false
Second time before first? false
Second time after first? true

از آنجایی که کد از تاریخ های صریح در منطقه زمانی UTC استفاده می کند، خروجی شما باید با خروجی بالا مطابقت داشته باشد. خواهید دید که هنگام استفاده از روش Before در firstTime و ارائه آن secondTime برای مقایسه، این درست است که 2021-08-15 قبل از 2021-12-25 است. هنگام استفاده از روش After از firstTime و ارائه secondTime، اشتباه است که 2021-08-15 بعد از 2021-12-25 باشد. تغییر ترتیب فراخوانی متدها در secondTime، همانطور که انتظار می رود، نتایج مخالف را نشان می دهد.

روش دیگر برای مقایسه دو تاریخ و زمان با بسته زمانی، روش Sub است. متد Sub یک تاریخ را از تاریخ دیگر کم می کند و با استفاده از نوع جدیدی به نام time.Duration مقداری را برمی گرداند. بر خلاف یک مقدار time.Time، که یک نقطه مطلق در زمان را نشان می دهد، یک مقدار time.Duration نشان دهنده تفاوت در زمان است. به عنوان مثال، “در یک ساعت” مدت زمان خواهد بود زیرا به معنای چیزی متفاوت بر اساس زمان فعلی روز است، اما “در ظهر” یک زمان خاص و مطلق را نشان می دهد. Go از زمان استفاده می‌کند. نوع مدت زمان در تعدادی مکان، مانند زمانی که می‌خواهید مشخص کنید که یک تابع چه مدت باید قبل از بازگشت خطا منتظر بماند یا در اینجا، جایی که باید بدانید بین یک زمان و زمان دیگر چقدر زمان وجود دارد، استفاده می‌کند.

اکنون فایل main.go خود را به روز کنید تا از روش Sub در مقادیر firstTime و secondTime استفاده کنید و نتایج را چاپ کنید:

projects/datetime/main.go

...

func main() {
	firstTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.UTC)
	fmt.Println("The first time is", firstTime)

	secondTime := time.Date(2021, 12, 25, 16, 40, 55, 200, time.UTC)
	fmt.Println("The second time is", secondTime)

	fmt.Println("Duration between first and second time is", firstTime.Sub(secondTime))
	fmt.Println("Duration between second and first time is", secondTime.Sub(firstTime))

فایل خود را ذخیره کنید و سپس با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The first time is 2021-08-15 14:30:45.0000001 +0000 UTC
The second time is 2021-12-25 16:40:55.0000002 +0000 UTC
Duration between first and second time is -3170h10m10.0000001s
Duration between second and first time is 3170h10m10.0000001s

خروجی بالا می گوید 3170 ساعت، 10 دقیقه، 10 ثانیه و 100 نانوثانیه بین این دو تاریخ وجود دارد و چند نکته در مورد خروجی وجود دارد. اولین مورد این است که مدت زمان بین بار اول و دوم یک مقدار منفی است. این می‌گوید که زمان دوم بعد از زمان اول است و شبیه به زمانی خواهد بود که 5 را از 0 کم کنید و 5- را دریافت کنید. دومین موردی که باید به آن توجه کرد این است که بزرگترین واحد اندازه گیری مدت زمان یک ساعت است، بنابراین آن را به روز یا ماه تقسیم نمی کند. از آنجایی که تعداد روزهای یک ماه یکسان نیست و یک “روز” می تواند در طول سوئیچ برای ساعت تابستانی معنای متفاوتی داشته باشد، یک ساعت دقیق ترین اندازه گیری است که نوسان ندارد.

در این بخش، برنامه خود را برای مقایسه دو بار با استفاده از سه روش مختلف به روز کردید. ابتدا از روش های قبل و بعد برای تعیین اینکه یک زمان قبل یا بعد از زمان دیگری است استفاده کردید، سپس از Sub استفاده کردید تا ببینید بین دو بار چقدر است. دریافت مدت زمان بین دو زمان تنها راهی نیست که بسته زمانی از زمان استفاده می‌کند، اما مدت زمان. همچنین می‌توانید از آن برای افزودن یا حذف زمان از مقدار زمان استفاده کنید، همانطور که در بخش بعدی خواهید دید.

اضافه یا تفریق زمان

هنگام نوشتن یک برنامه، یک عملیات رایج با استفاده از تاریخ و زمان، تعیین زمان گذشته یا آینده بر اساس زمان دیگر است. می‌توان از آن برای عملکرد استفاده کرد، مانند تعیین زمان تمدید اشتراک بعدی، یا اینکه مدت زمان مشخصی از بررسی مقداری گذشته است. در هر صورت، بسته Go time راهی برای مدیریت آن ارائه می دهد. برای پیدا کردن تاریخ دیگری بر اساس تاریخی که قبلاً می‌دانید، باید بتوانید زمان خود را تعیین کنید. مقادیر مدت زمان.

ایجاد یک مقدار time.Duration شبیه نحوه نوشتن مدت زمان روی کاغذ است، فقط با ضرب واحد زمان. به عنوان مثال، برای ایجاد زمان. مدت زمان برای نشان دادن یک ساعت، باید آن را با استفاده از مقدار time.Hour ضرب در تعداد ساعت‌هایی که می‌خواهید زمان را نشان دهید، تعریف کنید.

oneHour := 1 * time.Hour
twoHours := 2 * time.Hour
tenHours := 10 * time.Hour

اعلان واحدهای زمانی کوچکتر به روشی مشابه انجام می شود، به جز استفاده از time.minute، time.second و غیره:

tenMinutes := 10 * time.Minute
fiveSeconds := 5 * time.Second

همچنین می توان یک مدت زمان را به مدت زمان دیگر اضافه کرد تا مجموع مدت زمان ها بدست آید. برای اینکه این را در عمل ببینید، فایل main.go خود را باز کنید و آن را به روز کنید تا یک متغیر toAdd duration را اعلام کنید و مدت زمان های مختلف را به آن اضافه کنید:

projects/datetime/main.go

...

func main() {
	toAdd := 1 * time.Hour
	fmt.Println("1:", toAdd)

	toAdd += 1 * time.Minute
	fmt.Println("2:", toAdd)

	toAdd += 1 * time.Second
	fmt.Println("3:", toAdd)
}

پس از اتمام به روز رسانی، فایل را ذخیره کنید و برنامه خود را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

1: 1h0m0s
2: 1h1m0s
3: 1h1m1s

هنگامی که به خروجی نگاه می کنید، خواهید دید که اولین مدت چاپ یک ساعت است که مطابق با زمان 1 * ساعت در کد شما است. در مرحله بعد، 1 * time.Minute را به مقدار toAdd اضافه کردید، که به عنوان مقدار یک ساعت، یک دقیقه نشان داده می شود. در نهایت، 1 * time.Second را به toAdd اضافه کردید، که منجر به مقدار زمان. مدت زمان یک ساعت، یک دقیقه و یک ثانیه شد.

همچنین می توان با اضافه کردن مدت زمان ها در یک عبارت، یا کم کردن مدت زمان از دیگری را ترکیب کرد:

oneHourOneMinute := 1 * time.Hour + 1 * time.Minute
tenMinutes := 1 * time.Hour - 50 * time.Minute

بعد، فایل main.go خود را باز کنید و برنامه خود را به روز کنید تا از ترکیبی مانند این برای کم کردن یک دقیقه و یک ثانیه از toAdd استفاده کنید:

projects/datetime/main.go

...

func main() {
	
	...
	
	toAdd += 1 * time.Second
	fmt.Println("3:", toAdd)
	
	toAdd -= 1*time.Minute + 1*time.Second
	fmt.Println("4:", toAdd)
}

پس از ذخیره کد خود، می توانید برنامه را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

1: 1h0m0s
2: 1h1m0s
3: 1h1m1s
4: 1h0m0s

خط چهارم جدید اضافه شده به خروجی کد جدیدی را که برای تفریق مجموع 1 * time.Minute و 1 * time اضافه کرده اید نشان می دهد.

استفاده از این مدت زمان‌ها که با متد Add of the time.Time جفت شده‌اند، به شما این امکان را می‌دهد که یک مقدار زمانی را که قبلاً دارید انتخاب کنید و زمان را در نقطه دلخواه دیگری قبل یا بعد از آن زمان تعیین کنید. برای مشاهده نمونه ای از این در حال اجرا، فایل main.go خود را باز کنید و آن را به روز کنید تا مقدار toAdd را روی 24 ساعت یا 24 * time.Hour تنظیم کنید. سپس، از روش افزودن روی مقدار time.Time استفاده کنید تا ببینید 24 ساعت پس از آن نقطه چه زمانی خواهد بود:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.UTC)
	fmt.Println("The time is", theTime)

	toAdd := 24 * time.Hour
	fmt.Println("Adding", toAdd)

	newTime := theTime.Add(toAdd)
	fmt.Println("The new time is", newTime)
}

پس از ذخیره فایل خود، برنامه خود را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 +0000 UTC
Adding 24h0m0s
The new time is 2021-08-16 14:30:45.0000001 +0000 UTC

با نگاهی به خروجی، خواهید دید که افزودن 24 ساعت به 2021-08-15 منجر به تاریخ جدید 2021-08-16 می شود.

برای کم کردن زمان، از روش افزودن نیز استفاده می‌کنید که کمی غیرمعمول است. از آنجایی که از روش Sub برای بدست آوردن اختلاف زمان بین دو تاریخ استفاده می شود، با استفاده از Add با مقدار منفی، زمان را از مقدار time.Time کم می کنید.

یک بار دیگر، برای مشاهده این مورد در برنامه خود، فایل main.go خود را باز کرده و آن را به روز کنید تا مقدار 24 ساعته toAdd را به مقدار منفی تغییر دهید:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.UTC)
	fmt.Println("The time is", theTime)

	toAdd := -24 * time.Hour
	fmt.Println("Adding", toAdd)

	newTime := theTime.Add(toAdd)
	fmt.Println("The new time is", newTime)
}

پس از ذخیره فایل خود، یک بار دیگر برنامه خود را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 +0000 UTC
Adding -24h0m0s
The new time is 2021-08-14 14:30:45.0000001 +0000 UTC

این بار در خروجی خواهید دید که به جای اضافه کردن 24 ساعت به زمان اصلی، تاریخ جدید 24 ساعت قبل از زمان اصلی است.

در این بخش از time.Hour، time.Minute و time.Second برای ایجاد مقادیر time.Duration در درجات مختلف استفاده کردید. شما همچنین از مقادیر time.Duration با متد Add استفاده کردید تا یک مقدار time.Time جدید قبل و بعد از مقدار اصلی بدست آورید. با ترکیب زمان. اکنون، روش افزودن، و روش های قبل یا بعد، به عملکرد قدرتمند تاریخ و زمان برای برنامه های خود دسترسی خواهید داشت.

نتیجه

در این آموزش، شما از time.Now برای بازیابی یک مقدار time.Time برای زمان محلی فعلی در رایانه خود استفاده کردید، سپس از سال، ماه، ساعت و روش های دیگر برای دسترسی به اطلاعات خاصی در مورد آن زمان استفاده کردید. سپس، از روش Format برای چاپ زمان با استفاده از یک قالب سفارشی و یک قالب از پیش تعریف شده استفاده کردید. در مرحله بعد، از تابع time.Parse برای تفسیر مقدار رشته با زمان در آن و استخراج مقدار زمان از آن استفاده کردید. هنگامی که مقدار زمان را داشتید، از روش های UTC و Local برای ترجمه زمان بین UTC و منطقه زمانی محلی خود استفاده کردید. پس از آن، قبل از استفاده از روش افزودن برای یافتن زمان نسبت به مقدار زمانی متفاوت، از روش Sub برای بدست آوردن مدت زمان بین دو زمان مختلف استفاده کردید.

استفاده از توابع و روش‌های مختلفی که در این آموزش توضیح داده شده است، کمک زیادی به برنامه‌های شما می‌کند، اما بسته Go time در صورت علاقه، تعدادی ویژگی دیگر را نیز شامل می‌شود.

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:VPS یا سرور مجازیآموزش برنامه GOاتصال به سرور مجازی ویندوزبرنامه Goخرید سرور مجازیراه اندازی اولیه سرورسرور مجازیسفارشی کردن رشته های تاریخ

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه راه اندازی پلتفرم Eclipse Theia Cloud IDE در vpsgol Kubernetes

ورود به سایت

معرفی

با حرکت ابزارهای توسعه‌دهنده به سمت ابر، ایجاد و پذیرش پلت‌فرم‌های Cloud IDE (محیط توسعه یکپارچه) در حال رشد است. Cloud IDE ها از هر نوع دستگاه مدرن از طریق مرورگرهای وب قابل دسترسی هستند و مزایای متعددی را برای سناریوهای همکاری بلادرنگ ارائه می دهند. کار در یک IDE ابری یک محیط توسعه و آزمایش یکپارچه را برای شما و تیمتان فراهم می کند، در حالی که ناسازگاری های پلت فرم را به حداقل می رساند. از آنجایی که آنها به طور بومی مبتنی بر فناوری‌های ابری هستند، می‌توانند از خوشه برای دستیابی به وظایفی استفاده کنند که می‌تواند تا حد زیادی از قدرت و قابلیت اطمینان یک کامپیوتر توسعه‌دهنده فراتر رود.

Eclipse Theia یک IDE ابری توسعه پذیر است که روی یک سرور راه دور اجرا می شود و از یک مرورگر وب قابل دسترسی است. از نظر بصری، به گونه‌ای طراحی شده است که شبیه به Microsoft Visual Studio Code به نظر برسد و رفتاری مشابه داشته باشد، به این معنی که از بسیاری از زبان‌های برنامه‌نویسی پشتیبانی می‌کند، طرح‌بندی انعطاف‌پذیری دارد و ترمینال یکپارچه دارد. آنچه Eclipse Theia را از سایر نرم افزارهای Cloud IDE جدا می کند، توسعه پذیری آن است. می توان آن را با استفاده از پسوندهای سفارشی تغییر داد، که به شما امکان می دهد یک IDE ابری متناسب با نیازهای خود ایجاد کنید.

در این آموزش، شما نسخه پیش‌فرض پلت‌فرم Eclipse Theia ابری IDE را در خوشه vpsgol Kubernetes خود راه‌اندازی می‌کنید و آن را در دامنه خود، با گواهی‌های Let’s Encrypt ایمن می‌کنید و از بازدیدکننده برای احراز هویت می‌خواهد. در پایان، Eclipse Theia را خواهید داشت که روی خوشه Kubernetes شما از طریق HTTPS در دسترس است و بازدیدکننده را ملزم به ورود به سیستم می‌کند.

پیش نیازها

  • یک خوشه vpsgol Kubernetes با اتصال شما به عنوان پیش فرض kubectl پیکربندی شده است. دستورالعمل های مربوط به نحوه پیکربندی kubectl در مرحله اتصال به خوشه خود هنگام ایجاد خوشه نشان داده می شود.
  • مدیریت بسته Helm 3 بر روی دستگاه محلی شما نصب شده است.
  • Nginx Ingress Controller با استفاده از Helm برای استفاده از ExternalDNS با منابع Ingress بر روی خوشه شما نصب شده است.
  • یک نام دامنه کاملاً ثبت شده این آموزش از theia.your_domain در سرتاسر استفاده خواهد کرد. می توانید یک نام دامنه را در Namecheap خریداری کنید، یک نام دامنه را به صورت رایگان در Freenom دریافت کنید، یا از ثبت کننده دامنه انتخابی خود استفاده کنید.

مرحله 1 – نصب و نمایش Eclipse Theia

برای شروع، Eclipse Theia را در خوشه vpsgol Kubernetes خود نصب خواهید کرد. سپس با استفاده از Nginx Ingress آن را در دامنه مورد نظر خود در معرض دید قرار خواهید داد.

از آنجایی که شما دو نمونه استقرار و یک منبع را به عنوان بخشی از پیش نیازها ایجاد کردید، می توانید آزادانه آنها را با اجرای دستورات زیر حذف کنید:

kubectl delete -f hello-kubernetes-ingress.yaml

kubectl delete -f hello-kubernetes-first.yaml

kubectl delete -f hello-kubernetes-second.yaml

برای این آموزش، پیکربندی استقرار را در دستگاه محلی خود در فایلی به نام eclipse-theia.yaml ذخیره خواهید کرد. با استفاده از دستور زیر آن را ایجاد کنید:

nano eclipse-theia.yaml

خطوط زیر را به فایل اضافه کنید:

eclipse-theia.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: theia
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: theia-next
  namespace: theia
spec:
  ingressClassName: nginx
  rules:
  - host: theia.your_domain
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: theia-next
            port:
              number: 80
---
apiVersion: v1
kind: Service
metadata:
 name: theia-next
 namespace: theia
spec:
 ports:
 - port: 80
   targetPort: 3000
 selector:
   app: theia-next
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: theia-next
  name: theia-next
  namespace: theia
spec:
  selector:
    matchLabels:
      app: theia-next
  replicas: 1
  template:
    metadata:
      labels:
        app: theia-next
    spec:
      containers:
      - image: francoisvans/theia-docker-test
        imagePullPolicy: Always
        name: theia-next
        ports:
        - containerPort: 3000

این پیکربندی یک فضای نام، یک استقرار، یک سرویس و یک ورودی را تعریف می کند. فضای نام تیا نامیده می شود و شامل تمام اشیای Kubernetes مربوط به Eclipse Theia است که از بقیه خوشه جدا شده اند. استقرار شامل یک نمونه از تصویر Theia Docker است که پورت 3000 روی کانتینر قرار دارد. این سرویس به دنبال Deployment می‌گردد و پورت کانتینر را به پورت HTTP معمولی 80 تغییر می‌دهد و به Eclipse Theia اجازه دسترسی درون خوشه‌ای را می‌دهد.

Ingress حاوی قانونی برای ارائه سرویس در پورت 80 به صورت خارجی در دامنه مورد نظر شما است. در حاشیه نویسی آن، شما مشخص می کنید که Nginx Ingress Controller باید برای پردازش درخواست استفاده شود. به یاد داشته باشید که دامنه مورد نظر خود را که به Load Balancer کلاستر خود اشاره کرده اید جایگزین theia.your_domain کنید، سپس فایل را ذخیره کرده و ببندید.

فایل را ذخیره کرده و از آن خارج شوید.

سپس با اجرای دستور زیر پیکربندی را در Kubernetes ایجاد کنید:

kubectl apply -f eclipse-theia.yaml

خروجی شبیه به این خواهد بود:

 

Output

namespace/theia created
ingress.networking.k8s.io/theia-next created
service/theia-next created
deployment.apps/theia-next created

می‌توانید با اجرای زیر، ایجاد غلاف Eclipse Theia را تماشا کنید:

kubectl get pods -w -n theia

خروجی به شکل زیر خواهد بود:

 

Output

NAME                          READY   STATUS    RESTARTS   AGE
theia-next-6f6b98dd4f-qknhb   1/1     Running   0          2m30s

پس از مدتی، وضعیت به RUNNING تبدیل می‌شود، به این معنی که Eclipse Theia را با موفقیت در کلاستر خود نصب کرده‌اید.

در مرورگر خود به دامنه خود بروید. رابط کاربری گرافیکی ویرایشگر Eclipse Theia پیش‌فرض را خواهید دید:

 

شما Eclipse Theia را در خوشه vpsgol Kubernetes خود مستقر کرده اید و با یک Ingress آن را در دامنه مورد نظر خود قرار داده اید. در مرحله بعد، با فعال کردن احراز هویت ورود، دسترسی به استقرار Eclipse Theia خود را ایمن خواهید کرد.

مرحله 2 – فعال کردن احراز هویت ورود به سیستم برای دامنه شما

در این مرحله، احراز هویت نام کاربری و رمز عبور را برای استقرار Eclipse Theia خود فعال می‌کنید. ابتدا با تنظیم لیستی از ترکیبات ورود معتبر با استفاده از ابزار htpasswd به این مهم دست خواهید یافت. سپس، یک راز Kubernetes حاوی آن لیست ایجاد می‌کنید و Ingress را برای احراز هویت بازدیدکنندگان بر اساس آن پیکربندی می‌کنید. در پایان، دامنه شما تنها زمانی قابل دسترسی خواهد بود که بازدیدکننده یک ترکیب نام کاربری و رمز عبور معتبر وارد کند. این امر از دسترسی مهمانان و سایر بازدیدکنندگان ناخواسته به Eclipse Theia جلوگیری می کند.

ابزار htpasswd از وب سرور آپاچی می آید و برای ایجاد فایل هایی استفاده می شود که لیست هایی از ترکیبات ورود را ذخیره می کنند. فرمت فایل‌های htpasswd یک نام کاربری: ترکیب hashed_password در هر خط است، که فرمتی است که Nginx Ingress Controller انتظار دارد لیست با آن مطابقت داشته باشد.

ابتدا حافظه پنهان بسته منیجر را به روز کنید:

sudo apt update

سپس htpasswd را با اجرای دستور زیر بر روی سیستم خود نصب کنید:

sudo apt install apache2-utils -y

شما لیست را در فایلی به نام auth ذخیره خواهید کرد. آن را با اجرا ایجاد کنید:

touch auth

این فایل باید auth نامیده شود زیرا کنترلر ورودی Nginx انتظار دارد که رمز حاوی کلیدی به نام data.auth باشد. اگر از دست رفته باشد، کنترل‌کننده وضعیت HTTP 503 Service Unavailable را برمی‌گرداند.

با اجرای دستور زیر یک ترکیب نام کاربری و رمز عبور به aut اضافه کنید:

htpasswd auth username

به یاد داشته باشید که نام کاربری مورد نظر خود را جایگزین نام کاربری کنید. از شما یک رمز عبور درخواست می شود و این ترکیب به فایل auth اضافه می شود. می توانید این دستور را برای هر تعداد کاربر که می خواهید اضافه کنید تکرار کنید.

پس از اتمام کار، با اجرای دستور زیر یک راز جدید در Kubernetes با محتویات فایل ایجاد کنید:

kubectl create secret generic theia-basic-auth –from-file=auth -n theia

شما می توانید راز را با:

kubectl get secret theia-basic-auth -o yaml -n theia

خروجی به صورت زیر خواهد بود:

 

Output

apiVersion: v1
data:
  auth: ...
kind: Secret
metadata:
  creationTimestamp: "2021-12-31T17:16:29Z"
  name: theia-basic-auth
  namespace: theia
  resourceVersion: "32437"
  uid: 47461e23-e281-411b-acfd-cea82fcde41b
type: Opaque

در مرحله بعد، باید Ingress را ویرایش کنید تا از راز استفاده کند. پیکربندی استقرار را برای ویرایش باز کنید:

nano eclipse-theia.yaml

خطوط هایلایت شده را به فایل خود اضافه کنید:

eclipse-theia.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: theia
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: theia-next
  namespace: theia
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: theia-basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - Eclipse Theia'
spec:
  ingressClassName: nginx
  rules:
  - host: theia.your_domain
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: theia-next
            port:
              number: 80
...

ابتدا در حاشیه نویسی auth-type مشخص می کنید که نوع احراز هویت اولیه است. این بدان معنی است که Nginx از کاربر می خواهد که نام کاربری و رمز عبور را وارد کند. سپس، در auth-secret، مشخص می‌کنید که راز حاوی لیست ترکیبات معتبر theia-basic-auth است که به تازگی ایجاد کرده‌اید. حاشیه نویسی قلمرو اعتبار باقی مانده پیامی را مشخص می کند که به عنوان توضیحی در مورد اینکه چرا احراز هویت لازم است به کاربر نشان داده می شود. می توانید پیام موجود در این قسمت را به دلخواه تغییر دهید.

ذخیره کنید و فایل را ببندید.

برای انتشار تغییرات در کلاستر خود، دستور زیر را اجرا کنید:

kubectl apply -f eclipse-theia.yaml

خروجی را خواهید دید:

 

Output

namespace/theia unchanged
ingress.networking.k8s.io/theia-next configured
service/theia-next unchanged
deployment.apps/theia-next unchanged

در مرورگر خود به دامنه خود بروید، جایی که اکنون از شما خواسته می شود وارد شوید.

شما احراز هویت اولیه ورود به سیستم را در Ingress خود با پیکربندی آن برای استفاده از رمز حاوی ترکیب نام کاربری و رمز عبور هش شده فعال کرده اید. در مرحله بعدی، با افزودن گواهی‌های TLS، دسترسی بیشتری را ایمن می‌کنید تا ترافیک بین شما و استقرار Eclipse Theia رمزگذاری شده باقی بماند.

مرحله 3 – اعمال مجوزهای HTTPS Let’s Encrypt

در مرحله بعد، نصب Eclipse Theia خود را با اعمال گواهینامه های Let’s Encrypt در Ingress خود، که Cert-Manager به طور خودکار ارائه می کند، ایمن می کنید. پس از تکمیل این مرحله، نصب Eclipse Theia شما از طریق HTTPS قابل دسترسی خواهد بود.

برای ویرایش eclipse-theia.yaml را باز کنید:

nano eclipse-theia.yaml

خطوط هایلایت شده را به فایل خود اضافه کنید، مطمئن شوید که دامنه جای جای خود را جایگزین کنید:

eclipse-theia.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: theia
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: theia-next
  namespace: theia
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: theia-basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - Eclipse Theia'
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts:
    - theia.your_domain
    secretName: theia-prod
  ingressClassName: nginx
  rules:
  - host: theia.your_domain
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: theia-next
            port:
              number: 80
...

ابتدا، letsencrypt-prod ClusterIssuer را که ایجاد کرده اید به عنوان بخشی از پیش نیازها به عنوان صادرکننده مشخص می کنید که برای ارائه گواهینامه برای این ورود استفاده می شود. سپس، در بخش tls، دامنه دقیقی را که باید ایمن شود، و همچنین نامی برای رازی که این گواهینامه ها را نگه می دارد، مشخص می کنید.

فایل را ذخیره کرده و از آن خارج شوید.

با اجرای دستور زیر تغییرات را در کلاستر خود اعمال کنید:

kubectl apply -f eclipse-theia.yaml

خروجی به صورت زیر خواهد بود:

 

Output

namespace/theia unchanged
ingress.networking.k8s.io/theia-next configured
service/theia-next unchanged
deployment.apps/theia-next unchanged

چند دقیقه طول می کشد تا گواهینامه ها تهیه و به طور کامل اعمال شوند. با مشاهده خروجی دستور زیر می توانید پیشرفت را دنبال کنید:

kubectl describe certificate theia-prod -n theia

وقتی تمام شد، انتهای خروجی شبیه به این خواهد بود:

 

Output

...
Events:
  Type    Reason        Age   From          Message
  ----    ------        ----  ----          -------
  Normal  GeneratedKey  42m   cert-manager  Generated a new private key
  Normal  Requested     42m   cert-manager  Created new CertificateRequest resource "theia-prod-3785736528"
  Normal  Issued        42m   cert-manager  Certificate issued successfully

دامنه خود را در مرورگر خود به روز کنید. قفل سبز رنگی را در سمت چپ نوار آدرس مشاهده خواهید کرد که به معنای ایمن بودن اتصال است.

شما Ingress را برای استفاده از گواهی‌های Let’s Encrypt پیکربندی کرده‌اید، بنابراین استقرار Eclipse Theia را ایمن‌تر می‌کنید. اکنون می توانید رابط کاربری پیش فرض Eclipse Theia را بررسی کنید.

مرحله 4 – استفاده از رابط Eclipse Theia

در این بخش، برخی از ویژگی های رابط Eclipse Theia را بررسی خواهید کرد.

در سمت چپ IDE، یک ردیف عمودی از چهار دکمه وجود دارد که متداول‌ترین ویژگی‌های مورد استفاده را در یک پانل کناری باز می‌کند.

این نوار قابل تنظیم است، بنابراین می توانید این نماها را به ترتیب دیگری منتقل کنید یا آنها را از نوار حذف کنید. به طور پیش فرض، اولین نمای پانل Explorer را باز می کند که ناوبری درخت مانند ساختار پروژه را ارائه می دهد. می‌توانید پوشه‌ها و فایل‌های خود را در اینجا مدیریت کنید—در صورت لزوم آنها را ایجاد، حذف، جابجا کنید و نام آنها را تغییر دهید.

پس از ایجاد یک فایل جدید از طریق منوی File، یک فایل خالی را خواهید دید که در یک تب جدید باز می شود. پس از ذخیره، می توانید نام فایل را در پانل کناری Explorer مشاهده کنید. برای ایجاد پوشه، روی نوار کناری Explorer راست کلیک کرده و روی New Folder کلیک کنید. می‌توانید یک پوشه را با کلیک کردن روی نام آن و همچنین کشیدن و رها کردن فایل‌ها و پوشه‌ها به قسمت‌های بالای سلسله مراتب گسترش دهید تا آنها را به مکان جدیدی منتقل کنید.

گزینه بعدی دسترسی به قابلیت جستجو و جایگزینی را فراهم می کند. به دنبال آن، مورد بعدی نمایی از سیستم های کنترل منبعی را که ممکن است از آنها استفاده می کنید، مانند Git ارائه می دهد.

نمای بعدی گزینه debugger است که تمام اقدامات رایج برای رفع اشکال در پنل را ارائه می دهد. می توانید پیکربندی های اشکال زدایی را در فایل launch.json ذخیره کنید.

گزینه نهایی به شما امکان می دهد برنامه های افزودنی را مشاهده و نصب کنید:

بخش مرکزی رابط کاربری گرافیکی ویرایشگر شما است که می توانید آن را با برگه هایی برای ویرایش کد خود جدا کنید. می توانید نمای ویرایش خود را به یک سیستم شبکه ای یا به فایل های کنار هم تغییر دهید. مانند همه IDE های مدرن، Eclipse Theia از برجسته سازی نحو برای کد شما پشتیبانی می کند.

بخش مرکزی رابط کاربری گرافیکی ویرایشگر شما است که می توانید آن را با برگه هایی برای ویرایش کد خود جدا کنید. می توانید نمای ویرایش خود را به یک سیستم شبکه ای یا به فایل های کنار هم تغییر دهید. مانند همه IDE های مدرن، Eclipse Theia از برجسته سازی نحو برای کد شما پشتیبانی می کند.

اگر می خواهید استقرار Eclipse Theia را در کلاستر خود از بین ببرید، دستور زیر را اجرا کنید:

kubectl delete -f eclipse-theia.yaml

شما یک نمای کلی سطح بالا از رابط Eclipse Theia را بررسی کرده اید و برخی از متداول ترین ویژگی های مورد استفاده را مرور کرده اید.

نتیجه

اکنون Eclipse Theia، یک IDE ابری همه کاره، را روی خوشه vpsgol Kubernetes خود نصب کرده اید. شما آن را با یک گواهی رایگان Let’s Encrypt TLS ایمن کرده اید و نمونه ای را برای نیاز به ورود از بازدیدکننده تنظیم کرده اید. می توانید روی کد منبع و اسناد خود به صورت جداگانه کار کنید یا با تیم خود همکاری کنید.

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:ایجاد سرور مجازیخرید سرور مجازیخرید سرور مجازی فرانسهراه اندازی سرور مجازیسرور مجازینحوه راه اندازی پلتفرم Eclipse Theia Cloud IDEنصب Eclipse Theia

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه ایجاد یک سرور Minecraft در اوبونتو 18.04

ورود به سایت

معرفی

Minecraft یک بازی ویدیویی محبوب sandbox است. این برنامه که در ابتدا در سال 2009 منتشر شد، به بازیکنان اجازه می‌دهد در دنیایی سه بعدی بسازند، بسازند، بسازند و زنده بمانند. از اوایل سال 2022، این بازی پرفروش ترین بازی ویدیویی تمام دوران بود. در این آموزش شما سرور Minecraft خود را ایجاد می کنید تا شما و دوستانتان با هم بازی کنید. به طور خاص، شما بسته های نرم افزاری لازم را برای اجرای Minecraft نصب می کنید، سرور را برای اجرا پیکربندی می کنید و سپس بازی را اجرا می کنید.

متناوبا، می‌توانید سرور DigitalOcean’s One-Click Minecraft: Java Edition را به‌عنوان مسیر نصب دیگری بررسی کنید.

پیش نیازها

برای پیروی از این راهنما، شما نیاز دارید:

  • یک سرور با نصب جدید اوبونتو 18.04، یک کاربر غیر ریشه با امتیازات sudo و SSH فعال. شما می توانید این راهنما را برای مقداردهی اولیه سرور خود دنبال کنید و این مراحل را کامل کنید. Minecraft می تواند منابع فشرده ای داشته باشد، بنابراین هنگام انتخاب اندازه سرور خود این را در نظر داشته باشید. اگر از DigitalOcean استفاده می کنید و به منابع بیشتری نیاز دارید، همیشه می توانید اندازه Droplet خود را تغییر دهید تا CPU و RAM بیشتری اضافه کنید.
  • یک کپی از Minecraft Java Edition که روی یک دستگاه Mac، Windows یا Linux محلی نصب شده است.

مرحله 1 – بسته های نرم افزاری لازم را نصب کرده و فایروال را پیکربندی کنید

با شروع اولیه سرور، اولین قدم شما نصب جاوا است. برای اجرای Minecraft به آن نیاز دارید. به طور پیش‌فرض، اوبونتو 18.04 نسخه جدید جاوا را برای اجرای جدیدترین نسخه‌های Minecraft ارائه نمی‌کند. خوشبختانه، نگهبانان شخص ثالثی وجود دارند که به ساخت بسته‌های جاوای جدیدتر برای نسخه‌های قدیمی‌تر اوبونتو ادامه می‌دهند و می‌توانید با افزودن PPA یا آرشیو بسته‌های شخصی آن‌ها به فهرست منابع بسته خود، آن‌ها را نصب کنید. با دستور زیر می توانید این کار را انجام دهید:

sudo add-apt-repository ppa:openjdk-r/ppa

سپس، منابع بسته خود را به‌روزرسانی کنید تا این افزوده را منعکس کند:

sudo apt update

در نهایت، OpenJDK نسخه 17 جاوا، به طور خاص JRE هدلس را نصب کنید. این نسخه حداقلی از جاوا است که پشتیبانی از برنامه های رابط کاربری گرافیکی را حذف می کند. این آن را برای اجرای برنامه های جاوا بر روی سرور ایده آل می کند:

sudo apt install openjdk-17-jre-headless

همچنین باید از نرم افزاری به نام screen برای ایجاد جلسات سرور جداشونده استفاده کنید. صفحه نمایش به شما امکان می دهد یک جلسه ترمینال ایجاد کنید و از آن جدا شوید و روند شروع شده روی آن را اجرا کنید. این مهم است زیرا اگر بخواهید سرور خود را راه اندازی کنید و سپس ترمینال خود را ببندید، این جلسه را از بین می برد و سرور شما را متوقف می کند. اکنون صفحه نمایش را نصب کنید:

sudo apt install screen

اکنون که بسته‌ها را نصب کرده‌اید، باید فایروال را فعال کنیم تا ترافیک به سرور Minecraft ما وارد شود. در راه اندازی اولیه سرور که انجام دادید، فقط به ترافیک ssh اجازه دادید. اکنون باید اجازه دهید که ترافیک از طریق پورت 25565 وارد شود، که پورت پیش فرضی است که Minecraft برای اجازه دادن به اتصالات استفاده می کند. در برخی موارد ufw از قوانین ترافیکی نام‌گذاری شده استفاده می‌کند، مانند ssh، که همیشه به طور پیش‌فرض از پورت 22 استفاده می‌کند، اما در موارد کمتر رایج مانند این، شماره پورت را به صورت دستی مشخص می‌کنیم. با اجرای دستور زیر قانون فایروال لازم را اضافه کنید:

sudo ufw allow 25565

اکنون که جاوا را نصب کرده اید و فایروال خود را به درستی پیکربندی کرده اید، برنامه سرور Minecraft را از وب سایت Minecraft دانلود خواهید کرد.

مرحله 2 – دانلود آخرین نسخه Minecraft

اکنون باید نسخه فعلی سرور Minecraft را دانلود کنید. می‌توانید این کار را با رفتن به وب‌سایت Minecraft و کپی کردن پیوندی که می‌گوید دانلود minecraft_server.X.X.X.jar انجام دهید، جایی که Xها آخرین نسخه سرور هستند.

اکنون می توانید از wget و پیوند کپی شده برای دانلود برنامه سرور در سرور خود استفاده کنید:

wget https://launcher.mojang.com/v1/objects/125e5adf40c659fd3bce3e66e67a16bb49ecc1b9/server.jar

برنامه سرور به عنوان server.jar دانلود می شود. اگر نیاز به مدیریت نسخه‌های Minecraft دارید، یا اگر می‌خواهید سرور Minecraft خود را ارتقا دهید، ممکن است مفید باشد که server.jar دانلود شده را به minecraft_server_1.18.1.jar تغییر نام دهید و اعداد نسخه برجسته شده را با نسخه‌ای که تازه دانلود کرده‌اید مطابقت دهید:

mv server.jar minecraft_server_1.18.1.jar

اگر می‌خواهید نسخه قدیمی‌تر Minecraft را دانلود کنید، می‌توانید آن‌ها را در mcversions.net بایگانی کنید. اما این آموزش بر آخرین نسخه فعلی تمرکز خواهد کرد. اکنون که دانلود خود را دارید، بیایید پیکربندی سرور Minecraft خود را شروع کنیم.

مرحله 3 – پیکربندی و اجرای سرور Minecraft

اکنون که jar Minecraft را دانلود کرده اید، آماده اجرای آن هستید.

ابتدا یک جلسه صفحه نمایش را با اجرای دستور screen شروع کنید:

screen

پس از خواندن بنر ظاهر شده، Spacebar را فشار دهید. صفحه نمایش یک جلسه ترمینال مانند حالت عادی به شما ارائه می دهد. این جلسه اکنون قابل جدا شدن است، به این معنی که می‌توانید دستوری را در اینجا شروع کنید و آن را اجرا کنید.

اکنون می توانید پیکربندی اولیه خود را انجام دهید. وقتی دستور بعدی خطایی می دهد، نگران نباشید. Minecraft نصب خود را به این صورت طراحی کرده است که کاربران ابتدا باید با موافقت نامه مجوز شرکت موافقت کنند. در ادامه این کار را انجام خواهید داد:

java -Xms1024M -Xmx1024M -jar minecraft_server_1.18.1.jar nogui

قبل از بررسی خروجی این دستور، بیایید نگاهی دقیق‌تر به همه این آرگومان‌های خط فرمان که سرور شما را تنظیم می‌کنند بیاندازیم:

  • Xms1024M – این سرور را به گونه ای پیکربندی می کند که با 1024 مگابایت یا 1 گیگابایت رم در حال اجرا باشد. اگر می خواهید سرور شما با رم بیشتری شروع به کار کند، می توانید این محدودیت را افزایش دهید. هر دو M برای مگابایت و G برای گیگابایت گزینه های پشتیبانی می شوند. به عنوان مثال: Xms2G سرور را با 2 گیگابایت رم راه اندازی می کند.
  • Xmx1024M – این سرور را برای استفاده حداکثر از 1024M رم پیکربندی می کند. اگر می‌خواهید سرورتان در اندازه بزرگ‌تری اجرا شود، بازیکنان بیشتری را مجاز کنید، یا اگر احساس می‌کنید که سرورتان کند کار می‌کند، می‌توانید این محدودیت را افزایش دهید. برنامه های جاوا از این جهت منحصر به فرد هستند که همیشه از شما می خواهند حداکثر مقدار حافظه ای که می توانند استفاده کنند را مشخص کنید.
  • jar – این پرچم مشخص می کند که کدام فایل jar سرور اجرا شود.
  • nogui – این به سرور می گوید که رابط کاربری گرافیکی را راه اندازی نکند زیرا این یک سرور است و شما یک رابط کاربری گرافیکی ندارید.

اولین باری که این دستور را اجرا می کنید که معمولاً سرور شما را راه اندازی می کند، این خروجی را دریافت خواهید کرد:

 

Output

[22:05:31] [22:05:31] [main/ERROR]: Failed to load properties from file: server.properties
[22:05:31] [main/WARN]: Failed to load eula.txt
[22:05:31] [main/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

این خطاها به این دلیل ایجاد شده‌اند که سرور نمی‌تواند دو فایل لازم برای اجرا را پیدا کند: EULA (توافقنامه مجوز کاربر نهایی) که در eula.txt یافت می‌شود و فایل پیکربندی server.properties. از آنجایی که سرور قادر به یافتن این فایل ها نبود، آنها را در فهرست کاری فعلی شما ایجاد کرد. Minecraft این کار را عمدا انجام می دهد تا مطمئن شود که EULA آن را خوانده اید و با آن موافقت کرده اید.

eula.txt را در nano یا ویرایشگر متن مورد علاقه خود باز کنید:

nano eula.txt

در داخل این فایل، پیوندی به EULA Minecraft مشاهده خواهید کرد. URL را کپی کنید:

~/eula.txt

#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
#Tue Mar 24 22:05:31 UTC 2020
eula=false

URL را در مرورگر وب خود باز کنید و توافق نامه را بخوانید. سپس به ویرایشگر متن خود برگردید و آخرین خط را در eula.txt پیدا کنید. در اینجا eula=false را به eula=true تغییر دهید. سپس فایل را ذخیره کرده و ببندید. در نانو، این به این معنی است که Ctrl+X را برای خروج فشار دهید، سپس وقتی از شما خواسته شد ذخیره کنید، Y و سپس Enter کنید.

اکنون که EULA را پذیرفته اید، می توانید سرور را مطابق با مشخصات خود پیکربندی کنید.

در دایرکتوری فعلی خود، فایل server.properties ایجاد شده جدید را نیز خواهید یافت. این فایل شامل تمامی گزینه های پیکربندی سرور Minecraft شما می باشد. می‌توانید فهرست دقیقی از تمام ویژگی‌های سرور را در ویکی رسمی Minecraft پیدا کنید. قبل از راه اندازی سرور باید این فایل را با تنظیمات دلخواه خود تغییر دهید. این آموزش برخی از تنظیمات اساسی را پوشش می دهد:

nano server.properties

فایل شما به شکل زیر ظاهر می شود:

~/server.properties

#Minecraft server properties
#Thu Apr 30 23:42:29 UTC 2020
spawn-protection=16
max-tick-time=60000
query.port=25565
generator-settings=
force-gamemode=false
allow-nether=true
enforce-whitelist=false
gamemode=survival
broadcast-console-to-ops=true
enable-query=false
player-idle-timeout=0
difficulty=easy
spawn-monsters=true
broadcast-rcon-to-ops=true
op-permission-level=4
pvp=true
snooper-enabled=true
level-type=default
hardcore=false
enable-command-block=false
max-players=20
network-compression-threshold=256
resource-pack-sha1=
max-world-size=29999984
function-permission-level=2
rcon.port=25575
server-port=25565
server-ip=
spawn-npcs=true
allow-flight=false
level-name=world
view-distance=10
resource-pack=
spawn-animals=true
white-list=false
rcon.password=
generate-structures=true
online-mode=true
max-build-height=256
level-seed=
prevent-proxy-connections=false
use-native-transport=true
motd=A Minecraft Server
enable-rcon=false

بیایید نگاهی دقیق تر به برخی از مهم ترین ویژگی های این لیست بیندازیم:

دشواری (پیش‌فرض آسان) – این میزان سختی بازی را تعیین می‌کند، مانند میزان آسیب وارد شده و چگونگی تأثیر عناصر بر بازیکن شما. گزینه ها صلح آمیز، آسان، عادی و سخت هستند.
حالت بازی (بقای پیش فرض) – این حالت گیم پلی را تنظیم می کند. گزینه ها بقا، خلاقیت، ماجراجویی و تماشاگر هستند.
level-name (دنیای پیش فرض) – این نام سرور شما را تعیین می کند که در مشتری ظاهر می شود. ممکن است لازم باشد قبل از کاراکترهای خاص مانند آپوستروف، علامت معکوس وجود داشته باشد. شناخته شده است که این کاراکترهای فرار است، و زمانی که کاراکترهای خاص ممکن است به درستی در زمینه تجزیه و تحلیل نشوند، معمول است.
motd (سرور پیش فرض یک Minecraft) – پیامی که در لیست سرور مشتری Minecraft نمایش داده می شود.
pvp (پیش‌فرض درست) – نبرد بازیکن در مقابل بازیکن را فعال می‌کند. اگر روی true تنظیم شود، بازیکنان می‌توانند وارد جنگ شوند و به یکدیگر آسیب برسانند.
پس از تنظیم گزینه های مورد نظر، فایل را ذخیره کرده و ببندید.

اکنون می توانید سرور خود را با موفقیت راه اندازی کنید.

مانند دفعه قبل، بیایید سرور خود را با 1024M RAM راه اندازی کنیم. این بار، همچنین باید به Minecraft این امکان را بدهید که در صورت لزوم تا 4G از رم استفاده کند. به یاد داشته باشید که می توانید این شماره را متناسب با محدودیت های سرور یا نیازهای کاربر خود تنظیم کنید:

java -Xms1024M -Xmx4G -jar minecraft_server_1.18.1.jar nogui

چند لحظه به مقدار دهی اولیه بدهید. به زودی سرور Minecraft جدید شما شروع به تولید خروجی مشابه این خواهد کرد:

 

Output

[21:08:14] [Server thread/INFO]: Starting minecraft server version 1.15.2
[21:08:14] [Server thread/INFO]: Loading properties
[21:08:14] [Server thread/INFO]: Default game type: SURVIVAL
[21:08:14] [Server thread/INFO]: Generating keypair
[21:08:15] [Server thread/INFO]: Starting minecraft server on *:25565

پس از راه اندازی سرور، خروجی زیر را مشاهده خواهید کرد:

 

Output

[21:15:37] [Server thread/INFO]: Done (30.762s)! For help, type "help"

سرور شما اکنون در حال اجرا است و کنترل پنل مدیر سرور به شما نمایش داده شده است. راهنمای تایپ کردن را امتحان کنید:

help

خروجی به شکل زیر ظاهر می شود:

 

Output

[21:15:37] [Server thread/INFO]: /advancement (grant|revoke)
[21:15:37] [Server thread/INFO]: /ban <targets> [<reason>]
[21:15:37] [Server thread/INFO]: /ban-ip <target> [<reason>]
[21:15:37] [Server thread/INFO]: /banlist [ips|players]
...

از این ترمینال می توانید دستورات مدیر را اجرا کرده و سرور Minecraft خود را کنترل کنید. اکنون یاد خواهید گرفت که از صفحه نمایش برای فعال نگه داشتن سرور Minecraft خود پس از خروج از ترمینال استفاده کنید. سپس می توانید به مشتری Minecraft خود متصل شوید و یک بازی جدید را شروع کنید.

مرحله 4 – نگه داشتن سرور در حال اجرا

اکنون که سرور خود را روشن کرده اید، می خواهید حتی پس از قطع اتصال از جلسه SSH، همچنان در حال اجرا باشد. از آنجایی که قبلاً از صفحه استفاده کرده اید، می توانید با فشار دادن Ctrl + A + D از این جلسه جدا شوید. باید ببینید که به پوسته اصلی خود برگشته اید:

 

Output

​​ubuntu@minecraft-1804:~$ screen
[detached from 3626.pts-0.minecraft-1804]
$

این دستور را اجرا کنید تا تمام جلسات صفحه نمایش خود را ببینید:

screen -list

یک خروجی با شناسه جلسه خود دریافت خواهید کرد که برای از سرگیری آن جلسه باید آن را از سر بگیرید:

 

Output

There is a screen on:
        3626.pts-0.minecraft-1804 (11/16/21 22:56:33) (Detached)
1 Socket in /run/screen/S-root.

برای از سرگیری جلسه خود، پرچم -r را به فرمان صفحه ارسال کنید و سپس شناسه جلسه خود را وارد کنید:

screen -r 3626

وقتی دوباره آماده خروج از ترمینال شدید، حتما با Ctrl + A + D از جلسه جدا شده و سپس از سیستم خارج شوید.

مرحله 5 – اتصال به سرور خود از مشتری Minecraft

اکنون که سرور شما راه اندازی شده است، بیایید از طریق مشتری Minecraft به آن متصل شویم. سپس می توانید بازی کنید!

نسخه Minecraft Java Edition خود را اجرا کنید و Multiplayer را در منو انتخاب کنید.

در مرحله بعد، باید یک سرور برای اتصال به آن اضافه کنید، بنابراین روی دکمه افزودن سرور کلیک کنید.

در صفحه ویرایش اطلاعات سرور که نشان داده می شود، یک نام به سرور خود بدهید و آدرس IP سرور خود را تایپ کنید. این همان آدرس IP است که برای اتصال از طریق SSH استفاده کردید.

هنگامی که نام سرور و آدرس IP خود را وارد کردید، به صفحه Multiplayer بازگردانده می شوید، جایی که سرور شما اکنون لیست می شود.

از این پس سرور شما همیشه در این لیست ظاهر می شود. آن را انتخاب کرده و روی Join Server کلیک کنید.

شما در سرور خود هستید و آماده بازی هستید!

نتیجه

شما اکنون یک سرور Minecraft دارید که روی اوبونتو 18.04 اجرا می شود تا شما و همه دوستانتان با آن بازی کنید! از کاوش، کاردستی و زنده ماندن در یک دنیای خام سه بعدی لذت ببرید.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:Minecraft نصباتصال به سرور مجازیاوبونتو 18.04ایجاد یک سرور Minecraftخرید سرور مجازیسرور Minecraftسرور مجازیسرور مجازی آمریکاسرور مجازی لهستان

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه راه اندازی یک سرور پخش ویدئو با استفاده از Nginx-RTMP در اوبونتو 20.04

ورود به سایت

معرفی

موارد استفاده زیادی برای پخش ویدیو وجود دارد. ارائه دهندگان خدمات مانند Twitch برای مدیریت جنبه های اکتشاف وب و مدیریت جامعه جریان بسیار محبوب هستند و نرم افزار رایگان مانند OBS Studio به طور گسترده برای ترکیب همپوشانی های ویدئویی از چندین منبع جریان مختلف در زمان واقعی استفاده می شود. در حالی که این پلتفرم ها بسیار قدرتمند هستند، در برخی موارد ممکن است بخواهید بتوانید جریانی را میزبانی کنید که به سایر ارائه دهندگان خدمات متکی نیست.

در این آموزش، نحوه پیکربندی وب سرور Nginx را برای میزبانی یک جریان ویدیوی RTMP مستقل که می‌تواند در برنامه‌های مختلف لینک و مشاهده شود، پیکربندی کنید. RTMP، پروتکل پیام‌رسانی بلادرنگ، اصول اکثر جریان‌های ویدئویی اینترنتی را تعریف می‌کند. همچنین یاد خواهید گرفت که چگونه جریان های HLS و DASH را میزبانی کنید که از پلتفرم های مدرن تری با استفاده از همین فناوری پشتیبانی می کنند.

پیش نیازها

برای تکمیل این راهنما، شما نیاز دارید:

  • یک سرور اوبونتو 20.04 و یک کاربر غیر ریشه با امتیازات sudo.
  • Nginx نصب شده است، به دنبال نحوه نصب Nginx در اوبونتو 20.04.

این آموزش از نام دامنه نگهدارنده your_domain برای URL ها و نام هاست استفاده می کند. در حین کار با آموزش، نام دامنه یا آدرس IP خود را جایگزین کنید.

مرحله 1 – نصب و پیکربندی Nginx-RTMP

اکثر ابزارهای مدرن جریان از پروتکل RTMP پشتیبانی می کنند، که پارامترهای اساسی یک جریان ویدئوی اینترنتی را تعریف می کند. وب سرور Nginx شامل ماژولی است که به شما امکان می دهد یک جریان RTMP با حداقل پیکربندی از یک URL اختصاصی ارائه دهید، درست مانند دسترسی HTTP به صفحات وب به طور پیش فرض. ماژول Nginx RTMP به طور خودکار در Nginx گنجانده نشده است، اما در Ubuntu 20.04 و اکثر توزیع‌های لینوکس دیگر می‌توانید آن را به عنوان یک بسته اضافی نصب کنید.

با اجرای دستورات زیر به عنوان یک کاربر غیر ریشه برای به روز رسانی لیست بسته های خود و نصب ماژول Nginx شروع کنید:

sudo apt update
sudo apt install libnginx-mod-rtmp

نصب ماژول به طور خودکار شروع به ارائه یک جریان نمی کند. شما باید یک بلوک پیکربندی را به فایل پیکربندی Nginx خود اضافه کنید که مکان و نحوه در دسترس بودن جریان را مشخص کند.

با استفاده از nano یا ویرایشگر متن مورد علاقه خود، فایل پیکربندی اصلی Nginx، /etc/nginx/nginx.conf را باز کنید و این بلوک پیکربندی را به انتهای فایل اضافه کنید:

sudo nano /etc/nginx/nginx.conf

/etc/nginx/nginx.conf

. . .
rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                allow publish 127.0.0.1;
                deny publish all;

                application live {
                        live on;
                        record off;
                }
        }
}
  • listen 1935 به این معنی است که RTMP برای اتصالات در پورت 1935 که استاندارد است گوش می دهد.
  • chunk_size 4096 به این معنی است که RTMP داده ها را در بلوک های 4 کیلوبایتی ارسال می کند که این نیز استاندارد است.
  • اجازه انتشار 127.0.0.1 و انکار انتشار همه به این معنی است که سرور فقط اجازه می دهد ویدیو از همان سرور منتشر شود تا دیگر کاربران جریان های خود را تحت فشار قرار ندهند.
  • application live یک بلوک برنامه را تعریف می کند که در مسیر /live URL در دسترس خواهد بود.
  • live on حالت زنده را فعال می‌کند تا چندین کاربر بتوانند به طور همزمان به جریان شما متصل شوند، یک فرض اولیه پخش ویدیو.
  • ضبط کردن عملکرد ضبط Nginx-RTMP را غیرفعال می کند، به طوری که تمام جریان ها به طور پیش فرض به طور جداگانه در دیسک ذخیره نمی شوند.

ذخیره کنید و فایل را ببندید. اگر از nano استفاده می کنید، Ctrl+X را فشار دهید، سپس وقتی از شما خواسته شد، Y و Enter را فشار دهید.

این شروع پیکربندی RTMP شما را فراهم می کند. به طور پیش فرض، به پورت 1935 گوش می دهد، به این معنی که باید آن پورت را در فایروال خود باز کنید. اگر ufw را به عنوان بخشی از تنظیمات اولیه سرور خود پیکربندی کرده اید، دستور زیر را اجرا کنید.

sudo ufw allow 1935/tcp

اکنون می توانید Nginx را با تغییرات خود بارگیری مجدد کنید:

sudo systemctl reload nginx.service

اکنون باید یک سرور RTMP در حال کار داشته باشید. در بخش بعدی، پخش ویدیو را از منابع محلی و راه دور به سرور RTMP شما پوشش خواهیم داد.

مرحله 2 – ارسال ویدیو به سرور RTMP شما

راه های مختلفی برای ارسال ویدیو به سرور RTMP وجود دارد. یکی از گزینه‌ها استفاده از ffmpeg، یک ابزار محبوب صوتی و تصویری خط فرمان، برای پخش مستقیم یک فایل ویدیویی بر روی سرور است. اگر قبلاً یک فایل ویدیویی روی سرور ندارید، می‌توانید با استفاده از youtube-dl، یک ابزار خط فرمان برای ضبط ویدیو از پلتفرم‌های پخش جریانی مانند YouTube، آن را دانلود کنید. برای استفاده از youtube-dl، به نصب پایتون به روز روی سرور خود نیز نیاز دارید.

ابتدا پایتون و مدیریت بسته آن یعنی pip را نصب کنید:

sudo apt install python3-pip

در مرحله بعد، از pip برای نصب youtube-dl استفاده کنید:

pip install youtube-dl

اکنون می توانید از youtube-dl برای دانلود یک ویدیو از یوتیوب استفاده کنید. اگر موردی را در ذهن ندارید، این ویدیو را با معرفی پلتفرم اپلیکیشن DigitalOcean امتحان کنید:

youtube-dl https://www.youtube.com/watch?v=iom_nhYQIYk

زمانی که youtube-dl جریان‌های ویدیویی و صوتی را که بارگیری می‌کند در یک فایل واحد ترکیب می‌کند، مقداری خروجی را مشاهده خواهید کرد – این طبیعی است.

 

Output

[youtube] iom_nhYQIYk: Downloading webpage
WARNING: Requested formats are incompatible for merge and will be merged into mkv.
[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.f137.mp4
[download] 100% of 32.82MiB in 08:40
[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.f251.webm
[download] 100% of 1.94MiB in 00:38
[ffmpeg] Merging formats into "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv"
Deleting original file Introducing App Platform by DigitalOcean-iom_nhYQIYk.f137.mp4 (pass -k to keep)
Deleting original file Introducing App Platform by DigitalOcean-iom_nhYQIYk.f251.webm (pass -k to keep)

اکنون باید یک فایل ویدیویی در فهرست فعلی خود با عنوانی مانند معرفی پلتفرم برنامه توسط DigitalOcean-iom_nhYQIYk.mkv داشته باشید. برای استریم کردن آن، باید ffmpeg را نصب کنید:

sudo apt install ffmpeg

و از ffmpeg برای ارسال آن به سرور RTMP خود استفاده کنید:

ffmpeg -re -i “Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv” -c:v copy -c:a aac -ar 44100 -ac 1 -f flv rtmp://localhost/live/stream

این دستور ffmpeg چند کار را انجام می دهد تا ویدیو را برای یک قالب مناسب پخش آماده کند. این یک آموزش ffmpeg نیست، بنابراین نیازی به بررسی دقیق آن ندارید، اما می توانید گزینه های مختلف را به صورت زیر درک کنید:

  • -re مشخص می کند که ورودی با نرخ فریم اصلی خود خوانده می شود.
  • -i “Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv” مسیر فایل ورودی ما را مشخص می کند.
  • -c:v روی کپی تنظیم شده است، به این معنی که شما در حال کپی کردن فرمت ویدیویی هستید که از YouTube به صورت بومی دریافت کرده اید.
  • -c:a پارامترهای دیگری دارد، یعنی aac -ar 44100 -ac 1، زیرا باید صدا را به یک فرمت مناسب RTMP نمونه برداری کنید. aac یک کدک صوتی با پشتیبانی گسترده است، 44100 هرتز یک فرکانس رایج است، و -ac 1 اولین نسخه از مشخصات AAC را برای اهداف سازگاری مشخص می کند.
  • -f flv برای حداکثر سازگاری با RTMP، ویدیو را در یک ظرف با فرمت flv می پیچد.

این ویدیو به rtmp://localhost/live/stream ارسال می‌شود، زیرا شما بلوک پیکربندی زنده را در مرحله 1 تعریف کرده‌اید، و پخش یک URL دلخواه برای این ویدیو است.

در حالی که ffmpeg در حال پخش ویدیو است، کدهای زمانی را چاپ می کند:

 

Output

frame=  127 fps= 25 q=-1.0 size=     405kB time=00:00:05.00 bitrate= 662.2kbits/s speed=frame=  140 fps= 25 q=-1.0 size=     628kB time=00:00:05.52 bitrate= 931.0kbits/s speed=frame=  153 fps= 25 q=-1.0 size=     866kB time=00:00:06.04 bitrate=1173.1kbits/s speed=

این خروجی استاندارد ffmpeg است. اگر ویدیو را به فرمت دیگری تبدیل می‌کردید، اینها ممکن است برای درک میزان کارآمدی نمونه‌گیری مجدد ویدیو مفید باشند، اما در این مورد، فقط می‌خواهید ببینید که به طور مداوم پخش می‌شود. با استفاده از این ویدئوی نمونه، باید fps دقیق = 25 افزایش دریافت کنید.

در حالی که ffmpeg در حال اجرا است، می توانید از پخش کننده ویدیو به جریان RTMP خود متصل شوید. اگر VLC، mpv، یا پخش کننده رسانه دیگری را به صورت محلی نصب کرده اید، باید بتوانید جریان خود را با باز کردن URL rtmp://your_domain/live/stream در پخش کننده رسانه خود مشاهده کنید. پس از اتمام پخش ویدیو توسط ffmpeg، پخش جریانی شما پایان می یابد. اگر می‌خواهید به طور نامحدود به چرخش ادامه دهد، می‌توانید -stream_loop -1 را به ابتدای دستور ffmpeg خود اضافه کنید.

اکنون که یاد گرفتید منابع ویدئویی استاتیک را از خط فرمان استریم کنید، نحوه پخش ویدئو از منابع پویا را با استفاده از OBS روی دسکتاپ یاد خواهید گرفت.

مرحله 3 – پخش ویدیو به سرور خود از طریق OBS (اختیاری)

پخش جریانی از طریق ffmpeg زمانی راحت است که یک ویدیو آماده دارید که می‌خواهید پخش کنید، اما پخش زنده می‌تواند بسیار پویاتر باشد. محبوب ترین نرم افزار برای پخش زنده OBS یا Open Broadcaster Software است – این نرم افزار رایگان، منبع باز و بسیار قدرتمند است.

OBS یک برنامه دسکتاپ است و از رایانه محلی شما به سرور شما متصل می شود.

پس از نصب OBS، پیکربندی آن به معنای شخصی‌سازی پنجره‌های دسکتاپ و منابع صوتی است که می‌خواهید به جریان خود اضافه کنید، و سپس اعتبارنامه‌ها را برای یک سرویس پخش اضافه کنید. این آموزش پیکربندی استریم شما را پوشش نمی‌دهد، زیرا در اولویت قرار دارد، و به طور پیش‌فرض، می‌توانید تنها با پخش جریانی کل دسک‌تاپ خود، یک نسخه نمایشی فعال داشته باشید. برای تنظیم اعتبار سرویس پخش خود، منوی تنظیمات OBS را باز کنید، به گزینه Stream بروید و گزینه های زیر را وارد کنید:

Streaming Service: Custom
Server: rtmp://your_domain/live
Play Path/Stream Key: obs_stream

obs_stream مسیری است که خودسرانه انتخاب شده است – در این مورد، ویدیوی شما در rtmp://your_domain/live/obs_stream در دسترس خواهد بود. شما نیازی به فعال کردن احراز هویت ندارید، اما باید یک ورودی اضافی به لیست سفید IP که در مرحله 1 پیکربندی کرده اید اضافه کنید.

بر روی سرور، فایل پیکربندی اصلی Nginx، /etc/nginx/nginx.conf را باز کنید و یک ورودی اجازه انتشار اضافی برای آدرس IP محلی خود اضافه کنید. اگر آدرس IP محلی خود را نمی دانید، بهتر است فقط به سایتی مانند What’s my IP بروید که می تواند به شما بگوید از کجا به آن دسترسی داشته اید:

sudo nano /etc/nginx/nginx.conf

/etc/nginx/nginx.conf

. . .
                allow publish 127.0.0.1;
                allow publish your_local_ip_address;
                deny publish all;
. . .

فایل را ذخیره کرده و ببندید، سپس Nginx را دوباره بارگیری کنید:

sudo systemctl reload nginx.service

اکنون باید بتوانید منوی تنظیمات OBS را ببندید و روی Start Streaming از رابط اصلی کلیک کنید! سعی کنید جریان خود را مانند قبل در پخش کننده رسانه مشاهده کنید. اکنون که اصول پخش ویدئو را در عمل مشاهده کرده اید، می توانید چند ویژگی دیگر را به سرور خود اضافه کنید تا آن را برای تولید آماده تر کنید.

مرحله 4 – افزودن مانیتورینگ به پیکربندی (اختیاری)

اکنون که Nginx را برای پخش جریانی ویدیو با استفاده از ماژول Nginx-RTMP پیکربندی کرده اید، گام بعدی رایج این است که صفحه آمار RTMP را فعال کنید. به جای افزودن جزئیات بیشتر و بیشتر پیکربندی به فایل اصلی nginx.conf، Nginx به شما امکان می دهد پیکربندی های هر سایت را به فایل های جداگانه در یک زیر شاخه به نام sites-available/ اضافه کنید. در این مورد، یکی به نام rtmp ایجاد خواهید کرد:

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

مطالب زیر را اضافه کنید:

/etc/nginx/sites-available/rtmp

server {
    listen 8080;
    server_name  localhost;

    # rtmp stat
    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }
    location /stat.xsl {
        root /var/www/html/rtmp;
    }

    # rtmp control
    location /control {
        rtmp_control all;
    }
}

ذخیره کنید و فایل را ببندید. فایل stat.xsl از این بلوک پیکربندی برای استایل دادن و نمایش یک صفحه آمار RTMP در مرورگر شما استفاده می شود. توسط کتابخانه libnginx-mod-rtmp که قبلا نصب کرده اید ارائه می شود، اما به طور پیش فرض فشرده می شود، بنابراین باید آن را از حالت فشرده خارج کنید و در پوشه /var/www/html/rtmp قرار دهید تا با پیکربندی بالا مطابقت داشته باشد. . توجه داشته باشید که می توانید اطلاعات اضافی درباره هر یک از این گزینه ها را در اسناد Nginx-RTMP بیابید.

پوشه /var/www/html/rtmp را ایجاد کنید و سپس فایل stat.xsl.gz را با دستورات زیر از حالت فشرده خارج کنید:

sudo mkdir /var/www/html/rtmp
sudo gunzip -c /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl.gz > /var/www/html/rtmp/stat.xsl`

در نهایت، برای دسترسی به صفحه آماری که اضافه کردید، باید پورت دیگری را در فایروال خود باز کنید. به طور خاص، دستورالعمل listen با پورت 8080 پیکربندی شده است، بنابراین باید یک قانون برای دسترسی به Nginx در آن پورت اضافه کنید. با این حال، احتمالاً نمی‌خواهید دیگران بتوانند به صفحه آمار شما دسترسی داشته باشند، بنابراین بهتر است فقط به آدرس IP خود اجازه دهید. دستور زیر را اجرا کنید:

sudo ufw allow from your_ip_address to any port http-alt

در مرحله بعد، باید این پیکربندی جدید را فعال کنید. قرارداد Nginx ایجاد پیوندهای نمادین (مانند میانبرها) از فایل‌های موجود در سایت‌های موجود/به پوشه دیگری به نام sites-enabled/هنگامی که تصمیم به فعال یا غیرفعال کردن آن‌ها دارید، است. با استفاده از مسیرهای کامل برای وضوح، این پیوند را ایجاد کنید:

sudo ln -s /etc/nginx/sites-available/rtmp /etc/nginx/sites-enabled/rtmp

اکنون می توانید دوباره Nginx را برای پردازش تغییرات خود بارگیری مجدد کنید:

sudo systemctl reload nginx.service

اکنون باید بتوانید در مرورگر به http://your_domain:8080/stat بروید تا صفحه آمار RTMP را ببینید. در حین پخش ویدیو از صفحه بازدید کرده و آن را بازخوانی کنید و مشاهده کنید که آمار جریان تغییر می کند.

اکنون مشاهده کرده اید که چگونه می توانید جریان ویدیوی خود را نظارت کنید و آن را به ارائه دهندگان شخص ثالث ارسال کنید. در بخش آخر، یاد خواهید گرفت که چگونه آن را مستقیماً در یک مرورگر بدون استفاده از پلتفرم‌های پخش جریانی شخص ثالث یا برنامه‌های پخش کننده رسانه مستقل ارائه کنید.

مرحله 5 – ایجاد جریان های مدرن برای مرورگرها (اختیاری)

به عنوان آخرین مرحله، ممکن است بخواهید از پروتکل های جریان جدیدتر پشتیبانی اضافه کنید تا کاربران بتوانند مستقیماً با استفاده از یک مرورگر وب، ویدیو را از سرور شما پخش کنند. دو پروتکل وجود دارد که می توانید برای ایجاد جریان های ویدئویی مبتنی بر HTTP از آنها استفاده کنید: HLS اپل و MPEG DASH. هر دو مزایا و معایبی دارند، بنابراین احتمالاً می خواهید از هر دو پشتیبانی کنید.

ماژول Nginx-RTMP از هر دو استاندارد پشتیبانی می کند. برای افزودن پشتیبانی HLS و DASH به سرور خود، باید بلوک rtmp را در فایل nginx.conf خود تغییر دهید. /etc/nginx/nginx.conf را با استفاده از nano یا ویرایشگر دلخواه خود باز کنید، سپس دستورالعمل های هایلایت شده زیر را اضافه کنید:

sudo nano /etc/nginx/nginx.conf

/etc/nginx/nginx.conf

. . .
rtmp {
        server {
. . .
                application live {
                        live on;
                        record off;
                        hls on;
                        hls_path /var/www/html/stream/hls;
                        hls_fragment 3;
                        hls_playlist_length 60;

                        dash on;
                        dash_path /var/www/html/stream/dash;
                }
        }
}
. . .

ذخیره کنید و فایل را ببندید. بعد، این را به پایین سایت های خود اضافه کنید-available/rtmp:

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

/etc/nginx/sites-available/rtmp

. . .
server {
    listen 8088;

    location / {
        add_header Access-Control-Allow-Origin *;
        root /var/www/html/stream;
    }
}

types {
    application/dash+xml mpd;
}

ذخیره کنید و فایل را ببندید. توجه داشته باشید که در اینجا از پورت 8088 استفاده کنید، که یکی دیگر از انتخاب‌های دلخواه برای این آموزش برای جلوگیری از تضاد با سرویس‌هایی است که ممکن است در پورت 80 یا 443 اجرا شود.

sudo ufw allow 8088/tcp

در نهایت، یک دایرکتوری جریان در ریشه وب خود ایجاد کنید تا با بلوک پیکربندی مطابقت داشته باشد تا Nginx بتواند فایل های لازم برای HLS و DASH را ایجاد کند:

sudo mkdir /var/www/html/stream

بارگیری مجدد Nginx:

sudo systemctl reload nginx

اکنون باید یک جریان HLS در http://your_domain:8088/hls/stream.m3u8 و یک جریان DASH در http://your_domain:8088/dash/stream.mpd موجود باشد. این نقاط پایانی هر ابرداده لازم را در بالای فید ویدیوی RTMP شما به منظور پشتیبانی از APIهای مدرن تولید می کنند.

نتیجه

گزینه های پیکربندی که در این آموزش استفاده کردید همگی در صفحه ویکی Nginx RTMP مستند شده اند. ماژول‌های Nginx معمولاً نحو مشترکی را به اشتراک می‌گذارند و مجموعه بسیار وسیعی از گزینه‌های پیکربندی را در معرض دید قرار می‌دهند، و شما می‌توانید اسناد آنها را برای تغییر هر یک از تنظیمات خود از اینجا مرور کنید.

تقریباً تمام پخش ویدیوی اینترنتی در بالای RTMP، HLS و DASH پیاده‌سازی می‌شود و با استفاده از رویکردی که در این آموزش بررسی کرده‌اید، می‌توانید جریان خود را از طریق سایر سرویس‌های پخش ارائه کنید یا به هر طریق دیگری که می‌خواهید آن را در معرض دید قرار دهید. در مرحله بعد، می توانید به پیکربندی Nginx به عنوان یک پروکسی معکوس توجه کنید تا برخی از این نقاط پایانی مختلف ویدیو را به عنوان زیر دامنه در دسترس قرار دهید.

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

برچسب‌ها:Nginx-RTMPVPS یا سرور مجازیاتصال به سرور مجازی لینوکسانواع سرور مجازیخرید سرور مجازیراه اندازی سرورراه اندازی یک سرور پخش ویدئوسرور RTMPسرور مجازی آمریکانصب و پیکربندی Nginx-RTMPوب سرور Nginx

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه ایجاد یک سرور Minecraft در اوبونتو 18.04

  ورود به سایت

معرفی

Minecraft یک بازی ویدیویی محبوب sandbox است. این برنامه که در ابتدا در سال 2009 منتشر شد، به بازیکنان اجازه می‌دهد در دنیایی سه بعدی بسازند، بسازند، بسازند و زنده بمانند. از اوایل سال 2022، این بازی پرفروش ترین بازی ویدیویی تمام دوران بود. در این آموزش شما سرور Minecraft خود را ایجاد می کنید تا شما و دوستانتان با هم بازی کنید. به طور خاص، شما بسته های نرم افزاری لازم را برای اجرای Minecraft نصب می کنید، سرور را برای اجرا پیکربندی می کنید و سپس بازی را اجرا می کنید.

همچنین، می‌توانید سرور DigitalOcean’s One-Click Minecraft: Java Edition را به‌عنوان مسیر نصب دیگری کاوش کنید.

پیش نیازها

برای پیروی از این راهنما، شما نیاز دارید:

  • یک سرور با نصب جدید اوبونتو 18.04، یک کاربر غیر ریشه با امتیازات sudo و SSH فعال.
  • یک کپی از Minecraft Java Edition که بر روی یک ماشین محلی Mac، Windows یا Linux نصب شده است.

مرحله 1 – بسته های نرم افزاری لازم را نصب کرده و فایروال را پیکربندی کنید

با شروع اولیه سرور، اولین قدم شما نصب جاوا است. برای اجرای Minecraft به آن نیاز دارید. به‌طور پیش‌فرض، اوبونتو 18.04 نسخه جدید جاوا را برای اجرای جدیدترین نسخه‌های Minecraft ارائه نمی‌کند. خوشبختانه، نگهبانان شخص ثالثی وجود دارند که به ساخت بسته‌های جاوای جدیدتر برای نسخه‌های قدیمی‌تر اوبونتو ادامه می‌دهند و می‌توانید با افزودن PPA یا آرشیو بسته‌های شخصی آن‌ها به فهرست منابع بسته خود، آن‌ها را نصب کنید. با دستور زیر می توانید این کار را انجام دهید:

sudo add-apt-repository ppa:openjdk-r/ppa

سپس، منابع بسته خود را به‌روزرسانی کنید تا این افزوده را منعکس کند:

sudo apt update

در نهایت، OpenJDK نسخه 17 جاوا، به طور خاص JRE بدون هد را نصب کنید. این نسخه حداقلی از جاوا است که پشتیبانی از برنامه های رابط کاربری گرافیکی را حذف می کند. این آن را برای اجرای برنامه های جاوا بر روی سرور ایده آل می کند:

sudo apt install openjdk-17-jre-headless

همچنین باید از نرم افزاری به نام screen برای ایجاد جلسات سرور جداشونده استفاده کنید. صفحه نمایش به شما امکان می دهد یک جلسه ترمینال ایجاد کنید و از آن جدا شوید و روند شروع شده روی آن را اجرا کنید. این مهم است زیرا اگر بخواهید سرور خود را راه اندازی کنید و سپس ترمینال خود را ببندید، این کار باعث از بین رفتن جلسه و توقف سرور شما می شود. اکنون صفحه نمایش را نصب کنید:

sudo apt install screen

اکنون که بسته‌ها را نصب کرده‌اید، باید فایروال را فعال کنیم تا ترافیک به سرور Minecraft ما وارد شود. در راه اندازی اولیه سرور که انجام دادید، فقط به ترافیک ssh اجازه دادید. اکنون باید اجازه دهید که ترافیک از طریق پورت 25565 وارد شود، که پورت پیش فرضی است که Minecraft برای اجازه دادن به اتصالات استفاده می کند. در برخی موارد ufw از قوانین ترافیکی نام‌گذاری شده استفاده می‌کند، مانند ssh، که همیشه به طور پیش‌فرض از پورت 22 استفاده می‌کند، اما در موارد کمتر رایج مانند این، شماره پورت را به صورت دستی مشخص می‌کنیم. با اجرای دستور زیر قانون فایروال لازم را اضافه کنید:

sudo ufw allow 25565

اکنون که جاوا را نصب کرده اید و فایروال خود را به درستی پیکربندی کرده اید، برنامه سرور Minecraft را از وب سایت Minecraft دانلود خواهید کرد.

مرحله 2 – دانلود آخرین نسخه Minecraft

اکنون باید نسخه فعلی سرور Minecraft را دانلود کنید. می‌توانید این کار را با رفتن به وب‌سایت Minecraft و کپی کردن پیوندی که می‌گوید دانلود minecraft_server.X.X.X.jar انجام دهید، جایی که Xها آخرین نسخه سرور هستند.

اکنون می توانید از wget و پیوند کپی شده برای دانلود برنامه سرور در سرور خود استفاده کنید:

wget https://launcher.mojang.com/v1/objects/125e5adf40c659fd3bce3e66e67a16bb49ecc1b9/server.jar

برنامه سرور به عنوان server.jar دانلود می شود. اگر نیاز به مدیریت نسخه‌های Minecraft دارید، یا اگر می‌خواهید سرور Minecraft خود را ارتقا دهید، ممکن است مفید باشد که server.jar دانلود شده را به minecraft_server_1.18.1.jar تغییر نام دهید و اعداد نسخه برجسته شده را با نسخه‌ای که تازه دانلود کرده‌اید مطابقت دهید:

mv server.jar minecraft_server_1.18.1.jar

اگر می‌خواهید نسخه قدیمی‌تر Minecraft را دانلود کنید، می‌توانید آن‌ها را در mcversions.net بایگانی کنید. اما این آموزش بر آخرین نسخه فعلی تمرکز خواهد کرد. اکنون که دانلود خود را دارید، بیایید پیکربندی سرور Minecraft خود را شروع کنیم.

مرحله 3 – پیکربندی و اجرای سرور Minecraft

اکنون که jar Minecraft را دانلود کرده اید، آماده اجرای آن هستید.

ابتدا یک جلسه صفحه نمایش را با اجرای دستور screen شروع کنید:

screen

پس از خواندن بنر ظاهر شده، Spacebar را فشار دهید. صفحه نمایش یک جلسه ترمینال مانند حالت عادی به شما ارائه می دهد. این جلسه اکنون قابل جدا شدن است، به این معنی که می‌توانید دستوری را در اینجا شروع کنید و آن را اجرا کنید.

اکنون می توانید پیکربندی اولیه خود را انجام دهید. وقتی دستور بعدی خطایی می دهد، نگران نباشید. Minecraft نصب خود را به این صورت طراحی کرده است که کاربران ابتدا باید با موافقت نامه مجوز شرکت موافقت کنند. در ادامه این کار را انجام خواهید داد:

java -Xms1024M -Xmx1024M -jar minecraft_server_1.18.1.jar nogui

قبل از بررسی خروجی این دستور، بیایید نگاهی دقیق‌تر به همه این آرگومان‌های خط فرمان که سرور شما را تنظیم می‌کنند بیاندازیم:

  • Xms1024M – این سرور را به گونه ای پیکربندی می کند که با 1024 مگابایت یا 1 گیگابایت رم در حال اجرا باشد. اگر می خواهید سرور شما با رم بیشتری شروع به کار کند، می توانید این محدودیت را افزایش دهید. هر دو M برای مگابایت و G برای گیگابایت گزینه های پشتیبانی می شوند. به عنوان مثال: Xms2G سرور را با 2 گیگابایت رم راه اندازی می کند.
  • Xmx1024M – این سرور را برای استفاده حداکثر از 1024M رم پیکربندی می کند. اگر می‌خواهید سرورتان در اندازه بزرگ‌تری اجرا شود، بازیکنان بیشتری را مجاز کنید، یا اگر احساس می‌کنید که سرورتان کند کار می‌کند، می‌توانید این محدودیت را افزایش دهید. برنامه های جاوا از این جهت منحصر به فرد هستند که همیشه از شما می خواهند حداکثر مقدار حافظه ای که می توانند استفاده کنند را مشخص کنید.
  • jar – این پرچم مشخص می کند که کدام فایل jar سرور اجرا شود.
  • nogui – این به سرور می گوید که رابط کاربری گرافیکی را راه اندازی نکند زیرا این یک سرور است و شما یک رابط کاربری گرافیکی ندارید.

اولین باری که این دستور را اجرا می کنید که معمولاً سرور شما را راه اندازی می کند، این خروجی را دریافت خواهید کرد:

 

Output

[22:05:31] [22:05:31] [main/ERROR]: Failed to load properties from file: server.properties
[22:05:31] [main/WARN]: Failed to load eula.txt
[22:05:31] [main/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

این خطاها به این دلیل ایجاد شده‌اند که سرور نمی‌تواند دو فایل لازم برای اجرا را پیدا کند: EULA (توافقنامه مجوز کاربر نهایی) که در eula.txt یافت می‌شود و فایل پیکربندی server.properties. از آنجایی که سرور قادر به یافتن این فایل ها نبود، آنها را در فهرست کاری فعلی شما ایجاد کرد. Minecraft این کار را عمدا انجام می دهد تا مطمئن شود که EULA آن را خوانده اید و با آن موافقت کرده اید.

eula.txt را در nano یا ویرایشگر متن مورد علاقه خود باز کنید:

nano eula.txt

در داخل این فایل، پیوندی به EULA Minecraft مشاهده خواهید کرد. URL را کپی کنید:

~/eula.txt

#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
#Tue Mar 24 22:05:31 UTC 2020
eula=false

URL را در مرورگر وب خود باز کنید و توافق نامه را بخوانید. سپس به ویرایشگر متن خود برگردید و آخرین خط را در eula.txt پیدا کنید. در اینجا eula=false را به eula=true تغییر دهید. سپس فایل را ذخیره کرده و ببندید. در نانو، این به این معنی است که Ctrl+X را برای خروج فشار دهید، سپس وقتی از شما خواسته شد ذخیره کنید، Y و سپس Enter کنید.

اکنون که EULA را پذیرفته اید، می توانید سرور را مطابق با مشخصات خود پیکربندی کنید.

در دایرکتوری فعلی خود، فایل server.properties ایجاد شده جدید را نیز خواهید یافت. این فایل شامل تمامی گزینه های پیکربندی سرور Minecraft شما می باشد. می‌توانید فهرست دقیقی از تمام ویژگی‌های سرور را در ویکی رسمی Minecraft پیدا کنید. قبل از راه اندازی سرور باید این فایل را با تنظیمات دلخواه خود تغییر دهید. این آموزش برخی از تنظیمات اساسی را پوشش می دهد:

nano server.properties

فایل شما به شکل زیر ظاهر می شود:

~/server.properties

#Minecraft server properties
#Thu Apr 30 23:42:29 UTC 2020
spawn-protection=16
max-tick-time=60000
query.port=25565
generator-settings=
force-gamemode=false
allow-nether=true
enforce-whitelist=false
gamemode=survival
broadcast-console-to-ops=true
enable-query=false
player-idle-timeout=0
difficulty=easy
spawn-monsters=true
broadcast-rcon-to-ops=true
op-permission-level=4
pvp=true
snooper-enabled=true
level-type=default
hardcore=false
enable-command-block=false
max-players=20
network-compression-threshold=256
resource-pack-sha1=
max-world-size=29999984
function-permission-level=2
rcon.port=25575
server-port=25565
server-ip=
spawn-npcs=true
allow-flight=false
level-name=world
view-distance=10
resource-pack=
spawn-animals=true
white-list=false
rcon.password=
generate-structures=true
online-mode=true
max-build-height=256
level-seed=
prevent-proxy-connections=false
use-native-transport=true
motd=A Minecraft Server
enable-rcon=false

بیایید نگاهی دقیق تر به برخی از مهم ترین ویژگی های این لیست بیندازیم:

دشواری (پیش‌فرض آسان) – این میزان سختی بازی را تعیین می‌کند، مانند میزان آسیب وارد شده و چگونگی تأثیر عناصر بر بازیکن شما. گزینه ها صلح آمیز، آسان، عادی و سخت هستند.
حالت بازی (بقای پیش فرض) – این حالت گیم پلی را تنظیم می کند. گزینه ها بقا، خلاقیت، ماجراجویی و تماشاگر هستند.
level-name (دنیای پیش فرض) – این نام سرور شما را تعیین می کند که در مشتری ظاهر می شود. ممکن است لازم باشد قبل از کاراکترهای خاص مانند آپوستروف، علامت معکوس وجود داشته باشد. شناخته شده است که این کاراکترهای فرار است، و زمانی که کاراکترهای خاص ممکن است به درستی در زمینه تجزیه و تحلیل نشوند، معمول است.
motd (سرور پیش فرض یک Minecraft) – پیامی که در لیست سرور مشتری Minecraft نمایش داده می شود.
pvp (پیش‌فرض درست) – نبرد بازیکن در مقابل بازیکن را فعال می‌کند. اگر روی true تنظیم شود، بازیکنان می‌توانند وارد جنگ شوند و به یکدیگر آسیب برسانند.
پس از تنظیم گزینه های مورد نظر، فایل را ذخیره کرده و ببندید.

اکنون می توانید سرور خود را با موفقیت راه اندازی کنید.

مانند دفعه قبل، بیایید سرور خود را با 1024M RAM راه اندازی کنیم. این بار، همچنین باید به Minecraft این امکان را بدهید که در صورت لزوم تا 4G از رم استفاده کند. به یاد داشته باشید که می توانید این شماره را متناسب با محدودیت های سرور یا نیازهای کاربر خود تنظیم کنید:

java -Xms1024M -Xmx4G -jar minecraft_server_1.18.1.jar nogui

چند لحظه به مقدار دهی اولیه بدهید. به زودی سرور Minecraft جدید شما شروع به تولید خروجی مشابه این خواهد کرد:

 

Output

[21:08:14] [Server thread/INFO]: Starting minecraft server version 1.15.2
[21:08:14] [Server thread/INFO]: Loading properties
[21:08:14] [Server thread/INFO]: Default game type: SURVIVAL
[21:08:14] [Server thread/INFO]: Generating keypair
[21:08:15] [Server thread/INFO]: Starting minecraft server on *:25565

پس از راه اندازی سرور، خروجی زیر را مشاهده خواهید کرد:

 

Output

[21:15:37] [Server thread/INFO]: Done (30.762s)! For help, type "help"

سرور شما اکنون در حال اجرا است و کنترل پنل مدیر سرور به شما نمایش داده شده است. راهنمای تایپ کردن را امتحان کنید:

help

خروجی به شکل زیر ظاهر می شود:

 

Output

[21:15:37] [Server thread/INFO]: /advancement (grant|revoke)
[21:15:37] [Server thread/INFO]: /ban <targets> [<reason>]
[21:15:37] [Server thread/INFO]: /ban-ip <target> [<reason>]
[21:15:37] [Server thread/INFO]: /banlist [ips|players]
...

از این ترمینال می توانید دستورات مدیر را اجرا کرده و سرور Minecraft خود را کنترل کنید. اکنون یاد خواهید گرفت که از صفحه نمایش برای فعال نگه داشتن سرور Minecraft خود پس از خروج از ترمینال استفاده کنید. سپس می توانید به مشتری Minecraft خود متصل شوید و یک بازی جدید را شروع کنید.

مرحله 4 – نگه داشتن سرور در حال اجرا

اکنون که سرور خود را روشن کرده اید، می خواهید حتی پس از قطع اتصال از جلسه SSH، همچنان در حال اجرا باشد. از آنجایی که قبلاً از صفحه استفاده کرده اید، می توانید با فشار دادن Ctrl + A + D از این جلسه جدا شوید. باید ببینید که به پوسته اصلی خود برگشته اید:

 

Output

​​ubuntu@minecraft-1804:~$ screen
[detached from 3626.pts-0.minecraft-1804]
$

این دستور را اجرا کنید تا تمام جلسات صفحه نمایش خود را ببینید:

screen -list

خروجی با شناسه جلسه خود دریافت خواهید کرد که برای از سرگیری آن جلسه باید آن را از سر بگیرید:

 

Output

There is a screen on:
        3626.pts-0.minecraft-1804 (11/16/21 22:56:33) (Detached)
1 Socket in /run/screen/S-root.

برای از سرگیری جلسه خود، پرچم -r را به فرمان صفحه ارسال کنید و سپس شناسه جلسه خود را وارد کنید:

screen -r 3626

وقتی دوباره آماده خروج از ترمینال شدید، حتما با Ctrl + A + D از جلسه جدا شده و سپس از سیستم خارج شوید.

مرحله 5 – اتصال به سرور خود از مشتری Minecraft

اکنون که سرور شما راه‌اندازی شده است، بیایید از طریق مشتری Minecraft به آن متصل شویم. سپس می توانید بازی کنید!

نسخه Minecraft Java Edition خود را اجرا کنید و Multiplayer را در منو انتخاب کنید.

 

در مرحله بعد، باید یک سرور برای اتصال به آن اضافه کنید، بنابراین روی دکمه افزودن سرور کلیک کنید.

در صفحه ویرایش اطلاعات سرور که نشان داده می شود، یک نام به سرور خود بدهید و آدرس IP سرور خود را تایپ کنید. این همان آدرس IP است که برای اتصال از طریق SSH استفاده کردید.

 

هنگامی که نام سرور و آدرس IP خود را وارد کردید، به صفحه Multiplayer بازگردانده می شوید، جایی که سرور شما اکنون لیست می شود.

از این پس سرور شما همیشه در این لیست ظاهر می شود. آن را انتخاب کرده و روی Join Server کلیک کنید.

شما در سرور خود هستید و آماده بازی هستید!

نتیجه

شما اکنون یک سرور Minecraft دارید که روی اوبونتو 18.04 اجرا می شود تا شما و همه دوستانتان با آن بازی کنید! از کاوش، کاردستی و زنده ماندن در یک دنیای خام سه بعدی لذت ببرید.

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

برچسب‌ها:Jenkinsاتصال به سرور مجازیاتصال به سرور مجازی لینوکسانواع سرور مجازیپیکربندی Webhooksخرید سرور مجازیدسترسی Jenkins به GitHubسرور اتوماسیون متن بازسرور اوبونتو 20.04

  • behnam gol mohamadi
  • ۰
  • ۰

 

نحوه راه اندازی خطوط لوله یکپارچه سازی مداوم در Jenkins در اوبونتو 20.04

 

ورود به سرور

 

 

 

معرفی

جنکینز یک سرور اتوماسیون متن باز است که برای خودکارسازی وظایف فنی تکراری درگیر در یکپارچه سازی و تحویل مداوم نرم افزار طراحی شده است. با یک اکوسیستم قوی از پلاگین ها و پشتیبانی گسترده، جنکینز می تواند مجموعه متنوعی از بارهای کاری را برای ساخت، آزمایش و استقرار برنامه ها مدیریت کند.

در راهنماهای قبلی، ما جنکینز را روی سرور اوبونتو 20.04 نصب کردیم و جنکینز را با SSL با استفاده از یک پراکسی معکوس Nginx پیکربندی کردیم. در این راهنما، نحوه راه‌اندازی Jenkins را برای آزمایش خودکار یک برنامه زمانی که تغییرات به یک مخزن منتقل می‌شوند، نشان خواهیم داد.

برای این آموزش، ما Jenkins را با GitHub ادغام خواهیم کرد تا زمانی که کد جدید به مخزن فرستاده می شود، جنکینز مطلع شود. وقتی جنکینز مطلع شد، کد را بررسی می‌کند و سپس آن را در کانتینرهای Docker آزمایش می‌کند تا محیط آزمایشی را از دستگاه میزبان جنکینز جدا کند. ما از یک نمونه برنامه Node.js برای نشان دادن نحوه تعریف فرآیند CI/CD برای یک پروژه استفاده خواهیم کرد.

پیش نیازها

برای پیروی از این راهنما، به یک سرور اوبونتو 20.04 با حداقل 1G RAM که با نصب ایمن جنکینز پیکربندی شده باشد، نیاز دارید. برای ایمن سازی مناسب رابط وب، باید یک نام دامنه به سرور جنکینز اختصاص دهید. برای یادگیری نحوه تنظیم Jenkins در قالب مورد انتظار، این راهنماها را دنبال کنید:

  • نحوه نصب جنکینز در اوبونتو 20.04
  • نحوه نصب Nginx در اوبونتو 20.04
  • چگونه Nginx را با Let’s Encrypt در اوبونتو 20.04 ایمن کنیم
  • نحوه پیکربندی جنکینز با SSL با استفاده از پروکسی معکوس Nginx

برای کنترل بهتر محیط آزمایش خود، آزمایش های برنامه خود را در کانتینرهای Docker اجرا می کنیم. پس از راه‌اندازی Jenkins، Docker را با انجام مراحل یک و دو این راهنما بر روی سرور نصب کنید:

  • نحوه نصب و استفاده از Docker در اوبونتو 20.04

هنگامی که راهنماهای فوق را کامل کردید، می توانید با این مقاله ادامه دهید.

 

کاربر Jenkins را به گروه Docker اضافه کنید

پس از رعایت پیش نیازها، هر دو جنکینز و داکر بر روی سرور شما نصب می شوند. با این حال، به طور پیش فرض، کاربر لینوکس مسئول اجرای فرآیند جنکینز نمی تواند به Docker دسترسی داشته باشد.

برای رفع این مشکل، باید کاربر jenkins را با استفاده از دستور usermod به گروه docker اضافه کنیم:

sudo usermod -aG docker jenkins

می‌توانید اعضای گروه docker را فهرست کنید تا تأیید کنید که کاربر jenkins با موفقیت اضافه شده است:

grep docker /etc/group

 

Output

docker:x:999:sammy,jenkins

برای اینکه جنکینز از عضویت جدید خود استفاده کند، باید فرآیند را مجدداً راه اندازی کنید:

sudo systemctl restart jenkins

اگر جنکینز را با افزونه‌های پیش‌فرض نصب کرده‌اید، ممکن است لازم باشد بررسی کنید که افزونه‌های docker و docker-pipeline نیز فعال هستند. برای انجام این کار، روی Manage Jenkins از نوار کناری و سپس Manage Plugins از منوی بعدی کلیک کنید. برای جستجوی افزونه های جدید، روی تب Available از منوی افزونه کلیک کنید و docker را در نوار جستجو تایپ کنید. اگر هر دو افزونه Docker Pipeline و Docker به عنوان گزینه برگردانده شدند، و انتخاب نشدند، هر دو را انتخاب کنید، و هنگامی که از شما خواسته شد، به Jenkins اجازه راه اندازی مجدد با فعال بودن افزونه های جدید را بدهید.

این باید تقریباً یک دقیقه طول بکشد و صفحه پس از آن بازخوانی می شود.

یک رمز دسترسی شخصی در GitHub ایجاد کنید

برای اینکه جنکینز پروژه های GitHub شما را تماشا کند، باید یک رمز دسترسی شخصی در حساب GitHub ما ایجاد کنید.

اگر قبلاً این کار را نکرده اید، با بازدید از GitHub و وارد شدن به حساب خود شروع کنید. پس از آن، روی نماد کاربر خود در گوشه سمت راست بالا کلیک کنید و تنظیمات را از منوی کشویی انتخاب کنید:

در صفحه زیر، بخش تنظیمات برنامه‌نویس را در منوی سمت چپ پیدا کرده و روی گزینه‌های دسترسی شخصی کلیک کنید:

در صفحه بعد روی دکمه Generate new token کلیک کنید:

شما به صفحه ای هدایت می شوید که در آن می توانید محدوده توکن جدید خود را مشخص کنید.

در کادر توضیحات Token، توضیحی اضافه کنید که به شما امکان می دهد بعداً آن را تشخیص دهید:

در بخش Select scopes، کادرهای repo:status، repo:public_repo و admin:org_hook را بررسی کنید. اینها به جنکینز اجازه می‌دهد تا وضعیت‌های commit را به‌روزرسانی کند و برای پروژه وب هوک ایجاد کند. اگر از یک مخزن خصوصی استفاده می کنید، باید مجوز عمومی مخزن را به جای موارد فرعی مخزن انتخاب کنید:

 

وقتی کارتان تمام شد، روی Generate token در پایین کلیک کنید.

شما به صفحه فهرست نشانه های دسترسی شخصی هدایت می شوید و رمز جدید شما نمایش داده می شود:

 

اکنون توکن را کپی کنید تا بعداً بتوانیم به آن ارجاع دهیم. همانطور که پیام نشان می دهد، پس از خروج از این صفحه، راهی برای بازیابی رمز وجود ندارد.

اکنون که یک نشانه دسترسی شخصی برای حساب GitHub خود دارید، می‌توانیم جنکینز را برای تماشای مخزن پروژه شما پیکربندی کنیم.

رمز دسترسی شخصی GitHub را به جنکینز اضافه کنید

اکنون که یک توکن داریم، باید آن را به سرور جنکینز خود اضافه کنیم تا بتواند به طور خودکار وب هوک ها را راه اندازی کند. با استفاده از حساب مدیریتی که در حین نصب پیکربندی کرده اید، وارد رابط وب جنکینز خود شوید.

روی نام کاربری خود در گوشه سمت راست بالا کلیک کنید تا به تنظیمات کاربری خود دسترسی پیدا کنید و از آنجا روی Credentials در منوی سمت چپ کلیک کنید. :

در صفحه بعد، روی فلش کنار (جهانی) در محدوده جنکینز کلیک کنید. در کادری که ظاهر می‌شود، روی Add credentials کلیک کنید:

برای افزودن اعتبارنامه جدید به فرمی هدایت خواهید شد.

در زیر منوی کشویی Kind، Secret text را انتخاب کنید. در قسمت Secret، رمز دسترسی شخصی GitHub خود را جایگذاری کنید. قسمت توضیحات را پر کنید تا بتوانید بعداً این ورودی را شناسایی کنید. می توانید Scope را به صورت Global و قسمت ID را خالی بگذارید:

وقتی کارتان تمام شد روی دکمه OK کلیک کنید.

اکنون می‌توانید برای کمک به پیکربندی، به این اعتبارنامه‌ها از سایر بخش‌های Jenkins مراجعه کنید.

دسترسی Jenkins به GitHub را تنظیم کنید

در داشبورد اصلی جنکینز، روی Manage Jenkins در منوی سمت چپ کلیک کنید:

در لیست پیوندها در صفحه زیر، روی Configure System کلیک کنید:

در میان گزینه های صفحه بعد حرکت کنید تا قسمت GitHub را پیدا کنید. روی دکمه Add GitHub Server کلیک کنید و سپس GitHub Server را انتخاب کنید:

بخش برای درخواست برخی اطلاعات بیشتر گسترش می یابد. در منوی کشویی Credentials، رمز دسترسی شخصی GitHub خود را که در بخش آخر اضافه کردید انتخاب کنید:

روی دکمه اتصال تست کلیک کنید. جنکینز یک تماس آزمایشی API با حساب شما برقرار می کند و اتصال را تأیید می کند:

پس از اتمام کار، روی دکمه ذخیره کلیک کنید تا تغییرات خود را اعمال کنید.

برنامه نمایش را در حساب GitHub خود تنظیم کنید

برای نشان دادن نحوه استفاده از جنکینز برای آزمایش یک برنامه، از یک برنامه “Hello world” ایجاد شده با Hapi.js استفاده خواهیم کرد. از آنجایی که ما Jenkins را برای واکنش به فشارهای مخزن تنظیم می کنیم، باید کپی خود را از کد نمایشی داشته باشید.

از مخزن پروژه دیدن کنید و روی دکمه Fork در گوشه سمت راست بالا کلیک کنید تا یک کپی از مخزن در حساب خود ایجاد کنید:

یک کپی از مخزن به حساب شما اضافه می شود.

مخزن حاوی یک فایل package.json است که وابستگی های زمان اجرا و توسعه و همچنین نحوه اجرای مجموعه آزمایشی ارائه شده را تعریف می کند. وابستگی ها را می توان با اجرای npm install نصب کرد و تست ها را می توان با استفاده از تست npm اجرا کرد.

ما یک Jenkinsfile را نیز به مخزن اضافه کرده ایم. جنکینز این فایل را می‌خواند تا اقداماتی را که باید در مقابل مخزن برای ساخت، آزمایش یا استقرار اجرا شود، تعیین کند. با استفاده از نسخه اعلانی Jenkins Pipeline DSL نوشته شده است.

Jenkinsfile موجود در مخزن hello-hapi به شکل زیر است:

Jenkinsfile

#!/usr/bin/env groovy

pipeline {

    agent {
        docker {
            image 'node'
            args '-u root'
        }
    }

    stages {
        stage('Build') {
            steps {
                echo 'Building...'
                sh 'npm install'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
                sh 'npm test'
            }
        }
    }
}

خط لوله شامل کل تعریفی است که جنکینز ارزیابی خواهد کرد. در داخل، ما یک بخش agent داریم که مشخص می کند اقدامات در خط لوله کجا اجرا می شوند. برای جداسازی محیط‌هایمان از سیستم میزبان، در کانتینرهای Docker که توسط عامل docker مشخص شده است آزمایش خواهیم کرد.

از آنجایی که Hapi.js یک چارچوب برای Node.js است، از تصویر گره Docker به عنوان پایه خود استفاده خواهیم کرد. کاربر ریشه را در ظرف مشخص می‌کنیم تا کاربر بتواند هم‌زمان در جلد ضمیمه شده حاوی کد بررسی‌شده و هم در حجمی که اسکریپت خروجی خود را روی آن می‌نویسد بنویسد.

در مرحله بعد، فایل دو مرحله، یعنی تقسیمات منطقی کار را تعریف می کند. ما نام اولی را «ساخت» و دومی را «تست» گذاشته‌ایم. مرحله ساخت یک پیام تشخیصی را چاپ می کند و سپس npm install را برای به دست آوردن وابستگی های مورد نیاز اجرا می کند. مرحله تست پیام دیگری را چاپ می کند و سپس تست ها را همانطور که در فایل package.json تعریف شده است اجرا می کند.

اکنون که یک مخزن با یک Jenkinsfile معتبر دارید، می‌توانیم Jenkins را برای تماشای این مخزن راه‌اندازی کنیم و پس از ایجاد تغییرات، فایل را اجرا کنیم.

یک خط لوله جدید در جنکینز ایجاد کنید

در مرحله بعد، می‌توانیم جنکینز را برای استفاده از نشانه دسترسی شخصی GitHub برای تماشای مخزن خود تنظیم کنیم.

در داشبورد اصلی جنکینز، روی آیتم جدید در منوی سمت چپ کلیک کنید:

در قسمت Enter an item name نامی را برای خط لوله جدید خود وارد کنید. پس از آن، Pipeline را به عنوان نوع مورد انتخاب کنید:

برای ادامه روی دکمه OK در پایین کلیک کنید.

در صفحه بعدی، کادر پروژه GitHub را علامت بزنید. در قسمت Project url که ظاهر می شود، URL مخزن GitHub پروژه خود را وارد کنید.

سپس، در بخش Build Triggers، محرک قلاب GitHub را برای کادر نظرسنجی GITScm بررسی کنید:

در قسمت Pipeline، باید به Jenkins بگوییم که خط لوله تعریف شده در Jenkinsfile را در مخزن ما اجرا کند. نوع Definition را از SCM به Pipeline script تغییر دهید.

در بخش جدیدی که ظاهر می شود، Git را در منوی SCM انتخاب کنید. در فیلد URL مخزن که ظاهر می‌شود، دوباره URL را به فورک مخزن وارد کنید:

وقتی کارتان تمام شد، روی دکمه ذخیره در پایین صفحه کلیک کنید.

انجام ساخت اولیه و پیکربندی Webhooks

هنگامی که خط لوله را برای مخزن در رابط تعریف می کنید، جنکینز به طور خودکار وب هوک ها را پیکربندی نمی کند. برای اینکه جنکینز را تحریک کنیم تا هوک های مناسب را تنظیم کند، باید اولین بار یک ساخت دستی انجام دهیم.

در صفحه اصلی خط لوله خود، روی Build Now در منوی سمت چپ کلیک کنید:

ساخت جدید برنامه ریزی خواهد شد. در کادر Build History در گوشه سمت چپ پایین، یک ساخت جدید باید در یک لحظه ظاهر شود. علاوه بر این، نمای مرحله ای در ناحیه اصلی رابط شروع به ترسیم می کند. با تکمیل مراحل مختلف، این پیشرفت اجرای آزمایشی شما را ردیابی می کند:

در کادر Build History، روی عدد مرتبط با ساخت کلیک کنید تا به صفحه جزئیات ساخت بروید. از اینجا، می‌توانید روی دکمه خروجی کنسول در منوی سمت چپ کلیک کنید تا جزئیات مراحل اجرا شده را ببینید:

پس از اتمام کار، روی آیتم بازگشت به پروژه در منوی سمت چپ کلیک کنید تا به نمای خط لوله اصلی بازگردید.

اکنون که یک بار پروژه را ساخته‌ایم، می‌توانیم از جنکینز بخواهیم که وب هوک‌ها را برای پروژه ما ایجاد کند. روی Configure در منوی سمت چپ خط لوله کلیک کنید:

هیچ تغییری در این صفحه لازم نیست، فقط روی دکمه ذخیره در پایین کلیک کنید. اکنون که جنکینز از فرآیند ساخت اولیه اطلاعاتی در مورد پروژه دارد، هنگامی که صفحه را ذخیره می کنید، یک هوک در پروژه GitHub ما ثبت می کند.

می‌توانید با رفتن به مخزن GitHub خود و کلیک کردن روی دکمه تنظیمات، این موضوع را تأیید کنید. در صفحه بعد از منوی کناری روی Webhooks کلیک کنید. شما باید وب هوک سرور جنکینز خود را در رابط اصلی ببینید:

 

اگر به هر دلیلی Jenkins نتوانست قلاب را ثبت کند (مثلاً به دلیل تغییرات API بالادست یا قطعی بین Jenkins و Github)، می‌توانید به سرعت خودتان یکی را با کلیک کردن روی Add webhook و اطمینان از اینکه URL Payload روی https:// تنظیم شده است اضافه کنید. my-jenkins-server:8080/github-webhook و نوع محتوا روی application/json تنظیم شده است، سپس دوباره روی Add webhook در پایین دستور کلیک کنید.

 

اکنون، هنگامی که تغییرات جدید را در مخزن خود اعمال می کنید، جنکینز مطلع می شود. سپس کد جدید را می کشد و با استفاده از همان روش دوباره آن را آزمایش می کند.

برای تقریبی این، در صفحه مخزن ما در GitHub، می توانید روی دکمه ایجاد فایل جدید در سمت چپ دکمه سبز رنگ Clone یا دانلود کلیک کنید:

در صفحه بعد، یک نام فایل و برخی از محتوای ساختگی را انتخاب کنید:

وقتی کارتان تمام شد، روی دکمه Commit new file در پایین کلیک کنید.

اگر به رابط Jenkins خود بازگردید، خواهید دید که یک ساخت جدید به طور خودکار شروع شده است:

می‌توانید با ایجاد تعهد به یک کپی محلی از مخزن و بازگرداندن آن به GitHub، ساخت‌های اضافی را شروع کنید.

نتیجه

در این راهنما، ما جنکینز را برای تماشای یک پروژه GitHub پیکربندی کرده ایم و به طور خودکار هر تغییر جدیدی را که انجام می شود آزمایش می کنیم. جنکینز کد را از مخزن می کشد و سپس مراحل ساخت و آزمایش را از داخل کانتینرهای Docker ایزوله اجرا می کند. کد به دست آمده را می توان با افزودن دستورالعمل های اضافی به همان Jenkinsfile مستقر یا ذخیره کرد.

 

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

Jenkinsاتصال به سرور مجازیاتصال به سرور مجازی لینوکسانواع سرور مجازیپیکربندی Webhooksخرید سرور مجازیدسترسی Jenkins به GitHubسرور اتوماسیون متن بازسرور اوبونتو 20.04

  • behnam gol mohamadi