Prix ​​DevProject: Mon discours à DeveloperWeek 2019

Bonjour Ă  tous


Je m'appelle Dmitry Golev. Je suis le fondateur et directeur technique du groupe Veliov. Aujourd'hui, je vais parler du service qui a reçu le prix "Dev Project" de DeveloperWeek . À cette occasion, nous avons Ă©tĂ© invitĂ©s Ă  parler du projet de la scĂšne DevExec World , ci-dessous une version texte de mon discours.


logo ostr.io


Comme vous pouvez le deviner à partir du logo, nous nous concentrons sur le développement Web et JavaScript. L'objectif du service est de réduire le coût de maintenance des API, des sites Web, des applications Web progressives (PWA) et des solutions Web sur les serveurs Linux.


La plupart des projets Web commencent par un nom de domaine. Le nom de domaine a des enregistrements Whois et DNS, et comme l'Ăšre de HTTP / 2 est maintenant, la communication entre le serveur et le navigateur de l'utilisateur doit ĂȘtre cryptĂ©e et SSL est requis pour cela, ou plus correctement, un certificat TLS.


Nous surveillons en permanence l'intĂ©gritĂ© des donnĂ©es de nom de domaine (Whois, DNS, SSL / TLS) et surveillons la date d'expiration du certificat et du domaine. Les notifications de toutes les modifications des donnĂ©es et les dates d'expiration Ă  venir des domaines et des certificats peuvent ĂȘtre envoyĂ©es par SMS ou e-mails.


Nous pensons que ce service est un excellent moyen:


  1. détecter rapidement les accÚs et modifications non autorisés;
  2. éliminer les erreurs lors de la configuration d'un nom de domaine, du remplacement d'un certificat et de la mise à jour des enregistrements DNS.

Tableau de bord de domaine


Le panneau de contrĂŽle des noms de domaine ( ci-dessus ), un exemple de notifications de changements dans DNS, certificat SSL / TLS et Whois ( ci-dessous ):


Exemple de notifications de modifications dans DNS, certificat SSL / TLS et Whois


Les notifications peuvent ĂȘtre personnalisĂ©es par les membres de votre Ă©quipe en fonction de leur domaine de responsabilitĂ©:


Notifications personnalisées


Nous avons appelé ce service « protection de base des noms de domaine » et l'avons rendu gratuit pour tous les utilisateurs sur tous les plans tarifaires. Nous pensons que cela sauvera de nombreux utilisateurs de situations telles que:


  1. redirection du trafic;
  2. MitM;
  3. substitution de certificat;
  4. Détournement de DNS;
  5. vol d'un nom de domaine et autres situations trÚs désagréables.

Nous rĂ©solvons le problĂšme du propriĂ©taire d'un nom de domaine lorsqu'il n'est pas possible de contrĂŽler les enregistrements, car cela doit ĂȘtre fait trĂšs souvent, y compris la nuit - c'est tout simplement une tĂąche impossible pour une personne.


Puis-je faire confiance aux services oĂč le nom de domaine a Ă©tĂ© achetĂ©? Dans la plupart des cas, les services DNS n'ont pas de notifications de modifications apportĂ©es aux enregistrements, et la seule notification des bureaux d'enregistrement concernant l'expiration d'un nom de domaine peut simplement tomber dans le spam et passer inaperçue. Un rare Ă©diteur et distributeur de certificats SSL / TLS envoie des notifications sur la nĂ©cessitĂ© de réémettre le certificat, nous sommes donc arrivĂ©s Ă  la conclusion que les enregistrements et le certificat doivent ĂȘtre vĂ©rifiĂ©s souvent et automatiquement. Au dĂ©part, il s'agissait d'un service interne dĂ©sormais accessible Ă  tous .




Pré-rendu


Pré-rendu (pré-rendu)


Le produit de service le plus populaire est le prĂ©-rendu . Si vous avez dĂ©jĂ  eu la chance d'Ă©crire des applications Web dans Angular, React, Vue, Blaze ou toute autre bibliothĂšque "client", vous remarquerez peut-ĂȘtre Ă  quel point la rĂ©ponse du serveur est diffĂ©rente des pages dont le code HTML est gĂ©nĂ©rĂ© sur le serveur. Les applications Web basĂ©es sur des bibliothĂšques "clientes" ont le minimum de balisage HTML nĂ©cessaire, sans donnĂ©es ni modĂšles.


Pack client


