.NET Core fuq LinuxDevOps qed jiżdied

Żviluppajna DevOps bl-aħjar mod li stajna. Konna 8 minna, u Vasya kien l-aktar wieħed cool. WindowsF'daqqa waħda Vasya telaq, u jien kelli l-kompitu li nniedi proġett ġdid li jipprovdi Windows-żvilupp. Meta tefgħet il-munzell kollu fuq il-mejda Windows-разработки, то понял, что ситуация — боль…

Hekk tibda l-istorja Alexandra Sinchinova fuq DevOpsConf. Когда из компании ушел ведущий специалист по Windows, Alexander ħaseb x'għandu jagħmel issa. Mur fuq Linux, конечно же! Александр расскажет, как ему удалось создать прецедент и перевести часть Windows разработки на Linux на примере реализованного проекта на 100 000 конечных пользователей.

.NET Core fuq LinuxDevOps qed jiżdied

Как легко и непринужденно доставлять проект в RPM, используя TFS, Puppet, Linux .NET core? Как поддерживать версионирование БД проекта, если разработка впервые слышит слова Postgres и Flyway, а дедлайн послезавтра? Как интегрировать с Docker? Как мотивировать .NET-разработчиков отказаться от Windows и смузи в пользу Puppet и Linux? Как решать идеологические конфликты, если обслуживать Windows в продакшн нет ни сил, ни желания, ни ресурсов? Об этом, а также о Web Deploy, тестировании, CI, о практиках использования TFS в существующих проектах, и, конечно, о сломанных костылях и работающих решениях, в расшифровке доклада Александра.

Play video

Итак, Вася ушел, задача на мне, девелоперы ждут с вилами с нетерпением. Когда я окончательно осознал, что Васю не вернуть — приступил к делу. Для начала оценил процент Win VM в нашем парке. Счёт был не в пользу Windows.

.NET Core fuq LinuxDevOps qed jiżdied

Так как мы активно развиваем DevOps, я понял, что нужно что-то менять в подходе выноса нового приложения. Решение было одно — по возможности перевести все на Linux. Google мне помог — на тот момент уже был портирован .Net под Linux, и я понял, что это решение!

Почему .NET core в связке с Linux?

На это было несколько причин. Между «платить деньги» и «не платить» большинство выберет второе — как и я. Лицензия на MSDB стоит около 1 000 $, обслуживание парка виртуальных машин Windows исчисляется сотнями долларов. Для большой компании это большие затраты. Поэтому tfaddil - l-ewwel raġuni. Mhux l-aktar importanti, iżda wieħed minn dawk sinifikanti.

Magni virtwali Windows занимают больше ресурсов, чем их братья из Linux - huma tqal. Учитывая масштаб большой компании мы выбрали Linux.

Is-sistema hija sempliċement integrata fis-CI eżistenti. Мы считаем себя прогрессивными DevOps’ами, используем Bamboo, Jenkins и GitLab CI, поэтому большая часть у нас крутится на Linux.

L-aħħar raġuni hija akkumpanjament konvenjenti. Нам нужно было снизить порог вхождения для «сопровожденцев» — ребят, которые понимают техническую часть, обеспечивают бесперебойность и обслуживают сервисы со второй линии. Они уже были знакомы со стеком Linux, поэтому им гораздо проще понять новый продукт, поддерживать и сопровождать, чем тратить дополнительные ресурсы, чтобы разобраться с аналогичным функционалом ПО для Windows pjattaformi.

Rekwiżiti

L-ewwel nett - konvenjenza tas-soluzzjoni l-ġdida għall-iżviluppaturi. Не все из них оказались готовы к переменам, особенно после произнесенного слова Linux. Разработчики хотят любимую Visual Studio, TFS c автотестами по сборкам и смузи. Как происходит доставка в продакшн — им не важно. Поэтому мы решили не менять привычный процесс и оставить для Windows-разработки всё без изменений.

Proġett ġdid meħtieġ jintegraw fis-CI eżistenti. Il-binarji kienu diġà hemm u x-xogħol kollu kellu jsir b'kont meħud tal-parametri tas-sistema ta 'ġestjoni tal-konfigurazzjoni, standards ta' konsenja aċċettati u sistemi ta 'monitoraġġ.

Faċilità ta 'appoġġ u tħaddim, bħala kundizzjoni għal-limitu minimu tad-dħul għall-parteċipanti ġodda kollha minn diviżjonijiet differenti u d-dipartiment ta 'appoġġ.

