Pile technologique ennuyeuse d'une entreprise Internet unipersonnelle


Résultats de recherche sur ListenNotes.com

Listen Notes est un moteur de recherche et une base de données de podcasts. La technologie est en fait très ennuyeuse. Pas d'IA, d'apprentissage en profondeur ou de blockchain. "Si vous devez annoncer la mise en œuvre de l'IA, alors vous n'utilisez pas Real AI" :)

Après avoir lu cet article, vous pouvez répéter mon projet ou faire facilement quelque chose de similaire. Vous n'aurez pas à embaucher beaucoup de développeurs. Rappelez-vous, lorsque Instagram a collecté 57,5 ​​millions de dollars et est allé sur Facebook pour 1 milliard de dollars , ils n'avaient que 13 employés - et ce ne sont pas seulement des développeurs. L'achat d'Instagram a eu lieu début 2012. C'est maintenant l'année 2019, et aujourd'hui plus que jamais, il est facile de créer quelque chose de significatif avec une petite équipe d'ingénieurs - même à partir d'une seule personne.

Si vous n'avez pas vu Listen Notes, essayez-le maintenant:



Revue


Commençons par les exigences ou les caractéristiques du projet.

Listen Notes propose deux fonctions:

  • Site Web pour les auditeurs de podcasts. Voici un moteur de recherche, une base de données de podcasts, des listes de lecture pour une écoute ultérieure , des clips enregistrés extraits de podcasts et des notifications lorsque le mot-clé spécifié est mentionné dans un nouveau podcast sur Internet.
  • Recherchez des podcasts et des API pour les développeurs. Nous devons suivre l'utilisation de l'API, recevoir de l'argent des abonnés, fournir un support client et bien plus encore.

Tout fonctionne sur AWS, seulement 20 serveurs en production (au 5 mai 2019):


Serveurs exécutant Listen Notes

Par nom d'hôte, vous pouvez facilement deviner ce que fait chaque serveur.

  • production-web sert le trafic Web pour ListenNotes.com.
  • production-api sert l'API de trafic. Nous prenons en charge deux versions de l'API (à compter du 4 mai 2019): v1api (obsolète) et v2api (nouveau)
  • production-db lance PostgreSQL (maître et esclave)
  • production-es lance le cluster Elasticsearch.
  • production-worker lance des tâches de traitement autonomes pour toujours garder la base de données des podcasts à jour et fournir des fonctionnalités magiques (par exemple, classement des résultats de recherche, recommandations d'épisodes / podcasts, etc.).
  • production-lb est un équilibreur de charge. Pour plus de commodité, j'exécute également Redis et RabbitMQ sur ce serveur. Je sais que ce n'est pas parfait. Mais je ne suis pas la personne parfaite. :)
  • production-pangu est un serveur de production sur lequel j'exécute parfois des scripts uniques et teste les modifications. Qu'est-ce qu'un pangu ?

La plupart des serveurs peuvent être mis à l'échelle horizontalement. C'est pourquoi je les appelle production-quelque chose1 , production-quelque chose2 , etc. ... Il est très facile d'ajouter production-quelque chose3 et production-quelque chose4 au cluster .

Backend


L'ensemble du backend est écrit en Django / Python3. Le système d'exploitation est Ubuntu.

UWSGI est utilisé pour servir le trafic Web. J'ai installé nginx avant les processus uWSGI, il fonctionne également comme un équilibreur de charge.

Le principal entrepôt de données est PostgreSQL , avec lequel j'ai une vaste expérience dans le développement et l'exploitation depuis de nombreuses années. Grâce à une technologie éprouvée, vous dormez paisiblement la nuit. Redis est utilisé à diverses fins (par exemple, la mise en cache, les statistiques ...). Il est facile de deviner qu'Elasticsearch est utilisé quelque part . Oui, je l'utilise pour indexer des podcasts et servir des requêtes de recherche, comme la plupart des entreprises ennuyeuses .

Celery est utilisé pour le traitement hors ligne, tandis que Celery Beat est destiné à la planification de tâches similaires aux tâches Cron, mais un peu plus agréables. Si à l'avenir les notes d'écoute deviennent populaires et que le céleri et le beat causent des problèmes de mise à l'échelle, je passerai probablement à deux projets que j'ai faits pour l'employeur précédent: ndkale et ndscheduler .

Supervisord gère les processus sur chaque serveur.

Attendez, qu'en est-il de Docker, Kubernetes et de l'architecture sans serveur? Rien de tel. Avec l'expérience, vous apprenez à ne pas en faire trop. En fait, j'ai travaillé un peu avec Docker en 2014 à un emploi précédent: ce qui était bon pour une startup moyenne d'un milliard de dollars semble inutile pour une petite entreprise individuelle.

Frontend


L'interface Web est principalement construite à l'aide de React + Redux + Webpack + ES . Assez standard de nos jours. Lorsqu'ils sont déployés dans un environnement de production, les packages JS sont téléchargés sur Amazon S3 et émis via CloudFront .

