<?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://closed-ai.tech/</link>
<description>Андрей Садулин — заметки разработчика</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.3 (v4134)</generator>

<itunes:subtitle>Андрей Садулин — заметки разработчика</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Kiro — новая среда разработки c AI (программисты пока ещё нужны)</title>
<guid isPermaLink="false">34</guid>
<link>https://closed-ai.tech/all/kiro-novaya-sreda-razrabotki-c-ai-programmisty-poka-eschyo-nuzhn/</link>
<pubDate>Fri, 15 Aug 2025 05:09:41 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/kiro-novaya-sreda-razrabotki-c-ai-programmisty-poka-eschyo-nuzhn/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/CleanShot-2025-08-15-at-05.03.43@2x.png.jpg" width="2560" height="1487" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Участвую в бета-тестировании нового редактора от Amazon: &lt;a href="https://kiro.dev"&gt;Kiro&lt;/a&gt;. На данный момент он полностью бесплатен, и лимитов на использование ИИ-функций тоже, кстати, нет.&lt;/p&gt;
&lt;p&gt;Концепция очень похожа на широко известный Cursor —  по сути, это VS Code с дополнительными плагинами, обеспечивающими интеграцию с LLM, в случае с Kiro — это модели Claude 3.7 и 4.0 от Anthropic. Умное автодополнение, окно с чатом в режиме агента, доступ ко всей кодовой базе проекта, загрузка файлов и документации из сети — всё это мы уже видели, и работает оно ожидаемо хорошо.&lt;/p&gt;
&lt;p class="loud"&gt;Основная фишка редактора — режим планирования работы AI в 3 шага: формирование требований, написание дизайна и создание упорядоченного списка задач с зависимостями между ними.&lt;/p&gt;
&lt;p&gt;То есть, можно как обычно поставить задачу в общих чертах, и Kiro сам всё формализует, опишет user stories, нарисует структуру папок и файлов, сформирует модели и интерфейсы, и в конце даст возможность по шагам выполнять то, что он предложил, попутно корректируя его работу, если потребуется. Да, то же самое можно сделать и с помощью Cursor: так же попросить его сгенерировать документы с требованиями и планом их реализации, но Kiro специально делает ставку именно на этом подходе, максимально упрощая его и делая доступным для начинающего пользователя.&lt;/p&gt;
&lt;p&gt;И это работает. Сам процесс взаимодействия с редактором и конечный результат меня, честно говоря, очень удивили (в хорошем смысле слова): я точно знал, что ожидать от ИИ на каждом этапе, а если вдруг он всё же начинал делать что-то странное, я легко поправлял его (чаще всего прямо там, в окне чата, но пару раз всё-таки пришлось лезть в код самому, благо написан он был хорошо).&lt;/p&gt;
&lt;p&gt;Тем не менее, несмотря на все эти умные фишки, наличие опыта в программировании все-таки пока крайне желательно — уж слишком легко по-умолчанию согласиться с тем, что предлагает ИИ, и получить в итоге пусть и рабочее, но несколько уступающее в деталях и в глубине проработки решение.&lt;/p&gt;
</description>
</item>

<item>
<title>Ubuntu на VMware Fusion</title>
<guid isPermaLink="false">33</guid>
<link>https://closed-ai.tech/all/ubuntu-na-vmware-fusion/</link>
<pubDate>Mon, 11 Aug 2025 06:17:13 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/ubuntu-na-vmware-fusion/</comments>
<description>
&lt;p&gt;Попробовал поработать на виртуалке c Ubuntu 25.04, поднятой в VMware Fusion — пока что очень нравится. Хост машина у меня — MacBook на M1 Pro с 32 GB памяти, для гостевой я немного поправил базовые настройки: выделил ей 4 vCPU, 8 GB RAM, 40 GB HDD и ткнул опцию «Use full resolution for Retina display». Уже в Ubuntu выбрал разрешение экрана 4K и поднял масштабирование интерфейса до 200%. Супер. Работает быстро, визуально разве что скроллинг не такой плавный, как на Mac, ну и есть явно ощутимые задержки в выводе звука, например, с видео на YouTube. И пока почему-то не работает copy-paste ни в какую сторону даже после установки VMware Tools — пока не понятно, почему, попробую разобраться на досуге. В целом, с учетом того, что VMware Fusion официально распространяется бесплатно (хотя нынче всё-таки, видимо, придется регистрироваться на портале Broadcom — я раньше писал, что можно было скачать его напрямую по &lt;a href="https://softwareupdate.vmware.com/cds/vmw-desktop/"&gt;ссылке&lt;/a&gt; или с помощью &lt;a href="https://formulae.brew.sh/cask/vmware-fusion#default"&gt;Brew&lt;/a&gt;, но лавочку прикрыли), на текущий момент это неплохая замена платному Parallels, если вам не нужна бесшовная интеграция с MacOS.&lt;/p&gt;
</description>
</item>

