آموزش یک برنامه Microservices با .Net و NextJS از ابتدا بسازید

Build a Microservices app with .Net and NextJS from scratch

نکته: آخرین آپدیت رو دریافت میکنید حتی اگر این محتوا بروز نباشد.
نمونه ویدیوها:
توضیحات دوره: نحوه ساخت یک برنامه مبتنی بر میکروسرویس با استفاده از Net، NextJS، IdentityServer، RabbitMQ در حال اجرا در Docker و Kubernetes برای ساختن یک برنامه با .Net با استفاده از معماری Microservices ساختن یک برنامه مشتری برای برنامه با استفاده از NextJS برای استفاده از RabbitMQ برای ارتباطات گذرگاه خدمات برای نصب و از IdentityServer در اپلیکیشن Microservices استفاده کنید تا بتوانید پروژه ها را با استفاده از تست واحد و یکپارچه سازی با XUnit آزمایش کنید. برای شرکت در این دوره کامپیوتری با ویندوز، مک یا لینوکس که قابلیت اجرای Docker را دارد لازم است

Microservices جدیدترین "کلمه" و موضوع داغ در صنعت توسعه وب در حال حاضر است و امروزه داشتن ریزسرویس ها به عنوان بخشی از مجموعه مهارت شما بیش از پیش ضروری شده است. هدف این دوره آموزش ساختن یک اپلیکیشن مبتنی بر میکروسرویس با استفاده از Net برای خدمات باطن و Next.js برای برنامه مشتری است. ما از هیچ شروع می کنیم و برنامه را می سازیم تا زمانی که یک برنامه کامل داشته باشیم که بتوانیم آن را در یک خوشه Kubernetes در اینترنت منتشر کنیم.

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

  • ایجاد چندین سرویس پشتیبان با استفاده از Net. که عملکردی را برای برنامه ارائه می‌کند

  • ارتباطات سرویس به سرویس با استفاده از RabbitMQ و gRPC

  • استفاده از IdentityServer به عنوان ارائه دهنده هویت.

  • ایجاد دروازه با استفاده از Microsoft YARP

  • ساختن یک برنامه سمت سرویس گیرنده با Next.js با استفاده از عملکرد جدید App Router (از Next.js 13.4)

  • استفاده از SignalR برای اعلان‌های فشاری به برنامه مشتری

  • درحال اتصال سرویس‌های مختلف ما

  • جریان کاری CI/CD با استفاده از اقدامات GitHub

  • افزودن کنترل‌کننده‌های ورودی

  • انتشار برنامه به صورت محلی با استفاده از docker compose

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

  • آزمایش واحد و ادغام

  • انتشار محلی در Kubernetes

  • انتشار برنامه در یک خوشه Kubernetes در اینترنت

ابزارهایی که برای این دوره نیاز دارید

در این دوره، تمام دروس با استفاده از Visual Studio Code، یک ویرایشگر کد متقابل پلت فرم رایگان (و خارق العاده) نشان داده می شوند. البته می توانید از هر ویرایشگر کدی که دوست دارید و هر سیستم عاملی که دوست دارید استفاده کنید... البته تا زمانی که ویندوز، لینوکس یا مک باشد. لطفاً مطمئن شوید که رایانه شما می‌تواند Docker را اجرا کند، زیرا این یک الزام برای این دوره است (لطفاً به درس پیش‌نیاز موجود به عنوان پیش‌نمایش برای تأیید آن مراجعه کنید).

آیا این دوره برای شماست؟

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

در این دوره ما یک نمونه Auction Application با چندین سرویس خواهیم ساخت که از آنها برای ارائه عملکرد آن استفاده خواهیم کرد. برای سمت سرویس گیرنده چیزها، از Next.js استفاده می کنیم تا از قابلیت های سمت کلاینت و سمت سرور آن بهره ببریم که برای چیزی که می سازیم مناسب است. تنها چیزی که برای شروع به کار نیاز دارید، یک کامپیوتر با سیستم عامل مورد علاقه خود است که قادر به اجرای Docker است، و اشتیاق به یادگیری نحوه ساخت یک برنامه مبتنی بر میکروسرویس با استفاده از Net و Next.js است.


سرفصل ها و درس ها

