یکی از بزرگترین چالش های توسعه اپلیکیشن ، مرحله نهایی توزیع محصول نهایی به کاربران یا مشتریان شما است. بسیاری از متدولوژی های استقرار اپلیکیشن فاقد سازگاری با کاربر و امنیت هستند و یا روشهایی برای بروزرسانی خودکار یک برنامه پس از نصب را فراهم نمی کنند.
Snap یک فرمت پکیج اپلیکیشن مدرن با ویژگی های تکنیک جعبه شنی و امنیتی قدرتمند از جمله جداسازی سیستم فایل ، بروزرسانی های خودکار و مدیریت وابستگی یکپارچه است. اپلیکیشن های اسنپ ، معروف به اسنپ ها ، می توانند با استفاده از یک برنامه خط فرمان ، دقیقاً شبیه apt یا yum ، دانلود و نصب شوند. اوبونتو با اسنپ از پیش نصب شده همراه است ، به این معنی که مخاطبان گسترده ای برای اپلیکیشن های Snap وجود دارد.
در این آموزش یک برنامه Snap ایجاد کرده و در Snap Store منتشر می کنید.
پیش نیازها
برای تکمیل این آموزش ، به موارد زیر نیاز دارید:
⦁ یک سرور مجازی Ubuntu 18.04 که با دنبال کردن راهنمای راه اندازی سرور مجازی اولیه با اوبونتو 18.04 ، شامل یک کاربر غیر ریشه sudo راه اندازی شده باشد.
⦁ برنامه ای که می خواهید به عنوان Snap پکیج و منتشر کنید. این برنامه ممکن است یک اپلیکیشن پیچیده باشد که شما ایجاد کرده اید ، یک پروژه منبع باز مشترک یا یک برنامه “Hello, world! ” ساده باشد. اگر برنامه ای ندارید ، مرحله 1 این آموزش نحوه تهیه برنامه Hello World را در Go ارائه می دهد.
⦁ یک حساب کاربری در داشبورد برنامه نویسی Snapcraft.
پس از آماده شدن ، به عنوان کاربر غیر ریشه خود وارد سرور مجازی تان شوید.
مرحله 1 – آماده سازی برنامه برای پکیج
در مرحله اول ، با اطمینان از وجود همه چیزهای لازم در یک تک دیرکتوری ، برنامه خود را برای پکیج کردن به عنوان یک برنامه Snap آماده خواهید کرد.
با ایجاد یک دیرکتوری جدید برای Snap و رفتن به داخل آن شروع کنید:
⦁ $ mkdir ~/your-snap

⦁ $ cd ~/your-snap
در مرحله بعد ، اگر از قبل برنامه ای دارید ، یک کپی کامل از کد منبع را برای برنامه خود در دایرکتوری که تازه ایجاد کرده اید، وارد کنید. فرآیند در اینجا بسته به نوع دقیق اپلیکیشنی که پکیج میکنید متفاوت خواهد بود ، با این وجود در صورتی که کد منبع در یک مخزن Git ذخیره شود ، می توانید یک مخزن را در دایرکتوری git init کرده و تمام کد مربوطه را به دست بیاورید.
اگر هنوز برنامه ای ندارید که می خواهید آن را پکیج کنید ، می توانید یک برنامه “Hello world” ایجاد کنید تا در عوض از آن استفاده کنید. اگر برای نوشتن این برنامه با Go به محتوای بیشتری نیاز دارید ، نحوه آموزش نوشتن اولین برنامه خود را در آموزش Go بررسی کنید.

می توانید با ایجاد یک فایل جدید Go و باز کردن آن با استفاده از ویرایشگر متن مورد نظر خود این کار را انجام دهید:
⦁ $ nano helloworld.go
سپس کد زیر را به فایل اضافه کنید:
helloworld.go
package main
import “fmt”
func main() {
fmt.Println(“Hello, world!”)
}

سپس فایل را ذخیره کرده و از آن خارج شوید.
اگر Go را نصب نکردید ، می توانید آن را با استفاده از دستور زیر نصب کنید:
⦁ $ sudo apt install golang-go
پس از نصب Go ، می توانید برنامه جدید خود را اجرا کنید تا بررسی کنید که کار می کند:
⦁ $ go run helloworld.go
خروجی زیر را مشاهده خواهید کرد:
Output
Hello, world!

