<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Админкин</title>
	<atom:link href="https://adminkin.pro/feed/" rel="self" type="application/rss+xml" />
	<link>https://adminkin.pro/</link>
	<description>Личный опыт в IT</description>
	<lastBuildDate>Wed, 29 Apr 2026 14:06:46 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Автоматический перезапуск самописного сервиса в Linux</title>
		<link>https://adminkin.pro/avtomaticheskij-perezapusk-samopisnogo-servisa-v-linux/</link>
					<comments>https://adminkin.pro/avtomaticheskij-perezapusk-samopisnogo-servisa-v-linux/#respond</comments>
		
		<dc:creator><![CDATA[Ирина К.]]></dc:creator>
		<pubDate>Sun, 29 Jun 2025 16:16:45 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[autorun]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[systemd]]></category>
		<guid isPermaLink="false">https://adminkin.pro/?p=7804</guid>

					<description><![CDATA[<p>Написали сервис, который должен работать 24/7 в Linux? Доверьте его автоматический перезапуск при &#171;падении&#187;, автозагрузку и журналирование системе инициализации и управления службами systemd. Просто и надежно! Введение У меня написан Python-скрипт (interview_client.py), который должен запускаться при старте Linux системы, перезапускаться при &#171;падении&#187;, работать 24/7, а сообщения от скрипта должны перенаправляться в журнал. Код скрипта interview_client.py непринципиален для обсуждаемой в данной статье темы. Systemd-сервис Обернем Python-скрипт в systemd-сервис, чтобы systemd следил за Python-скриптом. Создаем директорию для размещения пользовательских systemd-сервисов: Создаем файл interview_client.service: В файл добавляем следующий текст: У нас получился пользовательский systemd-сервис, который запускает Python-скрипт после запуска графической сессии, обеспечивает его перезапуск в случае сбоя и направляет логи в журнал journal. [&#8230;]</p>
<p>Сообщение <a href="https://adminkin.pro/avtomaticheskij-perezapusk-samopisnogo-servisa-v-linux/">Автоматический перезапуск самописного сервиса в Linux</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Написали сервис, который должен работать 24/7 в Linux? Доверьте его автоматический перезапуск при &#171;падении&#187;, автозагрузку и журналирование системе инициализации и управления службами systemd. Просто и надежно!</p>



<span id="more-7804"></span>



<h2 class="wp-block-heading">Введение</h2>



<p>У меня написан Python-скрипт (<strong>interview_client.py</strong>), который должен запускаться при старте Linux системы, перезапускаться при &#171;падении&#187;, работать 24/7, а сообщения от скрипта должны перенаправляться в журнал.</p>



<p>Код скрипта <strong>interview_client.py</strong> непринципиален для обсуждаемой в данной статье темы.</p>



<h2 class="wp-block-heading">Systemd-сервис</h2>



<p>Обернем Python-скрипт в <strong>systemd</strong>-сервис, чтобы <strong>systemd</strong> следил за Python-скриптом.</p>



<p>Создаем директорию для размещения пользовательских systemd-сервисов:</p>



<pre class="wp-block-code"><code>mkdir -p ~/.config/systemd/user/</code></pre>



<p>Создаем файл <strong>interview_client.service</strong>:</p>



<pre class="wp-block-code"><code>touch ~/.config/systemd/user/interview_client.service</code></pre>



<p>В файл добавляем следующий текст:</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=Key Listener Client for interview
After=graphical-session.target
Requires=graphical-session.target

&#91;Service]
Environment=DISPLAY=:0
ExecStart=/home/user/interview/venv/bin/python -u /home/user/interview/interview_client.py
Restart=always
StandardOutput=journal
StandardError=journal

&#91;Install]
WantedBy=default.target</code></pre>



<p>У нас получился пользовательский systemd-сервис, который запускает Python-скрипт после запуска графической сессии, обеспечивает его перезапуск в случае сбоя и направляет логи в журнал <strong>journal</strong>.</p>



<p>Подробнее:</p>



<ul class="wp-block-list">
<li><code>Description</code> &#8212; описание systemd-сервиса;</li>



<li><code>After=graphical-session.target</code> &#8212; указываем, что systemd-сервис должен стартовать после запуска X-сессии (графической сессии);</li>



<li><code>Requires=graphical-session.target</code> &#8212; указываем, что графическая сессия обязательна;</li>



<li><code>Environment=DISPLAY=:0</code> &#8212; привязываемся к конкретной графической сессии;</li>



<li><code>ExecStart</code> &#8212; указываем запускать Python-скрипт <strong>/home/user/interview/interview_client.py</strong> с помощью интерпретатора из виртуального окружения <strong>venv</strong>. В моем Python-скрипте есть зависимости, которые установлены не глобально, а в виртуальном окружении <strong>venv</strong>;</li>



<li><code>-u</code> &#8212; запускаем Python в небуферизованном режиме (<strong>unbuffered</strong>). Это важно для логирования вывода в журнал;</li>



<li><code>Restart=always</code> &#8212; указываем перезапускать Python-скрипт всегда;</li>



<li><code>StandardOutput=journal</code> и <code>StandardError=journal</code> &#8212; направляем весь <strong>stdout</strong> и <strong>stderr</strong>, включая <strong>print()</strong> и <strong>traceback</strong>, в журнал <strong>journal</strong>;</li>



<li><code>WantedBy</code> &#8212; указываем, что systemd-сервис должен автоматически запускаться при старте системы в пользовательской граффической сессии.</li>
</ul>



<p>Перезапускаем <strong>systemd</strong>, чтобы он прочитал новый файл <strong>interview_client.service</strong> в пользовательском контексте:</p>



<pre class="wp-block-code"><code>systemctl --user daemon-reload</code></pre>



<p>Добавляем systemd-сервис <strong>interview_client.service</strong> в автозагрузку:</p>



<pre class="wp-block-code"><code>systemctl --user enable interview_client.service</code></pre>



<p>Немедленно запускаем systemd-сервис <strong>interview_client.service</strong>:</p>



<pre class="wp-block-code"><code>systemctl --user start interview_client.service</code></pre>



<p>Проверяем статус:</p>



<pre class="wp-block-code"><code>systemctl --user status interview_client.service</code></pre>



<p>Если понадобится остановить systemd-сервис <strong>interview_client.service</strong>:</p>



<pre class="wp-block-code"><code>systemctl --user stop interview_client.service</code></pre>



<p>Если понадобится удалить из автозагрузки:</p>



<pre class="wp-block-code"><code>systemctl --user disable interview_client.service</code></pre>



<h2 class="wp-block-heading">Логи systemd-сервиса</h2>



<p>Посмотреть лог сервиса:</p>



<pre class="wp-block-code"><code>journalctl --user -u interview_client.service</code></pre>



<p>Смотреть лог сервиса в реальном времени:</p>



<pre class="wp-block-code"><code>journalctl --user -u interview_client.service -f</code></pre>



<p>Проверка размера журнала:</p>



<pre class="wp-block-code"><code>journalctl --user --disk-usage</code></pre>



<p>У меня:</p>



<pre class="wp-block-preformatted">Archived and active journals take up 127.9M in the file system.</pre>



<p>Ограничим размер журнала. Для этого отредактируем конфигурационный файл <strong>/etc/systemd/journald.conf</strong>. Следующие параметры приводим к виду:</p>



<pre class="wp-block-code"><code>SystemMaxUse=100M<br>SystemKeepFree=50M<br>SystemMaxFileSize=20M<br>SystemMaxFiles=10</code></pre>



<p>Применяем изменения:</p>



<pre class="wp-block-code"><code>systemctl restart systemd-journald</code></pre>



<h2 class="wp-block-heading">Преимущества systemd-сервиса</h2>



<p>Вот список преимуществ использования systemd-сервиса с самописным приложением:</p>



<ol class="wp-block-list">
<li>Удобные команды ручного запуска, остановки и контроля systemd-сервиса (<strong>systemctl start|stop|status|&#8230;</strong>).</li>



<li>Настройка автозапуска приложения при загрузке системы.</li>



<li>Настройка автоматического перезапуска при сбое приложения.</li>



<li>Настройка зависимостей для запуска приложения в нужном порядке.</li>



<li>Журналирование.</li>



<li>Настройка ограничений используемых ресурсов (CPU, памяти и др.).</li>



<li>Настройка прав доступа к ресурсам (сети, файловой системе и др.).</li>



<li>Простой формат файлов <strong>.service</strong>.</li>



<li>Поддержка шаблонов и инстансов для многократного запуска systemd-сервиса с разными параметрами.</li>
</ol>



<h2 class="wp-block-heading">Выводы</h2>



<p>Systemd &#8212; это удобно: написали и отладили скрипт, остальное systemd берет на себя.</p>



<p>Все обсуждение статьи в комментариях ниже!</p>


 <div class="hp-vendors hp-block hp-grid"><div class="hp-row"><div class="hp-grid__item hp-col-sm-12 hp-col-xs-12"><article class="hp-vendor hp-vendor--view-block"><header class="hp-vendor__header"><div class="hp-vendor__image">
	<a href="https://adminkin.pro/vendor/irinak/">
					<img decoding="async" src="https://adminkin.pro/wp-content/uploads/2023/08/Irina-K.jpg" alt="Ирина K." loading="lazy">
			</a>
</div>
</header><div class="hp-vendor__content"><h4 class="hp-vendor__name"><a href="https://adminkin.pro/vendor/irinak/">Ирина K.</a>
	<i class="hp-vendor__verified-badge hp-icon fas fa-check-circle" title="Проверен"></i>
	</h4><div class="hp-vendor__details hp-vendor__details--primary"><time class="hp-vendor__registered-date hp-vendor__date hp-meta" datetime="2022-07-22 16:45:26">
	Автор и создатель сайта</time>
</div></div><footer class="hp-vendor__footer"><div class="hp-vendor__actions hp-vendor__actions--primary"></div></footer></article></div></div></div><p>Сообщение <a href="https://adminkin.pro/avtomaticheskij-perezapusk-samopisnogo-servisa-v-linux/">Автоматический перезапуск самописного сервиса в Linux</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://adminkin.pro/avtomaticheskij-perezapusk-samopisnogo-servisa-v-linux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Часто используемые Git команды</title>
		<link>https://adminkin.pro/chasto-ispolzuemye-git-komandy/</link>
					<comments>https://adminkin.pro/chasto-ispolzuemye-git-komandy/#respond</comments>
		
		<dc:creator><![CDATA[Ирина К.]]></dc:creator>
		<pubDate>Tue, 24 Jun 2025 10:42:53 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[gogs]]></category>
		<category><![CDATA[linux]]></category>
		<guid isPermaLink="false">https://adminkin.pro/?p=8058</guid>

					<description><![CDATA[<p>Давно хотела оформить в виде статьи мой список часто используемых Git команд. Git Git &#8212; это распределенная система управления версиями. Создана для отслеживания изменений в коде и облегчения совместной работы над проектами. Я ее всегда использую, даже когда работаю над проектом одна. Платформа Git Я не пользуюсь платформами GitHub и GitLab. Я использую собственный Git сервис Gogs. Его установка и настройка подробно описаны в статье: &#171;Установка Git сервиса Gogs на Linux (Debian 11)&#171;. Создание удаленного репозитория Git Создание удаленного репозитория на разных платформах Git по сути не различается. У меня Gogs, поэтому пишу про Gogs. В адресной строке браузера набираю https://git.adminkin.pro/ и ввожу логин и пароль пользователя. Для создания нового [&#8230;]</p>
<p>Сообщение <a href="https://adminkin.pro/chasto-ispolzuemye-git-komandy/">Часто используемые Git команды</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Давно хотела оформить в виде статьи мой список часто используемых Git команд.</p>



<span id="more-8058"></span>



<h2 class="wp-block-heading">Git</h2>



<p>Git &#8212; это распределенная система управления версиями. Создана для отслеживания изменений в коде и облегчения совместной работы над проектами. Я ее всегда использую, даже когда работаю над проектом одна.</p>



<h2 class="wp-block-heading">Платформа Git</h2>



<p>Я не пользуюсь платформами GitHub и GitLab. Я использую собственный Git сервис <strong>Gogs</strong>. Его установка и настройка подробно описаны в статье: &#171;<a href="https://adminkin.pro/ustanovka-git-servisa-gogs-na-linux-debian-11/" target="_blank" rel="noreferrer noopener">Установка Git сервиса Gogs на Linux (Debian 11)</a>&#171;.</p>



<h2 class="wp-block-heading">Создание удаленного репозитория Git</h2>



<p>Создание удаленного репозитория на разных платформах Git по сути не различается. У меня Gogs, поэтому пишу про Gogs.</p>



<p>В адресной строке браузера набираю <strong>https://git.adminkin.pro/</strong> и ввожу логин и пароль пользователя.</p>



<p>Для создания нового репозитория нажимаю на <strong>+</strong> рядом с <strong>My Repositories</strong>:</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/06/sozdanie-repozitoriya-git.png" data-rel="lightbox-gallery-58ETzK4l" data-rl_title="" data-rl_caption="" title=""><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/sozdanie-repozitoriya-git-1024x576.png" alt="Создание репозитория Git" class="wp-image-8081" srcset="https://adminkin.pro/wp-content/uploads/2025/06/sozdanie-repozitoriya-git-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/sozdanie-repozitoriya-git-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/sozdanie-repozitoriya-git-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/sozdanie-repozitoriya-git-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/06/sozdanie-repozitoriya-git-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/06/sozdanie-repozitoriya-git.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Придумываю имя репозиторию (<strong>interview</strong>) и нажимаю кнопку <strong>Create Repository</strong>. Все! Удаленный репозиторий создан.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/06/create-a-new-repository.png" data-rel="lightbox-gallery-58ETzK4l" data-rl_title="" data-rl_caption="" title=""><img decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/create-a-new-repository-1024x576.png" alt="Create a new repository" class="wp-image-8094" srcset="https://adminkin.pro/wp-content/uploads/2025/06/create-a-new-repository-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/create-a-new-repository-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/create-a-new-repository-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/create-a-new-repository-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/06/create-a-new-repository-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/06/create-a-new-repository.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">Часто используемые Git команды</h2>



<p>На локальной машине переходим к проекту <strong>interview</strong>:</p>



<pre class="wp-block-code"><code>cd ~/interview/</code></pre>



<p>Инициализируем локальный репозиторий:</p>



<pre class="wp-block-code"><code>git init</code></pre>



<p>Создаем файл <strong>.gitignore</strong>:</p>



<pre class="wp-block-code"><code>touch .gitignore</code></pre>



<p>Это обычный текстовый файл, в который вносится список файлов и директорий, которые Git должен игнорировать и не отслеживать изменения.</p>



<p>У меня проект <strong>interview</strong> на Python, и я добавляю в игнор все директории с именем <strong>__pycache__</strong> с их содержимым:</p>



<pre class="wp-block-code"><code>echo "__pycache__/" &gt;&gt; .gitignore</code></pre>



<p>Добавляем все файлы проекта в область подготовки к коммиту (<strong>стейдж</strong>):</p>



<pre class="wp-block-code"><code>git add .</code></pre>



<p>Просматриваем текущее состояние репозитория:</p>



<pre class="wp-block-code"><code>git status</code></pre>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/06/komanda-git-status.png" data-rel="lightbox-gallery-58ETzK4l" data-rl_title="" data-rl_caption="" title=""><img decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/komanda-git-status-1024x576.png" alt="Команда git status" class="wp-image-8122" srcset="https://adminkin.pro/wp-content/uploads/2025/06/komanda-git-status-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/komanda-git-status-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/komanda-git-status-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/komanda-git-status-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/06/komanda-git-status-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/06/komanda-git-status.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<ul class="wp-block-list">
<li><strong>On branch master</strong> &#8212; это текущая ветка.</li>



<li><strong>Changes to be committed</strong> &#8212; это файлы, которые уже в стейдже, т.е. в области подготовки к коммиту после <strong>git add</strong>, и готовы к коммиту.</li>



<li><strong>Changes not staged for commit</strong> &#8212; это измененные файлы, но еще не добавленные в стейдж через <strong>git add</strong>.</li>



<li><strong>Untracked files</strong> &#8212; это файлы, присутствующие в проекте, но неотслеживаемые Git.</li>
</ul>



<p>Чтобы удалить файл из стейджа (если он был ошибочно добавлен с помощью <strong>git add</strong>):</p>



<pre class="wp-block-code"><code>git restore --staged &lt;file&gt;</code></pre>



<p>Задаем автора коммитов для репозитория:</p>



<pre class="wp-block-code"><code>git config user.name "Irina K."</code></pre>



<pre class="wp-block-code"><code>git config user.email "irina@email.email"</code></pre>



<p>Чтобы просмотреть текущие настройки Git, включая <strong>user.name</strong>, <strong>user.email</strong>:</p>



<pre class="wp-block-code"><code>git config --list</code></pre>



<p>Делаем <strong>коммит</strong> (снимок состояния проекта):</p>



<pre class="wp-block-code"><code>git commit -m "my first commit"</code></pre>



<p>где <code>my first commit</code> &#8212; это комментарий к коммиту.</p>



<p>Просматриваем список настроенных удаленных репозиториев с адресами для чтения и записи, привязанных к репозиторию:</p>



<pre class="wp-block-code"><code>git remote -v</code></pre>



<p>Пока список пустой. Добавляем удаленный репозиторий, который мы создали в предыдущем разделе статьи:</p>



<pre class="wp-block-code"><code>git remote add origin https://git.adminkin.pro/&lt;git_user&gt;/interview.git</code></pre>



<p>Отправляем локальный коммит в удаленный репозиторий:</p>



<pre class="wp-block-code"><code>git push -u origin master</code></pre>



<h2 class="wp-block-heading">Просмотр коммитов</h2>



<p>Список коммитов в обратном хронологическом порядке:</p>



<pre class="wp-block-code"><code>git log</code></pre>



<p>Для каждого коммита отобразятся: <strong>хеш</strong> коммита (уникальный идентификатор), автор коммита, дата коммита и комментарий коммита.</p>



<p>Список коммитов со списком файлов каждого коммита:</p>



<pre class="wp-block-code"><code>git log --name-status</code></pre>



<p>Список файлов коммита можно просмотреть и другой коммандой:</p>



<pre class="wp-block-code"><code>git diff-tree --no-commit-id --name-only -r &lt;commit_hash&gt;</code></pre>



<p>где <code>&lt;commit_hash&gt;</code> &#8212; это хеш коммита.</p>



<p>Список файлов, которые изменялись между коммитами:</p>



<pre class="wp-block-code"><code>git diff --name-only &lt;commit_hash_1&gt; &lt;commit_hash_2&gt;</code></pre>



<h2 class="wp-block-heading">Просмотр структуры репозитория со всеми файлами</h2>



<p>Просмотреть структуру репозитория со всеми файлами для текущего коммита:</p>



<pre class="wp-block-code"><code>git ls-tree --name-only -r HEAD</code></pre>



<p>где <code>-r</code> &#8212; для отображения файлов во вложенных директориях;</p>



<p><code>HEAD</code> &#8212; для текущего коммита. Вместо <strong>HEAD</strong> можно указать хеш конкретного коммита.</p>



<h2 class="wp-block-heading">Просмотр изменений</h2>



<p>Посмотреть изменения для коммита (все строки кода, которые были добавлены, изменены, удалены):</p>



<pre class="wp-block-code"><code>git log -p -1 &lt;commit_hash&gt;</code></pre>



<p>Просмотреть все содержимое файла с изменениями, внесенными после последнего коммита:</p>



<pre class="wp-block-code"><code>git diff -U9999 &lt;file&gt;</code></pre>



<p>где <code>-U9999</code> означает: показывать до <strong>9999</strong> строк контекста вокруг каждого изменения. Таким образом будет показан весь файл с пометками изменений. По умолчанию показывается по 3 строки &#171;до и после&#187; изменений.</p>



<h2 class="wp-block-heading">Получение отсутствующего файла</h2>



<p>Чтобы получить файл, отсутствующий в локальном репозитории, с удаленного репозитория:</p>



<pre class="wp-block-code"><code>git checkout &lt;file&gt;</code></pre>



<h2 class="wp-block-heading">Отмена отслеживания файла</h2>



<p>Чтобы удалить файл из удаленного репозитория Git и больше не отслеживать его, но оставить файл на диске (в рабочей директории):</p>



<pre class="wp-block-code"><code>git rm --cached &lt;file&gt;</code></pre>



<p>После этой команды Git будет считать файл неотслеживаемым (<strong>untracked</strong>).</p>



<h2 class="wp-block-heading">Независимая версия файла в удаленном репозитории</h2>



<p>Чтобы оставить файл/директорию в удаленном репозитории Git, но не отслеживать:</p>



<pre class="wp-block-code"><code>git update-index --skip-worktree &lt;file&gt;</code></pre>



<p>Так в удаленном репозитории Git будет собственная независимая версия файла/директории.</p>



<h2 class="wp-block-heading">Добавление файла в сделанный коммит</h2>



<p>Если был сделан коммит:</p>



<pre class="wp-block-code"><code>git commit -m "comment"</code></pre>



<p>А файл <strong>forgotten_file</strong> не был добавлен в стейдж с помощью <strong>git add</strong> и, таким образом, не попал в коммит. А очень нужно сделать единый коммит с забытым файлом. Делается это двумя командами:</p>



<pre class="wp-block-code"><code>git add forgotten_file</code></pre>



<pre class="wp-block-code"><code>git commit --amend</code></pre>



<h2 class="wp-block-heading">Добавление соавтора</h2>



<p>Чтобы пользователь мог добавлять свои правки в ваш удаленный репозиторий, его нужно добавить в соавторы.</p>



<p>На сайте с Gogs (у меня это <strong>https://git.adminkin.pro/)</strong> переходим к нужному репозиторию, выбираем вкладку <strong>Настройки</strong>, а затем <strong>Сотрудничество</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/06/dobavlenie-soavtora.png" data-rel="lightbox-gallery-58ETzK4l" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/dobavlenie-soavtora-1024x576.png" alt="Добавление соавтора" class="wp-image-8222" srcset="https://adminkin.pro/wp-content/uploads/2025/06/dobavlenie-soavtora-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/dobavlenie-soavtora-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/dobavlenie-soavtora-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/dobavlenie-soavtora-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/06/dobavlenie-soavtora-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/06/dobavlenie-soavtora.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>В строке поиска набираем имя нужного пользователя и нажимаем кнопку <strong>Добавить нового соавтора</strong>. И проверяем, что у пользователя добавились права на запись.</p>



<p>Кроме прав на запись, пользователь должен быть активирован. Чтобы это проверить, заходим на сайт Gogs под учетной записью администратора, переходим в <strong>Панель администратора</strong>, в раздел <strong>Пользователи</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/06/polzovatel-aktivirovan.png" data-rel="lightbox-gallery-58ETzK4l" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/polzovatel-aktivirovan-1024x576.png" alt="Пользователь активирован" class="wp-image-8232" srcset="https://adminkin.pro/wp-content/uploads/2025/06/polzovatel-aktivirovan-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/polzovatel-aktivirovan-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/polzovatel-aktivirovan-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/polzovatel-aktivirovan-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/06/polzovatel-aktivirovan-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/06/polzovatel-aktivirovan.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Нужный пользователь должен быть с &#171;галочкой&#187; <strong>Активирован</strong>.</p>



<h2 class="wp-block-heading">Клонирование удаленного репозитория</h2>



<p>Чтобы клонировать существующий удаленный репозиторий (т.е. создать локальную копию):</p>



<pre class="wp-block-code"><code>git clone https://git.adminkin.pro/&lt;git_user&gt;/interview.git</code></pre>



<h2 class="wp-block-heading">Вывод</h2>



<p>А какие Git команды вы часто используете? Напишите в комментариях под статьей.</p>


 <div class="hp-vendors hp-block hp-grid"><div class="hp-row"><div class="hp-grid__item hp-col-sm-12 hp-col-xs-12"><article class="hp-vendor hp-vendor--view-block"><header class="hp-vendor__header"><div class="hp-vendor__image">
	<a href="https://adminkin.pro/vendor/irinak/">
					<img decoding="async" src="https://adminkin.pro/wp-content/uploads/2023/08/Irina-K.jpg" alt="Ирина K." loading="lazy">
			</a>
</div>
</header><div class="hp-vendor__content"><h4 class="hp-vendor__name"><a href="https://adminkin.pro/vendor/irinak/">Ирина K.</a>
	<i class="hp-vendor__verified-badge hp-icon fas fa-check-circle" title="Проверен"></i>
	</h4><div class="hp-vendor__details hp-vendor__details--primary"><time class="hp-vendor__registered-date hp-vendor__date hp-meta" datetime="2022-07-22 16:45:26">
	Автор и создатель сайта</time>
</div></div><footer class="hp-vendor__footer"><div class="hp-vendor__actions hp-vendor__actions--primary"></div></footer></article></div></div></div>


<p></p>
<p>Сообщение <a href="https://adminkin.pro/chasto-ispolzuemye-git-komandy/">Часто используемые Git команды</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://adminkin.pro/chasto-ispolzuemye-git-komandy/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Как звук с удаленного сервера воспроизвести на локальной машине?</title>
		<link>https://adminkin.pro/kak-peredavat-zvuk-s-udalennogo-servera-na-lokalnye-bluetooth-naushniki/</link>
					<comments>https://adminkin.pro/kak-peredavat-zvuk-s-udalennogo-servera-na-lokalnye-bluetooth-naushniki/#respond</comments>
		
		<dc:creator><![CDATA[Ирина К.]]></dc:creator>
		<pubDate>Tue, 10 Jun 2025 12:04:14 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[crontab]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[port]]></category>
		<guid isPermaLink="false">https://adminkin.pro/?p=7847</guid>

					<description><![CDATA[<p>Например, к локальной машине подключены Bluetooth наушники, и на них нужно вывести звук с удаленного сервера. На сервере и на локальной машине &#8212; Debian. Давайте настроим, чтобы локальные Bluetooth наушники отображались на удаленном сервера как еще один аудиовыход. И выведем на этот аудиовыход звук. Погнали! Настройка локальной машины Звук через PipeWire вместо PulseAudio Проверяем, что используем звук через более современный PipeWire, а не через устаревший звуковой сервер PulseAudio: Если строка вида: Server Name: PulseAudio (on PipeWire 0.3.65) то это PipeWire. Если строка вида: Server Name: pulseaudio то это PulseAudio. Если PulseAudio, то устанавливаем PipeWire. PipeWire объединяет возможности PulseAudio и JACK, обладает лучшей поддержкой Bluetooth, более низкой задержкой и лучшей совместимостью [&#8230;]</p>
<p>Сообщение <a href="https://adminkin.pro/kak-peredavat-zvuk-s-udalennogo-servera-na-lokalnye-bluetooth-naushniki/">Как звук с удаленного сервера воспроизвести на локальной машине?</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Например, к локальной машине подключены Bluetooth наушники, и на них нужно вывести звук с удаленного сервера. На сервере и на локальной машине &#8212; Debian. Давайте настроим, чтобы локальные Bluetooth наушники отображались на удаленном сервера как еще один аудиовыход. И выведем на этот аудиовыход звук. Погнали!</p>



<span id="more-7847"></span>



<h2 class="wp-block-heading">Настройка локальной машины</h2>



<h3 class="wp-block-heading">Звук через PipeWire вместо PulseAudio</h3>



<p>Проверяем, что используем звук через более современный <strong>PipeWire</strong>, а не через устаревший звуковой сервер <strong>PulseAudio</strong>:</p>



<pre class="wp-block-code"><code>pactl info</code></pre>



<p>Если строка вида:</p>



<pre class="wp-block-preformatted">Server Name: PulseAudio (on PipeWire 0.3.65)</pre>



<p>то это <strong>PipeWire</strong>.</p>



<p>Если строка вида:</p>



<pre class="wp-block-preformatted">Server Name: pulseaudio</pre>



<p>то это <strong>PulseAudio</strong>.</p>



<p>Если <strong>PulseAudio</strong>, то устанавливаем <strong>PipeWire</strong>. <strong>PipeWire</strong> объединяет возможности <strong>PulseAudio</strong> и JACK, обладает лучшей поддержкой Bluetooth, более низкой задержкой и лучшей совместимостью с современными системами.</p>



<p>Устанавливаем:</p>



<pre class="wp-block-code"><code>apt install pipewire-audio-client-libraries pipewire-pulse wireplumber libspa-0.2-bluetooth</code></pre>



<p>Далее проще всего перезагрузиться, и после перезагрузки будет уже работать <strong>PipeWire</strong> вместо <strong>PulseAudio</strong>.</p>



<pre class="wp-block-code"><code>systemctl --user status pipewire pipewire-pulse</code></pre>



<h3 class="wp-block-heading">&#171;Проброс&#187; аудиоустройства через сеть</h3>



<p>Чтобы Bluetooth наушники, подключенные к локальной машине, были видны на удаленном сервере как аудиоутройство, нужно &#171;пробросить&#187; аудиоустройство через сеть.</p>



<p>Создаем конфигурационный файл <strong>~/.config/pipewire/pipewire-pulse.conf.d/tcp-server.conf</strong>:</p>



<pre class="wp-block-code"><code>mkdir -p ~/.config/pipewire/pipewire-pulse.conf.d</code></pre>



<pre class="wp-block-code"><code>touch ~/.config/pipewire/pipewire-pulse.conf.d/tcp-server.conf</code></pre>



<p>В созданный конфигурационный файл добавляем следующий текст:</p>



<pre class="wp-block-code"><code>pulse.cmd = &#91;
    { cmd = "load-module" args = "module-native-protocol-tcp auth-ip-acl=127.0.0.1,192.168.1.0/24 auth-anonymous=1" flags = &#91;]}
]</code></pre>



<p>Это команда разрешает входящие сетевые подключения к звуковому серверу по <strong>TCP</strong> (порт <strong>4713</strong>).</p>



<p><code>module-native-protocol-tcp</code> &#8212; это модуль, разрешающий сетевые подключения.</p>



<p><code>auth-ip-acl=127.0.0.1,192.168.1.0/24</code> &#8212; это список IP адресов и подсетей, из которых разрешено подключаться. У меня локальная машина и удаленный сервер находятся в одной подсети <strong>192.168.1.0/24</strong>.</p>



<p><code>auth-anonymous=1</code> &#8212; разрешает анонимные подключения. Это безопасно только в локальной сети. В случае работы через Интернет необходимо настраивать авторизацию.</p>



<p>Перезагружаем <strong>PipeWire</strong>:</p>



<pre class="wp-block-code"><code>systemctl --user restart pipewire pipewire-pulse</code></pre>



<p>Проверяем, что теперь принимаются подключения по <strong>TCP</strong> на порт <strong>4713</strong>:</p>



<pre class="wp-block-code"><code>ss -tulnp | grep pipewire-pulse</code></pre>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/06/prinimayutsya-podklyucheniya-po-tcp-na-port-4713.png" data-rel="lightbox-gallery-ffUSnPAm" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/prinimayutsya-podklyucheniya-po-tcp-na-port-4713-1024x576.png" alt="Принимаются подключения по tcp на порт 4713" class="wp-image-7955" srcset="https://adminkin.pro/wp-content/uploads/2025/06/prinimayutsya-podklyucheniya-po-tcp-na-port-4713-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/prinimayutsya-podklyucheniya-po-tcp-na-port-4713-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/prinimayutsya-podklyucheniya-po-tcp-na-port-4713-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/prinimayutsya-podklyucheniya-po-tcp-na-port-4713-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/06/prinimayutsya-podklyucheniya-po-tcp-na-port-4713-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/06/prinimayutsya-podklyucheniya-po-tcp-na-port-4713.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Узнаем <strong>sink</strong> подключенных Bluetooth наушников, которые &#171;пробрасываем&#187; через сеть:</p>



<pre class="wp-block-code"><code>pactl list short sinks</code></pre>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/06/komanda-pactl-list-short-sinks.png" data-rel="lightbox-gallery-ffUSnPAm" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/komanda-pactl-list-short-sinks-1024x576.png" alt="Команда pactl list short sinks" class="wp-image-7951" srcset="https://adminkin.pro/wp-content/uploads/2025/06/komanda-pactl-list-short-sinks-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/komanda-pactl-list-short-sinks-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/komanda-pactl-list-short-sinks-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/komanda-pactl-list-short-sinks-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/06/komanda-pactl-list-short-sinks-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/06/komanda-pactl-list-short-sinks.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>У меня это <strong>bluez_output.28_A6_54_CF_62_79.1</strong>.</p>



<p>Итак, на локальной машине звуковой сервер, принимающий сетевые подключения по <strong>TCP</strong> на порт <strong>4713</strong>. А для подключения именно к Bluetooth наушникам мы узнали их <strong>sink</strong>.</p>



<p>Далее на удаленном сервере мы настроим подключение по <strong>TCP</strong> к этому звуковому серверу и к именно Bluetooth наушникам. Так на удаленном сервере эти Bluetooth наушники отобразятся как локальное аудиоустройство, аудиовыход.</p>



<h2 class="wp-block-heading">Настройка удаленного сервера</h2>



<p>Аналогично, как на локальной машине, проверяем, что звук через <strong>PipeWire</strong>.</p>



<h3 class="wp-block-heading">Туннельное подключение</h3>



<p>Создаем конфигурационный файл <strong>~/.config/pipewire/pipewire-pulse.conf.d/tcp-client.conf</strong>:</p>



<pre class="wp-block-code"><code>mkdir -p ~/.config/pipewire/pipewire-pulse.conf.d</code></pre>



<pre class="wp-block-code"><code>touch ~/.config/pipewire/pipewire-pulse.conf.d/tcp-client.conf</code></pre>



<p>В созданный конфигурационный файл добавляем следующий текст:</p>



<pre class="wp-block-code"><code>pulse.cmd = &#91;
    {cmd = "load-module" args = "module-tunnel-sink server=192.168.1.50 sink=bluez_output.28_A6_54_CF_62_79.1" flags = &#91;]}
]</code></pre>



<p>Эта команда создает локальный <strong>sink</strong> (аудиоустройство, аудиовыход) через туннельное подключение к звуковому серверу по <strong>TCP</strong>.</p>



<p><strong><code>module-tunnel-sink</code></strong> &#8212; модуль, создающий туннельное подключение.</p>



<p><code>server=192.168.1.50</code> &#8212; IP адрес звукового сервера, принимающего подключения по <strong>TCP</strong>.</p>



<p><code>sink=bluez_output.28_A6_54_CF_62_79.1</code> &#8212; это <strong>sink</strong> Bluetooth наушников.</p>



<p>Перезагружаем <strong>PipeWire</strong>:</p>



<pre class="wp-block-code"><code>systemctl --user restart pipewire pipewire-pulse</code></pre>



<p>Смотрим аудиовыходы:</p>



<pre class="wp-block-code"><code>pactl list short sinks</code></pre>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/06/lokalnyj-sink-cherez-tunnelnoe-podklyuchenie.png" data-rel="lightbox-gallery-ffUSnPAm" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/lokalnyj-sink-cherez-tunnelnoe-podklyuchenie-1024x576.png" alt="Локальный sink через туннельное подключение" class="wp-image-7997" srcset="https://adminkin.pro/wp-content/uploads/2025/06/lokalnyj-sink-cherez-tunnelnoe-podklyuchenie-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/lokalnyj-sink-cherez-tunnelnoe-podklyuchenie-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/lokalnyj-sink-cherez-tunnelnoe-podklyuchenie-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/lokalnyj-sink-cherez-tunnelnoe-podklyuchenie-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/06/lokalnyj-sink-cherez-tunnelnoe-podklyuchenie-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/06/lokalnyj-sink-cherez-tunnelnoe-podklyuchenie.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Созданный нами аудиовыход с наименованием, начинающимся с <strong>tunnel-sink</strong>. У меня: <strong>tunnel-sink.192.168.1.50</strong>.</p>



<p>Давайте проверять работоспособность. Созданный аудиовыход делаем аудиовыходом по умолчанию, например, так:</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/06/probros-audioustrojstva-cherez-set.png" data-rel="lightbox-gallery-ffUSnPAm" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/probros-audioustrojstva-cherez-set-1024x576.png" alt="Проброс аудиоустройства через сеть" class="wp-image-8008" srcset="https://adminkin.pro/wp-content/uploads/2025/06/probros-audioustrojstva-cherez-set-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/probros-audioustrojstva-cherez-set-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/probros-audioustrojstva-cherez-set-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/probros-audioustrojstva-cherez-set-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/06/probros-audioustrojstva-cherez-set-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/06/probros-audioustrojstva-cherez-set.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>И проиграем какой-нибудь звуковой файл:</p>



<pre class="wp-block-code"><code>paplay /usr/share/sounds/alsa/Side_Left.wav</code></pre>



<p>В Bluetooth наушниках локальной машины должны услышать звучание.</p>



<h3 class="wp-block-heading">Автоматическое восстановление туннельного подключения</h3>



<p>Для автоматического восстановления разорвавшегося туннельного подключения к звуковому серверу напишем <strong>bash</strong> скрипт и добавим его в планировщик задач <strong>cron</strong>.</p>



<p>Создаем <strong>bash</strong> скрипт <strong>/home/user/cron_tunnel_reconnect.sh</strong>:</p>



<pre class="wp-block-code"><code>touch /home/user/cron_tunnel_reconnect.sh</code></pre>



<p>В него добавляем следующий текст:</p>



<pre class="wp-block-code"><code>#!/bin/bash

AUDIO_SERVER_IP="192.168.1.50"
BLUETOOTH_SINK="bluez_output.28_A6_54_CF_62_79.1"

export DISPLAY=:0
uid=$(id -u)
export XDG_RUNTIME_DIR=/run/user/$uid
export DBUS_SESSION_BUS_ADDRESS=unix:path=$XDG_RUNTIME_DIR/bus

if ! pactl list short modules | grep -q tunnel-sink; then
    pactl load-module module-tunnel-sink server="$AUDIO_SERVER_IP" sink="$BLUETOOTH_SINK"
fi</code></pre>



<p>Скрипт экспортирует переменные окружения: <strong>DISPLAY</strong>, <strong>XDG_RUNTIME_DIR</strong>, <strong>DBUS_SESSION_BUS_ADDRESS</strong>, чтобы привязаться к конкретной графической пользовательской сессии. И уже в конкретной графической пользовательской сессии проверяет, загружен ли модуль <strong>tunnel-sink</strong>. Если не загружен, то загружает и устанавливает туннельное подключение к звуковому серверу, к Bluetooth наушникам.</p>



<p>Делаем скрипт <strong>/home/user/cron_tunnel_reconnect.sh</strong> исполняемым:</p>



<pre class="wp-block-code"><code>chmod +x /home/user/cron_tunnel_reconnect.sh</code></pre>



<p>Открываем <strong>crontab</strong> на редактирование:</p>



<pre class="wp-block-code"><code>crontab -e</code></pre>



<p>И добавляем строку:</p>



<pre class="wp-block-code"><code>*/1 * * * * /home/user/cron_tunnel_reconnect.sh</code></pre>



<p>Готово! Скрипт будет вызываться на исполнение каждую минуту.</p>



<h2 class="wp-block-heading">Вывод</h2>



<p>&#171;Проброс&#187; аудиоустройства через сеть в Debian оказался несложной задачей. Все вопросы жду в комментариях под статьей.</p>


 <div class="hp-vendors hp-block hp-grid"><div class="hp-row"><div class="hp-grid__item hp-col-sm-12 hp-col-xs-12"><article class="hp-vendor hp-vendor--view-block"><header class="hp-vendor__header"><div class="hp-vendor__image">
	<a href="https://adminkin.pro/vendor/irinak/">
					<img decoding="async" src="https://adminkin.pro/wp-content/uploads/2023/08/Irina-K.jpg" alt="Ирина K." loading="lazy">
			</a>
</div>
</header><div class="hp-vendor__content"><h4 class="hp-vendor__name"><a href="https://adminkin.pro/vendor/irinak/">Ирина K.</a>
	<i class="hp-vendor__verified-badge hp-icon fas fa-check-circle" title="Проверен"></i>
	</h4><div class="hp-vendor__details hp-vendor__details--primary"><time class="hp-vendor__registered-date hp-vendor__date hp-meta" datetime="2022-07-22 16:45:26">
	Автор и создатель сайта</time>
</div></div><footer class="hp-vendor__footer"><div class="hp-vendor__actions hp-vendor__actions--primary"></div></footer></article></div></div></div><p>Сообщение <a href="https://adminkin.pro/kak-peredavat-zvuk-s-udalennogo-servera-na-lokalnye-bluetooth-naushniki/">Как звук с удаленного сервера воспроизвести на локальной машине?</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://adminkin.pro/kak-peredavat-zvuk-s-udalennogo-servera-na-lokalnye-bluetooth-naushniki/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Бесплатный оффлайн переводчик в реальном времени у тебя в ухе</title>
		<link>https://adminkin.pro/besplatnyj-offlajn-perevodchik-v-realnom-vremeni-u-tebya-v-uhe/</link>
					<comments>https://adminkin.pro/besplatnyj-offlajn-perevodchik-v-realnom-vremeni-u-tebya-v-uhe/#respond</comments>
		
		<dc:creator><![CDATA[Ирина К.]]></dc:creator>
		<pubDate>Thu, 05 Jun 2025 08:52:02 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[realtime]]></category>
		<guid isPermaLink="false">https://adminkin.pro/?p=6952</guid>

					<description><![CDATA[<p>Я готовлюсь к интервью на английском языке. Поэтому бесплатный, оффлайн переводчик в реальном времени с английского языка на русский всего того, что происходит на интервью, мне очень пригодится. Давайте делать! Что будем делать? Будем делать бесплатный, оффлайн и в реальном времени переводчик, который будет распознавать речь на английском языке, переводить на русский язык и синтезированным голосом вещать в Bluetooth наушник в ухе. Бесплатный &#8212; поскольку в России все меньше возможностей оплатить иностранные платные сервисы, да и не хотелось бы зависеть от их доступности и нагруженности. Оффлайн &#8212; чтобы не зависеть от качества и доступности Интернета. В реальном времени &#8212; поскольку требуется перевод &#171;живой&#187; беседы на интервью. Операционная система и &#171;железо&#187; [&#8230;]</p>
<p>Сообщение <a href="https://adminkin.pro/besplatnyj-offlajn-perevodchik-v-realnom-vremeni-u-tebya-v-uhe/">Бесплатный оффлайн переводчик в реальном времени у тебя в ухе</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Я готовлюсь к интервью на английском языке. Поэтому бесплатный, оффлайн переводчик в реальном времени с английского языка на русский всего того, что происходит на интервью, мне очень пригодится. Давайте делать!</p>



<span id="more-6952"></span>



<h2 class="wp-block-heading">Что будем делать?</h2>



<p>Будем делать <strong>бесплатный</strong>, <strong>оффлайн</strong> и в <strong>реальном времени</strong> переводчик, который будет распознавать речь на английском языке, переводить на русский язык и синтезированным голосом вещать в Bluetooth наушник в ухе.</p>



<p><strong>Бесплатный</strong> &#8212; поскольку в России все меньше возможностей оплатить иностранные платные сервисы, да и не хотелось бы зависеть от их доступности и нагруженности.</p>



<p><strong>Оффлайн </strong>&#8212; чтобы не зависеть от качества и доступности Интернета.</p>



<p><strong>В реальном времени</strong> &#8212; поскольку требуется перевод &#171;живой&#187; беседы на интервью.</p>



<h2 class="wp-block-heading">Операционная система и &#171;железо&#187;</h2>



<p>Операционная система: Debian 12. А &#171;железо&#187; &#8212; приведу характеристики моего:</p>



<pre class="wp-block-preformatted">CPU: Intel(R) Xeon(R) CPU E3-1275 v6 @ 3.80GHz<br>Кол-во ядер CPU: 8<br>RAM: 32 Gb<br>Disk: 450 Gb SSD<br>GPU: NVIDIA GeForce RTX 4060 Ti<br>GPU MEM: 16 Gb</pre>



<p>Тут хотелось бы напомнить, что в Интернете существует большое количество предложений аренды сервера с GPU. А как настроить удаленный рабочий стол с пробросом локального микрофона и динамика на сервер читайте в статье: &#171;<a href="https://adminkin.pro/udalennyj-rabochij-stol-so-zvukom-mikrofonom-peredachej-fajlov-i-usb-ustrojstvami/" target="_blank" rel="noreferrer noopener">Удаленный рабочий стол со звуком, микрофоном, передачей файлов и USB устройствами</a>&#171;.</p>



<h2 class="wp-block-heading">Установка Python и необходимых пакетов</h2>



<p>Устанавливаем <strong>Python</strong>, менеджер пакетов <strong>Pip</strong> для Python, пакет <strong>Venv</strong> для виртуальных окружений в Python и набор инструментов для работы с аудио и видео <strong>FFmpeg</strong>:</p>



<pre class="wp-block-code"><code>apt install python3 python3-pip python3-venv ffmpeg</code></pre>



<p>Под обычным пользователем (не root) cоздаем виртуальное окружение Python с именем <strong>venv</strong>:</p>



<pre class="wp-block-code"><code>python3 -m venv venv</code></pre>



<p>Активируем виртуальное окружение <strong>venv</strong>:</p>



<pre class="wp-block-code"><code>source venv/bin/activate</code></pre>



<p>Обновляем версию <strong>Pip</strong>:</p>



<pre class="wp-block-code"><code>pip install --upgrade pip</code></pre>



<p>Будем устанавливать Python-библиотеку <strong>PyTorch</strong> с поддержкой <strong>GPU</strong> (Graphics Processing Unit) и <strong>CUDA</strong> (Compute Unified Device Architecture). Это позволит улучшить производительность за счет использования ресурсов видеокарты. </p>



<p>Проверить, что NVIDIA GPU поддерживает CUDA, можно на официальном сайте NVIDIA: <a href="https://developer.nvidia.com/cuda-gpus" target="_blank" rel="noreferrer noopener">https://developer.nvidia.com/cuda-gpus</a>.</p>



<p>Узнаем версию CUDA:</p>



<pre class="wp-block-code"><code>nvidia-smi</code></pre>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/06/versiya-cuda.png" data-rel="lightbox-gallery-sQtC65fx" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/versiya-cuda-1024x576.png" alt="Версия CUDA" class="wp-image-7632" srcset="https://adminkin.pro/wp-content/uploads/2025/06/versiya-cuda-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/versiya-cuda-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/versiya-cuda-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/versiya-cuda-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/06/versiya-cuda-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/06/versiya-cuda.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>У меня CUDA версии 12.8.</p>



<p>Переходим на сайт <strong>PyTorch</strong> по ссылке: <a href="https://pytorch.org/get-started/locally" target="_blank" rel="noreferrer noopener">https://pytorch.org/get-started/locally</a>.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/06/pytorch-s-podderzhkoj-gpu-s-cuda.png" data-rel="lightbox-gallery-sQtC65fx" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/pytorch-s-podderzhkoj-gpu-s-cuda-1024x576.png" alt="PyTorch с поддержкой GPU с CUDA" class="wp-image-7636" srcset="https://adminkin.pro/wp-content/uploads/2025/06/pytorch-s-podderzhkoj-gpu-s-cuda-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/pytorch-s-podderzhkoj-gpu-s-cuda-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/pytorch-s-podderzhkoj-gpu-s-cuda-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/pytorch-s-podderzhkoj-gpu-s-cuda-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/06/pytorch-s-podderzhkoj-gpu-s-cuda-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/06/pytorch-s-podderzhkoj-gpu-s-cuda.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Выбираем версию CUDA и получаем команду на скачивание <strong>PyTorch</strong>. У меня получилась следующая команда:</p>



<pre class="wp-block-code"><code>pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128</code></pre>



<p>Установим набор инструментов <strong>NVIDIA CUDA Toolkit</strong>. Для версий CUDA <strong>12.X</strong> переходим по ссылке: <a href="https://developer.nvidia.com/cuda-toolkit-archive" target="_blank" rel="noreferrer noopener">https://developer.nvidia.com/cuda-toolkit-archive</a> и выбираем самую свежую версию <strong>NVIDIA CUDA Toolkit</strong>.</p>



<figure class="wp-block-image size-large is-resized"><a href="https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cuda-toolkit.png" data-rel="lightbox-gallery-sQtC65fx" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cuda-toolkit-1024x576.png" alt="Установка NVIDIA CUDA Toolkit" class="wp-image-7655" style="width:1140px;height:auto" srcset="https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cuda-toolkit-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cuda-toolkit-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cuda-toolkit-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cuda-toolkit-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cuda-toolkit-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cuda-toolkit.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Выбираем операционную систему, дистрибутив, тип установщика. Скачиваем и устанавливаем набор инструментов согласно появивщейся инструкции. У меня в инструкции были следующие команды:</p>



<pre class="wp-block-code"><code>wget https://developer.download.nvidia.com/compute/cuda/12.8.1/local_installers/cuda-repo-debian12-12-8-local_12.8.1-570.124.06-1_amd64.deb
sudo dpkg -i cuda-repo-debian12-12-8-local_12.8.1-570.124.06-1_amd64.deb
sudo cp /var/cuda-repo-debian12-12-8-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-8</code></pre>



<p>Установим <strong>NVIDIA cuDNN</strong> &#8212; специализированную библиотеку от NVIDIA, предназначенную для ускорения работы нейронных сетей на GPU. Для версий CUDA <strong>12.X</strong> переходим по ссылке: <a href="https://developer.nvidia.com/cudnn-archive" target="_blank" rel="noreferrer noopener">https://developer.nvidia.com/cudnn-archive</a> и выбираем самую свежую версию <strong>NVIDIA cuDNN</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cudnn.png" data-rel="lightbox-gallery-sQtC65fx" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cudnn-1024x576.png" alt="Установка NVIDIA cuDNN" class="wp-image-7668" srcset="https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cudnn-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cudnn-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cudnn-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cudnn-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cudnn-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/06/ustanovka-nvidia-cudnn.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Выбираем операционную систему, дистрибутив, тип установщика. Скачиваем и устанавливаем набор инструментов согласно появивщейся инструкции. У меня в инструкции были следующие команды:</p>



<pre class="wp-block-code"><code>wget https://developer.download.nvidia.com/compute/cudnn/9.8.0/local_installers/cudnn-local-repo-debian12-9.8.0_1.0-1_amd64.deb
sudo dpkg -i cudnn-local-repo-debian12-9.8.0_1.0-1_amd64.deb
sudo cp /var/cuda-repo-debian12-9-8-local/cudnn-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cudnn</code></pre>



<h2 class="wp-block-heading">Распознавание речи</h2>



<p>Устанавливаем <strong>RealtimeSTT</strong> &#8212; библиотеку для распознавания речи (SST=Speech-to-Text) в реальном времени:</p>



<pre class="wp-block-code"><code>pip install RealtimeSTT</code></pre>



<h3 class="wp-block-heading">Тест на распознавание речи</h3>



<p>Тут мы уже можем протестировать работоспособность распознавания речи. Вот код Python-программы для этого:</p>



<pre class="wp-block-code"><code>from RealtimeSTT import AudioToTextRecorder

if __name__ == '__main__':
    print("Wait until it says 'speak now'")
    recorder = AudioToTextRecorder()

    while True:
        print(recorder.text())</code></pre>



<p>Аудиосигнал захватывается с микрофона по умолчанию, распознается речь, результат распознавания выводится в виде текста на консоль:</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/06/test-na-raspoznavanie-rechi.png" data-rel="lightbox-gallery-sQtC65fx" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/test-na-raspoznavanie-rechi-1024x576.png" alt="Тест на распознавание речи" class="wp-image-7686" srcset="https://adminkin.pro/wp-content/uploads/2025/06/test-na-raspoznavanie-rechi-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/test-na-raspoznavanie-rechi-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/test-na-raspoznavanie-rechi-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/test-na-raspoznavanie-rechi-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/06/test-na-raspoznavanie-rechi-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/06/test-na-raspoznavanie-rechi.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h3 class="wp-block-heading">Модель распознавания речи</h3>



<p>Для распознавания речи по умолчанию используется модель <strong>Faster Whisper</strong> размера <strong>tiny</strong>.</p>



<p>При первом обращении модель скачивается с сайта <strong>Hugging Face</strong>: <a href="https://huggingface.co/" target="_blank" rel="noreferrer noopener">https://huggingface.co/</a>. При последующих обращениях используется скаченная модель. Директория для размещения скаченной модели: <strong>~/.cache/huggingface/hub/</strong>.</p>



<h3 class="wp-block-heading">Модель обнаружения голосовой активности</h3>



<p>Для обнаружения голосовой активности используются: <strong>WebRTCVAD</strong> (для начального обнаружения голосовой активности) и <strong>SileroVAD</strong> (для более точного обнаружения).</p>



<p>При первом обращении модель <strong>SileroVAD</strong> скачивается с GitHub-репозитория: <a href="https://github.com/snakers4/silero-vad.git" target="_blank" rel="noreferrer noopener">https://github.com/snakers4/silero-vad.git</a>. При последующих обращениях используется скаченная модель. Директория для размещения скаченной модели:<strong> ~/.cache/torch/hub/snakers4_silero-vad_master/</strong>.</p>



<p><strong>WebRTCVAD</strong> &#8212; это не обучаемая модель, а нативная C++-библиотека. Используется в Python через обёртку &#8212; Python-библиотеку <strong>webrtcvad-wheels</strong>. При запуске ничего не скачивает из Интернета.</p>



<h2 class="wp-block-heading">Перевод с одного языка на другой</h2>



<p>Устанавливаем <strong>Transformers</strong> &#8212; библиотеку от <strong>Hugging Face</strong>, предоставляющую доступ к современным предобученным моделям.</p>



<pre class="wp-block-code"><code>pip install transformers==4.51.3</code></pre>



<p>В команде на установку указана конкретная версия библиотеки (<strong>4.51.3</strong>), поскольку самая свежая версия библиотеки на момент написания статьи (<strong>4.52.4</strong>) валится с ошибками.</p>



<h3 class="wp-block-heading">Модель машинного перевода</h3>



<p>Для перевода с английского языка на русский язык будем использовать модель <strong>facebook/nllb-200-1.3B</strong>. Это мощная модель машинного перевода, созданная Meta (<strong>Facebook</strong>), способная переводить между <strong>200</strong> языков напрямую, без необходимости переводить через английский. Модель содержит <strong>1.3</strong> миллиарда параметров.</p>



<p>При первом обращении модель скачивается с сайта <strong>Hugging Face</strong>. При последующих обращениях используется скаченная модель. Директория для размещения скаченной модели: <strong>~/.cache/huggingface/hub/</strong>.</p>



<h2 class="wp-block-heading">Синтез речи</h2>



<p>Устанавливаем <strong>RealtimeTTS</strong> &#8212; библиотеку для синтеза речи (TTS=Text-to-Speech) в реальном времени, настроенную на работу с моделью <strong>Coqui TTS</strong>.</p>



<pre class="wp-block-code"><code>pip install realtimetts&#91;coqui]</code></pre>



<h3 class="wp-block-heading">Модель синтеза речи</h3>



<p><strong>Coqui TTS</strong> &#8212; это высококачественная модель синтеза речи с локальной обработкой, не требующая Интернет. При первом обращении модель скачивается с сервера <strong>Coqui AI</strong>. При последующих обращениях используется скаченная модель. Размещается скаченная модель в поддиректории <strong>models/</strong>.</p>



<h3 class="wp-block-heading">Голос для синтеза речи</h3>



<p>Сделаем запись собственного голоса, чтобы переводчик заговорил нашем же голосом. Нужна запись со следующими параметрами:</p>



<ul class="wp-block-list">
<li>Частота: <strong>22050 Гц</strong></li>



<li>Каналы: <strong>моно</strong></li>



<li>Разрядность: <strong>16 бит</strong></li>



<li>Формат: <strong>WAV</strong></li>



<li>Длительность: ~5-30 секунд</li>
</ul>



<p>Запускаем команду на запись голоса с требуемыми параметрами и длительностью <strong>20 секунд</strong>:</p>



<pre class="wp-block-code"><code>arecord -f S16_LE -r 22050 -c 1 -d 20 -t wav irina.wav</code></pre>



<p>где <code>irina.wav</code> &#8212; это имя выходного файла.</p>



<p>Готово! Голос записан.</p>



<h3 class="wp-block-heading">Тест синтеза речи</h3>



<p>Тут мы уже можем протестировать работоспособность синтеза речи. Вот код Python-программы для этого:</p>



<pre class="wp-block-code"><code>from RealtimeTTS import TextToAudioStream, CoquiEngine

if __name__ == '__main__':

    text = "Привет, мир! "
    engine = CoquiEngine(voices_path='sounds/', voice='irina', language="ru", specific_model="v2.0.3")
    stream = TextToAudioStream(engine, language='ru')
    stream.feed(text).play(language='ru')

    print("Playout finished")
    engine.shutdown()</code></pre>



<p>В поддиректорию <strong>sounds/</strong> я расположила файл <strong>irina.wav</strong>, созданный на предыдущем шаге.</p>



<p>Синтезированная речь воспроизводится на динамике по умолчанию. Ух! Звучит очень реалистично и похожа на мой собственный голос.</p>



<h2 class="wp-block-heading">Вывод звука на Bluetooth наушники</h2>



<p>Настроим вывод синтезированной речи на Bluetooth наушники, которые не являются динамиком по умолчанию.</p>



<h3 class="wp-block-heading">PortAudio по умолчанию</h3>



<p><strong>PyAudio</strong> — это Python-библиотека, которая предоставляет простой интерфейс для работы с <strong>PortAudio</strong>, кросс-платформенным аудио API.</p>



<p>Устанавливается <strong>PortAudio</strong> командой:</p>



<pre class="wp-block-code"><code>apt install portaudio19-dev</code></pre>



<p>Python-библиотека <strong>PyAudio</strong> устанавливается командой:</p>



<pre class="wp-block-code"><code>pip install pyaudio</code></pre>



<p>У меня в таком виде библиотека <strong>PyAudio</strong> не обнаруживает Bluetooth наушники. Т.е., если запустить Python-код:</p>



<pre class="wp-block-code"><code>import pyaudio

p = pyaudio.PyAudio()

for i in range(p.get_device_count()):
    info = p.get_device_info_by_index(i)
    print(f"Device {i}: {info&#91;'name']}")
</code></pre>



<p>то в терминале отобразятся обнаруженные устройства:</p>



<pre class="wp-block-preformatted">Device 0: Sound Blaster Play! 3: USB Audio (hw:0,0)<br>Device 1: HDA NVidia: HDMI 0 (hw:1,3)<br>Device 2: HDA NVidia: HDMI 1 (hw:1,7)<br>Device 3: HDA NVidia: HDMI 2 (hw:1,8)<br>Device 4: HDA NVidia: HDMI 3 (hw:1,9)<br>Device 5: sysdefault<br>Device 6: spdif<br>Device 7: lavrate<br>Device 8: samplerate<br>Device 9: speexrate<br>Device 10: pulse<br>Device 11: speex<br>Device 12: upmix<br>Device 13: vdownmix<br>Device 14: default</pre>



<p>Bluetooth наушников среди них нет.</p>



<h3 class="wp-block-heading">PortAudio с поддержкой PulseAudio</h3>



<p>Чтобы библиотека <strong>PyAudio</strong> обнаруживала Bluetooth устройства, необходимо, чтобы в <strong>PortAudio</strong> была включена поддержка <strong>PulseAudio</strong>. Пересоберем <strong>PortAudio</strong> с поддержкой <strong>PulseAudio</strong>.</p>



<p>Удаляем установленный <strong>PortAudio</strong>:</p>



<pre class="wp-block-code"><code>apt remove portaudio19-dev libportaudio2 libportaudiocpp0</code></pre>



<p>Проверяем, что больше не осталось установленных пакетов, связанных с <strong>PortAudio</strong>:</p>



<pre class="wp-block-code"><code>apt list --installed | grep portaudio</code></pre>



<p>Устанавливаем:</p>



<pre class="wp-block-code"><code>apt install libpulse-dev</code></pre>



<p>Скачиваем и собираем <strong>PortAudio</strong> с поддержкой <strong>PulseAudio</strong>:</p>



<pre class="wp-block-code"><code>git clone https://github.com/PortAudio/portaudio.git</code></pre>



<pre class="wp-block-code"><code>cd portaudio</code></pre>



<pre class="wp-block-code"><code>./configure --with-pulseaudio</code></pre>



<pre class="wp-block-code"><code>make</code></pre>



<pre class="wp-block-code"><code>make install</code></pre>



<p>Добавляем директорию <strong>/usr/local/lib</strong> (место установки <strong>PortAudio</strong> с поддержкой <strong>PulseAudio</strong>) в переменную окружения <strong>LD_LIBRARY_PATH</strong>. Для этого под пользователем <strong>user</strong>:</p>



<pre class="wp-block-code"><code>echo "export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH" &gt;&gt; ~/.bashrc</code></pre>



<p>Применяем изменения:</p>



<pre class="wp-block-code"><code>source ~/.bashrc</code></pre>



<pre class="wp-block-code"><code>source venv/bin/activate</code></pre>



<p>Снова запускаем предыдущий Python-код. Все Bluetooth устройства должны обнаружиться!</p>



<pre class="wp-block-preformatted">Device 0: Sound Blaster Play! 3: USB Audio (hw:0,0)<br>Device 1: HDA NVidia: HDMI 0 (hw:1,3)<br>Device 2: HDA NVidia: HDMI 1 (hw:1,7)<br>Device 3: HDA NVidia: HDMI 2 (hw:1,8)<br>Device 4: HDA NVidia: HDMI 3 (hw:1,9)<br>Device 5: spdif<br>Device 6: pulse<br>Device 7: speex<br>Device 8: upmix<br>Device 9: vdownmix<br>Device 10: default<br>Device 11: Default Sink<br>Device 12: Default Source<br>Device 13: Sound Blaster Play! 3 Analog Stereo<br>Device 14: NoMachine Output<br>Device 15: HOCO W35 Max<br>Device 16: Monitor of Sound Blaster Play! 3 Analog Stereo<br>Device 17: Sound Blaster Play! 3 Digital Stereo (IEC958)<br>Device 18: Monitor of NoMachine Output<br>Device 19: Remapped nx_voice_out<br>Device 20: Monitor of HOCO W35 Max</pre>



<p>Теперь, указав индекс устройства, мы выведем синтезированную речь на это устройство.</p>



<h2 class="wp-block-heading">Небольшие правки RealtimeTTS</h2>



<p>В файле <strong>stream_player.py</strong> из пакета <strong>RealtimeTTS</strong> закомментируем весь следующий код:</p>



<pre class="wp-block-code"><code>while self.audio_stream.stream.get_write_available() &lt; frames_in_sub_chunk:
  if time.time() - start_time &gt; timeout:
    print(f"Wait aborted: Timeout of {timeout}s exceeded. "
        f"Buffer availability: {self.audio_stream.stream.get_write_available()}, "
        f"Frames in sub-chunk: {frames_in_sub_chunk}")
    break
  time.sleep(0.001)  # Small sleep to let the stream process audio</code></pre>



<p>В файле <strong>text_to_stream.py</strong> из пакета <strong>RealtimeTTS</strong> закомментируем строку:</p>



<pre class="wp-block-code"><code>print("SYNTHESIS FINISHED")</code></pre>



<p>А в строке:</p>



<pre class="wp-block-code"><code>and len(self.char_iter.items) &gt; 1</code></pre>



<p>единицу меняем на ноль.</p>



<h2 class="wp-block-heading">Полный код переводчика</h2>



<pre class="wp-block-code"><code>from RealtimeSTT import AudioToTextRecorder
import torch
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
from RealtimeTTS import TextToAudioStream, CoquiEngine
import pyaudio
import logging

if __name__ == '__main__':
    logging.basicConfig(level=logging.ERROR, force=True)

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    model_name = "facebook/nllb-200-1.3B"
    tokenizer = AutoTokenizer.from_pretrained(model_name, use_fast=True)
    model = AutoModelForSeq2SeqLM.from_pretrained(model_name).to(device)
    tokenizer.src_lang = "eng_Latn"
    forced_bos_token_id = tokenizer.convert_tokens_to_ids("rus_Cyrl")

    def translate_text(text):
        inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True, max_length=512).to(device)
        translated_tokens = model.generate(**inputs, forced_bos_token_id=forced_bos_token_id, max_length=512)
        translation = tokenizer.batch_decode(translated_tokens, skip_special_tokens=True)
        return translation&#91;0]

    print("System initializing, please wait...")

    def find_bluetooth_device_index(target_name="HOCO W35 Max", exclude_name="Monitor"):
        p = pyaudio.PyAudio()
        for i in range(p.get_device_count()):
            info = p.get_device_info_by_index(i)
            name = info&#91;'name']
            if target_name in name and exclude_name not in name:
                return i
        return -1

    index = find_bluetooth_device_index()
    if index == -1:
        print("Blutooth device is not found")
        exit(0)
    engine = CoquiEngine(voices_path='sounds/', voice='irina', language="ru", specific_model="v2.0.3", speed=1.2)
    stream = TextToAudioStream(engine, language='ru', output_device_index=index)

    recorder = None
    end_of_sentence_detection_pause = 0.35
    unknown_sentence_detection_pause = 0.7
    mid_sentence_detection_pause = 2.0
    prev_text = ""

    def preprocess_text(text):
        text = text.lstrip()
        if text.startswith("..."):
            text = text&#91;3:]
        text = text.lstrip()
        if text:
            text = text&#91;0].upper() + text&#91;1:]
        return text

    def text_detected(text):
        global prev_text, recorder
        sentence_end_marks = &#91;'.', '!', '?']
        text = preprocess_text(text)

        if text.endswith("..."):
            recorder.post_speech_silence_duration = mid_sentence_detection_pause
        elif text and text&#91;-1] in sentence_end_marks and prev_text and prev_text&#91;-1] in sentence_end_marks:
            recorder.post_speech_silence_duration = end_of_sentence_detection_pause
        else:
            recorder.post_speech_silence_duration = unknown_sentence_detection_pause

        prev_text = text

    def process_text(text):
        text = preprocess_text(text)
        text = text.rstrip()
        if text.endswith("..."):
            text = text&#91;:-2]
        if not text:
            return

        try:
            translated_text = translate_text(text)
            print(f"{translated_text}")
            stream.feed(translated_text).play_async(language='ru', fast_sentence_fragment_allsentences=True)
        except Exception as e:
            print("Exception")

    recorder_config = {
        'spinner': False,
        'model': 'large-v2',
        'download_root': None, # default download root location (~/.cache/huggingface/hub/)
        'realtime_model_type': 'tiny.en',
        'language': 'en',
        'webrtc_sensitivity': 3,
        'post_speech_silence_duration': unknown_sentence_detection_pause,
        'min_length_of_recording': 1.1,
        'min_gap_between_recordings': 0,
        'enable_realtime_transcription': False,
        'realtime_processing_pause': 0.02,
        'on_realtime_transcription_update': text_detected,
        'silero_deactivity_detection': True, # Enables the Silero model for end-of-speech detection
        'early_transcription_on_silence': 0,
        'beam_size': 5,
        'beam_size_realtime': 3,
        'no_log_file': True,
    }

    recorder = AudioToTextRecorder(**recorder_config)
    print("\nSay something...\n")
    
    try:
        while True:
            recorder.text(process_text)
    except KeyboardInterrupt:
        print("Exiting...")
        engine.shutdown()
        exit(0)</code></pre>



<h2 class="wp-block-heading">Потребляемые ресурсы</h2>



<p>Использование графического процессора GPU, видеопамяти, а также список процессов, использующих GPU, удобно смотреть в терминальном приложении <strong>nvtop</strong>. Это монитор ресурсов в реальном времени для видеокарт NVIDIA.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/06/potreblyaemye-resursy-videokarty.png" data-rel="lightbox-gallery-sQtC65fx" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/06/potreblyaemye-resursy-videokarty-1024x576.png" alt="Потребляемые ресурсы видеокарты" class="wp-image-8049" srcset="https://adminkin.pro/wp-content/uploads/2025/06/potreblyaemye-resursy-videokarty-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/06/potreblyaemye-resursy-videokarty-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/06/potreblyaemye-resursy-videokarty-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/06/potreblyaemye-resursy-videokarty.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">Вывод</h2>



<p>Полный код бесплатного, оффлайн переводчика в реальном времени с английского языка на русский получился чуть более 100 строк. Работает очень круто. Я довольна!</p>



<p>Все вопросы жду в комментариях под статьей.</p>


 <div class="hp-vendors hp-block hp-grid"><div class="hp-row"><div class="hp-grid__item hp-col-sm-12 hp-col-xs-12"><article class="hp-vendor hp-vendor--view-block"><header class="hp-vendor__header"><div class="hp-vendor__image">
	<a href="https://adminkin.pro/vendor/irinak/">
					<img decoding="async" src="https://adminkin.pro/wp-content/uploads/2023/08/Irina-K.jpg" alt="Ирина K." loading="lazy">
			</a>
</div>
</header><div class="hp-vendor__content"><h4 class="hp-vendor__name"><a href="https://adminkin.pro/vendor/irinak/">Ирина K.</a>
	<i class="hp-vendor__verified-badge hp-icon fas fa-check-circle" title="Проверен"></i>
	</h4><div class="hp-vendor__details hp-vendor__details--primary"><time class="hp-vendor__registered-date hp-vendor__date hp-meta" datetime="2022-07-22 16:45:26">
	Автор и создатель сайта</time>
</div></div><footer class="hp-vendor__footer"><div class="hp-vendor__actions hp-vendor__actions--primary"></div></footer></article></div></div></div><p>Сообщение <a href="https://adminkin.pro/besplatnyj-offlajn-perevodchik-v-realnom-vremeni-u-tebya-v-uhe/">Бесплатный оффлайн переводчик в реальном времени у тебя в ухе</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://adminkin.pro/besplatnyj-offlajn-perevodchik-v-realnom-vremeni-u-tebya-v-uhe/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Headless сервер на Debian</title>
		<link>https://adminkin.pro/headless-server-na-debian/</link>
					<comments>https://adminkin.pro/headless-server-na-debian/#respond</comments>
		
		<dc:creator><![CDATA[Ирина К.]]></dc:creator>
		<pubDate>Wed, 14 May 2025 10:52:06 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[remotedesktop]]></category>
		<guid isPermaLink="false">https://adminkin.pro/?p=7382</guid>

					<description><![CDATA[<p>Мне нужна графическая сессия на сервере с Debian без монитора (headless) с нужным мне разрешением, например, 1920&#215;1080. Давайте настраивать! Варианты решения Есть вариант физического устройства-заглушки (dummy plug), которое подключается к HDMI или VGA разъему видеокарты и имитирует подключенный монитор. Есть вариант использования виртуального драйвера X-сервера (xserver-xorg-video-dummy), который позволяет запускать графическую сессию без физической видеокарты и монитора. Еще есть вариант использования драйвера видеокарты NVIDIA со специальной конфигурацией. А поскольку у меня уже стоит драйвер видеокарты NVIDIA, то я остановлюсь на этом варианте решения. Headless сервер на Debian с драйвером NVIDIA Итак. Физического монитора на сервере с Debian нет. Но установлен драйвер видеокарты NVIDIA. При удаленном подключении к серверу нужна графическая сессия, [&#8230;]</p>
<p>Сообщение <a href="https://adminkin.pro/headless-server-na-debian/">Headless сервер на Debian</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Мне нужна графическая сессия на сервере с Debian без монитора (<strong>headless</strong>) с нужным мне разрешением, например, 1920&#215;1080. Давайте настраивать!</p>



<span id="more-7382"></span>



<h2 class="wp-block-heading">Варианты решения</h2>



<p>Есть вариант физического устройства-заглушки (<strong>dummy plug</strong>), которое подключается к HDMI или VGA разъему видеокарты и имитирует подключенный монитор.</p>



<p>Есть вариант использования виртуального драйвера X-сервера (<strong>xserver-xorg-video-dummy</strong>), который позволяет запускать графическую сессию без физической видеокарты и монитора.</p>



<p>Еще есть вариант использования драйвера видеокарты <strong>NVIDIA</strong> со специальной конфигурацией. А поскольку у меня уже стоит драйвер видеокарты NVIDIA, то я остановлюсь на этом варианте решения.</p>



<h2 class="wp-block-heading">Headless сервер на Debian с драйвером NVIDIA</h2>



<p>Итак. Физического монитора на сервере с Debian нет. Но установлен драйвер видеокарты NVIDIA. При удаленном подключении к серверу нужна графическая сессия, например, с разрешением <strong>1920&#215;1080</strong>. И чтобы это реализовать, нам понадобится создать и настроить всего один конфигурационный файл <strong>/etc/X11/xorg.conf</strong>.</p>



<p>Автоматически создаем файл конфигурации X-сервера <strong>/etc/X11/xorg.conf</strong>, настроенный на использование графического драйвера NVIDIA:</p>



<pre class="wp-block-code"><code>nvidia-xconfig</code></pre>



<p>Отредактируем полученный файл <strong>/etc/X11/xorg.conf</strong>. В <strong>Section &#171;Monitor&#187;</strong> добавляем:</p>



<pre class="wp-block-code"><code>HorizSync      28-80
VertRefresh    48-75</code></pre>



<p>Это допустимые диапазоны горизонтальной частоты развертки монитора и частоты обновления кадров.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/05/fajl-konfiguraczii-x-servera.png" data-rel="lightbox-gallery-6PqYw8RB" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/05/fajl-konfiguraczii-x-servera-1024x576.png" alt="" class="wp-image-7435" srcset="https://adminkin.pro/wp-content/uploads/2025/05/fajl-konfiguraczii-x-servera-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/05/fajl-konfiguraczii-x-servera-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/05/fajl-konfiguraczii-x-servera-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/05/fajl-konfiguraczii-x-servera-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/05/fajl-konfiguraczii-x-servera-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/05/fajl-konfiguraczii-x-servera.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>В <strong>Section &#171;Device&#187;</strong> добавляем:</p>



<pre class="wp-block-code"><code>Option         "AllowEmptyInitialConfiguration" "true"
Option         "ConnectedMonitor" "DFP-0"</code></pre>



<p>Эти две опции для драйвера NVIDIA. Первая опция позволяет запускать X-сервер, даже если не подключен монитор. Вторая опция заставляет драйвер считать, что подключен определенный тип монитора. <strong>DFP-0</strong> &#8212; это Digital Flat Panel, т.е. монитор с цифровым плоским экраном.</p>



<p>В <strong>Section &#171;Screen&#187;</strong> и <strong>SubSection &#171;Display&#187;</strong> добавляем:</p>



<pre class="wp-block-code"><code>Modes "1920x1080"</code></pre>



<p>Это нужное нам разрешение экрана.</p>



<p>Чтобы изменения вступили в силу, нужно перезапустить дисплей-менеджер. Чтобы проверить, какой дисплей-менеджер используется:</p>



<pre class="wp-block-code"><code>cat /etc/X11/default-display-manager</code></pre>



<p><strong>/usr/sbin/lightdm</strong> &#8212; это LightDM, <strong>/usr/sbin/gdm3</strong> &#8212; это GNOME Display Manager и т.д.</p>



<p>Я перезапускаю дисплей-менеджер с помощью команды:</p>



<pre class="wp-block-code"><code>systemctl restart lightdm</code></pre>



<p>Все готово. Можно удаленно подключаться к серверу и проверять разрешение графической сессии.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/05/x-server-display-configuration.png" data-rel="lightbox-gallery-6PqYw8RB" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/05/x-server-display-configuration-1024x576.png" alt="X Server Display Configuration" class="wp-image-7437" srcset="https://adminkin.pro/wp-content/uploads/2025/05/x-server-display-configuration-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/05/x-server-display-configuration-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/05/x-server-display-configuration-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/05/x-server-display-configuration-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/05/x-server-display-configuration-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/05/x-server-display-configuration.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">Листинг файла /etc/X11/xorg.conf</h2>



<p>Полный листинг файла <strong>/etc/X11/xorg.conf</strong> у меня получился следующий:</p>



<pre class="wp-block-code"><code># nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig:  version 570.124.06

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0" 0 0
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
EndSection

Section "Files"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/psaux"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Keyboard0"
    Driver         "kbd"
EndSection

Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "Unknown"
    Option         "DPMS"
    HorizSync      28-80
    VertRefresh    48-75
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BusID          "PCI:1:0:0"
    Option         "AllowEmptyInitialConfiguration" "true"
    Option         "ConnectedMonitor" "DFP-0"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    SubSection     "Display"
        Depth       24
        Modes      "1920x1080"
    EndSubSection
EndSection
</code></pre>



<h2 class="wp-block-heading">Вывод</h2>



<p>Мы создали графическую сессию с разрешением 1920&#215;1080 на удаленном сервере с Debian без монитора и с видеокартой NVIDIA.</p>



<p>Обсуждаем тему в комментариях под статьей!</p>


 <div class="hp-vendors hp-block hp-grid"><div class="hp-row"><div class="hp-grid__item hp-col-sm-12 hp-col-xs-12"><article class="hp-vendor hp-vendor--view-block"><header class="hp-vendor__header"><div class="hp-vendor__image">
	<a href="https://adminkin.pro/vendor/irinak/">
					<img decoding="async" src="https://adminkin.pro/wp-content/uploads/2023/08/Irina-K.jpg" alt="Ирина K." loading="lazy">
			</a>
</div>
</header><div class="hp-vendor__content"><h4 class="hp-vendor__name"><a href="https://adminkin.pro/vendor/irinak/">Ирина K.</a>
	<i class="hp-vendor__verified-badge hp-icon fas fa-check-circle" title="Проверен"></i>
	</h4><div class="hp-vendor__details hp-vendor__details--primary"><time class="hp-vendor__registered-date hp-vendor__date hp-meta" datetime="2022-07-22 16:45:26">
	Автор и создатель сайта</time>
</div></div><footer class="hp-vendor__footer"><div class="hp-vendor__actions hp-vendor__actions--primary"></div></footer></article></div></div></div><p>Сообщение <a href="https://adminkin.pro/headless-server-na-debian/">Headless сервер на Debian</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://adminkin.pro/headless-server-na-debian/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Удаленный рабочий стол со звуком, микрофоном, передачей файлов и USB устройствами</title>
		<link>https://adminkin.pro/udalennyj-rabochij-stol-so-zvukom-mikrofonom-peredachej-fajlov-i-usb-ustrojstvami/</link>
					<comments>https://adminkin.pro/udalennyj-rabochij-stol-so-zvukom-mikrofonom-peredachej-fajlov-i-usb-ustrojstvami/#respond</comments>
		
		<dc:creator><![CDATA[Ирина К.]]></dc:creator>
		<pubDate>Sun, 20 Apr 2025 08:08:16 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[port]]></category>
		<category><![CDATA[remotedesktop]]></category>
		<guid isPermaLink="false">https://adminkin.pro/?p=7176</guid>

					<description><![CDATA[<p>NoMachine &#8212; бесплатная программа для удаленного доступа к рабочему столу. Работает под Windows, Linux, macOS, Raspberry Pi, Android, iOS. Поддерживает: звук с сервера на клиента, микрофон с клиента на сервер, передачу файлов, USB устройства и даже принтеры. Давайте настраивать! Программа NoMachine Программа NoMachine состоит из двух компонентов: клиента и сервера. На удаленной машине (т.е. на компьютере, рабочий стол которого мы хотим получить на локальной машине) мы будем использовать сервер NoMachine. На локальной машине (т.е. на компьютере, на котором мы хотим получить рабочий стол удаленной машины), мы будем использовать клиент NoMachine. Сервер NoMachine на удаленной машине (Debian) Чтобы скачать NoMachine, переходим по ссылке: https://downloads.nomachine.com. У меня удаленная машина под Debian &#8212; [&#8230;]</p>
<p>Сообщение <a href="https://adminkin.pro/udalennyj-rabochij-stol-so-zvukom-mikrofonom-peredachej-fajlov-i-usb-ustrojstvami/">Удаленный рабочий стол со звуком, микрофоном, передачей файлов и USB устройствами</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>NoMachine &#8212; бесплатная программа для удаленного доступа к рабочему столу. Работает под Windows, Linux, macOS, Raspberry Pi, Android, iOS. Поддерживает: звук с сервера на клиента, микрофон с клиента на сервер, передачу файлов, USB устройства и даже принтеры. Давайте настраивать!</p>



<span id="more-7176"></span>



<h2 class="wp-block-heading">Программа NoMachine</h2>



<p>Программа NoMachine состоит из двух компонентов: клиента и сервера. На удаленной машине (т.е. на компьютере, рабочий стол которого мы хотим получить на локальной машине) мы будем использовать <strong>сервер</strong> NoMachine. На локальной машине (т.е. на компьютере, на котором мы хотим получить рабочий стол удаленной машины), мы будем использовать <strong>клиент</strong> NoMachine.</p>



<h2 class="wp-block-heading">Сервер NoMachine на удаленной машине (Debian)</h2>



<p>Чтобы скачать NoMachine, переходим по ссылке: <a href="https://downloads.nomachine.com" target="_blank" rel="noreferrer noopener">https://downloads.nomachine.com</a>.</p>



<p>У меня удаленная машина под Debian &#8212; выбираю тип диструбутива <strong>DEB</strong> и скачиваю.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/nomachine-dlya-debian.png" data-rel="lightbox-gallery-cPG9hfkZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/nomachine-dlya-debian-1024x576.png" alt="NoMachine для Debian" class="wp-image-7199" srcset="https://adminkin.pro/wp-content/uploads/2025/04/nomachine-dlya-debian-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine-dlya-debian-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine-dlya-debian-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine-dlya-debian-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine-dlya-debian-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine-dlya-debian.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Устанавливаем:</p>



<pre class="wp-block-code"><code>dpkg -i nomachine_*.deb</code></pre>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-debian.png" data-rel="lightbox-gallery-cPG9hfkZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-debian-1024x576.png" alt="Установка NoMachine в Debian" class="wp-image-7203" srcset="https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-debian-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-debian-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-debian-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-debian-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-debian-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-debian.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>После установки NoMachine начинает работать как сервер <strong>nxserver</strong> и слушать порт <strong>4000</strong>.</p>



<p>Проверяем статус сервера <strong>nxserver</strong>:</p>



<pre class="wp-block-code"><code>systemctl status nxserver</code></pre>



<p>Проверяем прослушиваемые порты:</p>



<pre class="wp-block-code"><code>netstat -nltp</code></pre>



<p>Чтобы проверить статус сервера в GUI, кликаем мышью по иконке NoMachine (<strong>!M</strong>) в системном трее и выбираем <strong>Show server status</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-show-server-status.png" data-rel="lightbox-gallery-cPG9hfkZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-show-server-status-1024x576.png" alt="NoMachine. Show server status" class="wp-image-7260" srcset="https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-show-server-status-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-show-server-status-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-show-server-status-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-show-server-status-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-show-server-status-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-show-server-status.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-status-servera-v-gui.png" data-rel="lightbox-gallery-cPG9hfkZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-status-servera-v-gui-1024x576.png" alt="NoMachine. Статус сервера в GUI" class="wp-image-7261" srcset="https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-status-servera-v-gui-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-status-servera-v-gui-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-status-servera-v-gui-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-status-servera-v-gui-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-status-servera-v-gui-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/nomachine.-status-servera-v-gui.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Сервер установили, сервер работает.</p>



<h2 class="wp-block-heading">Настройка сервера</h2>



<p>Отключим гостевой доступ, включенный по умолчанию. Для этого переходим на вкладку <strong>Security</strong>. Снимаем &#171;галочку&#187; с пункта &#171;<strong>Allow guest desktop sharing access on this server</strong>&#171;. Возвращаемся на вкладку <strong>Status</strong> и перезагружаем сервер с помощью кнопки <strong>Restart the server</strong>.</p>



<h2 class="wp-block-heading">Аутентификация пользователя по ключу</h2>



<p>Аутентификация пользователя по логину/паролю не является безопасной. Безопасной альтернативой является аутентификация пользователя по ключу. Вместо запроса пароля пользователя, аутентификация основывается на паре ключей, созданной в формате OpenSSH и состоящей из публичного ключа, установленного на сервере, и приватного ключа, находящегося у пользователя.</p>



<h3 class="wp-block-heading">Генерация пары ключей</h3>



<p>Генерируем пару ключей:</p>



<pre class="wp-block-code"><code>ssh-keygen -t rsa -b 4096</code></pre>



<p>Придумываем имя для ключей. Я придумала имя <strong>user-openssh</strong>. И у меня в текущей директории сгенерировался приватный ключ <strong>user-openssh</strong> и публичный ключ <strong>user-openssh.pub</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/gereracziya-pary-klyuchej-v-formate-openssh.png" data-rel="lightbox-gallery-cPG9hfkZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/gereracziya-pary-klyuchej-v-formate-openssh-1024x576.png" alt="Герерация пары ключей в формате Openssh" class="wp-image-7272" srcset="https://adminkin.pro/wp-content/uploads/2025/04/gereracziya-pary-klyuchej-v-formate-openssh-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/gereracziya-pary-klyuchej-v-formate-openssh-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/gereracziya-pary-klyuchej-v-formate-openssh-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/gereracziya-pary-klyuchej-v-formate-openssh-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/gereracziya-pary-klyuchej-v-formate-openssh-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/gereracziya-pary-klyuchej-v-formate-openssh.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Приватный ключ передаем пользователю, а публичный ключ разместим в нужном месте на сервере.</p>



<h3 class="wp-block-heading">Размещение публичного ключа на сервере</h3>



<p>Создаем директорию <strong>$HOME/.nx/config</strong>, если она не существует:</p>



<pre class="wp-block-code"><code>mkdir $HOME/.nx/config</code></pre>



<p>Создаем файл <strong>$HOME/.nx/config/authorized.crt</strong> и устанавливаем необходимые разрешения на доступ к нему:</p>



<pre class="wp-block-code"><code>touch $HOME/.nx/config/authorized.crt</code></pre>



<pre class="wp-block-code"><code>chmod 0600 $HOME/.nx/config/authorized.crt</code></pre>



<p>Добавляем публичный ключ <strong>user-openssh.pub</strong> в файл <strong><strong>$HOME/.nx/config/authorized.crt</strong></strong>:</p>



<pre class="wp-block-code"><code>cat user-openssh.pub &gt;&gt; ~/.nx/config/authorized.crt</code></pre>



<h3 class="wp-block-heading">Включение аутентификации по ключу на сервере</h3>



<p>Добавляем в конфигурационный файл <strong>/usr/NX/etc/server.cfg</strong> строку:</p>



<pre class="wp-block-code"><code>AcceptedAuthenticationMethods NX-private-key</code></pre>



<p>Перезагружаем сервер NoMachine:</p>



<pre class="wp-block-code"><code>/etc/NX/nxserver --restart</code></pre>



<h2 class="wp-block-heading">Настройка файрвола</h2>



<p>У меня на удаленной машине установлен файрвол. Разрешаю входящий <strong>UDP</strong>-трафик на порт <strong>4000</strong>:</p>



<pre class="wp-block-code"><code>iptables -A INPUT -p udp --dport 4000 -j ACCEPT</code></pre>



<p>Разрешаю входящий <strong>TCP</strong>-трафик на порт <strong>4000</strong>:</p>



<pre class="wp-block-code"><code>iptables -A INPUT -p tcp --dport 4000 -j ACCEPT</code></pre>



<p>Сохраняю текущую конфигурацию iptables:</p>



<pre class="wp-block-code"><code>iptables-save > /etc/iptables.up.rules</code></pre>



<h2 class="wp-block-heading">Проброс портов</h2>



<p>Поскольку моя удаленная машина стоит за роутером, то я пробрасываю порт <strong>4000</strong> (<strong>TCP</strong> и <strong>UDP</strong>) наружу:</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/probros-portov-na-routere.png" data-rel="lightbox-gallery-cPG9hfkZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/probros-portov-na-routere-1024x576.png" alt="Проброс портов на роутере" class="wp-image-7264" srcset="https://adminkin.pro/wp-content/uploads/2025/04/probros-portov-na-routere-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/probros-portov-na-routere-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/probros-portov-na-routere-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/probros-portov-na-routere-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/probros-portov-na-routere-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/probros-portov-na-routere.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">Клиент NoMachine на локальной машине (Windows)</h2>



<p>У меня локальная машина под Windows. На том же сайте NoMachine <a href="https://downloads.nomachine.com" target="_blank" rel="noreferrer noopener">https://downloads.nomachine.com</a> выбираю дистрибутив для Windows, скачиваю и устанавливаю:</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-windows.png" data-rel="lightbox-gallery-cPG9hfkZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-windows-1024x576.png" alt="Установка NoMachine в Windows" class="wp-image-7205" srcset="https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-windows-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-windows-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-windows-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-windows-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-windows-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/ustanovka-nomachine-v-windows.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Запускаем программу NoMachine &#8212; это клиент. А программа <strong>NoMachine Service </strong>&#8212; это сервер, он нам не нужен.</p>



<p>Нажимаем кнопку <strong>Добивить</strong>, чтобы создать подключение к удаленной машине. В поле <strong>Хост</strong> вводим IP адрес удаленной машины. <strong>Порт</strong> &#8212; <strong>4000</strong>, <strong>Протокол</strong> &#8212; <strong>NX</strong>.</p>



<p>У меня удаленная машина за роутером, поэтому в поле <strong>Хост</strong> я указываю IP адрес роутера.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-podklyucheniya-v-nomachine.png" data-rel="lightbox-gallery-cPG9hfkZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-podklyucheniya-v-nomachine-1024x576.png" alt="Настройка подключения в NoMachine" class="wp-image-7213" srcset="https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-podklyucheniya-v-nomachine-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-podklyucheniya-v-nomachine-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-podklyucheniya-v-nomachine-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-podklyucheniya-v-nomachine-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-podklyucheniya-v-nomachine-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-podklyucheniya-v-nomachine.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Переходим на вкладку <strong>Настройка</strong>, выбираем &#171;<strong>Используйте аутентификацию на основе ключей по ключу, который вы предоставляете</strong>&#187; и нажимаем кнопку <strong>Изменить</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-autentifikaczii-po-klyuchu-v-nomachine.png" data-rel="lightbox-gallery-cPG9hfkZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-autentifikaczii-po-klyuchu-v-nomachine-1024x576.png" alt="Настройка аутентификации по ключу в NoMachine" class="wp-image-7306" srcset="https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-autentifikaczii-po-klyuchu-v-nomachine-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-autentifikaczii-po-klyuchu-v-nomachine-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-autentifikaczii-po-klyuchu-v-nomachine-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-autentifikaczii-po-klyuchu-v-nomachine-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-autentifikaczii-po-klyuchu-v-nomachine-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-autentifikaczii-po-klyuchu-v-nomachine.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Выбираем приватный ключ. У меня это <strong>user-openssh</strong>. Нажимаем стрелку <strong>&lt;</strong>, чтобы вернуться на вкладку <strong>Настройка</strong>, и нажимаем кнопку <strong>Добавить</strong>.</p>



<p>Подключение к удаленной машине создано, нажимаем кнопку <strong>Подключить</strong>.</p>



<p>Вводим имя пользователя и вводим парольную фразу (<strong>passphrase</strong>) в поле <strong>Индификационная фраза</strong>. Если парольная фраза при создании пары ключей не была задана, то поле <strong>Индификационная фраза</strong> не будет отображено. И нажимаем кнопку <strong>OK</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/podklyuchenie-k-udalennomu-rabochemu-stolu-v-nomachine.png" data-rel="lightbox-gallery-cPG9hfkZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/podklyuchenie-k-udalennomu-rabochemu-stolu-v-nomachine-1024x576.png" alt="Подключение к удаленному рабочему столу в NoMachine" class="wp-image-7312" srcset="https://adminkin.pro/wp-content/uploads/2025/04/podklyuchenie-k-udalennomu-rabochemu-stolu-v-nomachine-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/podklyuchenie-k-udalennomu-rabochemu-stolu-v-nomachine-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/podklyuchenie-k-udalennomu-rabochemu-stolu-v-nomachine-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/podklyuchenie-k-udalennomu-rabochemu-stolu-v-nomachine-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/podklyuchenie-k-udalennomu-rabochemu-stolu-v-nomachine-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/podklyuchenie-k-udalennomu-rabochemu-stolu-v-nomachine.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Все! Должен отобразиться удаленный рабочий стол.</p>



<h2 class="wp-block-heading">Проверка звука</h2>



<p>На удаленной машине открываем конфигурационный файл <strong>/usr/NX/etc/node.cfg</strong> и проверяем, что следующие параметры не закомментированы (т.е. нет символа <strong>#</strong> перед параметром) и выставлены в нужные значения:</p>



<pre class="wp-block-code"><code>AudioInterface pulseaudio
EnableAudio 1</code></pre>



<p>Если вносите правки в конфигурационный файл <strong>/usr/NX/etc/node.cfg</strong>, то необходимо перезагрузить <strong>nxserver</strong>:</p>



<pre class="wp-block-code"><code>/etc/NX/nxserver --restart</code></pre>



<p>На локальной машине запускаем клиент NoMachine, устанавливаем соединение с удаленной машиной, нажимаем комбинацию клавиш <strong>Ctrl+Alt+0</strong> и проверем, что передача звука с сервера на клиент включена (нет &#171;красного крестика&#187;):</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/peredacha-zvuka-s-servera-na-klient-vklyuchena.png" data-rel="lightbox-gallery-cPG9hfkZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/peredacha-zvuka-s-servera-na-klient-vklyuchena-1024x576.png" alt="Передача звука с сервера на клиент включена" class="wp-image-7330" srcset="https://adminkin.pro/wp-content/uploads/2025/04/peredacha-zvuka-s-servera-na-klient-vklyuchena-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/peredacha-zvuka-s-servera-na-klient-vklyuchena-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/peredacha-zvuka-s-servera-na-klient-vklyuchena-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/peredacha-zvuka-s-servera-na-klient-vklyuchena-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/peredacha-zvuka-s-servera-na-klient-vklyuchena-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/peredacha-zvuka-s-servera-na-klient-vklyuchena.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>На удаленной машине запускаем команду на проигрывание звукового файла:</p>



<pre class="wp-block-code"><code>paplay /usr/share/sounds/alsa/Side_Left.wav</code></pre>



<p>Звук должен быть слышен в динамиках локальной машины.</p>



<h2 class="wp-block-heading">Проверка микрофона</h2>



<p>Чтобы включить передачу микрофона с клиента на сервер, нажимаем комбинацию клавиш <strong>Ctrl+Alt+0</strong>, кликаем по <strong>Вход микрофона</strong> и нажимаем <strong>Включить микрофон</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/peredacha-mikrofona-s-klienta-na-server-vklyuchena.png" data-rel="lightbox-gallery-cPG9hfkZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/peredacha-mikrofona-s-klienta-na-server-vklyuchena-1024x576.png" alt="Передача микрофона с клиента на сервер включена" class="wp-image-7340" srcset="https://adminkin.pro/wp-content/uploads/2025/04/peredacha-mikrofona-s-klienta-na-server-vklyuchena-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/peredacha-mikrofona-s-klienta-na-server-vklyuchena-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/peredacha-mikrofona-s-klienta-na-server-vklyuchena-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/peredacha-mikrofona-s-klienta-na-server-vklyuchena-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/peredacha-mikrofona-s-klienta-na-server-vklyuchena-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/peredacha-mikrofona-s-klienta-na-server-vklyuchena.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Возвращаемся на рабочий стол удаленной машины, нажимая на стрелку <strong>&lt;.</strong></p>



<p>Кликнув в системном трее на микрофон, выбираем микрофон <strong>Remapped nx_voice_out</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/mikrofon-remapped-nx_voice_out.png" data-rel="lightbox-gallery-cPG9hfkZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/mikrofon-remapped-nx_voice_out-1024x576.png" alt="Микрофон Remapped nx_voice_out" class="wp-image-7342" srcset="https://adminkin.pro/wp-content/uploads/2025/04/mikrofon-remapped-nx_voice_out-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/mikrofon-remapped-nx_voice_out-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/mikrofon-remapped-nx_voice_out-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/mikrofon-remapped-nx_voice_out-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/mikrofon-remapped-nx_voice_out-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/mikrofon-remapped-nx_voice_out.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Кликнув на <strong>Audio mixer</strong>, в открывшемся окне, в разделе <strong>Recording</strong> выбираем <strong>Monitor of NoMachine Output</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/monitor-of-nomachine-output.png" data-rel="lightbox-gallery-cPG9hfkZ" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/monitor-of-nomachine-output-1024x576.png" alt="Monitor of NoMachine Output" class="wp-image-7344" srcset="https://adminkin.pro/wp-content/uploads/2025/04/monitor-of-nomachine-output-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/monitor-of-nomachine-output-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/monitor-of-nomachine-output-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/monitor-of-nomachine-output-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/monitor-of-nomachine-output-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/monitor-of-nomachine-output.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Запускаем запись 5-ти секунд звука на удаленной машине:</p>



<pre class="wp-block-code"><code>arecord -f cd -d 5 test.wav</code></pre>



<p>В эти 5 секунд говорим что-нибудь в микрофон локальной машины. </p>



<p>Прослушаем получившуюся запись:</p>



<pre class="wp-block-code"><code>paplay test.wav</code></pre>



<p>Должны услышать, что сказали в микрофон.</p>



<h2 class="wp-block-heading">Вывод</h2>



<p>Мне для работы был нужен не просто удаленный рабочий стол, а со звуком. Т.е. локальные динамики должны проигрывать звуки удаленной машины, а звук с локального микрофона должен передаваться на удаленную машину. Удаленный рабочий стол по протоколу VNC не подошел, пришлось бы отдельно прикручивать звук. А в NoMachine звук работает &#171;из коробки&#187;.</p>



<p>Все вопросы, пожалуйста, пишите в комментариях под статьей.</p>


 <div class="hp-vendors hp-block hp-grid"><div class="hp-row"><div class="hp-grid__item hp-col-sm-12 hp-col-xs-12"><article class="hp-vendor hp-vendor--view-block"><header class="hp-vendor__header"><div class="hp-vendor__image">
	<a href="https://adminkin.pro/vendor/irinak/">
					<img decoding="async" src="https://adminkin.pro/wp-content/uploads/2023/08/Irina-K.jpg" alt="Ирина K." loading="lazy">
			</a>
</div>
</header><div class="hp-vendor__content"><h4 class="hp-vendor__name"><a href="https://adminkin.pro/vendor/irinak/">Ирина K.</a>
	<i class="hp-vendor__verified-badge hp-icon fas fa-check-circle" title="Проверен"></i>
	</h4><div class="hp-vendor__details hp-vendor__details--primary"><time class="hp-vendor__registered-date hp-vendor__date hp-meta" datetime="2022-07-22 16:45:26">
	Автор и создатель сайта</time>
</div></div><footer class="hp-vendor__footer"><div class="hp-vendor__actions hp-vendor__actions--primary"></div></footer></article></div></div></div><p>Сообщение <a href="https://adminkin.pro/udalennyj-rabochij-stol-so-zvukom-mikrofonom-peredachej-fajlov-i-usb-ustrojstvami/">Удаленный рабочий стол со звуком, микрофоном, передачей файлов и USB устройствами</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://adminkin.pro/udalennyj-rabochij-stol-so-zvukom-mikrofonom-peredachej-fajlov-i-usb-ustrojstvami/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VNC &#8212; удаленный рабочий стол в Debian</title>
		<link>https://adminkin.pro/vnc-udalennyj-rabochij-stol-v-debian/</link>
					<comments>https://adminkin.pro/vnc-udalennyj-rabochij-stol-v-debian/#respond</comments>
		
		<dc:creator><![CDATA[Ирина К.]]></dc:creator>
		<pubDate>Wed, 16 Apr 2025 09:47:49 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[autorun]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[port]]></category>
		<category><![CDATA[putty]]></category>
		<category><![CDATA[remotedesktop]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[systemd]]></category>
		<guid isPermaLink="false">https://adminkin.pro/?p=7024</guid>

					<description><![CDATA[<p>Давайте настроим удаленный графический доступ на машину с Debian. Получив такой доступ, мы увидим рабочий стол машины с Debian и сможем управлять им, двигая мышкой и нажимая клавиши. Сделаем это с помощью технологии VNC (Virtual Network Computing). Погнали! План действий Сначала работаем на удаленной машине с Debian, графический доступ к которой нам нужен. Установим и настроим VNC сервер. Затем работаем на локальной машине, установим и настроим VNC клиент. VNC клиенты существуют под все операционные системы, и настройка их однотипная. В этой статье установим и настроим VNC клиент под Windows. Установка VNC сервера Устанавливаем VNC сервер: Запуск VNC сервера должно происходить от имени того пользователя, в чьей графической сессии необходимо поработать. [&#8230;]</p>
<p>Сообщение <a href="https://adminkin.pro/vnc-udalennyj-rabochij-stol-v-debian/">VNC &#8212; удаленный рабочий стол в Debian</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Давайте настроим <strong>удаленный графический доступ</strong> на машину с Debian. Получив такой доступ, мы увидим рабочий стол машины с Debian и сможем управлять им, двигая мышкой и нажимая клавиши. Сделаем это с помощью технологии VNC (Virtual Network Computing). Погнали!</p>



<span id="more-7024"></span>



<h2 class="wp-block-heading">План действий</h2>



<p>Сначала работаем на удаленной машине с Debian, графический доступ к которой нам нужен. Установим и настроим VNC сервер.</p>



<p>Затем работаем на локальной машине, установим и настроим VNC клиент. VNC клиенты существуют под все операционные системы, и настройка их однотипная. В этой статье установим и настроим VNC клиент под Windows.</p>



<h2 class="wp-block-heading">Установка VNC сервера</h2>



<p>Устанавливаем VNC сервер:</p>



<pre class="wp-block-code"><code>apt install tightvncserver</code></pre>



<p>Запуск VNC сервера должно происходить от имени того пользователя, в чьей графической сессии необходимо поработать. Заходим под пользователем <strong>user</strong> или переключаемся на него с помощью команды:</p>



<pre class="wp-block-code"><code>su - user</code></pre>



<p>Запускаем VNC сервер:</p>



<pre class="wp-block-code"><code>vncserver</code></pre>



<p>При первом запуске VNC сервера потребуется придумать и ввести пароль пользователя для подключения по VNC. Длина пароля не должна превышать 8 символов.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/vnc-server.-vvod-parolya.png" data-rel="lightbox-gallery-GzyS5KCB" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/vnc-server.-vvod-parolya-1024x576.png" alt="VNC сервер. Ввод пароля" class="wp-image-7048" srcset="https://adminkin.pro/wp-content/uploads/2025/04/vnc-server.-vvod-parolya-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/vnc-server.-vvod-parolya-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/vnc-server.-vvod-parolya-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/vnc-server.-vvod-parolya-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/vnc-server.-vvod-parolya-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/vnc-server.-vvod-parolya.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Если нужен <strong>View-Only Password</strong> (пароль, позволяющий пользователю только просматривать удаленный рабочий стол, без возможности двигать мышкой и нажимать клавиши), то нужно будет его придумать и ввести. Если не нужен <strong>View-Only Password</strong>, то можно отказаться от его ввода.</p>



<p>По умолчанию VNC сервер запускается и слушает TCP порт <strong>5901</strong>.</p>



<p>Проверить прослушиваемые порты:</p>



<pre class="wp-block-code"><code>netstat -nltp</code></pre>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/proverka-proslushivaemyh-portov.png" data-rel="lightbox-gallery-GzyS5KCB" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/proverka-proslushivaemyh-portov-1024x576.png" alt="Проверка прослушиваемых портов" class="wp-image-7101" srcset="https://adminkin.pro/wp-content/uploads/2025/04/proverka-proslushivaemyh-portov-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/proverka-proslushivaemyh-portov-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/proverka-proslushivaemyh-portov-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/proverka-proslushivaemyh-portov-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/proverka-proslushivaemyh-portov-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/proverka-proslushivaemyh-portov.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Порт <strong>5901</strong> соответствует VNC дисплею <strong>:1</strong>, поскольку в VNC используется правило: <strong>номер порта = 5900 + номер дисплея</strong>.</p>



<p>Т.е. если запустить VNC сервер командой:</p>



<pre class="wp-block-code"><code>vncserver :2</code></pre>



<p>то VNC сервер будет слушать TCP порт <strong>5902</strong>, а <strong>:2</strong> &#8212; это второй VNC дисплей.</p>



<h2 class="wp-block-heading">Настройка VNC сервера</h2>



<p>VNC сервер запушен, но его надо еще настроить, поэтому останавливаем его командой:</p>



<pre class="wp-block-code"><code>vncserver -kill :1</code></pre>



<p>Узнаем, какая графическая оболочка используется:</p>



<pre class="wp-block-code"><code>echo $XDG_CURRENT_DESKTOP</code></pre>



<p>У меня, например, Xfce.</p>



<p>Если графическая оболочка не установлена, устанавливаем:</p>



<pre class="wp-block-code"><code>apt install xfce4 xfce4-goodies</code></pre>



<p>Приводим скрипт <strong>~/.vnc/xstartup</strong>, где тильда <strong>~</strong> обозначает домашнюю директорию текущего пользователя, к виду:</p>



<pre class="wp-block-code"><code>#!/bin/sh

startxfce4 &amp;</code></pre>



<p>где <code>startxfce4</code> — запуск графической оболочки Xfce. В случае использования другой графической оболочки замените <strong>startxfce4</strong> на:</p>



<ul class="wp-block-list">
<li><strong>startlxqt</strong> &#8212; для LXQt,</li>



<li><strong>gnome-session</strong> &#8212; для GNOME,</li>



<li><strong>startkde</strong> &#8212; для KDE Plasma,</li>



<li><strong>mate-session</strong> &#8212; для MATE.</li>
</ul>



<p>Скрипт <strong>~/.vnc/xstartup</strong> выполняется каждый раз при запуске VNC сервера.</p>



<h2 class="wp-block-heading">Настройка автозапуска VNC сервера</h2>



<p>Для автозапуска VNC сервера при запуске системы создаем systemd сервис:</p>



<pre class="wp-block-code"><code>touch /etc/systemd/system/vncserver@.service</code></pre>



<p>В созданный файл <strong>/etc/systemd/system/vncserver@.service</strong> добавляем следующий текст:</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=Start TightVNC server at startup for user %i
After=network.target

&#91;Service]
Type=forking
User=%i
WorkingDirectory=/home/%i

ExecStart=/usr/bin/vncserver :1 -geometry 1920x1080 -depth 24
ExecStop=/usr/bin/vncserver -kill :1

&#91;Install]
WantedBy=multi-user.target</code></pre>



<p>Чтобы systemd увидел изменения:</p>



<pre class="wp-block-code"><code>systemctl daemon-reload</code></pre>



<p>Чтобы при старте системы VNC сервер запускался от имени пользователя <strong>user</strong>:</p>



<pre class="wp-block-code"><code>systemctl enable vncserver@user.service</code></pre>



<p>Чтобы запустить systemd сервис вручную прямо сейчас, без перезагрузки системы:</p>



<pre class="wp-block-code"><code>systemctl start vncserver@user.service</code></pre>



<p>Готово! VNC сервер настроен и запущен.</p>



<h2 class="wp-block-heading">Смена пароля пользователя для подключения по VNC</h2>



<p>Чтобы сменить пароль пользователя <strong>user</strong> для подключения по VNC, заходим под пользователем <strong>user</strong> или переключаемся на него с помощью команды:</p>



<pre class="wp-block-code"><code>su - user</code></pre>



<p>Команда для смены пароля:</p>



<pre class="wp-block-code"><code>vncpasswd</code></pre>



<p>Длина пароля не должна превышать 8 символов. Иначе, пароль будет усечен.</p>



<h2 class="wp-block-heading">VNC клиент под Windows</h2>



<p>Все работы на удаленной машине с Debian у нас завершены. Все оставшиеся работы будем производить на локальной машине с Windows, на которой мы хотим получить удаленный рабочий с Debian.</p>



<h3 class="wp-block-heading">Установка TightVNC</h3>



<p>Скачиваем <strong>TightVNC</strong> для Windows по ссылке: <a href="https://www.tightvnc.com/download.php">https://www.tightvnc.com/download.php</a> и устанавливаем. В установленных программах находим и запускаем <strong>TightVNC Viewer</strong> &#8212; это VNC клиент.</p>



<h3 class="wp-block-heading">Настройка SSH тунеля для VNC</h3>



<p>VNC свой трафик не шифрует, пароль пользователя для подключения по VNC ограничен 8 символами, поэтому для безопасности на клиенте настраиваем SSH тунель для VNC, который будет шифровать трафик. Кроме того, благодаря SSH тунелю на удаленной машине с Debian не нужно будет открывать наружу порт 5901.</p>



<p>Скачиваем <strong>PuTTY</strong> по ссылке: <a href="https://www.putty.org/" target="_blank" rel="noreferrer noopener">https://www.putty.org/</a> и запускаем. В разделе <strong>Session</strong>, в поле <strong>Host Name (or IP address)</strong> указываем IP адрес удаленной машины с Debian. В поле <strong>Port</strong> &#8212; номер SSH порта, прослушиваемого удаленной машиной с Debian.</p>



<figure class="wp-block-image size-large is-resized"><a href="https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-ip-adres-i-port.png" data-rel="lightbox-gallery-GzyS5KCB" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-ip-adres-i-port-1024x576.png" alt="Настройка SSH тунеля для VNC. IP адрес и порт" class="wp-image-7161" style="width:1140px;height:auto" srcset="https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-ip-adres-i-port-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-ip-adres-i-port-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-ip-adres-i-port-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-ip-adres-i-port-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-ip-adres-i-port-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-ip-adres-i-port.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>В разделе <strong>Connection</strong> -&gt; <strong>SSH</strong> -&gt; <strong>Tunnels</strong>, в поле <strong>Source port</strong> вводим <strong>5901</strong>, в поле <strong>Destination</strong> вводим:</p>



<pre class="wp-block-code"><code>localhost:5901</code></pre>



<p>и нажимаем кнопку <strong>Add</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-source-port-i-destination.png" data-rel="lightbox-gallery-GzyS5KCB" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-source-port-i-destination-1024x576.png" alt="Настройка SSH тунеля для VNC. Source port и Destination" class="wp-image-7162" srcset="https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-source-port-i-destination-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-source-port-i-destination-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-source-port-i-destination-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-source-port-i-destination-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-source-port-i-destination-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/nastrojka-ssh-tunelya-dlya-vnc.-source-port-i-destination.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Чтобы не вводить все эти параметры каждый раз, можно вернуться в раздел <strong>Session</strong> и сохранить сессию, нажав кнопку <strong>Save</strong>.</p>



<p>Нажимаем кнопку <strong>Open</strong> для открытия SSH тунеля для VNC, вводим логин и <strong>системный</strong> пароль пользователя удаленной машины Debian. В моем случае это будет пользователь <strong>user</strong>. Все! SSH тунель для VNC установлен.</p>



<p>Пререходим с VNC клиенту <strong>TightVNC Viewer</strong>, в поле <strong>Remote Host</strong> вводим:</p>



<pre class="wp-block-code"><code>localhost::5901</code></pre>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-remote-host.png" data-rel="lightbox-gallery-GzyS5KCB" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-remote-host-1024x576.png" alt="TightVNC Viewer. Remote Host" class="wp-image-7165" srcset="https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-remote-host-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-remote-host-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-remote-host-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-remote-host-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-remote-host-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-remote-host.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>и нажимаем кнопку <strong>Connect</strong>.</p>



<p>Вводим пароль пользователя для подключения по VNC:</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-parol-polzovatelya-dlya-dostupa-po-vnc.png" data-rel="lightbox-gallery-GzyS5KCB" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-parol-polzovatelya-dlya-dostupa-po-vnc-1024x576.png" alt="TightVNC Viewer. Пароль пользователя для доступа по VNC" class="wp-image-7168" srcset="https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-parol-polzovatelya-dlya-dostupa-po-vnc-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-parol-polzovatelya-dlya-dostupa-po-vnc-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-parol-polzovatelya-dlya-dostupa-po-vnc-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-parol-polzovatelya-dlya-dostupa-po-vnc-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-parol-polzovatelya-dlya-dostupa-po-vnc-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-parol-polzovatelya-dlya-dostupa-po-vnc.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Ура! Я вижу удаленный рабочий стол Debian.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-udalennyj-rabochij-stol.png" data-rel="lightbox-gallery-GzyS5KCB" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-udalennyj-rabochij-stol-1024x576.png" alt="TightVNC Viewer. Удаленный рабочий стол" class="wp-image-7170" srcset="https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-udalennyj-rabochij-stol-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-udalennyj-rabochij-stol-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-udalennyj-rabochij-stol-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-udalennyj-rabochij-stol-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-udalennyj-rabochij-stol-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/tightvnc-viewer.-udalennyj-rabochij-stol.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h3 class="wp-block-heading">Аутентификация по ключу в SSH</h3>



<p>Теперь, когда все работает, для безопасности настроим аутентификацию в SSH не по логину и <strong>системному</strong> паролю, а по ключу. Подробная статья об этом: &#171;<a href="https://adminkin.pro/ssh-key-v-windows-i-linux-rukovodstvo/" target="_blank" rel="noreferrer noopener">SSH key в Windows и Linux. Руководство</a>&#171;.</p>



<h2 class="wp-block-heading">Выводы</h2>



<p>Я использую VNC для доступа к своей рабочей машине с Debian, когда еузжаю и нет возможности взять рабочую машину с собой.</p>



<p>Все вопросы, пожалуйста, в комментариях под статьей.</p>


 <div class="hp-vendors hp-block hp-grid"><div class="hp-row"><div class="hp-grid__item hp-col-sm-12 hp-col-xs-12"><article class="hp-vendor hp-vendor--view-block"><header class="hp-vendor__header"><div class="hp-vendor__image">
	<a href="https://adminkin.pro/vendor/irinak/">
					<img decoding="async" src="https://adminkin.pro/wp-content/uploads/2023/08/Irina-K.jpg" alt="Ирина K." loading="lazy">
			</a>
</div>
</header><div class="hp-vendor__content"><h4 class="hp-vendor__name"><a href="https://adminkin.pro/vendor/irinak/">Ирина K.</a>
	<i class="hp-vendor__verified-badge hp-icon fas fa-check-circle" title="Проверен"></i>
	</h4><div class="hp-vendor__details hp-vendor__details--primary"><time class="hp-vendor__registered-date hp-vendor__date hp-meta" datetime="2022-07-22 16:45:26">
	Автор и создатель сайта</time>
</div></div><footer class="hp-vendor__footer"><div class="hp-vendor__actions hp-vendor__actions--primary"></div></footer></article></div></div></div><p>Сообщение <a href="https://adminkin.pro/vnc-udalennyj-rabochij-stol-v-debian/">VNC &#8212; удаленный рабочий стол в Debian</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://adminkin.pro/vnc-udalennyj-rabochij-stol-v-debian/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Восстановление файловой системы в Debian</title>
		<link>https://adminkin.pro/vosstanovlenie-fajlovoj-sistemy-v-debian/</link>
					<comments>https://adminkin.pro/vosstanovlenie-fajlovoj-sistemy-v-debian/#respond</comments>
		
		<dc:creator><![CDATA[Ирина К.]]></dc:creator>
		<pubDate>Fri, 11 Apr 2025 17:29:28 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[recovery]]></category>
		<category><![CDATA[uuid]]></category>
		<guid isPermaLink="false">https://adminkin.pro/?p=6987</guid>

					<description><![CDATA[<p>Мне для восстановления файловой системы в Debian очень помогла утилита TestDisk. Эта утилита не форматирует диск, а только восстанавливает его структуру. Что мне и нужно было! Описание проблемы Раздел /dev/sda1 использовался в RAID массиве. А после удаления RAID массива затерлась информация о типе файловой системы на этом разделе. Сами же данные на разделе были неповреждены. Команда: выдавала: Что означает, что file не распознал никакой файловой системы и предположил, что данные &#171;сырые&#187;. Аналогичная ситуация с командой: blkid не увидел ни UUID (уникальный идентификатор раздела диска), ни тип файловой системы. Встал вопрос восстановления структуры раздела без потери данных на нем. Создание загрузочной USB флешки Скачиваем загрузочный образ Debian с официального сайта: https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/. [&#8230;]</p>
<p>Сообщение <a href="https://adminkin.pro/vosstanovlenie-fajlovoj-sistemy-v-debian/">Восстановление файловой системы в Debian</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Мне для восстановления файловой системы в Debian очень помогла утилита TestDisk. Эта утилита не форматирует диск, а только восстанавливает его структуру. Что мне и нужно было!</p>



<span id="more-6987"></span>



<h2 class="wp-block-heading">Описание проблемы</h2>



<p>Раздел <strong>/dev/sda1</strong> использовался в RAID массиве. А после удаления RAID массива затерлась информация о типе файловой системы на этом разделе. Сами же данные на разделе были неповреждены.</p>



<p>Команда:</p>



<pre class="wp-block-code"><code>file -s /dev/sda1</code></pre>



<p>выдавала:</p>



<pre class="wp-block-code"><code>/dev/sda1: data</code></pre>



<p>Что означает, что <code>file</code> не распознал никакой файловой системы и предположил, что данные &#171;сырые&#187;.</p>



<p>Аналогичная ситуация с командой:</p>



<pre class="wp-block-code"><code>blkid /dev/sda1</code></pre>



<p><code>blkid</code> не увидел ни UUID (уникальный идентификатор раздела диска), ни тип файловой системы.</p>



<p>Встал вопрос восстановления структуры раздела без потери данных на нем.</p>



<h2 class="wp-block-heading">Создание загрузочной USB флешки</h2>



<p>Скачиваем загрузочный образ Debian с официального сайта: <a href="https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/" target="_blank" rel="noreferrer noopener">https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/</a>.</p>



<p>Я выбрала образ без графической среды: <strong>debian-live-12.10.0-amd64-standard.iso</strong>.</p>



<p>Для создания загрузочной USB флешки в среде Windows скачиваем программу <strong>Rufus</strong>:  <a href="https://rufus.ie/en/">https://rufus.ie/en/</a>. Запускаем программу, выбираем скаченный образ Debian и нажимаем кнопку <strong>Старт</strong>. Все, загрузочная флешка готова.</p>



<p>Для создания загрузочной USB флешки в среде Linux сначала определяем имя USB флешки, назначенное ядром Linux:</p>



<pre class="wp-block-code"><code>dmesg | grep sd</code></pre>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/sozdaniya-zagruzochnoj-usb-fleshki-v-srede-linux.png" data-rel="lightbox-gallery-axR0NdQh" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/sozdaniya-zagruzochnoj-usb-fleshki-v-srede-linux-1024x576.png" alt="Создания загрузочной USB флешки в среде Linux" class="wp-image-7001" srcset="https://adminkin.pro/wp-content/uploads/2025/04/sozdaniya-zagruzochnoj-usb-fleshki-v-srede-linux-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/sozdaniya-zagruzochnoj-usb-fleshki-v-srede-linux-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/sozdaniya-zagruzochnoj-usb-fleshki-v-srede-linux-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/sozdaniya-zagruzochnoj-usb-fleshki-v-srede-linux-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/sozdaniya-zagruzochnoj-usb-fleshki-v-srede-linux-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/sozdaniya-zagruzochnoj-usb-fleshki-v-srede-linux.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>В моем случае USB флешке было назначено имя <strong>sdd</strong>. Важно не перепутать имя устройства, чтобы не потерять данные!</p>



<p>Записываем скаченный образ <strong>debian-live-12.10.0-amd64-standard.iso</strong> на устройство <strong>sdd</strong>:</p>



<pre class="wp-block-code"><code>dd if=debian-live-12.10.0-amd64-standard.iso of=/dev/sdd bs=4M status=progress &amp;&amp; sync</code></pre>



<p>Готово.</p>



<p>Загружаемся с загрузочной USB флешки.</p>



<h2 class="wp-block-heading">Утилита TestDisk</h2>



<p>Утилита TestDisk используется для восстановления удаленных разделов и поврежденных файловых систем. TestDisk не форматирует диск, только восстанавливает его структуру.</p>



<p>Устанавливаем:</p>



<pre class="wp-block-code"><code>apt install testdisk</code></pre>



<p>Запускаем:</p>



<pre class="wp-block-code"><code>testdisk</code></pre>



<p>Появляется список всех дисков, выбираем нужный диск, выбираем <strong>Proceed</strong> и нажимаем <strong>Enter</strong>:</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/testdisk-vybor-diska-dlya-vosstanovleniya.png" data-rel="lightbox-gallery-axR0NdQh" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/testdisk-vybor-diska-dlya-vosstanovleniya-1024x576.png" alt="TestDisk Выбор диска для восстановления" class="wp-image-7012" srcset="https://adminkin.pro/wp-content/uploads/2025/04/testdisk-vybor-diska-dlya-vosstanovleniya-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/testdisk-vybor-diska-dlya-vosstanovleniya-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/testdisk-vybor-diska-dlya-vosstanovleniya-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/testdisk-vybor-diska-dlya-vosstanovleniya-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/testdisk-vybor-diska-dlya-vosstanovleniya-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/testdisk-vybor-diska-dlya-vosstanovleniya.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Выбираем тип таблицы разделов. У меня это <strong>EFI GPT</strong>. И нажимаем <strong>Enter</strong>.</p>



<p>Выбираем <strong>Analyze</strong> для анализа текущей таблицы разделов и поиска удаленных разделов. И нажимаем <strong>Enter</strong>.</p>



<p>Выбираем <strong>Quick Search</strong> для быстрого поиска.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/04/testdisk-analiz-tabliczy-razdelov-i-poisk-udalennyh-razdelov.png" data-rel="lightbox-gallery-axR0NdQh" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/04/testdisk-analiz-tabliczy-razdelov-i-poisk-udalennyh-razdelov-1024x576.png" alt="TestDisk Анализ таблицы разделов и поиск удаленных разделов" class="wp-image-7015" srcset="https://adminkin.pro/wp-content/uploads/2025/04/testdisk-analiz-tabliczy-razdelov-i-poisk-udalennyh-razdelov-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/04/testdisk-analiz-tabliczy-razdelov-i-poisk-udalennyh-razdelov-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/04/testdisk-analiz-tabliczy-razdelov-i-poisk-udalennyh-razdelov-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/04/testdisk-analiz-tabliczy-razdelov-i-poisk-udalennyh-razdelov-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/04/testdisk-analiz-tabliczy-razdelov-i-poisk-udalennyh-razdelov-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/04/testdisk-analiz-tabliczy-razdelov-i-poisk-udalennyh-razdelov.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>TestDisk отобразит список обнаруженных разделов на диске. Раздел можно выбрать и нажать клавишу <strong>P</strong> на клавиатуре для просмотра файлов на разделе.</p>



<p>Если все хорошо, нажимаем <strong>Enter</strong>, а затем <strong>Write</strong>, чтобы записать таблицу разделов.</p>



<p>Чтобы изменения вступили в силу, нужно перезагрузиться.</p>



<p>После перезагрузки, с помощью команды <strong>blkid</strong> можно убедиться, что структура раздела диска была успешно восстановлена.</p>



<h2 class="wp-block-heading">Выводы</h2>



<p>Мне TestDisk помог в конкретной ситуации. Поэтому и написалась эта статья.</p>



<p>Кроме описанного, TestDisk еще умеет восстанавливать отдельные файлы с удаленного раздела без восстановления всего раздела. Но это уже другая история&#8230;</p>



<p>Пожалуйста, оставляйте комментарии под статьей.</p>


 <div class="hp-vendors hp-block hp-grid"><div class="hp-row"><div class="hp-grid__item hp-col-sm-12 hp-col-xs-12"><article class="hp-vendor hp-vendor--view-block"><header class="hp-vendor__header"><div class="hp-vendor__image">
	<a href="https://adminkin.pro/vendor/irinak/">
					<img decoding="async" src="https://adminkin.pro/wp-content/uploads/2023/08/Irina-K.jpg" alt="Ирина K." loading="lazy">
			</a>
</div>
</header><div class="hp-vendor__content"><h4 class="hp-vendor__name"><a href="https://adminkin.pro/vendor/irinak/">Ирина K.</a>
	<i class="hp-vendor__verified-badge hp-icon fas fa-check-circle" title="Проверен"></i>
	</h4><div class="hp-vendor__details hp-vendor__details--primary"><time class="hp-vendor__registered-date hp-vendor__date hp-meta" datetime="2022-07-22 16:45:26">
	Автор и создатель сайта</time>
</div></div><footer class="hp-vendor__footer"><div class="hp-vendor__actions hp-vendor__actions--primary"></div></footer></article></div></div></div><p>Сообщение <a href="https://adminkin.pro/vosstanovlenie-fajlovoj-sistemy-v-debian/">Восстановление файловой системы в Debian</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://adminkin.pro/vosstanovlenie-fajlovoj-sistemy-v-debian/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Speech to text бесплатно от создателя ChatGPT</title>
		<link>https://adminkin.pro/speech-to-text-besplatno-ot-sozdatelya-chatgpt/</link>
					<comments>https://adminkin.pro/speech-to-text-besplatno-ot-sozdatelya-chatgpt/#respond</comments>
		
		<dc:creator><![CDATA[Ирина К.]]></dc:creator>
		<pubDate>Sun, 16 Mar 2025 15:38:51 +0000</pubDate>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[chatgpt]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://adminkin.pro/?p=6712</guid>

					<description><![CDATA[<p>Преобразовать речь в текст (speech to text) легко с помощью бесплатной модели автоматического распознавания речи Whisper от компании OpenAI, создателя ChatGPT. В этой статье распознаем речь на русском и на английском языке. Распознаем речь как уже записанную в аудио файл, так и аудиопоток (живой звук) с микрофона. Работать будем в Debian. Погнали! Установка Whisper Актуализируем установленные версии пакетов Debian: Устанавливаем Python, библиотеку PyTorch для Python, менеджер пакетов Pip для Python, пакет Venv для виртуальных окружений в Python и пакет инструментов для работы с аудио и видео FFmpeg: Проверяем версию установленного Python: Дожна быть версия не менее Python 3.9.9. Начиная с Python 3.12, а в некоторых сборках с Python 3.11, попытка [&#8230;]</p>
<p>Сообщение <a href="https://adminkin.pro/speech-to-text-besplatno-ot-sozdatelya-chatgpt/">Speech to text бесплатно от создателя ChatGPT</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Преобразовать речь в текст (speech to text) легко с помощью бесплатной модели автоматического распознавания речи Whisper от компании OpenAI, создателя ChatGPT. В этой статье распознаем речь на русском и на английском языке. Распознаем речь как уже записанную в аудио файл, так и аудиопоток (живой звук) с микрофона. Работать будем в Debian. Погнали!</p>



<span id="more-6712"></span>



<h2 class="wp-block-heading">Установка Whisper</h2>



<p>Актуализируем установленные версии пакетов Debian:</p>



<pre class="wp-block-code"><code>apt update &amp;&amp; apt upgrade -y</code></pre>



<p>Устанавливаем <strong>Python</strong>, библиотеку <strong>PyTorch</strong> для Python, менеджер пакетов <strong>Pip</strong> для Python, пакет <strong>Venv</strong> для виртуальных окружений в Python и пакет инструментов для работы с аудио и видео <strong>FFmpeg</strong>:</p>



<pre class="wp-block-code"><code>apt install python3 python3-torch python3-pip python3-venv ffmpeg</code></pre>



<p>Проверяем версию установленного Python:</p>



<pre class="wp-block-code"><code>python3 --version</code></pre>



<p>Дожна быть версия не менее Python 3.9.9.</p>



<p>Начиная с Python 3.12, а в некоторых сборках с Python 3.11, попытка установить пакет с помощью команды <strong>pip install</strong> не увенчается успехом:</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/03/oshibka-externally-managed-environment.png" data-rel="lightbox-gallery-rci6n4az" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/03/oshibka-externally-managed-environment-1024x576.png" alt="Ошибка externally-managed-environment" class="wp-image-6715" srcset="https://adminkin.pro/wp-content/uploads/2025/03/oshibka-externally-managed-environment-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/03/oshibka-externally-managed-environment-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/03/oshibka-externally-managed-environment-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/03/oshibka-externally-managed-environment-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/03/oshibka-externally-managed-environment-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/03/oshibka-externally-managed-environment.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Ниже строки <strong>&#171;error: externally-managed-environment&#187;</strong> имеются разъяснения, что Python-пакет можно установить командой <strong>apt</strong>. Если же Python-пакет желаете ставить командой <strong>pip install</strong>, то нужно предварительно создать виртуальное окружение Python. Это все сделано, чтобы избежать конфликтов между пакетами, установленными через <strong>apt</strong> и <strong>pip</strong>.</p>



<p>Под обычным пользователем (не root) cоздаем виртуальное окружение Python с именем <strong>whisper_env</strong>:</p>



<pre class="wp-block-code"><code>python3 -m venv whisper_env</code></pre>



<p>Активируем виртуальное окружение <strong>whisper_env</strong>:</p>



<pre class="wp-block-code"><code>source whisper_env/bin/activate</code></pre>



<p>Когда понадобится выйти из виртуального окружения:</p>



<pre class="wp-block-code"><code>deactivate</code></pre>



<p>Когда понадобится удалить виртуальное окружение <strong>whisper_env</strong>:</p>



<pre class="wp-block-code"><code>rm -rf whisper_env</code></pre>



<p>В виртуальном окружении устанавливаем самую свежую версию Whisper от OpenAI:</p>



<pre class="wp-block-code"><code>pip install git+https://github.com/openai/whisper.git</code></pre>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/03/ustanovka-wisper-ot-openai.png" data-rel="lightbox-gallery-rci6n4az" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/03/ustanovka-wisper-ot-openai-1024x576.png" alt="Установка Wisper от OpenAI" class="wp-image-6727" srcset="https://adminkin.pro/wp-content/uploads/2025/03/ustanovka-wisper-ot-openai-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/03/ustanovka-wisper-ot-openai-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/03/ustanovka-wisper-ot-openai-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/03/ustanovka-wisper-ot-openai-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/03/ustanovka-wisper-ot-openai-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/03/ustanovka-wisper-ot-openai.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Whisper и необходимые ему для работы пакеты успешно установлены. </p>



<p>Если понадобится обновить Whisper:</p>



<pre class="wp-block-code"><code>pip install --upgrade --no-deps --force-reinstall git+https://github.com/openai/whisper.git</code></pre>



<h2 class="wp-block-heading">Speech to text для аудиофайла</h2>



<p>Whisper поддерживает аудиофайлы в следующих форматах: mp3, wav, m4a, flac, ogg, webm.</p>



<p>Для преобразования речи в текст (speech to text) запустим Whisper в командной строке, например, для аудиофайла на английском языке:</p>



<pre class="wp-block-code"><code>whisper /home/user/test.mp3 --model base --language English</code></pre>



<p>где <strong><code>/home/user/test.mp3</code></strong> – путь к аудиофайлу, который нужно обработать.</p>



<p><strong><code>--model base</code></strong> – выбор модели <strong>base</strong> (средняя точность, хорошая скорость). Всего доступно шесть моделей, различающихся по размеру, скорости и точности: tiny, base, small, medium, large, turbo.</p>



<p><strong><code>--language English</code></strong> – явное указание языка речи. Без явного указания языка Whisper сам определит язык.</p>



<p>Whisper обрабатывает аудиофайл и выводит распознанный текст с временными метками в терминал:</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla.png" data-rel="lightbox-gallery-rci6n4az" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla-1024x576.png" alt="Speech to text для аудиофайла" class="wp-image-6762" srcset="https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Кроме того, Whisper создает пять файлов с расширениями:</p>



<ul class="wp-block-list">
<li><strong>.txt</strong> &#8212; просто текст без временных меток;</li>



<li><strong>.srt</strong> &#8212; формат субтитров с таймкодами, например, для видео на YouTube;</li>



<li><strong>.vtt</strong> &#8212; формат субтитров, используемый в HTML5-видеоплеерах;</li>



<li><strong>.json</strong> &#8212; структурированные данные с временными метками для программного анализа;</li>



<li><strong>.tsv</strong> &#8212; тект и время в табличной форме.</li>
</ul>



<p>Чтобы обработать аудиофайл и узнать время, которое понадобилось Whisper для обработки этого файла:</p>



<pre class="wp-block-code"><code>time whisper /home/user/test.mp3 --model base --language English</code></pre>



<p>Например, mp3 аудиофайл на английском языке, длительностью <strong>3:18 минут</strong>, был обработан с помощью модели <strong>base</strong> за <strong>11 секунд</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/03/vremya-obrabotki-speed-to-text.png" data-rel="lightbox-gallery-rci6n4az" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/03/vremya-obrabotki-speed-to-text-1024x576.png" alt="Время обработки Speed to text" class="wp-image-6781" srcset="https://adminkin.pro/wp-content/uploads/2025/03/vremya-obrabotki-speed-to-text-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/03/vremya-obrabotki-speed-to-text-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/03/vremya-obrabotki-speed-to-text-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/03/vremya-obrabotki-speed-to-text-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/03/vremya-obrabotki-speed-to-text-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/03/vremya-obrabotki-speed-to-text.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Вот пример Speech to text обработки с помощью Whisper и модели <strong>base</strong> для mp3 аудиофайла на русском языке длительностью <strong>12:22 минут</strong>. Время обработки &#8212; <strong>1 минута и 2 секунды</strong>:</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla-na-russkom-yazyke.png" data-rel="lightbox-gallery-rci6n4az" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla-na-russkom-yazyke-1024x576.png" alt="Speech to text для аудиофайла на русском языке" class="wp-image-6782" srcset="https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla-na-russkom-yazyke-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla-na-russkom-yazyke-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla-na-russkom-yazyke-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla-na-russkom-yazyke-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla-na-russkom-yazyke-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiofajla-na-russkom-yazyke.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Модель <strong>base</strong> быстрая, но делает ошибки. Я обнаружила ошибки в распознанном тексте и на английском языке, и на русском. Следующая по точности модель <strong>small</strong> уже эти ошибки не сделала. Так что, экспериментируйте!</p>



<h2 class="wp-block-heading">Speech to text для аудиопотока с микрофона</h2>



<h3 class="wp-block-heading">Источник звука по умолчанию</h3>



<p>Проверяем, какое устройство в данный момент установлено по умолчанию как источник звука:</p>



<pre class="wp-block-code"><code>pactl info | grep "Default Source"</code></pre>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/03/istochnik-zvuka-po-umolchaniyu.png" data-rel="lightbox-gallery-rci6n4az" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/03/istochnik-zvuka-po-umolchaniyu-1024x576.png" alt="Источник звука по умолчанию" class="wp-image-6809" srcset="https://adminkin.pro/wp-content/uploads/2025/03/istochnik-zvuka-po-umolchaniyu-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/03/istochnik-zvuka-po-umolchaniyu-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/03/istochnik-zvuka-po-umolchaniyu-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/03/istochnik-zvuka-po-umolchaniyu-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/03/istochnik-zvuka-po-umolchaniyu-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/03/istochnik-zvuka-po-umolchaniyu.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Если это не микрофон, как у меня, то смотрим, какие вообще есть устройства &#8212; источники звуков:</p>



<pre class="wp-block-code"><code>pactl list sources short</code></pre>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/03/itochniki-zvukov-v-debian.png" data-rel="lightbox-gallery-rci6n4az" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/03/itochniki-zvukov-v-debian-1024x576.png" alt="Иточники звуков в Debian" class="wp-image-6811" srcset="https://adminkin.pro/wp-content/uploads/2025/03/itochniki-zvukov-v-debian-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/03/itochniki-zvukov-v-debian-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/03/itochniki-zvukov-v-debian-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/03/itochniki-zvukov-v-debian-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/03/itochniki-zvukov-v-debian-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/03/itochniki-zvukov-v-debian.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Устанавливаем микрофон как устройство &#8212; источник звука по умолчанию:</p>



<pre class="wp-block-code"><code>pactl set-default-source &lt;имя_устройства&gt;</code></pre>



<p>В моем случае это будет команда:</p>



<pre class="wp-block-code"><code>pactl set-default-source alsa_input.usb-Creative_Technology_Ltd_Sound_Blaster_Play__3_YDSB1730445001857F-00.iec958-stereo</code></pre>



<h3 class="wp-block-heading">Проверка микрофона</h3>



<p>Проверить работоспособность микрофона можно, например, записав короткий аудиофайл, а затем прослушав его. Команда на запись аудиофайла:</p>



<pre class="wp-block-code"><code>arecord -f cd -d 5 test-mic.wav</code></pre>



<p>где <code>-f cd</code> &#8212; качество записи 44100 Гц, 16 бит, стерео;</p>



<p><code>-d 5</code> &#8212; длительность записи 5 секунд;</p>



<p><code>test-mic.wav</code> &#8212; имя выходного аудиофайла.</p>



<p>Прослушаем аудиофайл <strong>test-mic.wav</strong>:</p>



<pre class="wp-block-code"><code>aplay test-mic.wav</code></pre>



<h3 class="wp-block-heading">Python программа &#8212; speech to text для аудиопотока с микрофона</h3>



<p>Устанавливаем Python-библиотеку <strong>PyAudio</strong> для работы с микрофоном:</p>



<pre class="wp-block-code"><code>pip install pyaudio</code></pre>



<p>Для преобразования Speech to text для аудиопотока с микрофона напишем небольшую программу на Python и назовем ее, например, <strong>streaming_speech_recognition.py</strong>:</p>



<pre class="wp-block-code"><code>import whisper
import pyaudio
import numpy as np
import torch

# Determine whether to use GPU
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using {device.upper()} for computations")

# Load the Whisper model
model = whisper.load_model("small", device=device)

# Audio stream settings
FORMAT = pyaudio.paInt16  # 16-bit audio
CHANNELS = 1  # Mono sound
RATE = 16000  # Sample rate
CHUNK = 1024  # Buffer size

# Initialize PyAudio
audio = pyaudio.PyAudio()

# Open a stream for recording from the microphone
stream = audio.open(format=FORMAT, channels=CHANNELS, rate=RATE,
                    input=True, frames_per_buffer=CHUNK)

print("Speak... (Press Ctrl+C to exit)")

try:
    while True:
        frames = &#91;]

        # Record audio for ~5 seconds (can be changed)
        for _ in range(int(RATE / CHUNK * 5)):  # 5 seconds of audio
            data = stream.read(CHUNK)
            frames.append(np.frombuffer(data, dtype=np.int16))

        # Convert data to a NumPy array and normalize
        audio_data = np.concatenate(frames, axis=0).astype(np.float32) / 32768.0

        # Transcribe speech using Whisper
        result = model.transcribe(audio_data, language="en", fp16=False)  # fp16=False for CPU
        print("Recognized text:", result&#91;"text"])

except KeyboardInterrupt:
    print("\nStopping the program...")
    stream.stop_stream()
    stream.close()
    audio.terminate()</code></pre>



<h3 class="wp-block-heading">Как это работает?</h3>



<p>Если в двух словах, то программа <strong>streaming_speech_recognition.py</strong> в реальном времени пишет звук с микрофона, обрабатывает его и передает в модель Whisper для распознавания речи. Распознанная речь выводится в терминал.</p>



<p>Если подробнее описать, то получается следующая последовательность действий:</p>



<ol class="wp-block-list">
<li>Определение устройства для вычислений модели Whisper: GPU или CPU. Если подходящего GPU не обнаружно, используется CPU.</li>



<li>Загрузка модели small Whisper. Можно экспериментировать и с другими моделями: tiny, base, medium, large, turbo.</li>



<li>Настройки аудиопотока: <strong><code>FORMAT = pyaudio.paInt16</code></strong> &#8212; 16-битное аудио (стандартный формат); <strong><code>CHANNELS = 1</code></strong> &#8212; один канал, как у большинства микрофонов; <strong><code>RATE = 16000</code></strong> &#8212; частота дискретизации (обычно 16 кГц для речи); <strong><code>CHUNK = 1024</code></strong> &#8212; размер одного пакета данных, считываемых с микрофона.</li>



<li>Открытие потока <code>stream</code>, который захватывает звук с микрофона.</li>



<li>Запуск бесконечного цикла <code>while True</code>, в котором:
<ul class="wp-block-list">
<li>звук с микрофона считывается кусками (<strong><code>stream.read(CHUNK)</code>)</strong> и складывается в <code>frames</code>;</li>



<li>цикл <strong><code>for _ in range(...)</code></strong> повторяет <code>stream.read(CHUNK)</code> столько раз, чтобы записать <strong>5 секунд</strong> аудио. Можно уменьшить задержку, например, записывая 1 секунду вместо 5;</li>



<li>после записи 5 секунд аудио данные преобразуются в <strong>numpy</strong> массив и нормализуются для передачи в Whisper;</li>



<li>Whisper обрабатывает звук, явное указание языка <code>language="en"</code> ускоряет обработку, <code>fp16=False</code> &#8212; отключает <strong>Float16</strong>, если используется <strong>CPU</strong>;</li>



<li>распознанная речь выводится в терминал.</li>
</ul>
</li>



<li>Завершение программы, если пользователь нажимает <strong>Ctrl+C</strong>.</li>
</ol>



<h3 class="wp-block-heading">Запуск Python программы</h3>



<p>Для запуска программы <strong>streaming_speech_recognition.py</strong>:</p>



<pre class="wp-block-code"><code>python3 streaming_speech_recognition.py</code></pre>



<p>При первом запуске программы скачается <strong>small</strong> модель Whisper, размер которой ~460 MB. Для сравнения, размер <strong>base</strong> модели Whisper ~140 MB.</p>



<p>Рядом с микрофоном я проиграла <strong>test.mp3</strong> &#8212; аудиофайл на английском языке, который тестировался с Whisper самый первый:</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiopotoka-s-mikrofona.png" data-rel="lightbox-gallery-rci6n4az" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiopotoka-s-mikrofona-1024x576.png" alt="Speech to text для аудиопотока с микрофона" class="wp-image-6825" srcset="https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiopotoka-s-mikrofona-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiopotoka-s-mikrofona-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiopotoka-s-mikrofona-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiopotoka-s-mikrofona-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiopotoka-s-mikrofona-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/03/speech-to-text-dlya-audiopotoka-s-mikrofona.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Я в восторге от результата!</p>



<h2 class="wp-block-heading">Вывод</h2>



<p>Напишите в комментариях, как Speed to text можно использовать в реальной жизни. Будет интересно!</p>


 <div class="hp-vendors hp-block hp-grid"><div class="hp-row"><div class="hp-grid__item hp-col-sm-12 hp-col-xs-12"><article class="hp-vendor hp-vendor--view-block"><header class="hp-vendor__header"><div class="hp-vendor__image">
	<a href="https://adminkin.pro/vendor/irinak/">
					<img decoding="async" src="https://adminkin.pro/wp-content/uploads/2023/08/Irina-K.jpg" alt="Ирина K." loading="lazy">
			</a>
</div>
</header><div class="hp-vendor__content"><h4 class="hp-vendor__name"><a href="https://adminkin.pro/vendor/irinak/">Ирина K.</a>
	<i class="hp-vendor__verified-badge hp-icon fas fa-check-circle" title="Проверен"></i>
	</h4><div class="hp-vendor__details hp-vendor__details--primary"><time class="hp-vendor__registered-date hp-vendor__date hp-meta" datetime="2022-07-22 16:45:26">
	Автор и создатель сайта</time>
</div></div><footer class="hp-vendor__footer"><div class="hp-vendor__actions hp-vendor__actions--primary"></div></footer></article></div></div></div><p>Сообщение <a href="https://adminkin.pro/speech-to-text-besplatno-ot-sozdatelya-chatgpt/">Speech to text бесплатно от создателя ChatGPT</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://adminkin.pro/speech-to-text-besplatno-ot-sozdatelya-chatgpt/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Перенос сайта с хостинга на виртуальный сервер VPS</title>
		<link>https://adminkin.pro/perenos-sajta-s-hostinga-na-virtualnyj-server-vps/</link>
					<comments>https://adminkin.pro/perenos-sajta-s-hostinga-na-virtualnyj-server-vps/#respond</comments>
		
		<dc:creator><![CDATA[Ирина К.]]></dc:creator>
		<pubDate>Fri, 21 Feb 2025 12:23:10 +0000</pubDate>
				<category><![CDATA[Создание сайта]]></category>
		<category><![CDATA[certbot]]></category>
		<category><![CDATA[crontab]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[scp]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[unixsocket]]></category>
		<category><![CDATA[vds]]></category>
		<category><![CDATA[webserver]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://adminkin.pro/?p=6543</guid>

					<description><![CDATA[<p>Давайте перенесем WordPress сайт с хостинга на виртуальный сервер (VPS) и настроим все для быстрой загрузки сайта. Статья получилась объемной и максимально подробной! Выбрали и оплатили VPS сервер Я выбрала себе виртуальный сервер (VPS) со следующими характеристиками: IPv4 Address: 1RAM: 1 GB RAMCPU Cores: 1 CPU CoreOperating System: Debian 12 64 BitDisk Space: 24 GB SSDТрафик в месяц: 1.95 TBСтоимость в год: $17.28 USD Настроили SSH доступ на VPS по ключу В статье &#171;SSH key в Windows и Linux. Руководство&#187; подробно описано, как настроить SSH доступ на сервер VPS не через логин и пароль, а по ключу. Это нужно для безопасности! Чтобы SSH соединение не разрывалось Чтобы SSH соединение не [&#8230;]</p>
<p>Сообщение <a href="https://adminkin.pro/perenos-sajta-s-hostinga-na-virtualnyj-server-vps/">Перенос сайта с хостинга на виртуальный сервер VPS</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Давайте перенесем WordPress сайт с хостинга на виртуальный сервер (VPS) и настроим все для быстрой загрузки сайта. Статья получилась объемной и максимально подробной!</p>



<span id="more-6543"></span>



<h2 class="wp-block-heading">Выбрали и оплатили VPS сервер</h2>



<p>Я выбрала себе виртуальный сервер (VPS) со следующими характеристиками:</p>



<pre class="wp-block-preformatted">IPv4 Address: 1<br>RAM: 1 GB RAM<br>CPU Cores: 1 CPU Core<br>Operating System: Debian 12 64 Bit<br>Disk Space: 24 GB SSD<br>Трафик в месяц: 1.95 TB<br>Стоимость в год: $17.28 USD </pre>



<h2 class="wp-block-heading">Настроили SSH доступ на VPS по ключу</h2>



<p>В статье &#171;<a href="https://adminkin.pro/ssh-key-v-windows-i-linux-rukovodstvo/" target="_blank" rel="noreferrer noopener">SSH key в Windows и Linux. Руководство</a>&#187; подробно описано, как настроить SSH доступ на сервер VPS не через логин и пароль, а по ключу. Это нужно для безопасности!  </p>



<h2 class="wp-block-heading">Чтобы SSH соединение не разрывалось</h2>



<p>Чтобы SSH соединение не разрывалось при &#171;неактивности&#187;, в Linux используем команду:</p>



<pre class="wp-block-code"><code>ssh -o ServerAliveInterval=60 -i /home/user/VDS_ir user@123.45.67.89</code></pre>



<p>где <code>-o ServerAliveInterval=60</code> указывает SSH клиенту отправлять специальные пакеты <strong>keep-alive</strong> на сервер каждые <strong>60 секунд</strong>. Это позволяет избежать разрыва SSH соединения из-за простоя.</p>



<p><code>-i /home/user/VDS_ir</code> задает путь к приватному ключу <strong>/home/user/VDS_ir</strong>. Этот ключ используется для аутентификации вместо пароля.</p>



<p><code>user@123.45.67.89</code> &#8212; это указание имени пользователя <strong>user</strong> на сервере и IP адрес сервера <strong>123.45.67.89</strong>.</p>



<p>Чтобы SSH соединение не разрывалось при простое в Windows, в PuTTY в разделе <strong>Connection</strong> выставляем значение <strong>60</strong> для параметра <strong>Seconds between keepalives (0 to turn off)</strong>.</p>



<h2 class="wp-block-heading">Запаковываем сайт в архив</h2>



<p>Переходим в WordPress-админку сайта, который требуется перенести.</p>



<p>Перед созданием архива сайта рекомендуется уменьшить размер базы данных сайта с помощью WordPress плагина <strong>WP-Optimize</strong>.</p>



<p>Устанавливаем WordPress плагин <strong>Duplicator</strong> для создания архива сайта.</p>



<p>Переходим в раздел <strong>Настройки</strong> плагина <strong>Duplicator</strong> и включаем &#171;галочку&#187; <strong>Поддержка сетевого соединения</strong>, чтобы сетевое соединение не разрывалось в случае долгого создания архива сайта.</p>



<p>Переходим в раздел <strong>Резервные копии</strong> плагина <strong>Duplicator</strong> и двумя кликами мышки получаем запакованный архив сайта <strong>archive.zip</strong> и скрипт установщика <strong>installer.php</strong>. Скачиваем архив и скрипт к себе на локальную машину, например, в поддиректорию <strong>Documents</strong>. Из этой локальной поддиректории <strong>Documents</strong> копируем архив и скрипт на VPS сервер в предварительно созданную для этого директорию <strong>/home/user/adminkin/public_html</strong>:</p>



<pre class="wp-block-code"><code>scp -i /home/user/VDS_ir Documents/installer.php user@123.45.67.89:/home/user/adminkin/public_html</code></pre>



<p>где <code>scp</code> &#8212; команда безопасного копирования файлов по SSH.</p>



<p><code>-i /home/user/VDS_ir</code> указывает путь к приватному SSH-ключу <strong>/home/user/VDS_ir</strong>, который используется для аутентификации.</p>



<p><code>Documents/installer.php</code> &#8212; это путь к локальному файлу <strong>installer.php</strong>, который нужно передать на сервер. Он находится в <strong>Documents</strong>.</p>



<p><code>/home/user/adminkin/public_html</code> – путь на удаленном сервере, куда поместится файл.</p>



<p>Аналогичная команда для копирования архива <strong>archive.zip</strong>:</p>



<pre class="wp-block-code"><code>scp -i /home/user/VDS_ir  Documents/archive.zip  user@123.45.67.89:/home/user/adminkin/public_html</code></pre>



<h2 class="wp-block-heading">DNS записи</h2>



<p>Отредактируем DNS записи для домена WordPress сайта. Записи с типом <strong>А</strong> должны содержать IP адрес сервера, куда осуществляется перенос WordPress сайта. После внесения изменений в DNS записи нужно выждать время, чтобы исправленные DNS записи домена обновились на серверах.</p>



<h2 class="wp-block-heading">MySQL на сервере VPS</h2>



<h3 class="wp-block-heading">Устанавливаем MySQL сервер</h3>



<p>На VPS сервере устанавливаем сервер баз данных MySQL для работы сайта WordPress:</p>



<pre class="wp-block-code"><code>apt install mariadb-server</code></pre>



<p>Настраиваем параметры безопасности и создаем пароль для MySQL-пользователя <strong>root</strong>:</p>



<pre class="wp-block-code"><code>mysql_secure_installation</code></pre>



<p>На все вопросы отвечаем утвердительно (<strong>Y</strong>).</p>



<p>Рестартуем, чтобы изменения вошли в силу:</p>



<pre class="wp-block-code"><code>systemctl restart mysql</code></pre>



<h3 class="wp-block-heading">Создаем пользователя и базу данных MySQL</h3>



<p>Запускаем MySQL-клиент в командной строке под MySQL-пользователем <strong>root</strong>:</p>



<pre class="wp-block-code"><code>mysql -u root -p</code></pre>



<p>Создаем MySQL базу данных с именем <strong>db_adminkin</strong>:</p>



<pre class="wp-block-code"><code>CREATE DATABASE db_adminkin DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;</code></pre>



<p>Создаем MySQL-пользователя с именем <strong>usr_adminkin</strong> и паролем <strong>password</strong>:</p>



<pre class="wp-block-code"><code>CREATE USER 'usr_adminkin'@'localhost' IDENTIFIED BY 'password';</code></pre>



<p>Предоставляем пользователю <strong>usr_adminkin</strong> права доступа к базе данных <strong>db_adminkin</strong>:</p>



<pre class="wp-block-code"><code>GRANT ALL PRIVILEGES ON db_adminkin.* TO 'usr_adminkin'@'localhost' IDENTIFIED BY 'password';</code></pre>



<pre class="wp-block-code"><code>FLUSH PRIVILEGES;</code></pre>



<p>Проверить предоставленные права можно с помощью команды:</p>



<pre class="wp-block-code"><code>SHOW GRANTS FOR 'usr_adminkin'@'localhost';</code></pre>



<p>Выходим из MySQL-клиента:</p>



<pre class="wp-block-code"><code>exit</code></pre>



<h2 class="wp-block-heading">PHP на сервере VPS</h2>



<p>На VPS сервере устанавливаем PHP, необходимый для работы сайта на WordPress:</p>



<pre class="wp-block-code"><code>apt install php php-bcmath php-bz2 php-cli php-common php-curl php-fpm php-gd php-imagick php-intl php-mbstring php-mysql php-readline php-soap php-xml php-xmlrpc php-zip</code></pre>



<h2 class="wp-block-heading">Nginx на сервере VPS</h2>



<p>На VPS сервере устанавливаем веб-сервер Nginx:</p>



<pre class="wp-block-code"><code>apt install nginx</code></pre>



<p>Создаем конфигурационный файл сайта <strong>/etc/nginx/sites-available/adminkin.pro.conf</strong> со следующим содержимым:</p>



<pre class="wp-block-code"><code>server {
 listen 80;
 server_name adminkin.pro www.adminkin.pro;
 root /home/user/adminkin/public_html;
 index index.php;
 location / {
  try_files $uri $uri/ /index.php?$args;
 }
 location ~ \.php$ {
  include snippets/fastcgi-php.conf;
  fastcgi_pass unix:/run/php/php8.2-fpm.sock;
 }
}</code></pre>



<p>где <code>fastcgi_pass</code> &#8212; директива Nginx, указывающая путь к FastCGI-серверу (в данном случае PHP-FPM).</p>



<p><code>unix:</code> означает, что соединение с PHP-FPM будет происходить через Unix-сокет.</p>



<p><code>/run/php/php8.2-fpm.sock</code> &#8212; путь к файлу Unix-сокета PHP-FPM, а <strong>8.2</strong> &#8212; версия PHP.</p>



<p>Как же это работает? Когда клиент отправляет запрос, например, на <strong>adminkin.pro/index.php</strong>, Nginx видит, что файл <strong>.php</strong>. Он передает запрос обработчику PHP-FPM через FastCGI. PHP-FPM выполняет скрипт и возвращает результат обратно в Nginx, который отправляет его клиенту.</p>



<p>Создаем символьную ссылку:</p>



<pre class="wp-block-code"><code>ln -s /etc/nginx/sites-available/adminkin.pro.conf /etc/nginx/sites-enabled/</code></pre>



<p>Перезагружаем веб-сервер:</p>



<pre class="wp-block-code"><code>systemctl restart nginx</code></pre>



<p>Проверяем работоспособность сайта по протоколу HTTP. Для этого в директории <strong>/home/user/adminkin/public_html</strong> создаем файл <strong>index.php</strong>, например, со следующим содержимым:</p>



<pre class="wp-block-code"><code>&lt;?php phpinfo(); ?&gt;</code></pre>



<p>Переходим в браузер, в адресной строке набираем <strong>http://adminkin.pro</strong>, должно отобразиться:</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/02/proverka-rabotosposobnosti-veb-servera-nginx.png" data-rel="lightbox-gallery-sODpu3LY" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/02/proverka-rabotosposobnosti-veb-servera-nginx-1024x576.png" alt="Проверка работоспособности веб сервера Nginx" class="wp-image-6639" srcset="https://adminkin.pro/wp-content/uploads/2025/02/proverka-rabotosposobnosti-veb-servera-nginx-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/02/proverka-rabotosposobnosti-veb-servera-nginx-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/02/proverka-rabotosposobnosti-veb-servera-nginx-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/02/proverka-rabotosposobnosti-veb-servera-nginx-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/02/proverka-rabotosposobnosti-veb-servera-nginx-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/02/proverka-rabotosposobnosti-veb-servera-nginx.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">Доступ к сайту по HTTPS</h2>



<p>Время установить бесплатный SSL сертифиикат для доступа к сайту по протоколу HTTPS:</p>



<pre class="wp-block-code"><code>apt install certbot python3-certbot-nginx</code></pre>



<pre class="wp-block-code"><code>certbot --nginx -d adminkin.pro -d www.adminkin.pro --register-unsafely-without-email</code></pre>



<p>где <strong><code>certbot</code></strong> &#8212; утилита для автоматического получения и обновления SSL сертификатов от Let&#8217;s Encrypt.</p>



<p><strong><code>--nginx</code></strong> указывает, что Certbot должен автоматически настроить Nginx для работы с SSL.</p>



<p><strong><code>-d adminkin.pro -d www.adminkin.pro</code></strong> указывает домены, для которых запрашивается сертификат. В моем случае это <strong>adminkin.pro</strong> и <strong>www.adminkin.pro</strong>.</p>



<p><strong><code>--register-unsafely-without-email</code></strong> пропускает ввод email при регистрации.</p>



<p>Перезагружаем веб-сервер Nginx, чтобы применить изменения в конфигурационном файле <strong>/etc/nginx/sites-available/adminkin.pro.conf</strong>, которые внес Certbot по SSL сертификату и редиректу (переадресации) с небезопасного HTTP протокола на безопасный HTTPS протокол:</p>



<pre class="wp-block-code"><code>systemctl restart nginx</code></pre>



<p>В адресной строке браузера опять набираем <strong>http://adminkin.pro</strong>, чтобы проверить редирект (переадресацию) с HTTP на HTTPS. У меня работает!</p>



<p>Для автоматического обновления SSL сертификата открываем файл <strong>crontab</strong> на редактирование под пользователем <strong>root</strong>:</p>



<pre class="wp-block-code"><code>crontab -e</code></pre>



<p>И добавляем строку:</p>



<pre class="wp-block-code"><code>30 2 * * 1 /usr/bin/certbot renew &gt;&gt; /var/log/certbot.log</code></pre>



<p>Теперь каждый понедельник в 2:30 ночи будет выполняться команда <code>/usr/bin/certbot renew</code>. Эта команда проверяет, истекают ли SSL сертификаты, и продлевает их при необходимости. Вывод команды будет сохраняться в файл <strong>/var/log/certbot.log</strong>.</p>



<h2 class="wp-block-heading">Настройка сжатия на сервере и настройка кэша браузера</h2>



<p>Включим GZIP сжатие для уменьшения передаваемых пользователю данных с сервера, на котором сайт. Для этого в конфигурационном файле <strong>/etc/nginx/nginx.conf</strong> раскомментируем, удалив символ <strong>#</strong> в начале строки, следующие строки:</p>



<pre class="wp-block-code"><code># gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;</code></pre>



<p>Добавим строку, чтобы сервер не тратил свои ресурсы на сжатие слишком маленьких файлов:</p>



<pre class="wp-block-code"><code>gzip_min_length 256;</code></pre>



<p>Добавим еще типов файлов (веб-шрифты, изображения SVG и т.д.), которые тоже будут сжиматься. Для этого в строку, начинающуюся с <strong>gzip_types</strong> в самый конец перед символом <strong>;</strong> вставим следующий текст:</p>



<pre class="wp-block-code"><code>image/svg+xml font/ttf font/otf font/eot application/xhtml+xml application/rdf+xml application/manifest+json application/ld+json application/x-javascript application/geo+json application/atom+xml</code></pre>



<p>У меня получилось вот так:</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-gzip-szhatiya-na-servere-nginx.png" data-rel="lightbox-gallery-sODpu3LY" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-gzip-szhatiya-na-servere-nginx-1024x576.png" alt="Настройка gzip сжатия на сервере Nginx" class="wp-image-6562" srcset="https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-gzip-szhatiya-na-servere-nginx-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-gzip-szhatiya-na-servere-nginx-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-gzip-szhatiya-na-servere-nginx-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-gzip-szhatiya-na-servere-nginx-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-gzip-szhatiya-na-servere-nginx-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-gzip-szhatiya-na-servere-nginx.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Будем кэшировать редко меняющиеся файлы сайта в браузере пользователя на <strong>365 дней</strong>. Так, при повторном заходе пользователя на сайт, эти файлы не будут скачиваться с сервера сайта, а будут браться из кэша браузера пользователя. Обычно редко меняющиеся файлы сайта – это изображения, файлы стилей, файлы скриптов JavaScript. Для включения кэширования в конфигурационном файле <strong>/etc/nginx/sites-available/adminkin.pro.conf</strong>, в секции <strong>server</strong> добавляем текст:</p>



<pre class="wp-block-code"><code>location ~* \.(jpeg|jpg|png|gif|ico|css|js|pdf|webp|woff2)$ {
	expires 365d;
}</code></pre>



<p>Проверяем конфигурационные файлы Nginx на наличие ошибок:</p>



<pre class="wp-block-code"><code>nginx -t</code></pre>



<p>Перезагружаем веб-сервер:</p>



<pre class="wp-block-code"><code>systemctl restart nginx</code></pre>



<h2 class="wp-block-heading">Настройка прав доступа</h2>



<p>Запрещаем доступ к директории сайта <strong>/home/user/adminkin/public_html</strong> всем пользователям, кроме владельца и его группы:</p>



<pre class="wp-block-code"><code>chmod -R o-rwx /home/user/adminkin/public_html/</code></pre>



<p>Веб сервер Nginx работает под пользователем <strong>www-data</strong>. Убедиться в этом можно, заглянув в конфигурационный файл <strong>/etc/nginx/nginx.conf</strong>. Для доступа Nginx к сайту добавляем пользователя <strong>www-data</strong> в группу <strong>user</strong>:</p>



<pre class="wp-block-code"><code>usermod -a -G user www-data</code></pre>



<p>Для доступа PHP-FPM к сайту правим параметры <strong>user</strong> и <strong>group</strong> в конфигурационном файле <strong>/etc/php/8.2/fpm/pool.d/www.conf</strong>, где <strong>8.2</strong> &#8212; это версия PHP:</p>



<pre class="wp-block-code"><code>user = user
group = user</code></pre>



<p>Перезагружаем:</p>



<pre class="wp-block-code"><code>/etc/init.d/php8.2-fpm restart</code></pre>



<p>Больше не нужен <strong>index.php</strong>, удаляем его:</p>



<pre class="wp-block-code"><code>rm /home/user/adminkin/public_html/index.php</code></pre>



<h2 class="wp-block-heading">Разворачиваем сайт из архива</h2>



<p>Разворачиваем сайт из архива, созданного плагином <strong>Duplicator</strong>. Для этого в адресной строке браузера набираем <strong>https://adminkin.pro/installer.php</strong>. Далее, указываем имя MySQL базы, имя MySQL-пользователя и его пароль. И все! Сайт успешно мигрирован!</p>



<p>Заходим в WordPress-админку сайта, активируем необходимые плагины, проверяем работоспособность сайта.</p>



<h2 class="wp-block-heading">Проверка сжатия на сервере</h2>



<p>Для проверки, использует ли сервер сжатие, запросим с сервера, например, файл стилей CSS. А по заголовку ответа сервера определим, использовал ли сервер сжатие при отправке CSS.</p>



<pre class="wp-block-code"><code>curl -H 'Accept-Encoding: gzip' -I https://adminkin.pro/wp-content/themes/listinghive/style.css</code></pre>



<p>Ура! Использует:</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/02/proverka-ispolzuet-li-server-szhatie-css-fajla.png" data-rel="lightbox-gallery-sODpu3LY" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/02/proverka-ispolzuet-li-server-szhatie-css-fajla-1024x576.png" alt="Проверка Использует ли сервер сжатие CSS файла" class="wp-image-6606" srcset="https://adminkin.pro/wp-content/uploads/2025/02/proverka-ispolzuet-li-server-szhatie-css-fajla-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/02/proverka-ispolzuet-li-server-szhatie-css-fajla-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/02/proverka-ispolzuet-li-server-szhatie-css-fajla-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/02/proverka-ispolzuet-li-server-szhatie-css-fajla-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/02/proverka-ispolzuet-li-server-szhatie-css-fajla-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/02/proverka-ispolzuet-li-server-szhatie-css-fajla.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">Ускорение загрузки изображений</h2>



<p>WebP &#8212; это современный формат изображений, разработанный Google, который обеспечивает хорошее качество при меньшем размере файла по сравнению с JPEG и PNG. WebP поддерживается всеми современными браузерами.</p>



<p>Я использую WordPress плагин <strong>WebP Express</strong> для автогенерации изображений в формате WebP вместо JPEG и PNG. Для работоспособности плагина ставим необходимые пакеты обработки изображений:</p>



<pre class="wp-block-code"><code>apt install imagemagick ffmpeg webp</code></pre>



<p>В админ-панели WordPress, в настройках плагина <strong>WebP Express</strong> выставляем параметр <strong>Destination folder</strong> в значение <strong>Mingled</strong>, чтобы сгенерированные WebP изображения сохранялись в ту же директорию, где и оригиналы JPEG/PNG.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-plagina-webp-express.png" data-rel="lightbox-gallery-sODpu3LY" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-plagina-webp-express-1024x576.png" alt="Настройка плагина WebP Express" class="wp-image-6564" srcset="https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-plagina-webp-express-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-plagina-webp-express-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-plagina-webp-express-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-plagina-webp-express-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-plagina-webp-express-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojka-plagina-webp-express.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Отмечаем &#171;галочкой&#187; параметр <strong>Convert on upload</strong> для автогенерации WebP изображения при загрузке на сервер изображения JPEG/PNG.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-zagruzki-izobrazhenij.png" data-rel="lightbox-gallery-sODpu3LY" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-zagruzki-izobrazhenij-1024x576.png" alt="Ускорение загрузки изображений" class="wp-image-6654" srcset="https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-zagruzki-izobrazhenij-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-zagruzki-izobrazhenij-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-zagruzki-izobrazhenij-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-zagruzki-izobrazhenij-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-zagruzki-izobrazhenij-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-zagruzki-izobrazhenij.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Остальные настроки плагина <strong>WebP Express</strong> оставляем по умолчанию. После внесенных изменений не забываем нажать кнопку <strong>Save settings</strong> для сохранения настроек. Нажимаем кнопку <strong>Bulk Convert</strong> для генерации в WebP уже загруженных изображений (см. рис. выше).</p>



<p>Я после небольшого эксперемента с качеством сжатых изображений WebP и их получаемым размером все же поменяла в разделе <strong>Conversion</strong>, в <strong>Jpeg options</strong> параметр <strong>Quality for lossy</strong> в значения <strong>Fixed quality</strong> и <strong>60</strong>.</p>



<p>Настроим Nginx так, чтобы при запросе изображения JPEG/PNG сервер по возможности отдавал изображение WebP. Редактируем конфигурационный файл <strong>/etc/nginx/sites-available/adminkin.pro.conf</strong>. Перед блоком:</p>



<pre class="wp-block-code"><code>location ~* \.(jpeg|jpg|png|gif|ico|css|js|pdf|webp|woff2)$ {
	expires 365d;
}</code></pre>



<p>Вставляем блок:</p>



<pre class="wp-block-code"><code>location ~* ^/?wp-content/.*\.(png|jpe?g)$ {
	add_header Vary Accept;
	expires 365d;
	if ($http_accept !~* "webp"){
		break;
	}
	try_files $uri.webp /wp-content/plugins/webp-express/wod/webp-on-demand.php?xsource=x$request_filename&amp;wp-content=wp-content;
}</code></pre>



<p>где <code>webp-on-demand.php</code> &#8212; это скрипт конвертации в WebP формат.</p>



<p>Перезагружаем веб-сервер:</p>



<pre class="wp-block-code"><code>systemctl restart nginx</code></pre>



<h2 class="wp-block-heading">Ускорение PHP</h2>



<p>Ускорим наш проект на PHP (WordPress сайт) с помощью PHP кэширования.</p>



<p>APCu (Alternative PHP Cache User) &#8212; это расширение PHP, обеспечивающее кэширование данных в оперативной памяти. Оно предназначено для ускорения работы веб-приложений за счет хранения часто используемых данных в общем кэше, доступном для всех процессов PHP. Настроек APCu по умолчанию достаточно для большинства задач, поэтому просто устанавливаем:</p>



<pre class="wp-block-code"><code>apt install php-apcu</code></pre>



<p>Переходим в WordPress-админку и устанавливаем плагин <strong>APCu Manager</strong>. Плагин появится на боковой панели WordPress под названием <strong>PerfOps One</strong>. Выбираем <strong>PerfOps One</strong>, а затем выбираем <strong>Settings</strong>, чтобы настроить параметры <strong>APCu Manager</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/02/nastrojki-apcu-manager.png" data-rel="lightbox-gallery-sODpu3LY" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/02/nastrojki-apcu-manager-1024x576.png" alt="Настройки APCu Manager" class="wp-image-6700" srcset="https://adminkin.pro/wp-content/uploads/2025/02/nastrojki-apcu-manager-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojki-apcu-manager-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojki-apcu-manager-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojki-apcu-manager-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojki-apcu-manager-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/02/nastrojki-apcu-manager.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Проверяем, что все настроки отмечены &#171;галочками&#187;, и сохраняем настроки.</p>



<h2 class="wp-block-heading">Ускорение базы MySQL</h2>



<p>Включение кэша запросов MySQL повышает производительность за счет уменьшения частоты обращения MySQL к физическому диску базы данных, поскольку часто используемые запросы хранятся в памяти. По умолчанию функция кэша отключена:</p>



<pre class="wp-block-code"><code>mysql -u root -p</code></pre>



<pre class="wp-block-code"><code>SHOW VARIABLES LIKE 'query_cache_type';</code></pre>



<figure class="wp-block-image size-large"><a href="https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-bazy-mysql.png" data-rel="lightbox-gallery-sODpu3LY" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" width="1024" height="576" src="https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-bazy-mysql-1024x576.png" alt="Ускорение базы MySQL" class="wp-image-6652" srcset="https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-bazy-mysql-1024x576.png 1024w, https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-bazy-mysql-300x169.png 300w, https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-bazy-mysql-768x432.png 768w, https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-bazy-mysql-1536x864.png 1536w, https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-bazy-mysql-800x450.png 800w, https://adminkin.pro/wp-content/uploads/2025/02/uskorenie-bazy-mysql.png 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Добавим в конфигурационный файл MySQL <strong>/etc/mysql/my.cnf</strong> следующий текст:</p>



<pre class="wp-block-code"><code>&#91;mysqld]
query_cache_type = 1     # Включаем кэш
query_cache_size = 64M   # Объем кэша 64 Мбайт</code></pre>



<p>Рестартуем, чтобы изменения вошли в силу:</p>



<pre class="wp-block-code"><code>systemctl restart mysql</code></pre>



<h2 class="wp-block-heading">Вывод</h2>



<p>По-моему, получилось исчерпывающее руководство по переносу сайта с хостинга на виртуальный сервер VPS.</p>



<p>Интересно сравнить <strong>скорость загрузки</strong> одного и того же сайта на хостинге и на виртуальном сервере VPS? Пожалуйста, читайте статью: &#171;<a href="https://adminkin.pro/hosting-ili-vps-lichnoe-issledovanie/" target="_blank" rel="noreferrer noopener">Хостинг или VPS? Личное исследование</a>&#171;.</p>



<p>Свои вопросы и дополнения оставляйте в комментариях под статьей.</p>


 <div class="hp-vendors hp-block hp-grid"><div class="hp-row"><div class="hp-grid__item hp-col-sm-12 hp-col-xs-12"><article class="hp-vendor hp-vendor--view-block"><header class="hp-vendor__header"><div class="hp-vendor__image">
	<a href="https://adminkin.pro/vendor/irinak/">
					<img decoding="async" src="https://adminkin.pro/wp-content/uploads/2023/08/Irina-K.jpg" alt="Ирина K." loading="lazy">
			</a>
</div>
</header><div class="hp-vendor__content"><h4 class="hp-vendor__name"><a href="https://adminkin.pro/vendor/irinak/">Ирина K.</a>
	<i class="hp-vendor__verified-badge hp-icon fas fa-check-circle" title="Проверен"></i>
	</h4><div class="hp-vendor__details hp-vendor__details--primary"><time class="hp-vendor__registered-date hp-vendor__date hp-meta" datetime="2022-07-22 16:45:26">
	Автор и создатель сайта</time>
</div></div><footer class="hp-vendor__footer"><div class="hp-vendor__actions hp-vendor__actions--primary"></div></footer></article></div></div></div><p>Сообщение <a href="https://adminkin.pro/perenos-sajta-s-hostinga-na-virtualnyj-server-vps/">Перенос сайта с хостинга на виртуальный сервер VPS</a> появились сначала на <a href="https://adminkin.pro">Админкин</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://adminkin.pro/perenos-sajta-s-hostinga-na-virtualnyj-server-vps/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
