<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>КББ</title><subtitle>Ёмко об IT, фото, фильмах, книгах, музыке, играх и гик-культуре</subtitle><author><name>КББ</name></author><id>https://teletype.in/atom/beaverclan</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/beaverclan?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@beaverclan?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=beaverclan"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/beaverclan?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-06-15T03:05:00.163Z</updated><entry><id>beaverclan:blogontimewebs3</id><link rel="alternate" type="text/html" href="https://teletype.in/@beaverclan/blogontimewebs3?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=beaverclan"></link><title>Хостинг Hugo-блога на S3 Timeweb</title><published>2026-06-13T00:15:01.472Z</published><updated>2026-06-13T00:15:01.472Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/de/76/de76d744-9a6b-4441-8ca2-03b88d336bc6.png"></media:thumbnail><category term="blog" label="Blog"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/f0/c6/f0c67423-5f38-43cf-bcf2-2c5a7e93c49d.png&quot;&gt;Долгое время мой блог жил на VDS — nginx, certbot, systemd-сервисы, бекапы, короче полноценный сервер. В какой-то момент стало лень следить за ещё одной машиной и особенно меня подтолкнули проблемы с разными хостингами и я решил переехать на статический S3-хостинг.</summary><content type="html">
  &lt;figure id=&quot;foTe&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f0/c6/f0c67423-5f38-43cf-bcf2-2c5a7e93c49d.png&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;kp5T&quot;&gt;Долгое время мой блог жил на VDS — nginx, certbot, systemd-сервисы, бекапы, короче полноценный сервер. В какой-то момент стало лень следить за ещё одной машиной и особенно меня подтолкнули проблемы с разными хостингами и я решил переехать на статический S3-хостинг.&lt;/p&gt;
  &lt;p id=&quot;f9Kc&quot;&gt;Пост про то — как я переехал, с какими граблями столкнулся и что в итоге получилось.&lt;/p&gt;
  &lt;h2 id=&quot;почему-timeweb-s3&quot;&gt;Почему Timeweb S3&lt;/h2&gt;
  &lt;p id=&quot;iZHc&quot;&gt;Почему именно Timeweb, а не Яндекс Облако или Selectel? Тут всё просто: у меня уже были там аккаунты, а S3 у них стоит копейки. Для статики — идеально.&lt;/p&gt;
  &lt;p id=&quot;fKiz&quot;&gt;Из коробки Timeweb S3 умеет раздавать статический сайт, выдаёт URL вида &lt;code&gt;*.website.twcstorage.ru&lt;/code&gt;, поддерживает кастомные заголовки и политики.&lt;/p&gt;
  &lt;h2 id=&quot;что-нужно&quot;&gt;Что нужно&lt;/h2&gt;
  &lt;ul id=&quot;qJS4&quot;&gt;
    &lt;li id=&quot;7FQr&quot;&gt;Аккаунт в Timeweb (уже был)&lt;/li&gt;
    &lt;li id=&quot;MEAR&quot;&gt;Hugo&lt;/li&gt;
    &lt;li id=&quot;fRuO&quot;&gt;Репозиторий блога на GitHub (уже был)&lt;/li&gt;
    &lt;li id=&quot;WjTf&quot;&gt;Домен (уже был)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;шаг-1-создание-бакета&quot;&gt;Шаг 1: Создание бакета&lt;/h2&gt;
  &lt;ol id=&quot;4pHe&quot;&gt;
    &lt;li id=&quot;MN1U&quot;&gt;Заходим в панель Timeweb → S3 → Создать бакет&lt;/li&gt;
    &lt;li id=&quot;LL1P&quot;&gt;Выбираем регион, имя бакета&lt;/li&gt;
    &lt;li id=&quot;Mqk0&quot;&gt;После создания открываем бакет → Настройки → Хостинг статического сайта → Включаем&lt;/li&gt;
    &lt;li id=&quot;3ZPg&quot;&gt;Получаем URL: &lt;code&gt;https://&amp;lt;id&amp;gt;.website.twcstorage.ru&lt;/code&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;шаг-2-s3-ключи&quot;&gt;Шаг 2: S3-ключи&lt;/h2&gt;
  &lt;p id=&quot;ImNG&quot;&gt;В панели Timeweb идём в сервисные аккаунты → создаём ключ с доступом к бакету (на запись и чтение). Нам понадобятся:&lt;/p&gt;
  &lt;ul id=&quot;zcdA&quot;&gt;
    &lt;li id=&quot;VP5n&quot;&gt;&lt;code&gt;AWS_ACCESS_KEY_ID&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;MK2D&quot;&gt;&lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;snl7&quot;&gt;&lt;code&gt;AWS_ENDPOINT_URL&lt;/code&gt; — &lt;code&gt;https://s3.twcstorage.ru&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;PKhx&quot;&gt;И имя бакета&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;шаг-3-github-actions&quot;&gt;Шаг 3: GitHub Actions&lt;/h2&gt;
  &lt;p id=&quot;lfMF&quot;&gt;Деплой настроил через GitHub Actions. Workflow выглядит так:&lt;/p&gt;
  &lt;pre id=&quot;9uie&quot;&gt;name: Deploy blog to S3

