Майна + VPS барои 30 рубл =?

Доштани ҳама чизҳои хурде, ки ба шумо лозиманд, дар нӯги ангуштони худ хеле хуб аст: қалам ва дафтарчаи хуб, қалами тез, муши бароҳат, якчанд кабелҳои иловагӣ ва ғайра. Ин чизҳои ноаён нодида гирифта мешаванд, аммо ба ҳаёти шумо роҳатӣ зам мекунанд. Ҳамин қисса бо барномаҳои гуногуни мобилӣ ва мизи корӣ низ ҳамин аст: барои гирифтани скриншотҳои дароз, барои кам кардани андозаи тасвир, барои пайгирии молияи шахсӣ, луғатҳо, тарҷумонҳо, табдилдиҳандаҳо ва ғайра. Оё шумо яке доред? VPS — яке, ки арзон аст, ҳамеша дар даст аст ва арзиши зиёд меорад? Не, на он чизе, ки ширкати шумо дорад, балки он чизе, ки "ҷайбӣ"-и шумост. Мо фикр кардем, ки дар соли 2019 бе VPS-и хурд будан каме ғамангез хоҳад буд, мисли он ки бе қалами муқаррарии худ ҳангоми лексия будан. Дар ин чӣ ғамангез аст? Тобистон аст. Хуб, тобистон аст. Тобистони як мутахассиси IT: дар хона нишаста, бе ягон нишонае аз пушаймонӣ рӯи лоиҳаҳои дӯстдоштаи худ кор кардан. Пас, мо дар ин бора фикр кардем ва ин корро кардем.

Майна + VPS барои 30 рубл =?
Коммунизм фаро расид, рафиқон.

Ӯ хеле шахсӣ аст - VPS-и мо барои сӣ

