<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Богдан Стефанюк: дописи з тегом дешево і сердито</title>
<link>https://www.stefaniuk.website/tags/deshevo-i-serdito/</link>
<description>Всім привіт! Я — Богдан, фулстек розробник з Києва. Пишу в основному про програмування та штуки які вивчаю. Час від часу публікую підбірки фоток, зроблених на плівку, розказую про подорожі та цікаві речі, що оточують мене.</description>
<author></author>
<language>uk</language>
<generator>Aegea 11.2 (v4116)</generator>

<itunes:subtitle>Всім привіт! Я — Богдан, фулстек розробник з Києва. Пишу в основному про програмування та штуки які вивчаю. Час від часу публікую підбірки фоток, зроблених на плівку, розказую про подорожі та цікаві речі, що оточують мене.</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Онлайн документация на базе WordPress и IdentityServer</title>
<guid isPermaLink="false">262</guid>
<link>https://www.stefaniuk.website/all/app-manuals-by-wordpress-and-identityserver/</link>
<pubDate>Wed, 22 Dec 2021 03:55:03 -0400</pubDate>
<author></author>
<comments>https://www.stefaniuk.website/all/app-manuals-by-wordpress-and-identityserver/</comments>
<description>
&lt;p&gt;Как-то раз на работе появилась задача по созданию онлайн документации для нашего приложения. Документация должна быть не технической, а в виде мануалов для пользователей.&lt;/p&gt;
&lt;p&gt;Одним из главных требований была авторизация пользователей с помощью текущего логина и пароля от основного приложения. Доступ к материалам должен определяться на основании текущих ролей пользователя.&lt;/p&gt;
&lt;p&gt;Изначально хотели использовать готовое решение в виде SaaS сервиса с которым можно интегрироваться и спокойно пользоваться. Идея самим все написать с нуля хоть и возникала, но вернуться к ней решили только в крайнем случае.&lt;/p&gt;
&lt;p&gt;Первым кандидатом был GitBook. У него приятный интерфейс, много опций по редактированию и оформлению текстов. Необходимый нам функционал также был, но доступен только в Enterprise версии. Цена оказалась слишком большой, пришлось искать дальше.&lt;/p&gt;
&lt;p&gt;Подобных сервисов и так не очень много, а с необходимыми нам фичами так вообще почти нету. В какой-то момент я даже решил попробовать что-то собрать на основе статического генератора сайтов, но получилось слишком монструозно.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Wordpress&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Оставался только один вариант — написать все самим, чего очень не хотелось делать. В какой-то момент я чисто случайно вспомнил про Wordpress. Не то что бы я им раньше пользовался, но много слышал о нем.&lt;/p&gt;
&lt;p&gt;В итоге решили делать мануалы на базе Wordpress. Вообще, Wordpress это такая штука, с которой при должном умении можно слепить все что угодно. В нашем случае даже код не пришлось писать (почти).&lt;/p&gt;
&lt;p&gt;За основу взяли готовую тему и немного допилили под наши нужды с помощью CSS. Правда в одном месте пришлось немного изменить логику отображения с помощью PHP, но это была достаточно тривиальная задача.&lt;/p&gt;
&lt;p&gt;Весь функционал реализовали с помощью пачки плагинов. Главным среди них стал OAuth Single Sign On by miniOrange. Он позволяет логиниться в вордпесс с помощью сторонних сервисов (Google, Facebook и т. д.). Бесплатная версия покрывает почти все кейсы. На же пришлось покупать лицензию, потому что нужен был мапинг наших ролей на роли вордпреса.&lt;/p&gt;
&lt;p&gt;За работу с пользователями в нашем приложении отвечает IdentityServer. Сделали отдельную страницу логина для SSO чтобы получить нужную куку. Также включили флаг AlwaysIncludeUserClaimsInIdToken в настройках клиента, чтобы клеймы ролей были в ID токене и их смог увидеть Wordpress.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Хостинг&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;С хостингом тоже все оказалось достаточно просто. Изначально хотели использовать AWS Lightsail, но основная проблема мы в отсутствии возможности перемещать снапшоты диска между аккаунтами. В итоге развернули все на EC2 с помощью готового бесплатного решения из AWS Marketplace.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Итого&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Эта задача очень показательна, она позволяет понять насколько готовые решения позволяют сэкономить время и деньги. Если писать такое приложение с нуля, то это может занять месяц работы, а также время на тестирование и отлов типичных ошибок. Ну и пользователей нужно было бы учить как всем этим пользоваться.&lt;/p&gt;
&lt;p&gt;В нашем случае настройка Wordpress заняла приблезительно неделю не очень активной работы. Также популярность Wordpress позволяет легко нанять человека, который сможет спокойно с ним работать.&lt;/p&gt;
&lt;p&gt;Ну и стоимость порадовала. Все это обошлось в ~570$, в то время как типичный SaaS сервис берез 5$ в месяц за одного пользователя. Хостинг тоже вышел не очень дорогим (~10-15$ в месяц).&lt;/p&gt;
</description>
</item>