معرفی Introduction

  • معرفی Introduction

  • پیش نیاز دوره Course pre-requisites

  • راه اندازی محیط توسعه دهنده Setting up the developer environment

  • دارایی های دوره و کد منبع Course assets and source code

  • عیب یابی کد VS و نکات VS Code troubleshooting and tips

  • میکروسرویس ها - تصویر بزرگ Microservices - the big picture

بخش 2 - ایجاد اولین میکروسرویس Section 2 - Creating the first microservice

  • مقدمه بخش 2 Introduction to section 2

  • ایجاد اولین سرویس میکرو Creating the first micro service

  • بررسی و ساده سازی پروژه Reviewing and simplifying the project

  • اضافه کردن کلاس های موجودیت Adding the entity classes

  • اضافه کردن کلاس زمینه پایگاه داده Adding the Database context class

  • افزودن سرور پایگاه داده Postgres Adding a Postgres database server

  • ایجاد داده های بذر Creating seed data

  • شکل دادن به داده ها برای بازگشت Shaping the data to return

  • اضافه کردن یک کنترلر API Adding an API controller

  • افزودن مجموعه پستچی Adding a postman collection

  • افزودن نقطه پایان حراج ایجاد Adding the create auction endpoint

  • افزودن نقطه پایانی حراج به روز رسانی Adding the update auction endpoint

  • افزودن نقطه پایانی حراج حذف Adding the delete auction endpoint

  • ذخیره تغییرات در کنترل منبع Saving changes into source control

  • خلاصه Summary

بخش 3 - ایجاد یک میکروسرویس جستجو Section 3 - Creating a Search microservice

  • مقدمه بخش 3 Introduction to Section 3

  • ایجاد دومین خدمات خرد Creating the second micro services

  • افزودن سرور MongoDb Adding the MongoDb server

  • اضافه کردن مدل آیتم Adding the Item model

  • افزودن داده های بذر Adding seed data

  • اضافه کردن کنترلر جستجو Adding a search controller

  • صفحه بندی نتایج Paginating the results

  • افزودن فیلتر و سفارش Adding filtering and ordering

  • پیام رسانی همزمان Synchronous messaging

  • افزودن ارتباط Http برای دریافت داده ها Adding Http communication to get the data

  • ایجاد ارتباط Http ما انعطاف پذیر Making our Http communication resilient

  • خلاصه بخش 3 Summary of Section 3

RabbitMQ RabbitMQ

  • مقدمه بخش 4 Introduction to Section 4

  • RabbitMQ چیست؟ What is RabbitMQ

  • نصب RabbitMQ Installing RabbitMQ

  • افزودن و پیکربندی حمل و نقل انبوه Adding and configuring mass transit

  • اضافه شدن قراردادها Adding the contracts

  • افزودن یک مصرف کننده برای مصرف پیام از گذرگاه خدمات Adding a consumer to consume a message from the Service bus

  • انتشار رویداد مزایده ایجاد شده در اتوبوس Publishing the Auction Created event to the bus

  • چه چیزی می تواند اشتباه باشد؟ What could go wrong?

  • افزودن صندوق ارسال پیام Adding a message outbox

  • استفاده از تلاش های مجدد پیام Using message retries

  • مصرف صف های خطا Consuming fault queues

  • چالش: اضافه کردن به روز رسانی و حذف مصرف کنندگان Challenge: Adding the update and delete consumers

  • راه حل چالش Challenge solution

  • خلاصه بخش 4 Summary of section 4

سرور هویت Identity Server

  • مقدمه بخش 5 Introduction to Section 5

  • OAuth و OpenIDConnect OAuth and OpenIDConnect

  • ایجاد پروژه Identity Server Creating the Identity Server project

  • بررسی و پیکربندی پروژه جدید ما Reviewing and configuring our new project

  • کاشت داده ها و اضافه کردن یک مهاجرت Seeding data and adding a migration

  • بررسی صفحه ورود در سرور هویت Reviewing the login page in identity server

  • افزودن صفحه ثبت نام Adding a register page

  • افزودن صفحه ثبت نام قسمت 2 Adding a register page part 2

  • افزودن صفحه ثبت نام قسمت 3 Adding a register page part 3

  • افزودن اعتبار مشتری برای اجازه دادن به مشتریان برای درخواست توکن Adding client credentials to allow clients to request a token

  • افزودن یک سرویس پروفایل سفارشی به سرور هویت Adding a custom profile service to identity server

  • در حال پیکربندی auth در سرور منبع Configuring auth on the resource server

  • پیکربندی نقاط پایانی auth در سرور منبع Configuring the auth endpoints on the resource server

  • خلاصه بخش 5 Summary of section 5