شما برنامه خود را برای پکیج شدن به عنوان Snap آماده کرده اید. در مرحله بعد نرم افزار مورد نیاز برای شروع فرایند پکیج را نصب خواهید کرد.
مرحله 2 – نصب Snapcraft
در این مرحله Snapcraft را که نام ابزار رسمی پکیج برنامه Snap است ، دانلود و نصب خواهید کرد. Snapcraft در Snap Store موجود است که به صورت پیش فرض در اوبونتو ساخته شده است. این بدان معناست که می توانید Snapcraft را از خط فرمان با استفاده از دستور snap نصب کنید.
دستور snap معادل دستور apt است ، اما شما می توانید از آن برای نصب نرم افزار از Snap Store استفاده کنید ، نه بسته هایی از منابع Apt.
به منظور نصب Snapcraft ، دستور زیر را اجرا کنید:
⦁ $ sudo snap install snapcraft –classic
شما از آرگومان فرمان –classic استفاده می کنید تا Snapcraft بدون ویژگی های سختگیرانه تکنیک جعبه شنی که اسنپ معمولاً از آن استفاده می کند ، نصب شود. Snapcraft به این آرگومان نیاز دارد زیرا نیاز به دسترسی های اختصاصی به سیستم شما برای پکیج کردن قابل اعتماد برنامه ها دارد.

پس از نصب Snapcraft ، خروجی زیر را مشاهده خواهید کرد:
Output
snapcraft 3.9.8 from Canonical✓ installed

در آخر ، می توانید دو بار نصب Snapcraft را با اجرای این دستور بررسی کنید:
⦁ $ snapcraft –version
با این کار خروجی شبیه به این خواهید داشت:
Output
snapcraft, version 3.9.8

اکنون که Snapcraft را نصب کردید ، می توانید پیکربندی و ابرداده را برای برنامه Snap خود تعریف کنید.
مرحله 3 – تعریف پیکربندی و ابرداده برای اسنپ
در این مرحله شروع به تعریف پیکربندی ، ساختار و ابرداده برای برنامه Snap می کنید.
با اطمینان از اینکه هنوز در دایرکتوری برنامه Snap خود کار می کنید شروع کنید:
⦁ $ cd ~/your-snap
سپس ، با استفاده از ویرایشگر متن مورد نظر خود ، فایل snapcraft.yaml را ایجاد و ویرایش کنید:

⦁ $ nano snapcraft.yaml
برای ذخیره کلیه پیکربندی برنامه Snap ، از جمله نام ، توضیحات و نسخه و همچنین تنظیمات مربوط به مدیریت وابستگی و جعبه شنی ، از فایل snapcraft.yaml استفاده خواهید کرد.
با تعیین نام ، خلاصه ، توضیحات و شماره نسخه برنامه خود شروع کنید:
snapcraft.yaml
name: your-snap
summary: A summary of your application in 78 characters or less.
description: |
A detailed description of your application.
The description can have multiple lines.
version: ‘1.0’

اگر می خواهید آن را در Snap Store منتشر کنید ، باید نام Snap شما مشابه نداشته باشد – برنامه های دیگر با همین نام را جستجو کنید تا مطمئن شوید قبلاً انتخاب نشده است.
در مرحله بعد ، می توانید فرمان (های) مورد نظر خود را برای برنامه خود تعریف کنید. این کار باعث می شود Snap شما مستقیماً از خط فرمان Bash به عنوان یک دستورالعمل معمولی استفاده شود.
موارد زیر را به فایل snapcraft.yaml خود اضافه کنید:
snapcraft.yaml
. . .
apps:
your-snap-command:
command: your-snap

your-snap-command نام دستوری است که می خواهید تعریف کنید. به عنوان مثال ، ممکن است شما بخواهید از دستور Helloworld برای اجرای برنامه Hello World استفاده کنید.
از command: your-snap برای این استفاده می کنید که به Snapcraft بگویید هنگام اجرای دستور برنامه چه کاری انجام دهد. در مورد برنامه Hello World ، شما از مقدار helloworld برای ارجاع فایل helloworld.go استفاده می کنید ، این به شما امکان می دهد Snapcraft برنامه شما را با موفقیت اجرا کند.
این کار به پیکربندی مثال زیر منجر میشود:
snapcraft.yaml
apps:
helloworld:
command: helloworld