<item>
<title>Небольшое напоминание про SSL-сертификаты</title>
<guid isPermaLink="false">32</guid>
<link>https://closed-ai.tech/all/nebolshoe-napominanie-pro-ssl-sertifikaty/</link>
<pubDate>Thu, 07 Aug 2025 01:59:23 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/nebolshoe-napominanie-pro-ssl-sertifikaty/</comments>
<description>
&lt;p&gt;На самом деле, здесь можно было бы просто оставить &lt;a href="https://www.cloudflare.com/learning/ssl/types-of-ssl-certificates/"&gt;вот эту статью&lt;/a&gt; в качестве ликбеза, но если интересны детали, то кратко: на сайте суда Советского района г. Нижнего Новгорода, доступного по адресу &lt;a href="https://sovetsky.nnov.sudrf.ru"&gt;https://sovetsky.nnov.sudrf.ru&lt;/a&gt; , установлен wildcard-сертификат с Common Name (CN) &lt;tt&gt;*.sudrf.ru&lt;/tt&gt; и двумя Subject Alternative Name (SAN): &lt;tt&gt;sudrf.ru&lt;/tt&gt; и &lt;tt&gt;*.sudrf.ru&lt;/tt&gt;. Наверное, подразумевалось, что он будет применяться как для основного домена, так и для всех его поддоменов, но, к сожалению, это так не работает, потому что &lt;b&gt;для субдоменов второго уровня и выше уже необходим Multi-Domain SSL Certificate (MDC)&lt;/b&gt;, который обычно требует доп. проверку организации. &lt;i&gt;В общем, надо чинить, а то пользователи теряются — сегодня как раз так и случилось.&lt;/i&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>Таиланд 🇹🇭 Сингапур 🇸🇬 Малайзия 🇲🇾</title>
<guid isPermaLink="false">31</guid>
<link>https://closed-ai.tech/all/tailand-singapur-malayziya/</link>
<pubDate>Mon, 26 May 2025 04:00:04 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/tailand-singapur-malayziya/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20250323114351.jpg" width="2560" height="1920" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20250325101504.jpg" width="2560" height="1920" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20250331162556.jpg" width="2560" height="1920" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20250403114204.jpg" width="2560" height="1920" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20250403114604.jpg" width="2560" height="1920" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20250403122715.jpg" width="2560" height="1920" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20250404143650.jpg" width="1920" height="2560" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20250404203422.jpg" width="2560" height="1920" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20250406180928.jpg" width="2560" height="1920" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20250407161410.jpg" width="1920" height="2560" alt="" /&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>29</title>
<guid isPermaLink="false">28</guid>
<link>https://closed-ai.tech/all/29/</link>
<pubDate>Wed, 20 Nov 2024 04:14:16 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/29/</comments>
<description>
&lt;p&gt;Сегодня мне 29 лет. Захотелось поделиться тем, как прошел этот год, и немного подумать о том, как провести следующий.&lt;/p&gt;
&lt;p&gt;Итак, за прошедшие 366 дней я:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Много работал, стал руководителем небольшой группы разработчиков, линейным и нанимающим менеджером, увеличил свой доход.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Уволил сотрудника. Занимался наймом, проводил много интервью, придумывал тестовые задания для кандидатов. Получил пару интересных предложений трудоустройства в российские компании с ростом как в зарплате, так и в уровне ответственности, но сознательно отклонил их, отдав предпочтение развитию компетенций на своем текущем месте работы. К слову, в прошлом году я был сотрудником своей компании уже восьмой год подряд.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Летом курировал работу стажеров, придумал им классную задачу и довёл её до конца, получив отличные отзывы от коллег на защите проекта.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20240828180951.jpg" width="2560" height="1920" alt="" /&gt;
&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Дважды съездил в отпуск с девушкой: во Вьетнам и в Азербайджан. Во Вьетнаме жил в шикарном отеле, в номере с балконом и видом на море, без толп отдыхающих, без детей, аниматоров и дискотек по ночам. Попробовал свежий дуриан (тот самый фрукт с противоречивым ароматом), посетил местный аква- и зоопарк, много гулял по Нячангу, ездил в тур по стране на бывшем военном УАЗике, купался под водопадом, ел свежеприготовленных на костре креветок, прошел путь монаха внутри каменного дракона.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20240324163309.jpg" width="1920" height="2560" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20240321114316.jpg" width="2560" height="1920" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20240322130531.jpg" width="2560" height="1920" alt="" /&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;В Азербайджане мы были на свадьбе друга, но успели и погулять по старому Баку, и посетить музей Гейдара Алиева, и прекрасно поужинать в ресторане Аркадия Новикова, и даже пожить один день в прекрасном отеле на берегу Каспийского моря, несколько раз с удовольствием там же искупавшись.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20240816163700.jpg" width="2560" height="1920" alt="" /&gt;
&lt;/div&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Избавился от вредных привычек. Больше не пью пиво вечером (иногда разве что безалкогольное), почти не употребляю мучного и сладкого (хотя, если честно, с последним пока ещё есть проблемы: мне очень нравится местный зефир), не курю.&lt;/li&gt;
&lt;li&gt;Пережил 2 землетрясения магнитудой в 5-6 баллов каждое.&lt;/li&gt;
&lt;li&gt;Сделал себе вот этот блог, где могу делиться своим опытом, мыслями и интересными находками без каких-либо функциональных ограничений социальных сетей.&lt;/li&gt;
&lt;li&gt;Немного катался на сноуборде, но под конец горнолыжного сезона, к сожалению, бросил — очень хотелось приобрести свой собственный комплект экипировки, и в процессе езды у меня редко получалось уверенно менять кант с переднего на задний, что закономерно приводило к падениям.&lt;/li&gt;
&lt;li&gt;Совсем не катался на мотоцикле — в предыдущих выездах сильно уставал от низкой посадки на KTM 350 Freeride, а Yamaha 450 была для меня слишком тяжелой и неповоротливой. Недавно появилась возможность взять в аренду новенькие Husqvarna 350 — надеюсь, на них будет комфортнее.&lt;/li&gt;
&lt;li&gt;Много занимался в спортзале. Тренировки стали для меня отличным способом избавиться от стресса, обрести уверенность в себе, стать сильнее и выносливее. На сегодняшний день я вежу 112 кг при росте 203 см, мой присед со штангой — 120 кг, жим от груди лежа на горизонтальной скамье — 90 кг, становая тяга — 120 кг (всё на 1 повторение). Очень доволен результатами, однако, определённо ещё есть, к чему стремиться. В двух упражнениях рубеж в 100 кг был преодолён как раз в прошлом году.&lt;/li&gt;
&lt;li&gt;Так и не получил водительское удостоверение, не купил машину и мотоцикл.&lt;/li&gt;
&lt;li&gt;Не доделал своё мобильное приложение, не прошел курс по 3D-моделированию.&lt;/li&gt;
&lt;li&gt;Не прочитал подаренную мне книжку, не прошел видеоигры, которые хотел, постоянно откладывал просмотр интересных мне фильмов.&lt;/li&gt;
&lt;li&gt;Мне отказали в визе в Италию и, соответственно, я не поехал в командировку.&lt;/li&gt;
&lt;li&gt;Оформил наконец-то военный билет.&lt;/li&gt;
&lt;li&gt;Посетил несколько летних open-air музыкальных фестивалей, концерт любимой группы, дегустацию вина и ужин от шеф-повара со звездой Мишлен в ресторане в горах.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/IMG20240620204802.jpg" width="1920" height="2560" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Вот. Надеюсь, через год список будет длиннее, а писать я его буду не с горьким сожалением об окончательно прошедшей молодости, а с приятным предвкушением того, что принесет мне новая страница моей истории. &lt;i&gt;И писать желательно где-нибудь, где подают «Секс на пляже». &lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Ну что, за работу?&lt;/p&gt;
</description>
</item>