Skadenza - bieraħ.

Win Development Group

С чем тогда работала команда Windows?

.NET Core fuq LinuxDevOps qed jiżdied

Issa nista' ngħid hekk b'fiduċja IdentityServer4 hija alternattiva ħielsa friska għal ADFS b'kapaċitajiet simili, jew xiex Entity Framework Core - ġenna għal żviluppatur, fejn m'għandekx għalfejn tinkwieta tikteb skripts SQL, iżda tiddeskrivi mistoqsijiet fid-database f'termini OOP. Imma mbagħad, waqt id-diskussjoni tal-pjan ta 'azzjoni, ħarist lejn dan il-munzell bħallikieku kien cuneiform Sumerjan, għaraf biss PostgreSQL u Git.

Dak iż-żmien konna nużaw b'mod attiv Pupazz bħala sistema ta 'ġestjoni tal-konfigurazzjoni. Fil-biċċa l-kbira tal-proġetti tagħna użajna GitLab CI, Elastic, servizzi bbilanċjati ta 'tagħbija għolja bl-użu HAProxy immonitorjat kollox ma Zabbix, ligamenti grafana и Prometheus, Jaeger, u dan kollu kien qed idawwar fuq biċċiet tal-ħadid HPESXi fuq VMware. Kulħadd jafha - klassika tal-ġeneru.

.NET Core fuq LinuxDevOps qed jiżdied

Ejja nħarsu u nippruvaw nifhmu x’ġara qabel bdejna dawn l-interventi kollha.

X'ġara

TFS hija sistema pjuttost qawwija li mhux biss tagħti kodiċi mill-iżviluppatur sal-magna tal-produzzjoni finali, iżda għandha wkoll sett għal integrazzjoni flessibbli ħafna ma 'diversi servizzi - biex tipprovdi CI f'livell ta' cross-platform.

.NET Core fuq LinuxDevOps qed jiżdied
Раньше это были сплошные форточки. TFS использовал несколько Build-агентов, на которых собиралось множество проектов. В каждом агенте по 3-4 worker-a, чтобы распараллелить задачи и оптимизировать процесс. Дальше, согласно релизным планам, TFS доставлял свежеиспеченный Build на Windows-сервер приложений.

X’ridna niksbu?

Для доставки и разработки используем TFS, а запускаем приложение на Linux Application server, и между ними какая-то магия. Этот Kaxxa Magic u hemm il-melħ tax-xogħol quddiem. Qabel ma nneħħiha, nieħu pass fil-ġenb u ngħid ftit kliem dwar l-applikazzjoni.

Proġett

L-applikazzjoni tipprovdi funzjonalità għall-immaniġġjar ta 'kards imħallsa minn qabel.

.NET Core fuq LinuxDevOps qed jiżdied

klijent

Kien hemm żewġ tipi ta 'utenti. Ewwel kisbu aċċess billi illoggja billi tuża ċertifikat SSL SHA-2. U it-tieni kien hemm aċċess bl-użu ta 'login u password.

HAProxy

Imbagħad it-talba tal-klijent marret għand HAProxy, li solviet il-problemi li ġejjin:

  • awtorizzazzjoni primarja;
  • Terminazzjoni SSL;
  • irfinar tat-talbiet HTTP;
  • talbiet għal xandir.

Iċ-ċertifikat tal-klijent ġie vverifikat tul il-katina. Aħna - awtorità u nistgħu naffordjaw dan, peress li aħna stess noħorġu ċertifikati lill-klijenti tas-servizz.

Oqgħod attent għat-tielet punt, se nerġgħu lura għalih ftit aktar tard.

Backend

Бэкенд планировали сделать на Linux. Бэкенд взаимодействует с БД, подгружает необходимый список привилегий и потом, в зависимости от того, какими привилегиями обладает авторизовавшийся пользователь, предоставляет доступ для подписания финансовых документов и отправки их на исполнение, либо генерации какого-то отчета.

Iffrankar b'HAProxy

Minbarra ż-żewġ kuntesti li kull klijent innaviga, kien hemm ukoll kuntest ta 'identità. IdentityServer4 biss jippermettilek tidħol, dan huwa analogu b'xejn u qawwi għal ADFS - Servizzi tal-Federazzjoni tad-Direttorju Attiv.