افزودن سرویس دروازه Adding a Gateway Service

  • مقدمه بخش 6 Introduction to Section 6

  • افزودن سرویس Gateway Adding the Gateway service

  • افزودن پیکربندی Reverse Proxy Adding the Reverse Proxy configuration

  • افزودن احراز هویت به پیکربندی Gateway Adding authentication to the Gateway config

  • تست سرویس Gateway ما در Postman Testing our Gateway service in Postman

  • اضافه کردن قراردادهای باقی مانده که نیاز داریم Adding the remaining contracts we need

  • اضافه کردن مصرف کنندگان باقی مانده به خدمات حراج Adding the remaining consumers to the Auction Service

  • اضافه کردن مصرف کنندگان باقی مانده در سرویس جستجو Adding the remaining consumers in the Search Service

  • افزودن یک کلاینت جدید به پیکربندی سرویس Identity Adding a new client to the Identity service configuration

  • خلاصه بخش 6 Summary of Section 6

داکر کردن برنامه ما Dockerizing our application

  • مقدمه بخش 7 Introduction to Section 7

  • ایجاد یک حساب کاربری docker Creating a docker account

  • داکر کردن سرویس حراج Dockerizing the Auction Service

  • در حال به‌روزرسانی فایل نوشتن docker ما برای کانتینر خدمات حراج Updating our docker compose file for the Auction Service container

  • داکر کردن سرویس جستجو Dockerising the Search service

  • داکر کردن سرویس هویت Dockerising the Identity Service

  • اشکال زدایی یک سرویس دات نت در ظرف داکر Debugging a .Net service in a docker container

  • داکر کردن سرویس دروازه Dockerising the Gateway Service

  • آزمایش ظروف داکر ما Testing our docker containers

  • خلاصه بخش 7 Summary of Section 7

افزودن اپلیکیشن سمت کلاینت Adding the client side application

  • مقدمه بخش 8 Introduction to Section 8

  • ایجاد پروژه NextJS Creating the NextJS project

  • بررسی و ساده سازی پروژه NextJS Reviewing and simplifying the NextJS Project

  • ایجاد نوار ناوبری Creating a nav bar

  • واکشی داده ها از API Fetching data from the API

  • اضافه کردن یک جزء کارت حراج Adding an Auction Card component

  • مدل دادن به کارت های حراج Styling the auction cards

  • افزودن تایمر شمارش معکوس به کارت حراج Adding a countdown timer to the auction card

  • اضافه کردن بارگذاری به تصاویر Adding loading to the images

  • افزودن انواع به پروژه Adding types to the project

  • اضافه کردن صفحه بندی به لیست ما Adding pagination to our list

  • استفاده از توابع سرور در اجزای مشتری Using server functions in client components

  • افزودن گزینه تنظیم اندازه صفحه Adding a set page size option

  • استفاده از Zustand برای مدیریت دولتی Using Zustand for state management

  • در حال تغییر کد ما برای استفاده از حالت zustand Refactoring our code to use the zustand state

  • افزودن نوار جستجو Adding a search bar

  • افزودن قابلیت جستجو Adding the search functionality

  • اضافه کردن یک تنظیم مجدد به عملکرد جستجو Adding a reset to the search function

  • افزودن قابلیت مرتب سازی Adding the sorting functionality

  • افزودن قابلیت فیلترینگ Adding the filtering functionality

  • افزودن یک جزء برای نمایش در صورت صفر Adding a component to display when zero results

  • خلاصه بخش 8 Summary of section 8

