Щоразу, коли я бачу статті інженерів про їхній стек, мені цікаво дізнатися про нові інструменти. Особливо коли керуєш всім соло, завжди намагаєшся навчитися чомусь у досвіді інших.
У 2015 році мене засмучував рівень наявних менеджерів паролів, особливо через те, що не було чогось пристойного для людей, які працюють на власних серверах. Я почав працювати над Psono, відкритим менеджером паролів із надійним рівнем шифрування та безпечними опціями для спільного доступу. Psono ніколи не планувалася як SaaS — інакше я, мабуть, одразу ж із початку заклав би підтримку кількох орендарів (тенантів).
Щоб ви уявляли масштаб Psono. Зараз Psono встановлено локально приблизно у 70 країнах, понад 4000 інсталяцій. Лише Psono SaaS наразі використовують понад 15 000 людей, більшість із яких працюють з безкоштовною community-версією Psono, що працює на тій же технологічній основі, що і наш платний продукт Enterprise.
Стек типової інсталяції Psono складається з бази даних, сервера, двох вебклієнтів (один для звичайних користувачів і один для адміністраторів), додатків для iOS і Android, розширень для браузерів Chrome та Firefox. Клієнт може встановити шлюз LDAP чи файловий сервер зверху цієї інфраструктури.
Крім цього, у мене працює ще чимало іншої інфраструктури. Починаючи з вебсайту для сторінки компанії й продукту, я маю ліцензійний сервер для enterprise-продукту, центральну ERP-систему для обробки комерційних пропозицій та рахунків, магазин, де можна придбати Psono SaaS і керувати своєю інсталяцією, а також сервіс автентифікації з OIDC.
Протягом цієї статті ви побачите, що я віддаю перевагу перевіреним і "нудним" технологіям.
Мови програмування
- Python: Весь бекенд написано на Python. Найбільша перевага Python — це його розвинена екосистема. Відсутність типів (на думку багатьох — недолік) дозволяє надзвичайно швидко писати веб-сервіси, а для стартапу це одне з ключових питань.
- Javascript: О ні... хто б міг подумати :) Просто неможливо створити вебсайт без Javascript ще з 2015 року.
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 підтримує кілька баз даних, ще на початку я зіткнувся з питанням: підтримувати всі чи одну конкретну? Причина: я зберігав у базі даних вкладені деревоподібні структури. Це були дерева з кількома коренями й спільними гілками. Оперативне виконання запитів було критичним, тож після вивчення всіх варіантів я обрав розширення ltree в PostgreSQL.
Якщо ви плануєте розробити щось і запускати це соло, рішення повинне надійно працювати у хмарі, кероване обраним тією ж хмарою. Ви також, швидше за все, не бажаєте бути прив'язаними до конкретного провайдера, тож обирати треба дуже обережно.
Мій вибір:
- Postgres: Можна обирати між двома open source базами — MariaDB та Postgres. Я завжди планував працювати з Maria (переважно через кластер Galera від Maria DB — це одна з тих помилкових "молодий розробник планує скакати у гіперзростання" історій ;D), але через відсутність потрібного ltree extension довелося брати Postgres. Зараз, враховуючи розвиток рішень для шардингу Postgres, не шкодую анітрохи.
- Redis: Планувався як кеш для більших інсталяцій. Тут можна вибирати Redis чи Memcache — обидва чудові, але я обрав Redis через те, що його протокол став де-факто стандартом. Єдиний мінус — Redis однопотоковий.
Інфраструктура
Короткий огляд інфраструктури Psono:
- Gitlab: Забезпечує всю автоматизацію Psono. Варто сказати, що все у Psono автоматизовано — це ключ до того, як я можу керувати релізами і підтримувати всю екосистему. У 2015 кожен опенсорсний проект працював на github, але Gitlab тоді (і досі) надзвичайно потужний і функціональний (не рахуючи пошуку — тут github кращий). Gitlab забезпечує білди, релізи, скани безпеки КОЖНОГО шматка ПЗ, яким я користуюся.
- Cloudflare: Мабуть, найінноваційніша компанія, яка мене надихала за останні 10 років. Можна сміливо сказати, що Cloudflare забезпечує сучасний інтернет. Забезпечує надійні імена серверів, TLS, CDN і такі новітні штуки як edge workers. DDoS-захист і WAF — це дуже корисно для менеджера паролів. Я би радо використовував їхнє SSL-as-a-service для SaaS-клієнтів із власними доменами, проте "Enterprise"-поріг ціни Cloudflare занадто високий. Маю надію, їхню функцію колись буде можна отримати окремо.
- namecheap: Моє рішення для доменів і SSL-сертифікатів.
- Google Cloud Run: Усі бекенд сервери працюють на Google Cloud Run — це надзвичайно вигідно і надійно, коли треба запускати багато сервісів. Після налаштування весь стек працює дуже добре. Їхня API/CLI — найвищого рівня. Недоліки: відсутність підтримки Google, а ще — існує ризик, що Google вирішить: бути №3 серед хмарних провайдерів не варте зусиль, і закриє продукт.
- Artifactory: Захищає build-пайплайн від збоїв npm та зберігає артефакти білда (у 2015 такого не було в Gitlab).
- Docker Hub: Зберігає всі Docker-контейнери, виконує додаткові скани безпеки та розповсюдження контейнерів.
- Brevo: Надсилає всі email-повідомлення. На відміну від багатьох поштових сервісів, Brevo має чудовий логінг і аналітику. Підтримка на найвищому рівні. Єдиний мінус — іноді їхні листи все одно потрапляють у спам (навіть із SPF, DMARC тощо), але загалом все добре.
- Poeditor: Обробляє переклади. Зручно: волонтери можуть просити доступ — це важливо, якщо потрібно додати зовнішнього перекладача. Підтримка — супер, відповідають дуже швидко.
- Docker: Одна з найкращих рішень для всього проекту. Особливо коли використовуєш Python, а доставити робочий Python-код разом із усіма залежностями (Python / ОС) складно. Якщо треба, щоб у клієнта працювало "на місці", оновлювалося та обслуговувалося — Docker дає це можна виконати. Контроль над пакетами вирішує щонайменше 70% усіх проблем підтримки (правда, додає 20% нових, бо не всі знайомі з Docker ;D).
Моніторинг
Помилки трапляються і потрібно вчасно побачити, коли щось іде не так, знайти причину. Саме для цього потрібні такі інструменти:
- Google Cloud logging: Якщо ви на Google — ваш природний вибір.
- Sentry: Моє #1 рішення для збору помилок. Спробуєш — і вже не захочеш відмовлятися. Дозволяє заглянути в усі помилки як треба.
- Uptimerobot: Викликає healthcheck різних сервісів, сповіщає, якщо щось впаде. Публічна сторінка статусу Psono: https://stats.psono.com/ — це лише маленька частка сервісів, але, сподіваюся, показує надійність системи.
Інфраструктура розробки
Коротко про мій локальний стек розробника:
- Windows із WSL: Мабуть, мене за це розкритикують, та так — я працюю на Windows. Раніше в мене завжди була окрема лінуксова VM для розробки, а нині все WSL. Виходить найкраще з обох світів.
- Pycharm / Webstorm: Користуюся IDE Jetbrains. Віддалена робота — критично для мого потоку розробки, і підхід "батарейки в комплекті" мені подобається. Буває, маю одночасно відкрито до 20 проектів — потрібен хороший залізо з достатньо оперативки. VSCode зараз теж нічого, але за останні роки звик до Jetbrains, а нове вчити — це треба розумове зусилля, на яке не готовий зараз. Думаю, кожен мусить користуватися тим, до чого звик.
Підтримка
Потрібні окремі інструменти, щоб допомагати людям із підтримкою продукту:
- Freshdesk: Класичний тікет-софт для email-запитів. Дозволяє стежити за заявками від клієнтів. Раніше був хороший безкоштовний тариф — особливо корисно на старті компанії.
- Discord: Дехто віддає перевагу чату або потребує більш прямого контакту/допомоги. Саме тут зручно використовувати Discord.
Інше
Є інші інструменти, які можуть бути корисними. Особливо банкові сервіси для тих, хто веде бізнес у Німеччині:
- Odoo: Найкраща ERP-система. Відкритий варіант безкоштовний, легко розширюється на Python та трохи XML, опції кастомізації й інтеграції з API — супер.
- Holvi: Наш основний рахунок. У Німеччині потрібен банк із можливістю створити "Gründerkonto" — рахунок для ще не зареєстрованої компанії, куди можна внести початковий капітал компанії. Проблема "курки й яйця". Великі банки, які це роблять, як правило, дуже дорогі. Реєстрація пройшла без проблем. Мінус: немає підтримки міжнародних платежів, ось тут наступний сервіс дуже допомагає.
- Wise: Другий рахунок. Комісії дуже низькі (немає місячних оплат), процедура реєстрації ідеально відточена, проведення міжнародних й міжбанківських переказів — швидко. Не доводиться чекати тижнями.
Безпека
Гадаю, це тягне на окремий блог-пост — як структуровані акаунти, інфраструктура, права доступу. Оскільки це один із найважливіших аспектів безпеки Psono, не буду заглиблюватись і залишусь досить розпливчастим. Ми використовуємо сервіси Google Cloud і Azure, причому з повністю відокремленими користувачами й групами. Є акаунти для адміністративних завдань і окремі обліковки для щоденної роботи. Є різні фізичні й віртуальні системи, через які я працюю з Psono / надаю підтримку / адмініструю сервіс. Адміністративні задачі виконуються лише зі спеціально захищеного пристрою, що використовується винятково для цього. Кожен обліковий запис захищено апаратним токеном.
Усі системи керуються централізовано, політики безпеки забезпечують відповідність стандартам, прийнятим у банках.
Подяки
Ця стаття була натхненна статтею Anthony N. Simon про Panelbear.