It-talba għall-identità ġiet ipproċessata f'diversi passi. L-ewwel pass - klijent daħal fis-backend, li kkomunika ma' dan is-server u ċċekkja l-preżenza ta' token għall-klijent. Jekk ma nstabitx, it-talba ġiet ritornata lura għall-kuntest li minnu tkun ġiet, iżda b'redirect, u bir-redirect marret għall-identità.

It-tieni pass - it-talba waslet għall-paġna ta' awtorizzazzjoni f'IdentityServer, fejn il-klijent irreġistra, u dak it-token tant mistenni deher fid-database IdentityServer.

It-tielet pass - il-klijent ġie ridirett lura għall-kuntest li minnu ġie.

.NET Core fuq LinuxDevOps qed jiżdied

IdentityServer4 għandu karatteristika: jirritorna t-tweġiba għat-talba għar-ritorn permezz HTTP. Ma jimpurtax kemm tħabtu biex inwaqqfu s-server, irrispettivament minn kemm iddawwalna lilna nfusna bid-dokumentazzjoni, kull darba li rċevejna talba inizjali tal-klijent b'URL li wasal permezz ta 'HTTPS, u IdentityServer rritorna l-istess kuntest, iżda b'HTTP. Konna ixxukkjati! U ttrasferijna dan kollu permezz tal-kuntest tal-identità għal HAProxy, u fl-intestaturi kellna nimmodifikaw il-protokoll HTTP għal HTTPS.

X'inhu t-titjib u fejn iffrankajt?

Aħna ffrankajna l-flus billi użajna soluzzjoni b'xejn għall-awtorizzazzjoni ta 'grupp ta' utenti, riżorsi, peress li aħna ma poġġiex IdentityServer4 bħala node separat f'segment separat, iżda użajna flimkien mal-backend fuq l-istess server fejn jaħdem il-backend tal-applikazzjoni. .

Kif għandha taħdem

Итак, как я обещал — Magic Box. Мы уже понимаем, что гарантированно движемся в сторону Linux. Давайте сформулируем конкретные задачи, которые требовали решения.

.NET Core fuq LinuxDevOps qed jiżdied

Manifesti pupazzi. Biex iwasslu u jimmaniġġjaw is-servizz u l-konfigurazzjoni tal-applikazzjoni, kellhom jinkitbu riċetti friski. Roll ta 'lapes juri b'mod elokwenti kemm sar malajr u b'mod effiċjenti.

Metodu ta 'konsenja. Стандарт — это RPM. Все понимают, что в Linux без него никак, но сам проект после сборки представлял собой набор исполняемых DLL-файлов. Их было около 150, проект достаточно тяжелый. Единственное гармоничное решение — упаковать эту бинарщину в RPM и уже из нее разворачивать приложение.

Verżjoni. Нам предстояло релизиться очень часто, и нужно было решить, каким образом формировать имя пакета. Это вопрос уровня интеграции с TFS. Build-агент у нас был на Linux. Когда TFS отправляет задачу обработчику — worker — на Build-агент, он передает ему еще и банч переменных, которые попадают в environment процесса обработчика. В этих переменных окружения передается имя Build, имя версии и другие переменные. Подробнее об этом в с разделе «сборка RPM-пакета».

Twaqqif ta 'TFS сводилась к настройке Pipeline. Раньше мы собирали на Windows-агентах все Windows-проекты, а сейчас появляется Linux-агент — Build-агент, который нужно включить в группу сборки, обогатить какими-то артефактами, сказать, какого именно типа проекты будут собираться на этом Build-агенте, и как-то модифицировать Pipeline.

IdentityServer. L-ADFS mhux il-mod tagħna, sejrin għall-Open Source.

Ejja ngħaddu mill-komponenti.

Kaxxa Magic

Tikkonsisti f'erba' partijiet.

.NET Core fuq LinuxDevOps qed jiżdied

Linux Build-агент. Linux, потому что мы под него собираем — логично. Эта часть выполнялась в три шага.

  • Ikkonfigura l-ħaddiema u mhux waħdu, peress li kien mistenni xogħol imqassam fuq il-proġett.
  • Installa .NET Core 1.x. Għaliex 1.x meta 2.0 huwa diġà disponibbli fir-repożitorju standard? Minħabba li meta bdejna l-iżvilupp, il-verżjoni stabbli kienet 1.09, u ġie deċiż li l-proġett isir ibbażat fuqha.
  • Git 2.x.