Мо се ё чор сол пеш мақолаҳои зиёдеро аз рақибон ва корбарон дар бораи он ки чаро ба шумо VPS-и арзон лозим нест, хонда будем. Дуруст аст, ки дар он вақт VPS-и "арзон" як маркетинги холис буд ва наметавонист ягон функсияи воқеиро пешниҳод кунад. Аммо замонҳо тағйир меёбанд, арзиши захираҳои виртуалӣ пасттар мешавад ва бо 30 рубл дар як моҳ мо метавонем инро пешниҳод кунем:

  • Протсессор: Intel Xeon 2 ГГц (1 ядро)
  • система Linux (Debian, Ubuntu, CentOS (ихтиёрӣ)
  • 1 суроғаи IPv4-и махсус
  • 10 ГБ нигаҳдории зуд ва SSD-и сатҳи корхона
  • RAM: 512 МБ
  • Ҳисоббаробаркунӣ дар як сония
  • Трафики бемаҳдуд

Нархнома ба маҳдудиятҳои иловагии техникӣ вобаста аст, тафсилот дар зер оварда шудааст саҳифа Пешниҳоди олии мо: VPS барои 30 рубл. 

Аз чунин сервери виртуалӣ кӣ фоида мебинад? Қариб ҳама: шурӯъкунандагон, мухлисон, таҳиягарони ботаҷриба, мухлисони корҳои худкор ва ҳатто баъзе ширкатҳо.

Ин VPS барои чӣ мувофиқ аст?

Мо фикр мекунем, ки хонандагони Habr бешубҳа роҳи худро барои истифодаи ин конфигуратсия пайдо мекунанд, аммо мо тасмим гирифтем, ки маҷмӯаи ғояҳои худро тартиб диҳем - танҳо дар сурате, ки касе ба он ниёз дошта бошад ва бачаҳо намедонанд?

  • Вебсайти оддии худ, портфолио, резюмеи худро бо рамз ва ғайра ҷойгир кунед. Албатта, вебсайти хуб тарҳрезишуда ба корфармоён таассуроти мусбат мебахшад. Онро дар VPS-и худ ҷойгир кунед ва худатон барои амният ва устувории он масъул бошед, на ба хидматҳои хостинги анъанавӣ такя кунед.
  • VPS-ро барои мақсадҳои таълимӣ истифода баред: лоиҳаи худро ҷойгир кунед, тарзи кори сервер ва системаи амалиётии серверро омӯзед, бо DNS таҷриба кунед ва як вебсайти хурди таълимӣ созед.
  • Барои телефония. Баъзан соҳибкори инфиродӣ, фрилансер ё ширкати хеле хурд ба телефонияи IP сахт ниёз доранд, аммо провайдерҳо хеле хасис ҳастанд. Ҳама чиз оддӣ аст: сервери худро гиред, аз провайдери телефонияи IP рақам харед, PBX виртуалиро насб кунед ва васеъкуниҳо эҷод кунед (агар лозим бошад). Сарфа хеле зиёд аст.
  • Барои санҷидани барномаҳои худ аз сервер истифода баред.
  • Серверро барои таҷрибаҳои худсохт, аз ҷумла идоракунӣ ва ҷамъоварии маълумот аз сенсорҳои системаи хонаи интеллектуалӣ, истифода баред.
  • Як ҳолати ғайриоддии истифода ин ҷойгир кардани ёвари савдои виртуалӣ, боти савдо, дар сервери шумост. Шумо барои устуворӣ ва амнияти сервер пурра масъул хоҳед буд, яъне шумо асбоби пурра идорашаванда барои савдои бозори саҳомӣ хоҳед дошт. Танҳо дар сурате, ки касе манфиатдор бошад ё нақшаи ин корро дошта бошад. 🙂

Ин VPS инчунин дар бахши корпоративӣ татбиқ мешавад. Илова бар хидмати телефонии дар боло зикршуда, якчанд хусусиятҳои ҷолибро метавон амалӣ кард. Масалан:

  • Ҷойгиркунии пойгоҳҳои додаҳои хурд ва маълумоте, ки кормандони сафаркунанда метавонанд аз фосилаи дур, масалан, тавассути FTP, дастрас бошанд. Ин имкон медиҳад, ки таҳлили муосир, конфигуратсияҳои навшуда барои гурӯҳҳои фурӯш, презентатсияҳо ва ғайра зуд мубодила карда шаванд.
  • Барои намоиши нармафзор ё васоити ахбори омма ба корбарон ё муштариён дастрасии муваққатӣ фароҳам оваред.

Санҷиши VPS барои 30 рубл - мо инро барои шумо анҷом додем

30 рубл он қадар кам аст, ки шумо ҳатто намехоҳед корти худро барои пардохт ва санҷидан гиред. Мо баъзан танбал ҳам ҳастем, аммо ин дафъа мо ҳама чизро барои шумо кардем. Пеш аз ба кор андохтани серверҳо, мо як санҷиш гузаронидем, то ҳар як ҷузъиётро тафтиш кунем ва нишон диҳем, ки серверҳо бо ин нақша чӣ кор карда метавонанд. Барои ҷолибтар кардани корҳо, мо баъзе санҷишҳои шадидро илова кардем ва санҷидем, ки ин конфигуратсия чӣ гуна рафтор мекунад, агар зичӣ ва бор аз ҳадди муайяншудаи мо зиёд шавад. 

Хост бо як қатор мошинҳои виртуалӣ пур карда шуда буд, ки ҳар кадоми онҳо вазифаҳои гуногуни марбут ба CPU-ро иҷро мекарданд ва аз зерсистемаи диск фаъолона истифода мебурданд. Ҳадаф симулятсияи ҷойгиркунии зичии баланд ва бори кории қобили муқоиса бо бори воқеии истеҳсолӣ ё аз он зиёдтар буд.

Илова бар бори кории доимӣ, мо се мошини виртуалиро насб кардем, ки метрикаҳои синтетикиро бо истифода аз sysbench ҷамъ мекарданд, ки натиҷаҳои миёнаи онҳо дар зер оварда шудаанд ва 50 мошини виртуалӣ, ки бори кории иловагиро ба вуҷуд оварданд. Ҳамаи мошинҳои виртуалии санҷидашуда конфигуратсияи якхела доштанд (як ядро, 512 ГБ RAM, 10 ГБ SSD) ва тасвири стандартӣ ҳамчун системаи амалиётӣ интихоб карда шуд. debian 9.6, ки ба корбарон дар RUVDS пешниҳод карда мешавад.

Бор аз ҷиҳати хусусият ва бузургӣ бо бори ҷангӣ қобили муқоиса буд:

  • Баъзе мошинҳои виртуалӣ бо бори кам кор мекарданд.
  • Баъзе аз мошинҳо сенарияи санҷиширо иҷро карданд, ки бори протсессорро тақлид мекард (бо истифода аз утилит стресс)
  • Дар VM-ҳои боқимонда, мо скриптеро иҷро кардем, ки аз фармони dd барои нусхабардории маълумот аз маълумоти пешакӣ омодашуда ба диск бо маҳдудияти муқарраршуда бо истифода аз pv истифода бурд (мисолҳоро дар ин ҷо пайдо кардан мумкин аст). дар ин ҷо и дар ин ҷо).

