سرور مجازی

۲۱ مطلب با کلمه‌ی کلیدی «خرید سرور» ثبت شده است

  • ۰
  • ۰

نحوه ایجاد قوانین، جدول زمانی، و موارد از رویدادهای Suricata با استفاده از برنامه های SIEM Kibana

ورود به سایت

معرفی

آموزش های قبلی در این مجموعه شما را با نحوه نصب و پیکربندی Suricata راهنمایی کردند. آنها همچنین توضیح دادند که چگونه از Filebeat برای ارسال هشدار از سرور Suricata به سرور Elastic Stack استفاده کنید تا با عملکرد داخلی اطلاعات امنیتی و مدیریت رویداد (SIEM) از آن استفاده کنید.

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

در پایان این آموزش شما یک سیستم SIEM خواهید داشت که می توانید از آن برای ردیابی و بررسی رویدادهای امنیتی در تمام سرورهای شبکه خود استفاده کنید.

پیش نیازها

اگر این مجموعه آموزشی را دنبال کرده اید، باید از قبل یک سرور با حداقل 4 گیگابایت رم و 2 CPU و یک کاربر غیر روت پیکربندی شده داشته باشید. برای اهداف این راهنما، بسته به سیستم عامل انتخابی خود، می‌توانید با پیروی از راهنماهای اولیه راه‌اندازی سرور ما برای Ubuntu 20.04، Debian 11 یا Rocky Linux 8، این را تنظیم کنید.

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

اوبونتو 20.04: نحوه نصب Suricata در اوبونتو 20.04
Debian 11: نحوه نصب Suricata در Debian 11
راکی لینوکس 8: نحوه نصب Suricata در راکی ​​لینوکس 8
همچنین به سروری نیاز دارید که Elastic Stack را اجرا کرده و پیکربندی شده باشد تا Filebeat بتواند گزارش‌ها را از سرور Suricata شما به Elasticsearch ارسال کند. اگر نیاز به ایجاد یک سرور Elastic Stack دارید، از یکی از آموزش های لیست زیر که با سیستم عامل شما مطابقت دارد استفاده کنید:

اوبونتو 20.04: نحوه ایجاد یک سیستم اطلاعات امنیتی و مدیریت رویداد (SIEM) با Suricata و Elastic Stack در اوبونتو 20.04
دبیان 11: نحوه ایجاد یک سیستم اطلاعات امنیتی و مدیریت رویداد (SIEM) با Suricata و Elastic Stack در Debian 11
Rocky Linux 8: نحوه ایجاد یک سیستم اطلاعات امنیتی و مدیریت رویداد (SIEM) با Suricata و Elastic Stack در Rocky Linux 8
اطمینان حاصل کنید که می توانید در سرور Elasticsearch خود به Kibana وارد شوید و رویدادهایی در داشبوردهای مختلف Suricata Alerts و Events وجود دارد.

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

مرحله 1 – فعال کردن کلیدهای API در Elasticsearch

قبل از ایجاد قوانین، هشدارها و جدول زمانی در Kibana، باید تنظیمات ماژول امنیتی xpack را فعال کنید.

فایل /etc/elasticsearch/elasticsearch.yml خود را با nano یا ویرایشگر دلخواه خود باز کنید.

sudo nano /etc/elasticsearch/elasticsearch.yml

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

/etc/elasticsearch/elasticsearch.yml

. . .
discovery.type: single-node
xpack.security.enabled: true
xpack.security.authc.api_key.enabled: true

پس از اتمام ویرایش فایل را ذخیره کرده و ببندید. اگر از نانو استفاده می‌کنید، می‌توانید این کار را با CTRL+X انجام دهید، سپس Y و ENTER را تأیید کنید.

اکنون Elasticsearch را مجددا راه اندازی کنید تا تنظیمات جدید اعمال شود.

sudo systemctl restart elasticsearch.service

اکنون آماده پیکربندی قوانین، بررسی هشدارها و ایجاد جدول زمانی و موارد در Kibana هستید.

مرحله 2 – اضافه کردن قوانین به Kibana

برای استفاده از عملکرد SIEM Kibana با داده‌های رویداد Suricata، باید قوانینی ایجاد کنید که هشدارهایی درباره رویدادهای دریافتی ایجاد کند. برای ایجاد یا وارد کردن قوانین، از داشبورد قوانین در صفحه برنامه امنیتی Kibana دیدن کنید.

برای اهداف این آموزش، ما از امضاهای زیر برای شناسایی ترافیک هدایت شده به سرور در پورت های ناهمخوان (به ترتیب ترافیک SSH، HTTP و TLS) استفاده خواهیم کرد:

Example Suricata Signature

alert ssh any any -> 203.0.113.5 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000000;)
alert ssh any any -> 2001:DB8::1/32 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000001;)

alert http any any -> 203.0.113.5 !80 (msg:"HTTP REQUEST on non-HTTP port"; classtype:misc-activity; sid:1000002;)
alert http any any -> 2001:DB8::1/32 !80 (msg:"HTTP REQUEST on non-HTTP port"; classtype:misc-activity; sid:1000003;)

alert tls any any -> 203.0.113.5 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; classtype:misc-activity; sid:1000004;)
alert tls any any -> 2001:DB8::1/32 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; classtype:misc-activity; sid:1000005;)

اگر از امضاهای خود یا از یک مجموعه قوانین استفاده می‌کنید، مطمئن شوید که می‌توانید هشدار ایجاد کنید و می‌توانید به رویدادهای مربوطه در داشبوردهای پیش‌فرض Suricata در Kibana دسترسی داشته باشید.

اکنون به صفحه قوانین در برنامه امنیتی Kibana مراجعه کنید http://localhost:5601/app/security/rules/. روی دکمه ایجاد قانون جدید در سمت راست بالای صفحه کلیک کنید.

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

Kibana Query Language Input

rule.id: "1000000" or rule.id :"1000001"

مطمئن شوید که مقادیر rule.id شما با مقدار جانبی Suricata برای حمله یا حملاتی که می‌خواهید درباره آن هشدار دهید مطابقت داشته باشد.

پیش‌نمایش سریع Query را به Last Month تغییر دهید و سپس روی Preview Results کلیک کنید. با فرض اینکه رویدادهای منطبقی را در گزارش های Suricata خود داشته باشید، صفحه با نموداری که هشدارهای ماه گذشته را نشان می دهد در جای خود به روز می شود. صفحه شما باید شبیه تصویر زیر باشد:

روی Continue کلیک کنید تا به فیلد Rule Name که برای هر قانون اضافه می‌کنید، نامی اضافه کنید. یک نام به قسمت Rule Name اضافه کنید. در این مثال از توضیحات پیام از قانون Suricata SSH TRAFFIC در پورت غیر SSH استفاده می کنیم. یک توضیح برای قانون نیز اضافه کنید. ما در این مثال از بررسی تلاش برای اتصال SSH در پورت های غیر استاندارد استفاده خواهیم کرد.

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

پس از افزودن نام قانون، توضیحات و فیلدهای اضافی اختیاری، روی Continue کلیک کنید تا به مرحله 3 ایجاد قانون بروید.

تنظیمات بعدی قانون زمانبندی را با مقادیر پیش فرض خود رها کنید و روی Continue کلیک کنید.

در نهایت در مرحله Rule actions روی Create & activate rule کلیک کنید.

شما به صفحه جدیدی هدایت می شوید که جزئیات مربوط به قانون را نشان می دهد:

اگر قوانین دیگری از Suricata وجود دارد که می‌خواهید درباره آنها هشدار داده شود، مراحل بالا را تکرار کنید و sid امضا را در قسمت query custom.id Kibana جایگزین کنید.

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

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

اکنون که قانون یا قوانینی برای ایجاد هشدارها در برنامه SIEM کیبانا پیکربندی شده‌اید، به راهی برای گروه‌بندی و مدیریت بیشتر هشدارها نیاز دارید. برای شروع، از داشبورد هشدارهای Kibana دیدن کنید: http://127.0.0.1:5601/app/security/alerts.

مطمئن شوید که مقداری ترافیک نامعتبر ایجاد کرده اید که با امضای Suricata یا امضاهایی که استفاده می کنید مطابقت دارد. به عنوان مثال، می توانید با اجرای دستوری مانند زیر از دستگاه محلی خود، قانون sid:1000000 Suricata را فعال کنید:

ssh -p 80 your_server_ip

این دستور سعی می کند به جای پورت پیش فرض 22، با استفاده از SSH در پورت 80 به سرور شما متصل شود و باید یک هشدار را راه اندازی کند. ممکن است چند دقیقه طول بکشد تا هشدار در Kibana نشان داده شود، زیرا باید توسط Elasticsearch و قانونی که در Kibana ایجاد کرده‌اید پردازش شود.

در مرحله بعد، فیلد comnunity_id را به جدول هشدارهایی که در پایین صفحه نمایش داده می شود، اضافه می کنید. از اولین آموزش به یاد بیاورید که این فیلد توسط Suricata تولید می شود و نشان دهنده آدرس های IP منحصر به فرد و پورت های موجود در یک جریان شبکه است. روی دکمه فیلدها کلیک کنید و در کادر محاوره‌ای که ظاهر می‌شود، network.community_id را وارد کنید و سپس کادر کنار نام فیلد را علامت بزنید:

مدال را ببندید و فیلد به جدول هشدارها اضافه می شود. اکنون ماوس را روی هر یک از هشدارهایی که دارای همان مقدار community_id هستند نگه دارید و روی نماد بررسی جدول زمانی افزودن کلیک کنید. این اطمینان حاصل می کند که همه هشدارهایی که Community_id را به اشتراک می گذارند که Suricata به رویداد اضافه کرده است برای بررسی بیشتر به یک جدول زمانی اضافه می شود:

سپس روی پیوند Untitled Timeline در پایین سمت چپ مرورگر خود کلیک کنید. این پیوند شما را به صفحه ای می برد که فقط هشدارهایی را با قسمت Suricata community_id نشان می دهد که می خواهید بررسی کنید.

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

روی دکمه All data sources در سمت راست صفحه کلیک کنید و دکمه Detection Alerts را انتخاب کنید، سپس روی Save کلیک کنید. این گزینه جدول زمانی را محدود می کند تا فقط هشدارهایی را که Kibana تولید می کند نمایش دهد. بدون این گزینه، هشدارهای Suricata نیز در جدول زمانی گنجانده خواهد شد.

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

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

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

در مرحله بعدی، از نماهای جدول زمانی رویدادها برای پیوست کردن هشدارها به اپلیکیشن Kibana’s Cases در مجموعه ابزارهای SIEM استفاده خواهید کرد.

مرحله 4 – ایجاد و مدیریت موارد SIEM

در مرحله قبل، یک جدول زمانی ایجاد کردید تا هشدارها و بسته‌ها را با هم بر اساس فیلد Community_id Suricata گروه‌بندی کنید. در این بخش از آموزش شما یک Case برای ردیابی و مدیریت هشدارها در جدول زمانی خود ایجاد می کنید.

برای ایجاد یک مورد جدید از جدول زمانی خود، مطمئن شوید که در یک صفحه جدول زمانی در مرورگر خود هستید. روی دکمه Attach to case در سمت راست بالای صفحه تایم لاین و سپس دکمه Attach to new case را از لیست ظاهر شده کلیک کنید.

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

فیلدها را با یک نام توصیفی و تگ یا تگ های اختیاری پر کنید. در این مثال، نام مورد SSH TRAFFIC در پورت غیر SSH از 203.0.113.5 است، زیرا این نوع ترافیک و میزبان خاصی است که ما در حال بررسی آن هستیم. با بسیاری از رویدادها برای بررسی در سیستم SIEM شما، یک طرح نامگذاری مانند این به شما کمک می کند موارد، جدول زمانی و هشدارها را پیگیری کنید زیرا نام با هشدار Kibana و فیلد پیام امضای Suricata مطابقت دارد.

به پایین صفحه بروید و روی دکمه Create case کلیک کنید. مرورگر شما در صفحه ای قرار می گیرد که کیس ذخیره شده را نشان می دهد. شما می توانید نظرات را در قالب Markdown با اطلاعات اضافی اضافه کنید و همچنین مورد را از این صفحه ویرایش کنید.

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

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

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

