<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Debian on dedinit()</title><link>https://dedinit.ru/tags/debian/</link><description>Recent content in Debian on dedinit()</description><generator>Hugo -- 0.165.0</generator><language>ru-ru</language><lastBuildDate>Mon, 31 Aug 2026 03:00:00 +0300</lastBuildDate><atom:link href="https://dedinit.ru/tags/debian/index.xml" rel="self" type="application/rss+xml"/><item><title>WEB Proxy для Telegram Desktop: ставим tproxy-server на свой VPS и чиним грабли установщика</title><link>https://dedinit.ru/2026/tproxy-web-proxy-telegram-desktop/</link><pubDate>Mon, 31 Aug 2026 03:00:00 +0300</pubDate><guid>https://dedinit.ru/2026/tproxy-web-proxy-telegram-desktop/</guid><description>Рассказываю, как развернул WEB Proxy для Telegram Desktop на собственном VPS (tproxy-server + Caddy + MTProxy), что нашёл в установщике upstream и как починил падение mtproxy.service с правами на бинарь после сборки.</description><content:encoded><![CDATA[<figure class="entry-cover"><img src="https://dedinit.ru/2026/tproxy-web-proxy-telegram-desktop/hero.svg" alt="WEB Proxy для Telegram Desktop: Caddy, tproxy-server, MTProxy"></figure><h1 id="web-proxy-для-telegram-desktop-на-своём-vps">WEB Proxy для Telegram Desktop на своём VPS</h1>
<p>В моей инфраструктуре давно крутится Telegram-трафик через SOCKS5-туннель на VPS — но у этого подхода есть минусы: SOCKS5 легко режется DPI, а клиент надо настраивать отдельно. Альтернатива от самих разработчиков Telegram Desktop — <strong>WEB Proxy</strong>: прокси, который маскируется под обычный HTTPS-сайт на 443-м порту. Такой трафик не отличить от обычного захода на сайт, а подключение настраивается в два поля в настройках клиента.</p>
<p>В этой статье — как я развернул <a href="https://github.com/telegramdesktop/tproxy-server">tproxy-server</a> на свежем VPS (Debian 13, Hostkey), какие проблемы встретил в установщике и как их обошёл. Полезно всем, кто решит поднять свой WEB Proxy.</p>
<h2 id="зачем-web-proxy-а-не-socks5">Зачем WEB Proxy, а не SOCKS5</h2>
<table>
	<thead>
			<tr>
					<th>Критерий</th>
					<th>SOCKS5-туннель</th>
					<th>WEB Proxy (tproxy-server)</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Внешний вид трафика</td>
					<td>SOCKS5 (легко детектится)</td>
					<td>Обычный HTTPS на 443</td>
			</tr>
			<tr>
					<td>Маскировка под сайт</td>
					<td>нет</td>
					<td>да (свой статический сайт)</td>
			</tr>
			<tr>
					<td>Настройка в Telegram Desktop</td>
					<td>тип прокси + адрес + порт</td>
					<td>hostname + secret</td>
			</tr>
			<tr>
					<td>Держит сам Telegram</td>
					<td>да</td>
					<td>да (через MTProxy на бэкенде)</td>
			</tr>
	</tbody>
</table>
<p>Схема работы tproxy-server:</p>
<pre tabindex="0"><code>Telegram Desktop → HTTPS:443 → Caddy → tproxy-server:8080 → MTProxy:2398 → Telegram
                                        └ admin :8081 (/readyz, /healthz)