<item>
<title>Surf Coffee Propaganda Machine №100 — Joe Lemenovsky tribute ✨</title>
<guid isPermaLink="false">25</guid>
<link>https://closed-ai.tech/all/surf-coffee-propaganda-machine-100-joe-lemenovsky-tribute/</link>
<pubDate>Wed, 11 Sep 2024 12:56:42 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/surf-coffee-propaganda-machine-100-joe-lemenovsky-tribute/</comments>
<description>
&lt;iframe width="100%" height="166" scrolling="no" frameborder="no" allow="autoplay" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/1866974208&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true"&gt;&lt;/iframe&gt;
&lt;div style="font-size: 10px; color: #cccccc;line-break: anywhere;word-break: normal;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; font-family: Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif;font-weight: 100;"&gt;&lt;p&gt;&lt;a href="https://soundcloud.com/scpmrecords" title="Propaganda Machine by Surf Coffee ®" target="_blank" style="color: #cccccc; text-decoration: none;"&gt;Propaganda Machine by Surf Coffee ®&lt;/a&gt; · &lt;a href="https://soundcloud.com/scpmrecords/peace-division-vol100-by-scpm-records" title="Peace Division Vol.100 By SCPM Records" target="_blank" style="color: #cccccc; text-decoration: none;"&gt;Peace Division Vol.100 By SCPM Records&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Удобно, что embedded-трек с Soundcloud можно перематывать без регистрации, но в этом конкретном случае я советую слушать от начала и до самого конца.&lt;/p&gt;
</description>
</item>