اکنون با استفاده از منوی پیمایش در سمت چپ صفحه، دوباره از برنامه Cases در Kibana] (http://localhost:5601/app/security/cases) دیدن کنید. روی پرونده خود کلیک کنید و توجه داشته باشید که چگونه هشدارهایی که اضافه کرده اید در جزئیات پرونده فهرست شده اند:

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

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

نتیجه

در این آموزش شما سیستم Suricata و Elastic Stack SIEM موجود خود را با افزودن قوانینی به Kibana که هشدارهایی را در مورد ترافیک خاص مورد علاقه ایجاد می کند، ساخته اید. شما همچنین یک جدول زمانی یا جدول زمانی ایجاد کردید تا مجموعه ای از هشدارها را بر اساس Community_id گروه بندی کنید. در نهایت، یک مورد ایجاد کردید و جدول زمانی خود را به همراه هشدارهای فردی مورد علاقه به آن مرتبط کردید.

با وجود این سیستم SIEM، اکنون می توانید رویدادهای امنیتی را در سراسر سیستم های خود تقریباً در هر مقیاسی ردیابی کنید. همانطور که با Suricata بیشتر آشنا می شوید و هشدارهایی را که در Kibana SIEM شما ایجاد می کند ردیابی می کنید، می توانید هشدارهای Suricata و اقدامات پیش فرضی را که مطابق با شبکه خاص شما انجام می دهد سفارشی کنید.

برای داشتن یک رابط کاربری سبک تر SIEM، ممکن است به EveBox نیز علاقه مند باشید، که تمام داده های رویداد Suricata و عملکرد SIEM را در یک صفحه ارائه می دهد.

 

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/

برچسب‌ها:Rocky Linux 8اتصال به سرور مجازیاوبونتو 20.04ایجاد سرور مجازیخرید سرورخرید سرور مجازی آمریکاسیستم SIEMمدیریت موارد SIEMنصب و پیکربندی Suricata

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از PostgreSQL با برنامه جنگو در اوبونتو 20.04

ورود به سایت

معرفی

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

در این راهنما، PostgreSQL (که اغلب به آن Postgres گفته می شود) را برای استفاده در برنامه های جنگو نصب و پیکربندی می کنید. شما نرم افزار لازم را نصب می کنید، اعتبار پایگاه داده را برای برنامه ما ایجاد می کنید و سپس یک پروژه جنگو جدید را برای استفاده از این باطن شروع و پیکربندی می کنید.

پیش نیازها

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

وقتی برای ادامه آماده شدید، به عنوان کاربر sudo خود وارد شوید.

مرحله 1 – نصب کامپوننت ها از مخازن اوبونتو

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

شما از پایتون 3 استفاده خواهید کرد که با اوبونتو 20.04 عرضه می شود. نصب را با تایپ کردن شروع کنید:

sudo apt update
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib

با پایان نصب، می توانید به پایگاه داده بروید.

مرحله 2 – ایجاد یک پایگاه داده و کاربر پایگاه داده

به طور پیش فرض، Postgres از یک طرح احراز هویت به نام “تأیید هویت همتا” برای اتصالات محلی استفاده می کند. اساساً، این بدان معنی است که اگر نام کاربری سیستم عامل کاربر با نام کاربری معتبر Postgres مطابقت داشته باشد، آن کاربر می تواند بدون احراز هویت بیشتر وارد شود.

در طول نصب Postgres، یک کاربر سیستم عامل به نام postgres ایجاد شد تا با کاربر مدیریت PostgreSQL مطابقت داشته باشد. برای انجام کارهای اداری باید از این کاربر استفاده کنید. با گزینه -u می توانید از sudo و pass در نام کاربری استفاده کنید.

با تایپ کردن، وارد یک جلسه تعاملی Postgres شوید:

sudo -u postgres psql

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

CREATE DATABASE myproject;

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

CREATE USER myprojectuser WITH PASSWORD ‘password’;

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

ALTER ROLE myprojectuser SET client_encoding TO ‘utf8’;
ALTER ROLE myprojectuser SET default_transaction_isolation TO ‘read committed’;
ALTER ROLE myprojectuser SET timezone TO ‘UTC’;

شما کدگذاری پیش‌فرض را روی UTF-8 تنظیم می‌کنید که جنگو انتظار دارد. شما همچنین طرح پیش‌فرض جداسازی تراکنش را روی «خواندن تعهد» تنظیم می‌کنید که خواندن تراکنش‌های غیرمتعهد را مسدود می‌کند. در نهایت، شما در حال تنظیم منطقه زمانی هستید. به‌طور پیش‌فرض، پروژه‌های جنگو شما برای استفاده از UTC تنظیم می‌شوند. اینها همه توصیه هایی از خود پروژه جنگو هستند.

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

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

برای بازگشت به جلسه پوسته کاربر postgres از اعلان SQL خارج شوید:

\q

جنگو را در یک محیط مجازی نصب کنید

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

برای نصب virtualenv تایپ کنید:

sudo pip3 install virtualenv

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

mkdir ~/myproject

cd ~/myproject

شما می توانید با تایپ کردن یک محیط مجازی برای ذخیره نیازمندی های Python پروژه جنگو خود ایجاد کنید:

python3 -m virtualenv myprojectenv

این یک کپی محلی از پایتون و یک دستور pip محلی را در فهرستی به نام myprojectenv در فهرست پروژه شما نصب می کند.

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

source myprojectenv/bin/activate

اعلان شما تغییر می کند تا نشان دهد که اکنون در محیط مجازی کار می کنید. چیزی شبیه این (myprojectenv)user@host:~/myproject$ خواهد بود.

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

pip install Django psycopg2

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

django-admin startproject myproject .

تنظیمات پایگاه داده جنگو را پیکربندی کنید

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

فایل اصلی تنظیمات پروژه جنگو را که در دایرکتوری پروژه فرزند قرار دارد باز کنید:

nano ~/myproject/myproject/settings.py

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

~/myproject/myproject/settings.py

. . .

DATABASES = {
    'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

. . .

این در حال حاضر برای استفاده از SQLite به عنوان پایگاه داده پیکربندی شده است. شما باید این را تغییر دهید تا پایگاه داده PostgreSQL شما به جای آن استفاده شود.

ابتدا موتور را طوری تغییر دهید که به جای آداپتور sqlite3 از آداپتور postgresql استفاده کند. برای NAME، از نام پایگاه داده خود (myproject در این مثال) استفاده کنید. همچنین باید اعتبار ورود به سیستم را اضافه کنید. برای اتصال به نام کاربری، رمز عبور و میزبان نیاز دارید. گزینه پورت را اضافه کرده و آن را خالی می گذارید تا پیش فرض انتخاب شود:

~/myproject/myproject/settings.py

. . .

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

. . .

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

در قطعه زیر، چند نمونه نظر داده شده برای نشان دادن وجود دارد:

~/myproject/myproject/settings.py

. . .
# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
# To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['your_server_domain_or_IP']

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

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

پایگاه داده را مهاجرت کنید و پروژه خود را آزمایش کنید.

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

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

cd ~/myproject

python manage.py makemigrations

python manage.py migrate

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

python manage.py createsuperuser

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

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

با تایپ کردن:

sudo ufw allow 8000

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

python manage.py runserver 0.0.0.0:8000

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

http://server_domain_or_IP:8000

شما باید صفحه فهرست پیش فرض را ببینید:

/admin را به انتهای URL اضافه کنید و باید بتوانید به صفحه ورود به رابط مدیریت دسترسی داشته باشید:

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

پس از اتمام بررسی، می توانید با زدن CTRL-C در پنجره ترمینال، سرور توسعه را متوقف کنید.

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

نتیجه

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

 

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/

برچسب‌ها:اوبونتو 20.04برنامه جنگوبرنامه های پایتونخرید سرورخرید سرور مجازیخرید سرور مجازی آمریکاسرور اوبونتو 20.04نحوه استفاده از PostgreSQLنرم‌افزار پایگاه داده

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه نصب Nginx در اوبونتو 20.04

ورود به سایت

معرفی

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

در این راهنما، نحوه نصب Nginx بر روی سرور اوبونتو 20.04، تنظیم فایروال، مدیریت فرآیند Nginx و راه اندازی بلوک های سرور برای میزبانی بیش از یک دامنه از یک سرور واحد را مورد بحث قرار خواهیم داد.

پیش نیازها

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

هنگامی که یک حساب کاربری در دسترس دارید، برای شروع به عنوان کاربر غیر روت وارد شوید.

مرحله 1 – نصب Nginx

از آنجایی که Nginx در مخازن پیش‌فرض اوبونتو موجود است، می‌توان آن را از این مخازن با استفاده از سیستم بسته‌بندی apt نصب کرد.

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

sudo apt update

sudo apt install nginx

پس از پذیرش رویه، apt Nginx و هر گونه وابستگی مورد نیاز را روی سرور شما نصب خواهد کرد.

مرحله 2 – تنظیم فایروال

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

پیکربندی های برنامه ای را که ufw می داند چگونه با آنها کار کند با تایپ کردن فهرست کنید:

sudo ufw app list

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

 

Output

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

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

  • Nginx Full: این نمایه هم پورت 80 (ترافیک وب عادی و رمزگذاری نشده) و هم پورت 443 (ترافیک رمزگذاری شده TLS/SSL) را باز می کند.
  • Nginx HTTP: این نمایه فقط پورت 80 را باز می کند (ترافیک وب عادی و رمزگذاری نشده)
  • Nginx HTTPS: این نمایه فقط پورت 443 را باز می کند (ترافیک رمزگذاری شده TLS/SSL)

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

شما می توانید این را با تایپ کردن فعال کنید:

sudo ufw allow ‘Nginx HTTP’

می توانید با تایپ کردن این تغییر را تأیید کنید:

sudo ufw status

خروجی نشان می دهد که کدام ترافیک HTTP مجاز است:

 

Output

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

مرحله 3 – وب سرور خود را بررسی کنید

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

می‌توانیم با تایپ کردن:

systemctl status nginx

 

Output

● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-04-20 16:08:19 UTC; 3 days ago
     Docs: man:nginx(8)
 Main PID: 2369 (nginx)
    Tasks: 2 (limit: 1153)
   Memory: 3.5M
   CGroup: /system.slice/nginx.service
           ├─2369 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           └─2380 nginx: worker process

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

می‌توانید با پیمایش به آدرس IP سرور خود، به صفحه فرود پیش‌فرض Nginx دسترسی پیدا کنید تا تأیید کنید که نرم‌افزار به درستی اجرا می‌شود. اگر آدرس IP سرور خود را نمی دانید، می توانید آن را با استفاده از ابزار icanhazip.com پیدا کنید، که آدرس IP عمومی شما را همانطور که از مکان دیگری در اینترنت دریافت کرده اید به شما می دهد:

curl -4 icanhazip.com

وقتی آدرس IP سرور خود را دارید، آن را در نوار آدرس مرورگر خود وارد کنید:

http://your_server_ip

شما باید صفحه فرود پیش فرض Nginx را دریافت کنید:

اگر در این صفحه هستید، سرور شما به درستی کار می کند و آماده مدیریت است.

مرحله 4 – مدیریت فرآیند Nginx

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

برای متوقف کردن وب سرور خود، تایپ کنید:

sudo systemctl stop nginx

برای راه اندازی وب سرور در صورت توقف، تایپ کنید:

sudo systemctl start nginx

برای توقف و سپس شروع مجدد سرویس، تایپ کنید:

sudo systemctl restart nginx

اگر فقط تغییرات پیکربندی را انجام می دهید، Nginx اغلب می تواند بدون حذف اتصالات، بارگیری مجدد کند. برای انجام این کار، تایپ کنید:

sudo systemctl reload nginx

به‌طور پیش‌فرض، Nginx طوری پیکربندی شده است که هنگام بوت شدن سرور، به‌طور خودکار شروع به کار کند. اگر این چیزی نیست که شما می خواهید، می توانید این رفتار را با تایپ کردن غیرفعال کنید:

sudo systemctl disable nginx

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

sudo systemctl enable nginx

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

مرحله 5 – راه اندازی بلوک های سرور (توصیه می شود)

هنگام استفاده از وب سرور Nginx، بلوک های سرور (مشابه میزبان های مجازی در آپاچی) می توانند برای کپسوله کردن جزئیات پیکربندی و میزبانی بیش از یک دامنه از یک سرور استفاده شوند. ما دامنه ای به نام your_domain راه اندازی خواهیم کرد، اما شما باید آن را با نام دامنه خود جایگزین کنید.

Nginx در اوبونتو 20.04 دارای یک بلوک سرور است که به طور پیش فرض فعال شده است که برای ارائه اسناد خارج از دایرکتوری در /var/www/html پیکربندی شده است. در حالی که این برای یک سایت خوب کار می کند، اگر چندین سایت را میزبانی کنید، می تواند سخت شود. به جای تغییر /var/www/html، بیایید یک ساختار دایرکتوری در /var/www برای سایت your_domain خود ایجاد کنیم، و در صورت عدم مطابقت با درخواست مشتری، /var/www/html را به عنوان دایرکتوری پیش‌فرض باقی می‌گذاریم تا ارائه شود. سایت های دیگر

دایرکتوری برای your_domain به صورت زیر ایجاد کنید، با استفاده از پرچم -p برای ایجاد هر دایرکتوری والد ضروری:

sudo mkdir -p /var/www/your_domain/html

سپس، مالکیت دایرکتوری را با متغیر محیطی $USER اختصاص دهید:

sudo chown -R $USER:$USER /var/www/your_domain/html

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

sudo chmod -R 755 /var/www/your_domain

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

nano /var/www/your_domain/html/index.html

در داخل، نمونه HTML زیر را اضافه کنید:

/var/www/your_domain/html/index.html

<html>
    <head>
        <title>Welcome to your_domain!</title>
    </head>
    <body>
        <h1>Success!  The your_domain server block is working!</h1>
    </body>
</html>

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

برای اینکه Nginx بتواند این محتوا را ارائه دهد، لازم است یک بلوک سرور با دستورالعمل های صحیح ایجاد کنید. به جای اینکه مستقیماً فایل پیکربندی پیش‌فرض را تغییر دهیم، بیایید یک فایل جدید در /etc/nginx/sites-available/your_domain ایجاد کنیم:

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

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

/etc/nginx/sites-available/your_domain

server {
        listen 80;
        listen [::]:80;

        root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

        server_name your_domain www.your_domain;

        location / {
                try_files $uri $uri/ =404;
        }
}

توجه داشته باشید که ما پیکربندی root را به دایرکتوری جدید خود و server_name را به نام دامنه خود به روز کرده ایم.

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

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

اکنون دو بلوک سرور برای پاسخگویی به درخواست‌ها بر اساس دستورالعمل‌های listen و server_name فعال و پیکربندی شده‌اند (شما می‌توانید در مورد نحوه پردازش Nginx این دستورالعمل‌ها را در اینجا بیشتر بخوانید):

your_domain: به درخواست های your_domain و www.your_domain پاسخ می دهد.
پیش فرض: به هر درخواستی در پورت 80 که با دو بلوک دیگر مطابقت ندارد پاسخ می دهد.
برای جلوگیری از مشکل احتمالی حافظه سطل هش که ممکن است در اثر افزودن نام سرور اضافی ایجاد شود، لازم است یک مقدار واحد را در فایل /etc/nginx/nginx.conf تنظیم کنید. فایل را باز کنید:

sudo nano /etc/nginx/nginx.conf

دستور server_names_hash_bucket_size را پیدا کنید و برای لغو نظر خط، نماد # را بردارید. اگر از nano استفاده می‌کنید، می‌توانید با فشردن CTRL و w به سرعت کلمات موجود در فایل را جستجو کنید.

/etc/nginx/nginx.conf

...
http {
    ...
    server_names_hash_bucket_size 64;
    ...
}
...

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

در مرحله بعد، آزمایش کنید تا مطمئن شوید که در هیچ یک از فایل های Nginx شما خطای نحوی وجود ندارد:

sudo nginx -t

اگر مشکلی وجود ندارد، Nginx را مجددا راه اندازی کنید تا تغییرات شما فعال شود:

sudo systemctl restart nginx

Nginx اکنون باید نام دامنه شما را ارائه دهد. می توانید این را با رفتن به http://your_domain آزمایش کنید، جایی که باید چیزی شبیه به این را ببینید:

مرحله 6 – آشنایی با فایل ها و دایرکتوری های مهم Nginx

اکنون که می دانید چگونه خود سرویس Nginx را مدیریت کنید، باید چند دقیقه وقت بگذارید تا با چند فهرست و فایل مهم آشنا شوید.

محتوا

/var/www/html: محتوای واقعی وب، که به طور پیش‌فرض فقط از صفحه پیش‌فرض Nginx تشکیل شده است که قبلاً دیده‌اید، خارج از فهرست /var/www/html ارائه می‌شود. این را می توان با تغییر فایل های پیکربندی Nginx تغییر داد.

پیکربندی سرور

  • /etc/nginx: دایرکتوری پیکربندی Nginx. همه فایل های پیکربندی Nginx در اینجا قرار دارند.
  • /etc/nginx/nginx.conf: فایل پیکربندی اصلی Nginx. این را می توان برای ایجاد تغییرات در پیکربندی جهانی Nginx تغییر داد.
  • /etc/nginx/sites-available/: فهرستی که می‌توان بلوک‌های سرور هر سایت را در آن ذخیره کرد. Nginx از فایل های پیکربندی موجود در این دایرکتوری استفاده نمی کند مگر اینکه به دایرکتوری فعال شده سایت ها پیوند داده شده باشند. به طور معمول، تمام پیکربندی بلوک سرور در این دایرکتوری انجام می شود و سپس با پیوند دادن به دایرکتوری دیگر فعال می شود.
  • /etc/nginx/sites-enabled/: فهرستی که در آن بلوک‌های سرور فعال در هر سایت ذخیره می‌شوند. به طور معمول، این ها با پیوند دادن به فایل های پیکربندی موجود در فهرست سایت های موجود ایجاد می شوند.
  • /etc/nginx/snippets: این دایرکتوری شامل قطعات پیکربندی است که می تواند در جای دیگری از پیکربندی Nginx گنجانده شود. بخش‌های پیکربندی بالقوه تکرارپذیر، کاندیدهای خوبی برای تبدیل مجدد به قطعه‌ها هستند.

گزارش های سرور

  • /var/log/nginx/access.log: هر درخواست به سرور وب شما در این فایل گزارش ثبت می‌شود، مگر اینکه Nginx به گونه‌ای دیگر پیکربندی شده باشد.
  • /var/log/nginx/error.log: هر گونه خطای 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 در اوبونتو 20.04خرید سرورخرید سرور لینوکسخرید سرور مجازیراه اندازی وب سرورسرور اوبونتو 20.04سرور مجازی آمریکانحوه نصب Nginxوب سرور

  • behnam gol mohamadi
  • ۰
  • ۰

چگونه با Angular 11 و Scully یک Jamstack Portfolio بسازیم

ورود به سایت

معرفی

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

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

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

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

پیش نیازها

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

  • یک محیط توسعه که Node.js نسخه ۱۲ یا بالاتر را اجرا می کند.
  • Angular CLI نصب شده است، که می توانید با دنبال کردن مرحله 1 آموزش شروع با Angular با استفاده از Angular CLI انجام دهید. این آموزش با استفاده از Angular CLI v11.2.14 ساخته شده است. با اجرای دستور: می توانید این نسخه را نصب کنید
    npm -g نصب @angular/cli@11.2.14
  • Chromium نصب شده است (فقط کاربران ویندوز). Scully به Chromium نیاز دارد. اگر از macOS، اوبونتو یا سیستم عامل دیگری استفاده می‌کنید، به‌طور پیش‌فرض، Scully یک نسخه محلی را دانلود می‌کند که اگر قبلاً نصب نشده باشد، از آن برای ارائه یک سایت ثابت استفاده می‌کند. با این حال، اگر از ویندوز استفاده می کنید، باید Chrome را روی WSL نصب کنید، که می توانید با دنبال کردن این راهنما در مورد پیش نیازهای WSL برای Scully این کار را انجام دهید.
  • درک درستی از HTML، CSS، و TypeScript .
  • آشنایی با RxJS که می توانید در مستندات محصول RxJS بیابید.
  • درک درستی از Angular که می توانید در آموزش شروع با Angular CLI بیابید.

مرحله 1 – راه اندازی برنامه Angular

در این مرحله، اپلیکیشن نمونه کارها را با استفاده از Angular CLI تولید خواهید کرد. CLI برنامه را داربست می کند و تمام وابستگی های لازم برای اجرای آن را نصب می کند. سپس وابستگی هایی مانند Bootstrap، Font Awesome و Scully را اضافه خواهید کرد. اسکالی برنامه را ثابت می کند. بوت استرپ اجزا و یک ظاهر طراحی را ارائه می دهد. Font Awesome آیکون ها را عرضه می کند. پس از نصب این وابستگی‌ها، دارایی‌هایی مانند فونت‌ها و فایل‌های JSON را اضافه می‌کنید که حاوی داده‌های نمونه کار شما هستند.

برای شروع، دستور زیر را اجرا کنید تا برنامه تولید شود. به آن پورتفولیو می گویند. این آموزش شامل تست هایی برای برنامه نیست، بنابراین می توانید از پرچم -S برای رد شدن از تولید فایل آزمایشی استفاده کنید. اگر می‌خواهید بعداً آزمایش‌هایی اضافه کنید، می‌توانید این پرچم را حذف کنید.

ng new portfolio -S

وقتی از شما پرسیده شد که آیا می‌خواهید مسیریابی Angular را اضافه کنید، با بله پاسخ دهید. این به ابزار CLI می‌گوید که یک ماژول جداگانه برای مدیریت مسیریابی برنامه ایجاد کند. این در src/app/app-routing.module.ts در دسترس خواهد بود.

همچنین از شما خواسته می شود که یک قالب شیوه نامه را انتخاب کنید. CSS را انتخاب کنید. Angular گزینه های سبک دیگری مانند SCSS، Sass، Less و Stylus را ارائه می دهد. CSS ساده تر است و به همین دلیل است که می خواهید از آن در اینجا استفاده کنید

 

Output

? Would you like to add Angular routing? Yes
? Which stylesheet format would you like to use? (Use arrow keys)
❯ CSS 

 

نصب Dependencies

برای این برنامه به سه وابستگی نیاز دارید: Scully، ng-bootstrap و Font Awesome. اسکالی برنامه Angular را به یک برنامه ثابت تبدیل می کند. وابستگی های دیگر، Bootstrap و Font Awesome، ظاهر و احساس نمونه کارها را سفارشی می کنند. ng-bootstrap کامپوننت‌های Angular را با استفاده از Bootstrap ارائه می‌کند. این به ویژه مفید است زیرا همه اجزای وانیلی Bootstrap با Angular کار نمی کنند. بوت استرپ همچنین میزان استایلی را که باید به برنامه اضافه کنید کاهش می دهد زیرا قبلاً آن را برای شما فراهم کرده است. Font Awesome آیکون ها را عرضه می کند.

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

ng add @scullyio/init@2.0.0

سپس با استفاده از این دستور ng-bootstrap را اضافه کنید.

ng add @ng-bootstrap/ng-bootstrap@9.1.3

آخرین وابستگی برای اضافه کردن Font Awesome است.

npm install –save @fortawesome/fontawesome-free@5.15.4

اکنون که وابستگی ها اضافه شده اند، آماده اضافه کردن پیکربندی هستید.

اضافه کردن پیکربندی

برای در دسترس قرار دادن Font Awesome برای برنامه، باید یک مرجع به CSS کوچک شده آن در فایل angular.json اضافه کنید. این فایل را می توان در پایه پروژه یافت. با استفاده از nano یا ویرایشگر متن مورد علاقه خود، این فایل را باز کنید:

nano angular.json

در فایل به دنبال بخش architect/build بگردید. این بخش پیکربندی دستور ng build را ارائه می دهد. شما مرجع کوچک شده Font Awesome CSS، node_modules/@fortawesome/fontawesome-free/css/all.min.css را به آرایه سبک ها اضافه می کنید. آرایه سبک ها تحت پروژه ها / نمونه کارها / معمار / ساخت / گزینه ها قرار دارد. خط هایلایت شده را به فایل خود اضافه کنید:

angular.json

{
  ...
  "projects": {
    "portfolio": {
      ...
      "architect": {
        "build": {
          ...
          "options": {
              ...
              "styles": [
                  "node_modules/bootstrap/dist/css/bootstrap.min.css",
                  "node_modules/@fortawesome/fontawesome-free/css/all.min.css",
                  "src/styles.css"
              ],
          }
        },
        ...
      }
    }
  }
}

اکنون Font Awesome در دسترس خواهد بود.

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

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

در این آموزش از فونت Nunito استفاده خواهید کرد. src/index.html را باز کنید و خطوط مشخص شده در زیر را اضافه کنید:

src/index.html

...
<head>
  <meta charset="utf-8">
  <title>Portfolio</title>
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@200;400;800&display=swap" rel="stylesheet">
</head>
...

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

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

افزودن بیو و داده های پروژه

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

با ایجاد یک پوشه json در src/assets شروع کنید.

mkdir src/assets/json

در پوشه json، دو فایل JSON ایجاد خواهید کرد: bio.json و فایل projects.json. bio.json نمایه ای را که می خواهید در سایت نمایش دهید نگه می دارد. projects.json لیستی از پروژه هایی است که می خواهید به نمایش بگذارید.

ساختار فایل bio.json شبیه به این خواهد بود:

src/assets/json/bio.json

{
    "firstName": "Jane",
    "lastName": "Doe",
    "intro": [ "paragraph 1", "paragraph 2" ],
    "about": [ "paragraph 1", "paragraph 2" ]
}

مقدمه یک مقدمه کوتاه است که در صفحه اصلی نمایش داده می شود. درباره نمایه گسترده تری است که در صفحه «درباره» نشان داده شده است.

برای این آموزش، می توانید از یک نمونه بیو استفاده کنید یا خودتان آن را سفارشی کنید. برای استفاده از نمونه بیو، bio.json را باز کنید و موارد زیر را اضافه کنید:

src/assets/json/bio.json

{
    "firstName": "Jane",
    "lastName": "Doe",
    "intro": [
        "I'm a software developer with a passion for web development. I am currently based somewhere in the world. My main focus is building fast, accessible, and beautiful websites that users enjoy.",
        "You can have a look at some of my work here."
    ],
    "about": [
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam aliquam auctor fringilla. Proin scelerisque lacinia nisl vel ultrices. Ut gravida finibus velit sit amet pulvinar. Nunc nisi arcu, pretium quis ultrices nec, volutpat sit amet nulla. Mauris semper elementum placerat. Aenean velit risus, aliquet quis lectus id, laoreet accumsan erat. Curabitur varius facilisis velit, et rutrum ligula mollis et. Sed imperdiet sit amet urna ut eleifend. Suspendisse consectetur velit nunc, at fermentum eros volutpat nec. Vivamus scelerisque nec turpis volutpat sagittis. Aenean eu sem et diam consequat euismod.",
        "Mauris dolor tellus, sagittis vel pellentesque sit amet, viverra in enim. Maecenas non lectus eget augue convallis iaculis mattis malesuada nisl. Suspendisse malesuada purus et luctus scelerisque. Cras hendrerit, eros malesuada blandit scelerisque, nulla dui gravida arcu, nec maximus nunc felis sit amet mauris. Donec lorem elit, feugiat sit amet condimentum quis, consequat id diam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras rutrum sodales condimentum. Aenean ultrices mi vel augue dapibus mattis. Donec ut ornare nisl. Curabitur feugiat pharetra dictum."
    ]
}

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

فایل JSON دیگر، projects.json، ساختاری مشابه این خواهد داشت:

src/assets/json/projects.json

[
    {
        "name": "",
        "stack": {
            "name": "Vue.js",
            "iconClasses": "fab fa-vuejs"
        },
        "description": "",
        "sourceUrl": "",
        "previewUrl": "",
        "featured": false
    }
]

هر پروژه دارای یک نام، توضیحات، یک URL برای جایی که کد منبع آن میزبانی می شود، و یک URL پیش نمایش اگر در جایی مستقر شده باشد. اگر پروژه URL پیش‌نمایش ندارد، می‌توانید آن را حذف کنید.

آبجکت پشته برای نشان دادن زبان یا چارچوبی که پروژه از آن ساخته شده است استفاده می شود. بنابراین نام، نام زبان/فریم ورک خواهد بود و iconClasses کلاس‌های Font Awesome CSS برای نماد زبان/فریم‌ورک هستند. ویژگی برجسته نشان می دهد که آیا پروژه باید در صفحه اصلی نمایش داده شود یا خیر. اگر ویژگی روی false تنظیم شود، به جای نمایش در صفحه اصلی و «پروژه ها» فقط در صفحه «پروژه ها» نمایش داده می شود.

برای این آموزش، می توانید از چند پروژه نمونه استفاده کنید یا پروژه خود را اضافه کنید. برای استفاده از پروژه های نمونه، projects.json را باز کرده و موارد زیر را اضافه کنید:

src/assets/json/projects.json

[
    {
        "name": "Soduko",
        "stack": {
            "name": "Angular",
            "iconClasses": "fab fa-angular"
        },
        "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
        "sourceUrl": "https://github.com",
        "previewUrl": "https://github.com",
        "featured": true
    },
    {
        "name": "E-commerce Store",
        "stack": {
            "name": "React",
            "iconClasses": "fab fa-react"
        },
        "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
        "sourceUrl": "https://github.com",
        "previewUrl": "https://github.com",
        "featured": true
    },
    {
        "name": "Algorithm Visualization App",
        "stack": {
            "name": "Angular",
            "iconClasses": "fab fa-angular"
        },
        "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
        "sourceUrl": "https://github.com",
        "previewUrl": "https://github.com",
        "featured": true
    },
    {
        "name": "Time Tracking CLI App",
        "stack": {
            "name": "Node.js",
            "iconClasses": "fab fa-node-js"
        },
        "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
        "sourceUrl": "https://github.com",
        "previewUrl": "https://github.com",
        "featured": true
    }
]

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

راه اندازی سرور

برای بررسی اینکه برنامه شما مطابق انتظار کار می کند، سرور ارائه شده توسط Angular CLI را با استفاده از این دستور اجرا کنید:

ng serve

این دستور برنامه را می سازد و به آن سرویس می دهد. اگر تغییری ایجاد کنید، آن را بازسازی می کند. پس از تکمیل، برنامه در http://localhost:4200/ ارائه خواهد شد.

مرورگر خود را باز کنید و به http://localhost:4200 بروید. شما باید یک صفحه نگهدارنده را ببینید که به شکل زیر است:

هر بار که تغییری را ذخیره می کنید باید خروجی مشابه این را ببینید:

✔ Browser application bundle generation complete.

Initial Chunk Files           | Names                      |      Size
vendor.js                     | vendor                     |   3.83 MB
styles.css                    | styles                     | 202.25 kB
polyfills.js                  | polyfills                  | 141.85 kB
main.js                       | main                       |  26.08 kB
runtime.js                    | runtime                    |   9.06 kB

                              | Initial Total              |   4.20 MB

Build at:  - Hash:  - Time: 13312ms

** Angular Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ **

✔ Compiled successfully.

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

در این مرحله، برنامه را تولید کرده و تمام وابستگی ها، دارایی ها و تنظیمات لازم را اضافه کرده اید. شما همچنین سرور ارائه شده توسط Angular CLI را راه اندازی کرده اید. در مرحله بعد ماژول هسته را ایجاد می کنید.

مرحله 2 – ایجاد ماژول هسته

در این آموزش، اپلیکیشنی که در حال ساخت آن هستید شامل سه ماژول است: هسته، وبلاگ و نمونه کارها. ساختار برنامه به صورت زیر خواهد بود:

src/app

src/app
├── blog
├── core
└── portfolio

ماژول وبلاگ برای صفحات فرود وبلاگ و صفحات پست وبلاگ است. ماژول اصلی شامل همه چیزهای اصلی برنامه است. اینها شامل مولفه هدر، خدمات داده و مدل های داده می شود. ماژول نمونه کارها همه صفحات نمونه کار شما را نگه می دارد: “درباره”، “پروژه ها” و صفحه اصلی.

در این مرحله ماژول هسته را تولید خواهید کرد. همچنین مؤلفه هدر، سرویس ها و مدل های داده را تولید و پر می کنید. هدر در بالای هر صفحه نمایش داده می شود و حاوی نام و منوی سایت است. مدل ها داده های پورتفولیو را ساختار می دهند. خدمات داده های نمونه کارها را واکشی می کنند.

ماژول اصلی باید به این صورت باشد:

src/app/core/

src/app/core
├── header
├── models
└── services

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

ng generate module core

این دستور ماژول هسته را در پوشه src / app / core اضافه می کند و فایل ماژول را در src / app / core / core.module.ts اضافه می کند.

فایل ماژول هسته ماژول اصلی و واردات آن را تعریف می کند. در فایل ماژول جدید ایجاد شده، باید چند import اضافه کنید تا از هدر و سرویس ها پشتیبانی کنید.

core.module.ts را باز کنید و خطوط برجسته شده را اضافه کنید (حتما کاما را بعد از وارد کردن CommonModule وارد کنید):

src/app/core/core.module.ts

...
import { RouterModule } from '@angular/router';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { HttpClientModule } from '@angular/common/http';

@NgModule({
  declarations: [],
  imports: [
    CommonModule,
    RouterModule,
    NgbModule,
    HttpClientModule
  ]
})
...

این ماژول از HttpClientModule برای واکشی داده ها از فایل های JSON که قبلا ایجاد کرده اید استفاده می کند. همچنین از چند جزء ng-bootstrap از NgbModule و RouterModule برای مسیریابی استفاده خواهد کرد. همچنین باید آنها را به واردات CoreModule اضافه کنید.

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

تولید مدل های داده

در این بخش مدل های داده تولید می کنید. مدل‌های داده رابط‌هایی هستند که برای تعریف ساختار داده‌ها از فایل‌های JSON استفاده می‌کنید. آنها در سرویس ها و در بقیه اجزاء به عنوان انواع بازگشت و پارامتر استفاده خواهند شد. شما به دو مدل نیاز دارید: bio که ساختار داده های زیستی شما را تعریف می کند و پروژه که ساختار داده های پروژه شما را مشخص می کند.

src/app/core/models

src/app/core/models
├── bio.ts
└── project.ts

مدل Bio نمایانگر یک نمایه است در حالی که مدل پروژه پروژه ای برای نمایش است. شما هر دو مدل را با اجرای دستور زیر در ریشه پروژه تولید خواهید کرد:

for model in bio project ; do ng generate interface “core/models/${model}”; done

این دستور از طریق مسیرهای فایل حلقه می زند و آنها را به رابط تولید ng ارسال می کند که آنها را در پوشه src / app / core / models ایجاد می کند.

فایل مدل بیو اطلاعاتی را که می‌خواهید بیو شما حاوی آن باشد، مشخص می‌کند. در فایل src / app / core / models / bio.ts که ایجاد شده است، فیلدهایی را که در زیر برجسته شده اند اضافه کنید.

src/app/core/models/bio.ts

export interface Bio {
    firstName: string;
    lastName: string;
    about: string[];
    intro: string[];
}

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

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

فایل پروژه ساختار یک پروژه را تعریف می کند. در اینجا، فیلدهایی را که می خواهید برای هر پروژه استفاده کنید فهرست می کنید. در فایل src / app / core / models / project.ts، خطوط برجسته شده را اضافه کنید.

src/app/core/models/project.ts

export interface Project {
    name: string;
    stack: { iconClasses: string, name: string };
    description: string;
    sourceUrl: string;
    previewUrl: string;
    featured?: boolean;
}

شما فیلدهایی را برای مدل پروژه اضافه کرده اید. هر پروژه دارای یک نام، توضیحات، یک URL برای کد منبع خود و یک URL پیش نمایش است اگر در جایی مستقر شده باشد. آبجکت پشته برای نشان دادن زبان یا چارچوب پروژه استفاده می شود. (نام نام زبان / فریمورک خواهد بود و iconClasses کلاس‌های Font Awesome CSS برای نماد زبان / فریمورک هستند.) ویژگی برجسته نشان می‌دهد که آیا پروژه باید در صفحه اصلی نمایش داده شود یا خیر. اگر ویژگی روی false تنظیم شده باشد، به جای صفحه اصلی و «پروژه‌ها» فقط در صفحه «پروژه‌ها» نمایش داده می‌شود.

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

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

تولید خدمات

سرویس‌هایی که در این بخش ایجاد می‌کنید، داده‌های فایل‌های JSON را که قبلاً ساخته‌اید واکشی می‌کنند. هنگامی که آنها این داده ها را واکشی کردند، اجزا می توانند این سرویس ها را فراخوانی کرده و داده ها را مصرف کنند. مدل ها به عنوان انواع برگشتی در این سرویس ها استفاده خواهند شد. مدل bio در سرویس bio و مدل پروژه در سرویس پروژه استفاده می شود. شما یک سرویس هدر اضافی اضافه خواهید کرد که به تصمیم گیری در مورد مسیرهایی که برای موارد موجود در هدر و سایر مؤلفه ها استفاده کنید کمک می کند. ماژول اصلی دارای سه سرویس است: BioService، HeaderService و ProjectsService.

src/app/core/services

src/app/core/services
├── bio.service.ts
├── header.service.ts
└── projects.service.ts

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

for service in bio projects header; do ng generate service “core/services/${service}”; done

این دستور از طریق مسیرهای فایل حلقه می زند و آنها را به سرویس ng generate می دهد که آنها را در پوشه src / app / core / services ایجاد می کند.

سرویس بیو داده‌های زیستی شما را از فایل JSON بیو واکشی می‌کند. برای این کار، روشی برای واکشی این داده ها اضافه می کنید. فایل src / app / core / services / bio.service.ts را باز کنید و خطوط برجسته زیر را اضافه کنید:

src/app/core/services/bio.service.ts

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Bio } from '../models/bio';

@Injectable({
  providedIn: 'root'
})
export class BioService {

  constructor(private http: HttpClient) { }

  getBio() {
   return this.http.get<Bio>('assets/json/bio.json');
  }
}

روش getBio در BioService بیوگرافی شما را از فایل assets / json / bio.json واکشی می کند. شما سرویس HttpClient را به سازنده آن تزریق می‌کنید و از آن در متد getBio () برای درخواست GET به فایل استفاده می‌کنید.

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

در مرحله بعد، HeaderService را تغییر خواهید داد. از سرویس هدر برای بررسی اینکه آیا مسیر فعلی صفحه اصلی است یا خیر استفاده می شود. روشی اضافه خواهید کرد که تعیین می کند صفحه فعلی صفحه اصلی است یا خیر. فایل src / app / core / services / header.service.ts را باز کنید و خطوط برجسته شده را اضافه کنید:

src/app/core/services/header.service.ts

import { Injectable } from '@angular/core';
import { NavigationEnd, Router } from '@angular/router';
import { filter, map, startWith } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class HeaderService {

  constructor(private router: Router) { }

  isHome() {
    return this.router.events.pipe(
      filter(event => event instanceof NavigationEnd),
      map(event => {
        if (event instanceof NavigationEnd) {
          if (this.checkForHomeUrl(event.url)) {
            return true;
          }
        }

        return false;
      }),
      startWith(this.checkForHomeUrl(this.router.url))
    );
  }

  private checkForHomeUrl(url: string): boolean {
    return url.startsWith('/#') || url == '/';
  }
}

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

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

در نهایت شما ProjectsService را تغییر خواهید داد. سرویس پروژه ها داده های پروژه را از فایل JSON پروژه ها واکشی می کند. روشی برای واکشی داده های پروژه اضافه خواهید کرد. فایل src / app / core / services / projects.service.ts را باز کنید و محتویات را به موارد زیر تغییر دهید:

src/app/core/services/projects.service.ts

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { filter, mergeAll, toArray } from 'rxjs/operators';
import { Project } from '../models/project';

@Injectable({
  providedIn: 'root'
})
export class ProjectsService {

  constructor(private http: HttpClient) { }

  getProjects(featured?: boolean): Observable<Project[]> {
    let projects$ = this.http.get<Project[]>('assets/json/projects.json');

    if (featured) {
      return projects$.pipe(
        mergeAll(),
        filter(project => project.featured || false),
        toArray()
      );
    }

    return projects$;
  }
}

ProjectsService یک متد getProjects دارد که پروژه ها را دریافت و فیلتر می کند. پروژه ها را از فایل assets / json / projects.json دریافت می کند. شما سرویس HttpClient را به سازنده آن تزریق خواهید کرد و از آن در متد getProjects () برای درخواست GET به فایل استفاده خواهید کرد. با استفاده از پارامتر featured، می توانید انتخاب کنید که فقط پروژه های برجسته را برای اختصار برگردانید. زمانی که می خواهید پروژه های مهم را نشان دهید، در صفحه اصلی مفید است.

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

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

تولید هدر

جزء هدر در بالای همه صفحات نمایش داده می شود. این شامل نام شما و پیوندهایی به صفحات “درباره” و “پروژه ها” و همچنین وبلاگ است. از سرویس بیو و هدر در هدر استفاده خواهد شد. سرویس بیو داده های زیستی را به هدر ارائه می دهد. از سرویس هدر برای بررسی اینکه آیا صفحه فعلی صفحه اصلی است استفاده می شود و پیوندهایی را به بخش ها یا صفحات “درباره” و “پروژه ها” تنظیم می کند. با اجرای این دستور از ریشه پروژه آن را تولید خواهید کرد:

ng generate component core/header

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

در فایل header.component.ts، خدمات بیو و هدر را تزریق می‌کنید و یک ویژگی استایلی اضافه می‌کنید تا پاسخگویی مؤلفه در اندازه‌های مختلف صفحه نمایش را کنترل کند.

header.component.ts را باز کنید و خطوط هایلایت شده را اضافه کنید:

src/app/core/header/header.component.ts

import { Component } from '@angular/core';
import { BioService } from '../services/bio.service';
import { HeaderService } from '../services/header.service';

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.css']
})
export class HeaderComponent {
  bio$ = this.bioService.getBio();
  isHome$ = this.headerService.isHome();