RPM-repożitorju. RPM-пакеты нужно было где-то хранить. Предполагалось, что мы будем использовать тот же самый корпоративный RPM-репозиторий, который доступен всем Linux хостам. Так и поступили. На сервере репозитория настроен ganċ tal-web li niżżel il-pakkett RPM meħtieġ mill-post speċifikat. Il-verżjoni tal-pakkett ġiet irrappurtata lill-webhook mill-aġent Ibni.

GitLab. Внимание! GitLab здесь используется не разработчиками, а отделом эксплуатации для контроля версий приложения, версий пакетов, контроля состояния всех Linux-машин и в нём хранится рецептура — все манифесты Puppet.

Pupazz — issolvi l-kwistjonijiet kontroversjali kollha u tagħti eżattament il-konfigurazzjoni li rridu minn Gitlab.

Nibdew ngħaddu. Kif taħdem il-kunsinna DLL għal RPM?

Kunsinna DDL għal RPM

Ejja ngħidu li għandna rockstar tal-iżvilupp .NET. Juża Visual Studio u joħloq fergħa ta 'rilaxx. Wara dan, ittellah fuq Git, u Git hawnhekk hija entità TFS, jiġifieri, hija r-repożitorju tal-applikazzjoni li miegħu jaħdem l-iżviluppatur.

.NET Core fuq LinuxDevOps qed jiżdied

После чего TFS видит, что прилетел новый коммит. Какое приложение? В настройках TFS есть метка, какими ресурсами обладает тот или иной Build-агент. В данном случае он видит, что мы собираем .NET Core проект и выбирает Linux Build-агент из пула.

L-aġent Ibni jirċievi s-sorsi u jniżżel dak meħtieġ dipendenzi mir-repożitorju .NET, npm, eċċ. u wara li tibni l-applikazzjoni nnifisha u l-ippakkjar sussegwenti, tibgħat il-pakkett RPM lir-repożitorju RPM.

Min-naħa l-oħra, jiġri dan li ġej. L-inġinier tad-dipartiment tal-operazzjonijiet huwa involut direttament fit-tnedija tal-proġett: jibdel il-verżjonijiet tal-pakketti fil Hiera fir-repożitorju fejn tinħażen ir-riċetta tal-applikazzjoni, u wara Puppet triggers yum, iġib il-pakkett il-ġdid mir-repożitorju, u l-verżjoni l-ġdida tal-applikazzjoni hija lesta biex tintuża.

.NET Core fuq LinuxDevOps qed jiżdied

Kollox huwa sempliċi fi kliem, imma x'jiġri ġewwa l-aġent Ibni nnifsu?

Ippakkjar DLL RPM

Irċieva sorsi tal-proġett u kompitu tal-bini minn TFS. Aġent tal-bini jibda jibni l-proġett innifsu minn sorsi. Il-proġett immuntat huwa disponibbli bħala sett Fajls DLL, li huma ppakkjati f'arkivju zip biex inaqqsu t-tagħbija fuq is-sistema tal-fajls.

L-arkivju ZIP jintrema għad-direttorju tal-bini tal-pakkett RPM. Sussegwentement, l-iskrittura Bash jinizjalizza l-varjabbli tal-ambjent, isib il-verżjoni Ibni, il-verżjoni tal-proġett, it-triq għad-direttorju tal-bini, u jmexxi RPM-build. Ladarba l-bini tkun kompluta, il-pakkett jiġi ppubblikat fuq repożitorju lokali, li tinsab fuq l-aġent Ibni.

Sussegwentement, mill-aġent Ibni għas-server fir-repożitorju RPM It-talba JSON tintbagħat li jindika l-isem tal-verżjoni u l-bini. Webhook, li tkellimt dwaru qabel, iniżżel dan il-pakkett stess mir-repożitorju lokali fuq l-aġent Ibni u jagħmel l-assemblaġġ il-ġdid disponibbli għall-installazzjoni.

.NET Core fuq LinuxDevOps qed jiżdied

Почему именно такая схема доставки пакета в репозиторий RPM? Почему нельзя сразу отправить собранный пакет в репозиторий? Дело в том, что это условие для обеспечения безопасности. Такой сценарий ограничивает возможность несанкционированной загрузки RPM-пакетов посторонними людьми на сервер, который доступен всем Linux-машинам.

Verżjoni tad-database

