Ինչպես է ստեղծվել սերվերի ոչնչացման մասին հաքերային խաղի հետնամասը

Ինչպես է ստեղծվել սերվերի ոչնչացման մասին հաքերային խաղի հետնամասը
Մենք շարունակում ենք պատմել ձեզ, թե ինչպես է կազմակերպվել մեր լազերային որոնումը սերվերի ոչնչացման հետ: Սկսեք նախորդից հոդված որոնումների լուծման մասին.

Ընդհանուր առմամբ, խաղի հետնամասն ուներ 6 ճարտարապետական ​​միավոր, որոնք մենք կվերլուծենք այս հոդվածում.

  1. Խաղի սուբյեկտների հետնամասը, որոնք պատասխանատու էին խաղի մեխանիզմների համար
  2. Backend-ի և կայքի տվյալների փոխանակման ավտոբուս VPS-ում
  3. Թարգմանիչ հետին պլանի հարցումներից (խաղի տարրեր) Arduino և ապարատներ տեղում
  4. Arduino-ն, որը պատասխանատու էր ռելեների կառավարման համար, հրամաններ էր ստանում թարգմանիչից և կատարում էր բուն աշխատանքը
  5. Փաստացի սարքեր՝ օդափոխիչ, ծաղկեպսակներ, հատակի լամպեր և այլն։
  6. Frontend - ինքը Falcon-ի կայքը, որտեղից խաղացողները կառավարում էին սարքերը

Եկեք անցնենք դրանցից յուրաքանչյուրի միջով:

Խաղի սուբյեկտների հետնամասը

Backend-ը ներդրվել է որպես գարնանային բեռնման հավելված. այն ուներ մի քանի հանգստի կարգավորիչներ, վեբսոկետի վերջնակետ և ծառայություններ՝ խաղի տրամաբանությամբ:

Կար ընդամենը երեք վերահսկիչ.

  • Մեգատրոն. Ընթացիկ Megatron էջն ուղարկվել է GET հարցումների միջոցով՝ հոսանքը միացնելուց առաջ և հետո: Լազերը արձակվել է POST հարցման միջոցով:
  • Մետլադային էջերի քարտեզագրում այնպես, որ դրանք մատուցվեն էջի անունով: Tilde-ն արտահանման համար էջեր է արտադրում ոչ թե օրիգինալ անուններով, այլ ներքին ID-ով և համապատասխանության տեղեկություններով:
  • Captcha վերահսկիչ՝ կեղծ բարձր բեռնված սերվերի captcha-ն սպասարկելու համար:

Websocket endpoint-ը օգտագործվել է գաջեթները կառավարելու համար՝ լամպեր, ծաղկեպսակ և տառեր: Այն ընտրվել է բոլոր խաղացողներին սինքրոն կերպով ցուցադրելու սարքի ներկայիս կարգավիճակը՝ այն միացված է, թե անջատված, ակտիվ է, թե ոչ, տառի որ գույնն է ներկայումս լուսավորված պատին: Որպեսզի լազերային միացնելու խնդիրը մի փոքր ավելի բարդացնենք, մենք ավելացրինք հեղինակավորումը ծաղկեպսակին և լազերին նույն մուտքով և գաղտնաբառով admin/admin:

Խաղացողները կարող էին փորձարկել այն՝ միացնելով ծաղկեպսակը և նույնը կրկնել լազերի հետ:

Մենք ընտրեցինք նման չնչին մուտք-գաղտնաբառ զույգ, որպեսզի խաղացողներին չտանջենք ավելորդ ընտրությամբ:

Առաջադրանքը մի փոքր ավելի հետաքրքիր դարձնելու համար mongodb-ի օբյեկտների ID-ները օգտագործվել են որպես սարքերի նույնացուցիչներ սենյակում:

ObjectId-ը պարունակում է ժամանակի դրոշմակնիք՝ երկու պատահական արժեք, որոնցից մեկը վերցված է սարքի նույնացուցիչի հիման վրա, իսկ երկրորդը՝ հիմնված այն գեներացնող գործընթացի pid-ի և հաշվիչի արժեքի վրա: Ես ուզում էի կանոնավոր ընդմիջումներով և տարբեր pid պրոցեսներով, բայց ընդհանուր հաշվիչով գեներացված նույնացուցիչները պատրաստել, որպեսզի լազերային սարքի նույնացուցիչի ընտրությունն ավելի հետաքրքիր լինի։ Այնուամենայնիվ, ի վերջո, բոլորը սկսեցին նույնացուցիչներով, որոնք տարբերվում էին միայն հաշվիչի արժեքով: Հնարավոր է, որ սա չափազանց պարզ դարձրեց քայլը և չպահանջի objectId կառուցվածքի վերլուծություն:

