Хабрахабр

[Перевод] Скучный технологический стек интернет-компании из одного человека


Поисковая выдача на ListenNotes.com

Технология на самом деле очень скучная. Listen Notes — это поисковая система и база данных подкастов. «Если вы должны объявлять о внедрении ИИ, то вы не используете Настоящий ИИ» 🙂 Никакого ИИ, глубокого обучения или блокчейна.

Не придётся нанимать много разработчиков. После прочтения этой статьи вы сможете повторить мой проект или легко сделать нечто подобное. Покупка Instagram произошла в начале 2012-го. Помните, когда Instagram привлёк $57,5 млн и отошёл к Facebook за $1 млрд, у них было всего 13 сотрудников — и это не только разработчики. Сейчас 2019 год, и сегодня как никогда просто создать что-то значимое с крошечной инженерной командой — даже из одного человека.
Если вы ещё не видели Listen Notes, попробуйте прямо сейчас:

Начнём с требований или особенностей проекта.

Listen Notes предоставляет две функции:

Всё работает на AWS, всего 20 серверов в продакшне (на 5 мая 2019 года):


Серверы, на которых работает Listen Notes

По имени хоста можно легко догадаться, что делает каждый сервер.

  • production-web обслуживает веб-трафик для ListenNotes.com.
  • production-api обслуживает трафик API. Мы поддерживаем две версии API (по состоянию на 4 мая 2019 года): v1api (устаревшая) и v2api (новая)
  • production-db запускает PostgreSQL (master и slave)
  • production-es запускает кластер Elasticsearch.
  • production-worker запускает автономные задачи обработки, чтобы всегда поддерживать базу данных подкастов в актуальном состоянии и предоставлять некоторые волшебные функции (например, ранжирование результатов поиска, рекомендации по эпизодам/подкастам и т.д.).
  • production-lb — балансировщик нагрузки. Для удобства я также запускаю на этом сервере Redis и RabbitMQ. Знаю, что это не идеально. Но я не идеальный человек. 🙂
  • production-pangu — производственный сервер, на котором я иногда запускаю одноразовые скрипты и тестирую изменения. Что такое паньгу?

Большинство серверов можно горизонтально масштабировать. Вот почему я называю их production-что-то1, production-что-то2 и т. д… Очень легко добавить в кластер production-что-то3 и production-что-то4.
Весь бэкенд написан на Django/Python3. Операционная система — Ubuntu.

Перед процессами uWSGI я поставил nginx, он также работает балансировщиком нагрузки. Для обслуживания веб-трафика используется uWSGI.

С проверенной технологией спокойно спится по ночам. Основное хранилище данных — PostgreSQL, с которой у меня большой опыт разработки и эксплуатации на протяжении многих лет. Нетрудно догадаться, что где-то используется и Elasticsearch. Redis применяется для различных целей (например, кэширование, статистика...). Да, я применяю его для индексирования подкастов и для обслуживания поисковых запросов, как и большинство скучных компаний.

Если в будущем Listen Notes станет популярным, а Celery и Beat вызовут проблемы с масштабированием, я, вероятно, переключусь на два проекта, которые сделал для предыдущего работодателя: ndkale и ndscheduler. Celery используется для автономной обработки, а Celery Beat предназначен для планирования задач, которые похожи на задания Cron, но немного приятнее.

Supervisord управляет процессами на каждом сервере.

Ничего такого. Погодите, а как же Docker, Kubernetes и бессерверная архитектура? На самом деле я немного работал с Docker ещё в 2014 году на предыдущей работе: что было хорошо для среднего стартапа ценой миллиард долларов, кажется излишним для крошечной компании из одного человека. С опытом вы учитесь не делать лишнего.

Веб-интерфейс в основном построен с помощью React + Redux + Webpack + ES. Довольно стандартно в наши дни. При развёртывании в рабочей среде пакеты JS загружаются в Amazon S3 и выдаются через CloudFront.

С сервера поступает шаблон веб-страницы, а на стороне клиента в основном рендерится интерактивное веб-приложение. На ListenNotes.com большинство веб-страниц наполовину рендерятся на стороне сервера (шаблон Django), наполовину на стороне клиента (React). Но несколько веб-страниц полностью готовятся на сервере из-за моей лени и некоторых потенциальных преимуществ SEO.

Аудиоплеер