Sur ListenNotes.com, la plupart des pages Web sont à moitié rendues côté serveur ( modèle Django ) et à moitié côté client ( React ). Le modèle de page Web provient du serveur et, côté client, l'application Web interactive est principalement rendue. Mais plusieurs pages Web sont entièrement préparées sur le serveur en raison de ma paresse et de certains avantages potentiels du référencement.

Lecteur audio


J'utilise une version hautement modifiée de react-media-player . Il fonctionne sur le site Web en tant que lecteur intégré sur Twitter et en tant que lecteur intégré sur des sites tiers:


Lecteur intégré sur des sites tiers

API


Nous fournissons aux développeurs une API de podcast simple et robuste. La construction d'une API est similaire à la construction d'un site Web. Voici la même pile Django / Python pour le backend et ReactJS pour l'interface (ex: barre d'outils API, documentation ...).


Barre d'outils de l'API Listen


Écouter la documentation de l'API

Pour l'API, nous devons suivre le nombre de demandes que le client utilise dans le cycle de facturation en cours et facturer des frais. Il est facile d'imaginer que Redis est activement utilisé ici :)

Devops


Préparation de la machine et déploiement du code


Ansible est utilisé pour l'approvisionnement. Essentiellement, j'ai écrit un tas de fichiers yaml pour indiquer quels fichiers de configuration et quels logiciels devraient être sur chaque type de serveur. Je peux déployer un serveur avec tous les fichiers de configuration corrects et tous les logiciels installés en cliquant sur un bouton. Voici la structure des répertoires de ces fichiers yaml Ansible:


Je pourrais mieux nommer les répertoires. Mais là encore, ça suffit maintenant

Ansible permet également de déployer du code en production. Fondamentalement, j'ai un script wrapper deploy.sh qui fonctionne sur macOS:

  ./deploy.sh production HEAD web 

Ce script prend trois arguments:

  • Environnement : production ou mise en scène.
  • La version du référentiel listennotes : HEAD signifie "déployer simplement la dernière version". Si la validation SHA est spécifiée, elle déploiera une certaine version du code - cela est particulièrement utile lorsque j'ai besoin de revenir en arrière après un mauvais déploiement.
  • Type de serveurs : web, travailleur, API ou tous. Je n'ai pas besoin de déployer sur tous les serveurs à la fois. Parfois, j'apporte des modifications au code Javascript, puis je dois le déployer uniquement sur le Web, sans toucher à l'API ni aux travailleurs.

Le processus de déploiement est principalement organisé par des fichiers yaml Ansible, et, bien sûr, est extrêmement simple:

  • Sur mon Macbook Pro , s'il s'agit d'un déploiement pour les serveurs Web, les packages Javascript sont créés et téléchargés sur S3.
  • Sur les serveurs cibles, git clone le référentiel listennotes dans un dossier appelé horodatage, recherche une version spécifique et installe les nouvelles dépendances Python, le cas échéant.
  • Sur les serveurs cibles, un lien symbolique pointe vers le dossier susmentionné appelé horodatage, puis nous redémarrons les serveurs à l'aide de supervisorctl.

Comme vous pouvez le voir, je n'utilise pas ces outils CI sophistiqués. Seuls les outils les plus simples et les plus fiables qui fonctionnent vraiment.

Surveillance et alertes


La surveillance et les alertes sont effectuées par Datadog . Un tableau de bord simple affiche des mesures de haut niveau. Tout ici est conçu pour augmenter ma confiance lorsque je m'occupe de serveurs en production.


Tableau de bord Datadog pour Listen Notes, en décembre 2017

Datadog est connecté à PagerDuty. En cas de problème, PagerDuty m'enverra une notification par téléphone et SMS.

J'utilise également Rollbar pour suivre l'état du code Django et détecter les exceptions inattendues, en m'informant par e-mail et Slack.

Slack est très actif. Oui, c'est une entreprise avec une seule personne, donc ce n'est pas nécessaire pour la communication, mais pour suivre des événements intéressants au niveau de l'application. En plus d'intégrer Datadog et Rollbar avec Slack, le code Web backend Slack intègre également les hooks Web entrants Slack pour vous informer de l'enregistrement des utilisateurs ou de certaines actions intéressantes (par exemple, ajouter ou supprimer des éléments). Il s'agit d'une pratique très courante dans les entreprises technologiques. Si vous lisez des livres sur les premières années d'Amazon ou de PayPal, vous découvrirez que les deux sociétés avaient un mécanisme de notification similaire: chaque fois qu'un utilisateur s'inscrivait, il y avait un son «ding» pour informer tout le monde au bureau.

Depuis son lancement début 2017, Listen Notes n'a pas connu de temps d'arrêt grave (plus de 5 minutes), à l'exception de cela . Je suis toujours très prudent et pratique dans le travail DevOps. Pour les serveurs, une surcharge importante est fournie en cas de forte augmentation de la fréquentation due à la presse ou à autre chose.

Développement