هویت سمت مشتری با NextAuth (AuthJS) Client side identity with NextAuth (AuthJS)

  • مقدمه بخش 9 Introduction to Section 9

  • قبل از اینکه شروع کنیم Before we begin

  • نصب Next Auth در برنامه مشتری ما Installing Next Auth into our client app

  • افزودن قابلیت ورود به سیستم Adding the login functionality

  • دریافت جزئیات جلسه در مشتری Getting the session details in the client

  • پر کردن داده های جلسه Populating the session data

  • پر کردن منوی کرکره اقدامات کاربر Populating the User actions dropdown

  • حفاظت از مسیرها Protecting routes

  • تست احراز هویت API Testing API authentication

  • دریافت رمز دسترسی برای استفاده برای احراز هویت در سرور منبع ما Getting the access token to use to authenticate to our resource server

  • خلاصه بخش 9 Summary of Section 9

عملیات CRUD در برنامه مشتری CRUD operations in the client app

  • مقدمه بخش 10 Introduction to Section 10

  • مسیریابی در NextJS Routing in NextJS

  • برنده شدن در مزایده ها Getting the auctions won

  • ایجاد فرم حراج Creating an Auction form

  • ایجاد فرم حراج قسمت 2 Creating an Auction form part 2

  • ایجاد یک ورودی متنی قابل استفاده مجدد Creating a reusable text input

  • ایجاد فرم حراج قسمت 3 Creating the auction form part 3

  • ایجاد یک ورودی تاریخ قابل استفاده مجدد Creating a reusable date input

  • ایجاد یک لفاف واکشی Creating a fetch wrapper

  • افزودن اکشن سرور ایجاد مزایده Adding the create auction server action

  • افزودن react hot toast برای نمایش اعلان‌ها در صورت بروز مشکل Adding react hot toast to display notifications if something goes wrong

  • افزودن محتوای صفحه جزئیات حراج Adding the auction details page content

  • افزودن صفحه ویرایش حراج Adding the edit auction page

  • افزودن قابلیت حذف حراج Adding the delete auction functionality

  • خلاصه بخش 10 Summary of section 10

ایجاد سرویس مناقصه Creating the bid service

  • مقدمه بخش 11 Introduction to Section 11

  • ایجاد سرویس مناقصه Creating the Bid Service

  • افزودن مدل ها به خدمات پیشنهادی Adding the models to the Bid Service

  • افزودن یک کنترلر API برای پیشنهادها Adding an API Controller for the bids

  • افزودن نقطه پایانی دریافت پیشنهادات Adding the get bids endpoint

  • اضافه کردن حراج مصرف کننده ایجاد کرد Adding the auction created consumer

  • تست عملکرد پیشنهاد در Postman Testing the bid functionality in Postman

  • افزودن DTO و Automapper Adding the DTOs and Automapper

  • افزودن یک تهیه کننده برای BidPlaced Adding a producer for the BidPlaced

  • راه حل چالش Challenge solution

  • افزودن یک سرویس پس‌زمینه برای رویداد پایان یافته حراج Adding a Background service for the auction finished event

  • gRPC چیست؟ What is gRPC?

  • افزودن gRPC قسمت 1 Adding gRPC part 1

  • افزودن gRPC قسمت 2 Adding gRPC part 2

  • افزودن کلاینت gRPC Adding a gRPC client

  • به روز رسانی سرویس Gateway Updating the Gateway service

  • داکر کردن BidService Dockerising the BidService

  • خلاصه بخش 11 Summary of Section 11

اضافه کردن یک سرویس SignalR Adding a SignalR service

  • مقدمه بخش 12 Introduction to Section 12

  • ایجاد سرویس اطلاع رسانی Creating the Notification service

  • اضافه کردن یک SignalR Hub Adding a SignalR Hub

  • اضافه کردن مصرف کنندگان Adding the Consumers

  • اضافه کردن پشتیبانی CORS به Gateway Adding CORS support to the Gateway

  • داکر کردن سرویس اطلاع رسانی Dockerising the NotificationService

  • در حال به روز رسانی فایل نوشتن Docker Updating the Docker compose file

  • خلاصه بخش 12 Summary of section 12