Я использую сильно модифицированную версию react-media-player. Он работает на веб-сайте как встроенный плеер в твиттере и встроенный плеер на сторонних сайтах:


Встроенный плеер на сторонних сайтах

Мы предоставляем разработчикам простой и надёжный API с подкастами. Построение API аналогично созданию веб-сайта. Здесь тот же стек Django/Python для бэкенда и ReactJS для интерфейса (например, панель инструментов API, документация...).


Панель инструментов Listen API


Документация Listen API

Нетрудно представить, что здесь активно используется Redis 🙂 Для API нам нужно отслеживать, сколько запросов использует клиент в текущем цикле биллинга, и взимать оплату.

Подготовка машины и развёртывание кода

Для подготовки системы (provisioning) применяется Ansible. По сути, я написал кучу файлов yaml для указания, какие файлы конфигурации и какое программное обеспечение должно быть на каждом типе серверов. Я могу одним нажатием кнопки развернуть сервер со всеми правильными файлами конфигурации и всем установленным софтом. Вот структура каталогов для этих файлов Ansible yaml:

Но опять же, этого сейчас достаточно
Я мог бы грамотнее назвать директории.

В принципе, у меня есть скрипт-обёртка deploy.sh, который работает на macOS: Ansible также помогает деплоить код в продакшн.

./deploy.sh production HEAD web

Этот скрипт принимает три аргумента:

  • Окружение: продакшн или staging.
  • Версия репозитория listennotes: HEAD означает «просто задеплоить последнюю версию». Если указан SHA коммита, то он развернёт определённую версию кода — это особенно полезно, когда мне нужно откатиться назад после плохого деплоя.
  • Тип серверов: веб, воркер, API или все. Мне не нужно деплоить сразу на все серверы. Иногда я делаю изменения в коде Javascript, тогда нужно развернуть его только в вебе, не трогая API или воркеры.

Процесс деплоя в основном организован файлами Ansible yaml, и, конечно же, предельно прост:

  • На моём Macbook Pro, если это деплой для веб-серверов, затем создаются пакеты Javascript и загружаются в S3.
  • На целевых серверах git клонирует репозиторий listennotes в папку с именем timestamp, проверяет конкретную версию и устанавливает новые зависимости Python, если таковые имеются.
  • На целевых серверах символическая ссылка указывает на вышеупомянутую папку с именем timestamp, затем перезапускаем серверы с помощью supervisorctl.

Как видите, я не использую эти причудливые средства CI. Только самые простые и надёжные инструменты, которые реально работают.

Мониторинг и оповещение

Мониторингом и оповещениями занимается Datadog. В простой панели мониторинга демонстрируются некоторые высокоуровневые показатели. Всё здесь предназначено для того, чтобы повысить мою уверенность при возне с серверами в продакшне.


Панель мониторинга Datadog для Listen Notes, по состоянию на декабрь 2017 года

Если что-то пойдёт не так, PagerDuty пришлёт мне оповещение по телефону и SMS. Datadog подключён к PagerDuty.

Я также использую Rollbar, чтобы отслеживать состояние кода Django и ловить неожиданные исключения, уведомляя меня по электронной почте и Slack.

Да, это компания с одним человеком, поэтому он нужен не для общения, а для мониторинга интересных событий на уровне приложений. Slack применяется очень активно. Это очень распространённая практика в технологических компаниях. Кроме интеграции Datadog и Rollbar с Slack, в код бэкенда Listen Notes интегрированы входящие веб-хуки Slack, чтобы уведомлять о регистрации пользователя или выполнении некоторых интересных действий (например, добавлении или удалении элементов). Если вы почитаете книги о первых годах Amazon или PayPal, то узнаете, что у обеих компаний был аналогичный механизм уведомлений: всякий раз, когда регистрировался пользователь, раздавался звук «динь», чтобы уведомить всех в офисе.

Я всегда очень осторожен и практичен в работе DevOps. С момента запуска в начале 2017 года у Listen Notes не было серьёзного даунтайма (более 5 минут), кроме этого. Для серверов предусмотрен серьёзный оверхед на случай какого-то огромного всплеска посещаемости из-за попадания в прессу или чего-то ещё.