Ҳамчунин, чунон ки шумо дар хотир доред, мо се мошин доштем, ки метрикаҳои синтетикиро ҷамъ мекарданд.

Дар ҳар як мошин, скрипт ба таври даврӣ ҳар 15 дақиқа иҷро мешуд, ки санҷишҳои стандартии sysbench-ро барои протсессор, хотира ва диск иҷро мекунад.

скрипти sysbench.sh

#!/bin/bash
date +"%Y-%m-%d %H:%M:%S" >> /root/sysbench/results.txt
sysbench --test=cpu run >> /root/sysbench/results.txt
sysbench --test=memory run >> /root/sysbench/results.txt
sysbench --test=fileio --file-test-mode=seqwr run >> /root/sysbench/results.txt
sysbench --test=fileio --file-test-mode=seqrd run >> /root/sysbench/results.txt
sysbench --test=fileio --file-test-mode=rndrw run >> /root/sysbench/results.txt

Натиҷаҳо барои қулайӣ дар формати sysbench пешниҳод карда мешаванд, аммо арзишҳои миёна барои тамоми давраи санҷиш аз ҳамаи мошинҳо гирифта шудаанд. Хулосаро дар ин ҷо пайдо кардан мумкин аст:

Sysbanch-avg.txtsysbench 0.4.12: multi-threaded system evaluation benchmark

Озмоишро бо имконоти зерин иҷро кунед:
Шумораи риштаҳо: 1

Андозаи иҷрои CPU-ро иҷро кардан

Роҳҳо оғоз ёфт!
Муҳокима.

Ҳадди аксар шумораи асосии санҷидашуда дар санҷиши CPU: 10000

Хулосаи иҷрои санҷиш:
Вақти умумӣ: 19.2244 сония
Шумораи умумии чорабиниҳо: 10000
вақти умумии сарфшуда барои иҷрои рӯйдод: 19.2104
Омори ҳар як дархост:
дақ: 1.43 мс
миёна: 1.92мс
ҳадди аксар: 47.00 мс
Тақрибан 95 процентил: 3.02 мс

Риштаҳои адолат:
рӯйдодҳои (avg / stddev): 10000.0000 / 0.00
вақти иҷро (avg / stddev): 19.2104 / 0.00

sysbench 0.4.12: меъёри арзёбии системаи бисёрриштавӣ

Озмоишро бо имконоти зерин иҷро кунед:
Шумораи риштаҳо: 1

Санҷиши суръати амалиёти хотира
Андозаи блоки хотира: 1K

Андозаи интиқоли хотира: 102400M

Навъи амалиёти хотира: навиштан
Навъи доираи хотира: глобалӣ
Роҳҳо оғоз ёфт!
Муҳокима.

Амалиётҳои анҷомдодашуда: 104857600 (328001.79 амалиёт/сония)

102400.00 МБ интиқол дода шуд (320.32 МБ/сония)

Хулосаи иҷрои санҷиш:
Вақти умумӣ: 320.9155 сония
Шумораи умумии чорабиниҳо: 104857600
вақти умумии сарфшуда барои иҷрои рӯйдод: 244.8399
Омори ҳар як дархост:
дақ: 0.00 мс
миёна: 0.00мс
ҳадди аксар: 139.41 мс
Тақрибан 95 процентил: 0.00 мс

Риштаҳои адолат:
рӯйдодҳои (avg / stddev): 104857600.0000 / 0.00
вақти иҷро (avg / stddev): 244.8399 / 0.00

sysbench 0.4.12: меъёри арзёбии системаи бисёрриштавӣ

Озмоишро бо имконоти зерин иҷро кунед:
Шумораи риштаҳо: 1