Les applications Web modernes extraient dynamiquement ou " progressivement " le code, les modĂšles et leurs donnĂ©es en plusieurs parties du serveur. Ce qui sera chargĂ© Ă  partir du serveur est dĂ©cidĂ© par le "client" lui-mĂȘme ( navigateur, appareil ), en fonction des actions de l'utilisateur, de la page ouverte ( "route", route ) et des besoins fonctionnels. Aujourd'hui, nous appelons ces applications la Progressive Web App (PWA).


Avantages et inconvénients de PWA


Comme vous pouvez le voir sur cette diapositive, les PWA ont de nombreux avantages et un gros inconvénient - le manque absolu d'optimisation SEO.


Bien que la formation de pages HTML sur le serveur ne soit pas une condition prĂ©alable pour travailler dans le navigateur de l'utilisateur, les soi-disant araignĂ©es et bots (robots, araignĂ©es et bots) n'exĂ©cutent pas le JavaScript de la page visitĂ©e. Pour que votre site apparaisse dans les rĂ©sultats de recherche (Google, Bing, Yandex, etc.), les messageries instantanĂ©es, les rĂ©seaux sociaux (Skype, Facebook, Twitter, iMessage, vk.com, etc.) et dans la plupart des applications et services, oĂč vous pouvez envoyer ou publier un lien - vous devez trouver un moyen de transfĂ©rer le code HTML gĂ©nĂ©rĂ© rĂ©sultant de l'exĂ©cution de JavaScript "client".


Intégrez le pré-rendu en moins d'une heure


Si vous ĂȘtes maintenant confrontĂ© Ă  la question «Comment fournir le rĂ©fĂ©rencement d'une application basĂ©e sur une solution JavaScript cĂŽtĂ© client?», Vous avez deux façons: implĂ©menter / intĂ©grer « Server Side Rendering / SSR » en investissant plus de temps et de ressources dans le dĂ©veloppement ou utiliser un service de prĂ©-rendu tiers.


Le pré-rendu est comme un SSR, sans écrire de code


Comment ça marche? En tant que proxy, nous filtrons les demandes provenant de robots et les redirigeons vers le moteur de prĂ©-rendu, oĂč la page sera demandĂ©e et son JavaScript exĂ©cutĂ© comme il aurait Ă©tĂ© exĂ©cutĂ© dans le navigateur de l'utilisateur.


Comment fonctionne le pré-rendu?


Résultats de l'application web avec pré-rendu:


Pré-rendu dans le messager
Aperçu des liens dans le messager


Pré-rendu dans les réseaux sociaux
Aperçu des liens sur les réseaux sociaux


Pré-rendu des moteurs de recherche
Aperçu, description, métadonnées et liens annexes dans les résultats des moteurs de recherche


Prise en charge ES6 / 7
Nous sommes les premiers Ă  introduire le support ECMAScript 6/7.


Vous pouvez en savoir plus sur le pré-rendu sur prerendering.com




Surveillance des API, des sites et des serveurs


Suivi


Le deuxiĂšme produit le plus populaire du service est la surveillance des applications Web, des API et des serveurs Linux via le protocole SNMP.
Un service de surveillance tiers est une excellente solution, car vous et votre équipe n'avez pas besoin d'installer, de mettre à jour, de maintenir, d'investir des ressources et du temps dans le développement et "l'achÚvement" de la surveillance.


Chronologie de la réponse du serveur


Afin de vous assurer que votre application Web fonctionne et est accessible aux utilisateurs, nous vĂ©rifions le code de rĂ©ponse, les en-tĂȘtes, le corps de la rĂ©ponse et la rapiditĂ© avec laquelle la rĂ©ponse a Ă©tĂ© reçue.


Surveillance de Nginx


Ce qui prĂ©cĂšde est un exemple de surveillance d'un point de terminaison avec des donnĂ©es gĂ©nĂ©rĂ©es dynamiquement, tout ce dont vous avez besoin est de renvoyer XML, JSON ou simplement Number, et vous pouvez Ă©galement configurer des notifications mĂȘme si les valeurs sont trop Ă©levĂ©es, faibles ou ne rĂ©pondent pas Ă  vos critĂšres.


Panneau SNMP