<item>
<title>Непопулярное мнение</title>
<guid isPermaLink="false">23</guid>
<link>https://closed-ai.tech/all/nepopulyarnoe-mnenie/</link>
<pubDate>Tue, 03 Sep 2024 00:02:17 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/nepopulyarnoe-mnenie/</comments>
<description>
&lt;p&gt;После того, как в России &lt;s&gt;заблокировали&lt;/s&gt; замедлили YouTube, я присмотрелся к его альтернативам, и обнаружил с удивлением, что на RUTUBE есть множество классных фильмов с отличным качеством картинки и звука, в том числе и зарубежные новинки 2023 и -24-х годов: «Индиана Джонс и Колесо Судьбы», «Головоломка 2», «Трансформеры — Восхождение Звероботов» &lt;i&gt;(вот он, кстати, отвратительный!)&lt;/i&gt;, «Наполеон» и др. Мой папа любит сериалы по вселенной «Звездных Войн» — пожалуйста: «Мандалорец», «Книга Бобы Фетта» — всё доступно.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/CleanShot-2024-09-02-at-23.58.19@2x.png.jpg" width="2560" height="1461" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Работает всё, кстати, довольно неторопливо, но видео «не тормозит». И рекомендации, конечно, так себе.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;А вот чего я там не нашел — так это фильмов и сериалов, каким-либо образом аффилированных с Кинопоиском (например, «Беспринципные», или новый «Майор Гром: Игра»): Яндекс за авторские права может и спросить, в отличие от зарубежных дистрибьюторов 😁&lt;/p&gt;
&lt;p&gt;Если не принимать во внимание этический и юридический аспекты такого «пиратства» , то в сухом остатке для конечного пользователя мы имеем большой плюс в отсутствии необходимости смотреть тот же самый контент на сомнительных сайтах с рекламой букмекеров и казино &lt;i&gt;(уверен, вы хотя бы раз на такой точно заходили и понимаете, о чем я)&lt;/i&gt; или искать его на торрент-трекерах. Естественно, о полноценной замене YouTube речи не идет, но, как говорится, нет худа без добра.&lt;/p&gt;
</description>
</item>