اگر نام فرمان دقیقاً با نام Snap مطابقت داشته باشد ، می توانید آن را مستقیماً از خط فرمان اجرا کنید. اگر این دستور با اسنپ مطابقت نداشته باشد ، فرمان به طور خودکار با اسنپ پیشوند داده می شود. به عنوان مثال ، helloworld.command1.
در آخر ، می توانید بخش هایی را که برنامه Snap شما را تشکیل می دهند ، تعریف کنید. برنامه های اسنپ از چندین بخش ساخته شده اند که همگی مؤلفه هایی هستند که برنامه شما را تشکیل می دهند. در بسیاری موارد ، فقط یک قسمت وجود دارد ، که خود اپلیکیشن است.
هر قسمت یک افزونه مرتبط دارد. به عنوان مثال ، برای مؤلفه های برنامه شما که در Ruby نوشته شده است ، از افزونه ruby ​​استفاده می شود و برای مؤلفه های نوشته شده در Go ، از افزونه go استفاده می شود.
می توانید از فرمان Snapcraft list-plugins برای شناسایی افزونه های صحیح برای برنامه خود استفاده کنید:
⦁ $ snapcraft list-plugins
با این کار لیستی مشابه موارد زیر حاصل می شود:
Output
ant catkin-tools conda dump gradle make nil python rust
autotools cmake crystal go kbuild maven nodejs qmake scons
catkin colcon dotnet godeps kernel meson plainbox-provider ruby waf

متداول ترین افزونه ها، مختص زبان های برنامه نویسی رایج مانند Go ، Rust ، Ruby یا Python هستند.
پس از شناسایی افزونه های صحیح برای برنامه خود ، می توانید پیکربندی بخش ها را به فایل snapcraft.yaml خود اضافه کنید:
snapcraft.yaml
. . .
parts:
your-snap:
plugin: plugin-name
source: .

برای تعیین مسیر نسبی کد منبع برای برنامه خود از پارامتر پیکربندی source استفاده می کنید. معمولاً این همان دایرکتوری فایل snapcraft.yaml خواهد بود ، بنابراین مقدار منبع یک نقطه واحد (.) است.
توجه: اگر مؤلفه برنامه شما متعلقات لازم را برای ساخت یا اجرای آن دارد ، می توانید با استفاده از ویژگی های build-pack و stage-packets این موارد را مشخص کنید. نام متعلقات مشخص شده به طور خودکار از پکیج منیجر پیش فرض برای سیستم شما گرفته می شوند.
مثلا:
snapcraft.yaml
parts:
your-snap:
plugin: plugin-name
source: .
build-packages:
– gcc
– make
stage-packages:
– libcurl4

برخی از افزونه های Snapcraft گزینه های خاص خود را دارند که ممکن است برای برنامه شما لازم باشد ، بنابراین ارزشمند است صفحات کتابچه راهنمای مربوطه را برای افزونه خود مرور کنید:
⦁ $ snapcraft help plugin-name

در مورد برنامه های Go ، go-importpath را نیز مشخص می کنید. برای پیکربندی Hello world ، منجر به پیکربندی زیر خواهد شد:
snapcraft.yaml
parts:
helloworld:
plugin: go
source: .
go-importpath: helloworld

می توانید فایل snapcraft.yaml خود را باز بگذارید تا در مرحله بعدی پیکربندی بیشتری را اضافه کنید.
شما تنظیمات پایه را برای برنامه Snap خود تعریف کرده اید. در مرحله بعد ، جنبه های امنیتی و جعبه شنی برنامه خود را پیکربندی خواهید کرد.
مرحله 4 – ایمن سازی برنامه Snap
برنامه های اسنپ به گونه ای طراحی شده اند که به اصطلاح در یک محفظه شنی اجرا شوند ، بنابراین در این مرحله شما تکنیک sandboxing را برای Snap خود پیکربندی خواهید کرد. در مرحله اول ، باید جعبه شنی را برای برنامه خود فعال کنید ، که در Snapcraft به confinement شناخته می شود.
موارد زیر را به فایل snapcraft.yaml خود اضافه کنید:
snapcraft.yaml
. . .
confinement: strict