Парчамҳои кушодани файлҳои иловагӣ: 0
128 файл, ҳар кадоме 16 МБ
Андозаи умумии файл 2 ГБ
Андозаи блок 16 KB
FSYNC-и давравӣ фаъол аст, ки ҳар як 100 дархост fsync()-ро даъват мекунад.
Занг задан fsync() дар охири санҷиш, Фаъол.
Истифодаи режими синхронии I/O
Гузаронидани санҷиши пайдарпайи навиштан (офариниш)
Роҳҳо оғоз ёфт!
Муҳокима.

Амалиётҳои иҷрошуда: 0 Хонда шуд, 131072 Навиштан, 128 Дигар = 131200 Ҷамъ
Хондан 0b Навишта 2Gb Ҷамъи интиқолшуда 2Gb (320.1)Mb/sэк)
20251.32 Дархостҳо дар як сония иҷро шуданд

Хулосаи иҷрои санҷиш:
Вақти умумӣ: 6.9972 сония
Шумораи умумии чорабиниҳо: 131072
вақти умумии сарфшуда барои иҷрои рӯйдод: 5.2246
Омори ҳар як дархост:
дақ: 0.01 мс
миёна: 0.04мс
ҳадди аксар: 96.76 мс
Тақрибан 95 процентил: 0.03 мс

Риштаҳои адолат:
рӯйдодҳои (avg / stddev): 131072.0000 / 0.00
вақти иҷро (avg / stddev): 5.2246 / 0.00

sysbench 0.4.12: меъёри арзёбии системаи бисёрриштавӣ

Озмоишро бо имконоти зерин иҷро кунед:
Шумораи риштаҳо: 1

Парчамҳои кушодани файлҳои иловагӣ: 0
128 файл, ҳар кадоме 16 МБ
Андозаи умумии файл 2 ГБ
Андозаи блок 16 KB
FSYNC-и давравӣ фаъол аст, ки ҳар як 100 дархост fsync()-ро даъват мекунад.
Занг задан fsync() дар охири санҷиш, Фаъол.
Истифодаи режими синхронии I/O
Гузаронидани санҷиши мутолиаи пайдарпай
Роҳҳо оғоз ёфт!
Муҳокима.

Амалиётҳои иҷрошуда: 131072 Хонда шуд, 0 Навиштан, 0 Дигар = 131072 Ҷамъ
Хондан 2 Гб Навишта 0б Ҷамъи интиқолшуда 2 Гб (91.32)Mb/sэк)
5844.8 Дархостҳо дар як сония иҷро шуданд

Хулосаи иҷрои санҷиш:
Вақти умумӣ: 23.1054 сония
Шумораи умумии чорабиниҳо: 131072
вақти умумии сарфшуда барои иҷрои рӯйдод: 22.9933
Омори ҳар як дархост:
дақ: 0.00 мс
миёна: 0.18мс
ҳадди аксар: 295.75 мс
Тақрибан 95 процентил: 0.77 мс

Риштаҳои адолат:
рӯйдодҳои (avg / stddev): 131072.0000 / 0.00
вақти иҷро (avg / stddev): 22.9933 / 0.00

sysbench 0.4.12: меъёри арзёбии системаи бисёрриштавӣ

Озмоишро бо имконоти зерин иҷро кунед:
Шумораи риштаҳо: 1

Парчамҳои кушодани файлҳои иловагӣ: 0
128 файл, ҳар кадоме 16 МБ
Андозаи умумии файл 2 ГБ
Андозаи блок 16 KB
Шумораи дархостҳои тасодуфӣ барои IO-и тасодуфӣ: 10000
Таносуби хондан/навиштан барои санҷиши омехтаи тасодуфии IO: 1.50
FSYNC-и давравӣ фаъол аст, ки ҳар як 100 дархост fsync()-ро даъват мекунад.
Занг задан fsync() дар охири санҷиш, Фаъол.
Истифодаи режими синхронии I/O
Гузаронидани санҷиши тасодуфии r/w
Роҳҳо оғоз ёфт!
Муҳокима.

Амалиётҳои иҷрошуда: 6000 Хонда шуд, 4000 Навиштан, 12800 Дигар = 22800 Ҷамъ
Хонда шуд 93.75 Мб Навишта шуд 62.5 Мб Ҷамъи интиқол 156.25 Мб (1341.5 Кб/сония)
85.61 Дархостҳо дар як сония иҷро шуданд