  menuItems = [
    { title: 'About Me', homePath: '/', fragment: 'about', pagePath: '/about' },
    { title: 'My Projects', homePath: '/', fragment: 'projects', pagePath: '/projects' },
    { title: 'My Blog', homePath: '/blog', fragment: '', pagePath: '/blog' }
  ];

  constructor(private bioService: BioService, private headerService: HeaderService) { }
}

در این فایل کامپوننت، دو سرویس را تزریق خواهید کرد: bioService برای دریافت نام شما از فایل bio JSON و headerService برای اینکه بفهمید صفحه نمایش داده شده در حال حاضر صفحه اصلی است یا خیر. دومی به شما امکان می دهد تصمیم بگیرید که آیا دکمه ها باید به یک صفحه جداگانه مانند / پروژه ها بروند یا لنگر اسکرول را مانند پروژه / # انجام دهند. menuItems شامل تمام موارد منو برای نمایش است. ویژگی‌های bio $ و isHome $ قابل مشاهده‌هایی از سرویس‌های فوق‌الذکر هستند.

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

در مرحله بعد، الگوی کامپوننت هدر را تغییر خواهید داد. اینجا جایی است که داده های واکشی شده از سرویس bio نمایش داده می شود. پیوندهایی به بخش‌ها یا صفحات «درباره» و «پروژه‌ها» نیز در اینجا اضافه می‌شوند. در فایل قالب src / app / core / header / header.component.html کد زیر را اضافه کنید.

src/app/core/header/header.component.html

<div class="d-flex min-vh-10 w-100 justify-content-center pb-3 pt-3 pr-4 pl-4">
    <div class="d-flex justify-content-start" *ngIf="bio$ | async as bio" routerLink="/">
        <h2 class="font-weight-bold">{{bio.firstName}}</h2>
        <h2 class="font-weight-light">{{bio.lastName}}</h2>
    </div>
    <div class="d-none d-md-flex flex-grow-1 justify-content-end align-items-start">
        <button type="button" class="ml-2 mr-2 btn btn-outline-dark border-0 font-weight-bold"
            *ngFor="let item of menuItems" [routerLink]="(isHome$ | async) ? item.homePath : item.pagePath"
            [fragment]="(isHome$ | async) ? item.fragment : ''">{{item.title}}</button>
    </div>
    <div class="d-flex d-md-none justify-content-end flex-grow-1">
        <div ngbDropdown class="d-inline-block" display="dynamic" container="body">
            <button class="btn btn-outline-dark border-0" ngbDropdownToggle>
                <i class="fas fa-lg fa-bars"></i>
            </button>
            <div ngbDropdownMenu class="dropdown-menu dropdown-menu-right">
                <button ngbDropdownItem *ngFor="let item of menuItems"
                    [routerLink]="(isHome$ | async) ? item.homePath : item.pagePath"
                    [fragment]="(isHome$ | async) ? item.fragment : ''">{{item.title}}</button>
            </div>
        </div>
    </div>
</div>

در قالب، نام های شما (bio.firstName و bio.lastName) با استفاده از داده های ویژگی bio نمایش داده می شود. بسته به اندازه صفحه، یک منوی کشویی یا فهرستی از دکمه‌ها از menuItems نشان داده می‌شود. لوله مستعار در الگو لغو اشتراک از موارد مشاهده‌پذیر را کنترل می‌کند. این الگو در طول این آموزش رعایت خواهد شد.

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

هدر باید در تمام صفحات قابل مشاهده باشد. برای تحقق این امر، باید چند قدم بردارید. ابتدا، CoreModule باید HeaderComponent را صادر کند تا در دسترس باشد. برای صادر کردن آن، خطوط برجسته شده را به src / app / core / core.module.ts اضافه کنید. فراموش نکنید که کاما را بعد از آرایه واردات اضافه کنید.

src/app/core/core.module.ts

...
@NgModule({
  ...

  imports: [
    ...
  ],
  exports: [ HeaderComponent ]
})
...

برای اینکه هدر قابل مشاهده باشد، باید آن را به قالب AppComponent که در AppModule است نیز اضافه کنید. AppModule همچنین باید CoreModule را وارد کند تا به هدر دسترسی داشته باشد. این وظایف اضافی را در مرحله بعد تکمیل خواهید کرد.

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

مرحله 3 – تولید ماژول نمونه کارها

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

صفحه اصلی خلاصه ای از نمایه شما را با استفاده از هدر و خدمات بیو نمایش می دهد. صفحه “درباره” یک نمایه عمیق تر است و از خدمات و مدل بیو استفاده می کند. صفحه “پروژه ها” پروژه های شما را با استفاده از خدمات و مدل پروژه ها برای نمایش پروژه های شما به نمایش می گذارد. در پایان این مرحله، ماژول نمونه کارها شما به صورت زیر ساختار می یابد:

src/app/portfolio

src/app/portfolio
├── about
├── home
└── projects

ابتدا دو ماژول تولید خواهید کرد: یک ماژول نمونه کارها و یک ماژول مسیریابی نمونه کارها. ماژول نمونه کارها شامل تمام صفحات اولیه نمونه کار شما است. ماژول مسیریابی پورتفولیو مسئول مسیریابی به این صفحات است.

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

ng generate module portfolio –module app –routing –route portfolio

این دستور پوشه app / portfolio را ایجاد می کند و یک فایل ماژول در app / portfolio / portfolio.module.ts اضافه می کند. این مسیر را در app / src / app-routing.module.ts خواهید دید. پرچم مسیریابی — مشخص می کند که ماژول مسیریابی پورتفولیو تولید شود. این ماژول مسیریابی در app / portfolio / portfolio-routing.module.ts قرار خواهد گرفت.

پرچم –route یک مسیر با بارگذاری تنبل در ماژول برنامه ایجاد می کند، همانطور که توسط پرچم –module مشخص شده است. این مسیر را در app / src / app-routing.module.ts خواهید دید. همچنین یک مولفه نگهدارنده مکان را برای اهداف مسیریابی اضافه می کند که در بخش بعدی مورد بحث قرار می گیرد.

این ماژول نمونه کارها باید در مسیر / موجود باشد. این مستلزم آن است که پرچم –route را با یک رشته خالی، مانند –route = “. با این حال، ماژول تولید ng به رشته های خالی برای پرچم –route اجازه نمی دهد. بنابراین شما مجبور خواهید بود از یک مکان نگهدار، نمونه کار استفاده کنید. سپس این مکان‌نما را با یک رشته خالی در src/app/app-routing.module.ts جایگزین می‌کنید، که مسیریابی کل برنامه را انجام می‌دهد.

src / app / app-routing.module.ts را باز کنید و خطوط هایلایت شده را جایگزین کنید:

src/app/app-routing.module.ts

...
const routes: Routes = [
  {
    path: '',
    loadChildren: () => import('./portfolio/portfolio.module').then(m => m.PortfolioModule)
  }
];
...

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

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

ایجاد صفحه اصلی

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

برای تغییر نام این کامپوننت، ابتدا یک پوشه جدید برای قرار دادن آن ایجاد خواهید کرد. از ریشه پروژه، دستور زیر را اجرا کنید:

mkdir -p src/app/portfolio/home

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

mv src/app/portfolio/portfolio.component.* src/app/portfolio/home/

این دستور همه فایل‌ها را با نام‌هایی که با portfolio.component شروع می‌شوند، به داخل src/app/portfolio/home/folder منتقل می‌کند.

سپس نام portfolio.component * فایل ها را به home.component تغییر می دهید *.

find src/app/portfolio/home -name ‘portfolio*’ -exec bash -c ‘ mv $0 ${0/\portfolio./home.}’ {} \;

پس از اجرای دستورات بالا، به دلیل تغییر نام و مسیر کامپوننت، با خطاهایی مواجه خواهید شد. برای رفع این مشکل باید در چند فایل تغییراتی ایجاد کنید: ماژول مسیریابی نمونه کارها، ماژول نمونه کارها و فایل های مؤلفه خانگی. در این فایل ها، تمام نمونه های PortfolioComponent را به HomeComponent تغییر خواهید داد. همچنین مسیرها را از ./portfolio.component به ./home/home.component به روز خواهید کرد.

با باز کردن src / app / portfolio / portfolio-routing.module، که مسیریابی ماژول نمونه کارها را انجام می دهد، شروع کنید. تغییرات برجسته شده را انجام دهید:

src/app/portfolio/portfolio-routing.module

...
import { HomeComponent } from './home/home.component';

const routes: Routes = [{ path: '', component: HomeComponent }];
...

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

سپس src / app / portfolio / portfolio.module.ts، فایل ماژول نمونه کارها را باز کنید. تغییرات برجسته شده را انجام دهید:

src/app/portfolio/portfolio.module.ts

...
import { HomeComponent } from './home/home.component';


@NgModule({
  declarations: [
    HomeComponent
  ],
  ...
})
...

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

در نهایت، src / app / portfolio / home / home.component.ts، فایل کامپوننت خانه را باز کنید. تغییرات برجسته شده را انجام دهید:

src/app/portfolio/home/home.component.ts

...
@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
...
}

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

در این فایل‌ها، تمام نمونه‌های PortfolioComponent را به HomeComponent تغییر داده‌اید و مسیرها را برای اشاره به HomeComponent به‌روزرسانی کرده‌اید. پس از انجام همه این کارها، ماژول نمونه کارها باید به این شکل باشد.

src/app/portfolio

src/app/portfolio
├── home
│   ├── home.component.css
│   ├── home.component.html
│   └── home.component.ts
├── portfolio-routing.module.ts
└── portfolio.module.ts

اکنون نام ها و مسیرهای فایل های مؤلفه اصلی را به روز کرده اید.

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

src/app/portfolio/home/home.component.ts را باز کنید و کد را برای مطابقت با موارد زیر به روز کنید:

src/app/portfolio/home/home.component.ts

import { Component } from '@angular/core';
import { BioService } from '../../core/services/bio.service';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent {
  bio$ = this.bioService.getBio();

  respOptions = [
    { viewClasses: 'd-none d-md-flex', headingClass: 'display-3', useSmallerHeadings: false },
    { viewClasses: 'd-flex d-md-none', headingClass: '', useSmallerHeadings: true }
  ];

  constructor(private bioService: BioService) { }
}

صفحه اصلی نام شما و یک بیوگرافی کوتاه را نشان می دهد که از BioService که در اینجا تزریق می کنید بازیابی شده است. هنگامی که متد getBio آن را فراخوانی کردید، مشاهده پذیر حاصل در ویژگی bio$ ذخیره می شود. ویژگی respOptions پیکربندی را ذخیره می‌کند که به اطمینان از پاسخگو بودن نما کمک می‌کند.

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

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

src/app/portfolio/home/home.component.html را باز کرده و کد زیر را اضافه کنید:

src/app/portfolio/home/home.component.html