این کار جعبه شنی را برای برنامه شما فعال می کند و از دسترسی آن به اینترنت ، سایر اسنپ های در حال اجرا یا خود سیستم هاست جلوگیری می کند. با این حال ، در بیشتر موارد ، برنامه ها نیازی به برقراری ارتباط خارج از جعبه شنی خود ندارند مانند زمانی که نیاز به دسترسی به اینترنت یا خواندن و نوشتن سیستم فایل دارید.
این مجوزها که در Snapcraft به عنوان interfaces شناخته می شوند ، می توانند با استفاده از پلاگین ها به برنامه Snap شما اعطا شوند. با استفاده از افزونه ها ، می توانید کنترل برنامه ریز و جزیی بر روی جعبه شنی برای برنامه خود داشته باشید تا به آن دسترسی لازم را بدهید و نه چیزی بیشتر (اصل حداقل امتیاز).
رابط های دقیق مورد نیاز بسته به برنامه شما متفاوت هستند. برخی از رایج ترین رابط ها عبارتند از:
⦁ audio-playback – امکان صداهای خروجی / پخش را میدهد.
⦁ audio-record – امکان ورودی صوت / ضبط صدا را می دهد.
⦁ camera – دسترسی به وب کم های متصل را امکان پذیر می کند.
⦁ home – دسترسی به فایل های غیر پنهان را در دیرکتوری هوم شما ممکن می سازد.
⦁ network – دسترسی به شبکه / اینترنت را امکان پذیر می کند.
⦁ network-bind – به شما اجازه می دهد تا درگاه ها را برای کار به عنوان سرویس شبکه متصل کنید.
⦁ system-files – دسترسی به کل سیستم فایل دستگاه هاست را امکان پذیر می کند.
لیست کامل واسط های موجود را می توان در مطالب Snapcraft تحت عنوان واسط های پشتیبانی شده بیابید.
هنگامی که تمام رابط های مورد نیاز برنامه خود را شناسایی کردید ، می توانید این افزونه ها را به فایل های snapcraft.yaml خود اختصاص دهید.
پیکربندی مثال زیر به برنامه اجازه می دهد تا به شبکه و فضای هوم کاربران دسترسی پیدا کند:
snapcraft.yaml
. . .
plugs:
your-snap-home:
interface: home
your-snap-network:
interface: network

فایل خود را ذخیره کنید و از آن خارج شوید.
نام Plug باید یک اسم توصیفی باشد تا کاربران بتوانند هدف Plug را شناسایی کنند.
شما sandboxing را برای Snap فعال کرده اید و برخی از افزونه ها را پیکربندی کرده اید تا دسترسی محدود به منابع سیستم را داشته باشند. در مرحله بعدی ساخت برنامه Snap خود را تمام می کنید.
مرحله 5 – ساخت و آزمایش برنامه Snap
اکنون که تمام تنظیمات لازم را برای Snap خود نوشتید ، می توانید با ساختن آن و آزمایش پکیج اسنپ بصورت محلی پیش بروید
اگر دنبال استفاده از یک برنامه Hello World به عنوان برنامه خود بوده اید ، فایل کامل snapcraft.yaml شما اکنون شبیه زیر است:
snapcraft.yaml
name: helloworld
summary: A simple Hello World program.
description: |
A simple Hello World program written in Go.
Packaged as a Snap application using Snapcraft.
version: ‘1.0’
confinement: strict

apps:
helloworld:
command: helloworld

parts:
helloworld:
plugin: go
source: .
go-importpath: helloworld

plugs:
helloworld-home:
interface: home
helloworld-network:
interface: network

برای ساختن برنامه Snap ، دستور Snapcraft را از درون دیرکتوری برای Snap خود اجرا کنید:
⦁ $ snapcraft
سپس Snapcraft به صورت خودکار یک ماشین مجازی (VM) را راه اندازی می کند و ساخت Snap را شروع می کند. پس از اتمام ، Snapcraft خارج می شود و چیزی شبیه به خروجی زیر را مشاهده خواهید کرد:
Output
Snapped your-snap_1.0_amd64.snap