Хулосаи иҷрои санҷиш:
Вақти умумӣ: 152.9786 сония
Шумораи умумии чорабиниҳо: 10000
вақти умумии сарфшуда барои иҷрои рӯйдод: 14.1879
Омори ҳар як дархост:
дақ: 0.01 мс
миёна: 1.41мс
ҳадди аксар: 210.22 мс
Тақрибан 95 процентил: 4.95 мс

Риштаҳои адолат:
рӯйдодҳои (avg / stddev): 10000.0000 / 0.00
вақти иҷро (avg / stddev): 14.1879 / 0.00
Натиҷаҳо нишондиҳанда мебошанд, аммо онҳоро набояд ҳамчун QoS қабул кард. 

Мошинҳое, ки бори иловагиро эҷод мекунанд

Нармафзор:

  • навсозии apt-get
  • навсозӣ apt-get
  • apt-get install python-pip
  • pip насби mysql-connector-python-rf

MariaDB насб карда шуд, чӣ гуна дар ин ҷо:

apt-get install libmariadbclient-dev
mysql -e "INSTALL PLUGIN blackhole SONAME 'ha_blackhole.so';" -- нужно для test_employees_sha

Пойгоҳи озмоишӣ гирифта шудааст аз ин ҷо:

База мувофиқи нишондодашуда ҷойгир карда шудааст. дар ин ҷо:

mysql -t < employees.sql
mysql -t < test_employees_sha.sql

Пойгоҳи хурди санҷишӣ:

Љадвали 

Шумораи қаторҳо 

Андозаи маълумот (МБ)

Андозаи индекс (KB)

шӯъбаҳо 

9

0.02

16.00

шӯъбаи_эмп 

331143 

11.52

5648.00

мудири шӯъба 

24 

0.02

16.00

кормандон 

299379 

14.52

0.00

музди меҳнат 

2838426 

95.63

0.00 

унвонҳо 

442783 

19.56

0.00

Як хидмати ибтидоии санҷишӣ, ки ба таври фаврӣ бо забони Python навишта шудааст, чор амалиётро иҷро мекунад:

  1. getState: вазъиятро бармегардонад
  2. getEmployee: кормандро (+маошҳо, +унвонҳо) аз пойгоҳи додаҳо бармегардонад
  3. patchEmployee: майдонҳои кормандонро тағир медиҳад
  4. insertSalary: Музди меҳнатро дохил мекунад

Манбаи хидматрасонӣ (dbtest.py)

#!/usr/bin/python
import mysql.connector as mariadb
from flask import Flask, json, request, abort
from mysql.connector.constants import ClientFlag

app = Flask(__name__)

def getFields(cursor):
    results = {}
    column = 0
    for d in cursor.description:
        results[d[0]] = column
        column = column + 1
    return results

PAGE_SIZE = 30

@app.route("/")
def main():
    return "Hello!"

@app.route("/employees/<page>", methods=['GET'])
def getEmployees(page):
    offset = (int(page) - 1) * PAGE_SIZE
    connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees')
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM employees LIMIT {} OFFSET {}".format(PAGE_SIZE, offset))
    return {'employees': [i[0] for i in cursor.fetchall()]}

@app.route("/employee/<id>", methods=['GET'])
def getEmployee(id):
    id = int(id)
    connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees')
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM employees WHERE emp_no = {}".format(id))
    fields = getFields(cursor)
    employee = {}
    found = False
    for row in cursor.fetchall():
        found = True
        employee = {
            "birth_date": row[fields["birth_date"]],
            "first_name": row[fields["first_name"]],
            "last_name": row[fields["last_name"]],
            "gender": row[fields["gender"]],
            "hire_date": row[fields["hire_date"]]
        }
    if not found:
        abort(404)
    cursor.execute("SELECT * FROM salaries WHERE emp_no = {}".format(id))
    fields = getFields(cursor)
    salaries = []
    for row in cursor.fetchall():
        salary = {
            "salary": row[fields["salary"]],
            "from_date": row[fields["from_date"]],
            "to_date": row[fields["to_date"]]
        }
        salaries.append(salary)
    employee["salaries"] = salaries
    cursor.execute("SELECT * FROM titles WHERE emp_no = {}".format(id))
    fields = getFields(cursor)
    titles = []
    for row in cursor.fetchall():
        title = {
            "title": row[fields["title"]],
            "from_date": row[fields["from_date"]],
            "to_date": row[fields["to_date"]]
        }
        titles.append(title)
    employee["titles"] = titles
    return json.dumps({
        "status": "success",
        "employee": employee
    })