<item>
<title>Где захостить свое приложение?</title>
<guid isPermaLink="false">261</guid>
<link>https://www.stefaniuk.website/all/where-and-how-to-host-apps/</link>
<pubDate>Wed, 15 Dec 2021 04:34:45 -0400</pubDate>
<author></author>
<comments>https://www.stefaniuk.website/all/where-and-how-to-host-apps/</comments>
<description>
&lt;p&gt;Как и многие другие разработчики я часто делаю разные небольшие приложения или пет-проекты. И очень часто возникает вопрос: где захостить приложение и его компоненты и как это сделать максимально дешево?&lt;/p&gt;
&lt;p&gt;Я старался подобрать сервисы, которые позволяют максимально просто и дешёво запускать все необходимые для работы приложения ресурсы. В основном большинство приложений состоит из бекенда (в моем случае .NET), фронтенда и базы данных. Поэтому рассмотрим варианты развертывания каждого компонента.&lt;/p&gt;
&lt;h2&gt;Типы сервисов&lt;/h2&gt;
&lt;p&gt;Для начала стоит кратко пройтись по моделям предоставления сервисов в облаке. Эти модели описывают зоны ответственности пользователя и облачного провайдера. В разрезе данной статьи нас интересуют следующие модели:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;IaaS (Infrastructure as a Service)&lt;/b&gt; — облачный провайдер предоставляет минимально необходимую инфраструктуру в виде виртуальных машин, сети и хранилища, а также отвечает за работоспособность. Дальнейшая настройка, в том числе и ОС, лежит на стороне пользователя. По сути это основные строительные блоки в облаке с помощью которых можно сделать все что захотим.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PaaS (Platform as a Service)&lt;/b&gt; представляет из себя готовую инфраструктуру для разработки и запуска приложений. При такой модели мы не думаем про настройку и управление серверами, операционными системами и т. д. Примером такого сервиса являются управляемые БД (managed databases). Облачный провайдер сам отвечает за правильную настройку сервера, ОС, сохранность данных, бекапах и бесперебойную работу. В основном пользователь только платит деньги и пользуется сервисом.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Serverless&lt;/b&gt;, самая свежая модель, которая очень похожа на PaaS. Только при такой модели облако само выделяет ресурсы на основании текущей нагрузки. Все настройки и планирование ресурсов скрыто от пользователя. Ему остается только загрузить свой код, а все остальное сделает облако. Также в serverless мире обычно оперируют понятием &lt;i&gt;облачная функция&lt;/i&gt; это код, который умеет обрабатывать только одни конкретный запрос.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="max-width: 750px"&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://www.stefaniuk.website/pictures/host-apps-cloud-models.png" width="1694" height="1162" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Наглядный пример зон ответственности в разных моделях предоставления сервисов.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2&gt;Где захостить .NET бекенд?&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;AWS/Azure/GCP&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Три самых крупных облачных провайдера, очень похожи между собой и предоставляют во многом одни и те же сервисы. Так в каждом из них можно арендовать виртуальные машины, создать управляемую БД или работать с облачными функциями. Мне больше всего нравиться AWS, но для .NET приложения Azure будет более интересным, потому что это родная для дотнета среда.&lt;/p&gt;
&lt;p&gt;Больше всего нас интересую сервисы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;AWS EC2 (IaaS)&lt;/b&gt; обычные виртуальные машины. Есть маркетплейс на котором можно найти огромное множество готовых AMI образов с предустановленным софтом и нужными настройками. Например можно в один клик развернуть виртуалку с Wordpress и всем необходимым.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Azure App Service (PaaS)&lt;/b&gt; самый простой и нативный способ захостить .NET приложения. App Service сам разворачивает приложение из репозитория, настраивает все необходимое для работы и предоставляет полезные метрики.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AWS Lightsail (IaaS/PaaS)&lt;/b&gt; упрощенная версия AWS для тех кто с ним не знаком. Можно очень дешево арендовать виртуальную машину, поднять докер контейнер, развернуть БД и хранилище для файлов. Все это делается буквально в пару кликов мышкой. Первые три месяца бесплатные.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AWS Elastic Beanstalk (PaaS)&lt;/b&gt; умеет поднимать необходимые для работы приложения компоненты в AWS. По сути мы можем все это сделать руками, но Beanstalk автоматизирует всю рутину. Под капотом он представляет из себя набор разных CloudFormation скриптов, которые поднимают необходимые сервисы и настраивают их.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;DigitalOcean&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Самый простой в использовании сервис. Раньше в DO можно было арендовать только виртуальные машины, сейчас же можно создавать управляемы БД, балансировщики и т. д. На текущий момент почти все мои проекты крутяться в DigitalOcean.&lt;/p&gt;
&lt;p&gt;Нам интересны следующие сервисы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Droplets&lt;/b&gt; — виртуальная машина, есть много готовых образов на маркетплейсе под любой рантайм.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;App Platform&lt;/b&gt; — позволяет нативно запускать  приложения написанные на Python, Nodejs, Go, php или любое другое приложение в виде контейнера.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Heroku&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Честно говоря я им ни разу не пользовался, но друзья очень часто советуют. Из коробки не поддерживает .NET приложения, но вроде как есть кастомные билд паки. В основном хероку позволяет развернуть приложения на Nodejs, Go, Python и т. д. Из приятных фишек: достаточно запушить код в репозиторий, все остальное сделает Heroku.&lt;/p&gt;
&lt;p&gt;Есть бесплатный тариф, в нем приложение останавливается после пол часа без активности. Так что первые запросы к приложению могут отрабатывать немного дольше.&lt;/p&gt;
&lt;div style="max-width: 750px"&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://www.stefaniuk.website/pictures/host-apps-backend.png" width="1538" height="512" alt="" /&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2&gt;Где захостить фронтенд?&lt;/h2&gt;
&lt;p&gt;С фронтендом дела обстоят намного проще, есть огромное количество сервисов, которые позволяют бесплатно захостить фронт.&lt;/p&gt;
&lt;p&gt;Мой личный фаворит — Vercel. Бесплатный план включает такие фишки как HTTPS, автоматически деплой с репозитория, собственный домен. Также он умеет разворачивать приложение под каждый PR, что позволяет протестировать изменения до того как влить код в основную ветку.&lt;/p&gt;
&lt;p&gt;Самым же популярным сервисом является Github Pages. В нем очень просто поднять статический сайт прямо из репозитория. Бесплатный и работает сразу из коробки. В основном используется для хостинга документации к коду, блогов или резюме.&lt;/p&gt;
&lt;p&gt;App Platform от Digital Ocean я уже упоминал выше. Можно поднять три статических сайта бесплатно, последующие за 3$ в месяц. Есть автоматический деплой, бесплатный HTTPS, возможность подключения своего домена. Сейчас в нем крутиться мое онлайн резюме. Сервис прикольный тем что в нем можно запустить и бек и фронт.&lt;/p&gt;
&lt;p&gt;Последним хочу отметить AWS S3. По сути это объектное хранилище (хранилище для файлов) в котором есть встроенная поддержка сайтов. Для этого нужно загрузить HTML/CSS/JS файлы и включить соответствующую опцию в настройках бакета. Часто встречает в продакшене связку CloudFront + S3.&lt;/p&gt;
&lt;div style="max-width: 750px"&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://www.stefaniuk.website/pictures/host-apps-frontend.png" width="1524" height="298" alt="" /&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2&gt;Где развернуть базу данных?&lt;/h2&gt;
&lt;p&gt;С базами данных ситуация сложнее, в основном предлагают развернуть БД за большие деньги. Такой вариант не подходит если мы хотим захостить небольшое приложение или просто его потестировать без установки БД локально. Вот несколько из вариантов:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ElephantSQL, можно развернуть PostreSQL базу данных любого размера. Бесплатный план дает базу с 20 Мб и 5 параллельными подключениями.&lt;/li&gt;
&lt;li&gt;Mongo Atlas подойдет если нужно развернуть кластер MongoDB. Есть достаточно жирный бесплатный план.&lt;/li&gt;
&lt;li&gt;В DigitalOcean и AWS Lightsail начиная с 15 долларов в месяц можно развернуть достаточно неплохой сервер БД, который не нужно настраивать и работает из коробки. В Lightsail первые 3 месяца бесплатно.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="max-width: 750px"&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://www.stefaniuk.website/pictures/host-apps-databases.png" width="1570" height="288" alt="" /&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2&gt;Полезные ссылки&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://oblako.kz/iaas-blog/samye-populjarnye-oblachnye-servisy-v-mire"&gt;Виды облачных ресурсов&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html"&gt;Хостинг веб сайта в AWS S3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04"&gt;Отличный туториал по тому как настроить SSL сертификат на Ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
</item>