Je travaille pour WeWork à San Francisco. Certains peuvent demander, pourquoi ne pas simplement travailler à domicile ou dans des cafés décontractés. Eh bien, j'apprécie vraiment la productivité et je suis prêt à y investir de l'argent. Je ne crois pas qu'un mess à la maison contribue au développement de logiciels (ou à tout travail dans le domaine de la connaissance / créativité). Je travaille rarement plus de 8 heures par jour (désolé 996 personnes ). Je veux que chaque minute compte. Ainsi, j'ai besoin d'un bureau privé bon et relativement cher. Au lieu d'économiser de l'argent au détriment du temps, j'optimise le temps pour l'utiliser de manière rentable et gagner de l'argent.


Mon bureau chez WeWork

Je travaille sur un MacBook Pro. Une infrastructure presque identique fonctionne à l'intérieur de Vagrant + VirtualBox . Pour l'environnement de développement, Vagrant utilise le même ensemble de fichiers yaml Ansible que décrit ci-dessus.

Je soutiens la philosophie d'un référentiel monolithique . Ainsi, il existe un et un seul référentiel listennotes avec des scripts DevOps, du code frontal et principal. Il est hébergé en tant que référentiel privé sur GitHub. Tout développement est dans la branche principale. J'utilise rarement des brunchs.

J'écris du code et j'exécute des serveurs de développement (Django runserver et webpack dev server) en utilisant PyCharm . Oui, je sais, c'est ennuyeux. Après tout, ce n'est pas du Visual Studio Code ou Atom ou une sorte d'IDE sympa. Mais pour moi, PyCharm fonctionne très bien. Old school, que pouvez-vous faire.


Mon pycharm

Divers


Il existe des tonnes d'outils et de services utiles que j'utilise pour créer des notes d'écoute en tant que produit et entreprise:

  • iTerm2 et tmux comme terminaux.
  • Notion de listes TODO, wikis, notes, notes de conception ...
  • G Suite pour @ listennotes.com, messagerie, calendrier et autres services Google.
  • MailChimp pour l' envoi mensuel .
  • Amazon SES pour les entreprises et certaines newsletters marketing.
  • Gusto pour vous payer ainsi que certains entrepreneurs s'ils ne sont pas avec Upwork.
  • Upwork pour trouver des entrepreneurs.
  • Google Ads Manager pour la gestion des annonces et le suivi des performances.
  • Carbon Ads et BuySellAds pour les annonces de sauvegarde.
  • Cloudflare pour gérer DNS, CDN et pare-feu.
  • Zapier et Trello pour rationaliser les flux de travail dans la section d' entrevue de podcast .
  • Moyen pour le blog d'entreprise.
  • Godaddy et Namecheap pour les noms de domaine.
  • Stripe pour recevoir de l'argent des utilisateurs (principalement pour l' API ).
  • API de synthèse vocale Google pour le décodage des podcasts.
  • Kaiser Permanente pour l'assurance maladie.
  • Stripe Atlas pour l'enregistrement légal Listen Notes, Inc.
  • Clerky : générer des documents juridiques pour les investisseurs en capital-risque (SAFE) et embaucher des entrepreneurs s'ils ne sont pas avec Upwork.
  • Quickbooks pour la comptabilité.
  • 1 mot de passe pour gérer les mots de passe dans un tas de services
  • Brex en tant que carte de paiement - vous pouvez obtenir des crédits AWS supplémentaires de 5 000 $ en les utilisant en plus des crédits AWS de WeWork ou Stripe Atlas.
  • Bonvoy Business Amex Card - vous pouvez accumuler des points Marriott Bonvoy sur des hôtels et des vols de luxe. C'est le meilleur programme de bonus voyage /
  • Capital One Spark pour votre compte bancaire actuel.

Restez calme et ne vous branlez pas ...


Comme vous pouvez le voir, nous vivons un moment idéal pour lancer notre entreprise. Il existe de nombreux outils et services prêts à l'emploi qui permettent d'économiser du temps et de l'argent et d'augmenter votre productivité. C'est maintenant le meilleur moment de l'histoire pour créer quelque chose d'utile pour l'humanité avec une petite équipe (ou seulement avec les efforts d'une seule personne), en utilisant des technologies simples et ennuyeuses.

Au fil du temps, les entreprises deviennent de plus en plus petites. Plus besoin d'embaucher des tonnes d'employés à temps plein. Pour faire tout le travail, vous pouvez utiliser les services SaaS et les entrepreneurs pour passer commande.

Fondamentalement, le principal obstacle à la création d'un projet est une réflexion excessive. Et si ça, et si ça. Mec, personne n'a besoin de toi. Chacun est occupé par ses propres affaires. Personne ne s'intéresse à vous et à votre projet tant que vous ne prouvez pas que vous êtes digne d'attention. Même si vous verrouillez le lancement, personne ne le remarquera. Pensez grand, commencez petit, agissez rapidement. Il est tout à fait normal d'utiliser une technologie ennuyeuse et de commencer avec quelque chose de simple (même laid) si vous résolvez vraiment le problème.


Maintenant, il y a tellement de gens avec un culte du cargo . Ignorez le bruit. Restez calme et ne vous branlez pas.

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


All Articles