def isFieldValid(t, v):
    if t == "employee":
        return v in ["birdth_date", "first_name", "last_name", "hire_date"]
    else:
        return false

@app.route("/employee/<id>", methods=['PATCH'])
def setEmployee(id):
    id = int(id)
    content = request.json
    print(content)
    setList = ""
    data = []
    for k, v in content.iteritems():
        if not isFieldValid("employee", k):
            continue
        if setList != "":
            setList = setList + ", "
        setList = setList + k + "=%s"
        data.append(v)
    data.append(id)
    print(setList)
    print(data)
    connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees', client_flags=[ClientFlag.FOUND_ROWS])
    cursor = connection.cursor()
    cursor.execute("UPDATE employees SET {} WHERE emp_no = %s".format(setList), data)
    connection.commit()
    if cursor.rowcount < 1:
        abort(404)
    return json.dumps({
        "status": "success"
    })

@app.route("/salary", methods=['PUT'])
def putSalary():
    content = request.json
    print(content)
    connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees', client_flags=[ClientFlag.FOUND_ROWS])
    cursor = connection.cursor()
    data = [content["emp_no"], content["salary"], content["from_date"], content["to_date"]]
    cursor.execute("INSERT INTO salaries (emp_no, salary, from_date, to_date) VALUES (%s, %s, %s, %s)", data)
    connection.commit()
    return json.dumps({
        "status": "success"
    })


@app.route("/state", methods=['GET'])
def getState():
    return json.dumps({
        "status": "success",
        "state": "working"
    })

if __name__ == '__main__':
    app.run(host='0.0.0.0',port='5002')

Диққат! Дар ҳеҷ сурат набояд ин хидматро ҳамчун намуна ё роҳнамо қабул кард!

Санҷишҳо бо истифода аз JMeter-и боэътимод анҷом дода шуданд. Як силсила санҷишҳо, ки аз 15 дақиқа то 2 соат давом мекарданд, бефосила гузаронида шуданд. Фоизи дархостҳо гуногун буд ва суръати интиқол аз 300 то 600 дархост дар як дақиқа фарқ мекард. Шумораи риштаҳо аз 50 то 500 буд.

Аз сабаби он, ки пойгоҳ аз ҷиҳати андоза хеле хурд аст, фармон:

mysql -e "SHOW ENGINE INNODB STATUS"

Нишон медиҳад, ки:

Buffer pool hit rate 923 / 1000, young-making rate 29 / 1000 not 32 / 1000

Дар зер вақти миёнаи посух барои дархостҳо оварда шудааст:

нархнома

миёна

Медион

90% Хат

95% Хат

99% Хат

Min

макс

Кормандро гиред

37.64

12.57

62.28

128.5

497.57

5

4151.78

getState

17

7.57

30.14

58.71

193

3

2814.71

patchEmployee

161.42

83.29

308

492.57

1845.14

5

6639.4

ПутСалярӣ

167.21

86.93

315.34

501.07

1927.12

7

6722.44

Шумо метавонед дар асоси ин натиҷаҳои синтетикӣ баҳо додани мувофиқати ин VPS барои ниёзҳои мушаххаси худ душворӣ кашед. Умуман, усулҳои номбаршуда ба он ҳолатҳое маҳдуданд, ки мо дар ин ё он шакл дучор шудаем. Аз ин рӯ, рӯйхати мо бешубҳа пурра нест. Мо шуморо ташвиқ мекунем, ки хулосаҳои худро бароред ва сервери 30-рублиро бо барномаҳо ва вазифаҳои воқеии худ санҷед ва имконоти худро барои ин конфигуратсия дар шарҳҳо пешниҳод кунед.

Манбаъ: will.com

Хостинги боэътимодро барои сайтҳо бо муҳофизати DDoS, серверҳои VPS VDS харед 🔥 Харидани хостинги боэътимоди вебсайт бо муҳофизати DDoS, серверҳои VPS VDS | ProHoster