<item>
<title>Веб аналитика на коленке с помощью AWS</title>
<guid isPermaLink="false">259</guid>
<link>https://www.stefaniuk.website/all/web-analytics-with-aws-lambda/</link>
<pubDate>Wed, 04 Aug 2021 03:58:43 -0400</pubDate>
<author></author>
<comments>https://www.stefaniuk.website/all/web-analytics-with-aws-lambda/</comments>
<description>
&lt;p&gt;Время от времени нам с друзьями приходят идеи различных проектов, которые было бы круто запустить. Но чтобы убедиться в жизнеспособности идеи нужно ее как-то проверить. Обычно для этого создаётся лендинг, на который нагоняется трафик и потом в аналитике смотрим, как ведут себя пользователи.&lt;/p&gt;
&lt;p&gt;В один из таких дней мы решили проверить очередную идею. Но в этот раз пользователь мог сделать много разных действий на сайте и их нужно было как-то отследить и проанализировать.&lt;/p&gt;
&lt;p&gt;Это не какая-то уникальная проблема, обычно для таких задач берут Google Tag Manager. Но никто из нас не умел им пользоваться да и желания изучать особо не было.&lt;/p&gt;
&lt;p&gt;И тут внезапно пришла идея как это сделать. Можно взять AWS Lambda, набросать на коленке пару строк кода, которые будут получать событие и куда-то их складывать  для дальнейшего анализа. Для места хранения метрик выбрал CloudWatch. Он как раз умеет анализировать разные метрики/логи и строить красивые дашборды.&lt;/p&gt;
&lt;p&gt;Также хотелось получать письма на почту с информацией про самые важные события. Для этого взяли SNS.&lt;/p&gt;
&lt;p&gt;В итоге пользователь заходит на сайт, делает какое-то действие, оно летит в лямбду, которая просто кладет информацию в логи и отправляет сообщение в SNS. Дальше идем в CloudWatch и смотрим на дашборды и анализируем полученную информацию.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://www.stefaniuk.website/pictures/New-screenshot.png" width="2268" height="1488" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Актуальная аналитика&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;В итоге получилась относительно простая и даже гибкая аналитика, которую можно использовать сразу на нескольких проектах. Сейчас она обходиться в 0$, нам хватает одного миллиона бесплатных вызовов лямбды в месяц.&lt;/p&gt;
&lt;p&gt;Но я все же советую изучить и использовать готовые инструменты вместо того чтобы сидеть и делать свои велосипеды. Ведь это очень скользкий путь, в какой-то момент можно забыть для чего это делалось и бесконечно улучшать и допиливать, вместо того чтобы решать задачу.&lt;/p&gt;
</description>
</item>


</channel>
</rss>