اضافه کردن پیشنهادها/اطلاعیه ها به مشتری Adding the bids/notifications to the client

  • مقدمه بخش 13 Introduction to Section 13

  • بازسازی مزایده ها به فروشگاه zustand Refactoring the auctions into a zustand store

  • به روز رسانی کارت های حراج با قیمت بالای فعلی Updating the Auction cards with the current high price

  • دریافت پیشنهادات برای یک مزایده Getting the bids for an auction

  • ایجاد یک کالای پیشنهادی Creating a bid item

  • ایجاد فروشگاه پیشنهادی Creating a bid store

  • ایجاد فرم پیشنهاد Creating a bid form

  • به روز رسانی رسیدگی به خطا Updating the error handling

  • اضافه کردن شرط به فرم و تست Adding conditionals to the form and testing

  • افزودن SignalR به برنامه مشتری Adding SignalR to the client app

  • افزودن پیشنهاد جدید به SignalR Adding the new bid to SignalR

  • افزودن نان تست برای یک حراج ایجاد شده است Adding a toast for an auction created

  • افزودن نان تست برای یک رویداد پایان یافته حراج Adding a toast for an auction finished event

  • غیرفعال کردن فرم تمام شده حراج پس از پایان حراج Disabling the auction finished form when the auction finishes

  • جلوگیری از قیمت پایین Preventing low bids

  • خلاصه بخش 13 Summary Section 13

انتشار برنامه برای تولید (محلی) Publishing the app to production (locally)

  • مقدمه بخش 14 Introduction to Section 14

  • آماده سازی اپلیکیشن مشتری Preparing the client app

  • ایجاد Dockerfile برای nextjs Creating the Dockerfile for nextjs

  • رفع مشکلات سرور هویت در docker compose Fixing the identity server issues in docker compose

  • دادن یک آدرس IP ثابت به سرور هویت Giving the Identity Server a static ip address

  • افزودن یک ورودی به نوشتن Docker Adding an ingress to Docker compose

  • افزودن SSL به ورودی Adding SSL to the ingress

  • پاکسازی نهایی برنامه و حل مشکل SignalR Final app cleanup and resolving SignalR issue

  • خلاصه پایان دوره End of course summary

ضمیمه الف - آزمایش Appendix A - Testing

  • مقدمه ای بر ضمیمه A - تست Intro to Appendix A - Testing

  • ساده ترین تست واحد ممکن The simplest unit test possible

  • بررسی کد موجود در Auction controller و آنچه در حال آزمایش هستیم Reviewing the code in the Auction controller and what we are testing

  • ایجاد یک مخزن حراج و رابط Creating an Auction Repository and interface

  • بازسازی کنترلر Auctions برای استفاده از مخزن Refactoring the Auctions controller to use the repository

  • مسخره کردن چیزها Mocking things

  • واحد تست متدهای GET قسمت 1 Unit testing the GET methods part 1

  • واحد تست متدهای GET قسمت 2 Unit testing the GET methods part 2

  • واحد آزمایش درخواست POST Unit testing the POST request

  • چالش - تمرین ایجاد تست های واحد برای سایر روش های کنترل کننده Challenge - Practicing creating unit tests for the other controller methods

  • راه حل چالش Challenge solution

  • راه اندازی تست یکپارچه سازی Integration testing setup

  • راه اندازی یک کارخانه برنامه وب سفارشی برای آزمایش یکپارچه سازی Setting up a Custom web application factory for integration testing

  • افزودن داده های تست به DB Adding test data to the DB

  • ایجاد یک تست یکپارچه سازی برای متد GET قسمت 1 Creating an integration test for the GET method part 1

  • ایجاد یک آزمون یکپارچه سازی برای درخواست GET قسمت 2 Creating an integration test for a GET request part 2

  • ایجاد یک تست یکپارچه سازی برای درخواست POST Creating an integration test for the POST request

  • چالش - تمرین ایجاد تست های یکپارچه سازی برای روش های دیگر Challenge - Practicing creating integration tests for the other methods

  • راه حل چالش Challenge solution

  • تست سرویس اتوبوس Testing the Service bus

  • استفاده از تجهیزات مجموعه برای اشتراک گذاری DB در کلاس های آزمایشی Using Collection fixtures to share the DB across test classes