Ci-dessus est un exemple de surveillance d'un serveur Linux via le protocole SNMP. SNMP est une norme de l'industrie pour la lecture des donnĂ©es de divers capteurs matĂ©riels et du systĂšme d'exploitation, y compris les serveurs Linux, qui sont utilisĂ©s pour servir des applications Web modernes. Pour empĂȘcher tout accĂšs non autorisĂ© Ă  vos serveurs, le service vous informera de chaque connexion SSH nouvellement Ă©tablie.


Notifications de connexion SSH


En savoir plus sur le service de surveillance sur snmp-monitoring.com .




Web Analytics


Web Analytics


Le troisiĂšme produit de service le plus populaire est Web Analytics . Une fois que nous avons travaillĂ© sur une application avec beaucoup d'animation, nos concepteurs ont pris beaucoup de temps pour rendre l'animation fluide. Tout allait bien et nous avons terminĂ© la tĂąche, fournissant une animation acceptable sur tous les appareils et navigateurs populaires. Plus tard, le client a dĂ©fini une petite tĂąche - pour ajouter le code d'analyse. Il s'agissait de l'une des solutions les plus utilisĂ©es pour collecter de nombreuses donnĂ©es sur l'utilisateur, notamment la position du curseur et le dĂ©filement de la page pour compiler une carte thermique de la page. Étant donnĂ© que JavaScript a un environnement d'exĂ©cution monothread (les travailleurs Web et les travailleurs des services ne comptent pas) et que l'analyse a pris une part importante des ressources CPU pour suivre toutes les actions des utilisateurs, cela a ruinĂ© tout notre travail visant Ă  une animation fluide sur le budget et les appareils mobiles. Nous avons donc eu l'idĂ©e et la premiĂšre mise en Ɠuvre d'une analyse Web facile Ă  comprendre, en temps rĂ©el, confidentielle et conforme au RGPD avec 100% open source et une procĂ©dure de non-suivi simple pour l'utilisateur final.


Collectez et signalez toutes les erreurs JavaScript