Я работаю в коворкинге WeWork в Сан-Франциско. Некоторые могут задать вопрос, почему бы просто не работать из дома или из некоторых случайных кафе. Ну, я очень ценю производительность и готов инвестировать в неё деньги. Не верю, что домашний бардак способствует разработке программного обеспечения (или любой работе в сфере знаний/творчества). Я редко работаю более 8 часов в день (извините, люди 996). Хочется, чтобы каждая минута была на счету. Таким образом, хороший и относительно дорогой частный офис — то, что мне нужно. Вместо экономии денег в ущерб времени, я оптимизирую время, чтобы тратить его с пользой и зарабатывать деньги.


Мой офис в WeWork

Почти идентичная инфраструктура запускается внутри Vagrant + VirtualBox. Я работаю на MacBook Pro. Для среды разработки внутри Vagrant используется тот же набор файлов Ansible yaml, описанный выше.

Таким образом, есть один и только один репозиторий listennotes со скриптами DevOps, кодом фронтенда и бэкенда. Я поддерживаю философию монолитного репозитория. Вся разработка идёт в главной ветке. Он размещён как приватный репозиторий на GitHub. Я редко использую бранчи.

Да, знаю, это скучно. Я пишу код и запускаю dev-серверы (Django runserver и dev-сервер webpack) с помощью PyCharm. Но для меня PyCharm работает просто отлично. В конце концов, это не Visual Studio Code или Atom или какие-то крутые IDE. Старая школа, что же поделаешь.


Мой PyCharm

Есть куча полезных инструментов и сервисов, которые я использую для создания Listen Notes как продукта и компании:

  • iTerm2 и tmux как терминалы.
  • Notion для списков TODO lists, вики, заметок, записей по проектированию…
  • G Suite для почты @listennotes.com, календаря и других сервисов Google.
  • MailChimp для ежемесячной почтовой рассылки.
  • Amazon SES для служебных и некоторых маркетинговых рассылок.
  • Gusto для выплат себе и некоторым подрядчикам, если они не с Upwork.
  • Upwork для поиска подрядчиков.
  • Google Ads Manager для управления рекламой и отслеживания эффективности.
  • Carbon Ads и BuySellAds для резервных объявлений.
  • Cloudflare для управления DNS, CDN и файрволом.
  • Zapier и Trello для упрощения рабочих процессов в разделе интервью с подкастерами.
  • Medium для блога компании.
  • Godaddy и Namecheap для доменных имён.
  • Stripe для приёма денег от пользователей (в основном, за API).
  • Google speech-to-text API для расшифровки подкастов.
  • Kaiser Permanente для медицинской страховки.
  • Stripe Atlas для юридической регистрации Listen Notes, Inc.
  • Clerky: генерация юридических документов для венчурных инвесторов (SAFE) и найма подрядчиков, если они не с Upwork.
  • Quickbooks для бухгалтерии.
  • 1password для управления паролями в куче сервисов
  • Brex как платёжная карточка — вы можете получить дополнительные $5000 кредитов AWS, используя их поверх кредитов AWS от WeWork или Stripe Atlas.
  • Bonvoy Business Amex Card — можете накапливать баллы Marriott Bonvoy на люксовые отели и полёты. Это лучшая бонусная программа для путешействий/
  • Capital One Spark для текущего банковского счёта.

Как видите, мы живём в прекрасное время для запуска своего бизнеса. Так много готовых инструментов и сервисов, которые экономят время и деньги, повышая вашу производительность. Сейчас самое лучшее время за всю историю, чтобы создать что-то полезное для человечества с крошечной командой (или только силами одного человека), используя простые и скучные технологии.

Уже не нужно нанимать тонны штатных сотрудников. С течением времени компании становятся всё меньше и меньше. Чтобы сделать всю работу, можно воспользоваться сервисами SaaS и подрядчиками под заказ.

Что, если это, что, если то. В основном, главное препятствие в создании проекта — излишние размышления. Каждый занят собственными делами. Парень, ты никому не нужен. Даже если вы запорете запуск, никто этого не заметит. Никому не интересен ты и твой проект, пока ты не докажешь, что достоин внимания. Абсолютно нормально использовать скучные технологии и начать с чего-то простого (даже уродливого), если вы действительно решаете проблему. Думайте масштабно, начинайте с малого, действуйте быстро.

Сейчас так много людей с карго-культом. Не обращай внимания на шум. Сохраняй спокойствие и не дёргайся.

Теги
Показать больше

Похожие статьи

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть