<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ЗАМЕТКИ on kamorka.dev — код, свои сервисы, камчатка</title><link>https://kamorka.dev/notes/</link><description>Recent content in ЗАМЕТКИ on kamorka.dev — код, свои сервисы, камчатка</description><generator>Hugo</generator><language>ru-ru</language><lastBuildDate>Sun, 12 Apr 2026 22:14:00 +0300</lastBuildDate><atom:link href="https://kamorka.dev/notes/index.xml" rel="self" type="application/rss+xml"/><item><title>Запуск Stardew Valley на Ayn Odin 3</title><link>https://kamorka.dev/notes/gamenative-stardewvalley-ayn-odin3/</link><pubDate>Sun, 12 Apr 2026 22:14:00 +0300</pubDate><guid>https://kamorka.dev/notes/gamenative-stardewvalley-ayn-odin3/</guid><description>&lt;h2 id="старт"&gt;Старт&lt;/h2&gt;
&lt;p&gt;Установите GameNative из официального &lt;a href="https://github.com/utkarshdalal/GameNative/releases"&gt;GitHub-репозитория&lt;/a&gt; или воспользуйтесь &lt;a href="https://github.com/ImranR98/Obtainium"&gt;Obtainium&lt;/a&gt; для автоматизации установки и обновления приложений из GitHub.&lt;/p&gt;
&lt;p&gt;В приложении подключитесь к своей библиотеке Steam и дождитесь завершения синхронизации. Затем выберите Stardew Valley и установите игру.&lt;/p&gt;
&lt;h2 id="установка-библиотек"&gt;Установка библиотек&lt;/h2&gt;
&lt;p&gt;Чтобы настроить контейнер эмуляции, нажмите на игру в библиотеке, а затем на значок ⚙️. В меню выберите &lt;strong&gt;Open container&lt;/strong&gt; и дождитесь запуска виртуального рабочего стола.&lt;/p&gt;
&lt;p&gt;Внутри виртуальной системы выполните следующие шаги:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Откройте &lt;strong&gt;Start -&amp;gt; System Tools -&amp;gt; Wine Mono Installer&lt;/strong&gt;. Дождитесь загрузки и установки.&lt;/li&gt;
&lt;li&gt;Откройте &lt;strong&gt;Start -&amp;gt; System Tools -&amp;gt; Wine Configuration&lt;/strong&gt; и перейдите на вкладку &lt;strong&gt;Libraries&lt;/strong&gt;.&lt;br&gt;
В выпадающем списке &lt;strong&gt;New overrides for library&lt;/strong&gt; выберите &lt;code&gt;icu&lt;/code&gt;. После добавления найдите &lt;code&gt;icu&lt;/code&gt; в списке &lt;strong&gt;Existing Overrides&lt;/strong&gt; и выберите &lt;strong&gt;Edit -&amp;gt; Native (Windows)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="настройка-эмуляции"&gt;Настройка эмуляции&lt;/h2&gt;
&lt;p&gt;В приложении GameNative нажмите на игру в библиотеке, а затем на значок ⚙️. В меню выберите &lt;strong&gt;Edit container&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Настройка эмуляторов игр на Android</title><link>https://kamorka.dev/notes/retrogaming-android-guide/</link><pubDate>Thu, 05 Feb 2026 15:30:00 +0300</pubDate><guid>https://kamorka.dev/notes/retrogaming-android-guide/</guid><description>&lt;p&gt;На основе &lt;a href="https://docs.google.com/document/d/1rEoKwH-aexVqtTTrGxIbs-X5KWlld8ZHvBE44N1EXmA/edit?usp=sharing"&gt;оригинального гайда от Jelsa&lt;/a&gt;
Редактор: Ex0&lt;/p&gt;
&lt;h2 id="1-лончеры"&gt;1. Лончеры&lt;/h2&gt;
&lt;h3 id="11-es-de-emulationstation-desktop-edition"&gt;1.1 ES-DE (EmulationStation Desktop Edition)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Разработчик:&lt;/strong&gt; Leon Styhre и команда&lt;br&gt;
&lt;strong&gt;Статус:&lt;/strong&gt; Платный на Android (официально через Patreon), бесплатный на ПК.&lt;br&gt;
&lt;strong&gt;Официальный ресурс:&lt;/strong&gt; &lt;a href="https://es-de.org/"&gt;es-de.org&lt;/a&gt; | &lt;a href="https://gitlab.com/es-de/emulationstation-de"&gt;GitLab&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ES-DE — это прямой порт легендарной EmulationStation (известной пользователям Raspberry Pi / RetroPie / Batocera) на Android. Это мощный комбайн, который делает из устройства полноценную игровую станцию.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Основные фичи:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Мощнейшая система тем:&lt;/strong&gt; Поддерживает темы от &amp;ldquo;взрослой&amp;rdquo; EmulationStation. Можно полностью менять внешний вид (сетки, карусели, списки, видео-фоны, звуки навигации).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Desktop-структура:&lt;/strong&gt; Интерфейс идентичен пк-версии. Это дает ощущение «настоящей консоли».&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Продвинутый скрейпинг:&lt;/strong&gt; Использует ScreenScraper и TheGamesDB. Поддерживает загрузку огромного количества медиа: 3D-коробки, логотипы (marquees), мануалы (PDF), видео, картриджи и т.д.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;miximages:&lt;/strong&gt; Умеет генерировать составные изображения (коробка + скриншот + логотип) для красивого отображения.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Кастомизация систем:&lt;/strong&gt; Через редактирование файлов &lt;code&gt;es_systems.xml&lt;/code&gt; можно добавить любую, даже самую экзотическую систему или Android-приложение как игру.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Мультиплатформенность:&lt;/strong&gt; Если вы настроили ES-DE на ПК, вы будете чувствовать себя как дома на Android.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Плюсы (на основе отзывов 4PDA):&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Настройка консоли Ayaneo Pocket Air Mini</title><link>https://kamorka.dev/notes/retrogaming-ayaneo-pocket-air-mini/</link><pubDate>Thu, 05 Feb 2026 15:00:00 +0300</pubDate><guid>https://kamorka.dev/notes/retrogaming-ayaneo-pocket-air-mini/</guid><description>&lt;p&gt;На основе &lt;a href="https://docs.google.com/document/d/1S0QBdMiNwObZyGf-Qoxz1Az7IO3s7_3gPO_QLTkEEKs/edit?usp=sharing"&gt;оригинального гайда от Jelsa&lt;/a&gt;
Редактор: Ex0&lt;/p&gt;
&lt;h2 id="1-первое-включение-устройства"&gt;1. Первое включение устройства&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ На консоль наклеены две защитные пленки, снимайте верхний слой очень аккуратно, чтобы случайно не удалить оба сразу&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="11-первый-экран"&gt;1.1 Первый экран&lt;/h3&gt;
&lt;p&gt;Нажмите &lt;code&gt;Start&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="12-подключение-к-интернету"&gt;1.2 Подключение к интернету&lt;/h3&gt;
&lt;p&gt;Подключитесь к интернету через домашний Wi-Fi или к телефону, если на нём включена раздача интернета. Рекомендуется использовать Wi-Fi на частоте 5 ГГц, так как он работает быстрее.&lt;/p&gt;
&lt;h3 id="13-перенос-данных"&gt;1.3 Перенос данных&lt;/h3&gt;
&lt;p&gt;Устройство предложит скопировать данные со старого. Так как это первое включение и перенос данных не требуется, нажмите &lt;code&gt;Don’t copy&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Установка Kinopub на ТВ Samsung</title><link>https://kamorka.dev/notes/install-kinopub-on-samsung-tizen/</link><pubDate>Sun, 08 Oct 2023 01:00:00 +0300</pubDate><guid>https://kamorka.dev/notes/install-kinopub-on-samsung-tizen/</guid><description>&lt;p&gt;Для установки необходим Tizen Studio, один из самых запутанных инструментов с которым когда-либо приходилось сталкиваться. Качаем с &lt;a href="https://developer.tizen.org/ko/development/tizen-studio/download?langredirect=1"&gt;оф.сайта&lt;/a&gt;.
Затем нужно будет установить несколько модулей через Package Manager:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Main SDK -&amp;gt; Tizen SDK Tools -&amp;gt; Certificate Manager&lt;/li&gt;
&lt;li&gt;Extensions SDK -&amp;gt; Extras -&amp;gt; TV Extensions-7.0
Чтобы загрузить приложение, нам нужно перевести ТВ в Developer Mode и создать сертификаты.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="developer-mode"&gt;Developer Mode&lt;/h3&gt;
&lt;p&gt;Включение осуществляется в меню Apps и набором &amp;ldquo;12345&amp;rdquo; с пульта, там же надо указать IP-адрес машины с которой будем подключаться. После этого пробуем через Device Manager на компе найти и подключиться к ТВ.&lt;/p&gt;</description></item><item><title>Удобное размаскирование пакетов в Gentoo</title><link>https://kamorka.dev/notes/gentoo-package-unmask/</link><pubDate>Mon, 27 Mar 2023 22:24:00 +0300</pubDate><guid>https://kamorka.dev/notes/gentoo-package-unmask/</guid><description>&lt;p&gt;В Gentoo часто приходится взаимодействовать с различные версиями файлов и иногда они &lt;a href="https://wiki.gentoo.org/wiki/Handbook:X86/Full/Working/ru#.D0.97.D0.B0.D0.BC.D0.B0.D1.81.D0.BA.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.BD.D1.8B.D0.B5_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D1.8B"&gt;замаскированы по ~ARCH флагу&lt;/a&gt;. Чтобы быстро размаскировать и хранить эти данные в понятной структуре предлагаю такой скрипт&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Проверка аргументов&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$#&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -lt &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$#&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -gt &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Использование: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; &amp;lt;полное имя пакета&amp;gt; [версия]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PKG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CATEGORY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$PKG&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; cut -d/ -f1&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ACCEPT_KEYWORDS_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/etc/portage/package.accept_keywords&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Создание каталога, если он еще не существует&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ACCEPT_KEYWORDS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Создание файла для категории, если он еще не существует&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CATEGORY_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ACCEPT_KEYWORDS_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CATEGORY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -f &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CATEGORY_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo touch &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CATEGORY_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Добавление пакета в файл категории с указанием версии, если она была передана&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$VERSION&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PKG&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; ~amd64&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CATEGORY_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PKG&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; ~amd64&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CATEGORY_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Обновление мира с учетом размаскированного пакета&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo emerge -avuDN @world
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Таким образом размаскированный пакет будет сохранен в /etc/portage/package.accept_keywords/&amp;lt;категория пакета&amp;gt;.&lt;/p&gt;</description></item><item><title>Установка Gentoo. Короткая инструкция</title><link>https://kamorka.dev/notes/gentoo-install/</link><pubDate>Sun, 26 Mar 2023 22:24:00 +0300</pubDate><guid>https://kamorka.dev/notes/gentoo-install/</guid><description>&lt;h2 id="0-разбивка-диска"&gt;0. Разбивка диска&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;EFI System Partition (ESP) - для хранения загрузчика и файлов EFI.&lt;/li&gt;
&lt;li&gt;Swap-раздел - для подкачки и использования в качестве дополнительной памяти, если оперативная память будет исчерпана.&lt;/li&gt;
&lt;li&gt;Корневой раздел - для хранения основных системных файлов и программ.&lt;/li&gt;
&lt;li&gt;/home раздел - для хранения пользовательских данных и настроек.
Пример разбивки на основном диске /dev/sda:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda1 - 512M - EFI System Partition &lt;span class="o"&gt;(&lt;/span&gt;ESP&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda2 - 8G - Linux swap
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda3 - 50G - Linux filesystem &lt;span class="o"&gt;(&lt;/span&gt;ext4&lt;span class="o"&gt;)&lt;/span&gt; - корневой раздел /
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda4 - оставшееся пространство - Linux filesystem &lt;span class="o"&gt;(&lt;/span&gt;ext4&lt;span class="o"&gt;)&lt;/span&gt; - раздел /home
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Выполните разбивку диска с помощью утилиты gdisk или parted:&lt;/p&gt;</description></item><item><title>Настройка OpenVPN на Debian</title><link>https://kamorka.dev/notes/debian-openvpn/</link><pubDate>Sun, 12 Mar 2023 16:08:00 +0300</pubDate><guid>https://kamorka.dev/notes/debian-openvpn/</guid><description>&lt;h2 id="подготовка"&gt;Подготовка&lt;/h2&gt;
&lt;p&gt;Устанавливаем пакет openvpn&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install openvpn -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Делаем симлинк на каталог с переменными и настройками easy-rsa&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ln -s /usr/share/easy-rsa /etc/openvpn/easy-rsa
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;И настраиваем переменные в каталоге &lt;code&gt;/etc/openvpn/easy-rsa/vars&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;KEY_COUNTRY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;RU&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;KEY_PROVINCE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Moscow&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;KEY_CITY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Moscow&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;KEY_ORG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;MySiteCompay&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;KEY_EMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;admin@custom.domain&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;KEY_CN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;DOMAIN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;KEY_OU&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;DOMAIN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;KEY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;openvpn-custom.domain&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;KEY_ALTNAMES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;openvpn-server&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Запускаем скрипт&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ . ./vars
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="настройка-сервера"&gt;Настройка сервера&lt;/h2&gt;
&lt;h3 id="генерация-сертификатов"&gt;Генерация сертификатов&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://habr.com/ru/post/655135/"&gt;PKI&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./easyrsa init-pki
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://firstssl.ru/faq/general-questions/chto-takoe-kornevoi-sertificat"&gt;CA&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./easyrsa build-ca
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ключ для протокола &lt;a href="https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange"&gt;Diffie–Hellman&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./easyrsa gen-dh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Генерируем сертификат сервера&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./easyrsa gen-req server nopass
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./easyrsa sign-req server server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Для повышение безопасности, можно запустить без параметра &lt;code&gt;nopass&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Настройка journalctl</title><link>https://kamorka.dev/notes/journalctl-config/</link><pubDate>Tue, 07 Feb 2023 23:35:00 +0300</pubDate><guid>https://kamorka.dev/notes/journalctl-config/</guid><description>&lt;h2 id="проверяем-используемое-пространство"&gt;Проверяем используемое пространство&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;journalctl --disk-usage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Так же, можем проверить консистентность логов&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;journalctl --verify
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="настройка"&gt;Настройка&lt;/h2&gt;
&lt;p&gt;Меняем параметры в файле &lt;code&gt;/etc/systemd/journald.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Storage&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;volatile &lt;span class="c1"&gt;# сохраняем логи только в память; так же можно использовать auto&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SystemMaxUse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;200M
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SystemKeepFree&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1G 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SystemMaxFileSize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50M
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SystemMaxFiles&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Удаляем файлы логов&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo rm -rf /var/log/journal
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;И перезагружаемся&lt;/p&gt;
&lt;h2 id="extra"&gt;Extra&lt;/h2&gt;
&lt;p&gt;Для анализа логов загрузки можно использовать
&lt;code&gt;systemd-analyze&lt;/code&gt;
и вывод в виде графика
&lt;code&gt;systemd-analyze plot &amp;gt; plot.svg&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Сборка плеера Deadbeef на Raspberry Pi</title><link>https://kamorka.dev/notes/deadbeef-on-raspberry/</link><pubDate>Mon, 12 Dec 2022 23:35:00 +0300</pubDate><guid>https://kamorka.dev/notes/deadbeef-on-raspberry/</guid><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;Эта заметка - переработанный материал от пользователя &lt;a href="https://forums.raspberrypi.com/memberlist.php?mode=viewprofile&amp;amp;u=259378&amp;amp;sid=95d177ec642b710881a6cbf469fbe8c8"&gt;deh&lt;/a&gt; c &lt;a href="https://forums.raspberrypi.com/viewtopic.php?t=51448"&gt;форума&lt;/a&gt; про Raspberry Pi.&lt;/p&gt;
&lt;h2 id="установка-зависимостей"&gt;Установка зависимостей&lt;/h2&gt;
&lt;p&gt;Для рантайма надо поставить пакеты&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install build-essentials clang libasound2-dev libpulse-dev libmad0-dev libwavpack-dev libsndfile1-dev libcdio-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;libcddb2-dev automake libtool libsamplerate0-dev libgtk2.0-dev libavformat-dev libcurl4-gnutls-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;libdbus-1-dev libfaad-dev intltool libimlib2-dev libzip-dev autopoint libgtkglext1-dev libjansson-dev libdispatch-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="сборка-и-установка-плеера"&gt;Сборка и установка плеера&lt;/h2&gt;
&lt;p&gt;Генерируем установочные файлы&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;./autogen.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;и запускаем конфигуратор. Посмотреть дополнительные опции можно по ключу &lt;code&gt;--help&lt;/code&gt;, я отключил поддержку gtk3 и last.fm&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CC=clang CXX=clang++ ./configure --disable-gtk3 --disable-lfm
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;и финальный шаг&lt;/p&gt;</description></item><item><title>Делаем Django на Go (ну почти)</title><link>https://kamorka.dev/notes/django-on-go/</link><pubDate>Sat, 19 Nov 2022 23:35:00 +0300</pubDate><guid>https://kamorka.dev/notes/django-on-go/</guid><description>&lt;h1 id="intro"&gt;Intro&lt;/h1&gt;
&lt;p&gt;Go - классный язык программирования у которого есть все шансы обеспечить конкуренцию Python. Но, до недавнего времени писать сервисы на нем было отдельным страданием т.к. язык &amp;ldquo;молодой&amp;rdquo; и еще не оброс всякими фреймворками. Сейчас же ситуация изменилась в лучшую сторону и можно сделать шустрый rest-backend с относительно небольшими временными затратами.&lt;/p&gt;
&lt;h1 id="придумаем-себе-проблему"&gt;Придумаем себе проблему&lt;/h1&gt;
&lt;p&gt;Чтобы показать насколько нынешний Go подходит для создания rest-приложений, можно сконцентрироваться на решении задачи - бекенд для блога. Которая в достаточной степени раскроет возможности языка и отдельных библиотек. Что нам нужно? Очевидно, нужна абстракция над моделями данных, в идеале - ORM. Затем нужна библиотека которая будет обслуживать ввод/вывод данных по REST + поддержка аутентификации (мидлварей). Итак, приступим&lt;/p&gt;</description></item><item><title>Сравнение VPS. REG.ru vs Fenix</title><link>https://kamorka.dev/notes/cheap-vps-fenix/</link><pubDate>Wed, 10 Aug 2022 18:40:00 +0300</pubDate><guid>https://kamorka.dev/notes/cheap-vps-fenix/</guid><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;В одном небезызвестном журнале наткнулся на промо-статью, про нового хостинг провайдера - &lt;a href="https://fenix.host/"&gt;fenix.host&lt;/a&gt;. И так там хорошо про него было расписано, что пошел зарегаться и занес денег.
Условия и правда очень вкусные, например, конфигурация 8CPU/16Gb RAM/192Gb Disk стоит всего 1736 рублей в месяц. Надо сказать, что на большинстве других провайдеров такой конфиг стоил бы (минимум) в пару раз дороже. Потому сразу закралось подозрение, что что-то тут не так и в общем-то, так оно и оказалось :)&lt;/p&gt;</description></item><item><title>Настройка Nextcloud на Synology DS220+</title><link>https://kamorka.dev/notes/own-cloud/</link><pubDate>Sun, 24 Jul 2022 23:15:00 +0300</pubDate><guid>https://kamorka.dev/notes/own-cloud/</guid><description>&lt;h1 id="прежде-чем-начать"&gt;Прежде чем начать&lt;/h1&gt;
&lt;p&gt;Сразу расскажу, что у меня так и не получилось подружить HEIF (формат фото на iOS) с Nextcloud, самый рабочий способ - конвертация в JPEG. Кроме того, Nextcloud при всех своих фичах очень плохо подходит как замена iCloud, просто потому, что там больше вычислительных мощностей и синхронизация между устройствами Apple нормально работает только с облаком Apple. В общем-то, после месяца тестов и осознание того, что при моих паттернах использования, на устройствах с iOS, получаешь больше проблем чем профита, забил и вернулся в iCloud. А для шеринга фоточек (а-ля Instagram) выбрал &lt;a href="https://piwigo.org"&gt;Piwigo&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Безопасная среда ч.3. Настройка Nginx</title><link>https://kamorka.dev/notes/secure-nginx/</link><pubDate>Tue, 05 Apr 2022 14:11:53 +0300</pubDate><guid>https://kamorka.dev/notes/secure-nginx/</guid><description>&lt;p&gt;Один из важных аспектов настройки VPS и сервисов внутри является правильная настройка web-сервера (в нашем случа Nginx), так чтобы он обеспечивал безопасное соединение и не позволял злоумышленникам получить доступ туда куда им не следует. В этой заметке распишу настройку ssl с получением сертификатов, настройку современных шифров и немного хаков, чтобы снизить риски DDoS и прочих атак.&lt;/p&gt;
&lt;h3 id="получаем-сертификаты"&gt;Получаем сертификаты&lt;/h3&gt;
&lt;p&gt;Прежде всего для правильной работы SSL нам нужен сертификат, который можно получить через сервис &lt;a href="https://letsencrypt.org/ru/"&gt;Let&amp;rsquo;s Encrypt&lt;/a&gt;. Для этого надо установить утилиту certbot и плагин для работы с Nginx&lt;/p&gt;</description></item><item><title>Безопасная среда ч.2. Хранение паролей</title><link>https://kamorka.dev/notes/secure-workspace-passwords/</link><pubDate>Mon, 04 Apr 2022 18:46:21 +0300</pubDate><guid>https://kamorka.dev/notes/secure-workspace-passwords/</guid><description>&lt;p&gt;Как показывает практика, придумать один пароль и использовать его для всех сайтов &lt;a href="https://cybernews.com/security/rockyou2021-alltime-largest-password-compilation-leaked/"&gt;довольно плохая затея&lt;/a&gt; т.к. компрометация одного сервиса ведет к компрометации остальных использующих этот пароль. Например, &lt;a href="https://habr.com/ru/news/t/653647/"&gt;утечка данных из службы доставки&lt;/a&gt; может привести к потере почтового ящика. Потому, сейчас, в современные браузеры внедряется плагин который проверяет сохранённые пароли не только на наличие в слитых базах, но и на уникальность. Однако, с растущим количеством онлайн-сервисов хранить все уникальные пароли в голове попросту невозможно (не в ущерб уникальности), потому имеет смысл использовать специальные приложения для хранения.
Хранилище паролей должно отвечать следующим критериям:&lt;/p&gt;</description></item><item><title>Безопасная среда ч.1. Настройка VPS</title><link>https://kamorka.dev/notes/secure-workspace-vps/</link><pubDate>Mon, 04 Apr 2022 13:29:21 +0300</pubDate><guid>https://kamorka.dev/notes/secure-workspace-vps/</guid><description>&lt;p&gt;В последнее время разрабатывать код стало не так безопасно как раньше. Некоторые критичные сервисы перестают работать или изгоняют пользователей по какому-то признаку. В статье постараюсь рассказать как сделать свою разработку максимально автономной и при этом не потерять в комфорте.
Сразу отмечу, что не разделяю идею поднять все-все на локалхосте, хотя в мире с dockerом, это вполне реально.&lt;/p&gt;
&lt;p&gt;Для доступа к своим данным «откуда угодно» предлагаю поднять VPS. Хостингов много, но я остановился на reg.ru. Если кому-то нужна машина за пределами РФ, то рекомендую посмотреть в сторону &lt;a href="https://inferno.name/"&gt;Inferno Solutions&lt;/a&gt;, оплату Миром принимают.&lt;/p&gt;</description></item><item><title>FastApi + NGINX</title><link>https://kamorka.dev/notes/fastapi-nginx-example/</link><pubDate>Fri, 26 Mar 2021 20:27:53 +0300</pubDate><guid>https://kamorka.dev/notes/fastapi-nginx-example/</guid><description>&lt;h3 id="mainpy"&gt;main.py&lt;/h3&gt;
&lt;p&gt;Простой скрипт которые возвращает hello world&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello world&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="supervisor"&gt;Supervisor&lt;/h3&gt;
&lt;p&gt;Для &amp;ldquo;демонизации&amp;rdquo; api-сервера (нужен uvicorn) использую &lt;strong&gt;Supervisor&lt;/strong&gt; который очень прост в настройке&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;[fcgi-program:uvicorn-stripe]
socket=unix:///tmp/app.sock
socket_mode=777
command=/&amp;lt;path-to-workdir&amp;gt;/venv/bin/uvicorn --fd 0 main:app
directory=/&amp;lt;path-to-workdir&amp;gt;/
numprocs=1
process_name=uvicorn-stripe-%(process_num)d
stderr_logfile=/var/log/uvicorn-stripe.err.log
stdout_logfile=/var/log/uvicorn-stripe.out.log
autostart=true
autorestart=true
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="настройки-nginx"&gt;Настройки Nginx&lt;/h3&gt;
&lt;p&gt;И, завершающий этап - конфигурация web-сервера.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="s"&gt;unix:///tmp/app.sock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;example.com&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$http_host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="nv"&gt;$connection_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_redirect&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_buffering&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Подпишись на &lt;a href="https://t.me/hnarxiv"&gt;мой канал в Телеграм&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Загрузка Kali Linux из ugrub</title><link>https://kamorka.dev/notes/kali-linux-ugrub/</link><pubDate>Mon, 01 Feb 2021 12:33:21 +0300</pubDate><guid>https://kamorka.dev/notes/kali-linux-ugrub/</guid><description>&lt;p&gt;Для корректной загрузки Kali Linux с ISO надо прописать в конфиг ugrub (grub.cfg)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Kali Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;menuentry &lt;span class="s2"&gt;&amp;#34;Kali Linux Live ISO&amp;#34;&lt;/span&gt; --class kali --class linux &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;(hd0,1)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;isofile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/iso/kali-linux-2020.4-live-amd64.iso&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; search --set -f &lt;span class="nv"&gt;$isofile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; loopback loop &lt;span class="nv"&gt;$isofile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; linux &lt;span class="o"&gt;(&lt;/span&gt;loop&lt;span class="o"&gt;)&lt;/span&gt;/live/vmlinuz &lt;span class="nv"&gt;findiso&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$isofile&lt;/span&gt; &lt;span class="nv"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;live quiet splash vt.global_cursor_default&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nv"&gt;loglevel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; rd.systemd.show_status&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; rd.udev.log-priority&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;sysrq_always_enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;cow_spacesize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1G &lt;span class="nv"&gt;noconfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sudo &lt;span class="nv"&gt;hostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kali noswap noautomount
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; initrd &lt;span class="o"&gt;(&lt;/span&gt;loop&lt;span class="o"&gt;)&lt;/span&gt;/live/initrd.img
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Подпишись на &lt;a href="https://t.me/hnarxiv"&gt;мой канал в Телеграм&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>