<item>
<title>Про плохие интерфейсы</title>
<guid isPermaLink="false">19</guid>
<link>https://closed-ai.tech/all/pro-plohie-interfeysy/</link>
<pubDate>Thu, 20 Jun 2024 16:26:54 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/pro-plohie-interfeysy/</comments>
<description>
&lt;p&gt;...и про то, как делать так, чтобы они были хорошими. Крайне интересное выступление &lt;a href="https://ilyabirman.ru/"&gt;Ильи Бирмана&lt;/a&gt; на прошедшей в июне конференции &lt;a href="https://events.yandex.ru/events/ya-love-frontend-2024"&gt;YFF&lt;/a&gt;, рекомендую к просмотру.&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/KWSaJJsDvtw?enablejsapi=1" allow="autoplay" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>Cloudflare: HTTPS и SSL</title>
<guid isPermaLink="false">18</guid>
<link>https://closed-ai.tech/all/cloudflare-https-i-ssl/</link>
<pubDate>Tue, 28 May 2024 23:10:48 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/cloudflare-https-i-ssl/</comments>
<description>
&lt;p&gt;Итак, у вас есть домен, который вы перенесли в Cloudflare. Сразу же после его добавления и настройки на платформе к нему автоматически выдаются два SSL-сертификата: основной и запасной, с разными Certificate Authority — Let’s Encrypt, Sectigo, Google Trust Services. Время жизни сертификатов — 3 месяца, после — автопродление. Удобно.&lt;/p&gt;
&lt;p&gt;Вот, как это выглядит:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/CleanShot-2024-05-28-at-21.57.37@2x.png.jpg" width="2560" height="1672" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Обратите внимание, что это &lt;b&gt;Edge Certificates&lt;/b&gt;. Поскольку платформа по-умолчанию проксирует трафик на сайт через себя, эти «пограничные» сертификаты используются &lt;b&gt;только на участке «пользователь — Cloudflare»&lt;/b&gt;. Там же можно включить настройку «Always use HTTPS», и ожидаемо получить автоматические редиректы — но только всё на том же участке! Трафик от Cloudflare до сервера будет передаваться без шифрования!&lt;/p&gt;
&lt;p&gt;Обновив страницу блога, я получил несколько ошибок в консоли вида &lt;a href="https://developers.cloudflare.com/ssl/troubleshooting/mixed-content-errors/." class="nu"&gt;«&lt;u&gt;Mixed content: request has been blocked&lt;/u&gt;»&lt;/a&gt; — падали асинхронные запросы, инициированные где-то в JavaScript. Также не работало сохранение записей и некоторые редиректы — видимо, всё по той же причине 😭&lt;/p&gt;
&lt;p&gt;Опытным путем я понял, что надо бы шифровать весь трафик E2E, а для этого нам понадобится &lt;b&gt;Origin Certificate&lt;/b&gt; — как раз-таки тот, который отвечает за оставшийся путь от Cloudflare до сервера (в моем случае до Nginx).&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/CleanShot-2024-05-28-at-22.44.07@2x.png.jpg" width="2560" height="1672" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Да, его действительно можно получить на 15 (!) лет&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Нажав на кнопку «Create», мы получим, по сути, две строки: сам сертификат и приватный ключ для него. Для добавления их в Nginx Proxy Manager, я сохранил их как файлы и импортировал так, как показано на втором снимке в галерее ниже:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="2560" data-ratio="1.5311004784689"&gt;
&lt;img src="https://closed-ai.tech/pictures/CleanShot-2024-05-28-at-22.51.14@2x.png.jpg" width="2560" height="1672" alt="" /&gt;
&lt;img src="https://closed-ai.tech/pictures/CleanShot-2024-05-28-at-22.53.04@2x.png.jpg" width="2560" height="1672" alt="" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Отлично, осталось только подключить полное шифрование в Cloudflare...&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/CleanShot-2024-05-28-at-23.04.00@2x.png.jpg" width="2560" height="1657" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;...и проверить, что всё прекрасно работает.&lt;/p&gt;
</description>
</item>