L'une des principales caractĂ©ristiques de l'analyse Web est la collecte et l'organisation automatiques d'un rapport sur toutes les erreurs d' exĂ©cution JavaScript ( erreurs d'exĂ©cution et exceptions ) en temps rĂ©el. Si vous ĂȘtes engagĂ© dans le dĂ©veloppement Web, vous savez combien il est important de tester diverses combinaisons d'appareils et de navigateurs dans diffĂ©rentes versions, mais couvrir 100% des combinaisons est tout simplement physiquement impossible. En ce moment mĂȘme, vos utilisateurs sont les propriĂ©taires des appareils sur lesquels il est nĂ©cessaire d'effectuer des tests. Web Analytics collecte automatiquement toutes les erreurs et exceptions ( erreurs, exceptions d'exĂ©cution ) du runtime JavaScript. Chaque rapport d'erreur est accompagnĂ© d'une description, d'un fichier, d'une ligne et d'un symbole dans le fichier, de la trace de la pile (le cas Ă©chĂ©ant), de l'appareil, du navigateur, du systĂšme d'exploitation et de leurs versions.


Web analytics compatible avec vue.js react.js meteor.js angular.js et autres solutions frontales javascript


Une liste complĂšte des produits disponibles et des informations plus dĂ©taillĂ©es sont disponibles sur ostr.io. Tous les nouveaux comptes reçoivent une offre ponctuelle de «prĂȘts» ( free-tier ), ce qui permet de mettre en place gratuitement des services d'intĂ©gration et de test.




L'infrastructure


L'infrastructure


La partie la plus intĂ©ressante est l'infrastructure de service. Actuellement, dix-sept serveurs sont nĂ©cessaires pour couvrir les besoins du service. Tous les produits et leurs unitĂ©s sont implĂ©mentĂ©s en tant que microservices et chaque microservice est hĂ©bergĂ© sur un serveur physique. Tous les serveurs sont des copies identiques les uns des autres. Avant chaque dĂ©ploiement et modifications sur le serveur de test, la procĂ©dure entiĂšre est triĂ©e par Ă©tapes et exĂ©cutĂ©e dans un script bash, puis le script est envoyĂ© Ă  GitHub, d'oĂč il sera reçu et lancĂ© par d'autres serveurs. Chaque serveur contient une copie du code d'application, des microservices, Nginx et MongoDB ( grĂące aux rĂ©pliques ), ce schĂ©ma nous permet de rĂ©sister aux attaques, survivre aux tests infructueux et donne le temps de rĂ©soudre le problĂšme. Le service sera accessible aux utilisateurs mĂȘme en cas de chute Ă  93% de l'infrastructure, ce qui, bien sĂ»r, peut affecter la vitesse de rĂ©ponse, mais lui permet d'ĂȘtre dans le cadre du SLA.


Pour répartir uniformément la charge entre tous les serveurs, nous utilisons deux niveaux d'équilibrage DNS à tour de rÎle ( dans notre cas, CloudFlare ) et nos propres serveurs, sur lesquels HAProxy est installé .




package josk NPM


Josk


Comme vous pouvez le voir dans la description ci-dessus, nous avons de nombreux événements récurrents, par exemple, pour surveiller les serveurs, les API, le Whois, le DNS et d'autres points de terminaison, nous devons leur envoyer une demande réguliÚrement et sans interruption. Afin d'assurer la continuité des tùches périodiques, nous avons construit notre réseau décentralisé de nombreux serveurs, nous savons donc toujours qu'il existe un serveur gratuit pour effectuer les tùches. DÚs que les demandes dépassent les capacités actuelles, nous pouvons facilement ajouter le nombre nécessaire de nouveaux serveurs, grùce au schéma décrit ci-dessus, pour la simplicité de la mise à l'échelle horizontale.


Au dĂ©but, les capacitĂ©s de nos serveurs ont largement dĂ©passĂ© les besoins actuels, nous nous sommes donc retrouvĂ©s dans une situation oĂč deux serveurs gratuits ou plus effectuaient la mĂȘme tĂąche en parallĂšle. Cela menaçait considĂ©rablement le dĂ©veloppement, car le service pouvait envoyer de nombreuses lettres identiques Ă  un utilisateur ou envoyer des dizaines de requĂȘtes DNS Ă  partir de nos adresses IP, ce qui menaçait d'une interdiction.


Pour rĂ©soudre rapidement ce problĂšme, nous avons mis au point un dĂ©synchroniseur de tĂąches, qui garantissait Ă  95% que la tĂąche dans la file d'attente sera exĂ©cutĂ©e une fois et dans une unitĂ© de temps. Plus tard, nous avons publiĂ© le code de dĂ©synchronisation en tant que package NPM et nommĂ© josk . Si vous ĂȘtes intĂ©ressĂ© Ă  regarder sous le capot, voici un lien vers GitHub .




package NPM de messagerie


mail-time


La mĂȘme raison nous a amenĂ©s Ă  crĂ©er mail-time qui vous permet d'envoyer des lettres Ă  partir d'une infrastructure multiserveur. Le package est Ă©crit sur la base de josk , organise les lettres dans une file d'attente et les envoie depuis une infrastructure multiserveur. En plus de l'envoi, mail-time vous permet de diviser les microservices en:


  1. "clients" ( client ), qui n'ajoutent que des lettres Ă  la file d'attente;
  2. "serveur" ( server ), qui crée un microservice indépendant pour effectuer seulement deux tùches - gérer la file d'attente des lettres et leur distribution.

Ce n'est pas la seule caractéristique unique de la bibliothÚque, pour plus de détails et une description plus détaillée de toutes les fonctionnalités, lisez la documentation .


Malheureusement, pour le moment, les deux packages ( josk et mail-time ) nĂ©cessitent MongoDB comme base de donnĂ©es (DB) pour la file d'attente et la dĂ©synchronisation. Nous sommes prĂȘts Ă  dĂ©velopper les deux bibliothĂšques et nous discuterons avec plaisir et adopterons PR pour ajouter la prise en charge d'autres bases de donnĂ©es. De notre cĂŽtĂ©, Redis se prĂ©sente comme un excellent candidat Ă  l'intĂ©gration.


Merci beaucoup Ă  tous ceux qui ont lu jusqu'Ă  la fin. Si vous Ă©tiez intĂ©ressĂ©, posez des questions et Ă©crivez dans le LAN et s'il y a de l'intĂ©rĂȘt des lecteurs, je suis prĂȘt Ă  parler de l'expĂ©rience de participer et de parler Ă  d'autres Ă©vĂ©nements sur le dĂ©veloppement web, node.js et JavaScript.


Toute personne intéressée à en savoir plus sur ostr.io, à utiliser le service, à obtenir un code promotionnel, une remise ou des réponses aux questions - écrivez-moi sur le PM ou les réseaux sociaux. Le support ostr.io ne parle que l'anglais, mais répond trÚs rapidement, par exemple via le messager FB .

Source: https://habr.com/ru/post/fr443114/


All Articles