on:
  push:
    branches: [main]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: peaceiris/actions-hugo@v3
        with:
          extended: true

      - run: hugo --gc

      - uses: jakejarvis/s3-sync-action@master
        with:
          args: --delete
        env:
          AWS_S3_BUCKET: ${{ secrets.AWS_BUCKET_NAME }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_ENDPOINT_URL: ${{ secrets.AWS_ENDPOINT_URL }}
&lt;/pre&gt;
  &lt;p id=&quot;HyxA&quot;&gt;Секреты (&lt;code&gt;AWS_*&lt;/code&gt;) храню в настройках репозитория GitHub — Settings → Secrets and variables → Actions.&lt;/p&gt;
  &lt;h2 id=&quot;шаг-4-деплой&quot;&gt;Шаг 4: Деплой&lt;/h2&gt;
  &lt;p id=&quot;fh1C&quot;&gt;Пушим в main:&lt;/p&gt;
  &lt;pre id=&quot;1vJW&quot;&gt;git push origin main
&lt;/pre&gt;
  &lt;p id=&quot;aGH9&quot;&gt;GitHub Actions собирает сайт и синхронизирует с бакетом. Всё, сайт на S3, никаких ssh и ручных заливок.&lt;/p&gt;
  &lt;h2 id=&quot;шаг-5-домены-не-так-всё-просто&quot;&gt;Шаг 5: Домены (не так всё просто)&lt;/h2&gt;
  &lt;p id=&quot;g7dg&quot;&gt;Настраиваем CNAME в DNS:&lt;/p&gt;
  &lt;pre id=&quot;AAlh&quot;&gt;blog.tatarinovms.ru → s3.twcstorage.ru
blog.tatarinovms.space → s3.twcstorage.ru
&lt;/pre&gt;
  &lt;p id=&quot;N0ZI&quot;&gt;Ждём, пока DNS обновится, открываем браузер… и получаем &lt;code&gt;AccessDenied&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;подводный-камень-кастомные-домены-не-работают&quot;&gt;Подводный камень: кастомные домены не работают&lt;/h3&gt;
  &lt;p id=&quot;B8Uu&quot;&gt;Как оказалось, Timeweb S3 &lt;a href=&quot;https://timeweb.cloud/docs/s3-storage/supported-features/static-websites#ogranicheniya&quot; target=&quot;_blank&quot;&gt;не поддерживает кастомные домены&lt;/a&gt;. Вообще. Только их &lt;code&gt;*.website.twcstorage.ru&lt;/code&gt;. На момент написания поста ответ поддержки это подтвердил.&lt;/p&gt;
  &lt;p id=&quot;YhcL&quot;&gt;Есть два пути:&lt;/p&gt;
  &lt;p id=&quot;1Bix&quot;&gt;&lt;strong&gt;Вариант 1: CloudFlare&lt;/strong&gt; Меняем NS на CloudFlare, он проксирует запросы на S3-эндпоинт и выдаёт свой SSL. VDS не нужен. Бесплатно. Но мы знаем как в некоторых регионах работает CloudFlare, скажем мягко - с перебоями.&lt;/p&gt;
  &lt;p id=&quot;FMwK&quot;&gt;&lt;strong&gt;Вариант 2: nginx reverse proxy&lt;/strong&gt; Пришла простая идея, так как есть в загашнике VDS, то мы ставим nginx на VDS, он проксирует кастомные домены на S3 URL. SSL через certbot. VDS всё равно есть под другие задачи. Конфиг nginx:&lt;/p&gt;
  &lt;pre id=&quot;WmqL&quot;&gt;server {
    listen 80 default_server;
    server_name blog.tatarinovms.ru blog.tatarinovms.space;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name blog.tatarinovms.ru blog.tatarinovms.space;

    ssl_certificate /etc/letsencrypt/live/blog.tatarinovms.space/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.tatarinovms.space/privkey.pem;

    location / {
        proxy_pass https://id.website.twcstorage.ru;
        proxy_ssl_verify off;
        proxy_ssl_server_name on;
        proxy_set_header Host id.website.twcstorage.ru;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
&lt;/pre&gt;
  &lt;p id=&quot;FouX&quot;&gt;SSL получил через certbot:&lt;/p&gt;
  &lt;pre id=&quot;6kJP&quot;&gt;certbot --nginx -d blog.tatarinovms.ru -d blog.tatarinovms.space
&lt;/pre&gt;
  &lt;h2 id=&quot;итоговая-схема&quot;&gt;Итоговая схема&lt;/h2&gt;
  &lt;pre id=&quot;NmyK&quot;&gt;Пуш в main → GitHub Actions → Hugo build → aws s3 sync → S3 бакет → DNS: blog.tatarinovms.ru / blog.tatarinovms.space → A → VDS → nginx reverse proxy → S3 (*.website.twcstorage.ru)
&lt;/pre&gt;
  &lt;p id=&quot;8g5B&quot;&gt;При пуше в main GitHub Actions сам собирает Hugo и синхронизирует с S3 — nginx просто проксирует то, что уже лежит в бакете. Редеплой занимает меньше минуты.&lt;/p&gt;
  &lt;p id=&quot;jUw3&quot;&gt;Timeweb S3 как хостинг статики — отличное решение. Но с кастомными доменами придётся извернуться. Надеюсь, когда-нибудь они добавят эту возможность, но пока — nginx.&lt;/p&gt;

</content></entry><entry><id>beaverclan:finetune</id><link rel="alternate" type="text/html" href="https://teletype.in/@beaverclan/finetune?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=beaverclan"></link><title>FineTune — бесплатный аудио-микшер для macOS</title><published>2026-05-28T16:03:17.976Z</published><updated>2026-05-28T16:03:17.976Z</updated><summary type="html">&lt;img src=&quot;https://blog.tatarinovms.space/images/posts/finetune/logo.webp&quot;&gt;FineTune — это бесплатная open-source утилита для macOS, которая живёт в меню-баре и даёт полный контроль над аудио на системном уровне. Регулировка громкости каждого приложения независимо, маршрутизация звука на разные устройства, 10-полосный эквалайзер и коррекция АЧХ для наушников — всё в одном окне.</summary><content type="html">
  &lt;figure id=&quot;x4gH&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/finetune/logo.webp&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;что-такое-finetune&quot;&gt;Что такое FineTune?&lt;/h2&gt;
  &lt;p id=&quot;HB1K&quot;&gt;FineTune — это бесплатная open-source утилита для macOS, которая живёт в меню-баре и даёт полный контроль над аудио на системном уровне. Регулировка громкости каждого приложения независимо, маршрутизация звука на разные устройства, 10-полосный эквалайзер и коррекция АЧХ для наушников — всё в одном окне.&lt;/p&gt;
  &lt;p id=&quot;9piW&quot;&gt;Для перехвата аудиопотоков FineTune создаёт виртуальное аудиоустройство. Оно появляется в системных настройках звука и работает как прослойка между приложениями и вашими колонками/наушниками.&lt;/p&gt;
  &lt;p id=&quot;c6RU&quot;&gt;Написан на SwiftUI, требует macOS 15.0+.&lt;/p&gt;
  &lt;h2 id=&quot;основные-возможности&quot;&gt;Основные возможности&lt;/h2&gt;
  &lt;h3 id=&quot;управление-громкостью&quot;&gt;Управление громкостью&lt;/h3&gt;
  &lt;ul id=&quot;XUet&quot;&gt;
    &lt;li id=&quot;mqq7&quot;&gt;&lt;strong&gt;Per-app громкость&lt;/strong&gt; — отдельный слайдер и mute для каждого приложения&lt;/li&gt;
    &lt;li id=&quot;f3op&quot;&gt;&lt;strong&gt;Pinned apps&lt;/strong&gt; — закрепить приложение в меню-баре, даже когда оно не воспроизводит звук (удобно настроить EQ и маршрутизацию заранее)&lt;/li&gt;
    &lt;li id=&quot;Ubss&quot;&gt;&lt;strong&gt;Ignore apps&lt;/strong&gt; — полностью исключить приложение из управления FineTune&lt;/li&gt;
    &lt;li id=&quot;VzXt&quot;&gt;&lt;strong&gt;Scroll-wheel&lt;/strong&gt; — наведите курсор на любой слайдер и крутите колёсико&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;горячие-клавиши&quot;&gt;Горячие клавиши&lt;/h3&gt;
  &lt;ul id=&quot;UFfO&quot;&gt;
    &lt;li id=&quot;LXwg&quot;&gt;&lt;strong&gt;Глобальные хоткеи&lt;/strong&gt; — назначьте свои комбинации на App Volume Up/Down и Mute. Работают даже когда приложение свёрнуто&lt;/li&gt;
    &lt;li id=&quot;3DdG&quot;&gt;&lt;strong&gt;Toggle Popup&lt;/strong&gt; — повесьте хоткей на открытие/закрытие окна FineTune, работает из полноэкранных приложений&lt;/li&gt;
    &lt;li id=&quot;G9CD&quot;&gt;&lt;strong&gt;Навигация внутри попапа&lt;/strong&gt; — стрелки &lt;code&gt;↑↓&lt;/code&gt; между строками, &lt;code&gt;←→&lt;/code&gt; регулировка громкости, &lt;code&gt;M&lt;/code&gt;mute, &lt;code&gt;Return/Space&lt;/code&gt; активация, &lt;code&gt;Tab&lt;/code&gt; переключение вкладок устройств&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;маршрутизация&quot;&gt;Маршрутизация&lt;/h3&gt;
  &lt;ul id=&quot;ulU3&quot;&gt;
    &lt;li id=&quot;4T2Q&quot;&gt;&lt;strong&gt;Multi-device output&lt;/strong&gt; — вывод звука на несколько устройств одновременно&lt;/li&gt;
    &lt;li id=&quot;MqmG&quot;&gt;&lt;strong&gt;Audio routing&lt;/strong&gt; — отправлять разные приложения на разные устройства&lt;/li&gt;
    &lt;li id=&quot;5tvL&quot;&gt;&lt;strong&gt;Device priority&lt;/strong&gt; — автопереключение при подключении нового устройства&lt;/li&gt;
    &lt;li id=&quot;hetq&quot;&gt;&lt;strong&gt;Auto-restore&lt;/strong&gt; — при переподключении устройства настройки (громкость, маршрут, EQ) восстанавливаются автоматически&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;эквалайзер&quot;&gt;Эквалайзер&lt;/h3&gt;
  &lt;ul id=&quot;XRNY&quot;&gt;
    &lt;li id=&quot;8x5C&quot;&gt;&lt;strong&gt;10 полос&lt;/strong&gt;, 20 готовых пресетов&lt;/li&gt;
    &lt;li id=&quot;ppow&quot;&gt;&lt;strong&gt;Пользовательские пресеты&lt;/strong&gt; — сохраняйте свои настройки и применяйте к разным приложениям&lt;/li&gt;
    &lt;li id=&quot;Cwzm&quot;&gt;&lt;strong&gt;AutoEQ headphone correction&lt;/strong&gt; — коррекция АЧХ под конкретную модель наушников из базы AutoEQ (тысячи профилей). Можно импортировать свои ParametricEQ.txt&lt;/li&gt;
    &lt;li id=&quot;b1f4&quot;&gt;&lt;strong&gt;Загрузка пресета&lt;/strong&gt; — выбрав пресет для своих наушников, FineTune запоминает его и применяет автоматически при каждом подключении этой модели&lt;/li&gt;
    &lt;li id=&quot;eutN&quot;&gt;&lt;strong&gt;Loudness compensation&lt;/strong&gt; — автоматическая коррекция низких и высоких частот на малой громкости по стандарту ISO 226:2023&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;системное&quot;&gt;Системное&lt;/h3&gt;
  &lt;ul id=&quot;YOCS&quot;&gt;
    &lt;li id=&quot;qoSj&quot;&gt;&lt;strong&gt;Input device control&lt;/strong&gt; — уровень микрофона&lt;/li&gt;
    &lt;li id=&quot;HUp6&quot;&gt;&lt;strong&gt;Alert volume&lt;/strong&gt; — громкость системных уведомлений&lt;/li&gt;
    &lt;li id=&quot;Aiuu&quot;&gt;&lt;strong&gt;DDC&lt;/strong&gt; — регулировка громкости внешних мониторов&lt;/li&gt;
    &lt;li id=&quot;yjVx&quot;&gt;&lt;strong&gt;Volume HUD&lt;/strong&gt; — встроенный индикатор громкости (Tahoe или Classic стиль)&lt;/li&gt;
    &lt;li id=&quot;Qj8J&quot;&gt;&lt;strong&gt;Медиа-клавиши F10-F12&lt;/strong&gt; — работают даже на USB DAC и HDMI, где штатные клавиши macOS бесполезны&lt;/li&gt;
    &lt;li id=&quot;mly5&quot;&gt;&lt;strong&gt;Bluetooth&lt;/strong&gt; — подключение устройств прямо из меню-бара&lt;/li&gt;
    &lt;li id=&quot;mUyX&quot;&gt;&lt;strong&gt;URL schemes&lt;/strong&gt; — автоматизация через shell, Shortcuts или Raycast’о подобное&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;установка&quot;&gt;Установка&lt;/h2&gt;
  &lt;pre id=&quot;kHTU&quot;&gt;brew install --cask finetune
&lt;/pre&gt;
  &lt;p id=&quot;9llU&quot;&gt;Или скачайте DMG с &lt;a href=&quot;https://github.com/ronitsingh10/FineTune/releases/latest&quot; target=&quot;_blank&quot;&gt;GitHub Releases&lt;/a&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;быстрый-старт&quot;&gt;Быстрый старт&lt;/h2&gt;
  &lt;ol id=&quot;CW8s&quot;&gt;
    &lt;li id=&quot;5mkA&quot;&gt;Запустите FineTune из папки Applications&lt;/li&gt;
    &lt;li id=&quot;82RN&quot;&gt;Разрешите &lt;strong&gt;Screen &amp;amp; System Audio Recording&lt;/strong&gt; — это необходимо для перехвата аудиопотоков&lt;/li&gt;
    &lt;li id=&quot;PTmo&quot;&gt;Нажмите на иконку FineTune в меню-баре — приложения, воспроизводящие звук, появятся автоматически&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;BoLb&quot;&gt;Готово. Регулируйте громкость, маршрутизируйте звук, настраивайте EQ.&lt;/p&gt;
  &lt;h2 id=&quot;полезные-фышки&quot;&gt;Полезные фЫшки&lt;/h2&gt;
  &lt;ul id=&quot;BauV&quot;&gt;
    &lt;li id=&quot;swJr&quot;&gt;&lt;strong&gt;Автопереключение на Bluetooth-гарнитуру&lt;/strong&gt;: откройте edit mode (карандаш) и перетащите устройство выше встроенных динамиков — FineTune будет переключаться на него при подключении&lt;/li&gt;
    &lt;li id=&quot;8F7i&quot;&gt;&lt;strong&gt;Управление с клавиатуры&lt;/strong&gt;: откройте попап и пользуйтесь стрелками.&lt;/li&gt;
    &lt;li id=&quot;SHMR&quot;&gt;&lt;strong&gt;URL schemes&lt;/strong&gt; — automate volume, mute, device routing, and more from scriptsFineTune понимает URL-команды формата &lt;code&gt;finetune://&lt;/code&gt;.&lt;code&gt;finetune://set-volumes?app=com.spotify.client&amp;amp;volume=50 finetune://set-mute?app=com.spotify.client&amp;amp;muted=true finetune://toggle-mute?app=com.hnc.Discord finetune://set-device?app=com.apple.Music&amp;amp;device=DEVICE_UID finetune://reset &lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;x9TA&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/finetune/1.webp&quot; width=&quot;500&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>beaverclan:qwen3asronmacos</id><link rel="alternate" type="text/html" href="https://teletype.in/@beaverclan/qwen3asronmacos?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=beaverclan"></link><title>Qwen3 ASR на macOS</title><published>2026-05-03T11:51:17.499Z</published><updated>2026-05-03T11:51:17.499Z</updated><summary type="html">&lt;img src=&quot;https://blog.tatarinovms.space/images/posts/qwen3asronmacos/logo.webp&quot;&gt;В этом гайде я покажу, как развернуть и запустить модель распознавания речи Qwen3‑ASR через пакет mlx-qwen3-asr на macOS с M-чипом. Решение позволяет транскрибировать аудио из видеофайлов с поддержкой русского языка и сохранять результат в разных форматах: SRT, VTT, TXT, JSON.</summary><content type="html">
  &lt;figure id=&quot;qDLy&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/qwen3asronmacos/logo.webp&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;H5S1&quot;&gt;В этом гайде я покажу, как развернуть и запустить модель распознавания речи Qwen3‑ASR через пакет mlx-qwen3-asr на macOS с M-чипом. Решение позволяет транскрибировать аудио из видеофайлов с поддержкой русского языка и сохранять результат в разных форматах: SRT, VTT, TXT, JSON.&lt;/p&gt;
  &lt;h1 id=&quot;что-такое-mlx-qwen3-asr&quot;&gt;Что такое mlx-qwen3-asr?&lt;/h1&gt;
  &lt;p id=&quot;DpqW&quot;&gt;&lt;a href=&quot;https://github.com/moona3k/mlx-qwen3-asr&quot; target=&quot;_blank&quot;&gt;mlx-qwen3-asr&lt;/a&gt; - это Python‑пакет, предоставляющий удобный интерфейс к модели Qwen3‑ASR‑1.7B от Alibaba Cloud, оптимизированной для работы на чипах Apple Silicon через фреймворк MLX. Модель поддерживает несколько языков, включая наш родной русский, и позволяет получать транскрипцию с тайм‑кодами.&lt;/p&gt;
  &lt;h2 id=&quot;требования&quot;&gt;Требования&lt;/h2&gt;
  &lt;ul id=&quot;brvV&quot;&gt;
    &lt;li id=&quot;Bjzn&quot;&gt;macOS&lt;/li&gt;
    &lt;li id=&quot;aSjr&quot;&gt;Установленный Python 3.11&lt;/li&gt;
    &lt;li id=&quot;aImQ&quot;&gt;Руки&lt;/li&gt;
    &lt;li id=&quot;syvz&quot;&gt;Свободное место на диске (модель ~3 ГБ)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h1 id=&quot;установка-и-настройка&quot;&gt;Установка и настройка&lt;/h1&gt;
  &lt;h2 id=&quot;подготовка-директории-проекта&quot;&gt;Подготовка директории проекта&lt;/h2&gt;
  &lt;p id=&quot;P4NZ&quot;&gt;Создайте отдельную папку для проекта и перейдите в неё, у меня будет так:&lt;/p&gt;
  &lt;pre id=&quot;PQaw&quot;&gt;mkdir -p ~/Documents/ai/asr
cd ~/Documents/ai/asr
&lt;/pre&gt;
  &lt;h2 id=&quot;создание-виртуального-окружения&quot;&gt;Создание виртуального окружения&lt;/h2&gt;
  &lt;pre id=&quot;QSXM&quot;&gt;python3.11 -m venv venv
&lt;/pre&gt;
  &lt;h2 id=&quot;активация-окружения&quot;&gt;Активация окружения&lt;/h2&gt;
  &lt;p id=&quot;wtYF&quot;&gt;Активируйте виртуальное окружение:&lt;/p&gt;
  &lt;pre id=&quot;Yv0b&quot;&gt;source venv/bin/activate
&lt;/pre&gt;
  &lt;h2 id=&quot;обновление-pip-и-установка-пакета&quot;&gt;Обновление pip и установка пакета&lt;/h2&gt;
  &lt;p id=&quot;jKp5&quot;&gt;Обновите менеджер пакетов и установите mlx-qwen3-asr:&lt;/p&gt;
  &lt;pre id=&quot;ex17&quot;&gt;pip install --upgrade pip
pip install mlx-qwen3-asr
&lt;/pre&gt;
  &lt;p id=&quot;Qrot&quot;&gt;Установка может занять несколько минут — загружаются зависимости и модель.&lt;/p&gt;
  &lt;h2 id=&quot;создание-скрипта-автоматизации&quot;&gt;Создание скрипта автоматизации&lt;/h2&gt;
  &lt;p id=&quot;QI99&quot;&gt;Чтобы не вводить команды вручную каждый раз, создадим shell‑скрипт с небольшим интерактивным интерфейсом.&lt;/p&gt;
  &lt;h3 id=&quot;создайте-файл-скрипта&quot;&gt;Создайте файл скрипта&lt;/h3&gt;
  &lt;ul id=&quot;m9UL&quot;&gt;
    &lt;li id=&quot;KfxS&quot;&gt;Создадим скрипт в любимом текстовом редакторе:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;76SI&quot;&gt;vim asr_process.sh
&lt;/pre&gt;
  &lt;ul id=&quot;uQps&quot;&gt;
    &lt;li id=&quot;RADG&quot;&gt;Вставьте этот &lt;a href=&quot;https://blog.tatarinovms.space/static/scripts/qwen3asronmacos/asr_process.sh&quot; target=&quot;_blank&quot;&gt;код&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;FFX8&quot;&gt;Укажите настройку &lt;code&gt;VENV_BIN=&lt;/code&gt;, где будет путь к созданной вами папке.&lt;/li&gt;
    &lt;li id=&quot;9JJi&quot;&gt;Сохраняем файл&lt;/li&gt;
    &lt;li id=&quot;hzFO&quot;&gt;Делаем скрипт исполняемым&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;dNfd&quot;&gt;chmod +x asr_process.sh
&lt;/pre&gt;
  &lt;h2 id=&quot;отправляем-файл-на-распознавание&quot;&gt;Отправляем файл на распознавание&lt;/h2&gt;
  &lt;ul id=&quot;zhFw&quot;&gt;
    &lt;li id=&quot;hDj1&quot;&gt;Запускаем скрипт&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;Pxyg&quot;&gt;./asr_process.sh
&lt;/pre&gt;
  &lt;ul id=&quot;SogN&quot;&gt;
    &lt;li id=&quot;UtVV&quot;&gt;откроет диалоговое окно для выбора файла&lt;/li&gt;
    &lt;li id=&quot;DBQx&quot;&gt;потом скрипт предложит выбрать формат вывода&lt;/li&gt;
    &lt;li id=&quot;dS5f&quot;&gt;позволит указать папку для сохранения&lt;/li&gt;
    &lt;li id=&quot;J5mK&quot;&gt;запустится распознавание и покажет прогресс (при первом запуске модель скачается)&lt;/li&gt;
  &lt;/ul&gt;

</content></entry><entry><id>beaverclan:voxcpm</id><link rel="alternate" type="text/html" href="https://teletype.in/@beaverclan/voxcpm?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=beaverclan"></link><title>VoxCPM - на ноуте. Клонируем свой голос</title><published>2026-04-26T17:26:16.498Z</published><updated>2026-04-26T17:26:16.498Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/35/72/35721e82-9c8b-4e50-926b-70083be2ca65.png"></media:thumbnail><category term="blog" label="Blog"></category><summary type="html">&lt;img src=&quot;https://blog.tatarinovms.space/images/posts/voxcpm/logo.webp&quot;&gt;Данное руководство содержит пошаговые инструкции по установке и запуску VoxCPM на macOS с процессорами Apple Silicon. Игрался на своем ноуте.</summary><content type="html">
  &lt;figure id=&quot;Id5N&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/voxcpm/logo.webp&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;h1 id=&quot;развёртывание-voxcpm-на-macbook-с-чипом-apple-silicon&quot;&gt;Развёртывание VoxCPM на MacBook с чипом Apple Silicon&lt;/h1&gt;
  &lt;p id=&quot;Gh74&quot;&gt;Данное руководство содержит пошаговые инструкции по установке и запуску &lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot; target=&quot;_blank&quot;&gt;VoxCPM&lt;/a&gt; на macOS с процессорами Apple Silicon. Игрался на своем ноуте.&lt;/p&gt;
  &lt;h2 id=&quot;скачиваем-репозиторий-проекта&quot;&gt;Скачиваем репозиторий проекта&lt;/h2&gt;
  &lt;p id=&quot;snAR&quot;&gt;Переходим в папку, где у вас всё будет аккуратно лежать и скачиваем репу:&lt;/p&gt;
  &lt;pre id=&quot;6Xat&quot;&gt;git clone https://github.com/OpenBMB/VoxCPM.git
cd VoxCPM
&lt;/pre&gt;
  &lt;h2 id=&quot;настройка-доступа-к-hugging-face&quot;&gt;Настройка доступа к Hugging Face&lt;/h2&gt;
  &lt;p id=&quot;C49j&quot;&gt;Для ускорения загрузки моделей и повышения лимитов запросов рекомендуется настроить токен доступа на Hugging Face&lt;/p&gt;
  &lt;h3 id=&quot;получение-токена&quot;&gt;Получение токена&lt;/h3&gt;
  &lt;ol id=&quot;TSEf&quot;&gt;
    &lt;li id=&quot;Mod9&quot;&gt;Перейдите на &lt;a href=&quot;https://huggingface.co/settings/tokens&quot; target=&quot;_blank&quot;&gt;https://huggingface.co/settings/tokens&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;WUoP&quot;&gt;Создайте новый токен с правами &lt;strong&gt;Read&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;LtUN&quot;&gt;Скопируйте токен (формат: &lt;code&gt;hf_...&lt;/code&gt;)&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;настройка-токена&quot;&gt;Настройка токена&lt;/h3&gt;
  &lt;p id=&quot;ZO7z&quot;&gt;&lt;strong&gt;Способ 1: Через huggingface-cli&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;mmYn&quot;&gt;pip install -U huggingface_hub
hf auth login
# Вставьте токен при запросе
&lt;/pre&gt;
  &lt;p id=&quot;3ooi&quot;&gt;&lt;strong&gt;Способ 2: Через переменную окружения&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;tu4Z&quot;&gt;# Временно для сессии
export HF_TOKEN=&amp;quot;hf_ваш_токен_здесь&amp;quot;

# Или навсегда (добавить в ~/.zshrc)
echo &amp;#x27;export HF_TOKEN=&amp;quot;hf_ваш_токен_здесь&amp;quot;&amp;#x27; &amp;gt;&amp;gt; ~/.zshrc
source ~/.zshrc
&lt;/pre&gt;
  &lt;h2 id=&quot;установка-python-310-через-pyenv&quot;&gt;Установка Python 3.10+ через pyenv&lt;/h2&gt;
  &lt;h3 id=&quot;установка-homebrew-если-не-установлен-но-навряд-ли-конечно&quot;&gt;Установка Homebrew (если не установлен, но навряд ли, конечно)&lt;/h3&gt;
  &lt;pre id=&quot;2Xt7&quot;&gt;/bin/bash -c &amp;quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&amp;quot;
&lt;/pre&gt;
  &lt;h3 id=&quot;установка-pyenv-и-зависимостей&quot;&gt;Установка pyenv и зависимостей&lt;/h3&gt;
  &lt;pre id=&quot;9gRa&quot;&gt;brew install pyenv openssl readline sqlite3 xz zlib pkgconf autoconf
&lt;/pre&gt;
  &lt;h3 id=&quot;настройка-окружения-оболочки&quot;&gt;Настройка окружения оболочки&lt;/h3&gt;
  &lt;p id=&quot;8IBO&quot;&gt;Добавьте следующие строки в &lt;code&gt;~/.zshrc&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;nQdC&quot;&gt;export PYENV_ROOT=&amp;quot;$HOME/.pyenv&amp;quot;
export PATH=&amp;quot;$PYENV_ROOT/bin:$PATH&amp;quot;
eval &amp;quot;$(pyenv init --path)&amp;quot;
eval &amp;quot;$(pyenv init -)&amp;quot;
&lt;/pre&gt;
  &lt;p id=&quot;KWgk&quot;&gt;Примените изменения:&lt;/p&gt;
  &lt;pre id=&quot;Kr3r&quot;&gt;source ~/.zshrc
&lt;/pre&gt;
  &lt;h3 id=&quot;установка-python-31014&quot;&gt;Установка Python 3.10.14&lt;/h3&gt;
  &lt;pre id=&quot;eZcN&quot;&gt;pyenv install 3.10.14
&lt;/pre&gt;
  &lt;h3 id=&quot;настройка-версии-для-проекта&quot;&gt;Настройка версии для проекта&lt;/h3&gt;
  &lt;p id=&quot;U8EM&quot;&gt;Перейдите в папку проекта, которую мы скачали ранее и указываем локальную версию Python:&lt;/p&gt;
  &lt;pre id=&quot;T3Rc&quot;&gt;cd ~/Documents/ai/VoxCPM 
pyenv local 3.10.14
python --version  # Должно вывести: Python 3.10.14
&lt;/pre&gt;
  &lt;h2 id=&quot;настройка-проекта-и-установка-зависимостей&quot;&gt;Настройка проекта и установка зависимостей&lt;/h2&gt;
  &lt;h3 id=&quot;создание-виртуального-окружения&quot;&gt;Создание виртуального окружения&lt;/h3&gt;
  &lt;pre id=&quot;fHZ0&quot;&gt;# В папке проекта
python -m venv venv
source venv/bin/activate
pip install --upgrade pip
&lt;/pre&gt;
  &lt;h3 id=&quot;установка-проекта-в-режиме-разработки&quot;&gt;Установка проекта в режиме разработки&lt;/h3&gt;
  &lt;pre id=&quot;6BbR&quot;&gt;pip install -e .
&lt;/pre&gt;
  &lt;h3 id=&quot;проверка-установки&quot;&gt;Проверка установки&lt;/h3&gt;
  &lt;pre id=&quot;KE1d&quot;&gt;which voxcpm
# Должно указывать на путь внутри venv

voxcpm --help
# Должно отобразить справку по командам и доступным флагам
&lt;/pre&gt;
  &lt;h3 id=&quot;скачиваем-модель-в-папку&quot;&gt;Скачиваем модель в папку&lt;/h3&gt;
  &lt;p id=&quot;V0TC&quot;&gt;Делаем папку для модели и качаем модель:&lt;/p&gt;
  &lt;pre id=&quot;Ptl3&quot;&gt;mkdir -p models/VoxCPM-2B
hf download openbmb/VoxCPM2 --local-dir ./models/VoxCPM2
&lt;/pre&gt;
  &lt;h2 id=&quot;использование-через-cli&quot;&gt;Использование через CLI&lt;/h2&gt;
  &lt;h3 id=&quot;базовый-синтаксис&quot;&gt;Базовый синтаксис&lt;/h3&gt;
  &lt;p id=&quot;jQ7M&quot;&gt;В без все просто:&lt;/p&gt;
  &lt;pre id=&quot;CvTx&quot;&gt;voxcpm &amp;lt;режим&amp;gt; [параметры]
&lt;/pre&gt;
  &lt;p id=&quot;TQmi&quot;&gt;Но мы пойдём путём клонирования своего голоса для озвучки текста.&lt;/p&gt;
  &lt;h3 id=&quot;готовим-файл-для-клонирования&quot;&gt;Готовим файл для клонирования&lt;/h3&gt;
  &lt;p id=&quot;DrjQ&quot;&gt;Я просто записал аудиосообщение в одном голубом мессенджере, сохранил его и перекодировал через ffmpeg в wav. Текст сообщения был такой: Это образец моего голоса. Я говорю здесь целых пять секунд.&lt;/p&gt;
  &lt;p id=&quot;HGR6&quot;&gt;Файл с текстом и аудио сохранил в папке ./ref. Т. е. ref.txt и ref.wav&lt;/p&gt;
  &lt;h3 id=&quot;готовим-текст-для-озвучки&quot;&gt;Готовим текст для озвучки&lt;/h3&gt;
  &lt;p id=&quot;byzC&quot;&gt;Создам папку output и inpit чтобы папку не замусоривать. Создаю текст для озвучки:&lt;/p&gt;
  &lt;pre id=&quot;vV2y&quot;&gt;vim ./inpit/anime.txt
&lt;/pre&gt;
  &lt;p id=&quot;bXiU&quot;&gt;Накидал туда описание аниме - &lt;a href=&quot;https://hd.kinopoisk.ru/film/b04631f828704a91b2c4730cf1c32699&quot; target=&quot;_blank&quot;&gt;Ателье колдовских колпаков&lt;/a&gt;&lt;/p&gt;
  &lt;h3 id=&quot;запускаем-озвучку-с-клонированием-нашего-голоса&quot;&gt;Запускаем озвучку с клонированием нашего голоса&lt;/h3&gt;
  &lt;p id=&quot;k30l&quot;&gt;Запускаем озвучку нашего текста с клонированием голоса в папку output:&lt;/p&gt;
  &lt;pre id=&quot;IcdW&quot;&gt;voxcpm clone --text &amp;quot;$(cat ./inpit/anime.txt)&amp;quot; --prompt-audio ./ref/ref.wav --prompt-text &amp;quot;$(cat ./ref/ref.txt)&amp;quot; --reference-audio ./ref/ref.wav --output ./output/anime_18.wav --model-path ./models/VoxCPM2 --device mps --no-optimize --cfg-value 1.8 --inference-timesteps 20 --normalize --no-denoiser
&lt;/pre&gt;
  &lt;h3 id=&quot;что-у-нас-по-параметрам&quot;&gt;Что у нас по параметрам?&lt;/h3&gt;
  &lt;p id=&quot;Pkth&quot;&gt;Параметр&lt;/p&gt;
  &lt;p id=&quot;lKG2&quot;&gt;Значение в команде&lt;/p&gt;
  &lt;p id=&quot;2fJZ&quot;&gt;Назначение&lt;/p&gt;
  &lt;p id=&quot;cZQq&quot;&gt;&lt;code&gt;voxcpm clone&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;fXwd&quot;&gt;&lt;code&gt;clone&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;i9Fc&quot;&gt;Активация режима клонирования голоса&lt;/p&gt;
  &lt;p id=&quot;o0gO&quot;&gt;&lt;code&gt;--text&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;yx27&quot;&gt;&lt;code&gt;&amp;quot;$(cat ./inpit/anime.txt)&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;3vRL&quot;&gt;Целевой текст для генерации&lt;/p&gt;
  &lt;p id=&quot;MVHt&quot;&gt;&lt;code&gt;--prompt-audio&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;cF0I&quot;&gt;&lt;code&gt;./ref/ref.wav&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;t0Z6&quot;&gt;Аудио-референс&lt;/p&gt;
  &lt;p id=&quot;hCLk&quot;&gt;&lt;code&gt;--prompt-text&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;uHDf&quot;&gt;&lt;code&gt;&amp;quot;$(cat ./ref/ref.txt)&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;8qsw&quot;&gt;Точная транскрипция &lt;code&gt;prompt-audio&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;WvYm&quot;&gt;&lt;code&gt;--reference-audio&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;viCK&quot;&gt;&lt;code&gt;./ref/ref.wav&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;AeX3&quot;&gt;Аудио-референс для тембральной идентичности&lt;/p&gt;
  &lt;p id=&quot;aQ72&quot;&gt;&lt;code&gt;--output&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;eCSx&quot;&gt;&lt;code&gt;./output/anime_18.wav&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Vqfu&quot;&gt;Путь к выходному файлу&lt;/p&gt;
  &lt;p id=&quot;WIPA&quot;&gt;&lt;code&gt;--model-path&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Gjg0&quot;&gt;&lt;code&gt;./models/VoxCPM2&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;YCvs&quot;&gt;Локальный каталог с весами модели&lt;/p&gt;
  &lt;p id=&quot;6f01&quot;&gt;&lt;code&gt;--device&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;93G5&quot;&gt;&lt;code&gt;mps&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;kQWd&quot;&gt;Платформа на которой мы играемся&lt;/p&gt;
  &lt;p id=&quot;KT3S&quot;&gt;&lt;code&gt;--no-optimize&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Y1j8&quot;&gt;&lt;em&gt;без значения&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;sXTW&quot;&gt;Отключение &lt;code&gt;torch.compile&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;B0ER&quot;&gt;&lt;code&gt;--cfg-value&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;VLUk&quot;&gt;&lt;code&gt;1.8&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;NOvi&quot;&gt;Значение Classifier-Free Guidance&lt;/p&gt;
  &lt;p id=&quot;wbf1&quot;&gt;&lt;code&gt;--inference-timesteps&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;YXSN&quot;&gt;&lt;code&gt;20&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;FXOK&quot;&gt;Количество шагов диффузионного декодера&lt;/p&gt;
  &lt;p id=&quot;830G&quot;&gt;&lt;code&gt;--normalize&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;BdLc&quot;&gt;&lt;em&gt;без значения&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;dlwR&quot;&gt;Нормализация громкости выхода&lt;/p&gt;
  &lt;p id=&quot;AvqR&quot;&gt;&lt;code&gt;--no-denoiser&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;THKW&quot;&gt;&lt;em&gt;без значения&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;envz&quot;&gt;Отключение модуля ZipEnhancer&lt;/p&gt;
  &lt;h3 id=&quot;результат&quot;&gt;Результат&lt;/h3&gt;
  &lt;p id=&quot;V13l&quot;&gt;На выходе получился файл 35.02. Послушать его можно ниже:&lt;/p&gt;
  &lt;p id=&quot;1m1X&quot;&gt;&lt;a href=&quot;https://blog.tatarinovms.space/audio/voxcpm/output.mp3&quot; target=&quot;_blank&quot;&gt;Скачать запись&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;AdV3&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/TS3jRcnweWY?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
    &lt;figcaption&gt;ютуб&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;p4F9&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://rutube.ru/play/embed/e9b02da8de79e9494f3959cfece86918/&quot;&gt;&lt;/iframe&gt;
    &lt;figcaption&gt;рутуб&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;9sta&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://vk.com/video_ext.php?oid=-230469137&amp;id=456239119&amp;autoplay=0&quot;&gt;&lt;/iframe&gt;
    &lt;figcaption&gt;вк видео&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;FYKn&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;литература-для-изучения&quot;&gt;Литература для изучения&lt;/h2&gt;
  &lt;ul id=&quot;bt54&quot;&gt;
    &lt;li id=&quot;Baz8&quot;&gt;GitHub репозиторий: &lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot; target=&quot;_blank&quot;&gt;https://github.com/OpenBMB/VoxCPM&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;KkuA&quot;&gt;Страница модели на Hugging Face: &lt;a href=&quot;https://huggingface.co/openbmb/VoxCPM2&quot; target=&quot;_blank&quot;&gt;https://huggingface.co/openbmb/VoxCPM2&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;

</content></entry><entry><id>beaverclan:synctogit</id><link rel="alternate" type="text/html" href="https://teletype.in/@beaverclan/synctogit?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=beaverclan"></link><title>Синхронизация кода в два репозитория одновременно</title><published>2026-04-21T19:28:52.008Z</published><updated>2026-04-21T19:28:52.008Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/6c/4f/6c4f1c6d-5012-4a37-8ea0-d35943788975.png"></media:thumbnail><category term="blog" label="Blog"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/f4/7d/f47d57b0-4b14-4c17-b2c1-f538fb36e8ad.png&quot;&gt;В условиях турбулентной работы облачных сервисов (снова так скажем) вопрос избыточности хранения кода становится актуальным. Держать проект только на GitHub — это риск. Решением может стать зеркалирование кода в другой сервис, например, на GitVerse.</summary><content type="html">
  &lt;figure id=&quot;pUWv&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f4/7d/f47d57b0-4b14-4c17-b2c1-f538fb36e8ad.png&quot; width=&quot;1424&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;r3zy&quot;&gt;В условиях турбулентной работы облачных сервисов (снова так скажем) вопрос избыточности хранения кода становится актуальным. Держать проект только на GitHub — это риск. Решением может стать зеркалирование кода в другой сервис, например, на GitVerse.&lt;/p&gt;
  &lt;p id=&quot;l7KB&quot;&gt;Обычно мы привыкли, что один &lt;code&gt;remote&lt;/code&gt; (например, &lt;code&gt;origin&lt;/code&gt;) привязан к одному URL. Но Git позволяет добавить несколько URL для push-операций в один remote.&lt;/p&gt;
  &lt;h3 id=&quot;PajP&quot;&gt;Как это настроить&lt;/h3&gt;
  &lt;p id=&quot;1jAd&quot;&gt;Если у вас уже есть основной репозиторий на GitHub, достаточно добавить второй URL для отправки данных:&lt;/p&gt;
  &lt;pre id=&quot;QRad&quot;&gt;git remote set-url --add --push origin git@gitverse.ru:tatarinovms/ShadowRocketSimpleConfig.git
&lt;/pre&gt;
  &lt;p id=&quot;SQC6&quot;&gt;Теперь при выполнении команды &lt;code&gt;git push origin&lt;/code&gt; ваши изменения полетят сразу в оба репозитория.&lt;/p&gt;
  &lt;h3 id=&quot;hnjv&quot;&gt;Нюансы с конфликтами&lt;/h3&gt;
  &lt;p id=&quot;oYBm&quot;&gt;Главная проблема возникает, когда в одном из зеркал есть изменения, которых нет в другом (например, вы отредактировали README прямо в веб-интерфейсе GitVerse). В этом случае обычный push будет отклонен.&lt;/p&gt;
  &lt;p id=&quot;v8pg&quot;&gt;Решить это можно через создание временного remote для «проблемного» зеркала и слияние веток:&lt;/p&gt;
  &lt;ol id=&quot;fet7&quot;&gt;
    &lt;li id=&quot;lb7T&quot;&gt;Добавляем зеркало как отдельный remote:&lt;code&gt;git remote add gitverse git@gitverse.ru:tatarinovms/ShadowRocketSimpleConfig.git &lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;YDZ7&quot;&gt;Подтягиваем изменения, разрешая несвязанные истории:&lt;code&gt;git pull gitverse main --no-rebase --allow-unrelated-histories &lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;FNnm&quot;&gt;После разрешения конфликтов снова пушим всё в &lt;code&gt;origin&lt;/code&gt;.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;jKqx&quot;&gt;Теперь код синхронизирован, а вы спите спокойно, зная, что копия вашего проекта лежит на разных площадках.&lt;/p&gt;

</content></entry><entry><id>beaverclan:podsync</id><link rel="alternate" type="text/html" href="https://teletype.in/@beaverclan/podsync?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=beaverclan"></link><title>Podsync - YouTube канал в подкаст-приемник</title><published>2026-04-12T14:01:27.349Z</published><updated>2026-04-12T14:01:27.349Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/07/93/0793e1f1-591a-48a0-bd29-95d73c38e184.png"></media:thumbnail><category term="blog" label="Blog"></category><summary type="html">&lt;img src=&quot;https://blog.tatarinovms.space/images/posts/podsync/logo.webp&quot;&gt;Podsync — маленький проектик на go, который преобразует каналы с YouTube или Vimeo в обычные подкаст-фиды (RSS). Идея проста: у меня есть каналы, которые я больше слушаю, чем смотрю, и мне хотелось бы делать это в моём подкаст-приёмнике. Гайд будет на Debian-based системы.</summary><content type="html">
  &lt;figure id=&quot;j1gZ&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/podsync/logo.webp&quot; width=&quot;1344&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;JCSQ&quot;&gt;Podsync — маленький проектик на go, который преобразует каналы с YouTube или Vimeo в обычные подкаст-фиды (RSS). Идея проста: у меня есть каналы, которые я больше слушаю, чем смотрю, и мне хотелось бы делать это в моём подкаст-приёмнике. Гайд будет на Debian-based системы.&lt;/p&gt;
  &lt;h2 id=&quot;как-это-работает&quot;&gt;Как это работает&lt;/h2&gt;
  &lt;p id=&quot;lkiv&quot;&gt;Принцип работы Podsync довольно простой:&lt;/p&gt;
  &lt;ol id=&quot;LBrG&quot;&gt;
    &lt;li id=&quot;H2nY&quot;&gt;В конфиге прописываем каналы&lt;/li&gt;
    &lt;li id=&quot;Hd2o&quot;&gt;Podsync по расписанию проверяет обновления&lt;/li&gt;
    &lt;li id=&quot;ySm7&quot;&gt;Скачивает новые видео через yt-dlp и конвертирует их в аудио в MP3 через ffmpeg или оставляет видео. Тут уж как хотите.&lt;/li&gt;
    &lt;li id=&quot;0D3o&quot;&gt;Генерирует RSS-фид, доступный по HTTP/HTTPS&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;UXGH&quot;&gt;Вы просто добавляете ссылку вида &lt;code&gt;https://your-domain.com/feed_id.xml&lt;/code&gt; в подкаст-клиент — и всё работает.&lt;/p&gt;
  &lt;h2 id=&quot;установка-зависимостей&quot;&gt;Установка зависимостей&lt;/h2&gt;
  &lt;p id=&quot;tOdq&quot;&gt;Для работы Podsync нужны &lt;code&gt;yt-dlp&lt;/code&gt;, &lt;code&gt;ffmpeg&lt;/code&gt; и &lt;code&gt;deno&lt;/code&gt; (как JS runtime для yt-dlp на всякий случай):&lt;/p&gt;
  &lt;pre id=&quot;Mbyk&quot;&gt;apt update &amp;amp;&amp;amp; apt install -y yt-dlp ffmpeg curl
&lt;/pre&gt;
  &lt;p id=&quot;XTC9&quot;&gt;Deno устанавливается через официальный скрипт:&lt;/p&gt;
  &lt;pre id=&quot;Y1O8&quot;&gt;curl -fsSL https://deno.land/install.sh | sh
&lt;/pre&gt;
  &lt;p id=&quot;7MxG&quot;&gt;Также понадобится Go, если планируете собирать из исходников:&lt;/p&gt;
  &lt;pre id=&quot;Zeyp&quot;&gt;apt install -y golang
&lt;/pre&gt;
  &lt;h2 id=&quot;установка-podsync&quot;&gt;Установка Podsync&lt;/h2&gt;
  &lt;h3 id=&quot;вариант-a-сборка-из-исходников&quot;&gt;Вариант A: Сборка из исходников&lt;/h3&gt;
  &lt;pre id=&quot;retv&quot;&gt;git clone https://github.com/mxpv/podsync /mnt/dietpi_userdata/podsync
cd /mnt/dietpi_userdata/podsync
make
&lt;/pre&gt;
  &lt;h3 id=&quot;вариант-бэ-готовый-бинарь&quot;&gt;Вариант Бэ: Готовый бинарь&lt;/h3&gt;
  &lt;p id=&quot;U8Wn&quot;&gt;Скачиваем с &lt;a href=&quot;https://github.com/mxpv/podsync/releases&quot; target=&quot;_blank&quot;&gt;GitHub Releases&lt;/a&gt;:&lt;/p&gt;
  &lt;pre id=&quot;SeE6&quot;&gt;cd /mnt/dietpi_userdata/podsync
curl -L -o podsync &amp;quot;https://github.com/mxpv/podsync/releases/download/v2.8.0/podsync-v2.8.0-linux-amd64&amp;quot;
chmod +x podsync
&lt;/pre&gt;
  &lt;h3 id=&quot;вариант-цэ-docker&quot;&gt;Вариант Цэ: Docker&lt;/h3&gt;
  &lt;p id=&quot;jZPr&quot;&gt;Если предпочитаете контейнеры:&lt;/p&gt;
  &lt;pre id=&quot;7wvj&quot;&gt;services:
  podsync:
    image: ghcr.io/mxpv/podsync
    container_name: podsync
    volumes:
      - ./data:/app/data/
      - ./db:/app/db/
      - ./config.toml:/app/config.toml
    ports:
      - 8181:8080
&lt;/pre&gt;
  &lt;p id=&quot;SFhS&quot;&gt;Запуск:&lt;/p&gt;
  &lt;pre id=&quot;1PpR&quot;&gt;docker compose up -d
&lt;/pre&gt;
  &lt;h2 id=&quot;youtube-data-api-v3-ключ&quot;&gt;YouTube Data API v3 ключ&lt;/h2&gt;
  &lt;p id=&quot;YnNI&quot;&gt;Ключевой момент — для работы Podsync нужен &lt;strong&gt;YouTube Data API v3 ключ&lt;/strong&gt;. Без него парсинг каналов не работает.&lt;/p&gt;
  &lt;p id=&quot;D3X8&quot;&gt;Получить ключ можно здесь: &lt;a href=&quot;https://developers.google.com/youtube/registering_an_application&quot; target=&quot;_blank&quot;&gt;https://developers.google.com/youtube/registering_an_application&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;if7x&quot;&gt;В конфиге нужно указать ключ в секции:&lt;/p&gt;
  &lt;pre id=&quot;nujC&quot;&gt;[tokens]
youtube = &amp;quot;YOUR_YOUTUBE_API_KEY&amp;quot;
&lt;/pre&gt;
  &lt;p id=&quot;y8yT&quot;&gt;Или даже несколько для ротации:&lt;/p&gt;
  &lt;pre id=&quot;2DlI&quot;&gt;youtube = [&amp;quot;KEY1&amp;quot;, &amp;quot;KEY2&amp;quot;, &amp;quot;KEY3&amp;quot;]
&lt;/pre&gt;
  &lt;h2 id=&quot;настройка-конфигурации&quot;&gt;Настройка конфигурации&lt;/h2&gt;
  &lt;p id=&quot;rgyM&quot;&gt;Собственно и сам конфиг. Создаём файл &lt;code&gt;config.toml&lt;/code&gt; на основе примера:&lt;/p&gt;
  &lt;pre id=&quot;Jzne&quot;&gt;cp /mnt/dietpi_userdata/podsync/config.toml.example /mnt/dietpi_userdata/podsync/config.toml
nano /mnt/dietpi_userdata/podsync/config.toml
&lt;/pre&gt;
  &lt;p id=&quot;cJUH&quot;&gt;Для примера:&lt;/p&gt;
  &lt;pre id=&quot;n90n&quot;&gt;[server]
port = 8181
hostname = &amp;quot;https://poddown.tatarinovlovesbeaver.su&amp;quot;

[cleanup]
keep_last = 2

[storage]
  [storage.local]
  data_dir = &amp;quot;/mnt/dietpi_userdata/podsync/data&amp;quot;

[tokens]
youtube = &amp;quot;тут ваш ключ из пункта выше&amp;quot;

[feeds]
    [feeds.MaximTatarinov]
    url = &amp;quot;https://www.youtube.com/@MaximTatarinov&amp;quot;
    format = &amp;quot;video&amp;quot;
    update_period = &amp;quot;8h&amp;quot;
    page_size = 5
    youtube_dl_args = [&amp;quot;--js-runtimes&amp;quot;, &amp;quot;deno:/root/.deno/bin/deno&amp;quot;]

[log]
filename = &amp;quot;podsync.log&amp;quot;
max_size = 50
max_age = 30
max_backups = 1
compress = true
debug = false
&lt;/pre&gt;
  &lt;p id=&quot;MW7H&quot;&gt;Конфиг готов.&lt;/p&gt;
  &lt;h2 id=&quot;запуск-как-systemd-сервис&quot;&gt;Запуск как systemd-сервис&lt;/h2&gt;
  &lt;p id=&quot;b0c1&quot;&gt;Чтобы Podsync работал в фоне и запускался автоматически, создаём сервис:&lt;/p&gt;
  &lt;pre id=&quot;FSD8&quot;&gt;nano /etc/systemd/system/podsync.service
&lt;/pre&gt;
  &lt;pre id=&quot;WNoQ&quot;&gt;[Unit]
Description=Podsync
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/mnt/dietpi_userdata/podsync/bin/podsync
WorkingDirectory=/mnt/dietpi_userdata/podsync
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
Environment=&amp;quot;PATH=/root/.deno/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&amp;quot;

[Install]
WantedBy=multi-user.target
&lt;/pre&gt;
  &lt;p id=&quot;ajdG&quot;&gt;Активируем и запускаем:&lt;/p&gt;
  &lt;pre id=&quot;8h33&quot;&gt;systemctl daemon-reload
systemctl enable podsync
systemctl start podsync
&lt;/pre&gt;
  &lt;p id=&quot;JPEE&quot;&gt;Проверить статус:&lt;/p&gt;
  &lt;pre id=&quot;HBrk&quot;&gt;systemctl status podsync
journalctl -u podsync -f
&lt;/pre&gt;
  &lt;h2 id=&quot;reverse-proxy-через-nginx&quot;&gt;Reverse proxy через nginx&lt;/h2&gt;
  &lt;p id=&quot;EKGa&quot;&gt;Podsync у меня работает без TLS, поэтому HTTPS у нас будет обрабатывать nginx. Конфиг для сайта:&lt;/p&gt;
  &lt;pre id=&quot;YBhW&quot;&gt;server {
    listen 80;
    listen [::]:80;
    server_name poddown.tatarinovlovesbeaver.su;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    listen 443 quic;
    listen [::]:443 quic;
    quic_retry on;
    quic_gso on;
    add_header Alt-Svc &amp;#x27;h3=&amp;quot;:443&amp;quot;; ma=86400&amp;#x27; always;

    server_name poddown.tatarinovlovesbeaver.su;

    ssl_certificate /etc/letsencrypt/live/poddown.tatarinovlovesbeaver.su/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/poddown.tatarinovlovesbeaver.su/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://127.0.0.1:8181;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
&lt;/pre&gt;
  &lt;p id=&quot;sBDX&quot;&gt;Применить:&lt;/p&gt;
  &lt;pre id=&quot;kWA0&quot;&gt;nginx -t &amp;amp;&amp;amp; systemctl reload nginx
&lt;/pre&gt;
  &lt;h2 id=&quot;фильтры-и-тонкая-настройка&quot;&gt;Фильтры и тонкая настройка&lt;/h2&gt;
  &lt;p id=&quot;shWg&quot;&gt;Podsync позволяет не просто скачивать всё подряд, а выбирать контент по правилам. Например, скачивать только эпизоды, содержащие «обзор» и длительностью до 2 часов:&lt;/p&gt;
  &lt;pre id=&quot;ANlH&quot;&gt;[feeds]
    [feeds.ID1]
    url = &amp;quot;https://www.youtube.com/@channel&amp;quot;
    format = &amp;quot;audio&amp;quot;
    filters = { title = &amp;quot;обзор&amp;quot;, max_duration = 7200, max_age = 30 }
&lt;/pre&gt;
  &lt;p id=&quot;cae8&quot;&gt;Доступные фильтры:&lt;/p&gt;
  &lt;p id=&quot;kQBP&quot;&gt;Параметр&lt;/p&gt;
  &lt;p id=&quot;yhPa&quot;&gt;Описание&lt;/p&gt;
  &lt;p id=&quot;Qm25&quot;&gt;&lt;code&gt;title&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;qdcf&quot;&gt;Regex для совпадения в заголовке&lt;/p&gt;
  &lt;p id=&quot;kOdT&quot;&gt;&lt;code&gt;not_title&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;636V&quot;&gt;Regex для исключения по заголовку&lt;/p&gt;
  &lt;p id=&quot;wD2V&quot;&gt;&lt;code&gt;description&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;tgd7&quot;&gt;Regex для совпадения в описании&lt;/p&gt;
  &lt;p id=&quot;ab6m&quot;&gt;&lt;code&gt;not_description&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;a0Aa&quot;&gt;Regex для исключения по описанию&lt;/p&gt;
  &lt;p id=&quot;IZ99&quot;&gt;&lt;code&gt;min_duration&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;5KCC&quot;&gt;Минимальная длительность (секунды)&lt;/p&gt;
  &lt;p id=&quot;ORoW&quot;&gt;&lt;code&gt;max_duration&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;EvTJ&quot;&gt;Максимальная длительность (секунды)&lt;/p&gt;
  &lt;p id=&quot;Ecnz&quot;&gt;&lt;code&gt;min_age&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Ei9M&quot;&gt;Минимальный возраст (дни)&lt;/p&gt;
  &lt;p id=&quot;bFNo&quot;&gt;&lt;code&gt;max_age&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;2Iyo&quot;&gt;Максимальный возраст (дни)&lt;/p&gt;
  &lt;p id=&quot;TOTF&quot;&gt;Также можно задать кастомный формат видео:&lt;/p&gt;
  &lt;pre id=&quot;9DgJ&quot;&gt;[feeds]
    [feeds.MaximTatarinov]
    format = &amp;quot;custom&amp;quot;
    custom_format = { youtube_dl_format = &amp;quot;bestaudio[ext=m4a]&amp;quot;, extension = &amp;quot;m4a&amp;quot; }
&lt;/pre&gt;
  &lt;h2 id=&quot;итог&quot;&gt;Итог&lt;/h2&gt;
  &lt;p id=&quot;G2uO&quot;&gt;RSS-лента доступна по адресу:&lt;/p&gt;
  &lt;pre id=&quot;TewD&quot;&gt;https://poddown.tatarinovlovesbeaver.su/MaximTatarinov.xml
&lt;/pre&gt;
  &lt;p id=&quot;aoWA&quot;&gt;Подставляем её в ваш подкаст-клиент и вуаля!&lt;/p&gt;

</content></entry><entry><id>beaverclan:obsidiangit</id><link rel="alternate" type="text/html" href="https://teletype.in/@beaverclan/obsidiangit?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=beaverclan"></link><title>Синхронизация заметок Obsidian через GitHub</title><published>2026-04-01T11:43:54.309Z</published><updated>2026-04-01T11:43:54.309Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/ab/f3/abf312e0-5763-44f8-a3cf-74bda21ae6bd.png"></media:thumbnail><category term="blog" label="Blog"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/2f/41/2f413eaa-a201-4911-ac63-02e9b6ca95ca.png&quot;&gt;В условиях турбулентной схемы работы облачных сервисов (скажем это так) вопрос хранения и синхронизации личных заметок приобретает особую актуальность. Данная заметка посвящена настройке синхронизации заметок Obsidian между устройствами iOS (Android пока не пробовал) и MacOS с использованием приватного репозитория GitHub (пока как он ещё работает). Позже дополню с переходом на свой git-сервер, но это решение мне ещё надо обкатать.</summary><content type="html">
  &lt;figure id=&quot;U1Br&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2f/41/2f413eaa-a201-4911-ac63-02e9b6ca95ca.png&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0mAI&quot;&gt;В условиях турбулентной схемы работы облачных сервисов (скажем это так) вопрос хранения и синхронизации личных заметок приобретает особую актуальность. Данная заметка посвящена настройке синхронизации заметок Obsidian между устройствами iOS (Android пока не пробовал) и MacOS с использованием приватного репозитория GitHub (пока как он ещё работает). Позже дополню с переходом на свой git-сервер, но это решение мне ещё надо обкатать.&lt;/p&gt;
  &lt;h2 id=&quot;что-у-нас-из-плюсов&quot;&gt;Что у нас из плюсов?&lt;/h2&gt;
  &lt;ul id=&quot;3Lj1&quot;&gt;
    &lt;li id=&quot;t8Kk&quot;&gt;Отсутствие зависимости от iCloud (есть только зависимость от GitHub);&lt;/li&gt;
    &lt;li id=&quot;lnWK&quot;&gt;Бесплатность;&lt;/li&gt;
    &lt;li id=&quot;79wZ&quot;&gt;Автоматическое копирование как содержимого заметок, так и истории их изменений;&lt;/li&gt;
    &lt;li id=&quot;vIn9&quot;&gt;Есть и локальное хранение данных, мы же делаем git pull&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;краткое-описание-что-нам-нужно&quot;&gt;Краткое описание, что нам нужно&lt;/h2&gt;
  &lt;ol id=&quot;cefx&quot;&gt;
    &lt;li id=&quot;YirR&quot;&gt;Приватный репозиторий GitHub в качестве центрального хранилища.&lt;/li&gt;
    &lt;li id=&quot;36WZ&quot;&gt;Obsidian собственно.&lt;/li&gt;
    &lt;li id=&quot;7vlb&quot;&gt;Для десктопных платформ: плагин &lt;strong&gt;Git&lt;/strong&gt; для Obsidian.&lt;/li&gt;
    &lt;li id=&quot;N9eL&quot;&gt;Для мобильных платформ: плагин &lt;strong&gt;Fit&lt;/strong&gt; для Obsidian.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;установка-obsidian-на-устройства&quot;&gt;Установка Obsidian на устройства&lt;/h3&gt;
  &lt;p id=&quot;fSGt&quot;&gt;Все ссылки под все платформы:&lt;br /&gt;&lt;a href=&quot;https://obsidian.md/download&quot; target=&quot;_blank&quot;&gt;https://obsidian.md/download&lt;/a&gt;&lt;/p&gt;
  &lt;h3 id=&quot;создание-приватного-репозитория-на-github&quot;&gt;Создание приватного репозитория на GitHub&lt;/h3&gt;
  &lt;ol id=&quot;XvRO&quot;&gt;
    &lt;li id=&quot;4AyC&quot;&gt;Авторизуйтесь на &lt;a href=&quot;https://github.com/&quot; target=&quot;_blank&quot;&gt;github.com&lt;/a&gt;.&lt;/li&gt;
    &lt;li id=&quot;KtyU&quot;&gt;Перейдите по ссылке &lt;a href=&quot;https://github.com/new&quot; target=&quot;_blank&quot;&gt;https://github.com/new&lt;/a&gt; и укажите:&lt;/li&gt;
    &lt;ul id=&quot;3pL1&quot;&gt;
      &lt;li id=&quot;yNR9&quot;&gt;Имя репозитория;&lt;/li&gt;
      &lt;li id=&quot;wJJo&quot;&gt;Тип доступа: &lt;strong&gt;Private&lt;/strong&gt;;&lt;/li&gt;
      &lt;li id=&quot;Z7HL&quot;&gt;Опция: &lt;strong&gt;Add a README file&lt;/strong&gt; (репозиторий не должен быть пустым).&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;FfeB&quot;&gt;Нажмите кнопку создания репозитория.&lt;/li&gt;
    &lt;li id=&quot;8Lap&quot;&gt;В корне репозитория создайте файл &lt;code&gt;.gitignore&lt;/code&gt; со следующим содержимым:&lt;code&gt;.obsidian &lt;/code&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;0mcp&quot;&gt;Файл &lt;code&gt;.gitignore&lt;/code&gt; необходим для исключения папки &lt;code&gt;.obsidian&lt;/code&gt; из синхронизации. В данной папке хранятся локальные настройки Obsidian, которые могут конфликтовать при синхронизации между разными устройствами.&lt;/p&gt;
  &lt;h3 id=&quot;создание-токена-доступа&quot;&gt;Создание токена доступа&lt;/h3&gt;
  &lt;ol id=&quot;lPuh&quot;&gt;
    &lt;li id=&quot;MXWO&quot;&gt;Перейдите по ссылке &lt;a href=&quot;https://github.com/settings/personal-access-tokens&quot; target=&quot;_blank&quot;&gt;https://github.com/settings/personal-access-tokens&lt;/a&gt;.&lt;/li&gt;
    &lt;li id=&quot;GBX8&quot;&gt;Укажите параметры токена:&lt;/li&gt;
    &lt;ul id=&quot;USUN&quot;&gt;
      &lt;li id=&quot;9u7r&quot;&gt;Token name (произвольное и понятное вам);&lt;/li&gt;
      &lt;li id=&quot;LrKn&quot;&gt;Expiration: можно &lt;strong&gt;No expiration&lt;/strong&gt;, но осторожно;&lt;/li&gt;
      &lt;li id=&quot;cax8&quot;&gt;Repository access: Выберите свой репозиторий, который создали ранее.&lt;/li&gt;
      &lt;li id=&quot;Ck9r&quot;&gt;Permissions: Выберите всё, что связано с репой, без всяких Copilot и пр.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;CuUU&quot;&gt;Создайте токен.&lt;/li&gt;
    &lt;li id=&quot;L2Ok&quot;&gt;Скопируйте и сохраните сгенерированный токен&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;настройка-синхронизации-на-десктопной-платформе&quot;&gt;Настройка синхронизации на десктопной платформе&lt;/h3&gt;
  &lt;h4 id=&quot;клонирование-репозитория&quot;&gt;Клонирование репозитория&lt;/h4&gt;
  &lt;ol id=&quot;6rDT&quot;&gt;
    &lt;li id=&quot;EnI4&quot;&gt;Убедитесь, что в системе установлен Git и он настроен&lt;/li&gt;
    &lt;li id=&quot;br7y&quot;&gt;Создайте папку для хранения хранилища Obsidian&lt;/li&gt;
    &lt;li id=&quot;lKuR&quot;&gt;Откройте терминал, перейдите в созданную папку и выполните клонирование:&lt;code&gt;cd ./OBSIDIANREPO git clone git@github.com:username/ObsidianRepo.git &lt;/code&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h4 id=&quot;создание-хранилища-в-obsidian&quot;&gt;Создание хранилища в Obsidian&lt;/h4&gt;
  &lt;ol id=&quot;Vtyc&quot;&gt;
    &lt;li id=&quot;BK3P&quot;&gt;Запустите Obsidian.&lt;/li&gt;
    &lt;li id=&quot;YEwY&quot;&gt;Выберите опцию &lt;strong&gt;Open folder as vault&lt;/strong&gt; и укажите путь к клонированной папке репозитория.&lt;/li&gt;
    &lt;li id=&quot;j2ga&quot;&gt;Теперь вы можете создавать и редактировать заметки в данном хранилище.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h4 id=&quot;настройка-плагина-git-для-автоматической-синхронизации&quot;&gt;Настройка плагина Git для автоматической синхронизации&lt;/h4&gt;
  &lt;ol id=&quot;sR9r&quot;&gt;
    &lt;li id=&quot;gsQX&quot;&gt;В настройках Obsidian перейдите в раздел &lt;strong&gt;Community plugins&lt;/strong&gt;, отключите &lt;strong&gt;Restricted mode&lt;/strong&gt;(если активен), найдите и установите плагин &lt;strong&gt;Git&lt;/strong&gt;.&lt;/li&gt;
    &lt;li id=&quot;Kkv7&quot;&gt;В настройках плагина укажите следующие параметры:&lt;/li&gt;
  &lt;/ol&gt;
  &lt;ul id=&quot;nlYc&quot;&gt;
    &lt;li id=&quot;dsjF&quot;&gt;Author name for commit: Ваше имя для коммитов&lt;/li&gt;
    &lt;li id=&quot;oeRR&quot;&gt;Author email for commit: Ваша имя для коммитов Остальные параметры на ваш вкус.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;настройка-синхронизации-на-мобильных-устройствах&quot;&gt;Настройка синхронизации на мобильных устройствах&lt;/h3&gt;
  &lt;ol id=&quot;ngSn&quot;&gt;
    &lt;li id=&quot;3tMl&quot;&gt;Запустите приложение Obsidian на iOS.&lt;/li&gt;
    &lt;li id=&quot;LEdY&quot;&gt;Создайте новое пустое хранилище (не добавляйте в него пока файлы).&lt;/li&gt;
    &lt;li id=&quot;bRUW&quot;&gt;В настройках приложения перейдите в раздел &lt;strong&gt;Community plugins&lt;/strong&gt;, найдите и установите плагин &lt;strong&gt;Fit&lt;/strong&gt;.&lt;/li&gt;
    &lt;li id=&quot;sSnw&quot;&gt;В настройках плагина укажите:&lt;/li&gt;
    &lt;ul id=&quot;q8WR&quot;&gt;
      &lt;li id=&quot;rdLW&quot;&gt;&lt;strong&gt;Token&lt;/strong&gt;: вставьте Personal Access Token, созданный ранее;&lt;/li&gt;
      &lt;li id=&quot;WXdW&quot;&gt;Нажмите &lt;strong&gt;Authenticate user&lt;/strong&gt; (она вверху) для авторизации;&lt;/li&gt;
      &lt;li id=&quot;Xg8M&quot;&gt;&lt;strong&gt;Github repository name&lt;/strong&gt;: выберите ваш репозиторий;&lt;/li&gt;
      &lt;li id=&quot;M5zb&quot;&gt;&lt;strong&gt;Branch name&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;;&lt;/li&gt;
      &lt;li id=&quot;pg7l&quot;&gt;&lt;strong&gt;Auto sync&lt;/strong&gt;: &lt;code&gt;Muted&lt;/code&gt;;&lt;/li&gt;
      &lt;li id=&quot;dClr&quot;&gt;&lt;strong&gt;Auto check interval&lt;/strong&gt;: &lt;code&gt;5 minute&lt;/code&gt;;&lt;/li&gt;
      &lt;li id=&quot;GG1u&quot;&gt;&lt;strong&gt;File change&lt;/strong&gt;: отключите все визуальные уведомления.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;особенности-плагина-fit-и-вообще-всей-связки&quot;&gt;Особенности плагина Fit и вообще всей связки&lt;/h3&gt;
  &lt;ul id=&quot;FcMG&quot;&gt;
    &lt;li id=&quot;0sX4&quot;&gt;Плагин не поддерживает автосинхронизацию при запуске приложения. Для немедленного получения изменений используйте кнопку &lt;strong&gt;Fit Sync&lt;/strong&gt; (иконка с котиком в меню бургерном) сразу после запуска Obsidian.&lt;/li&gt;
    &lt;li id=&quot;x6jw&quot;&gt;Не редактируйте один и тот же файл одновременно на двух устройствах, если не умеете разбираться с конфликтами в Git&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;итоги&quot;&gt;Итоги&lt;/h3&gt;
  &lt;p id=&quot;hvYT&quot;&gt;Ну как-то так.&lt;/p&gt;

</content></entry><entry><id>beaverclan:navidrome</id><link rel="alternate" type="text/html" href="https://teletype.in/@beaverclan/navidrome?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=beaverclan"></link><title>Navidrome — свой музыкальный стриминговый сервер на DietPi</title><published>2026-03-07T15:00:19.000Z</published><updated>2026-03-07T15:11:24.137Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/18/99/1899d154-f7f8-4b3d-8ab9-63d085aba656.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://blog.tatarinovms.space/images/posts/navidrome/logo.webp&quot;&gt;Ввиду недавних извнений на стриминговых платформах, давно хотел иметь свою собственную музыкальную библиотеку, к которой можно получить доступ с любого устройства. У меня конечно уже стоит Jellyfin, но хотелось отдельного решения для музыки. Остановился на Navidrome.</summary><content type="html">
  &lt;figure id=&quot;qGSL&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/navidrome/logo.webp&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;TIYy&quot;&gt;Ввиду недавних изменений на стриминговых платформах, давно хотел иметь свою собственную музыкальную библиотеку, к которой можно получить доступ с любого устройства. У меня конечно уже стоит &lt;a href=&quot;https://jellyfin.org/&quot; target=&quot;_blank&quot;&gt;Jellyfin&lt;/a&gt;, но хотелось отдельного решения для музыки. Остановился на &lt;a href=&quot;https://www.navidrome.org/&quot; target=&quot;_blank&quot;&gt;Navidrome&lt;/a&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;почему-navidrome&quot;&gt;Почему Navidrome?&lt;/h2&gt;
  &lt;p id=&quot;6ITB&quot;&gt;Navidrome — это лёгкий и быстрый сервер для стриминга музыки с поддержкой Subsonic API. Написан на Go, использует SQLite в качестве базы данных и потребляет минимум ресурсов.&lt;/p&gt;
  &lt;p id=&quot;sLUZ&quot;&gt;Из плюсов:&lt;/p&gt;
  &lt;ul id=&quot;6Op8&quot;&gt;
    &lt;li id=&quot;95ja&quot;&gt;&lt;strong&gt;Лёгкость&lt;/strong&gt; — написан на Go, потребляет мало RAM и CPU&lt;/li&gt;
    &lt;li id=&quot;G0m7&quot;&gt;&lt;strong&gt;Subsonic API&lt;/strong&gt; — совместим с большинством клиентов Subsonic&lt;/li&gt;
    &lt;li id=&quot;SeyU&quot;&gt;&lt;strong&gt;Поддержка тегов&lt;/strong&gt; — автоматически сканирует и индексирует метаданные&lt;/li&gt;
    &lt;li id=&quot;FNw7&quot;&gt;&lt;strong&gt;Транскодинг&lt;/strong&gt; — встроенная поддержка FFmpeg&lt;/li&gt;
    &lt;li id=&quot;Y69S&quot;&gt;&lt;strong&gt;Веб-интерфейс&lt;/strong&gt; и &lt;strong&gt;мобильные клиенты&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;yW47&quot;&gt;&lt;strong&gt;Мультипользовательский режим&lt;/strong&gt; — можно создать аккаунты для семьи&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;что-нам-понадобится&quot;&gt;Что нам понадобится&lt;/h2&gt;
  &lt;ul id=&quot;ejyX&quot;&gt;
    &lt;li id=&quot;7fRl&quot;&gt;Сервер с DietPi&lt;/li&gt;
    &lt;li id=&quot;4yZC&quot;&gt;Домен (опционально, для удобного доступа извне)&lt;/li&gt;
    &lt;li id=&quot;R4t7&quot;&gt;Nginx в качестве reverse proxy&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;установка-navidrome-на-dietpi&quot;&gt;Установка Navidrome на DietPi&lt;/h2&gt;
  &lt;h3 id=&quot;шаг-1-установка-через-dietpi-software&quot;&gt;Шаг 1: Установка через dietpi-software&lt;/h3&gt;
  &lt;p id=&quot;Y2oq&quot;&gt;DietPi имеет встроенную поддержку Navidrome через &lt;code&gt;dietpi-software&lt;/code&gt;. Запускаем:&lt;/p&gt;
  &lt;pre id=&quot;RSuZ&quot;&gt;dietpi-software
&lt;/pre&gt;
  &lt;p id=&quot;hFmp&quot;&gt;В меню выбираем &lt;strong&gt;Navidrome&lt;/strong&gt;. Мастер автоматически:&lt;/p&gt;
  &lt;ul id=&quot;sSy9&quot;&gt;
    &lt;li id=&quot;HxQ5&quot;&gt;Установит все зависимости&lt;/li&gt;
    &lt;li id=&quot;y4tx&quot;&gt;Настроит сервис для автозапуска&lt;/li&gt;
    &lt;li id=&quot;EUoA&quot;&gt;Создаст необходимые директории&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;шаг-2-настройка-после-установки&quot;&gt;Шаг 2: Настройка после установки&lt;/h3&gt;
  &lt;p id=&quot;Wmhz&quot;&gt;После установки Navidrome будет доступен по адресу:&lt;/p&gt;
  &lt;pre id=&quot;I4Zj&quot;&gt;http://&amp;lt;IP-сервера&amp;gt;:4533
&lt;/pre&gt;
  &lt;p id=&quot;s0wR&quot;&gt;Первый созданный пользователь автоматически получит права администратора.&lt;/p&gt;
  &lt;h3 id=&quot;шаг-3-добавление-музыки&quot;&gt;Шаг 3: Добавление музыки&lt;/h3&gt;
  &lt;p id=&quot;Bn47&quot;&gt;По умолчанию Navidrome ищет музыку в директории &lt;code&gt;/mnt/dietpi_userdata/navidrome/music&lt;/code&gt;, но в интерфейсе можно будет добавить и свою библиотеку или в конфиге &lt;code&gt;/mnt/dietpi_userdata/navidrome/navidrome.toml&lt;/code&gt; поменяйте путь:&lt;/p&gt;
  &lt;pre id=&quot;Hy6L&quot;&gt;MusicFolder = &amp;quot;/mnt/external/music&amp;quot;
&lt;/pre&gt;
  &lt;p id=&quot;RH7j&quot;&gt;на свою папку , она станет вашей основной библиотекой.&lt;/p&gt;
  &lt;p id=&quot;N4eC&quot;&gt;После изменения конфига перезапустите сервис:&lt;/p&gt;
  &lt;pre id=&quot;RXSe&quot;&gt;dietpi-services restart navidrome
&lt;/pre&gt;
  &lt;h3 id=&quot;шаг-4-проверка-статуса&quot;&gt;Шаг 4: Проверка статуса&lt;/h3&gt;
  &lt;p id=&quot;cqyt&quot;&gt;Проверяем что сервис запущен:&lt;/p&gt;
  &lt;pre id=&quot;ZFJu&quot;&gt;dietpi-services status navidrome
&lt;/pre&gt;
  &lt;p id=&quot;BnlZ&quot;&gt;В ответе должно быть &lt;code&gt;active (running)&lt;/code&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;настройка-nginx-в-качестве-reverse-proxy&quot;&gt;Настройка Nginx в качестве reverse proxy&lt;/h2&gt;
  &lt;p id=&quot;bRm1&quot;&gt;Если вы хотите использовать доменное имя и HTTPS, нужно настроить reverse proxy. На DietPi это можно сделать через встроенную утилиту.&lt;/p&gt;
  &lt;h3 id=&quot;шаг-1-устанавливаем-nginx&quot;&gt;Шаг 1: Устанавливаем Nginx&lt;/h3&gt;
  &lt;pre id=&quot;ipqa&quot;&gt;dietpi-software
&lt;/pre&gt;
  &lt;p id=&quot;tdIN&quot;&gt;Выбираем &lt;strong&gt;Nginx&lt;/strong&gt; для установки.&lt;/p&gt;
  &lt;h3 id=&quot;шаг-2-получаем-ssl-сертификат&quot;&gt;Шаг 2: Получаем SSL сертификат&lt;/h3&gt;
  &lt;p id=&quot;nX5e&quot;&gt;Для настройки HTTPS сначала нужно получить сертификат через встроенную утилиту &lt;code&gt;dietpi-letsencrypt&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;dxoq&quot;&gt;dietpi-letsencrypt
&lt;/pre&gt;
  &lt;p id=&quot;7MWL&quot;&gt;Следуем инструкциям мастера:&lt;/p&gt;
  &lt;ol id=&quot;uKMO&quot;&gt;
    &lt;li id=&quot;msPY&quot;&gt;Выбираем домен &lt;code&gt;navidrome.yourdomain.com&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;Mi8v&quot;&gt;Указываем email для уведомлений&lt;/li&gt;
    &lt;li id=&quot;Jplh&quot;&gt;Выбираем Nginx как веб-сервер&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;m1CP&quot;&gt;После успешного выполнения сертификаты будут размещены в &lt;code&gt;/etc/letsencrypt/live/navidrome.yourdomain.com/&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;шаг-3-создаём-конфиг-для-navidrome&quot;&gt;Шаг 3: Создаём конфиг для Navidrome&lt;/h3&gt;
  &lt;p id=&quot;pawP&quot;&gt;Создаём файл конфига:&lt;/p&gt;
  &lt;pre id=&quot;SJ8T&quot;&gt;sudo nano /etc/nginx/sites-available/musicstream
&lt;/pre&gt;
  &lt;p id=&quot;iJFu&quot;&gt;С таким содержимым:&lt;/p&gt;
  &lt;pre id=&quot;flm0&quot;&gt;server {
    listen 80;
    listen [::]:80;
    server_name navidrome.yourdomain.com;

    location / {
        proxy_pass http://localhost:4533;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Connection &amp;quot;&amp;quot;;
        proxy_read_timeout 90;
    }

    include /etc/nginx/sites-dietpi/*.conf;

    listen [::]:443 ssl;
    http2 on;
    listen 443 quic;
    listen [::]:443 quic;
    quic_retry on;
    quic_gso on;
    add_header Alt-Svc &amp;#x27;h3=&amp;quot;:443&amp;quot;; ma=86400&amp;#x27; always;

    ssl_certificate /etc/letsencrypt/live/navidrome.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/navidrome.yourdomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
&lt;/pre&gt;
  &lt;h5 id=&quot;пояснения&quot;&gt;Пояснения&lt;/h5&gt;
  &lt;ul id=&quot;eeFC&quot;&gt;
    &lt;li id=&quot;6V4o&quot;&gt;&lt;strong&gt;proxy_pass&lt;/strong&gt; — перенаправляем запросы на Navidrome (порт 4533)&lt;/li&gt;
    &lt;li id=&quot;ebo9&quot;&gt;&lt;strong&gt;proxy_set_header&lt;/strong&gt; — передаём оригинальные заголовки клиента&lt;/li&gt;
    &lt;li id=&quot;2of9&quot;&gt;&lt;strong&gt;proxy_read_timeout&lt;/strong&gt; — увеличиваем таймаут для стриминга&lt;/li&gt;
    &lt;li id=&quot;t52o&quot;&gt;&lt;strong&gt;include /etc/nginx/sites-dietpi/*.conf&lt;/strong&gt; — подключаем дополнительные конфиги DietPi&lt;/li&gt;
    &lt;li id=&quot;RbQ4&quot;&gt;&lt;strong&gt;http2 on / quic&lt;/strong&gt; — включаем HTTP/2 и HTTP/3 (QUIC) для лучшей производительности&lt;/li&gt;
    &lt;li id=&quot;AYjz&quot;&gt;&lt;strong&gt;Alt-Svc&lt;/strong&gt; — заголовок для поддержки HTTP/3&lt;/li&gt;
    &lt;li id=&quot;hyZu&quot;&gt;&lt;strong&gt;ssl_certificate&lt;/strong&gt; — пути к сертификатам Let’s Encrypt&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;шаг-4-включаем-сайт&quot;&gt;Шаг 4: Включаем сайт&lt;/h3&gt;
  &lt;pre id=&quot;4R0a&quot;&gt;sudo ln -s /etc/nginx/sites-available/musicstream /etc/nginx/sites-enabled/musicstream
sudo nginx -t
dietpi-services restart nginx
&lt;/pre&gt;
  &lt;p id=&quot;rcbc&quot;&gt;После перезагрузки Nginx ваш сервер будет доступен по HTTPS с поддержкой HTTP/2 и HTTP/3 (QUIC).&lt;/p&gt;
  &lt;p id=&quot;7cTL&quot;&gt;Также не забудьте открыть порт 443 в вашем фаерволле или роутере.&lt;/p&gt;
  &lt;h2 id=&quot;клиенты-для-navidrome&quot;&gt;Клиенты для Navidrome&lt;/h2&gt;
  &lt;p id=&quot;Mbas&quot;&gt;Navidrome совместим с любым клиентом, поддерживающим Subsonic API. Вот некоторые из них:&lt;/p&gt;
  &lt;h3 id=&quot;веб&quot;&gt;Веб&lt;/h3&gt;
  &lt;p id=&quot;2MOc&quot;&gt;Встроенный веб-интерфейс Navidrome уже имеет полный функционал и адаптивный дизайн. Открыть его можно по адресу:&lt;/p&gt;
  &lt;ul id=&quot;DcQW&quot;&gt;
    &lt;li id=&quot;6mhn&quot;&gt;Локально: &lt;code&gt;http://&amp;lt;IP-сервера&amp;gt;:4533&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;vQzg&quot;&gt;Через proxy: &lt;code&gt;https://navidrome.yourdomain.com&lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;khqM&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/navidrome/1.webp&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;мобильные&quot;&gt;Мобильные&lt;/h3&gt;
  &lt;p id=&quot;nfK9&quot;&gt;На телефоне я использую клиент &lt;a href=&quot;https://apps.apple.com/app/id6740042497&quot; target=&quot;_blank&quot;&gt;Yuzic&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;K4YE&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/navidrome/2.webp&quot; width=&quot;300&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;PgmL&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/navidrome/3.webp&quot; width=&quot;300&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;kSD3&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/navidrome/4.webp&quot; width=&quot;300&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;бекапы&quot;&gt;Бекапы&lt;/h2&gt;
  &lt;p id=&quot;ffIf&quot;&gt;Для резервного копирования достаточно сохранить директорию &lt;code&gt;/mnt/dietpi_userdata/navidrome&lt;/code&gt;— там находится SQLite база и конфиги&lt;/p&gt;
  &lt;h2 id=&quot;заключение&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;iCWY&quot;&gt;Navidrome — отличное решение для тех, кто хочет иметь свою музыкальную библиотеку с современным интерфейсом и минимальными затратами ресурсов. На DietPi разворачивается за 10 минут, а настройка Nginx proxy позволяет получить безопасный доступ по HTTPS с любого устройства.&lt;/p&gt;

</content></entry><entry><id>beaverclan:ssh2bwmacos</id><link rel="alternate" type="text/html" href="https://teletype.in/@beaverclan/ssh2bwmacos?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=beaverclan"></link><title>SSH ключи из BitWarden в MacOS</title><published>2026-02-23T20:27:07.086Z</published><updated>2026-02-23T20:28:37.842Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/6f/ac/6fac502a-1ab6-4f92-a001-a00a799dc159.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://blog.tatarinovms.space/images/posts/bitwarden-ssh-macos/logo.webp&quot;&gt;Долгое время хранил SSH-ключи в виде файлов на диске. Это неудобно и небезопасно: файлы могут быть украдены, забыты на разных устройствах, да и бэкапить их — отдельная головная боль.</summary><content type="html">
  &lt;figure id=&quot;0bpk&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/bitwarden-ssh-macos/logo.webp&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;предыстория&quot;&gt;Предыстория&lt;/h2&gt;
  &lt;p id=&quot;TQId&quot;&gt;Долгое время хранил SSH-ключи в виде файлов на диске. Это неудобно и небезопасно: файлы могут быть украдены, забыты на разных устройствах, да и бэкапить их — отдельная головная боль.&lt;/p&gt;
  &lt;p id=&quot;ElIk&quot;&gt;Пользуюсь &lt;a href=&quot;https://bitwarden.com/&quot; target=&quot;_blank&quot;&gt;Bitwarden&lt;/a&gt;, а точнее Vaultwarden сервером с десктопным клиентом на компе. Через него храню пароли, TOTP и т.д. Но в Bitwarden можно хранить ещё и SSH-ключи, а встроенный SSH Agent позволяет использовать их без сохранения на диск.&lt;/p&gt;
  &lt;h3 id=&quot;зачем-это-нужно&quot;&gt;Зачем это нужно?&lt;/h3&gt;
  &lt;ul id=&quot;NdNn&quot;&gt;
    &lt;li id=&quot;ePc4&quot;&gt;&lt;strong&gt;Безопасность&lt;/strong&gt; — приватные ключи не лежат в файлах на диске&lt;/li&gt;
    &lt;li id=&quot;dAGD&quot;&gt;&lt;strong&gt;Централизованное хранение&lt;/strong&gt; — все ключи в одном месте, с доступом со всех устройств&lt;/li&gt;
    &lt;li id=&quot;TFyM&quot;&gt;&lt;strong&gt;Автоматизация&lt;/strong&gt; — SSH сам перебирает ключи, правда Bitwarden не сопоставляет ключи по имени хоста. Он просто предлагает все доступные ключи по очереди. Сервер сам выбирает подходящий.&lt;/li&gt;
    &lt;li id=&quot;hJJg&quot;&gt;&lt;strong&gt;Синхронизация&lt;/strong&gt; — добавил ключ в Bitwarden, и он доступен на всех устройствах&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;что-понадобится&quot;&gt;Что понадобится&lt;/h2&gt;
  &lt;ul id=&quot;jhPL&quot;&gt;
    &lt;li id=&quot;lgrS&quot;&gt;&lt;a href=&quot;https://bitwarden.com/download/&quot; target=&quot;_blank&quot;&gt;Bitwarden Desktop&lt;/a&gt; для macOS. Поставить его можно через Homebrew: &lt;code&gt;brew install bitwarden&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;31qx&quot;&gt;Немного свободного времени&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;шаг-1-включаем-ssh-agent-в-bitwarden&quot;&gt;Шаг 1: Включаем SSH Agent в Bitwarden&lt;/h2&gt;
  &lt;ol id=&quot;atHv&quot;&gt;
    &lt;li id=&quot;dP56&quot;&gt;Открываем &lt;strong&gt;Bitwarden Desktop&lt;/strong&gt;приложение&lt;/li&gt;
    &lt;li id=&quot;2Qbz&quot;&gt;Переходим в &lt;strong&gt;Settings → SSH Agent&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;BMfq&quot;&gt;Включаем опцию &lt;strong&gt;“Enable SSH Agent”&lt;/strong&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;81y5&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/bitwarden-ssh-macos/1.webp&quot; width=&quot;1010&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gZ0W&quot;&gt;После включения Bitwarden создаст Unix-сокет для работы с SSH. На macOS путь к сокету:&lt;/p&gt;
  &lt;pre id=&quot;pJ51&quot;&gt;~/.bitwarden-ssh-agent.sock
&lt;/pre&gt;
  &lt;h2 id=&quot;шаг-2-добавляем-ssh-ключи-в-bitwarden&quot;&gt;Шаг 2: Добавляем SSH-ключи в Bitwarden&lt;/h2&gt;
  &lt;ol id=&quot;9OGL&quot;&gt;
    &lt;li id=&quot;VAZ0&quot;&gt;В Bitwarden создаём новый элемент типа &lt;strong&gt;SSH Key&lt;/strong&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;8k0n&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/bitwarden-ssh-macos/2.webp&quot; width=&quot;830&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;DTRv&quot;&gt;Публичный ключ при этом должен быть добавлен на серверы в &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; — как обычно.&lt;/p&gt;
  &lt;h2 id=&quot;шаг-3-настраиваем-окружение&quot;&gt;Шаг 3: Настраиваем окружение&lt;/h2&gt;
  &lt;p id=&quot;Z1Oa&quot;&gt;Теперь нужно указать системе использовать сокет Bitwarden вместо стандартного SSH-агента macOS.&lt;/p&gt;
  &lt;p id=&quot;nYZa&quot;&gt;Открываем &lt;code&gt;~/.zshrc&lt;/code&gt; и добавляем:&lt;/p&gt;
  &lt;pre id=&quot;Pjdo&quot;&gt;export SSH_AUTH_SOCK=&amp;quot;$HOME/.bitwarden-ssh-agent.sock&amp;quot;
&lt;/pre&gt;
  &lt;p id=&quot;ZZft&quot;&gt;Применяем изменения:&lt;/p&gt;
  &lt;pre id=&quot;VGAI&quot;&gt;source ~/.zshrc
&lt;/pre&gt;
  &lt;h2 id=&quot;шаг-4-обновляем-ssh-config&quot;&gt;Шаг 4: Обновляем SSH config&lt;/h2&gt;
  &lt;p id=&quot;81re&quot;&gt;Открываем &lt;code&gt;~/.ssh/config&lt;/code&gt; и убираем &lt;code&gt;IdentityFile&lt;/code&gt; (если у вас были уже добавлены, если нет, добавляем с нуля) для хостов, которые будут использовать ключи из Bitwarden.&lt;/p&gt;
  &lt;p id=&quot;anI6&quot;&gt;&lt;strong&gt;Было:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;sCBp&quot;&gt;Host LinuxServer
    Hostname 192.168.1.11
    user root
    port 22
    IdentityFile ~/LinuxServer.key
&lt;/pre&gt;
  &lt;p id=&quot;SuUb&quot;&gt;&lt;strong&gt;Должно стать:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;OGj5&quot;&gt;Host LinuxServer
    Hostname 192.168.1.11
    user root
    port 22
    AddKeysToAgent yes
&lt;/pre&gt;
  &lt;p id=&quot;MWfh&quot;&gt;Bitwarden SSH Agent сам предложит все доступные ключи при подключении.&lt;/p&gt;
  &lt;h2 id=&quot;шаг-5-проверяем-работу&quot;&gt;Шаг 5: Проверяем работу&lt;/h2&gt;
  &lt;p id=&quot;ZnGR&quot;&gt;Перед проверкой убедитесь, что &lt;strong&gt;Bitwarden запущен и разблокирован&lt;/strong&gt;. Ключи доступны только после разблокировки хранилища.&lt;/p&gt;
  &lt;p id=&quot;NCc2&quot;&gt;Проверяем, что Bitwarden отдал ключи:&lt;/p&gt;
  &lt;pre id=&quot;lRA9&quot;&gt;ssh-add -l
&lt;/pre&gt;
  &lt;p id=&quot;FCEs&quot;&gt;Вывод должен показать ключи из Bitwarden:&lt;/p&gt;
  &lt;pre id=&quot;LFRD&quot;&gt;256 SHA256:i0DqblPzC/00lDAJzetqI53EYzzr+DF@#CDFDF@ LinuxServer (ED25519)
256 SHA256:uFCDz4H6b+dfYb+Od4VilIlOF7FZKCwNA99PgdXdyj0 LinuxServer2 (ED25519)
&lt;/pre&gt;
  &lt;p id=&quot;XJJo&quot;&gt;Подключаемся к серверу:&lt;/p&gt;
  &lt;pre id=&quot;XHSO&quot;&gt;ssh LinuxServer
&lt;/pre&gt;
  &lt;p id=&quot;x4zc&quot;&gt;&lt;strong&gt;Примечание:&lt;/strong&gt; После подключения в Bitwarden-клиенте появится запрос на разрешение использования ключа. Но если надоедает это, можно поставить настройку, чтобы не спрашивал, пока не будет заблокировано хранилище.&lt;/p&gt;
  &lt;figure id=&quot;CzHp&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/bitwarden-ssh-macos/3.webp&quot; width=&quot;986&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;как-это-работает&quot;&gt;Как это работает&lt;/h2&gt;
  &lt;ol id=&quot;Z70W&quot;&gt;
    &lt;li id=&quot;w3p0&quot;&gt;&lt;strong&gt;При подключении SSH&lt;/strong&gt; (&lt;code&gt;ssh LinuxServer&lt;/code&gt;) сервер отправляет список допустимых ключей&lt;/li&gt;
    &lt;li id=&quot;MlBv&quot;&gt;&lt;strong&gt;Bitwarden SSH Agent&lt;/strong&gt; получает запрос и перебирает все разблокированные SSH-ключи&lt;/li&gt;
    &lt;li id=&quot;WY9M&quot;&gt;&lt;strong&gt;Сервер принимает&lt;/strong&gt; тот ключ, который есть в &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;JXfU&quot;&gt;&lt;strong&gt;Важно:&lt;/strong&gt; Bitwarden не сопоставляет ключи по имени хоста. Он просто предлагает все доступные ключи по очереди. Сервер сам выбирает подходящий.&lt;/p&gt;
  &lt;h2 id=&quot;заключение&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;TEAE&quot;&gt;Теперь все SSH-ключи хранятся только в Bitwarden, без файлов на диске. Подключение происходит автоматически, без лишних действий.&lt;/p&gt;
  &lt;p id=&quot;v4nt&quot;&gt;Это безопаснее, удобнее и проще в управлении. Особенно если у вас много ключей для разных серверов.&lt;/p&gt;

</content></entry><entry><id>beaverclan:flowclip</id><link rel="alternate" type="text/html" href="https://teletype.in/@beaverclan/flowclip?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=beaverclan"></link><title>FlowClip - продвинутый менеджер буфера обмена для macOS</title><published>2026-01-24T21:49:10.590Z</published><updated>2026-01-24T21:49:10.590Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/7d/30/7d30b13d-8b03-4779-ad27-b870d5ee9532.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://blog.tatarinovms.space/images/posts/flowclip/logo.webp&quot;&gt;FlowClip - это менеджер буфера обмена для macOS, созданный как форк проекта Maccy. FlowClip добавляет новую функцию - очередь буфера обмена, которая позволяет собирать несколько элементов и вставлять их вместе.</summary><content type="html">
  &lt;figure id=&quot;VnyZ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/flowclip/logo.webp&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;что-такое-flowclip&quot;&gt;Что такое FlowClip?&lt;/h2&gt;
  &lt;p id=&quot;lbhN&quot;&gt;FlowClip - это менеджер буфера обмена для macOS, созданный как форк проекта Maccy. FlowClip добавляет новую функцию - очередь буфера обмена, которая позволяет собирать несколько элементов и вставлять их вместе.&lt;/p&gt;
  &lt;h2 id=&quot;основные-возможности&quot;&gt;Основные возможности&lt;/h2&gt;
  &lt;ul id=&quot;9wJg&quot;&gt;
    &lt;li id=&quot;Z8eG&quot;&gt;&lt;strong&gt;Легковесность и скорость&lt;/strong&gt;: Минимальное использование ресурсов&lt;/li&gt;
    &lt;li id=&quot;Ss0M&quot;&gt;&lt;strong&gt;Управление с клавиатуры&lt;/strong&gt;: Создан для продвинутых пользователей&lt;/li&gt;
    &lt;li id=&quot;LkwI&quot;&gt;&lt;strong&gt;Безопасность и конфиденциальность&lt;/strong&gt;: История буфера обмена хранится локально&lt;/li&gt;
    &lt;li id=&quot;dhpW&quot;&gt;&lt;strong&gt;Нативный интерфейс&lt;/strong&gt;: Использует стандартные элементы интерфейса macOS&lt;/li&gt;
    &lt;li id=&quot;bp9U&quot;&gt;&lt;strong&gt;Пакетное копирование&lt;/strong&gt;: Копируйте несколько элементов последовательно для создания очереди&lt;/li&gt;
    &lt;li id=&quot;eZrc&quot;&gt;&lt;strong&gt;Последовательная вставка&lt;/strong&gt;: Вставляйте элементы в том порядке, в котором они были добавлены (FIFO - первый пришел, первый ушел)&lt;/li&gt;
    &lt;li id=&quot;WalK&quot;&gt;&lt;strong&gt;Пользовательские разделители&lt;/strong&gt;: Выбирайте, как разделять вставляемые элементы (пробел, новая строка, запятая или пользовательские символы)&lt;/li&gt;
    &lt;li id=&quot;oGQd&quot;&gt;&lt;strong&gt;Визуальная очередь&lt;/strong&gt;: Выделенное всплывающее окно для просмотра и управления очередью&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;как-использовать-flowclip&quot;&gt;Как использовать FlowClip&lt;/h2&gt;
  &lt;ol id=&quot;z884&quot;&gt;
    &lt;li id=&quot;WJfR&quot;&gt;&lt;strong&gt;Общий доступ&lt;/strong&gt;: Нажмите &lt;code&gt;SHIFT + COMMAND + C&lt;/code&gt; чтобы открыть FlowClip&lt;/li&gt;
    &lt;li id=&quot;RGnq&quot;&gt;&lt;strong&gt;Режим очереди&lt;/strong&gt;:&lt;/li&gt;
    &lt;ul id=&quot;r9pI&quot;&gt;
      &lt;li id=&quot;Y6t9&quot;&gt;Переключить окно очереди: &lt;code&gt;OPTION + SHIFT + V&lt;/code&gt;&lt;/li&gt;
      &lt;li id=&quot;1uoW&quot;&gt;Копируйте элементы обычным способом с помощью &lt;code&gt;COMMAND + C&lt;/code&gt; пока активен режим очереди&lt;/li&gt;
      &lt;li id=&quot;fenl&quot;&gt;Используйте окно очереди для управления или очистки элементов&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;U4a2&quot;&gt;&lt;strong&gt;Выбор и вставка&lt;/strong&gt;:&lt;/li&gt;
    &lt;ul id=&quot;pR3p&quot;&gt;
      &lt;li id=&quot;qPq5&quot;&gt;Введите текст для поиска по истории буфера обмена&lt;/li&gt;
      &lt;li id=&quot;Jaoe&quot;&gt;&lt;code&gt;ENTER&lt;/code&gt; чтобы скопировать выбранный элемент&lt;/li&gt;
      &lt;li id=&quot;oZGW&quot;&gt;&lt;code&gt;OPTION + ENTER&lt;/code&gt; чтобы вставить напрямую&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;Ah0F&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.tatarinovms.space/images/posts/flowclip/2.webp&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;как-установить-flowclip&quot;&gt;Как установить FlowClip?&lt;/h2&gt;
  &lt;pre id=&quot;iVRv&quot;&gt;brew tap gityeop/flowclip
brew install --cask flowclip&lt;/pre&gt;

</content></entry></feed>