{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Богдан Стефанюк: дописи з тегом дешево і сердито",
    "_rss_description": "Всім привіт! Я — Богдан, фулстек розробник з Києва. Пишу в основному про програмування та штуки які вивчаю. Час від часу публікую підбірки фоток, зроблених на плівку, розказую про подорожі та цікаві речі, що оточують мене.",
    "_rss_language": "uk",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/www.stefaniuk.website\/tags\/deshevo-i-serdito\/",
    "feed_url": "https:\/\/www.stefaniuk.website\/tags\/deshevo-i-serdito\/json\/",
    "icon": "https:\/\/www.stefaniuk.website\/pictures\/userpic\/userpic@2x.jpg?1565716580",
    "authors": [
        {
            "name": "Bohdan Stefaniuk",
            "url": "https:\/\/www.stefaniuk.website\/",
            "avatar": "https:\/\/www.stefaniuk.website\/pictures\/userpic\/userpic@2x.jpg?1565716580"
        }
    ],
    "items": [
        {
            "id": "262",
            "url": "https:\/\/www.stefaniuk.website\/all\/app-manuals-by-wordpress-and-identityserver\/",
            "title": "Онлайн документация на базе WordPress и IdentityServer",
            "content_html": "<p>Как-то раз на работе появилась задача по созданию онлайн документации для нашего приложения. Документация должна быть не технической, а в виде мануалов для пользователей.<\/p>\n<p>Одним из главных требований была авторизация пользователей с помощью текущего логина и пароля от основного приложения. Доступ к материалам должен определяться на основании текущих ролей пользователя.<\/p>\n<p>Изначально хотели использовать готовое решение в виде SaaS сервиса с которым можно интегрироваться и спокойно пользоваться. Идея самим все написать с нуля хоть и возникала, но вернуться к ней решили только в крайнем случае.<\/p>\n<p>Первым кандидатом был GitBook. У него приятный интерфейс, много опций по редактированию и оформлению текстов. Необходимый нам функционал также был, но доступен только в Enterprise версии. Цена оказалась слишком большой, пришлось искать дальше.<\/p>\n<p>Подобных сервисов и так не очень много, а с необходимыми нам фичами так вообще почти нету. В какой-то момент я даже решил попробовать что-то собрать на основе статического генератора сайтов, но получилось слишком монструозно.<\/p>\n<p><b>Wordpress<\/b><\/p>\n<p>Оставался только один вариант — написать все самим, чего очень не хотелось делать. В какой-то момент я чисто случайно вспомнил про Wordpress. Не то что бы я им раньше пользовался, но много слышал о нем.<\/p>\n<p>В итоге решили делать мануалы на базе Wordpress. Вообще, Wordpress это такая штука, с которой при должном умении можно слепить все что угодно. В нашем случае даже код не пришлось писать (почти).<\/p>\n<p>За основу взяли готовую тему и немного допилили под наши нужды с помощью CSS. Правда в одном месте пришлось немного изменить логику отображения с помощью PHP, но это была достаточно тривиальная задача.<\/p>\n<p>Весь функционал реализовали с помощью пачки плагинов. Главным среди них стал OAuth Single Sign On by miniOrange. Он позволяет логиниться в вордпесс с помощью сторонних сервисов (Google, Facebook и т. д.). Бесплатная версия покрывает почти все кейсы. На же пришлось покупать лицензию, потому что нужен был мапинг наших ролей на роли вордпреса.<\/p>\n<p>За работу с пользователями в нашем приложении отвечает IdentityServer. Сделали отдельную страницу логина для SSO чтобы получить нужную куку. Также включили флаг AlwaysIncludeUserClaimsInIdToken в настройках клиента, чтобы клеймы ролей были в ID токене и их смог увидеть Wordpress.<\/p>\n<p><b>Хостинг<\/b><\/p>\n<p>С хостингом тоже все оказалось достаточно просто. Изначально хотели использовать AWS Lightsail, но основная проблема мы в отсутствии возможности перемещать снапшоты диска между аккаунтами. В итоге развернули все на EC2 с помощью готового бесплатного решения из AWS Marketplace.<\/p>\n<p><b>Итого<\/b><\/p>\n<p>Эта задача очень показательна, она позволяет понять насколько готовые решения позволяют сэкономить время и деньги. Если писать такое приложение с нуля, то это может занять месяц работы, а также время на тестирование и отлов типичных ошибок. Ну и пользователей нужно было бы учить как всем этим пользоваться.<\/p>\n<p>В нашем случае настройка Wordpress заняла приблезительно неделю не очень активной работы. Также популярность Wordpress позволяет легко нанять человека, который сможет спокойно с ним работать.<\/p>\n<p>Ну и стоимость порадовала. Все это обошлось в ~570$, в то время как типичный SaaS сервис берез 5$ в месяц за одного пользователя. Хостинг тоже вышел не очень дорогим (~10-15$ в месяц).<\/p>\n",
            "date_published": "2021-12-22T03:55:03-04:00",
            "date_modified": "2023-06-02T20:04:57-04:00",
            "tags": [
                "інструменти",
                "дешево і сердито",
                "робота"
            ],
            "_date_published_rfc2822": "Wed, 22 Dec 2021 03:55:03 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "262",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "261",
            "url": "https:\/\/www.stefaniuk.website\/all\/where-and-how-to-host-apps\/",
            "title": "Где захостить свое приложение?",
            "content_html": "<p>Как и многие другие разработчики я часто делаю разные небольшие приложения или пет-проекты. И очень часто возникает вопрос: где захостить приложение и его компоненты и как это сделать максимально дешево?<\/p>\n<p>Я старался подобрать сервисы, которые позволяют максимально просто и дешёво запускать все необходимые для работы приложения ресурсы. В основном большинство приложений состоит из бекенда (в моем случае .NET), фронтенда и базы данных. Поэтому рассмотрим варианты развертывания каждого компонента.<\/p>\n<h2>Типы сервисов<\/h2>\n<p>Для начала стоит кратко пройтись по моделям предоставления сервисов в облаке. Эти модели описывают зоны ответственности пользователя и облачного провайдера. В разрезе данной статьи нас интересуют следующие модели:<\/p>\n<ul>\n<li><b>IaaS (Infrastructure as a Service)<\/b> — облачный провайдер предоставляет минимально необходимую инфраструктуру в виде виртуальных машин, сети и хранилища, а также отвечает за работоспособность. Дальнейшая настройка, в том числе и ОС, лежит на стороне пользователя. По сути это основные строительные блоки в облаке с помощью которых можно сделать все что захотим.<\/li>\n<li><b>PaaS (Platform as a Service)<\/b> представляет из себя готовую инфраструктуру для разработки и запуска приложений. При такой модели мы не думаем про настройку и управление серверами, операционными системами и т. д. Примером такого сервиса являются управляемые БД (managed databases). Облачный провайдер сам отвечает за правильную настройку сервера, ОС, сохранность данных, бекапах и бесперебойную работу. В основном пользователь только платит деньги и пользуется сервисом.<\/li>\n<li><b>Serverless<\/b>, самая свежая модель, которая очень похожа на PaaS. Только при такой модели облако само выделяет ресурсы на основании текущей нагрузки. Все настройки и планирование ресурсов скрыто от пользователя. Ему остается только загрузить свой код, а все остальное сделает облако. Также в serverless мире обычно оперируют понятием <i>облачная функция<\/i> это код, который умеет обрабатывать только одни конкретный запрос.<\/li>\n<\/ul>\n<div style=\"max-width: 750px\"><div class=\"e2-text-picture\">\n<img src=\"https:\/\/www.stefaniuk.website\/pictures\/host-apps-cloud-models.png\" width=\"1694\" height=\"1162\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Наглядный пример зон ответственности в разных моделях предоставления сервисов.<\/div>\n<\/div>\n<\/div><h2>Где захостить .NET бекенд?<\/h2>\n<p><b>AWS\/Azure\/GCP<\/b><\/p>\n<p>Три самых крупных облачных провайдера, очень похожи между собой и предоставляют во многом одни и те же сервисы. Так в каждом из них можно арендовать виртуальные машины, создать управляемую БД или работать с облачными функциями. Мне больше всего нравиться AWS, но для .NET приложения Azure будет более интересным, потому что это родная для дотнета среда.<\/p>\n<p>Больше всего нас интересую сервисы:<\/p>\n<ul>\n<li><b>AWS EC2 (IaaS)<\/b> обычные виртуальные машины. Есть маркетплейс на котором можно найти огромное множество готовых AMI образов с предустановленным софтом и нужными настройками. Например можно в один клик развернуть виртуалку с Wordpress и всем необходимым.<\/li>\n<li><b>Azure App Service (PaaS)<\/b> самый простой и нативный способ захостить .NET приложения. App Service сам разворачивает приложение из репозитория, настраивает все необходимое для работы и предоставляет полезные метрики.<\/li>\n<li><b>AWS Lightsail (IaaS\/PaaS)<\/b> упрощенная версия AWS для тех кто с ним не знаком. Можно очень дешево арендовать виртуальную машину, поднять докер контейнер, развернуть БД и хранилище для файлов. Все это делается буквально в пару кликов мышкой. Первые три месяца бесплатные.<\/li>\n<li><b>AWS Elastic Beanstalk (PaaS)<\/b> умеет поднимать необходимые для работы приложения компоненты в AWS. По сути мы можем все это сделать руками, но Beanstalk автоматизирует всю рутину. Под капотом он представляет из себя набор разных CloudFormation скриптов, которые поднимают необходимые сервисы и настраивают их.<\/li>\n<\/ul>\n<p><b>DigitalOcean<\/b><\/p>\n<p>Самый простой в использовании сервис. Раньше в DO можно было арендовать только виртуальные машины, сейчас же можно создавать управляемы БД, балансировщики и т. д. На текущий момент почти все мои проекты крутяться в DigitalOcean.<\/p>\n<p>Нам интересны следующие сервисы:<\/p>\n<ul>\n<li><b>Droplets<\/b> — виртуальная машина, есть много готовых образов на маркетплейсе под любой рантайм.<\/li>\n<li><b>App Platform<\/b> — позволяет нативно запускать  приложения написанные на Python, Nodejs, Go, php или любое другое приложение в виде контейнера.<\/li>\n<\/ul>\n<p><b>Heroku<\/b><\/p>\n<p>Честно говоря я им ни разу не пользовался, но друзья очень часто советуют. Из коробки не поддерживает .NET приложения, но вроде как есть кастомные билд паки. В основном хероку позволяет развернуть приложения на Nodejs, Go, Python и т. д. Из приятных фишек: достаточно запушить код в репозиторий, все остальное сделает Heroku.<\/p>\n<p>Есть бесплатный тариф, в нем приложение останавливается после пол часа без активности. Так что первые запросы к приложению могут отрабатывать немного дольше.<\/p>\n<div style=\"max-width: 750px\"><div class=\"e2-text-picture\">\n<img src=\"https:\/\/www.stefaniuk.website\/pictures\/host-apps-backend.png\" width=\"1538\" height=\"512\" alt=\"\" \/>\n<\/div>\n<\/div><h2>Где захостить фронтенд?<\/h2>\n<p>С фронтендом дела обстоят намного проще, есть огромное количество сервисов, которые позволяют бесплатно захостить фронт.<\/p>\n<p>Мой личный фаворит — Vercel. Бесплатный план включает такие фишки как HTTPS, автоматически деплой с репозитория, собственный домен. Также он умеет разворачивать приложение под каждый PR, что позволяет протестировать изменения до того как влить код в основную ветку.<\/p>\n<p>Самым же популярным сервисом является Github Pages. В нем очень просто поднять статический сайт прямо из репозитория. Бесплатный и работает сразу из коробки. В основном используется для хостинга документации к коду, блогов или резюме.<\/p>\n<p>App Platform от Digital Ocean я уже упоминал выше. Можно поднять три статических сайта бесплатно, последующие за 3$ в месяц. Есть автоматический деплой, бесплатный HTTPS, возможность подключения своего домена. Сейчас в нем крутиться мое онлайн резюме. Сервис прикольный тем что в нем можно запустить и бек и фронт.<\/p>\n<p>Последним хочу отметить AWS S3. По сути это объектное хранилище (хранилище для файлов) в котором есть встроенная поддержка сайтов. Для этого нужно загрузить HTML\/CSS\/JS файлы и включить соответствующую опцию в настройках бакета. Часто встречает в продакшене связку CloudFront + S3.<\/p>\n<div style=\"max-width: 750px\"><div class=\"e2-text-picture\">\n<img src=\"https:\/\/www.stefaniuk.website\/pictures\/host-apps-frontend.png\" width=\"1524\" height=\"298\" alt=\"\" \/>\n<\/div>\n<\/div><h2>Где развернуть базу данных?<\/h2>\n<p>С базами данных ситуация сложнее, в основном предлагают развернуть БД за большие деньги. Такой вариант не подходит если мы хотим захостить небольшое приложение или просто его потестировать без установки БД локально. Вот несколько из вариантов:<\/p>\n<ul>\n<li>ElephantSQL, можно развернуть PostreSQL базу данных любого размера. Бесплатный план дает базу с 20 Мб и 5 параллельными подключениями.<\/li>\n<li>Mongo Atlas подойдет если нужно развернуть кластер MongoDB. Есть достаточно жирный бесплатный план.<\/li>\n<li>В DigitalOcean и AWS Lightsail начиная с 15 долларов в месяц можно развернуть достаточно неплохой сервер БД, который не нужно настраивать и работает из коробки. В Lightsail первые 3 месяца бесплатно.<\/li>\n<\/ul>\n<div style=\"max-width: 750px\"><div class=\"e2-text-picture\">\n<img src=\"https:\/\/www.stefaniuk.website\/pictures\/host-apps-databases.png\" width=\"1570\" height=\"288\" alt=\"\" \/>\n<\/div>\n<\/div><h2>Полезные ссылки<\/h2>\n<ul>\n<li><a href=\"https:\/\/oblako.kz\/iaas-blog\/samye-populjarnye-oblachnye-servisy-v-mire\">Виды облачных ресурсов<\/a><\/li>\n<li><a href=\"https:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/userguide\/HostingWebsiteOnS3Setup.html\">Хостинг веб сайта в AWS S3<\/a><\/li>\n<li><a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04\">Отличный туториал по тому как настроить SSL сертификат на Ubuntu<\/a><\/li>\n<\/ul>\n",
            "date_published": "2021-12-15T04:34:45-04:00",
            "date_modified": "2023-06-02T20:06:05-04:00",
            "tags": [
                "cloud",
                "google cloud platform",
                "інструменти",
                "дешево і сердито"
            ],
            "image": "https:\/\/www.stefaniuk.website\/pictures\/host-apps-cloud-models.png",
            "_date_published_rfc2822": "Wed, 15 Dec 2021 04:34:45 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "261",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [],
                "og_images": [
                    "https:\/\/www.stefaniuk.website\/pictures\/host-apps-cloud-models.png",
                    "https:\/\/www.stefaniuk.website\/pictures\/host-apps-backend.png",
                    "https:\/\/www.stefaniuk.website\/pictures\/host-apps-frontend.png",
                    "https:\/\/www.stefaniuk.website\/pictures\/host-apps-databases.png"
                ]
            }
        },
        {
            "id": "259",
            "url": "https:\/\/www.stefaniuk.website\/all\/web-analytics-with-aws-lambda\/",
            "title": "Веб аналитика на коленке с помощью AWS",
            "content_html": "<p>Время от времени нам с друзьями приходят идеи различных проектов, которые было бы круто запустить. Но чтобы убедиться в жизнеспособности идеи нужно ее как-то проверить. Обычно для этого создаётся лендинг, на который нагоняется трафик и потом в аналитике смотрим, как ведут себя пользователи.<\/p>\n<p>В один из таких дней мы решили проверить очередную идею. Но в этот раз пользователь мог сделать много разных действий на сайте и их нужно было как-то отследить и проанализировать.<\/p>\n<p>Это не какая-то уникальная проблема, обычно для таких задач берут Google Tag Manager. Но никто из нас не умел им пользоваться да и желания изучать особо не было.<\/p>\n<p>И тут внезапно пришла идея как это сделать. Можно взять AWS Lambda, набросать на коленке пару строк кода, которые будут получать событие и куда-то их складывать  для дальнейшего анализа. Для места хранения метрик выбрал CloudWatch. Он как раз умеет анализировать разные метрики\/логи и строить красивые дашборды.<\/p>\n<p>Также хотелось получать письма на почту с информацией про самые важные события. Для этого взяли SNS.<\/p>\n<p>В итоге пользователь заходит на сайт, делает какое-то действие, оно летит в лямбду, которая просто кладет информацию в логи и отправляет сообщение в SNS. Дальше идем в CloudWatch и смотрим на дашборды и анализируем полученную информацию.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/www.stefaniuk.website\/pictures\/New-screenshot.png\" width=\"2268\" height=\"1488\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Актуальная аналитика<\/div>\n<\/div>\n<p>В итоге получилась относительно простая и даже гибкая аналитика, которую можно использовать сразу на нескольких проектах. Сейчас она обходиться в 0$, нам хватает одного миллиона бесплатных вызовов лямбды в месяц.<\/p>\n<p>Но я все же советую изучить и использовать готовые инструменты вместо того чтобы сидеть и делать свои велосипеды. Ведь это очень скользкий путь, в какой-то момент можно забыть для чего это делалось и бесконечно улучшать и допиливать, вместо того чтобы решать задачу.<\/p>\n",
            "date_published": "2021-08-04T03:58:43-04:00",
            "date_modified": "2023-06-02T20:07:04-04:00",
            "tags": [
                "cloud",
                "інструменти",
                "дешево і сердито"
            ],
            "image": "https:\/\/www.stefaniuk.website\/pictures\/New-screenshot.png",
            "_date_published_rfc2822": "Wed, 04 Aug 2021 03:58:43 -0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "259",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [],
                "og_images": [
                    "https:\/\/www.stefaniuk.website\/pictures\/New-screenshot.png"
                ]
            }
        }
    ],
    "_e2_version": 4116,
    "_e2_ua_string": "Aegea 11.2 (v4116)"
}