اکنون می توانید Snap خود را بصورت محلی نصب کنید تا بررسی کنید که در حال کار است:
⦁ $ sudo snap install your-snap.snap –dangerous
آرگومان فرمان –dangerous لازم خواهد بود چرا که شما یک اسنپ محلی را نصب میکنید که امضا نشده است.
Output
your-snap 1.0 installed

پس از اتمام مراحل نصب ، می توانید Snap خود را با استفاده از دستور مربوط به آن اجرا کنید. مثلا:
⦁ $ helloworld
در مورد برنامه Hello World مثال ، خروجی مشابه زیر خواهد بود:
Output
Hello, world!

همچنین می توانید رویکرد تکنیک جعبه شنی را برای Snap خود مشاهده کنید تا مطمئن شوید که مجوزهای اختصاص یافته به درستی اعطا شده اند:
⦁ $ snap connections your-snap
با این کار لیستی از افزونه ها و رابط ها ، مشابه زیر صادر می شود:
Output
snap connections your-snap
Interface Plug Slot Notes
home your-snap:your-snap-home :home –
network your-snap:your-snap-network :network –

در این مرحله اسنپ خود را ساختید و آن را به صورت محلی نصب کردید تا آزمایش کنید که کار می کند یا خیر. در مرحله بعد ، اسنپ خود را در Snap Store منتشر می کنید.
مرحله ششم – انتشار اسنپ خود
اکنون که برنامه Snap خود را ساخته و آزمایش کرده اید ، زمان آن رسیده است که آن را در Snap Store منتشر کنید.
با ورود به حساب Snap Developer خود با استفاده از برنامه خط فرمان Snapcraft شروع کنید:
⦁ $ snapcraft login
برای وارد کردن آدرس ایمیل و گذرواژه ، اعلان ها را دنبال کنید.
در مرحله بعد ، باید نام برنامه را در Snap Store ثبت کنید:
⦁ $ snapcraft register your-snap
پس از ثبت نام اسنپ ، می توانید بسته ساخت اسنپ را وارد فروشگاه کنید:
⦁ $ snapcraft push your-snap.snap
خروجی مشابه زیر را مشاهده خواهید کرد:
Output
Preparing to push ‘your-snap_1.0_amd64.snap’.
Install the review-tools from the Snap Store for enhanced checks before uploading this snap.
Pushing ‘your-snap_1.0_amd64.snap’ [===================================================================================================] 100%
Processing…|
Ready to release!
Revision 1 of ‘your-snap’ created.

هر بار که به Snap Store میروید ، تعداد نسخه مرور شده که از یک شروع شروع می شود افزایش یافته است. این امر برای کمک به شناسایی انواع ساخت Snap شما مفید میباشد.
در نهایت ، می توانید Snap خود را برای عموم منتشر کنید:
⦁ $ snapcraft release your-snap revision-number channel
اگر این اولین بار است که به Snap Store میروید ، تعداد تجدید نظر در آن 1 خواهد بود. اگر نسخه های مختلفی از برنامه خود را در مراحل مختلف توسعه دارید ، می توانید بین انتشارها کانالهای stable ، candidate ، beta و edge  نیز انتخاب کنید.
به عنوان مثال ، دستور زیر ویرایش 1 نسخه Hello World Snap را به کانال stable منتشر می کند:
⦁ $ snapcraft release helloworld 1 stable
خروجی مشابه زیر را مشاهده خواهید کرد:
Output
Track Arch Channel Version Revision
latest amd64 stable 1.0 1
candidate ^ ^
beta ^ ^
edge ^ ^
The ‘stable’ channel is now open.

اکنون می توانید برنامه خود را در Snap Store جستجو کرده و در هر یک از دستگاه های خود نصب کنید.