<item>
<title>Обновление инфраструктуры</title>
<guid isPermaLink="false">17</guid>
<link>https://closed-ai.tech/all/obnovlenie-infrastruktury/</link>
<pubDate>Tue, 28 May 2024 04:58:32 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/obnovlenie-infrastruktury/</comments>
<description>
&lt;p&gt;Сегодня хочу рассказать про то, как я подключил платформу &lt;b&gt;Cloudflare&lt;/b&gt; для обеспечения безопасного доступа к сервисным приложениям, которыми я пользуюсь для управления этим сайтом.&lt;/p&gt;
&lt;h3&gt;Начало&lt;/h3&gt;
&lt;p&gt;Кратко про архитектуру: «под капотом» здесь VPS c Ubuntu 22.04, веб-сервер и база данных запускаются в Docker-контейнерах, для их удобного администрирования я использую &lt;a href="https://docs.portainer.io/v/2.20"&gt;Portainer&lt;/a&gt;. Также здесь установлен &lt;a href="https://nginxproxymanager.com/"&gt;Nginx Proxy Manager&lt;/a&gt; (тоже в контейнере), который перенаправляет трафик с www на основной домен, обеспечивает подключение по HTTPS, проверяет подлинность домена, и т. д. В качестве удобного интерфейса для конфигурации сервера и доступа к терминалу я выбрал &lt;a href="https://cockpit-project.org/"&gt;Cockpit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Поскольку все эти инструменты — веб-приложения, доступные публично (мне хотелось иметь возможность подключаться с любого устройства), необходимо было по-максимуму &lt;b&gt;защитить их от несанкционированного доступа&lt;/b&gt;. Да, у них у всех по-умолчанию есть формы авторизации, но проверка там однофакторная, по логину и паролю — они хоть и длинные, но все равно могут быть скомпрометированы путем фишинга или подбора. Также вполне возможно появление уязвимостей и эксплойтов для них, позволяющих, в теории, каким-то образом обойти защиту. В общем, хотелось бы что-то понадежнее, в идеале — вообще не давать случайному пользователю доступ к этим сервисам.&lt;/p&gt;
&lt;h3&gt;Подключаем Cloudflare&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/"&gt;Zero Trust Tunnel&lt;/a&gt; позволяет связать субдомен и внутренний адрес на host-машине с установленным приложением-коннектором (его, кстати, тоже можно развернуть в контейнере). Не нужно открывать порты или отключать firewall, т. к. коннектор поднимает egress-соединение с облаком, и самое крутое — через панель управления Cloudflare можно также &lt;b&gt;задать правила доступа&lt;/b&gt; к ресурсу и &lt;b&gt;подключить дополнительный фактор аутентификации&lt;/b&gt;, например, отправку одноразового кода на почту или вход через Google-аккаунт.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/network-diagram_hu35c98d3bbf0ecf738b5b543af7009e44_79161_2296x1101_resize_q75_box_3-fe1feb83.png.jpg" width="2560" height="1427" alt="" /&gt;
&lt;/div&gt;
&lt;p class="lead"&gt;То есть, можно буквально в два клика открыть доступ по HTTPS к &lt;tt&gt;localhost:9090&lt;/tt&gt; через &lt;tt&gt;private-service.my-site.com&lt;/tt&gt; для тех, кто введет правильный email из whitelist’а и укажет верный код, отправленный в письме.&lt;/p&gt;
&lt;p&gt;Красота! ❤️&lt;/p&gt;
&lt;p&gt;Вот, как это выглядит в панели управления Cloudflare: на каждый «приватный» сервис я создал отдельный туннель. Обратите внимание на адреса — контейнер с коннектором &lt;tt&gt;cloudflared&lt;/tt&gt; я добавил в bridge-сеть в Docker, которую создал вручную. Благодаря этому, во-первых, работает DNS, и можно обращаться к контейнерам по имени, а также легко можно получить доступ к host, указав Default Gateway.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/CleanShot-2024-05-28-at-01.52.08@2x.png.jpg" width="2560" height="1722" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Добавим policy с группой доступа по-умолчанию — у меня это «разрешить любому пользователю с email из списка получать одноразовый код на почту». Настраивать можно как угодно: работает фильтрация по странам, по IP-адресам, можно проверять токены и т. д.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="2560" data-ratio="1.3897937024973"&gt;
&lt;img src="https://closed-ai.tech/pictures/CleanShot-2024-05-28-at-15.51.20@2x.png.jpg" width="2560" height="1842" alt="" /&gt;
&lt;img src="https://closed-ai.tech/pictures/CleanShot-2024-05-28-at-15.51.49@2x.png.jpg" width="2560" height="1842" alt="" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Теперь при попытке обратиться к туннелю по public hostname, откроется форма авторизации. Выглядит она вот так, и её, кстати, можно настроить — добавить свой логотип, поменять цвет фона, написать какой-нибудь текст, добавить подсказки для входа.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="2560" data-ratio="1.4997070884593"&gt;
&lt;img src="https://closed-ai.tech/pictures/CleanShot-2024-05-28-at-03.57.53@2x.png.jpg" width="2560" height="1707" alt="" /&gt;
&lt;img src="https://closed-ai.tech/pictures/CleanShot-2024-05-28-at-04.38.08@2x.png.jpg" width="2560" height="1722" alt="" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;На всякий случай повторюсь — если введенного адреса нет в whitelist, код просто не придет.&lt;/p&gt;
&lt;p&gt;А ещё можно создать «приложения» и добавить их на главный экран — он называется App Launcher. Естественно, он тоже доступен только для авторизованных пользователей.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://closed-ai.tech/pictures/CleanShot-2024-05-28-at-01.47.32@2x.png.jpg" width="2560" height="1722" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Отмечу, что работает это всё только с доменами, перенесенными в Cloudflare или изначально приобретенными у них. Мой был куплен в reg.ru, перенос занял минут 15, ничего сложного.&lt;/p&gt;
&lt;h3&gt;Сколько стоит?&lt;/h3&gt;
&lt;p&gt;Весь описанный выше функционал &lt;b&gt;абсолютно бесплатен&lt;/b&gt;, как и кэширование, защита от DDOS, и куча разных дополнительных виртуальных сетевых функций, но нужно привязать карточку. Наверное, единственный минус, который я могу выделить — Cloudflare функционально довольно перегружен: много дашбордов, панелей, настроек; но, благо, есть хорошая документация.&lt;/p&gt;
&lt;h3&gt;P. S.&lt;/h3&gt;
&lt;p&gt;В Cloudflare можно автоматически добавить SSL-сертификат и настроить редиректы с HTTP на HTTPS — об этом читайте &lt;a href="/all/cloudflare-https-i-ssl/"&gt;в следующей заметке&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Большое спасибо Михаилу Щербине за консультации.&lt;/p&gt;
</description>
</item>

