Отличный способ монетизировать свои навыки разработчика - создать веб-приложение SaaS (программное обеспечение как услуга). Однако в процессе реализации успешного приложения SaaS возникает множество препятствий. В этой статье описывается архитектура полнофункционального веб-приложения с аутентификацией и платежами. Архитектура оптимизирует стоимость, простоту, масштабируемость и гибкость. Я лично использую эту точную настройку для приложения SaaS, и это мой любимый вариант, который я использовал до сих пор. Эта статья в первую очередь сосредоточена на инфраструктуре, которую нужно использовать, а не на идее приложения или конкретной инфраструктуры внешнего интерфейса.

Расходы

Когда я говорю «бесплатно», я имею в виду «бесплатно», пока у вас не будет достаточно пользователей, и вы, вероятно, в любом случае заработаете достаточно денег, чтобы покрыть свой счет за облачные вычисления. Архитектура полностью бессерверная, что означает, что вы платите в зависимости от количества людей, использующих ваше приложение, а не платите за серверы, которые постоянно работают. Когда у вас меньше ~ 10000 пользователей, вы, вероятно, будете в пределах бесплатного уровня для всех используемых сервисов, а инфраструктура будет полностью бесплатной.

Простота

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

Масштабируемость

Каждый аспект инфраструктуры масштабируется вверх и вниз почти бесконечно, полностью автоматически. Это означает, что ваше приложение будет быстрым независимо от того, сколько людей его использует.

Гибкость

Я считаю, что у каждого поставщика облачных услуг есть свои плюсы и минусы, и что идеально писать код, который можно использовать для нескольких поставщиков облачных услуг. В конце концов, для большого числа пользователей бессерверное использование может стать дороже, чем запуск собственного сервера, поэтому мы хотим, чтобы мы не слишком сильно ограничивали себя конкретными бессерверными инструментами.

Инфраструктура

Я выбрал Amazon Web Services (AWS) для большей части инфраструктуры приложения. AWS дешевый и имеет очень большое количество сервисов, которые вы, возможно, захотите использовать в своем приложении. Однако у некоторых сервисов AWS есть недостатки, поэтому в этих случаях я выбрал альтернативные сервисы.

Бессерверная структура

Нажатие на консоль AWS для создания инфраструктуры занимает много времени и чревато ошибками. Вместо этого считается лучшей практикой определять облачную инфраструктуру как код (IaC). Это позволяет нам мгновенно видеть, какие службы мы используем, и точную конфигурацию для каждой из них. Мы можем управлять версиями наших шаблонов конфигурации инфраструктуры. Даже если мы потеряем доступ к нашей учетной записи AWS, мы сможем развернуть всю нашу инфраструктуру снова, выполнив одну команду командной строки.

Существует множество различных инструментов IaC, в том числе некоторые из них, созданные AWS, например Cloudformation. Поскольку нам нужен простой инструмент, который также может быть гибким для нескольких облачных провайдеров, я выбрал вместо него Serverless Framework. Serverless Framework содержит множество полезных плагинов и компонентов для упрощения разработки бессерверного приложения. Недавно они добавили приятный пользовательский интерфейс, который позволяет вам также контролировать свои развернутые ресурсы.

В качестве чрезвычайно простого решения для базовой инфраструктуры приложения Serverless Framework предоставляет шаблон для полнофункционального приложения на AWS. В шаблоне используется предварительно созданный шаблон для внешнего интерфейса React, который развертывается в корзине S3 с Cloudfront в качестве CDN для быстрого обслуживания сайта по всему миру. Он развертывает серверную часть NodeJS с Express API, которая работает на Lambda и имеет перед ней API Gateway, поэтому он доступен через HTTP. Наконец, он развертывает базу данных DynamoDB , которая уже подключена к серверной части NodeJS и Express. Он содержит инструменты, которые позволяют разрабатывать и развертывать все через командную строку и вашу любимую IDE. Вот репозиторий Github для шаблона полного стека приложения: https://github.com/serverless-components/fullstack-app.

В шаблоне может не быть всего необходимого. Если вы уже создали приложение React или использовали другую платформу внешнего интерфейса, такую ​​как Angular или VueJS, вы можете заменить содержимое папки site кодом своего внешнего интерфейса и настроить каталог сборки, указанный в файле serverless.yml в файле папка site. Это то, что я сделал лично, поскольку я уже создал приложение React.

Что касается бэкэнда, вы привязаны к NodeJS и Express для этого конкретного шаблона. Тем не менее, Serverless также обеспечивает поддержку разных языков и фреймворков. Вот руководство по созданию серверной части с Python, Flask и DynamoDB: https://www.serverless.com/blog/flask-python-rest-api-serverless-lambda-dynamodb/. Если вы использовали React для внешнего интерфейса и Flask для внутреннего интерфейса, вы могли бы следовать этому руководству и просто использовать часть веб-сайт в шаблоне полного стека приложения: https://github.com/serverless-components/website .

NodeJS и Express для маршрутизации согласуются с целью гибкости инфраструктуры, поскольку вы можете легко переместить серверную часть Express, чтобы позже разместить ее в другом месте, если это будет необходимо. Если вы выполнили все маршруты с помощью API Gateway, вам придется написать это снова, если вы переместили свой API для размещения в другом месте.

Аутентификация

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

AWS предоставляет службу аутентификации под названием Cognito, но я считаю, что использование этой службы сбивает с толку. Google Cloud Platform (GCP) предоставляет управляемую службу аутентификации на своей платформе Firebase под названием Firebase Authentication. Эта служба чрезвычайно проста в использовании и бесплатна для неограниченного числа пользователей. Вы можете легко добавить поддержку входа в систему с помощью Google и Facebook, а также многих других, а также имени пользователя и пароля.

Чтобы добавить поддержку Firebase Auth, вам необходимо настроить ее с помощью консоли Firebase в GCP, а затем добавить Firebase Admin SDK в свой сервер NodeJS, следуя этому руководству: https://levelup.gitconnected.com/how-to-access -firebase-from-aws-lambda-f7f494dd435a . Вам также необходимо добавить функцию входа в firebase в свой интерфейс, следуя инструкциям, подобным этому: https://firebase.google.com/docs/web/setup. После того, как все это настроено, вы можете получить токен идентификатора пользователя во внешнем интерфейсе, затем отправить этот токен идентификатора на свой сервер и проверить токен с помощью Firebase Admin SDK. Это позволяет вам получить уникальный идентификатор пользователя и сохранить информацию о нем в вашей базе данных DynamoDB.

Платежи

Без возможности принимать платежи от пользователей вы не сможете зарабатывать деньги. Написание этой функции с нуля было бы настоящим кошмаром. К счастью, существуют управляемые сервисы для платежей. Самым популярным сервисом для приема платежей в 2021 году, безусловно, является Stripe. Stripe очень прост в настройке, имеет отличную документацию и красивый пользовательский интерфейс. Stripe берет небольшой процент от каждого принимаемого вами платежа и не имеет никаких других расходов за его использование. На мой взгляд, эта комиссия того стоит, поскольку избавляет от лишних хлопот по настройке платежей. Вы можете настроить множество различных планов оплаты, включая ежемесячную подписку или разовый платеж.

Stripe имеет пакет React и отличное руководство по его настройке: https://stripe.com/docs/stripe-js/react. Вам также нужно будет позвонить в свой бэкэнд, чтобы авторизовать платеж, поэтому вам нужно будет установить пакет Stripe в свой бэкэнд NodeJS. Я использовал готовую кассу Stripe, которая выглядит профессионально и избавляет от необходимости самостоятельно писать формы для кредитных карт.

Заключение

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