Թարգմանիչ հետին պլանի հարցումներից

Python սցենար, ով աշխատել է ժամանակաչափերի վրա և դրանք խաղային աբստրակցիաներից թարգմանել ֆիզիկական մոդելի։ Օրինակ՝ «միացնել հատակի լամպը» → «միացնել ռելե N2»:

Սցենարը միացավ RabbitMQ հերթին և հերթից հարցումները փոխանցեց Arduino-ին: Այն իրականացնում էր նաև լույսի զուգահեռ միացման տրամաբանությունը՝ որոշ սարքերի հետ միացված էր դրանց վրա լույսը, օրինակ, երբ սկզբում էլեկտրաէներգիա էր մատակարարվում Մեգատրոնին, այն լուսավորվում էր բեմի լույսով։ Ամբողջ տեսարանի կինեմատոգրաֆիայի լուսավորության ձևավորումը առանձին պատմություն է մեր նախագծի համապրոդյուսեր և արտադրության դիզայներ Իլյա Սերովի մեծ աշխատանքի մասին, և մենք դրա մասին կպատմենք առանձին գրառման մեջ:

Թարգմանիչը պատասխանատու էր նաև մանրացնող սարքը ժմչփի միջոցով գործարկելու և պատկերը հեռուստացույցին փոխանցելու տրամաբանության համար՝ ջարդիչը գործարկելու ժմչփ, ճչացող կապիբարա, խաղի վերջում գովազդ։

Ինչպես է կառուցվել Megatron նշանի ստեղծման տրամաբանությունը

Փորձնական կրակոց

Յուրաքանչյուր 25 վայրկյանը մեկ նոր նշան էր ստեղծվում, որը կարող էր օգտագործվել 10/10 հզորությամբ լազերը 255 վայրկյան միացնելու համար: Հղում դեպի github Megatron կոդով.

Այնուհետև լազերը սառեցվեց 1 րոպեով. այս ընթացքում այն ​​անհասանելի էր և չէր ընդունում նոր կրակոցի հարցումները:

Այս ուժը բավարար չէր պարանի միջով այրելու համար, բայց ցանկացած խաղացող կարող էր կրակել Մեգատրոնին և տեսնել լազերային ճառագայթը գործողության մեջ:

Նշան ստեղծելու համար օգտագործվել է MD5 հեշավորման ալգորիթմը: Եվ սխեման ստացվեց MD5 MD5-ից + հաշվիչ + գաղտնի մարտական ​​նշանի համար և առանց գաղտնիքի փորձարկման նշանի համար:

MD5-ը հղում է առևտրային նախագծին, որն արել է Պավելը՝ մեր հովանավորը: Ընդամենը մի քանի տարի առաջ այս նախագիծն օգտագործեց MD5, և երբ նա նախագծի ճարտարապետին ասաց, որ դա հնացած կոդավորման ալգորիթմ է, նրանք սկսեցին օգտագործել MD5-ը MD5-ից: Քանի որ մենք որոշեցինք հնարավոր դարձնել ամենաանհեթեթ նախագիծը, նա հիշեց ամեն ինչ և որոշեց փոքրիկ անդրադարձ կատարել։

Մարտական ​​կրակոց

Megatron-ի մարտական ​​ռեժիմը 100% լազերային հզորություն է 3 Վտ: Սա բավական է 2 րոպե՝ ծանրությունը պահող պարանի միջով այրվելու, ակվարիումը կոտրելու և սերվերը ջրով ողողելու համար։

Մենք թողել ենք մի քանի հուշումներ նախագծի Github-ի վերաբերյալ, մասնավորապես՝ նշանի ստեղծման կոդը, որից կարելի է հասկանալ, որ թեստային և մարտական ​​նշանները ստեղծվում են նույն հաշվիչի ցուցիչի հիման վրա: Մարտական ​​նշանի դեպքում, հաշվիչ արժեքից բացի, օգտագործվում է նաև աղ, որը գրեթե ամբողջությամբ մնացել է այս էության փոփոխության պատմության մեջ, բացառությամբ վերջին երկու նիշերի։

Իմանալով այս տվյալները՝ հնարավոր եղավ տեսակավորել աղի վերջին 2 սիմվոլները և իրականում պարզել, որ դրա համար օգտագործվել են Lost-ի թվերը՝ վերածված տասնվեցական համակարգի:

Այնուհետև խաղացողները պետք է բռնեին հաշվիչի արժեքը (վերլուծելով թեստի նշանը) և գեներացնեին մարտական ​​նշան՝ օգտագործելով հաջորդ հաշվիչի արժեքը և նախորդ քայլում ընտրված աղը:

Հաշվիչը պարզապես ավելանում էր յուրաքանչյուր թեստային կրակոցով և յուրաքանչյուր 25 վայրկյանում: Մենք այս մասին ոչ մի տեղ չենք գրել, այն պետք է փոքրիկ խաղային անակնկալ լիներ։

Captcha փոխազդեցության ծառայություն

Խաղային աշխարհում սա նույն captcha-ն էր, որը պետք էր բեռնել օդափոխիչը միացնելու և ակնարկով ֆլիպչարտը բացելու համար: Տեսախցիկի կողքին դրված էր նոթբուք՝ ծանրաբեռնվածության մոնիտորինգով:

Ինչպես է ստեղծվել սերվերի ոչնչացման մասին հաքերային խաղի հետնամասը

Ծառայություն Ես հաշվարկեցի, թե ինչ պետք է ցուցադրել մոնիտորինգում որպես ընթացիկ բեռ՝ ջերմաստիճան և պրոցեսորի օդափոխիչ: Չափիչները փոխանցվել են ժամանակային բազայի տվյալների բազա և նկարվել grafana-ի կողմից:

Եթե ​​վերջին 5 վայրկյանում captcha-ն ցուցադրելու ավելի քան 50 հարցում է եղել, ապա բեռնվածությունն ավելացել է ֆիքսված + պատահական թվով քայլերով։ Հաշվարկն այն էր, որ 100% բեռը կարելի է հասնել երկու րոպեում:

Իրականում ծառայության մեջ ավելի շատ տրամաբանություն կար, քան ցուցադրվում էր եզրափակիչ խաղում. մոնիտորը տեղադրեցինք այնպես, որ տեսանելի էր միայն պրոցեսորի օդափոխիչի պտույտը։

Քվեստի սկզբում նրանք ցանկանում էին Grafan-ին հասանելի թողնել Falcon կայքից: Բայց այն նաև պարունակում էր սփրինգբոտի չափումներ backend հավելվածի զեկույցից, որը մենք ժամանակ չունեինք մաքրելու, ուստի որոշեցինք արգելափակել մուտքը դեպի այն: Եվ ճիշտ է. նույնիսկ որոնումների սկզբում որոշ խաղացողներ կռահեցին, որ հավելվածը գրված է Springboot շրջանակում և նույնիսկ փորեցին որոշ ծառայությունների անուններ:

Հոսթինգ և տվյալների ավտոբուս

Backend-ից կայք տեղեկատվություն փոխանցելու գործիք՝ VPS սերվեր, որի վրա աշխատում էր RabbitMQ:

Backend-ը և տվյալների ավտոբուսը միացված էին մեր VPS. Նրա հզորությունը համեմատելի էր այն համակարգչի հետ, որը դուք տեսաք էկրանին. 2 միջուկային VPS՝ երկու գիգաբայթ օպերատիվ հիշողությամբ: Սակագինը գանձվում էր ռեսուրսների համար, քանի որ պիկ բեռը նախատեսված էր ընդամենը մի քանի օրվա համար. ահա թե ինչ են անում մեր հաճախորդները, ովքեր նախատեսում են կարճ ժամանակով բեռնել VPS-ը: Հետո պարզվեց, որ ծանրաբեռնվածությունն ավելի մեծ է, քան մենք սպասում էինք, և ֆիքսված սակագինը ավելի շահավետ կլիներ։ Եթե ​​դուք կատարում եք քվեստ, ընտրեք գծի սակագները տուրբո.

Սերվերը DDoSa-ից պաշտպանելու համար մենք օգտագործեցինք Cloudflare:

Արժե ասել, որ VPS-ն ամեն ինչին պատվով է դիմացել։

Arduino-ն, որը պատասխանատու էր ռելեների կառավարման համար, հրամաններ էր ստանում թարգմանիչից և կատարում էր բուն աշխատանքը

Սա ավելի շուտ հաջորդ հոդվածի թեման է նախագծի ապարատային մասի մասին. հետնամասը պարզապես հարցումներ է ուղարկել կոնկրետ ռելե միացնելու համար: Այնպես եղավ, որ հետին պլանը գիտեր գրեթե բոլոր կազմակերպությունները, և նրանից ստացված հարցումները նման էին «միացնել այս կառույցը»: Մենք դա արեցինք կայքի վաղ փորձարկման համար (մենք դեռ չէինք հավաքել բոլոր Arduino-ն և ռելեները), վերջում մենք ամեն ինչ այդպես թողեցինք։

Դիմային մաս

Մենք արագ ստեղծեցինք կայքը tilde-ում, մեկ աշխատանքային օր տևեց և մեզ խնայեց 30 հազար մեր բյուջեն։