<div class="d-flex flex-column justify-content-center align-items-center w-100" *ngIf="bio$ | async as bio">
    <div class="d-flex flex-column min-vh-95 justify-content-center align-items-center w-100">
        <div *ngFor="let options of respOptions" [ngClass]="options.viewClasses"
            class="flex-column justify-content-center align-items-start w-75">
            <h1 [ngClass]="options.headingClass" class="text-left">Hello, 👋. My name is <span
                    class="font-weight-bold">{{bio.firstName+'
                    '+bio.lastName}}.</span></h1>
            <div *ngFor="let par of bio.intro">
                <h2 class="text-left" *ngIf="!options.useSmallerHeadings">{{par}}</h2>
                <h5 class="text-left" *ngIf="options.useSmallerHeadings">{{par}}</h5>
            </div>
            <button class="mt-3 mb-5 btn btn-outline-dark" routerLink="/" fragment="projects">
                See My Work
                <i class="ml-1 fas fa-angle-right"></i>
            </button>
        </div>
    </div>

    <div class="d-none d-md-block mt-5"></div>
    <app-about id="about" class="mb-3"></app-about>

    <div class="d-none d-md-block mt-5"></div>
    <app-projects id="projects" class="mb-5"></app-projects>
</div>

در این الگو، نام‌های bio.firstName+ و +bio.lastName و همچنین یک مقدمه، bio.intro از بیو را نمایش می‌دهید. شما همچنین در مورد مؤلفه app-about و پروژه جزء برنامه-پروژه ها را نشان می دهید که در مرحله بعد تولید خواهید کرد.

src/app/portfolio/home/home.component.html

...
<app-about id="about" class="mb-3"></app-about>

...

<app-projects id="projects" class="mb-5"></app-projects>
...

در مرحله بعد، می توانید یک ظاهر طراحی برای مولفه خانه اضافه کنید. src/app/portfolio/home/home.component.css را باز کنید و این خطوط را اضافه کنید:

src/app/portfolio/home/home.component.css

.min-vh-95 {
    height: 95vh;
}

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

پس از تکمیل، صفحه اصلی به این شکل خواهد بود (در مرحله آخر می توانید پیش نمایش سایت را مشاهده کنید):

 

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

ایجاد صفحات درباره و پروژه

به جای اینکه هر صفحه را به صورت جداگانه تولید کنید، می توانید یک فرمان را اجرا کنید تا صفحات باقی مانده «پروژه ها» و «درباره» را به یکباره بسازید. این کار را با اجرای دستور زیر از ریشه پروژه انجام می دهید:

for page in about projects; do ng generate component “portfolio/${page}”; done

این دستور از طریق نام هر صفحه حلقه زده و آنها را تولید می کند.

پر کردن صفحه درباره

صفحه “درباره” نمایه عمیق تری از شما نمایش می دهد. اطلاعات این صفحه از سرویس بیو بازیابی شده و از مدل بیو نیز استفاده می کند. این جزء در صفحه اصلی نمایش داده می شود. همچنین یک صفحه مستقل با مسیر خاص خود خواهد بود.

برای پر کردن صفحه «درباره» با بیو خود، فایل مؤلفه «درباره» را برای استفاده از سرویس بیو تغییر دهید. همچنین گزینه هایی را برای پاسخگویی صفحه در نمایشگرهای مختلف تنظیم خواهید کرد. src/app/portfolio/about/about.component.ts را باز کرده و خطوط هایلایت شده را اضافه کنید:

src/app/portfolio/about/about.component.ts

import { Component } from '@angular/core';
import { BioService } from '../../core/services/bio.service';

@Component({
  selector: 'app-about',
  templateUrl: './about.component.html',
  styleUrls: ['./about.component.css']
})
export class AboutComponent {
  bio$ = this.bioService.getBio();

  respOptions = [
    { viewClasses: 'd-none d-md-flex', headingClass: 'display-3', useSmallerHeadings: false },
    { viewClasses: 'd-flex d-md-none', headingClass: '', useSmallerHeadings: true }
  ];

  constructor(private bioService: BioService) { }
}

اطلاعات “درباره” از BioService می آید و پس از فراخوانی متد getBio آن، قابل مشاهده در ویژگی bio$ ذخیره می شود. respOptions با ارائه کلاس های CSS اختیاری برای اندازه های مختلف نمایش به پاسخگویی کمک می کند.

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

در مرحله بعد، الگوی صفحه “درباره” را تغییر می دهید تا بتوانید اطلاعات بازیابی شده از سرویس بیو را نمایش دهید. src/app/portfolio/about/about.component.html را باز کنید و خطوط زیر را اضافه کنید:

src/app/portfolio/about/about.component.html

<div class="d-flex justify-content-center vw-90 mx-auto" *ngIf="bio$ | async as bio">
    <div *ngFor="let options of respOptions" [ngClass]="options.viewClasses"
        class="flex-column align-items-center text-center w-75">
        <h1 [ngClass]="options.headingClass" class="mb-5"><span class="font-weight-bold">About</span> Me</h1>
        <div *ngFor="let par of bio.about">
            <h4 *ngIf="!options.useSmallerHeadings" class="mb-4">{{par}}</h4>
            <h5 *ngIf="options.useSmallerHeadings" class="mb-4">{{par}}</h5>
        </div>
    </div>
</div>

در این قالب، داده های موجود در bio$ observable را نمایش می دهید. بخش «درباره» اطلاعات را مرور می‌کنید و آن را به عنوان پاراگراف به صفحه «درباره» اضافه می‌کنید.

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

پس از تکمیل، صفحه «درباره» به این شکل خواهد بود (در مرحله آخر می توانید پیش نمایش سایت را مشاهده کنید):

پر کردن صفحه پروژه ها

صفحه “پروژه ها” تمام پروژه های شما را که از سرویس پروژه ها بازیابی شده اند نشان می دهد. این کامپوننت در صفحه اصلی استفاده خواهد شد و همچنین یک صفحه مستقل خواهد بود. در صفحه اصلی همراه با مولفه “درباره” نمایش داده می شود. هنگامی که این مؤلفه در صفحه اصلی استفاده می شود، فقط پروژه های برجسته باید قابل مشاهده باشند. یک دکمه See More Projects وجود دارد که فقط در صفحه اصلی ظاهر می شود. وقتی روی آن کلیک کردید، به صفحه پروژه‌های فهرست کامل هدایت می‌شود.

برای پر کردن صفحه «پروژه‌ها»، فایل مؤلفه آن را برای دریافت پروژه‌ها از سرویس پروژه‌ها تغییر می‌دهید. همچنین از سرویس هدر برای تعیین اینکه آیا همه پروژه ها نمایش داده می شوند یا برجسته شده استفاده خواهید کرد. همچنین گزینه هایی را اضافه می کنید تا صفحه را در اندازه های مختلف صفحه نمایش پاسخگو کنید. src/app/portfolio/projects/projects.component.ts را باز کنید و خطوط هایلایت شده را اضافه کنید:

src/app/portfolio/projects/projects.component.ts

import { Component } from '@angular/core';
import { mergeMap } from 'rxjs/operators';
import { HeaderService } from '../../core/services/header.service';
import { ProjectsService } from '../../core/services/projects.service';

@Component({
  selector: 'app-projects',
  templateUrl: './projects.component.html',
  styleUrls: ['./projects.component.css']
})
export class ProjectsComponent {
  isHome$ = this.headerService.isHome();
  projects$ = this.isHome$.pipe(
    mergeMap(atHome => this.projectsService.getProjects(atHome))
  );

  respOptions = [
    { viewClasses: 'd-none d-md-flex', displayInColumn: false, useSmallerHeadings: false, titleClasses: 'display-3' },
    { viewClasses: 'd-flex d-md-none', displayInColumn: true, useSmallerHeadings: true, titleClasses: '' }
  ];

  constructor(private projectsService: ProjectsService, private headerService: HeaderService) { }
}

پروژه ها از ProjectsService می آیند. برای تعیین اینکه آیا صفحه فعلی صفحه اصلی است یا خیر از HeaderService استفاده خواهید کرد. شما از مقدار isHome$ برای تعیین اینکه آیا لیست کامل پروژه ها را واکشی کنید یا فقط پروژه های برجسته را تعیین کنید، استفاده خواهید کرد.

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

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

src/app/portfolio/projects/projects.component.html را باز کرده و خطوط زیر را اضافه کنید:

src/app/portfolio/projects/projects.component.html

<div *ngFor="let options of respOptions" [ngClass]="options.viewClasses"
    class="flex-column align-items-center text-center vw-90 mx-auto">
    <h1 [ngClass]="options.titleClasses" class="mb-5"><span class="font-weight-bold">My</span> Projects</h1>
    <div class="d-flex vw-90"
        [ngClass]="{'justify-content-center flex-wrap': !options.displayInColumn, 'flex-column  align-items-center': options.displayInColumn}"
        *ngIf="projects$ | async as projects">
        <div *ngFor="let project of projects" class="card project-card m-3"
            [ngClass]="{'m-3': !options.displayInColumn, 'mb-3': options.displayInColumn}">
            <div class="card-body d-flex flex-column">
                <h5 class="card-title font-weight-bold text-left project-title" [title]="project.name">
                    {{project.name}}
                </h5>
                <h6 class="card-subtitle mb-2 font-weight-lighter text-left">
                    <i [ngClass]="project.stack.iconClasses"></i>
                    {{project.stack.name}}
                </h6>
                <p class="card-text text-left">
                    {{project.description}}
                </p>
                <div class="d-flex flex-row justify-content-start">
                    <a [href]="project.previewUrl" *ngIf="project.previewUrl" class="btn btn-dark mr-2">
                        <i class="fa-lg mr-1 far fa-eye"></i>
                        Preview
                    </a>
                    <a [href]="project.sourceUrl" *ngIf="project.sourceUrl" class="btn btn-dark">
                        <i class="fa-lg mr-1 fab fa-github-alt"></i>
                        Source
                    </a>
                </div>
            </div>
        </div>
    </div>
    <button *ngIf="isHome$ | async" routerLink="/projects" class="mt-3 btn btn-dark">
        See More Projects
        <i class="ml-1 fas fa-angle-right"></i>
    </button>
</div>

در اینجا شما هر پروژه را از پروژه $ به یک کارت اضافه می کنید. در کارت، نام پروژه (project.name)، پشته فناوری استفاده شده در آن (project.stack) و توضیح مختصری (project.description) از کارهایی که انجام می دهد را نمایش می دهید. همچنین پیوندهایی را به جایی که کد پروژه میزبانی شده است اضافه خواهید کرد. علاوه بر این، پیوندی به جایی که پروژه در صورت استقرار آن قابل اجرا باشد، اضافه می‌کنید. در نهایت، دکمه See More Projects وجود دارد که فقط در صفحه اصلی نمایش داده می شود. در صفحه اصلی، فقط پروژه های برجسته نمایش داده می شوند. هنگامی که این دکمه کلیک می شود، کاربر به لیست کاملی از پروژه ها هدایت می شود.

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

در مرحله بعد، با تغییر الگوی پروژه ها، به کارت های پروژه استایل می دهید. src/app/portfolio/projects/projects.component.css را باز کنید و خطوط زیر را اضافه کنید:

src/app/portfolio/projects/projects.component.css

.vw-20 {
    width: 20vw;
}

.project-card {
    width: 290px;
    height: 250px;
}

.project-title {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 20ch;
}

در اینجا، اندازه کارت پروژه و عناوین پروژه را تنظیم می کنید که کمی طولانی تر هستند.

پس از تکمیل، فهرست کامل صفحه «پروژه» به این شکل خواهد بود (در مرحله آخر می‌توانید پیش‌نمایش سایت را مشاهده کنید):

اضافه کردن بقیه مسیرهای نمونه کارها

برای دسترسی به هر صفحه، باید یک مسیر برای هر یک ایجاد کنید. شما اینها را در PortfolioRoutingModule اضافه خواهید کرد که مسیریابی PortfolioModule را انجام می دهد. صفحه “درباره” باید در /about و صفحه “پروژه ها” در /projects موجود باشد.

برای ایجاد مسیرها برای صفحات ماژول نمونه کارها، فایل ماژول مسیریابی پورتفولیو را که مسئول مسیریابی است، تغییر می دهید. src/app/portfolio/portfolio-routing.module.ts را باز کنید و خطوط هایلایت شده را اضافه کنید:

src/app/portfolio/portfolio-routing.module.ts

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { ProjectsComponent } from './projects/projects.component';
import { AboutComponent } from './about/about.component';

const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'about', component: AboutComponent },
  { path: 'projects', component: ProjectsComponent }
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class PortfolioRoutingModule { }

در اینجا، با مشخص کردن مسیرهای اجزا و اضافه کردن آنها به آرایه مسیرها، مسیرها را به صفحات «درباره» و «پروژه‌ها» اضافه می‌کنید.

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

مرحله 4 – ایجاد ماژول وبلاگ

در این مرحله، ماژول وبلاگ را که حاوی صفحات فرود و پست وبلاگ شما است، تولید می کنید. به جای اینکه وبلاگ را از ابتدا بسازید، از شماتیک اسکالی برای تنظیم تمام موارد مورد نیاز برای یک وبلاگ کارآمد استفاده خواهید کرد. شماتیک اسکالی ماژول را تولید می کند، یک ماژول مسیریابی برای مدیریت مسیریابی به وبلاگ اضافه می کند و یک جزء وبلاگ ایجاد می کند که یک پست وبلاگ را نمایش می دهد. مؤلفه وبلاگ پست هایی را که در فایل های علامت گذاری می نویسید نمایش می دهد. در مرحله بعد با ایجاد پست های وبلاگ جدید، محل این فایل های علامت گذاری را خواهید دید. هنگام رندر کردن وبلاگ، اسکالی نسخه‌های علامت‌گذاری شده پست‌های وبلاگی را که ایجاد کرده‌اید می‌گیرد و آنها را به صفحات HTML ثابت تبدیل می‌کند، که سریع‌تر به خوانندگان ارائه می‌شوند.

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

ng generate @scullyio/init:blog

دستور بالا ماژول وبلاگ را در src/app/blog ایجاد می‌کند، یک پوشه وبلاگ در پایه پروژه می‌سازد، جایی که فایل‌های علامت‌گذاری وبلاگ در آن قرار می‌گیرند، یک مسیر تنبل برای ماژول در AppRoutingModule اضافه می‌کند و یک جزء وبلاگ در پایه آن ایجاد می‌کند. ماژول

در مرحله بعد، یک پوشه در ماژول ایجاد کنید که مؤلفه وبلاگ در آن قرار دارد.

mkdir src/app/blog/blog

برای انتقال کامپوننت وبلاگ به این پوشه، اجرا کنید:

mv src/app/blog/blog.component.* src/app/blog/blog/

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

src/app/blog

src/app/blog
├── blog
│   ├── blog.component.css
│   ├── blog.component.html
│   ├── blog.component.spec.ts
│   └── blog.component.ts
├── blog-routing.module.ts
└── blog.module.ts

از آنجایی که این ماژول بازسازی شده است، برخی از مسیرها شکسته شده و نیاز به به روز رسانی دارند. دو فایل، blog-routing.module.ts و blog.module.ts، باید با مسیرهای جدید به BlogComponent به روز شوند.

blog-routing.module.ts را باز کنید و وارد کردن را مطابق شکل به روز کنید:

src/app/blog/blog-routing.module.ts

...
import { BlogComponent } from './blog/blog.component';
...

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

بعد، blog.module.ts را باز کنید و وارد کردن را مطابق شکل به روز کنید:

src/app/blog/blog.module.ts

...
import { BlogComponent } from './blog/blog.component';
...

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

در مرحله بعد، الگوی مولفه وبلاگ را اصلاح خواهید کرد. نقش مؤلفه وبلاگ نمایش یک پست وبلاگ است. این مؤلفه به حداقل ویرایش نیاز دارد زیرا شماتیک وبلاگ اسکالی قبلاً آن را پر کرده است. به ظرفی که محتوای پست وبلاگ را در خود جای می دهد، یک ظاهر طراحی می کنید. src/app/blog/blog/blog.component.html را باز کنید و محتوای boilerplate را با خطوط زیر جایگزین کنید:

src/app/blog/blog/blog.component.html

<div class="vw-70">
    <scully-content></scully-content>
</div>

استایلی که به الگو اضافه شده است باعث می‌شود که مولفه وبلاگ با فاصله بهتری در صفحه قرار گیرد. <scully-content></scully-content> محتوای وبلاگ علامت گذاری شده را ارائه می کند.

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

در مرحله بعد، با قرار دادن سرفصل‌ها در مرکز، استایل را تغییر می‌دهید، که ظاهر و احساس بهتری را برای مؤلفه وبلاگ ایجاد می‌کند. src/app/blog/blog/blog.component.css را باز کنید و محتوا را با این خطوط جایگزین کنید:

src/app/blog/blog/blog.component.css

h1, h2, h3, h4, h5, h6 {
  text-align: center;
  padding: 1rem;
}

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

پس از تکمیل، وبلاگ به این شکل خواهد بود (در مرحله آخر می توانید پیش نمایش سایت را مشاهده کنید):

ایجاد صفحه فرود وبلاگ

اکنون که ماژول وبلاگ را ایجاد کرده اید و استایلی را به پست های وبلاگ اضافه کرده اید، صفحه فرود وبلاگ را ایجاد می کنید و یک استایل به صفحه فرود اضافه می کنید.

صفحه فرود وبلاگ همه پست های وبلاگ شما را فهرست می کند. با اجرای دستور زیر در ریشه پروژه می توانید آن را ایجاد کنید:

ng generate component blog/blog-landing

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

src/app/blog

src/app/blog
├── blog
│   ├── blog.component.css
│   ├── blog.component.html
│   ├── blog.component.spec.ts
│   └── blog.component.ts
├── blog-landing
│   ├── blog-landing.component.css
│   ├── blog-landing.component.html
│   └── blog-landing.component.ts
├── blog-routing.module.ts
└── blog.module.ts

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

src/app/blog/blog-landing/blog-landing.component.ts را باز کنید و تغییرات زیر را اعمال کنید:

src/app/blog/blog-landing/blog-landing.component.ts

import { Component } from '@angular/core';
import { ScullyRoute, ScullyRoutesService } from '@scullyio/ng-lib';
import { map } from 'rxjs/operators';

@Component({
  selector: 'app-blog-landing',
  templateUrl: './blog-landing.component.html',
  styleUrls: ['./blog-landing.component.css']
})
export class BlogLandingComponent {
  links$ = this.scully.available$.pipe(
    map(routes => routes.filter((route: ScullyRoute) => route.route.startsWith('/blog/')))
  );

  respOptions = [
    { viewClasses: 'd-none d-md-flex', displayInColumn: false, titleClasses: 'display-3' },
    { viewClasses: 'd-flex d-md-none', displayInColumn: true, titleClasses: '' }
  ];

  constructor(private scully: ScullyRoutesService) { }
}

برای دریافت لیستی از تمام مسیرهای وبلاگ، از ScullyRoutesService استفاده خواهید کرد. قابل مشاهده $ موجود، تمام مسیرهایی را که توسط Scully ارائه شده و به عنوان منتشر شده علامت گذاری شده است، برمی گرداند. شما می توانید مشخص کنید که آیا یک پست وبلاگ منتشر شده است یا نه در فایل نشانه گذاری آن. (در مرحله بعدی به این موضوع پرداخته خواهد شد.) این قابل مشاهده همه مسیرها، از جمله مسیرهای موجود در نمونه کارها را برمی گرداند. بنابراین شما فقط مسیرهای حاوی پیشوند /blog/ را فیلتر خواهید کرد. مسیرهای وبلاگ توسط ویژگی links$ نگهداری می شود. ویژگی respOptions به پاسخگویی کمک می کند.

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

در مرحله بعد، الگوی صفحه فرود وبلاگ را تغییر می دهید تا همه پست های وبلاگ موجود را در کارت لیست کرده و به آنها پیوند دهید. عنوان وبلاگ را نیز در خود دارد. src/app/blog/blog-landing/blog-landing.component.html را باز کنید و خطوط زیر را اضافه کنید:

src/app/blog/blog-landing/blog-landing.component.html

<div *ngFor="let options of respOptions" [ngClass]="options.viewClasses"
    class="flex-column align-items-center text-center vw-90 mx-auto">
    <h1 [ngClass]="options.titleClasses" class="mb-5"><span class="font-weight-bold">Jane's</span> Blog</h1>
    <div [ngClass]="{'justify-content-center flex-wrap': !options.displayInColumn,  'flex-column align-items-center': options.displayInColumn}"
        class="d-flex vw-90">
        <div *ngFor="let page of links$ | async" class="card post-card m-3">
            <div class="card-img-top bg-dark">
                <i class="far fa-newspaper fa-4x m-5 text-white"></i>
            </div>
            <div class="card-body d-flex flex-column">
                <h5 class="card-title post-title" [title]="page.title">{{page.title}}</h5>
                <p class="card-text post-description flex-grow-1">{{page.description}}</p>
                <a [routerLink]="page.route" class="btn btn-outline-dark align-self-center">
                    <i class="fa-lg mr-1 far fa-eye"></i>
                    Read
                </a>
            </div>
        </div>
    </div>
</div>

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

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

در نهایت، یک استایل به قالب فرود وبلاگ اضافه خواهید کرد. به کارت های پروژه ای که به صفحه اضافه می شوند استایل می دهد. src/app/blog/blog-landing/blog-landing.component.css را باز کنید و خطوط زیر را اضافه کنید:

src/app/blog/blog-landing/blog-landing.component.css

.post-card {
    width: 290px;
    height: 360px;
}

.post-title {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 20ch;
}

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

پس از تکمیل (و پس از افزودن پست های وبلاگ)، صفحه فرود وبلاگ به این شکل خواهد بود (در مرحله آخر می توانید پیش نمایش سایت را مشاهده کنید):

افزودن مسیر فرود بلاگ

برای دسترسی به صفحه فرود وبلاگ در مسیر /blog، باید یک مسیر برای آن در BlogRoutingModule اضافه کنید. بدون افزودن این، برای برنامه در دسترس نخواهد بود. src/app/blog/blog-routing.module.ts را باز کنید و خطوط هایلایت شده را اضافه کنید:

src/app/blog/blog-routing.module.ts

...
import { BlogLandingComponent } from './blog-landing/blog-landing.component';

const routes: Routes = [
  { path: '', component: BlogLandingComponent },
  { path: ':slug', component: BlogComponent },
  { path: '**', component: BlogComponent }
];
...

در اینجا شما مسیر BlogLandingComponent را به آرایه مسیرها اضافه کردید. این باعث می شود که در مسیر /blog قابل دسترسی باشد.

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

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

مرحله 5 – اضافه کردن پست های جدید وبلاگ

در این مرحله از Scully برای ایجاد پست های وبلاگ جدید که در صفحه فرود وبلاگ نمایش داده می شوند استفاده خواهید کرد. با Scully، می توانید فایل های علامت گذاری ایجاد کنید که به عنوان پست های وبلاگ شما خدمت می کنند. مؤلفه وبلاگی که در مرحله قبل ایجاد کردید، نسخه علامت گذاری شده یک پست وبلاگ را می خواند و سپس آن را نمایش می دهد. Markdown نوشتن محتوای وبلاگ با فرمت غنی را به سرعت و به راحتی آسان می کند. Scully این فایل‌ها را ایجاد می‌کند و پوشه‌هایی را نیز اضافه می‌کند تا آنها را برای شما در خود جای دهد. همچنین ابرداده مانند عنوان و توضیحات را به هر پست اضافه می کند. برخی از ابرداده ها برای تعیین نحوه نمایش یک پست استفاده می شود. بعداً، از Scully برای تولید نسخه‌های صفحه HTML ایستا از این پست‌های وبلاگ علامت‌گذاری شده استفاده خواهید کرد.

قبل از اینکه بتوانید یک پست ایجاد کنید، باید یک نام بیاورید. برای این آموزش، یک پست با عنوان “پست وبلاگ 1” ایجاد خواهید کرد. شما این نام را با استفاده از پرچم –name از ریشه پروژه به دستور زیر ارائه می دهید.

ng generate @scullyio/init:post –name=”Blog Post 1″

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

 

Output

? What's the target folder for this post? blog
    ✅️ Blog ./blog/blog-post-1.md file created
CREATE blog/blog-post-1.md (103 bytes)

با این کار یک فایل /blog/blog-post-1.md در ریشه پروژه ایجاد می شود. محتویات فایل مشابه این خواهد بود:

blog/blog-post-1.md

---
title: Blog Post 1
description: blog description
published: false
---

# Blog Post 1

هنگامی که محتوایی را به پست وبلاگ خود اضافه کردید و از آن راضی بودید، می توانید محتوای منتشر شده را به درست تغییر دهید و هنگامی که سایت را ارائه می کنید در صفحه فرود وبلاگ ظاهر می شود. برای مشاهده پست هایی که هنوز منتشر نشده اند، می توانید از ویژگی Slug استفاده کنید.

به عنوان مثال، فرض کنید این slug را اضافه کرده اید:

blog/blog-post-1.md

---
title: Blog Post 1
description: blog description
published: true
slug: alternate-url-for-blog-post-1
---

# Blog Post 1

هنگامی که سرور را اجرا می کنید، می توانید این پست را در https://localhost:1668/blog/alternate-url-for-blog-post-1 مشاهده کنید. با این حال، این پست منتشر نشده در صفحه فرود وبلاگ نشان داده نمی شود مگر اینکه به عنوان منتشر شده علامت گذاری شود: درست است. هنگامی که مسیرهای اسکالی را ایجاد می کنید، همانطور که در مرحله بعد خواهید دید، اسکالی یک اسلاگ برای همه پست های منتشر نشده شما اضافه می کند تا مجبور نباشید.

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

/blog/blog-post-1.md

---
title: Blog Post 1
description: Your first blog post
published: true
---

# Blog Post 1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus vitae tempor erat, eget accumsan lorem. Ut id sem id massa mattis dictum ullamcorper vitae massa. In luctus neque lectus, quis dictum tortor elementum sit amet. Mauris non lacinia nisl. Nulla tristique arcu quam, quis posuere diam elementum nec. Curabitur in mi ut purus bibendum interdum ut sit amet orci. Duis aliquam tristique auctor. Suspendisse magna magna, pellentesque vitae aliquet ac, sollicitudin faucibus est. Integer semper finibus leo, eget placerat enim auctor quis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed aliquam nibh in mi convallis mattis nec ac mi. Nam sed sagittis purus.

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

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

ng generate @scullyio/init:post –name=”Blog Post 2″
ng generate @scullyio/init:post –name=”Blog Post 3″

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

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

مرحله 6 – فعال کردن Anchor Scrolling و پاک کردن الگوی مؤلفه برنامه

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

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

ابتدا فایل ماژول را برای ماژول مسیریابی برنامه تغییر می دهید. این ماژول مسئول مسیریابی در کل برنامه است. در اینجا اسکرول لنگر را فعال خواهید کرد. src/app/app-routing.module.ts را باز کنید و قسمت برجسته شده را اضافه کنید:

src/app/app-routing.module.ts

...
@NgModule({
  imports: [RouterModule.forRoot(routes, { anchorScrolling: 'enabled' })],
  exports: [RouterModule]
})
...

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

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

ابتدا فایل ماژول را برای ماژول مسیریابی برنامه تغییر می دهید. این ماژول مسئول مسیریابی در کل برنامه است. در اینجا اسکرول لنگر را فعال خواهید کرد. src/app/app-routing.module.ts را باز کنید و قسمت برجسته شده را اضافه کنید:

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

برای حذف کد متغیر ایجاد شده از صفحه اصلی، src/app/app.component.html را باز کنید و محتوای آن را با خطوط زیر جایگزین کنید:

src/app/app.component.html

<div class="d-flex flex-column h-100 w-100">
    <app-header></app-header>
    <div class="d-flex flex-column flex-grow-1 align-items-center justify-content-center">
        <router-outlet></router-outlet>
    </div>
</div>

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

در مرحله بعد، باید مطمئن شوید که AppModule به app-header دسترسی دارد. از آنجایی که app-header در ماژول دیگری وجود دارد، App Module در حال حاضر به آن دسترسی ندارد. شما باید CoreModule را به عنوان import به src/app/app.module.ts اضافه کنید زیرا CoreModule دسترسی به مولفه هدر را فراهم می کند. app.module.ts را باز کنید و import را همانطور که در زیر مشخص شده است اضافه کنید.

src/app/app.module.ts

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { ScullyLibModule } from '@scullyio/ng-lib';
import { CoreModule } from './core/core.module';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    ScullyLibModule,
    CoreModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

ایجاد این تغییر تضمین می کند که AppModule به app-header دسترسی دارد.

در نهایت، با تغییر src/styles.css، تغییراتی در استایل کلی برنامه ایجاد خواهید کرد. چندین مؤلفه در سراسر برنامه از استایل موجود در این فایل استفاده می کنند. این به ظاهر و احساس کلی برنامه کمک می کند و از تکرار جلوگیری می کند زیرا استایل در همه اجزاء مورد استفاده مجدد قرار می گیرد.

قبل از اجرای سایت، src/styles.css را باز کرده و خطوط زیر را اضافه کنید:

src/styles.css

html, body {
    width: 100%;
    height: 100%;
}

body {
    font-family: 'Nunito', Arial, Verdana, Geneva, Tahoma, sans-serif;
    background: white;
    background-image: radial-gradient(lightgray 5.5%, transparent 0);
    background-size: 30px 30px;
}

.vw-90 {
    width: 90vw;
}

.vw-80 {
    width: 80vw;
}

.vw-70 {
    width: 80vw;
}

.min-vh-10 {
    min-height: 10vh;
}

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

در این مرحله، اسکرول لنگر را فعال کردید، استایل کلی را اضافه کردید و قالب مؤلفه برنامه را پاکسازی کردید. در مرحله بعد، سایت را می سازید، مسیرهای Scully را رندر می کنید و نمونه کارها را سرویس می دهید.

مرحله 7 – پیش نمایش سایت استاتیک

اکنون که تمام تغییرات کد لازم را انجام داده اید، می توانید نمونه کارها را با Scully پیش نمایش کنید. این شامل ساخت سایت شما، تولید مسیرهای اسکالی و سپس ارائه نسخه ثابت سایت می شود. در این مرحله، اسکالی برنامه Angular شما را از قبل در یک سایت استاتیک رندر می کند و سروری را برای سرویس دهی به برنامه Angular و نمونه کارها استاتیک ارائه می دهد.

قبل از اینکه اسکالی بتواند نمونه کارها را از قبل رندر کند، باید آن را بسازید.

ng build

این دستور پورتفولیو شما را به dist/portfolio کامپایل می کند.

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

Compiling @angular/core : es2015 as esm2015
Compiling @angular/common : es2015 as esm2015
Compiling @angular/platform-browser : es2015 as esm2015
Compiling @angular/router : es2015 as esm2015
Compiling @angular/platform-browser-dynamic : es2015 as esm2015
Compiling @angular/common/http : es2015 as esm2015
Compiling @angular/forms : es2015 as esm2015
Compiling @scullyio/ng-lib : es2015 as esm2015
Compiling @ng-bootstrap/ng-bootstrap : es2015 as esm2015
✔ Browser application bundle generation complete.
✔ Copying assets complete.
✔ Index html generation complete.

Initial Chunk Files           | Names                      |      Size
vendor.js                     | vendor                     |   3.49 MB
styles.css                    | styles                     | 202.25 kB
polyfills.js                  | polyfills                  | 141.85 kB
main.js                       | main                       |  24.91 kB
runtime.js                    | runtime                    |   9.06 kB

                              | Initial Total              |   3.86 MB

Lazy Chunk Files              | Names                      |      Size
portfolio-portfolio-module.js | portfolio-portfolio-module |  34.19 kB
blog-blog-module.js           | blog-blog-module           |  15.28 kB

Build at:  - Hash:  - Time: 29012ms

وقتی ساخت کامل شد، اجرا کنید:

npx scully

اسکالی کل نمونه کارها را با طی کردن هر مسیر و ایجاد یک index.html جداگانه برای هر یک از آنها از قبل رندر می کند. نمونه کار از پیش رندر شده در dist/static قرار خواهد گرفت. این پوشه باید شبیه این باشد. (برخی فایل ها برای وضوح حذف شده اند.)

dist/static

dist/static
├── about
│   └── index.html
├── assets
├── blog
│   ├── angular-unit-testing
│   │   └── index.html
│   ├── create-a-blog-using-vue.js
│   │   └── index.html
│   ├── how-to-create-a-twitter-bot
│   │   └── index.html
│   └── index.html
├── index.html
└── projects
    └── index.html

توجه کنید که چگونه هر مسیر فایل index.html جداگانه خود را دارد.

برای پیش نمایش سایت استاتیک، اجرا کنید:

npm run scully:serve

این دستور یک سرور Scully استاتیک را در http://localhost:1668/ راه اندازی می کند و نمونه کارها استاتیک شما را ارائه می دهد. (زمانی که پیش نمایش سایت خود را به پایان رساندید، می توانید سرور را با Ctrl + C در ترمینالی که سرور در آن اجرا می کند، بکشید.)

scully.portfolio.config.ts

import { ScullyConfig } from '@scullyio/scully';
export const config: ScullyConfig = {
  projectRoot: "./src",
  projectName: "portfolio",
  outDir: './dist/static',
  routes: {
    '/blog/:slug': {
      type: 'contentFolder',
      slug: {
        folder: "./blog"
      }
    },
  },
  puppeteerLaunchOptions: {args: ['--no-sandbox', '--disable-setuid--sandbox']}
};

صفحه اصلی http://localhost:4200 باید به این صورت باشد:

در این مرحله، شما اپلیکیشن Angular خود را ساخته اید، آن را از قبل در یک سایت استاتیک رندر کرده و با استفاده از Scully به آن سرویس داده اید.

نتیجه

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

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

 

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/

 

برچسب‌ها:Angular 11Jamstack PortfolioScullyاتصال به سرور مجازی لینوکسخرید سرورراه اندازی برنامه Angularراه اندازی سرورسرورسرور مجازینصب Dependencies

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه بازنشانی رمز عبور MySQL یا MariaDB Root در اوبونتو 20.04

ورود به سایت

معرفی

رمز عبور پایگاه داده خود را فراموش کرده اید؟ برای بهترین ما اتفاق می افتد. اگر رمز عبور اصلی پایگاه داده MySQL یا MariaDB خود را فراموش کرده یا گم کرده اید، اگر به سرور و یک حساب کاربری با امتیازات sudo دسترسی دارید، همچنان می توانید دسترسی داشته باشید و رمز عبور را بازنشانی کنید.

این آموزش نشان می دهد که چگونه رمز عبور ریشه برای پایگاه های داده MySQL و MariaDB نصب شده با مدیر بسته apt در اوبونتو 20.04 را بازنشانی کنید. روش تغییر رمز عبور ریشه بسته به اینکه MySQL یا MariaDB را نصب کرده باشید و پیکربندی سیستمی پیش‌فرض که با توزیع یا بسته‌های فروشندگان دیگر ارسال می‌شود، متفاوت است. در حالی که دستورالعمل‌های این آموزش ممکن است با سایر نسخه‌های سرور سیستم یا پایگاه داده کار کند، اما با Ubuntu 20.04 و بسته‌های عرضه‌شده توسط توزیع آزمایش شده‌اند.

پیش نیازها

برای بازیابی رمز عبور ریشه MySQL یا MariaDB، به موارد زیر نیاز دارید:

  • دسترسی به سرور اوبونتو 20.04 در حال اجرا MySQL یا MariaDB با کاربر sudo یا راه دیگری برای دسترسی به سرور با امتیازات ریشه.
  • برای اینکه روش های بازیابی را در این آموزش بدون تاثیر روی سرور تولید خود آزمایش کنید، یک سرور آزمایشی ایجاد کنید و سپس آموزش اولیه راه اندازی سرور ما را دنبال کنید. مطمئن شوید که یک کاربر معمولی و غیر ریشه با امتیازات sudo ایجاد کنید. سپس MySQL را طبق راهنمای ما در مورد نحوه نصب MySQL در اوبونتو 20.04 نصب کنید یا MariaDB را به دنبال نحوه نصب MariaDB در اوبونتو 20.04 نصب کنید.

مرحله 1 – شناسایی نسخه پایگاه داده و توقف سرور

اوبونتو 20.04 یا MySQL یا MariaDB را اجرا می‌کند—یک جایگزین محبوب که با MySQL سازگار است. بسته به اینکه کدام یک از آنها را نصب کرده اید، باید از دستورات مختلفی برای بازیابی رمز عبور root استفاده کنید، بنابراین مراحل این بخش را دنبال کنید تا مشخص کنید کدام سرور پایگاه داده را اجرا می کنید.

نسخه خود را با دستور زیر بررسی کنید:

mysql –version

اگر MariaDB را اجرا می کنید، “MariaDB” را با شماره نسخه در خروجی مشاهده خواهید کرد:

 

MariaDB output

mysql  Ver 15.1 Distrib 10.3.25-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

اگر MySQL را اجرا می کنید، خروجی مانند زیر را خواهید دید:

 

MySQL output

mysql  Ver 8.0.22-0ubuntu0.20.04.3 for Linux on x86_64 ((Ubuntu))

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

برای تغییر رمز عبور ریشه، باید سرور پایگاه داده را خاموش کنید. اگر MariaDB را اجرا می کنید، می توانید این کار را با دستور زیر انجام دهید:

sudo systemctl stop mariadb

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

sudo systemctl stop mysql

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

مرحله 2 – راه اندازی مجدد سرور پایگاه داده بدون بررسی مجوز

اجرای MySQL و MariaDB بدون بررسی مجوز امکان دسترسی به خط فرمان پایگاه داده با امتیازات root را بدون ارائه رمز عبور معتبر فراهم می کند. برای انجام این کار، باید پایگاه داده را از بارگیری جداول کمک هزینه، که اطلاعات امتیازات کاربر را ذخیره می کند، متوقف کنید. از آنجایی که این کمی یک خطر امنیتی است، ممکن است بخواهید شبکه را غیرفعال کنید تا از اتصال سایر کلاینت ها به سرور آسیب پذیر موقت جلوگیری کنید.

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

پیکربندی MariaDB برای شروع بدون Grant Tables

برای راه‌اندازی سرور MariaDB بدون جداول کمک هزینه، از فایل unit systemd برای تنظیم پارامترهای اضافی برای سرور MariaDB استفاده می‌کنیم.

دستور زیر را اجرا کنید، که متغیر محیطی MYSQLD_OPTS مورد استفاده توسط MariaDB را هنگام راه اندازی تنظیم می کند. گزینه های –skip-grant-tables و –skip-networking به MariaDB می گویند که بدون بارگیری جداول کمک هزینه یا ویژگی های شبکه راه اندازی شود:

sudo systemctl set-environment MYSQLD_OPTS=”–skip-grant-tables –skip-networking”

سپس سرور MariaDB را راه اندازی کنید:

sudo systemctl start mariadb

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

می توانید مطمئن شوید که با sudo systemctl status mariadb شروع شده است.

اکنون باید بتوانید به عنوان کاربر ریشه MariaDB بدون ارائه رمز عبور به پایگاه داده متصل شوید:

sudo mysql -u root

بلافاصله یک درخواست پوسته پایگاه داده را خواهید دید

اکنون که به سرور پایگاه داده دسترسی دارید، می توانید رمز عبور root را همانطور که در مرحله 3 نشان داده شده است تغییر دهید.

پیکربندی MySQL برای شروع بدون Grant Tables

برای راه‌اندازی سرور MySQL بدون جداول کمکی آن، پیکربندی systemd را برای MySQL تغییر می‌دهید تا هنگام راه‌اندازی، پارامترهای اضافی خط فرمان را به سرور ارسال کنید.

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

sudo systemctl edit mysql

این دستور یک فایل جدید را در ویرایشگر نانو باز می کند که از آن برای ویرایش سرویس های MySQL استفاده می کنید. اینها پارامترهای سرویس پیش فرض MySQL را تغییر می دهند.

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

MySQL service overrides

[Service]
ExecStart=
ExecStart=/usr/sbin/mysqld --skip-grant-tables --skip-networking

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

CTRL-x را برای خروج از فایل فشار دهید، سپس Y را فشار دهید تا تغییراتی که ایجاد کرده اید ذخیره شود، سپس برای تایید نام فایل، ENTER را فشار دهید.

برای اعمال این تغییرات، پیکربندی systemd را دوباره بارگیری کنید:

sudo systemctl daemon-reload

اکنون سرور MySQL را راه اندازی کنید:

sudo systemctl start mysql

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

به عنوان کاربر ریشه به پایگاه داده متصل شوید:

sudo mysql -u root

بلافاصله یک درخواست پوسته پایگاه داده را خواهید دید

اکنون که به سرور دسترسی دارید، می توانید رمز عبور root را تغییر دهید.

مرحله 3 – تغییر رمز عبور ریشه

سرور پایگاه داده اکنون در حالت محدود در حال اجرا است. جداول کمک هزینه بارگیری نمی شوند و هیچ پشتیبانی شبکه ای فعال نیست. این به شما امکان می دهد بدون ارائه رمز عبور به سرور دسترسی داشته باشید، اما شما را از اجرای دستوراتی که داده ها را تغییر می دهند منع می کند. برای بازنشانی رمز عبور ریشه، اکنون که به سرور دسترسی پیدا کرده اید، باید جداول کمک هزینه را بارگیری کنید.

با صدور دستور FLUSH PRIVILEGES به سرور پایگاه داده بگویید جداول کمک هزینه را دوباره بارگیری کند:

FLUSH PRIVILEGES;

اکنون می توانید رمز عبور root را تغییر دهید. روشی که استفاده می کنید بستگی به این دارد که آیا از MariaDB یا MySQL استفاده می کنید.

تغییر رمز عبور MariaDB

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

ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘new_password’;

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

 

Output

Query OK, 0 rows affected (0.001 sec)

MariaDB امکان استفاده از مکانیزم های احراز هویت سفارشی را فراهم می کند، بنابراین دو عبارت زیر را اجرا کنید تا مطمئن شوید که MariaDB از مکانیسم احراز هویت پیش فرض خود برای رمز عبور جدیدی که به حساب root اختصاص داده اید استفاده می کند:

UPDATE mysql.user SET authentication_string = ” WHERE user = ‘root’;
UPDATE mysql.user SET plugin = ” WHERE user = ‘root’;

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

 

Output

Query OK, 0 rows affected (0.01 sec)

رمز عبور اکنون تغییر کرده است. برای خروج از کنسول MariaDB عبارت exit را تایپ کنید و برای راه اندازی مجدد سرور پایگاه داده در حالت عادی به مرحله 4 بروید.

تغییر رمز عبور MySQL

برای MySQL، عبارت زیر را اجرا کنید تا رمز عبور کاربر اصلی را تغییر دهید، و new_password را با یک رمز عبور قوی که به خاطر بسپارید جایگزین کنید. MySQL امکان استفاده از مکانیسم‌های احراز هویت سفارشی را فراهم می‌کند، بنابراین عبارت زیر همچنین مطمئن می‌شود که MySQL از مکانیسم احراز هویت پیش‌فرض خود برای احراز هویت کاربر root با استفاده از رمز عبور جدید استفاده می‌کند:

ALTER USER ‘root’@’localhost’ IDENTIFIED WITH caching_sha2_password BY ‘new_password’;

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

 

Output

Query OK, 0 rows affected (0.01 sec)

رمز عبور اکنون تغییر کرده است. با تایپ exit از کنسول MySQL خارج شوید.

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

مرحله 4 – سرور پایگاه داده خود را به تنظیمات عادی برگردانید

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

برای MariaDB، متغیر محیطی MYSQLD_OPTS را که قبلا تنظیم کرده بودید، از حالت تنظیم خارج کنید:

sudo systemctl unset-environment MYSQLD_OPTS

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

sudo systemctl restart mariadb

برای MySQL، پیکربندی اصلاح شده systemd را حذف کنید:

sudo systemctl revert mysql

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

 

Output

Removed /etc/systemd/system/mysql.service.d/override.conf.
Removed /etc/systemd/system/mysql.service.d.

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

sudo systemctl daemon-reload

در نهایت سرویس را مجددا راه اندازی کنید:

sudo systemctl restart mysql

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

mysql -u root -p

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

نتیجه

شما دسترسی مدیریتی به سرور MySQL یا MariaDB را بازیابی کرده اید. مطمئن شوید رمز عبور جدیدی که انتخاب کرده اید قوی و ایمن است و آن را در مکانی امن نگه دارید.

 

 

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/

 

MySQLاوبونتو 20.04بازیابی رمز عبور MariaDBپایگاه داده MySQLپیکربندی MariaDBخرید سرورخرید سرور لینوکسراه اندازی مجدد سرورراه‌اندازی سرور MySQLسرور مجازیفراموش کردن رمز پایگاه دادهنحوه بازنشانی رمز عبور MySQL

  • behnam gol mohamadi
  • ۰
  • ۰

چگونه از یک ماژول خصوصی Go در پروژه خود استفاده کنید

ورود به سایت

 

 

 

معرفی

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

در این آموزش، ماژول Go خصوصی را منتشر می‌کنید، احراز هویت را برای دسترسی به یک ماژول خصوصی تنظیم می‌کنید و از ماژول Go خصوصی در پروژه استفاده می‌کنید.

پیش نیازها

  • Go نسخه 1.16 یا بالاتر نصب شده است، که می توانید با دنبال کردن سری ما، نحوه نصب و راه اندازی یک محیط برنامه نویسی محلی برای Go، این کار را انجام دهید.
  • درک توزیع ماژول های Go،
  • آشنایی با Git،
  • یک مخزن خصوصی خالی GitHub با نام mysecret برای ماژول خصوصی منتشر شده شما.
  • یک رمز دسترسی شخصی GitHub با دسترسی به خواندن از مخازن شما. از این برای اجازه دسترسی Go به مخزن خصوصی شما استفاده خواهید کرد.

توزیع یک ماژول خصوصی

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

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

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

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

mkdir projects

cd projects

از دایرکتوری پروژه‌ها، git clone را اجرا کنید تا مخزن mysecret خصوصی شما در رایانه شما کلون شود:

git clone git@github.com:your_github_username/mysecret.git

Git تایید می کند که ماژول شما را شبیه سازی کرده است و ممکن است به شما هشدار دهد که یک مخزن خالی را شبیه سازی کرده اید. اگر چنین است، این چیزی نیست که باید نگران آن باشید:

 

Output

Cloning into 'mysecret'...
warning: You appear to have cloned an empty repository.

در مرحله بعد، از cd برای رفتن به دایرکتوری mysecret جدیدی که کلون کرده اید استفاده کنید و از go mod init به همراه نام مخزن خصوصی خود برای ایجاد یک ماژول Go جدید استفاده کنید:

cd mysecret

go mod init github.com/your_github_username/mysecret

اکنون که ماژول شما ایجاد شد، زمان آن رسیده است که تابعی را اضافه کنید که می توانید از پروژه دیگری استفاده کنید. از nano یا ویرایشگر متن مورد علاقه خود برای باز کردن فایلی با همان نام مخزن خود مانند mysecret.go استفاده کنید. نام مهم نیست و می‌تواند هر چیزی باشد، اما استفاده از همان نام مخزن، تشخیص اینکه در هنگام کار با یک ماژول جدید، ابتدا به کدام فایل نگاه کنید، آسان‌تر می‌شود:

nano mysecret.go

در فایل mysecret.go، بسته را با همان نام مخزن خود نامگذاری کنید، سپس یک تابع SecretProcess برای چاپ خط Running the secret اضافه کنید! هنگام تماس:

projects/mysecret/mysecret.go

package mysecret

import "fmt"

func SecretProcess() {
    fmt.Println("Running the secret process!")
}

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

از آنجایی که هر دو ماژول Go خصوصی و عمومی مخازن منبع هستند، انتشار یک ماژول Go خصوصی همان فرآیند انتشار عمومی را دنبال می کند. برای انتشار ماژول جدید خود، تغییرات خود را با استفاده از دستور git add در فهرست فعلی مرحله بندی کنید، سپس با دستور git commit آن تغییرات را در مخزن محلی خود انجام دهید:

git add .

git commit -m “Initial private module implementation”

تأییدیه ای از Git مبنی بر موفقیت آمیز بودن commit اولیه و همچنین خلاصه ای از فایل های موجود در commit را مشاهده خواهید کرد:

 

Output

[main (root-commit) bda059d] Initial private module implementation
 2 files changed, 10 insertions(+)
 create mode 100644 go.mod
 create mode 100644 mysecret.go

اکنون تنها قسمت باقی مانده این است که تغییرات خود را به مخزن GitHub خود منتقل کنید. مشابه یک ماژول عمومی، از دستور git push برای انتشار کد خود استفاده کنید:

git push

سپس Git تغییرات شما را تحت فشار قرار می دهد و آنها را برای هر کسی که به مخزن خصوصی شما دسترسی دارد در دسترس قرار می دهد:

git push origin main
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 404 bytes | 404.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:your_github_username/mysecret.git
 * [new branch]      main -> main

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

در این بخش، ماژول جدیدی با تابع SecretProcess ایجاد کردید و آن را در مخزن mysecret خصوصی GitHub خود منتشر کردید و آن را به یک ماژول Go خصوصی تبدیل کردید. با این حال، برای دسترسی به این ماژول از برنامه Go دیگر، باید Go را پیکربندی کنید تا بداند چگونه به ماژول دسترسی پیدا کند.

پیکربندی رفتن به دسترسی به ماژول های خصوصی

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

برای استفاده از ماژول خصوصی، با تنظیم آن در متغیر GOPRIVATE، به Go بگویید کدام مسیر را خصوصی در نظر بگیرید. هنگام تنظیم مقادیر متغیر GOPRIVATE، چند انتخاب وجود دارد. یک گزینه این است که GOPRIVATE را روی github.com تنظیم کنید. اگرچه ممکن است این چیزی نباشد که شما به دنبال آن هستید، زیرا این امر به Go می‌گوید که از خدمات مرکزی برای هر ماژول میزبانی شده در github.com، از جمله مواردی که مال شما نیستند، استفاده نکند.

گزینه بعدی این است که GOPRIVATE را فقط روی مسیر کاربری خود تنظیم کنید، مانند github.com/your_github_username. این مشکل در نظر گرفتن تمام GitHub خصوصی را حل می کند، اما در برخی مواقع ممکن است ماژول های عمومی ایجاد کنید که بخواهید از طریق آینه ماژول Go دانلود کنید. انجام این کار هیچ مشکلی ایجاد نمی کند و یک گزینه کاملا منطقی خواهد بود، اما شما همچنین می توانید این گزینه را دقیق تر کنید.

خاص ترین گزینه تنظیم GOPRIVATE برای مطابقت دقیق با مسیر ماژول شما است، مانند: github.com/your_github_username/mysecret. این هر دو مشکل از گزینه های قبلی را حل می کند، اما همچنین مشکلی را معرفی می کند که باید هر یک از مخازن خصوصی خود را به صورت جداگانه به GOPRIVATE اضافه کنید، مانند نشان داده شده در اینجا:

GOPRIVATE=github.com/your_github_username/mysecret,github.com/your_github_username/othersecret

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

از آنجایی که اکنون فقط یک ماژول خصوصی دارید، از نام مخزن کامل برای مقدار استفاده خواهیم کرد. برای تنظیم متغیر محیطی GOPRIVATE=github.com/your_github_username/mysecret در ترمینال فعلی خود، از دستور صادرات استفاده کنید:

export GOPRIVATE=github.com/your_github_username/mysecret

اگر می خواهید دوباره بررسی کنید که تنظیم شده است، می توانید از دستور env به همراه grep برای بررسی نام GOPRIVATE استفاده کنید:

env | grep GOPRIVATE

 

Output

GOPRIVATE=github.com/your_github_username/mysecret

اگرچه Go اکنون می داند که ماژول شما خصوصی است، هنوز برای استفاده از ماژول کافی نیست. اگر سعی کنید ماژول خصوصی خود را به ماژول دیگری وارد کنید، احتمالاً خطای مشابه زیر را مشاهده خواهید کرد:

go get github.com/your_github_username/mysecret

 

Output

go get: module github.com/your_github_username/mysecret: git ls-remote -q origin in /Users/your_github_username/go/pkg/mod/cache/vcs/2f8c...b9ea: exit status 128:
    fatal: could not read Username for 'https://github.com': terminal prompts disabled
Confirm the import path was entered correctly.
If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.
 

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

ارائه اعتبار ماژول خصوصی برای HTTPS

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

به طور پیش‌فرض، وقتی go get تلاش می‌کند یک ماژول را دانلود کند، ابتدا سعی می‌کند از HTTPS استفاده کند. با این حال، همانطور که در مثال قبلی نشان داده شد، نمی‌تواند از شما نام کاربری و رمز عبور را بخواهد. برای دادن اعتبار به Git، باید یک netrc. داشته باشید که شامل github.com در فهرست اصلی خود است.

برای ایجاد یک فایل netrc. در Linux، MacOS، یا Windows Subsystem for Linux (WSL)، فایل netrc. را در فهرست اصلی خود (~/) باز کنید تا بتوانید آن را ویرایش کنید:

nano ~/.netrc

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

~/.netrc

machine github.com
login your_github_username
password your_github_access_token

در صورت تمایل، می توانید کل ورودی را نیز در یک خط در فایل قرار دهید:

~/.netrc

machine github.com login your_github_username password your_github_access_token

اکنون محیط شما برای استفاده از احراز هویت HTTPS برای دانلود ماژول خصوصی شما تنظیم شده است. حتی اگر HTTPS روش پیش‌فرض Go و Git برای دانلود یک ماژول است، می‌توان به Git گفت که به جای آن از SSH استفاده کند. استفاده از SSH به جای HTTPS می تواند مفید باشد، بنابراین می توانید از همان کلید SSH که برای فشار دادن ماژول خصوصی خود استفاده می کردید استفاده کنید. همچنین به شما این امکان را می دهد که از کلیدهای استقرار هنگام تنظیم یک محیط CI/CD استفاده کنید، اگر ترجیح می دهید رمز دسترسی شخصی ایجاد نکنید.

ارائه اعتبار ماژول خصوصی برای SSH

برای استفاده از کلید SSH به عنوان روش احراز هویت برای ماژول Go خصوصی به جای HTTPS، Git یک گزینه پیکربندی به نام جایگزینOf را ارائه می دهد. گزینه جایگزین به شما این امکان را می دهد که بگویید “به جای” از https://github.com/ به عنوان URL درخواست برای همه درخواست های Git، ترجیح می دهید از ssh://git@github.com/ استفاده کنید.

در لینوکس، MacOS و WSL این پیکربندی در فایل gitconfig. وجود دارد. ممکن است قبلاً با این فایل آشنایی داشته باشید زیرا آدرس ایمیل و نام commit شما نیز در آن پیکربندی شده است. برای ویرایش فایل، از nano یا ویرایشگر متن مورد علاقه خود استفاده کنید و فایل ~/.gitconfig را در فهرست اصلی خود باز کنید:

nano ~/.gitconfig

هنگامی که فایل را باز کردید، آن را ویرایش کنید تا بخش url برای ssh://git@github.com/ مانند مثال زیر باشد:

~/.gitconfig

[user]
    email = your_github_username@example.com
    name = Sammy the Shark

[url "ssh://git@github.com/"]
    insteadOf = https://github.com/

ترتیب قسمت url نسبت به بخش کاربر اهمیتی ندارد و همچنین لازم نیست نگران باشید اگر هیچ چیز دیگری در فایل به جز قسمت url که به تازگی اضافه کرده اید وجود ندارد. ترتیب فیلدهای ایمیل و نام در قسمت کاربری نیز مهم نیست.

این بخش جدید به Git می‌گوید که هر نشانی اینترنتی که با https://github.com/ شروع می‌شود باید با ssh://git@github.com/ جایگزین شود. از آنجایی که Go به طور پیش فرض از HTTPS استفاده می کند، این امر بر دستورات go get شما نیز تأثیر می گذارد. با استفاده از ماژول خصوصی خود به عنوان مثال، این بدان معناست که Go مسیر واردات github.com/your_github_username/mysecret را به URL https://github.com/your_github_username/mysecret تبدیل می کند. هنگامی که Git با این URL روبرو می شود، URL را با پیشوند https://github.com/ مطابقت می بیند که به جای آن به آن ارجاع داده شده است و URL حاصل را به ssh://git@github.com/your_github_username/mysecret تبدیل می کند.

تا زمانی که URL ssh://git@ برای آن میزبان نیز کار کند، می‌توان از این الگو برای دامنه‌هایی غیر از GitHub استفاده کرد.

در این بخش، Git را برای استفاده از SSH برای دانلود ماژول های Go با به روز رسانی فایل .gitconfig و افزودن یک بخش url پیکربندی کردید. اکنون که احراز هویت برای ماژول خصوصی شما تنظیم شده است، می توانید برای استفاده در برنامه های Go خود به آن دسترسی داشته باشید.

استفاده از ماژول خصوصی

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

در دایرکتوری که برای پروژه های خود استفاده می کنید، مانند پروژه ها، با استفاده از دستور mkdir یک دایرکتوری به نام myproject برای پروژه جدید ایجاد کنید:

mkdir myproject

پس از ایجاد دایرکتوری، با استفاده از cd به دایرکتوری بروید و یک ماژول Go جدید را با استفاده از go mod init برای پروژه خود بر اساس URL مخزنی که پروژه شما در آن زندگی می کند، راه اندازی کنید، مانند github.com/your_github_username/myproject. اگر قصد ندارید پروژه شما به مخزن دیگری منتقل شود، نام ماژول می تواند فقط myproject یا هر نام دیگری باشد، اما استفاده از URL های کامل تمرین خوبی است زیرا اکثر ماژول هایی که به اشتراک گذاشته می شوند به آنها نیاز دارند.

cd myproject
go mod init github.com/your_github_username/myproject

 

Output

go: creating new go.mod: module github.com/your_github_username/myproject

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

nano main.go

در داخل فایل، تابع اصلی اولیه را که ماژول خصوصی خود را از آن فراخوانی می کنید، تنظیم کنید:

projects/myproject/main.go

package main

import "fmt"

func main() {
    fmt.Println("My new project!")
}

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

go run main.go

 

Output

My new project!

در مرحله بعد، ماژول خصوصی خود را به عنوان وابستگی پروژه جدید خود با استفاده از go get اضافه کنید، مشابه آنچه برای یک ماژول عمومی انجام می دهید:

go get github.com/your_github_username/mysecret

سپس ابزار go کد ماژول خصوصی شما را دانلود کرده و با استفاده از یک رشته نسخه که با آخرین هش commit و زمان آن commit مطابقت دارد، آن را به عنوان یک وابستگی اضافه می کند:

 

Output

go: downloading github.com/your_github_username/mysecret v0.0.0-20210920195630-bda059d63fa2
go get: added github.com/your_github_username/mysecret v0.0.0-20210920195630-bda059d63fa2

در نهایت، فایل main.go را دوباره باز کنید و آن را به روز کنید تا یک تماس به تابع SecretProcess ماژول خصوصی خود در تابع اصلی اضافه کنید. همچنین باید عبارت import را به‌روزرسانی کنید تا github.com/your_github_username/mysecret خصوصی ماژول خود را نیز به‌عنوان یک import اضافه کنید:

projects/myproject/main.go

package main

import (
    "fmt"

    "github.com/your_github_username/mysecret"
)

func main() {
    fmt.Println("My new project!")
    mysecret.SecretProcess()
}

برای مشاهده پروژه نهایی در حال اجرا با ماژول خصوصی خود، از دستور go run دوباره استفاده کنید و فایل main.go را به عنوان پارامتر ارائه دهید:

go run main.go

پروژه جدید من را خواهید دید! خط از کد اصلی، اما اکنون یک فرآیند مخفی در حال اجرا را نیز خواهید دید! خط از ماژول mysecret وارد شده شما نیز:

 

Output

My new project!
Running the secret process!

در این بخش از go init برای ایجاد یک ماژول Go جدید برای دسترسی به ماژول خصوصی که قبلا منتشر کرده بودید استفاده کردید. هنگامی که ماژول را ایجاد کردید، سپس از go get برای دانلود ماژول خصوصی خود مانند یک ماژول عمومی Go استفاده کردید. در نهایت از go run برای کامپایل و اجرای برنامه Go خود با استفاده از ماژول خصوصی استفاده کردید.

نتیجه

در این آموزش، شما یک ماژول Go خصوصی ایجاد و منتشر کردید. همچنین برای دسترسی به ماژول Go خصوصی خود، احراز هویت HTTPS و SSH را تنظیم کرده اید. در نهایت، شما از ماژول خصوصی خود در یک پروژه جدید استفاده کردید.

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

علاوه بر متغیر محیطی GOPRIVATE، متغیرهای بیشتری برای استفاده در هنگام کار با ماژول های خصوصی Go در دسترس هستند. آنها را می توان با جزئیات در بخش Private Modules در مرجع Go Modules مشاهده کرد.

 

 

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/

برچسب‌ها:HTTPSSSHاستفاده از ماژول خصوصی Goخرید سرورسرور مجازیفروش سرور مجازیماژول Goماژول خصوصی

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه نصب وب سرور Apache در اوبونتو 18.04

ورود به سایت

معرفی

سرور Apache HTTP پرکاربردترین وب سرور در جهان است. این ویژگی های قدرتمند بسیاری از جمله ماژول های قابل بارگذاری پویا ، پشتیبانی رسانه ای قوی و ادغام گسترده با سایر نرم افزارهای محبوب را ارائه می دهد.

در این راهنما ، نحوه نصب وب سرور Apache را روی سرور اوبونتو 18.04 خود خواهید آموخت. این راهنما همچنین اطلاعات مربوط به فایلها و فهرستهای مهم Apache را تشریح می کند.

پیش نیازها

قبل از شروع این راهنما ، باید یک کاربر معمولی و غیر روت با امتیازات sudo پیکربندی شده در سرور خود داشته باشید. علاوه بر این ، شما باید یک فایروال اساسی را فعال کنید تا پورت های غیر ضروری را مسدود کند. شما می توانید نحوه پیکربندی یک حساب کاربری معمولی و راه اندازی فایروال برای سرور خود را با پیروی از راهنمای راه اندازی اولیه سرور ما برای اوبونتو 18.04 بیاموزید.

هنگامی که یک حساب ایجاد کردید ، برای شروع به عنوان کاربر غیر ریشه خود وارد شوید.

مرحله 1 – نصب Apache

Apache در پیش فرض اوبونتو موجود است و امکان نصب آن را با استفاده از ابزارهای معمول مدیریت بسته فراهم می کند.

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

sudo apt update

سپس ، بسته apache2 را نصب کنید:

sudo apt install apache2

پس از تأیید نصب ، apt Apache و تمام وابستگی های مورد نیاز را نصب می کند.

مرحله 2 – تنظیم فایروال

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

در حین نصب ، Apache خود را با UFW ثبت می کند تا چند پروفایل برنامه را ارائه دهد که می توان از آنها برای فعال یا غیرفعال کردن دسترسی به Apache از طریق فایروال استفاده کرد.

با اجرای دستورات زیر پروفایل های برنامه ufw را لیست کنید

sudo ufw app list

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

 

Output

Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

این لیست نشان می دهد که سه نمایه برای Apache در دسترس است:

  • Apache: این نمایه فقط پورت 80 را باز می کند (ترافیک وب معمولی و رمزگذاری نشده)
  • Apache Full: این نمایه هم پورت 80 (ترافیک معمولی و رمزگذاری نشده وب) و هم پورت 443 (ترافیک رمزگذاری شده TLS/SSL) را باز می کند.
  • Apache Secure: این نمایه فقط پورت 443 را باز می کند (ترافیک رمزگذاری شده TLS/SSL)

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

sudo ufw allow ‘Apache’

با بررسی وضعیت ، این تغییر را تأیید کنید:

sudo ufw status

 

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

 

Output

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Apache                     ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Apache (v6)                ALLOW       Anywhere (v6)

 

اکنون پروفایل آپاچی فعال شده است تا دسترسی به سرور وب امکان پذیر باشد.

مرحله 3 – بررسی سرور وب خود

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

برای اطمینان از اینکه سرویس در حال اجرا است ، با سیستم systemd init تماس بگیرید:

sudo systemctl status apache2

 

Output

● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset:
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: active (running) since Tue 2021-09-28 16:52:56 UTC; 1min 14s ago
 Main PID: 9409 (apache2)
    Tasks: 55 (limit: 4915)
   CGroup: /system.slice/apache2.service
           ├─9409 /usr/sbin/apache2 -k start
           ├─9410 /usr/sbin/apache2 -k start
           └─9411 /usr/sbin/apache2 -k start

این خروجی نشان می دهد که سرویس با موفقیت شروع شده است. با این حال ، بهترین راه برای تأیید این امر درخواست صفحه از Apache است.

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

موارد زیر را در خط فرمان سرور خود اجرا کنید:

hostname -I

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

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

curl -4 icanhazip.com

وقتی آدرس IP سرور خود را دارید ، آن را در نوار آدرس مرورگر خود وارد کنید:

http://your_server_ip

شما باید صفحه وب پیش فرض Ubuntu 18.04 Apache را دریافت کنید:

این صفحه وب نشان می دهد که Apache به درستی کار می کند. همچنین شامل برخی اطلاعات اولیه در مورد فایل های مهم Apache و مکان های فهرست راهنما می باشد.

مرحله 4 – مدیریت فرایند آپاچی

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

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

sudo systemctl stop apache2

برای راه اندازی وب سرور در صورت توقف ، این دستور را اجرا کنید:

sudo systemctl start apache2

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

sudo systemctl restart apache2

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

sudo systemctl reload apache2

به طور پیش فرض ، Apache پیکربندی شده است که هنگام بوت شدن سرور به طور خودکار شروع به کار کند. اگر این آن چیزی نیست که می خواهید ، می توانید این رفتار را با موارد زیر غیرفعال کنید:

sudo systemctl disable apache2

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

sudo systemctl enable apache2

وقتی دوباره سرور بوت می شود ، Apache باید به طور خودکار شروع به کار کند.

مرحله 5 – راه اندازی میزبان مجازی (توصیه می شود)

نگام استفاده از سرور وب آپاچی ، می توانید از میزبان مجازی (مشابه بلوک سرور در Nginx) برای درج جزئیات پیکربندی و میزبانی بیش از یک دامنه از یک سرور استفاده کنید. برای مثال ما ، ما یک دامنه به نام your_domain ایجاد می کنیم ، اما شما باید این نام را با نام دامنه خود جایگزین کنید. برای کسب اطلاعات بیشتر در مورد تنظیم نام دامنه با DigitalOcean ، مقدمه ما بر DigitalOcean DNS را مطالعه کنید.

Apache در اوبونتو 18.04 دارای یک بلوک سرور به طور پیش فرض فعال است که برای ارائه اسناد از فهرست/var/www/html پیکربندی شده است. اگرچه این کار برای یک سایت واحد خوب عمل می کند ، اما اگر از چندین سایت میزبانی می کنید ، ممکن است مشکل باشد. به جای تغییر/var/www/html ، یک ساختار فهرست درون/var/www برای یک سایت your_domain ایجاد کنید ، در صورتی که درخواست مشتری با سایر موارد مطابقت نداشته باشد ،/var/www/html را به عنوان فهرست پیش فرض در محل قرار دهید. سایت های.

دایرکتوری مربوط به دامنه خود را به شرح زیر ایجاد کنید:

sudo mkdir /var/www/your_domain

سپس ، مالکیت دایرکتوری را با متغیر محیط USER $ تعیین کنید:

sudo chown -R $USER:$USER /var/www/your_domain

اگر مقدار ماسک خود را تغییر نداده اید ، مجوز ریشه های وب شما باید صحیح باشد ، اما می توانید با تایپ موارد زیر مطمئن شوید:

sudo chmod -R 755 /var/www/your_domain

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

nano /var/www/your_domain/index.html

داخل ، نمونه HTML زیر را اضافه کنید:

/var/www/your_domain/index.html

<html>
    <head>
        <title>Welcome to Your_domain!</title>
    </head>
    <body>
        <h1>Success!  The your_domain virtual host is working!</h1>
    </body>
</html>

پس از اتمام کار فایل را ذخیره و ببندید. در صورت استفاده از نانو ، می توانید با فشار دادن CTRL + X ، Y و ENTER از سیستم خارج شوید.

برای اینکه Apache این محتوا را ارائه دهد ، لازم است یک فایل میزبان مجازی با دستورالعمل های صحیح ایجاد کنید. به جای تغییر فایل پیکربندی پیش فرض واقع در /etc/apache2/sites-available/000-default.conf ، یک فایل جدید در

/etc/apache2/sites-available/your_domain.conf:

sudo nano /etc/apache2/sites-available/your_domain.conf

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

/etc/apache2/sites-available/your_domain.conf

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName your_domain
    ServerAlias www.your_domain
    DocumentRoot /var/www/your_domain
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

توجه داشته باشید که ما DocumentRoot را به فهرست جدید و ServerAdmin را به ایمیلی که سرپرست سایت your_domain می تواند به آن دسترسی داشته باشد ، به روز کرده ایم. ما همچنین دو دستورالعمل اضافه کرده ایم: ServerName ، که دامنه اصلی را که باید با این تعریف میزبان مجازی مطابقت داشته باشد ، ایجاد می کند ، و ServerAlias ، نامهای دیگری را که باید مطابق نام اصلی باشد مطابقت می دهد.

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

بعد ، فایل را با ابزار a2ensite فعال کنید:

sudo a2ensite your_domain.conf

سایت پیش فرض تعریف شده در 000-default.conf را غیرفعال کنید:

sudo a2dissite 000-default.conf

اکنون خطاهای پیکربندی را آزمایش کنید:

sudo apache2ctl configtest

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

 

Output

Syntax OK

برای پیاده سازی تغییرات ، Apache را مجدداً راه اندازی کنید:

sudo systemctl restart apache2

Apache اکنون باید نام دامنه شما را ارائه دهد. می توانید این مورد را با حرکت به آدرس http: // your_domain ، جایی که باید چیزی مانند موارد زیر دریافت کنید ، آزمایش کنید:

مرحله 6 – آشنایی با فایلها و فهرستهای مهم Apache

اکنون که می دانید چگونه سرویس Apache را مدیریت کنید ، باید چند دقیقه وقت بگذارید تا با چند دایرکتوری و فایل مهم آشنا شوید.

محتوا

  • /var/www/html: محتوای واقعی وب ، که به طور پیش فرض فقط شامل صفحه پیش فرض Apache است که قبلاً مشاهده کردید ، خارج از فهرست/var/www/html ارائه می شود. با تغییر پرونده های پیکربندی Apache می توانید این مورد را تغییر دهید.

پیکربندی سرور

  • /etc/apache2: فهرست پیکربندی Apache. همه فایلهای پیکربندی Apache در اینجا قرار دارند.
  • /etc/apache2/apache2.conf: فایل اصلی پیکربندی Apache است. این می تواند برای ایجاد تغییر در پیکربندی جهانی Apache اصلاح شود. این فایل مسئول بارگیری بسیاری از فایل های دیگر در فهرست پیکربندی است.
  • /etc/apache2/ports.conf: این فایل پورتهایی را که Apache به آنها گوش می دهد ، مشخص می کند. به طور پیش فرض ، هنگامی که ماژولی که قابلیت های SSL را فعال می کند ، آپاچی به پورت 80 گوش می دهد و همچنین به پورت 443 گوش می دهد.
  • /etc/apache2/sites-available/: دایرکتوری که میزبان مجازی هر سایت در آن ذخیره می شود. Apache از فایلهای پیکربندی موجود در این پوشه استفاده نمی کند مگر اینکه به فهرست راهنمای سایتها پیوند خورده باشد. به طور معمول ، تمام پیکربندی بلوک سرور در این فهرست انجام می شود و سپس با پیوند دادن به فهرست دیگر با دستور a2ensite فعال می شود.
  • /etc/apache2/sites-enabled/: دایرکتوری که میزبان مجازی هر سایت فعال در آن ذخیره می شود. به طور معمول ، اینها با پیوند دادن به فایلهای پیکربندی موجود در فهرست سایتهای موجود با a2ensite ایجاد می شوند. Apache فایلهای پیکربندی و پیوندهای موجود در این فهرست را هنگام شروع یا بارگیری مجدد برای کامپایل یک پیکربندی کامل می خواند.
  • /etc/apache2/conf-available/،/etc/apache2/conf-enabled/: این فهرستها همانند فهرستهای سایتهای موجود و سایتهای فعال هستند ، اما برای ذخیره قطعات پیکربندی که متعلق به یک میزبان مجازی فایل های موجود در فهرست conf-available را می توان با دستور a2enconf فعال کرد و با دستور a2disconf غیرفعال کرد.
  • /etc/apache2/mods-available/،/etc/apache2/mods-enabled/: این فهرستها به ترتیب شامل ماژولهای موجود و فعال هستند. فایل هایی که به .load ختم می شوند شامل قطعاتی برای بارگذاری ماژول های خاص هستند ، در حالی که فایل هایی که به .conf ختم می شوند حاوی پیکربندی آن ماژول ها هستند. ماژول ها را می توان با استفاده از دستورات a2enmod و a2dismod فعال و غیرفعال کرد.

Server Logs

  • /var/log/apache2/access.log: به طور پیش فرض ، هر درخواستی از سرور وب شما در این فایل لاگ ثبت می شود مگر اینکه Apache به گونه دیگری تنظیم شده باشد.
  • /var/log/apache2/error.log: به طور پیش فرض ، همه خطاها در این پرونده ثبت می شوند. دستورالعمل LogLevel در پیکربندی Apache مشخص می کند که چقدر شامل خطا خواهند داشت.

نتیجه

اکنون که وب سرور Apache خود را نصب کرده اید ، گزینه های زیادی برای نوع محتوا و سرویس هایی که می توانید برای ایجاد تجربه ای غنی تر استفاده کنید ، در اختیار دارید.

 

برچسب‌ها:

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه به اشتراک گذاری داده ها بین Docker Container و Host

ورود به سایت

معرفی

به طور کلی ، Docker containers زودگذر هستند و درست به اندازه ای طول می کشد که دستور صادر شده در containers کامل شود. به طور پیش فرض ، هر گونه داده ایجاد شده در داخل ظرف فقط از داخل containers و فقط در حین کار در دسترس است.

از حجم های Docker می توان برای اشتراک فایل بین سیستم host و Docker container استفاده کرد. به عنوان مثال ، فرض کنید شما می خواهید از تصویر رسمی Docker Nginx استفاده کنید و یک کپی دائمی از پرونده های log Nginx برای تجزیه و تحلیل بعدی نگه دارید. به طور پیش فرض ، تصویر nginx Docker به پوشه/var/log/nginx داخل Docker Nginx container وارد می شود. به طور معمول از طریق سیستم فایل میزبان قابل دسترسی نیست.

در این آموزش ، نحوه دسترسی داده ها از Docker containers به دستگاه host را بررسی می کنیم.

پیش نیازها

برای پیگیری این مقاله ، به یک سرور اوبونتو 18.04 با موارد زیر نیاز دارید:

  • یک non-root user با امتیازات sudo ، به دنبال راه اندازی سرور اولیه با راهنمای اوبونتو 18.04.
  • Docker با دستورالعمل های مرحله 1 و مرحله 2 نحوه نصب و استفاده از Docker در اوبونتو 18.04 نصب شده است.

اگر با Docker تازه کار هستید ، سری Docker Ecosystem نمای کلی مفاهیم کلیدی را ارائه می دهد.

مرحله 1 – اتصال حجم

دستور زیر یک پوشه به نام nginxlogs در فهرست اصلی کاربر فعلی شما ایجاد کرده و آن را به/var/log/nginx در ظرف متصل می کند:

docker run –name=nginx -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 nginx

بیایید کمی وقت بگذاریم تا این دستور را با جزئیات بررسی کنیم:

  • –name = nginx ، container را نامگذاری می کند تا بتوانیم راحت تر به آن مراجعه کنیم.
  • -d فرآیند را جدا کرده و در پس زمینه اجرا می کند. در غیر این صورت ، ما فقط یک پیام خالی Nginx را مشاهده می کنیم و تا زمانی که Nginx را نکشیم ، نمی توانیم از این ترمینال استفاده کنیم.
  • v ~/nginxlogs:/var/log/nginx یک حجم bindmount ایجاد می کند که فهرست/var/log/nginx را از داخل ظرف Nginx به فهرست ~/nginxlogs در دستگاه میزبان پیوند می دهد. داکر از a: برای تقسیم مسیر میزبان از مسیر ظرف استفاده می کند و مسیر میزبان همیشه اول است.
  • -p 5000: 80 یک پورت رو به جلو ایجاد می کند. Nginx container به طور پیش فرض روی پورت 80 گوش می دهد. این پرچم پورت ظرف 80 را به پورت 5000 در سیستم میزبان ترسیم می کند.
  • nginx مشخص می کند که container باید از تصویر Nginx ساخته شود ، که دستور nginx -g “daemon off” را برای شروع Nginx صادر می کند.

مرحله 2 – دسترسی به داده ها در میزبان

ما در حال حاضر یک نسخه از Nginx را داریم که در داخل Docker container روی دستگاه ما اجرا می شود و پورت 5000 دستگاه میزبان ما مستقیماً به آن نسخه از پورت 80 Nginx ترسیم می شود.

آدرس را در مرورگر وب با استفاده از آدرس IP یا نام میزبان سرور خود و شماره پورت بارگذاری کنید: http: // your_server_ip: 5000. باید ببینی:

جالبتر اینکه اگر در فهرست ~/nginxlogs در host جستجو کنیم ، access.log ایجاد شده توسط container’s nginx را مشاهده می کنیم که درخواست ما را نشان می دهد:

cat ~/nginxlogs/access.log

این باید چیزی شبیه به این نشان دهد:

 

Output

203.0.113.0 - - [11/Jul/2018:00:59:11 +0000] "GET / HTTP/1.1" 200 612 "-"
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36" "-"

در صورت ایجاد هرگونه تغییر در پوشه ~/nginxlogs ، می توانید آنها را از داخل Docker container در زمان واقعی نیز مشاهده کنید.

نتیجه

در این آموزش ما نحوه ایجاد یک حجم داده Docker برای به اشتراک گذاری اطلاعات بین یک container و سیستم host file را نشان دادیم. این در محیط های توسعه مفید است ، جایی که برای اشکال زدایی دسترسی به گزارش ها ضروری است. برای کسب اطلاعات بیشتر در مورد به اشتراک گذاری داده های مداوم بین ظروف ، به نحوه اشتراک گذاری داده ها بین Docker Containers نگاه کنید.

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

چگونه یک ماژول سفارشی Terraform بسازیم

ورود به سایت

معرفی

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

در این آموزش ، ماژول Terraform را ایجاد می کنید که چندین قطره را در پشت Load Balancer برای افزونگی راه اندازی می کند. شما همچنین از ویژگی های for_each و count حلقه زبان پیکربندی Hashicorp (HCL) برای استقرار چندین نمونه سفارشی ماژول به طور همزمان استفاده خواهید کرد.

ساختار و مزایای ماژول

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

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

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

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

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

سپس ماژول ها را در پروژه های Terraform خود تعریف ، استفاده و سفارشی کنید.

ایجاد یک ماژول

در این بخش ، شما چند قطره و Load Balancer را به عنوان منابع Terraform تعریف کرده و آنها را در یک ماژول قرار می دهید. شما همچنین می توانید ماژول حاصل را با استفاده از ورودی های ماژول سفارشی کنید.

ماژول را در دایرکتوری به نام droplet-lb ، در زیر دایرکتوری به نام modules ذخیره می کنید. با فرض اینکه در فهرست راهنمای terraform-modules که به عنوان بخشی از پیش نیازها ایجاد کرده اید هستید ، هر دو را همزمان اجرا کنید:

mkdir -p modules/droplet-lb

آرگومان -p به mkdir دستور می دهد تا همه دایرکتوری ها را در مسیر ارائه شده ایجاد کند.

به آن بروید:

cd modules/droplet-lb

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

متغیرهای تعریف شده در یک ماژول به عنوان ورودی های آن نشان داده می شوند و می توانند در تعاریف منابع برای سفارشی سازی آنها استفاده شوند. ماژولی که ایجاد می کنید دارای دو ورودی است: تعداد Droplets برای ایجاد و نام گروه آنها. ایجاد و باز کردن برای ویرایش فایلی به نام variables.tf که در آن متغیرها را ذخیره می کنید:

nano variables.tf

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

modules/droplet-lb/variables.tf

variable "droplet_count" {}
variable "group_name" {}

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

شما تعریف Droplet را در فایلی با نام droplets.tf ذخیره خواهید کرد. ایجاد و باز کردن آن برای ویرایش:

nano droplets.tf

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

modules/droplet-lb/droplets.tf

resource "vpsgol_droplet" "droplets" {
  count  = var.droplet_count
  image  = "ubuntu-20-04-x64"
  name   = "${var.group_name}-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

برای پارامتر count که مشخص می کند چند نمونه از منبع را ایجاد کنید ، از متغیر droplet_count استفاده می کنید. مقدار آن زمانی مشخص می شود که ماژول از کد اصلی پروژه فراخوانی شود. نام هر یک از Droplets های مستقر متفاوت خواهد بود ، که با افزودن فهرست قطره فعلی به نام گروه ارائه شده ، به آن می رسید. استقرار Droplets در منطقه fra1 خواهد بود و اوبونتو 20.04 را اجرا خواهند کرد.

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

با Droplets که اکنون تعریف شده است ، می توانید به ایجاد Load Balancer بروید. شما تعریف منابع آن را در فایلی با نام lb.tf ذخیره خواهید کرد. با اجرای آن ، آن را برای ویرایش ایجاد کرده و باز کنید:

nano lb.tf

تعریف منابع آن را اضافه کنید:

modules/droplet-lb/lb.tf

resource "vpsgol_loadbalancer" "www-lb" {
  name   = "lb-${var.group_name}"
  region = "fra1"

  forwarding_rule {
    entry_port     = 80
    entry_protocol = "http"

    target_port     = 80
    target_protocol = "http"
  }

  healthcheck {
    port     = 22
    protocol = "tcp"
  }

  droplet_ids = [
    for droplet in vpsgol_droplet.droplets:
      droplet.id
  ]
}

شما Load Balancer را با نام گروه در نام آن تعریف می کنید تا قابل تشخیص باشد. شما آن را به همراه Droplets در منطقه fra1 مستقر می کنید. دو بخش بعدی پورت ها و پروتکل های هدف و نظارت را مشخص می کند.

بلوک droplet_ids برجسته ، شناسه Droplets را که باید توسط Load Balancer مدیریت شود ، می گیرد. از آنجا که چند قطره وجود دارد ، و تعداد آنها از قبل مشخص نیست ، شما از حلقه for برای عبور از مجموعه Droplets (vpsgol_droplet.droplets) و گرفتن شناسه آنها استفاده می کنید. شما حلقه for را با پرانتز ([]) احاطه می کنید تا مجموعه حاصل یک لیست باشد.

اکنون Droplet ، Load Balancer و متغیرها را برای ماژول خود تعریف کرده اید. شما باید الزامات ارائه دهنده را مشخص کنید ، مشخص کنید که ماژول از کدام ارائه دهندگان استفاده می کند ، از جمله نسخه آنها و جایی که آنها واقع شده اند. از آنجا که Terraform 0.13 است ، ماژول ها باید به صراحت منابع ارائه دهندگان غیر Hashicorp مورد استفاده خود را مشخص کنند. این به این دلیل است که آنها آنها را از پروژه اصلی به ارث نمی برند.

الزامات ارائه دهنده را در فایلی با نام provider.tf ذخیره خواهید کرد. با اجرای آن آن را برای ویرایش ایجاد کنید:

nano provider.tf

ماژول ها همچنین از خروجی ها پشتیبانی می کنند که می توانید از آنها برای استخراج اطلاعات داخلی در مورد وضعیت منابع خود استفاده کنید. شما یک خروجی تعریف می کنید که آدرس IP Load Balancer را نشان می دهد و آن را در فایلی با نام outputs.tf ذخیره می کنید. آن را برای ویرایش ایجاد کنید:

nano outputs.tf

تعریف زیر را اضافه کنید:

modules/droplet-lb/outputs.tf

output "lb_ip" {
  value = vpsgol_loadbalancer.www-lb.ip
}

این خروجی آدرس IP Load Balancer را بازیابی می کند. ذخیره کنید و فایل را ببندید.

ماژول droplet-lb از لحاظ عملکردی کامل است و آماده استقرار است. شما آن را از کد اصلی ، که در ریشه پروژه ذخیره می کنید ، صدا می زنید. ابتدا ، با دوبار بالا رفتن از فهرست پرونده خود به آن بروید:

cd ../..

سپس ، برای ویرایش فایلی به نام main.tf ایجاد و باز کنید ، که در آن از ماژول استفاده می کنید:

nano main.tf

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

main.tf

module "groups" {
  source = "./modules/droplet-lb"

  droplet_count = 3
  group_name    = "group1"
}

output "loadbalancer-ip" {
  value = module.groups.lb_ip
}

در این اعلان ماژول droplet-lb را که در فهرست راهنمای تعیین شده به عنوان منبع قرار دارد فرا می خوانید. شما ورودی ارائه شده ، droplet_count و group_name را که روی group1 تنظیم شده است پیکربندی می کنید تا بعداً بتوانید بین نمونه ها تشخیص دهید.

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

با راه اندازی اولیه ماژول را راه اندازی کنید:

terraform init

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

 

Output

Initializing modules...
- groups in modules/droplet-lb

Initializing the backend...

Initializing provider plugins...
- Reusing previous version of vpsgol/vpsgol from the dependency lock file
- Using previously-installed vpsgol/vpsgol v2.10.1

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

می توانید برنامه ریزی پروژه را امتحان کنید تا ببینید Terraform با اجرای چه اقداماتی انجام می دهد:

terraform plan -var “do_token=${DO_PAT}”

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

 

Output

...
Terraform used the selected providers to generate the following execution plan. Resource actions are
indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # module.groups.vpsgol_droplet.droplets[0] will be created
  + resource "vpsgol_droplet" "droplets" {
...
      + name                 = "group1-0"
...
    }

  # module.groups.vpsgol_droplet.droplets[1] will be created
  + resource "vpsgol_droplet" "droplets" {
...
      + name                 = "group1-1"
...
    }

  # module.groups.vpsgol_droplet.droplets[2] will be created
  + resource "vpsgol_droplet" "droplets" {
...
      + name                 = "group1-2"
...
    }

  # module.groups.vpsgol_loadbalancer.www-lb will be created
  + resource "vpsgol_loadbalancer" "www-lb" {
...
      + name                     = "lb-group1"
...
    }

Plan: 4 to add, 0 to change, 0 to destroy.
...

این خروجی نشان می دهد که Terraform سه قطره ایجاد می کند ، به نام های group1-0 ، group1-1 و group1-2 ، و همچنین یک Load Balancer به نام group1-lb ایجاد می کند ، که ترافیک به سه قطره را از و خارج مدیریت می کند.

با اجرای پروژه می توانید پروژه را روی ابر اعمال کنید:

terraform apply -var “do_token=${DO_PAT}”

در صورت درخواست بله را وارد کنید. خروجی تمام اقدامات را نشان می دهد و آدرس IP Load Balancer نیز نشان داده می شود:

 

Output

module.groups.vpsgol_droplet.droplets[1]: Creating...
module.groups.vpsgol_droplet.droplets[0]: Creating...
module.groups.vpsgol_droplet.droplets[2]: Creating...
...
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

Outputs:

loadbalancer-ip = ip_address

از آنجا که در مرحله بعد پیکربندی را به طور قابل توجهی تغییر می دهید ، منابع اجرا شده را با اجرای زیر از بین ببرید:

terraform destroy -var “do_token=${DO_PAT}”

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

 

Output

...
Destroy complete! Resources: 4 destroyed.

در این مرحله ، ماژولی ایجاد کرده اید که شامل تعدادی Droplets و Load Balancer است که به طور خودکار برای مدیریت ترافیک ورودی و خروجی آنها پیکربندی می شود. اکنون می توانید چندین نمونه از یک ماژول را از یک کد با استفاده از for_each و count استفاده کنید.

استقرار موارد متعدد ماژول

در این بخش ، از count و for_each برای استقرار چندین بار ماژول droplet-lb ، با سفارشی سازی استفاده خواهید کرد.

با استفاده از شمارش

یک راه برای استقرار چند نمونه از یک ماژول به طور همزمان این است که تعداد آنها را به پارامتر count منتقل کنید ، که به طور خودکار برای هر ماژول در دسترس است. main.tf را برای ویرایش باز کنید:

nano main.tf

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

main.tf

module "groups" {
  source = "./modules/droplet-lb"

  count  = 3

  droplet_count = 3
  group_name    = "group1-${count.index}"
}

با تنظیم شمارش روی 3 ، به Terraform دستور می دهید که ماژول را سه بار ، هر کدام با نام گروهی متفاوت ، مستقر کند. پس از اتمام کار ، فایل را ذخیره و ببندید.

برنامه ریزی استقرار با اجرای:

terraform plan -var “do_token=${DO_PAT}”

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

 

Output

...
Terraform used the selected providers to generate the following execution plan. Resource actions are
indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # module.groups[0].vpsgol_droplet.droplets[0] will be created
...
  # module.groups[0].vpsgol_droplet.droplets[1] will be created
...
  # module.groups[0].vpsgol_droplet.droplets[2] will be created
...
  # module.groups[0].vpsgol_loadbalancer.www-lb will be created
...
  # module.groups[1].vpsgol_droplet.droplets[0] will be created
...
  # module.groups[1].vpsgol_droplet.droplets[1] will be created
...
  # module.groups[1].vpsgol_droplet.droplets[2] will be created
...
  # module.groups[1].vpsgol_loadbalancer.www-lb will be created
...
  # module.groups[2].vpsgol_droplet.droplets[0] will be created
...
  # module.groups[2].vpsgol_droplet.droplets[1] will be created
...
  # module.groups[2].vpsgol_droplet.droplets[2] will be created
...
  # module.groups[2].vpsgol_loadbalancer.www-lb will be created
...

Plan: 12 to add, 0 to change, 0 to destroy.
...

Terraform در خروجی توضیح می دهد که هر یک از سه نمونه ماژول دارای سه Droplet و Load Balancer مربوط به آنها خواهد بود.

استفاده از for_each

هنگامی که به سفارشی سازی پیچیده تر نیاز دارید ، یا زمانی که تعداد موارد به داده های شخص ثالث (اغلب به صورت نقشه ارائه می شود) که هنگام نوشتن کد مشخص نیست ، می توانید از for_each برای ماژول ها استفاده کنید.

اکنون نقشه ای را تعریف می کنید که نام گروه ها را با تعداد Droplet جفت می کند و موارد قطره ای-lb را مطابق آن مستقر می کند. main.tf را برای ویرایش با اجرا باز کنید:

nano main.tf

فایل را اصلاح کنید تا به این شکل درآید:

main.tf

variable "group_counts" {
  type    = map
  default = {
    "group1" = 1
    "group2" = 3
  }
}

module "groups" {
  source   = "./modules/droplet-lb"
  for_each = var.group_counts

  droplet_count = each.value
  group_name    = each.key
}

شما ابتدا نقشه ای به نام group_counts تعریف می کنید که حاوی چند قطره است که یک گروه معین باید داشته باشد. سپس ، ماژول droplet-lb را فرا می خوانید ، اما مشخص می کنید که حلقه for_each باید در var.group_counts ، نقشه ای که قبلاً تعریف کرده اید ، عمل کند. droplet_count each.value ، مقدار جفت فعلی ، که تعداد Droplets برای گروه فعلی است را می گیرد. group_name نام گروه را دریافت می کند.

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

سعی کنید پیکربندی را با اجرای زیر اعمال کنید:

terraform plan -var “do_token=${DO_PAT}”

در خروجی اقدامات Terraform برای ایجاد دو گروه با Droplets و Load Balancers خود شرح داده می شود:

 

Output

...
Terraform used the selected providers to generate the following execution plan. Resource actions are
indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # module.groups["group1"].vpsgol_droplet.droplets[0] will be created
...
  # module.groups["group1"].vpsgol_loadbalancer.www-lb will be created
...
  # module.groups["group2"].vpsgol_droplet.droplets[0] will be created
...
  # module.groups["group2"].vpsgol_droplet.droplets[1] will be created
...
  # module.groups["group2"].vpsgol_droplet.droplets[2] will be created
...
  # module.groups["group2"].vpsgol_loadbalancer.www-lb will be created
...

در این مرحله ، شما از count و for_each برای استقرار چندین نمونه سفارشی از یک ماژول از یک کد استفاده کرده اید.

نتیجه

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

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از رابط ها در TypeScript

ورود به سایت

معرفی

TypeScript افزونه ای از زبان جاوا اسکریپت است که از زمان اجرای جاوا اسکریپت با یک نوع تایپ کننده زمان کامپایل استفاده می کند.

TypeScript روش های متعددی را برای نمایش اشیاء در کد شما ارائه می دهد که یکی از آنها استفاده از رابط ها است. رابط های موجود در TypeScript دو ​​سناریو استفاده دارند: می توانید قراردادی ایجاد کنید که کلاسها باید از آن پیروی کنند ، مانند اعضایی که آن کلاسها باید اجرا کنند ، و همچنین می توانید انواع را در برنامه خود نشان دهید ، درست مانند اعلان نوع معمولی. (برای اطلاعات بیشتر در مورد انواع ، نحوه استفاده از انواع اصلی در TypeScript و نحوه ایجاد انواع سفارشی در TypeScript را بررسی کنید.)

ممکن است توجه داشته باشید که رابط ها و انواع دارای مجموعه ای از ویژگی های مشابه هستند. در واقع ، تقریباً همیشه می توان یکی را جایگزین دیگری کرد. تفاوت اصلی این است که رابط ها ممکن است بیش از یک اعلان برای یک رابط داشته باشند ، که TypeScript ادغام می شود ، در حالی که انواع را فقط یک بار می توان اعلام کرد. همچنین می توانید از انواع برای ایجاد نام مستعار از انواع اولیه (مانند رشته و بولی) استفاده کنید ، که رابط ها نمی توانند انجام دهند.

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

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

پیش نیازها

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

  • محیطی که در آن می توانید برنامه های TypeScript را اجرا کنید تا همراه با مثال ها دنبال کنید. برای تنظیم این دستگاه در دستگاه محلی خود ، به موارد زیر نیاز دارید.
    • هر دو Node و npm (یا نخ) به منظور اجرای یک محیط توسعه که بسته های مربوط به TypeScript را مدیریت می کند ، نصب شده است. این آموزش با Node.js نسخه 14.3.0 و npm نسخه 6.14.5 آزمایش شده است. برای نصب روی macOS یا اوبونتو 18.04 ، مراحل نحوه نصب Node.js و ایجاد محیط توسعه محلی در macOS یا قسمت Installing using a PPA از نحوه نصب Node.js در اوبونتو 18.04 را دنبال کنید. اگر از زیر سیستم Windows برای Linux (WSL) استفاده می کنید ، این نیز کار می کند.
    • علاوه بر این ، به TypeScript Compiler (tsc) نصب شده بر روی دستگاه خود نیاز دارید.
  • شما به دانش کافی از جاوا اسکریپت ، به ویژه نحو ES6+ ، مانند تخریب ، عملگرهای استراحت و واردات/صادرات نیاز دارید. اگر به اطلاعات بیشتری در مورد این موضوعات نیاز دارید ، خواندن نحوه کدگذاری در سری JavaScript توصیه می شود.
  • این آموزش به جنبه های ویرایشگرهای متنی که از TypeScript پشتیبانی می کنند اشاره می کند و خطاهای خطی را نشان می دهد. این برای استفاده از TypeScript ضروری نیست ، اما از ویژگیهای TypeScript بیشتر استفاده می کند. برای بهره مندی از این موارد ، می توانید از ویرایشگر متنی مانند Visual Studio Code استفاده کنید که از TypeScript پشتیبانی کامل دارد. همچنین می توانید این مزایا را در TypeScript Playground امتحان کنید.

همه نمونه های نشان داده شده در این آموزش با استفاده از TypeScript نسخه 4.2.2 ایجاد شده است.

ایجاد و استفاده از رابط ها در TypeScript

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

رابط ها در TypeScript با استفاده از کلید واژه رابط و سپس نام رابط و سپس یک بلوک {} با بدنه رابط ایجاد می شوند. به عنوان مثال ، در اینجا یک رابط Logger است:

interface Logger {
  log: (message: string) => void;
}

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

interface Logger {
  log: (message: string) => void;
}

رابط Logger نشان دهنده یک شی است که دارای یک ویژگی واحد به نام log است. این ویژگی یک تابع است که یک پارامتر واحد از نوع string را می پذیرد و void را برمی گرداند.

می توانید از رابط Logger به عنوان هر نوع دیگری استفاده کنید. در اینجا یک مثال ایجاد یک شیء تحت اللفظی مطابق با رابط Logger آورده شده است:

interface Logger {
  log: (message: string) => void;
}

const logger: Logger = {
  log: (message) => console.log(message),
};

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

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

interface Logger {
  log: (message: string) => void;
}

const logger: Logger = {
  log: (message) => console.log(message),
  otherProp: true,
};

در این حالت ، کامپایلر TypeScript خطای 2322 را منتشر می کند ، زیرا این ویژگی در اعلان رابط Logger وجود ندارد:

 

Output

Type '{ log: (message: string) => void; otherProp: boolean; }' is not assignable to type 'Logger'.
  Object literal may only specify known properties, and 'otherProp' does not exist in type 'Logger'. (2322)

نوع دیگر Extending

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

تصور کنید یک رابط کاربری قابل پاک کردن دارید ، مانند این یکی:

interface Clearable {
  clear: () => void;
}

سپس می توانید یک رابط جدید ایجاد کنید که از آن گسترش یافته و همه زمینه های آن را به ارث برده است. در مثال زیر ، رابط Logger در حال گسترش از رابط Clearble است. به خطوط برجسته توجه کنید:

interface Clearable {
  clear: () => void;
}

interface Logger extends Clearable {
  log: (message: string) => void;
}

رابط Logger هم اکنون دارای یک عضو واضح است که یک تابع است که هیچ پارامتری را نمی پذیرد و void را برمی گرداند. این عضو جدید از رابط Clearable به ارث برده شده است. مثل این است که ما این کار را کرده ایم:

interface Logger {
  log: (message: string) => void;
  clear: () => void;
}

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

برای بازگشت به مثال Clearble که قبلاً استفاده شد ، تصور کنید که برنامه شما نیاز به رابط متفاوتی دارد ، مانند رابط StringList زیر ، برای نشان دادن یک ساختار داده که دارای چندین رشته است:

interface StringList {
  push: (value: string) => void;
  get: () => string[];
}

با گسترش این رابط StringList جدید ، رابط Clearable موجود را گسترش می دهید ، شما مشخص می کنید که این رابط همچنین اعضایی را در رابط Clearable تنظیم کرده است و ویژگی روشن را به تعریف نوع رابط StringList اضافه می کند:

interface StringList extends Clearable {
  push: (value: string) => void;
  get: () => string[];
}

رابط ها می توانند از هر نوع شیء مانند رابط ها ، انواع معمولی و حتی کلاس ها گسترش یابند.

رابط هایی با امضای قابل تماس

اگر رابط نیز قابل تماس باشد (یعنی یک تابع نیز باشد) ، می توانید با ایجاد یک امضای قابل تماس ، این اطلاعات را در اعلان رابط منتقل کنید.

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

به عنوان مثال ، یک امضای قابل تماس به رابط Logger خود اضافه کنید ، مانند کد برجسته زیر:

interface Logger {
  (message: string): void;
  log: (message: string) => void;
}

توجه داشته باشید که امضای قابل تماس شبیه به اعلان نوع یک تابع ناشناس است ، اما در نوع بازگشتی که استفاده می کنید: به جای =>. این بدان معناست که هر مقدار مقید به نوع رابط Logger می تواند مستقیماً به عنوان یک تابع فراخوانی شود.

برای ایجاد مقداری که با رابط Logger شما مطابقت داشته باشد ، باید الزامات رابط را در نظر بگیرید:

  1. باید قابل تماس باشد.
  2. باید دارای یک ویژگی به نام log باشد که یک تابع است که یک پارامتر رشته را قبول می کند.

بیایید متغیری به نام logger ایجاد کنیم که می تواند به نوع رابط Logger شما اختصاص داده شود:

interface Logger {
  (message: string): void;
  log: (message: string) => void;
}

const logger: Logger = (message: string) => {
  console.log(message);
}
logger.log = (message: string) => {
  console.log(message);
}

برای مطابقت با رابط Logger ، مقدار باید قابل تماس باشد ، به همین دلیل است که متغیر logger را به یک تابع اختصاص می دهید:

interface Logger {
  (message: string): void;
  log: (message: string) => void;
}

const logger: Logger = (message: string) => {
  console.log(message);
}
logger.log = (message: string) => {
  console.log(message);
}

سپس ویژگی log را به تابع logger اضافه می کنید:

interface Logger {
  (message: string): void;
  log: (message: string) => void;
}

const logger: Logger = (message: string) => {
  console.log(message);
}
logger.log = (message: string) => {
  console.log(message);
}

این توسط رابط Logger مورد نیاز است. مقادیر متصل به رابط Logger نیز باید دارای ویژگی log باشند که تابعی است که یک پارامتر یک رشته را می پذیرد و void را برمی گرداند.

اگر ویژگی log را وارد نکرده باشید ، کامپایلر TypeScript خطای 2741 را به شما می دهد:

 

Output

Property 'log' is missing in type '(message: string) => void' but required in type 'Logger'. (2741)

اگر ویژگی log در متغیر logger دارای امضای نوع ناسازگار باشد ، مانند تنظیم آن روی true ، خطای مشابهی را منتشر می کند:

interface Logger {
  (message: string): void;
  log: (message: string) => void;
}


const logger: Logger = (message: string) => {
  console.log(message);
}
logger.log = true;

در این مورد ، کامپایلر TypeScript خطای 2322 را نشان می دهد:

 

Output

Type 'boolean' is not assignable to type '(message: string) => void'. (2322)

یکی از ویژگیهای خوب تنظیم متغیرها برای داشتن یک نوع خاص ، در این مورد تنظیم متغیر logger برای نوع رابط Logger ، این است که TypeScript اکنون می تواند نوع پارامترهای عملکرد logger و عملکرد در log را استنباط کند. ویژگی.

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

interface Logger {
  (message: string): void;
  log: (message: string) => void;
}


const logger: Logger = (message) => {
  console.log(message);
}
logger.log = (message) => {
  console.log(message);
}

و در هر دو مورد ، ویرایشگر شما هنوز باید بتواند نشان دهد که نوع پارامتر یک رشته است ، زیرا این نوع مورد انتظار رابط Logger است.

رابط با امضای فهرست

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

به عنوان مثال ، اگر می خواهید یک رابط DataRecord ایجاد کنید که دارای تعداد نامحدود فیلد رشته است ، می توانید از امضای فهرست برجسته زیر استفاده کنید:

interface DataRecord {
  [key: string]: string;
}

سپس می توانید از رابط DataRecord برای تعیین نوع هر شیئی که دارای پارامترهای متعدد رشته نوع است استفاده کنید:

interface DataRecord {
  [key: string]: string;
}

const data: DataRecord = {
  fieldA: "valueA",
  fieldB: "valueB",
  fieldC: "valueC",
  // ...
};

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

تفاوت بین Types and Interfaces

تا کنون ، مشاهده کرده اید که اعلان رابط و اعلامیه مشابه هستند و تقریباً مجموعه ای از ویژگی ها را دارند.

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

interface Clearable {
  clear: () => void;
}

interface Logger extends Clearable {
  log: (message: string) => void;
}

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

type Clearable = {
  clear: () => void;
}

type Logger = Clearable & {
  log: (message: string) => void;
}

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

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

به عنوان مثال ، اعلان نوع دارای چند ویژگی است که اعلان رابط فاقد آن است ، مانند:

  • انواع اتحادیه
  • انواع نقشه برداری شده
  • نام مستعار به انواع اولیه

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

اعلامیه ادغام

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

رابط های TypeScript را می توان دوباره باز کرد. یعنی چندین اعلان از یک رابط یکسان می توانند ادغام شوند. این زمانی مفید است که می خواهید زمینه های جدیدی را به یک رابط موجود اضافه کنید.

به عنوان مثال ، تصور کنید که یک رابط به نام DatabaseOptions مانند زیر دارید:

interface DatabaseOptions {
  host: string;
  port: number;
  user: string;
  password: string;
}

از این رابط برای انتقال گزینه ها هنگام اتصال به پایگاه داده استفاده می شود.

بعداً در کد ، یک رابط با همان نام اما با یک رشته رشته به نام dsnUrl اعلام می کنید ، مانند این:

interface DatabaseOptions {
  dsnUrl: string;
}

وقتی کامپایلر TypeScript شروع به خواندن کد شما می کند ، تمام اعلانات رابط DatabaseOptions را در یک واحد ادغام می کند. از نظر کامپایلر TypeScript ، DatabaseOptions در حال حاضر:

interface DatabaseOptions {
  host: string;
  port: number;
  user: string;
  password: string;
  dsnUrl: string;
}

رابط شامل تمام زمینه هایی است که ابتدا اعلام کرده اید ، به علاوه فیلد جدید dsnUrl که به طور جداگانه اعلام کرده اید. هر دو اعلامیه ادغام شده اند.

افزایش ماژول

ادغام بیانیه زمانی مفید است که نیاز به افزایش ماژول های موجود با ویژگی های جدید داشته باشید. یک مورد استفاده برای آن زمانی است که شما فیلدهای بیشتری را به ساختار داده ارائه شده توسط یک کتابخانه اضافه می کنید. این نسبتاً با کتابخانه Node.js به نام express رایج است ، که به شما امکان می دهد سرورهای HTTP ایجاد کنید.

هنگام کار با اکسپرس ، یک درخواست و یک شیء پاسخ به کنترل کننده های درخواست شما ارسال می شود (توابع مسئول ارائه پاسخ به درخواست HTTP). شیء درخواست معمولاً برای ذخیره داده های خاص یک درخواست خاص استفاده می شود. به عنوان مثال ، می توانید از آن برای ذخیره کاربر ثبت شده که درخواست اولیه HTTP کرده است استفاده کنید:

const myRoute = (req: Request, res: Response) => {
  res.json({ user: req.user });
}

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

تعاریف نوع برای رابط درخواست بدون فیلد کاربر است ، بنابراین کد بالا خطای 2339 را نشان می دهد:

Property 'user' does not exist on type 'Request'. (2339)

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

اگر نوع شیء Request را در اعلان نوع express بررسی کنید ، متوجه می شوید که یک رابط اضافه شده در داخل یک فضای نام عمومی به نام Express است ، همانطور که در اسناد مخزن DefinitelyTyped نشان داده شده است:

declare global {
    namespace Express {
        // These open interfaces may be extended in an application-specific manner via declaration merging.
        // See for example method-override.d.ts (https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/method-override/index.d.ts)
        interface Request {}
        interface Response {}
        interface Application {}
    }
}

برای استفاده از افزودن ماژول برای افزودن یک ویژگی جدید به رابط درخواست ، باید همان ساختار را در یک فایل اعلان نوع محلی تکرار کنید. به عنوان مثال ، تصور کنید که شما یک فایل با نام express.d.ts مانند فایل زیر ایجاد کرده اید و سپس آن را به گزینه انواع tsconfig.json خود اضافه کرده اید:

import 'express';

declare global {
  namespace Express {
    interface Request {
      user: {
        name: string;
      }
    }
  }
}

از دیدگاه کامپایلر TypeScript ، رابط درخواست دارای یک ویژگی کاربر است که نوع آنها روی یک شیء تنظیم شده است که دارای یک ویژگی واحد به نام name of type string است. این اتفاق می افتد زیرا همه اعلان ها برای یک رابط یکسان ادغام می شوند.

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

نتیجه

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

 

برچسب‌ها:

 

 

  • behnam gol mohamadi