در این مرحله آخر ، بسته ساخت اسنپ خود را در Snap Store آپلود کرده و آن را برای عموم منتشر کردید.
نتیجه
در این مقاله شما یک برنامه Snap را پیکربندی کرده و ساخته اید ، و سپس آن را از طریق Snap Store منتشر کردید. اکنون شما دانش بنیادی لازم برای حفظ برنامه خود و ساختن موارد جدید را دارید.
اگر می خواهید Snaps Store را بیشتر یاد بگیرید ، بهتر است در فهرست کامل Snap Store چرخی بزنید. همچنین میتوانید رفرنس YAML Snapcraft را مرور کنید تا اطلاعات بیشتری در مورد آن بیابید و ویژگیهای بیشتری را برای پیکربندی Snap خود شناسایی کنید.
سرانجام ، اگر مایل به تحقیق بیشتر درباره توسعه اسنپ هستید ، از خواندن و اجرای Snap Hooks لذت خواهید برد ، که به Snaps اجازه می دهد به صورت پویا نسبت به تغییرات سیستم مانند به روزرسانی ها یا تنظیم رویکردهای امنیتی واکنش نشان دهد.

 

 

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

نحوه نصب Nginx در CentOS 8  –  استفاده از Cron برای خودکارسازی کارها در اوبونتو 18

پکیج کردن و انتشار برنامه Snap در اوبونتو 18نصب و استفاده ازRadamsa برای فوز کردن برنامه ها روی Ubuntu 18

استقرارهای تولید Node.js خود را با Shipit در CentOS 7 –  نحوه راه اندازی Eclipse Theia Cloud IDE Platform در Debian 10

چگونگی استفاده از migrations و seeders دیتابیس  –  نحوه نصب Docker Compose در Debian 10

نحوه نصب R روی اوبونتو 18.04 – چگونه می توان با کتابخانه (library) درخواست ها در پایتون شروع به کار کرد

چگونه می توان هاست های مجازی Apache را در اوبونتو 18.04  –  نحوه اجرای صفحه گذاری در MySQL با PHP روی اوبونتو 18.04

نصب پشته Nginx، MySQL، PHP LEMP در CentOS 8 – نحوه تنظیم پلتفرم Eclipse Theia Cloud IDE در CentOS 7

نحوه نصب پشته یا استک Nginx ، MySQL ، PHP LEMP  –  بسته بندی برنامه Laravel 6 برای توسعه با Docker Compose

مراحل ایمن سازی Apache HTTP در FreeBSD 12  – بهینه سازی درخواست های MySQL با ذخیره سازی ProxySQL در اوبونتو 16

درک Objectهای Map و Set در JavaScript  –  استفاده از Ansible برای نصب و راه اندازی وردپرس با LAMP در اوبونتو 18

نحوه راه اندازی Eclipse Theia Cloud IDE در اوبونتو  –  چگونه می توان پلتفرم كد سرور Cloud IDE را در اوبونتو 18.04

نحوه استفاده از Cron برای خودکارسازی کارها در CentOS 8   –  چگونه می توان از رول های ansible برای انتزاع محیط زیرساختی

نحوه نوشتن کد ناهمگام (غیر همزمان) در Node.js –  نحوه پیکربندی یک خوشه Galera با MySQL در سرورهای اوبونتو 18

راه اندازی اولیه سرور با CentOS 8 –   تهیه نسخه پشتیبان و بازیابی یک خوشه Kubernetes

نحوه تنظیم کلیدهای SSH در CentOS 8 –  نحوه نصب و استفاده از PostgreSQL در CentOS 7

نحوه ساختن یک برنامه Node.js با Docker  Quickstart  –  چگونه می توان پلتفرم Eclipse Theia Cloud IDE را روی اوبونتو

چگونه می توان هاست های مجازی Apache را در اوبونتو  –  مدیریت DNS با استفاده از DNSControl در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04 –  چگونه می توان پلتفرم Cloud IDE کد سرور را روی CentOS 7

نحوه نصب و استفاده از TimescaleDB در CentOS 7نحوه نصب Apache Kafka در Debian 10

نحوه تایید صحت رمز عبور با Apache در اوبونتو 18.04  –  نحوه نصب وردپرس با OpenLiteSpeed ​​در اوبونتو 18.04

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکاخرید سرور مجازی ارزان هلندvpsخرید vps هلندخرید سرور مجازی آمریکاخرید vps فرانسهتست vpsسرور مجازی تستسرور مجازی ویندوزارزانترین vpsخرید وی پی اسvps ارزان – 

برچسب‌ها:, , ,