<item>
<title>Все новое — это хорошо забытое старое</title>
<guid isPermaLink="false">13</guid>
<link>https://closed-ai.tech/2024/05/20/1/</link>
<pubDate>Mon, 20 May 2024 00:40:41 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/2024/05/20/1/</comments>
<description>
&lt;p&gt;На прошлой неделе вышло переиздание игры Braid 2009 года: добавили новые уровни, улучшили музыкальное сопровождение, перерисовали визуальную часть, появился раздел с комментариями разработчиков. Кто пропустил — крайне рекомендую попробовать! &lt;b&gt;Braid: Anniversary Edition&lt;/b&gt; доступна на всех цифровых площадках, включая Steam и Google Play (&lt;i&gt;на 4PDA можно найти версию для Android без привязки к подписке Netflix&lt;/i&gt;).&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/U738YZG1k1I?enablejsapi=1" allow="autoplay" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/YLxoIGG1-qM?enablejsapi=1" allow="autoplay" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>Не поднимался тот, кто не падал</title>
<guid isPermaLink="false">10</guid>
<link>https://closed-ai.tech/all/ne-podnimalsya-tot-kto-ne-padal/</link>
<pubDate>Sun, 12 May 2024 02:49:56 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/ne-podnimalsya-tot-kto-ne-padal/</comments>
<description>
&lt;p&gt;... и это я о wildcard-сертификате. Да, всё заработало.&lt;/p&gt;
&lt;p&gt;Оказалось, что у reg.ru в личном кабинете &lt;b&gt;нужно задать список IP-адресов&lt;/b&gt; (или сразу подсеть), с которых разрешается обращение к их API. Указав IP своей машины, я попробовал получить сертификат ещё раз — и запрос упал с Gateway Time-out.&lt;/p&gt;
&lt;p&gt;Что ж, попробуем ещё раз — результат тот же.&lt;/p&gt;
&lt;p&gt;ОК, у Nginx Proxy Manager есть параметр «Propagation seconds». Увеличив его в 2.5 раза, я снова словил таймаут, полез в логи посмотреть — &lt;b&gt;и оказалось, что всё сработало!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Настройки nginx получились примерно следующие:&lt;/p&gt;
&lt;p&gt;🔎 &lt;tt&gt;www.[domain]&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;tt&gt;301&lt;/tt&gt; ➡️ &lt;tt&gt;&lt;b&gt;&lt;s&gt;www.&lt;/s&gt;&lt;/b&gt;[domain]&lt;/tt&gt; (wildcard-сертификат)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;🔎 &lt;tt&gt;[domain]&lt;/tt&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;принудительный переход на SSL ➡️ &lt;tt&gt;&lt;b&gt;https&lt;/b&gt; + [domain]&lt;/tt&gt; (отдельный сертификат под &lt;tt&gt;[domain]&lt;/tt&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Нет, в принципе, можно было бы обойтись и без wildcard-сертификата, просто это добавляет дополнительный шаг при создании очередного субдомена.&lt;/p&gt;
&lt;p&gt;P. S. У cloud.ru потрясающая техподдержка. Если кому-то нужна бесплатная виртуальная машина на linux — наверное, это один из лучших вариантов на данный момент: &lt;a href="https://cloud.ru/ru/free-tier"&gt;тык&lt;/a&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>Несколько случайных фотографий</title>
<guid isPermaLink="false">7</guid>
<link>https://closed-ai.tech/all/neskolko-sluchaynyh-fotografiy/</link>
<pubDate>Fri, 10 May 2024 21:28:14 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/neskolko-sluchaynyh-fotografiy/</comments>
<description>
&lt;p&gt;Галерею можно листать&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="2560" data-ratio="1.3333333333333"&gt;
&lt;img src="https://closed-ai.tech/pictures/20180904_175303_HDR.jpg" width="2560" height="1920" alt="" /&gt;
&lt;img src="https://closed-ai.tech/pictures/20190130_083114_HDR.jpg" width="2560" height="1920" alt="" /&gt;
&lt;img src="https://closed-ai.tech/pictures/20220529_093557.jpg" width="2560" height="1920" alt="" /&gt;
&lt;img src="https://closed-ai.tech/pictures/20210611_224957.jpg" width="2560" height="1920" alt="" /&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>Про деньги</title>
<guid isPermaLink="false">5</guid>
<link>https://closed-ai.tech/all/pro-dengi/</link>
<pubDate>Fri, 10 May 2024 05:12:16 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/pro-dengi/</comments>
<description>
&lt;p&gt;Что мне особенно нравится — всё это удовольствие (сервер, IP, домен, SSL-сертификат, artifactory для Docker-образов) стоит всего&lt;/p&gt;
&lt;p class="loud"&gt;147 рублей в месяц* &lt;br/&gt;&lt;span style="font-size: 20px;"&gt;+ 119 рублей за домен на год&lt;/span&gt;&lt;/p&gt;
&lt;p class="foot"&gt;* и первые 2 месяца бесплатно&lt;/p&gt;
</description>
</item>

<item>
<title>Ночной nu-disco ✨</title>
<guid isPermaLink="false">4</guid>
<link>https://closed-ai.tech/all/nochnoy-nu-disco/</link>
<pubDate>Fri, 10 May 2024 05:03:11 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/nochnoy-nu-disco/</comments>
<description>
&lt;div class="e2-text-audio"&gt;
&lt;div class="e2-text-super-wrapper e2-jouele-wrapper"&gt;&lt;a class="jouele" data-space-control="true" data-length="4380" href="https://closed-ai.tech/audio/Discolicious_vol.5.mp3"&gt;Discolicious_vol.5.mp3&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
18:30... самый сочный дроп&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;p class="foot"&gt;но слушать, конечно, надо полностью&lt;/p&gt;
</description>
</item>

<item>
<title>О платформе</title>
<guid isPermaLink="false">3</guid>
<link>https://closed-ai.tech/all/pro-dvizhok/</link>
<pubDate>Fri, 10 May 2024 04:45:46 +0500</pubDate>
<author></author>
<comments>https://closed-ai.tech/all/pro-dvizhok/</comments>
<description>
&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/vrcXLs_PhVA?enablejsapi=1" allow="autoplay" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;div class="e2-text-caption"&gt;Интересный доклад Ильи о том, как много всего там скрыто «под капотом»&lt;/div&gt;
&lt;/div&gt;
</description>
</item>


</channel>
</rss>