</code></pre><p>Caddy отдаёт Let&rsquo;s Encrypt сертификат и проксирует весь трафик на tproxy-server, который сам решает: обычные запросы отдаёт сайт-маскировку, а запросы WEB Proxy — гонит в MTProxy. Снаружи это просто HTTPS-сайт.</p>
<h2 id="установка-что-делает-installsh">Установка: что делает install.sh</h2>
<p>У upstream отличный установщик — <code>deploy/install.sh</code> делает почти всё сам:</p>
<ul>
<li>ставит пакеты (ca-certificates, curl, nftables);</li>
<li>ставит <strong>Caddy 2.11.4</strong> и <strong>Go 1.26.5</strong> (если нет);</li>
<li>собирает <code>tproxy-server</code> из исходников;</li>
<li>собирает <strong>MTProxy</strong> (pinned commit <code>f36d8af</code>) в <code>/opt/MTProxy</code>;</li>
<li>создаёт systemd-сервисы: <code>tproxy-server</code>, <code>mtproxy</code>, <code>tproxy-firewall</code>, <code>caddy</code>;</li>
<li>настраивает таймер <code>refresh-mtproxy-config</code> (обновление списка серверов Telegram раз в сутки);</li>
<li>поднимает nft-правило, закрывающее порты MTProxy (2398, 8888) от внешнего мира.</li>
</ul>
<p>Запуск:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./deploy/install.sh --hostname vps03.nixg.ru <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  --email me@example.com --site-dir /tmp/tproxy-site <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  --secret <span style="color:#a5d6ff">&#34;</span><span style="color:#ff7b72">$(</span>cat /tmp/tproxy-secret.txt<span style="color:#ff7b72">)</span><span style="color:#a5d6ff">&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>--secret</code> — 32 hex-символа (<code>openssl rand -hex 16</code>), <code>--site-dir</code> — каталог со статическим сайтом-маскировкой.</p>
<h2 id="грабли-1-mtproxyservice-падает-с-203exec-readyz-503">Грабли №1: mtproxy.service падает с 203/EXEC, readyz 503</h2>
<p>После первого прогона установщика <code>tproxy-server</code> был active, Caddy слушал 80/443, но прокси не работал:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>● mtproxy.service - failed (Result: exit-code), status=203/EXEC
</span></span></code></pre></td></tr></table>
</div>
</div><p>Порт 2398 не слушался, а <code>/readyz</code> административного эндпоинта отдавал 503 (readyz — это «вся цепочка готова», healthz при этом был 200).</p>
<p>Причина оказалась в <strong>правах на бинарь после сборки</strong>. Установщик собирает MTProxy в <code>/opt/MTProxy/objs/bin/mtproto-proxy</code>, но из-за umask бинарь и каталоги получают права <code>700 root:root</code>. Юнит <code>mtproxy.service</code> запускается от пользователя <code>mtproxy</code> (с <code>NoNewPrivileges=true</code> и <code>ProtectSystem=strict</code>) — процесс не может прочитать бинарь и умирает с 203/EXEC.</p>
<p>Лечится одной серией команд:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">4
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>chmod <span style="color:#a5d6ff">755</span> /opt/MTProxy /opt/MTProxy/objs /opt/MTProxy/objs/bin
</span></span><span style="display:flex;"><span>chown root:mtproxy /opt/MTProxy/objs/bin/mtproto-proxy
</span></span><span style="display:flex;"><span>chmod <span style="color:#a5d6ff">750</span> /opt/MTProxy/objs/bin/mtproto-proxy
</span></span><span style="display:flex;"><span>systemctl restart mtproxy
</span></span></code></pre></td></tr></table>
</div>
</div><p>После этого <code>mtproxy</code> — active (running), слушает <code>0.0.0.0:2398</code>, readyz → 200.</p>
<h2 id="грабли-2-флейк-go-test-в-установщике">Грабли №2: флейк go test в установщике</h2>
<p>Первый прогон install.sh (холодный кэш Go, сборка всех пакетов параллельно) упал на тестах:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>FAIL: internal/config — TestLoadAcceptsSystemdCredentialReadPermissions:
</span></span><span style="display:flex;"><span>group/other-readable profiles file outside a credential directory was accepted
</span></span></code></pre></td></tr></table>
</div>
</div><p>А повторный <code>go test ./...</code> (тёплый кэш) — PASS. Это классическая гонка при холодном параллельном прогоне тестов, а не баг кода. Лечение простое: перезапустить install.sh — дальше идёт нормально.</p>
<h2 id="грабли-3-не-открыты-порты-80443--ложная-тревога">Грабли №3: «не открыты порты 80/443» — ложная тревога</h2>
<p>Снаружи curl на 80/443 не отвечал, и я заподозрил firewall провайдера (Hostkey). Пошёл в панель — а там <strong>вообще нет настроек firewall/прокси</strong>. Полез в документацию, искал API&hellip;</p>
<p>На самом деле всё проще: порты у провайдера открыты по умолчанию, просто на 80/443 <strong>ничего не слушало</strong> — curl получал connection refused. Проверка: поднимаю временный <code>python3 -m http.server 80</code> → TCP connect снаружи OK. После установки Caddy сам слушает 80/443.</p>
<p>Так что если у вас после установки снаружи не открывается сайт — сначала проверьте, что порт слушается (<code>ss -tlnp</code>), а не ищите firewall в панели провайдера.</p>
<h2 id="проверка-после-установки">Проверка после установки</h2>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">6
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>systemctl status tproxy-server mtproxy tproxy-firewall caddy   <span style="color:#8b949e;font-style:italic"># все active</span>
</span></span><span style="display:flex;"><span>curl -s -o /dev/null -w <span style="color:#a5d6ff">&#39;%{http_code}&#39;</span> http://127.0.0.1:8081/readyz    <span style="color:#8b949e;font-style:italic"># 200</span>
</span></span><span style="display:flex;"><span>curl -s -o /dev/null -w <span style="color:#a5d6ff">&#39;%{http_code}&#39;</span> https://vps03.nixg.ru/          <span style="color:#8b949e;font-style:italic"># 200 (сайт)</span>
</span></span><span style="display:flex;"><span>openssl s_client -connect vps03.nixg.ru:443 -servername vps03.nixg.ru  <span style="color:#8b949e;font-style:italic"># LE-серт</span>
</span></span><span style="display:flex;"><span>ss -tlnp | grep -E <span style="color:#a5d6ff">&#39;:80 |:443|:2398|:8080|:8081&#39;</span>
</span></span><span style="display:flex;"><span>nft list ruleset | grep -E <span style="color:#a5d6ff">&#39;2398|8888&#39;</span>   <span style="color:#8b949e;font-style:italic"># закрыто от внешнего мира</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Наружу видны только 80/443. MTProxy-бэкенд (2398, 8888) закрыт nft — <code>iifname != &quot;lo&quot; ... drop</code>, то есть бэкенд не светится и не принимает подключения напрямую.</p>
<h2 id="настройка-клиента">Настройка клиента</h2>
<p>В Telegram Desktop: <strong>Settings → Advanced → Connection Type → Use custom proxy → NEW PROXY → WEB Proxy</strong>:</p>
<ul>
<li>hostname: <code>vps03.nixg.ru</code></li>
<li>secret: (32 hex-символа, которые вы сгенерировали)</li>
</ul>
<h2 id="итог">Итог</h2>
<p>WEB Proxy — отличная замена SOCKS5-туннелю, если нужна маскировка под обычный HTTPS: настраивается в два поля, трафик неотличим от сайта, а готовый установщик upstream делает почти всю работу. Главные грабли — права на бинарь MTProxy после сборки (203/EXEC) и ложная тревога с «закрытыми портами». Оба решаются за пару минут, если знать, куда смотреть.</p>
<p>Полный набор файлов (заметки, сайт-маскировку, команду установки) я сложил в репозиторий <a href="https://github.com/telegramdesktop/tproxy-server">tproxy-web</a> — точнее, в свой <a href="https://gitverse.ru/kpa39l/tproxy-web">tproxy-web на gitverse</a>, а INSTALL_NOTES.md с деталями лежит там же.</p>
]]></content:encoded></item><item><title>Полная инструкция: Установка WriteFreely на wf.gelonet.ru (Debian 13)е</title><link>https://dedinit.ru/2025/%D0%BF%D0%BE%D0%BB%D0%BD%D0%B0%D1%8F-%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-writefreely-%D0%BD%D0%B0-wf.gelonet.ru-debian-13%D0%B5/</link><pubDate>Sun, 02 Nov 2025 19:00:00 +0300</pubDate><guid>https://dedinit.ru/2025/%D0%BF%D0%BE%D0%BB%D0%BD%D0%B0%D1%8F-%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-writefreely-%D0%BD%D0%B0-wf.gelonet.ru-debian-13%D0%B5/</guid><description>&lt;p&gt;Предполагается, что у вас есть:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPS с Debian 13,&lt;/li&gt;
&lt;li&gt;Доступ к серверу через sudo,&lt;/li&gt;
&lt;li&gt;Доменное имя gelonet.ru, зарегистрированное у любого регистратора.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-шаг-0-настройка-dns-в-панели-регистратора"&gt;🔹 Шаг 0: Настройка DNS (в панели регистратора)&lt;/h2&gt;
&lt;p&gt;Зайдите в панель управления вашего регистратора домена (например, reg.ru, nic.ru, Beget и т.д.).&lt;/p&gt;
&lt;p&gt;Найдите раздел «Управление DNS» или «Зоны DNS» для домена gelonet.ru.&lt;/p&gt;
&lt;p&gt;Создайте A-запись для поддомена:&lt;/p&gt;
&lt;p&gt;Имя (host): wf
Тип: A
Значение (IP): [ваш_публичный_IP_сервера]
TTL: 300 или по умолчанию&lt;/p&gt;
&lt;p&gt;Пример:
wf.gelonet.ru → 5.129.217.146&lt;/p&gt;</description><content:encoded><![CDATA[<p>Предполагается, что у вас есть:</p>
<ul>
<li>VPS с Debian 13,</li>
<li>Доступ к серверу через sudo,</li>
<li>Доменное имя gelonet.ru, зарегистрированное у любого регистратора.</li>
</ul>
<h2 id="-шаг-0-настройка-dns-в-панели-регистратора">🔹 Шаг 0: Настройка DNS (в панели регистратора)</h2>
<p>Зайдите в панель управления вашего регистратора домена (например, reg.ru, nic.ru, Beget и т.д.).</p>
<p>Найдите раздел «Управление DNS» или «Зоны DNS» для домена gelonet.ru.</p>
<p>Создайте A-запись для поддомена:</p>
<p>Имя (host): wf
Тип: A
Значение (IP): [ваш_публичный_IP_сервера]
TTL: 300 или по умолчанию</p>
<p>Пример:
wf.gelonet.ru → 5.129.217.146</p>
<p>Сохраните изменения.
⏱ DNS может обновиться от нескольких секунд до 10–30 минут. Проверить можно командой:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>dig +short wf.gelonet.ru
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># или</span>
</span></span><span style="display:flex;"><span>nslookup wf.gelonet.ru
</span></span></code></pre></td></tr></table>
</div>
</div><p>Результат должен совпадать с IP вашего сервера.</p>
<h2 id="-шаг-1-подготовка-сервера">🔹 Шаг 1: Подготовка сервера</h2>
<p>Подключитесь к серверу по SSH и выполните:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">5
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># Обновление системы</span>
</span></span><span style="display:flex;"><span>sudo apt update <span style="color:#ff7b72;font-weight:bold">&amp;&amp;</span> sudo apt upgrade -y
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># Установка необходимых пакетов</span>
</span></span><span style="display:flex;"><span>sudo apt install -y nginx curl tar ufw
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="-шаг-2-настройка-фаервола-ufw">🔹 Шаг 2: Настройка фаервола (UFW)</h2>
<p>Разрешите SSH, HTTP и HTTPS:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo ufw allow OpenSSH
</span></span><span style="display:flex;"><span>sudo ufw allow <span style="color:#a5d6ff">&#39;Nginx Full&#39;</span>  <span style="color:#8b949e;font-style:italic"># открывает 80/tcp и 443/tcp</span>
</span></span><span style="display:flex;"><span>sudo ufw enable
</span></span></code></pre></td></tr></table>
</div>
</div><p>Проверка:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo ufw status verbose
</span></span></code></pre></td></tr></table>
</div>
</div><p>💡 Порт 80 нужен для получения сертификата, порт 443 — для доступа к сайту по HTTPS.</p>
<h2 id="-шаг-3-установка-writefreely">🔹 Шаг 3: Установка WriteFreely</h2>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">13
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># Создаём директорию</span>
</span></span><span style="display:flex;"><span>sudo mkdir -p /var/www/writefreely
</span></span><span style="display:flex;"><span>cd /var/www/writefreely
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># Скачиваем последнюю версию (v0.16.0 на момент написания)</span>
</span></span><span style="display:flex;"><span>sudo curl -L https://github.com/writefreely/writefreely/releases/download/v0.16.0/writefreely_0.16.0_linux_amd64.tar.gz -o writefreely.tar.gz
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># Распаковываем</span>
</span></span><span style="display:flex;"><span>sudo tar -xzf writefreely.tar.gz --strip-components<span style="color:#ff7b72;font-weight:bold">=</span><span style="color:#a5d6ff">1</span>
</span></span><span style="display:flex;"><span>sudo rm writefreely.tar.gz
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># Назначаем права</span>
</span></span><span style="display:flex;"><span>sudo chown -R www-data:www-data /var/www/writefreely
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="-шаг-4-настройка-writefreely">🔹 Шаг 4: Настройка WriteFreely</h2>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo -u www-data /var/www/writefreely/writefreely config start
</span></span></code></pre></td></tr></table>
</div>
</div><p>Ответьте на вопросы:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">7
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>    Environment: Production, behind reverse proxy  
</span></span><span style="display:flex;"><span>    Server address: localhost:8080 <span style="color:#ff7b72;font-weight:bold">(</span>оставьте по умолчанию<span style="color:#ff7b72;font-weight:bold">)</span>  
</span></span><span style="display:flex;"><span>    Database: SQLite <span style="color:#ff7b72;font-weight:bold">(</span>проще для старта<span style="color:#ff7b72;font-weight:bold">)</span> или MySQL <span style="color:#ff7b72;font-weight:bold">(</span>если настроена БД<span style="color:#ff7b72;font-weight:bold">)</span>  
</span></span><span style="display:flex;"><span>    Site name: например, Мой блог  
</span></span><span style="display:flex;"><span>    Admin username: ваш email  
</span></span><span style="display:flex;"><span>    Admin password: надёжный пароль  
</span></span><span style="display:flex;"><span>    Остальное — по желанию
</span></span></code></pre></td></tr></table>
</div>
</div><p>Сгенерируйте ключи шифрования:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo -u www-data /var/www/writefreely/writefreely keys generate
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="-шаг-5-создание-systemd-сервиса">🔹 Шаг 5: Создание systemd-сервиса</h2>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">17
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo tee /etc/systemd/system/writefreely.service <span style="color:#a5d6ff">&lt;&lt;EOF
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">[Unit]
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">Description=WriteFreely Instance
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">After=network.target
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">[Service]
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">Type=simple
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">User=www-data
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">Group=www-data
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">WorkingDirectory=/var/www/writefreely
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">ExecStart=/var/www/writefreely/writefreely
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">Restart=always
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">RestartSec=10
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">[Install]
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">WantedBy=multi-user.target
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">EOF</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Запустите сервис:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo systemctl daemon-reload
</span></span><span style="display:flex;"><span>sudo systemctl enable --now writefreely
</span></span></code></pre></td></tr></table>
</div>
</div><p>Проверка:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo systemctl status writefreely
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="-шаг-6-настройка-nginx-как-обратного-прокси">🔹 Шаг 6: Настройка Nginx как обратного прокси</h2>
<p>Создайте конфиг (замените wf.gelonet.ru на ваш поддомен):</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">17
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">18
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">19
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">20
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">21
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">22
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">23
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">24
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">25
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">26
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">27
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">28
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">29
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">30
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">31
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">32
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">33
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">34
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">35
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">36
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">37
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">38
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">39
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">40
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">41
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">42
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">43
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">44
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">45
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo tee /etc/nginx/sites-available/writefreely <span style="color:#a5d6ff">&lt;&lt;EOF
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">server {
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">    listen 80;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">    listen [::]:80;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">    server_name wf.gelonet.ru;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">    gzip on;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">    gzip_types
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">      application/javascript
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">      application/x-javascript
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">      application/json
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">      application/rss+xml
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">      application/xml
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">      image/svg+xml
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">      image/x-icon
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">      application/vnd.ms-fontobject
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">      application/font-sfnt
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">      text/css
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">      text/plain;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">    gzip_min_length 256;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">    gzip_comp_level 5;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">    gzip_vary on;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">    location ~ ^/.well-known/(webfinger|nodeinfo|host-meta) {
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">        proxy_pass http://127.0.0.1:8080;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">        proxy_set_header Host \$host;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">        proxy_set_header X-Real-IP \$remote_addr;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">        proxy_redirect off;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">    }
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">    location ~ ^/(css|img|js|fonts)/ {
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">        root /var/www/writefreely/static;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">        expires 12M;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">    }
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">    location / {
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">        proxy_pass http://127.0.0.1:8080;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">        proxy_set_header Host \$host;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">        proxy_set_header X-Real-IP \$remote_addr;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">        proxy_redirect off;
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">    }
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">}
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">EOF</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Активируйте сайт:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo ln -s /etc/nginx/sites-available/writefreely /etc/nginx/sites-enabled/
</span></span><span style="display:flex;"><span>sudo nginx -t <span style="color:#ff7b72;font-weight:bold">&amp;&amp;</span> sudo systemctl reload nginx
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="-шаг-7-получение-ssl-сертификата-от-lets-encrypt">🔹 Шаг 7: Получение SSL-сертификата от Let’s Encrypt</h2>
<p>Установите Certbot:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo apt install -y certbot python3-certbot-nginx
</span></span></code></pre></td></tr></table>
</div>
</div><p>Получите сертификат:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo certbot --nginx -d wf.gelonet.ru
</span></span></code></pre></td></tr></table>
</div>
</div><p>Ответьте N на вопрос о передаче email EFF (если не хотите).
Certbot автоматически:
запросит сертификат,
обновит конфиг Nginx для HTTPS,
настроит автоматическое обновление.</p>
<p>📌 Важно: порты 80 и 443 должны быть открыты в UFW и облачном фаерволе!</p>
<h2 id="-шаг-8-проверка-работы">🔹 Шаг 8: Проверка работы</h2>
<p>Откройте в браузере свой поддомен, у меня это:
<a href="https://wf.gelonet.ru">https://wf.gelonet.ru</a></p>
<p>Вы должны увидеть главную страницу WriteFreely.
Админка доступна по:
<a href="https://wf.gelonet.ru/admin">https://wf.gelonet.ru/admin</a></p>
<h2 id="-шаг-9-проверка-автопродления-сертификата">🔹 Шаг 9: Проверка автопродления сертификата</h2>
<p>Certbot уже настроил таймер, но можно проверить вручную:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo certbot renew --dry-run
</span></span></code></pre></td></tr></table>
</div>
</div><p>Если команда завершится без ошибок — всё в порядке.</p>
<h2 id="-полезные-команды">🧰 Полезные команды</h2>
<p>Логи WriteFreely:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo journalctl -u writefreely -f
</span></span></code></pre></td></tr></table>
</div>
</div><p>Логи Nginx:</p>
<div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span> sudo tail -f /var/log/nginx/error.log
</span></span></code></pre></td></tr></table>
</div>
</div><p>Обновление WriteFreely:
Остановите сервис: sudo systemctl stop writefreely
Замените бинарник (повторите Шаг 3)
Запустите: sudo systemctl start writefreely</p>
<p>✅ Готово!</p>
<p>Ваш персональный блог на WriteFreely работает по адресу:
👉 <a href="https://wf.gelonet.ru">https://wf.gelonet.ru</a></p>
<p>Теперь вы полностью контролируете свой контент, без зависимости от сторонних платформ.</p>
]]></content:encoded></item></channel></rss>