Всякий раз, когда я вижу, как инженеры пишут о своем стеке технологий, мне интересно узнать новые инструменты. Особенно, если ты работаешь в одиночку, всегда ищешь возможность учиться на опыте других.
В 2015 году меня расстроило текущее состояние менеджеров паролей, особенно отсутствие приличных решений для людей, использующих частные серверы. Я начал работать над Psono, открытым менеджером паролей с приличным уровнем шифрования и безопасными параметрами обмена. Psono никогда не подразумевался как SaaS; в противном случае я, вероятно, сразу бы добавил поддержку для множества арендаторов.
Для начала, чтобы вы получили представление о масштабе Psono. Psono в настоящее время установлено локально примерно в 70 странах, с более чем 4000 установок. Один только Psono SaaS используется более чем 15.000 человек, большинство из которых используют наше бесплатное сообщественное издание Psono, которое работает на той же технологической базе, что и наш платный продукт Enterprise.
Стек типичной установки Psono состоит из базы данных, сервера, двух веб-клиентов (одного для регулярных пользователей и одного для администраторов), приложений для iOS и Android, расширений для браузеров Chrome и Firefox. Клиенты могут установить LDAP-шлюз или файловый сервер поверх этого.
Помимо этого у меня есть много другой инфраструктуры. Начиная с веб-сайта для поддержки домашней страницы компании и продуктовой страницы, у меня есть сервер лицензий для нашего корпоративного продукта, центральная ERP-система для управления предложениями и счетами, магазин, где люди могут покупать Psono SaaS и управлять своей установкой, и сервис аутентификации с использованием OIDC.
В ходе статьи вы увидите, что я предпочитаю старую и проверенную технологию.
Языки
- Python: Весь backend-код написан на Python. Самое большое преимущество Python - его богатая экосистема. Отсутствие типов (многие считают это недостатком) делает очень быстрым написание веб-сервисов, что для стартапа является одним из ключевых аспектов, на которые следует обратить внимание при выборе языка программирования.
- Javascript: О, нет ... кто бы мог подумать ... В 2015 году уже невозможно было создать ни одного веб-сайта без Javascript. ;)
Python - мой любимый язык для веб-сервисов. (Я здесь не выражаю впечатления, почему не XY лучше, чем Python. Это может заполнить другую статью в блоге.) Есть одна проблема, с которой нужно справляться, - это возможность доставлять код со всеми зависимостями надежно, что особенно важно, если люди устанавливают ваш софт локально и запрашивают поддержку, если у них возникают проблемы. (Что касается скорости, которую могут добавить другие, это не имеет значения. Python достаточно быстрый.)
Фреймворки
- Django: "Это как суперсила для одиночных разработчиков" (если можно процитировать Athony N. Simons). Вместе с экосистемой он решает почти все проблемы, с которыми вы можете столкнуться. Аутентификация, шаблоны, email, миграции баз данных, totp, ... это только несколько из них.
- Django Rest Framework: В настоящее время он поддерживает все API и делает это очень хорошо. Различные слои (сериализация, аутентификация, разрешения, представления) сохраняют код очень чистым.
- React: Я недавно мигрировал обычный веб-клиент на React. Старый веб-клиент (помните, что он был запущен в 2015 году) был написан на AngularJS, и это было довольно сложно поддерживать обратную совместимость со старым клиентом, например, все пути к пользователю не должны изменяться, так как они могли создать закладки на ссылки в своей документации или использовать так называемые шары ссылок. Также люди использовали персонализированный брендинг с собственными логотипами и т.д., где пути на системе не должны изменяться.
- webpack: Я хотел упомянуть его здесь, так как это единственная часть, с которой я недоволен. Он медленный, вырывает волосы, труден для изучения ..., единственное преимущество, что вы никогда не застрянете. Любая проблема, с которой вы можете столкнуться, уже обсуждалась на Stackoverflow, и вы найдёте решение.
- Gatsby: Поддерживает наши статические сайты для компании и продукта. В прошлом я использовал wordpress, но управление обновлениями и постоянный страх, что сайт будет взломан (и потенциально негативная публичность), заставил нас переключиться на Gatsby. Пока не сожалел об этом.
- Vuepress: Самая приличная система управления документацией, которую я смог найти. Она компилируется в статические веб-сайты, выглядит современно и в настоящее время поддерживает документацию Psono
- Material UI: Основная библиотека, поддерживающая фронтенд. Она богата функциями, хорошо работает с React и выглядит довольно современно в отличие от старых тем, основанных на Bootstrap.
Конечно, есть бесчисленные другие, которые заслуживают упоминания здесь, но это самые важные, по моему мнению.
Базы данных
Даже если Django поддерживает несколько баз данных, я довольно рано столкнулся с вопросом, хочу ли я поддерживать все базы данных Django или только одну конкретную. Корень этого вопроса в том, что я храню вложенные структуры деревьев в базе данных. Так что деревья с множеством корней и общими ветвями. Эффективное запросы к ним были критически важны, поэтому, изучив все доступные варианты, я решил остановиться на расширении ltree от PostgreSQL.
Если вы планируете разработать что-то и управлять этим в одиночку, это должно надежно работать в облаке, управляемым поставщиком облачных услуг. Вы, скорее всего, не захотите быть привязанным к одному поставщику, поэтому ничего специфического для облака, что сильно ограничивает ваш выбор.
Мое решение:
- Postgres: Существует две базы данных с открытым кодом, которые вы можете выбрать. MariaDB или Postgres. Изначально я планировал использовать Maria (в основном из-за Galera Cluster от MariaDB, одна из этих заблуждений "молодой разработчик нуждается в планировании эксплуатации" ;D), но из-за отсутствия расширения ltree я был вынужден использовать Postgres. В настоящее время с учетом всех разработок, применяемых к вариантам шардирования в Postgres, я ни разу не жалел об этом решении.
- Redis: Запланирован для использования в качестве кэша для более крупных установок. Здесь вы также можете выбрать либо Redis, либо Memcache. Оба отличные, но в основном из-за протокола Redis, который в настоящее время является де-факто стандартом для кэширования, я выбрал Redis. Единственный недостаток, который я когда-либо испытывал с Redis, это его однотредовая природа.
Инфраструктура
Просто небольшой обзор инфраструктуры, на которой работает Psono:
- Gitlab: Gitlab управляет всей автоматизацией Psono. Все в Psono автоматизировано, что является одним из ключевых аспектов того, как я могу управлять выпуском и поддерживать всю экосистему Psono. В 2015 году каждый проект с открытым исходным кодом работал на github, но Gitlab (и по сей день) невероятно мощный и превосходит по функциям (за исключением функции поиска на github). Gitlab управляет сборками, релизами, уязвимостями КАЖДОГО программного обеспечения, которое мы используем.
- Cloudflare: Вероятно, самая инновационная компания, о которой я знаю, которая повлияла на меня за последние 10 лет. Можно смело сказать, что Cloudflare теперь управляет интернетом. Она предоставляет мне надежные имена серверов, TLS, приличный CDN, и продвинутые функции, такие как их edge worker. Защита от DDoS и функции WAF обеспечивают определённую дополнительную безопасность, что для менеджера паролей весьма важно. Я бы хотел использовать их SSL как услугу, чтобы позволить клиентам SaaS настраивать свои домены, но плата за уровень Enterprise от Cloudflare слишком высока. Я всё ещё надеюсь, что они выпустят это где-то как независимый плагин, который можно приобрести.
- namecheap: Моё основное решение для доменов и ssl-сертификатов.
- Google Cloud Run: Все backend-серверы работают на Google Cloud Run, что чрезвычайно экономически эффективно и надежно, когда вы хотите запустить флот сервисов. Как только ваш стек запущен, он делает свою работу очень хорошо. Их первоклассная API/cli интеграция здесь является абсолютным плюсом. Существуют некоторые недостатки, такие как отсутствие поддержки со стороны Google или угроза того, что Google может в какой-то момент решить, что быть №3 в качестве поставщика облачных услуг может быть не стоит того, и они отменят продукт.
- Artifactory: Защищает мой конвейер сборки от сбоев npm и хранит мои артефакты сборки (что не было объединено в Gitlab в 2015 году).
- Docker Hub: Хранит все Docker контейнеры, осуществляет дополнительные проверки безопасности и распределение моих контейнеров.
- Mailgun: Обрабатывает все электронные письма. В отличие от большинства провайдеров услуг электронной почты, Mailgun имеет приличные функции журналирования и анализа. Их поддержка первоклассная. Единственная проблема заключается в том, что их электронные письма иногда попадают в папку спама (даже с настроенными SPF, DMARC и т.д.), но кроме этого они делают отличную работу.
- Poeditor: Обрабатывает все переводы. Приятным является то, что внешние участники могут запросить доступ, что важно, если вы хотите, чтобы посторонние помогали переводить ваш проект. Их поддержка отличная, и ответы приходят очень быстро.
- Docker: Одно из лучших решений для всего проекта. Особенно, поскольку я использую Python, который трудно производить с работающим кодом и всеми библиотеками зависимостей Python/OS. Если вещи должны работать локально у клиента и требовать, чтобы он мог обновлять и поддерживать систему, Docker позволяет нам делать все это и дает мне полный контроль над установленными пакетами, что решает по крайней мере 70% всех вопросов поддержки (хотя и вводит 20% новых вопросов, так как люди не привыкли работать с Docker ;D).
Мониторинг
Итак, вещи могут идти наперекосяк, и вам нужно знать, когда это происходит, и получить некоторые инсайты в проблему. Вот где эти инструменты становятся полезными:
- Google Cloud logging: Если вы пользуетесь Google, это естественное решение
- Sentry: Мое главное решение для отчетов об ошибках. Как только попробуете, вы никогда не захотите его пропустить. Оно дает мне необходимое понимание всех ошибок.
- Uptimerobot: Вызывает проверки работоспособности моих различных сервисов и оповестит меня, если что-то выйдет из строя. Публичная страница состояния Psono, кстати, находится здесь https://stats.psono.com/, что является лишь малой частью этих услуг, которые это мониторит для меня, но, надеюсь, немного демонстрирует надежность системы.
Инфраструктура для разработки
Небольшой обзор того, как выглядит моя локальная инфраструктура для разработки:
- Windows with WSL: Вероятно, я получу много критики за это, но да, я работаю на Windows. В последние годы у меня всегда была где-то Linux VM, к которой я подключался для разработки, но в настоящее время это управляется WSL. Я получаю лучшее из обоих миров.
- Pycharm / Webstorm: Я использую IDE от Jetbrains. Функциональность удаленной разработки является ключевой для моего рабочего процесса и этот подход "включенные батареи" мне очень подходит. Иногда у меня открыто около 20 проектов одновременно, что требует приличного оборудования с достаточным количеством оперативной памяти. В настоящее время VSCode кажется хорошей альтернативой, но за последние несколько лет я привык к Jetbrains, и изучение чего-то нового всегда требует некоторой умственной силы, которую я в настоящее время не готов тратить на это. Я бы сказал, что каждый должен использовать то, к чему он привык.
Поддержка
Есть определенные инструменты, которые, конечно, необходимы для поддержки людей, использующих продукт:
- Freshdesk: Типичное программное обеспечение для тикетов по электронной почте. Оно помогает мне отслеживать различные запросы клиентов. В начале существования оно предоставляло приличный бесплатный уровень, что особенно на этапе создания компании крайне важно.
- Discord: Некоторые люди могут предпочесть чат или нуждаться в более прямом разговоре / помощи. Вот где Discord становится полезным.
Другое
Есть некоторые другие инструменты, которые я хотел бы отметить, которые могут быть полезны другим. Особенно банки для людей, которые хотят вести бизнес в Германии:
- Odoo: Лучшая ERP-система. Ее open source-издание бесплатно и может быть легко расширено с использованием Python и некоторых знаний XML. Ее параметры настройки и интеграции с пользовательскими API на высшем уровне.
- Holvi: Наш основной банковский счет. В Германии вам нужен банк, который позволяет открыть счет учредителя, на немецком языке "Gründerkonto", то есть банковский счет, привязанный к компании, которая еще не полностью зарегистрирована, и куда можно перевести начальный капитал, необходимый для регистрации компании. Немного курьезная проблема "курица или яйцо". И крупные банки, которые это позволяют, обычно стоят очень дорого. Процесс регистрации также прошел довольно гладко. Единственный недостаток - отсутствие поддержки международных платежей, но тут на помощь приходит следующий сервис.
- Wise: Наш второй банковский счет. Их комиссии чрезвычайно низкие (например, нет ежемесячных платежей), процесс настройки работает безупречно, они хорошо связаны и позволяют международные банковские переводы, которые выполняются быстро, так что вам не придется ждать неделями или дольше.
Безопасность
Я думаю, это могла бы быть отдельная статья о том, как мы структурировали учетные записи пользователей, инфраструктуру, права доступа. Поскольку это один из наиболее важных аспектов безопасности Psono, я не буду вдаваться в подробности и постараюсь быть достаточно расплывчатым. Мы используем как услуги Google Cloud, так и Azure. Оба с полностью разделёнными пользователями и групповыми учетными записями. Существуют пользователи, выделенные для административных задач, и учетные записи пользователей для "ежедневной работы". Есть различные физические и виртуальные системы, которые я использую для доступа / поддержки / управления / администрирования Psono. Административные задачи выполняются только на отдельном, специально защищенном физическом устройстве, которое используется исключительно для этих задач. Каждая учетная запись защищена аппаратными токенами. Все системы централизованно управляются и реализованы политики безопасности, чтобы гарантировать, что все устройства соответствуют стандартам безопасности, с которыми вы обычно сталкиваетесь в банках.
Благодарности
Эта статья была сильно вдохновлена статьей Anthony N. Simon о Panelbear.