На консилиуме с разработкой выяснилось, что ребятам ближе MS SQL, но в большинстве non-Windows проектов мы уже вовсю использовали PostgreSQL. Так как мы уже решили отказаться от всего платного, то стали использовать PostgreSQL и здесь.

.NET Core fuq LinuxDevOps qed jiżdied

F'din il-parti rrid ngħidlek kif verżjonijna d-database u kif għażilna bejn Flyway u Entity Framework Core. Ejja nħarsu lejn il-vantaġġi u l-iżvantaġġi tagħhom.

Cons

Flyway tmur triq waħda biss, aħna ma nistgħux irromblaw lura — это существенный минус. Сравнивать с Entity Framework Core можно по другим параметрам — с точки зрения удобства разработчика. Вы же помните, что мы это поставили во главу угла, и основным критерием было не изменить ничего для Windows-разработки.

Għal Flyway magħna kien hemm bżonn xi tip ta’ tgeżwirbiex il-guys ma jiktbux Mistoqsijiet SQL. Huma ħafna eqreb li joperaw f'termini OOP. Aħna ktibna struzzjonijiet biex naħdmu ma 'oġġetti tad-database, ġġenerajna mistoqsija SQL u eżegwijnaha. Il-verżjoni l-ġdida tad-database hija lesta, ittestjata - kollox tajjeb, kollox jaħdem.

Entity Framework Core għandha minus - taħt tagħbijiet tqal dan jibni mistoqsijiet SQL subottimali, u l-ġbid fid-database jista 'jkun sinifikanti. Imma peress li m'għandniex servizz ta 'tagħbija għolja, aħna ma nikkalkulawx it-tagħbija f'mijiet ta' RPS, aċċettajna dawn ir-riskji u ddelegajna l-problema lilna futur.

Pros

Entity Framework Core jaħdem barra mill-kaxxa u huwa faċli biex tiżviluppa, u Flyway Tintegra faċilment fis-CI eżistenti. Imma nagħmluha konvenjenti għall-iżviluppaturi :)

Proċedura ta' roll-up

Puppet jara li ġejja bidla fil-verżjoni tal-pakkett, inkluż dik li hija responsabbli għall-migrazzjoni. L-ewwel, tinstalla pakkett li fih skripts tal-migrazzjoni u funzjonalità relatata mad-database. Wara dan, l-applikazzjoni li taħdem mad-database terġa' tinbeda. Wara tiġi l-installazzjoni tal-komponenti li fadal. L-ordni li fiha l-pakketti huma installati u l-applikazzjonijiet huma mnedija hija deskritta fil-manifest Puppet.

L-applikazzjonijiet jużaw data sensittiva, bħal tokens, passwords tad-database, dan kollu jinġibed fil-konfigurazzjoni minn Puppet master, fejn jinħażnu f'forma kriptata.

problemi TFS

Wara li ddeċidejna u rrealizzajna li kollox kien qed jaħdem għalina, iddeċidejt li nħares lejn dak li kien għaddej bl-assemblaġġi fit-TFS kollu kemm hu għad-dipartiment tal-iżvilupp Win fuq proġetti oħra - kemm jekk konna qed nibnu/nirrilaxxaw malajr jew le, u skoprew problemi sinifikanti bil-veloċità.

Wieħed mill-proġetti ewlenin jieħu 12-15-il minuta biex jinġabar - dak huwa żmien twil, ma tistax tgħix hekk. Analiżi mgħaġġla wriet drawdown terribbli fl-I/O, u dan kien fuq arrays.

Wara li analizzatha komponent b'komponent, identifikajt tliet fokus. L-ewwel - "Kaspersky antivirus", который на всех Windows Build-агентах сканирует исходники. Второй — Windows Indiċier. Ma kienx diżattivat, u kollox kien indiċjat f'ħin reali fuq l-aġenti Ibni matul il-proċess ta 'skjerament.

It-tielet - Installa Npm. Irriżulta li fil-biċċa l-kbira tal-Pipelines użajna dan ix-xenarju eżatt. Għaliex hu ħażin? Il-proċedura ta 'installazzjoni Npm titħaddem meta s-siġra tad-dipendenza tiġi ffurmata package-lock.json, fejn jiġu rreġistrati l-verżjonijiet tal-pakketti li se jintużaw biex jinbena l-proġett. L-iżvantaġġ huwa li Npm install jiġbed l-aħħar verżjonijiet ta 'pakketti mill-Internet kull darba, u dan jieħu ħafna ħin fil-każ ta' proġett kbir.

L-iżviluppaturi kultant jesperimentaw fuq magna lokali biex jittestjaw kif taħdem parti partikolari jew proġett kollu. Xi drabi rriżulta li kollox kien frisk lokalment, iżda assemblawh, ħarġu, u xejn ma ħadem. Nibdew insemmu x'inhi l-problema - iva, verżjonijiet differenti ta 'pakketti b'dipendenzi.

deċiżjoni

  • Sorsi f'eċċezzjonijiet AV.
  • Iddiżattiva l-indiċjar.
  • Mur fuq npm ci.

Il-vantaġġi ta 'npm ci huma li aħna Niġbru s-siġra tad-dipendenza darba, u jkollna l-opportunità li nipprovdu lill-iżviluppatur lista attwali ta' pakketti, li biha jista’ jesperimenta lokalment kemm jħobb. Dan jiffranka l-ħin żviluppaturi li jiktbu kodiċi.

Konfigurazzjoni

Issa ftit dwar il-konfigurazzjoni tar-repożitorju. Storikament nużaw Nexus għall-ġestjoni ta' repożitorji, inkluż REPO Intern. Dan ir-repożitorju intern fih il-komponenti kollha li nużaw għal skopijiet interni, pereżempju, monitoraġġ awto-miktub.

.NET Core fuq LinuxDevOps qed jiżdied

Aħna nużaw ukoll NuGet, peress li għandu caching aħjar meta mqabbel ma 'maniġers ta' pakketti oħra.

Riżultat

Wara li ottimizzajna l-Aġenti tal-Bini, il-ħin medju tal-bini tnaqqas minn 12-il minuta għal 7.

Если посчитать все машины, которые мы могли бы использовать для Windows, но перевели на Linux в этом проекте, мы сэкономили порядка $10 000. И это только на лицензиях, а если учитывать содержание — больше.

Pjanijiet

Għat-trimestru li jmiss, ippjanajna li naħdmu fuq l-ottimizzazzjoni tal-kunsinna tal-kodiċi.

Taqleb għal immaġni ta' Docker li tinbena minn qabel. TFS hija ħaġa friska b'ħafna plugins li jippermettulek tintegra f'Pipeline, inkluż assemblaġġ ibbażat fuq il-grillu ta ', ngħidu aħna, immaġni Docker. Irridu nagħmlu dan il-grillu għall-istess wieħed package-lock.json. Jekk il-kompożizzjoni tal-komponenti użati biex jinbena l-proġett b'xi mod tinbidel, nibnu immaġni Docker ġdida. Aktar tard jintuża biex jintuża l-kontenitur bl-applikazzjoni immuntata. Dan mhux il-każ issa, iżda qed nippjanaw li naqilbu għal arkitettura ta 'mikroservizz f'Kubernetes, li qed tiżviluppa b'mod attiv fil-kumpanija tagħna u ilha sservi soluzzjonijiet ta' produzzjoni għal żmien twil.

Sommarju

Призываю всех выкинуть Windows, но это не потому, что я не умею ее готовить. Причина в том, что большая часть Opensource-решений — это Linux-стек. inti ok tiffranka r-riżorsi. На мой взгляд, будущее за решениями Open Source на Linux с мощным комьюнити.

Profil tal-ispeaker ta' Alexander Sinchinov fuq GitHub.

DevOps Conf hija konferenza dwar l-integrazzjoni ta 'proċessi ta' żvilupp, ittestjar u tħaddim għal professjonisti minn professjonisti. Huwa għalhekk li l-proġett li tkellem dwaru Alexander? implimentati u jaħdmu, u dakinhar tal-prestazzjoni kien hemm żewġ rilaxxi ta 'suċċess. Fuq DevOps Conf f'RIT++ Fis-27 u t-28 ta’ Mejju se jkun hemm saħansitra aktar każijiet simili minn prattikanti. Inti xorta tista 'tiżdied fl-aħħar ġarr u jissottometti rapport jew ħu l-ħin tiegħek tirriserva biljett. Iltaqa magħna fi Skolkovo!

Sors: www.habr.com

Ixtri hosting affidabbli għal siti bi protezzjoni DDoS, servers VPS VDS 🔥 Ixtri hosting ta' websajts affidabbli bi protezzjoni DDoS, servers VPS VDS | ProHoster