Սկզբում մենք մտածում էինք պարզապես արտահանել կայքը և ավելացնել այն տրամաբանությունը, որը բացակայում էր, բայց մենք հանդիպեցինք օգտագործման պայմաններին, որոնք մեզ արգելում էին դա անել:

Մենք պատրաստ չէինք խախտել լիցենզիան, ուստի կար երկու տարբերակ՝ ամեն ինչ ինքներս իրականացնել կամ ուղղակիորեն կապվել Թիլդայի հետ, խոսել նախագծի մասին և թույլտվություն խնդրել՝ փոխել կոդը։

Մենք ընտրեցինք երկրորդ տարբերակը, և նրանք ոչ միայն մեզ հանդիպեցին կես ճանապարհին, այլ նույնիսկ մեկ տարի անվճար բիզնես հաշիվ տվեցին, ինչի համար մենք շատ շնորհակալ ենք նրանցից։ Շատ անհարմար էր նրանց ցույց տալ Սոկոլի կայքի դիզայնը։

Արդյունքում, մենք կցեցինք js տրամաբանությունը հիմնական սարքերին հարցումներ ուղարկելու համար, և մի փոքր փոխեցինք խաղի տարրերը միացնելու և անջատելու կոճակների ոճերը:

Վեբ կայքի ձևավորում

Որոնումների պատմությունը, որն արժե առանձին գլուխ:

Մենք ցանկանում էինք ստեղծել ոչ թե պարզապես հնաոճ, այլ բացարձակապես զզվելի կայք, որը խախտում է դիզայնի բոլոր հիմնական կանոնները: Միևնույն ժամանակ, կարևոր էր պահպանել վստահելիությունը. այն պետք է չխախտեր ԼՕՌ պատմությունը, ցուցադրեր հեղինակի հավակնոտությունը, և խաղացողները պետք է հավատային, որ նման կայք կարող է գոյություն ունենալ և նույնիսկ հաճախորդներ բերել: Եվ նա բերեց այն: Մինչ խաղը շարունակվում էր, մեզ հետ երկու անգամ կապ հաստատեցին կայքեր ստեղծելու համար:

Սկզբում ես ինքս եմ արել դիզայնը՝ փորձելով ավելի շատ գիֆեր և փայլուն տարրեր ներառել։ Բայց իմ 10-ամյա դիզայներ ամուսինը նայեց իր ուսի վրայով և մերժեց դա որպես «չափազանց լավ»: Դիզայնի կանոնները խախտելու համար դուք պետք է իմանաք դրանք:

Ինչպես է ստեղծվել սերվերի ոչնչացման մասին հաքերային խաղի հետնամասը

Գոյություն ունեն մի քանի գունային համակցություններ, որոնք առաջացնում են զզվանքի մշտական ​​զգացողություն՝ կանաչ և կարմիր հավասար հարստությամբ, մոխրագույն և վարդագույն, կապույտ և շագանակագույն: Ի վերջո, մենք որոշեցինք կարմիրի և կանաչի համադրությունը որպես հիմնական գույներ, ավելացրինք կատուով գիֆեր և ֆոնդային լուսանկարից ընտրեցինք անձամբ Սոկոլովի 3-4 լուսանկար: Ես ընդամենը մի քանի պահանջ ունեի՝ միջին տարիքի տղամարդ, մի քանի չափսերի վատ կոստյում հագած և «պրոֆեսիոնալ ստուդիայի ֆոտոսեսիայի» կեցվածքով: Թեստի համար նրանք ցույց տվեցին այն ընկերներին և հարցրին՝ «ինչպե՞ս եք այն ձեզ դուր գալիս»:

Դիզայնի մշակման ընթացքում ամուսինս պետք է ամեն կես ժամը մեկ պառկի, ուղղաթիռը սկսեց թռչել։ Փաշան փորձեց բացել ծրագրավորողի վահանակը էկրանի մեծ մասում, մինչ նա ավարտեց ճակատի ավարտը, որպեսզի պաշտպանի իր աչքերը:

Իրական սարքեր

Օդափոխիչները և լույսերը տեղադրվել են պինդ վիճակի ռելեների միջոցով, որպեսզի նրանք անմիջապես չմիանան ամբողջ հզորությամբ, որպեսզի մոնիտորինգին զուգահեռ հզորությունը մեծանա:

Բայց այս մասին կխոսենք հաջորդ գրառման մեջ՝ խաղի ապարատային մասի և կայքի իրական կառուցման մասին։

Մնացեք մեզ հետ!

Այլ հոդվածներ սերվերը ոչնչացնելու որոնման մասին

Ինչպես է ստեղծվել սերվերի ոչնչացման մասին հաքերային խաղի հետնամասը

Source: www.habr.com

Добавить комментарий