پیوست B - انتشار به Kubernetes (محلی) Appendix B - Publishing to Kubernetes (locally)

  • معرفی ضمیمه B - Kubernetes Intro to Appendix B - Kubernetes

  • در Kubernetes «وابسته به» وجود ندارد - در عوض از Polly برای امتحان مجدد استفاده کنید No ‘depends on’ in Kubernetes - using Polly to retry instead

  • افزودن یک اقدام GitHub برای انتقال تصویر سرور هویت ما به هاب داکر Adding a GitHub action to push our Identity Server image to Docker hub

  • استقرار IdentityServer ما در سرور دیجیتال اقیانوس Deploying our IdentityServer to a Digital Ocean server

  • پیکربندی سرور لینوکس برای میزبانی سرور هویت Configuring the Linux server to host the identity server

  • ایجاد اولین مانیفست Kubernetes برای استقرار Creating the first Kubernetes manifest for a deployment

  • افزودن ادعای حجم مداوم Adding a persistent volume claim

  • اضافه کردن یک متعادل کننده بار برای اتصال به استقرار postgres Adding a load balancer to allow us to connect to the postgres deployment

  • افزودن یک ip خوشه ای که خدمات ما می توانند از آن استفاده کنند Adding a cluster ip our services can use

  • ایجاد یک استقرار برای RabbitMQ Creating a deployment for RabbitMQ

  • ایجاد استقرار Mongodb Creating a Mongodb deployment

  • ایجاد استقرار سرویس مزایده Creating the auction service deployment

  • ایجاد استقرار سرویس جستجو Creating the search service deployment

  • ایجاد استقرار سرویس مناقصه Creating the bid service deployment

  • ایجاد استقرار سرویس اطلاع رسانی Creating the notification service deployment

  • ایجاد استقرار سرویس دروازه Creating the gateway service deployment

  • ایجاد استقرار برنامه مشتری Creating the client app deployment

  • افزودن یک کنترلر ورودی nginx برای docker-compose Adding an nginx ingress controller for docker-compose

  • افزودن SSL به کنترلر ورودی Adding SSL to the ingress controller

  • رفع مشکلات سرور هویت Fixing Identity Server issues

پیوست ج - انتشار به Kubernetes (اینترنت) Appendix C - Publising to Kubernetes (Internet)

  • مقدمه ای بر پیوست ج Introduction to Appendix C

  • اسرار Kubernetes Kubernetes secrets

  • استفاده از مانیفست برای ایجاد اسرار Using a manifest to create secrets

  • به روز رسانی بقیه اسرار Updating the rest of the secrets

  • افزودن یک گردش کار برای استقرار سرویس مزایده ما Adding a workflow to deploy our Auction service

  • ایجاد یک خوشه kubernetes در Digital Ocean Creating a kubernetes cluster on Digital Ocean

  • در حال اتصال به خوشه جدید kubernetes ما Connecting to our new kubernetes cluster

  • ایجاد یک گردش کار برای استقرار خودکار مانیفست های ما Creating a workflow to deploy our manifests automatically

  • منابع توسعه دهنده و منابع تولید Dev resources and prod resources

  • ایجاد سایر گردش‌های کاری استقرار برای سایر خدمات Creating the other deployment workflows for the other services

  • استقرار اسرار و کنترل کننده ورود Deploying the secrets and the ingress controller

  • استقرار مانیفست های ما از طریق اقدامات github Deploying our manifests via github actions

  • بررسی استقرار ما Checking our deployment

  • دریافت نام دامنه برای اشاره به متعادل کننده بار ما Getting a domain name to point at our Load balancer

  • بستن انتهای شل قسمت 1 Tying up the loose ends part 1

  • بستن انتهای شل قسمت 2 Tying up the loose ends part 2

  • افزودن SSL به بخش 1 استقرار ما Adding SSL to our deployment part 1

  • افزودن SSL به بخش 2 استقرار ما Adding SSL to our deployment part 2

  • در حال اتمام استقرار Finishing up the deployment

نمایش نظرات

آموزش یک برنامه Microservices با .Net و NextJS از ابتدا بسازید
جزییات دوره
31.5 hours
240
Udemy (یودمی) Udemy (یودمی)
(آخرین آپدیت)
1,699
4.9 از 5
دارد
دارد
دارد
Neil Cummings
جهت دریافت آخرین اخبار و آپدیت ها در کانال تلگرام عضو شوید.

Google Chrome Browser

Internet Download Manager

Pot Player

Winrar

Neil Cummings Neil Cummings

توسعه دهنده نرم افزار آزاد حرفه ای