tag:blogger.com,1999:blog-2441516710968080022024-03-12T13:01:16.838+03:00Traff / Seo / Etcabhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.comBlogger32125tag:blogger.com,1999:blog-244151671096808002.post-87865913103688162152023-06-30T19:23:00.627+03:002023-07-08T11:45:48.134+03:00Поднимаем десятки backconnect TOR proxy в докер контейнере<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2023/06/medusa-tor-proxy-docker-compose.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="Поднимаем десятки backconnect TOR proxy в докер контейнере" border="0" src="https://img.zzxc.ru/img/post-33-medusa-proxy/logo-33.jpg"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Недавно понадобилось произвести некоторые "тесты" в сети TOR. Но привычный инструмент, программа advor ни в какую не хотела подключаться к TOR. Как уже потом выяснилось сейчас для подключения нужно настраивать мосты. После поисков нашёл для себя отличную замену и поднял целую сеть бекконнект прокси TOR. Подробности внутри.
</div>
<a name='more'></a><br><br>
<H2>Необходимые требования</H2>
<p>Чтобы всё получилось нам понадобится:</p>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>Установленный <b><a href="/p/virtualization-docker-full-install.html" target="_blank" >Docker + Docker-Compose</a></b></li>
<li>10 - 20 минут времени</li>
</ul>
<br><br><br><br><br><br>
<H2>В двух словах про <b>Medusa</b></H2>
<p>Medusa является контейнером с обратным прокси, который представлен в виде <b><a target="_blank" rel="nofollow" href="https://ru.wikipedia.org/wiki/HAProxy">HAProxy</a></b>. В свою очередь помимо HAProxy в контейнере запускаются инстансы TOR к которым и подключается HAProxy</p>
<img border="0" alt="medusa container" src="https://img.zzxc.ru/img/post-33-medusa-proxy/rotating-tor-proxy.jpg" />
<p>А с противоположной стороны к HAProxy прикручены http и socks5 прокси, к которым мы будем подключаться в качестве клиента, получая таким образом возможность пройти путь от HAProxy к TOR. Причём для получения http прокси используется Privoxy перед socks5 прокси. </p>
<p>Для старта Medusa мы должны будем задать несколько параметров, такие как количество <b>голов</b>(Heads) и количество сервисов <b>TOR</b> на каждую голову.</p>
<br><br><br><br><br><br>
<H2>Подготовка</H2>
<p>Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём необходимые директории для Medusa </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/proxy/medusa-proxy</span></div>
<br>
<p>Сделаем нашего пользователя (не root !) владельцем этой директории </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/proxy/medusa-proxy</span></div>
<br><br><br><br><br><br>
<H2>Конфигурация и запуск</H2>
<p>Перейдём в директорию, которую мы создавали выше </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/proxy/medusa-proxy</span></div>
<br>
<p>Создадим фаил <b>docker-compose.yml</b> </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<br>
<p>И заполняем его <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Proxy/medusa-proxy/docker-compose.yml">таким таким содержанием</a></b>. Данный конфиг подойдёт сразу под amd64 и arm64 архитектуры. </p>
<br>
<p>Рассмотрим основные параметры: </p>
<p><ul>
<li><b><span style="color:#f39c12">8800:8800</span></b> - порт мониторинга http прокси. Не обязательный, можно закомментировать. Покажет порты на которых у нас поднялась http прокся. Если хотите поменять на другой порт то меняйте только левую часть, правая должна быть статичной, например так 11223:8800</li><br>
<li><b><span style="color:#f39c12">2090:2090</span></b> - Порт для веб интерфейса HAProxy. Также необязательный. В нём удобно <b><a target="_blank" rel="dofollow" href="https://img.zzxc.ru/img/post-33-medusa-proxy/haproxy-statistick.jpg">смотреть статистику</a></b> по всем проксям. Обратите внимание что для этого интерфейса задаётся логин и пароль, об этом ниже.</li><br>
<li><b><span style="color:#f39c12">8888:8888 ... 8891:8891</span></b> - Порты для подключения http прокси каждый новый подключается к свой <b>голове</b>(Head).</li><br>
<li><b><span style="color:#f39c12">1080:1080</span></b> - Порт для подключения socks5 прокси.</li><br>
<br><br>
<li><b><span style="color:#f39c12">HEADS=4</span></b> - Количество голов. По стандарту их 2, но мы запустим чуть больше. На каждой голове как принято у медуз, у нас будет по несколько инстансов тора, об этом ниже. </li><br>
<li><b><span style="color:#f39c12">TORS=4</span></b> - Количество инстансов на каждой голове.</li><br>
<li><b><span style="color:#f39c12">IP_CHANGE_SECONDS=180</span></b> - Название говорит само за себя. Как часто в секундах менять выходные ноды. </li><br>
<li><b><span style="color:#f39c12">HAPROXY_LOGIN=YOURUSER</span></b> - Логин для веб панели HAProxy.</li><br>
<li><b><span style="color:#f39c12">HAPROXY_PASSWORD=YOURPASSWORD</span></b> - Пароль для веб панели HAProxy.</li><br>
</ul> </p>
<br><br><br>
<p>С настройками разобрались. Стартуем контейнер: </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br>
<br><br><br><br><br><br>
<H2>Проверяем что всё ок</H2>
<p>После того как стартанули контейнер можем сразу посмотреть логи </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker logs medusa-proxy</span></div>
<br>
<p>У меня это выглядит вот так </p>
<a href="https://img.zzxc.ru/img/post-33-medusa-proxy/docker-logs-medusa.jpg" target="_blank"><img border="0" alt="docker logs medusa-proxy" src="https://img.zzxc.ru/img/post-33-medusa-proxy/docker-logs-medusa.jpg" /></a>
<br>
<p>Убедились что всё ок, можем подключиться к нашей проксе. Тут нужно понимать что мы будем подключаться к какой то из голов медузы. В моих настройках в <b>docker-compose.yml</b> стоит что контейнер будет запускаться в <b>4 головы</b> и по <b>4 инстанса тора</b> на каждую голову. </p>
<br><br><br><br><br><br>
<H2>Смотрим порты голов через веб интерфейс</H2>
<p>Вспоминаем что у нас есть специальный порт зайдя на которой нам покажут адреса для каждой из голов. То есть </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">http://<span style="color:#f39c12">Ваш.ip.адрес.сервера</span>:8800/</div>
<p>Выглядит это примерно так </p>
<img border="0" alt="medusa head ports for http" src="https://img.zzxc.ru/img/post-33-medusa-proxy/medusa-head-http-ports.jpg" />
<br>
<p>Только нам конечно же нужно ещё заменить <b>127.0.0.1</b> на ip адрес своего сервера. </p>
<br><br><br><br><br><br>
<H2>Подключение</H2>
<p>Так как порты для подключения нам известны, а именно: </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">http://<span style="color:#f39c12">Ваш.ip.адрес.сервера</span>:8888<br>
http://<span style="color:#f39c12">Ваш.ip.адрес.сервера</span>:8889<br>
http://<span style="color:#f39c12">Ваш.ip.адрес.сервера</span>:8890<br>
http://<span style="color:#f39c12">Ваш.ip.адрес.сервера</span>:8891</div>
<br>
<p>То для проверки работы нам необходимо просто подключиться к ним. Для этого я буду использовать плагин <b><a href="https://addons.mozilla.org/en-US/firefox/addon/foxyproxy-standard/" target="_blank" rel="nofollow">FoxyProxy standart для Firefox</a></b> с такими настройками </p>
<a href="https://img.zzxc.ru/img/post-33-medusa-proxy/medusa-foxyproxy.jpg" target="_blank"><img border="0" alt="medusa foxyproxy http" src="https://img.zzxc.ru/img/post-33-medusa-proxy/medusa-foxyproxy.jpg" /></a>
<br>
<p>После чего активируем данную прокси в плагине и проверяем результат например на whoer</p>
<a href="https://img.zzxc.ru/img/post-33-medusa-proxy/medusa-foxyproxy-2.jpg" target="_blank"><img border="0" alt="medusa foxyproxy whoer" src="https://img.zzxc.ru/img/post-33-medusa-proxy/medusa-foxyproxy-2.jpg" /></a>
<br>
<p>Как видно всё отработало отлично. Теперь нажмите сочитание клавишь "<b>CTRL</b>" "<b>F5</b>" - заметили? ip адрес поменялся, всё это потому что голова к которой мы подключены на порту <b>8888</b> в свою очередь подключена к 4 инстансам тора, а <b>HAProxy</b> в свою очередь каждый следующий запрос передаёт с помощью алгоритма <b>round-robin</b> на следуюший инстанс тора. </p>
<p>Получается что мы имеем одну строку <b>ip:port</b> за которой у нас 4 разных ip адреса. Ну и каждая такая строка это голова, которых у нас 4 штуки. Выходит что всего у нас сейчас 4*4 = 16 ip адресов тора. </p>
<p>И вроде бы на этом можно было закончить но все ещё есть 2 важных момента о которых хотелось бы поговорить... </p>
<br><br><br><br><br><br>
<H2>Безопасность</H2>
<p>Как может показаться на первый взгляд она тут есть, ведь мы же вводили логин и пароль для веб интерфейса <b>HAProxy</b>. Но это не то. Автор почему то не предусмотрел этот момент. Получается что в данный момент весь мир может использовать наш мост к сети тор) Разумеется такой вариант не подходит, поэтому нужно думать... </p>
<p>Этот вопрос можно решить с помощью фаервола. А у докера "особые отношения" с фаерволами, да и сами фаерволы бывают разные <b>iptables</b>, <b>nftables</b> и т.д. Тогда надо будет давать сразу кучу инструкций. Поэтому я придумал тут более универсальный вариант - а именно воспользоваться хостингом с <b>FWaas</b>(FireWall as a Service). То есть хостинг на котором дополнительный и отдельный фаервол, который можно редактировать через веб интерфейс. </p>
<p><b>FWaas</b> встречается довольно часто, например у amazon, oracle, linode, и многих других. Но я буду рассматривать на примере <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этого хостинга</a></b>. Если у вас какой то другой хостинг с FWaas - просто сделайте "по образу и подобию" моих настроек. </p>
<p><ul>
<li>Заходим в раздел <b><span style="color:#f39c12">Firewall</span></b> и добавляем новый.</li><br>
<li>Из двух режимов выбираем - <b><span style="color:#f39c12">разрешить трафик</span></b></li><br>
<li>В пункте <b><span style="color:#f39c12">Входящий трафик</span></b> добавляем правила</li><br>
<li>Все добавляемые правила будут <b><span style="color:#f39c12">для подсети</span></b></li><br>
<li>Если вы хотите открыть доступ только для своего ip адреса используйте маску<b><span style="color:#f39c12">/32</span></b> - Например правило для ip адреса google будет выгдядеть вот так <b><span style="color:#f39c12">8.8.8.8/32</span></b></li><br>
<li>Пожалуй я везде буду использовать <b><span style="color:#f39c12">ip адрес гугла</span></b>, а вы поменяйте на свой.</li><br>
</ul> </p>
<br>
<p>Итак, добавляем наше первое правило для SSH </p>
<a href="https://img.zzxc.ru/img/post-33-medusa-proxy/FWaas-1.jpg" target="_blank"><img border="0" alt="FWaas-1" src="https://img.zzxc.ru/img/post-33-medusa-proxy/FWaas-1.jpg" /></a>
<br><br><br>
<p>Теперь добавим правила для веб интерфейса <b>HAProxy</b> </p>
<img border="0" alt="FWaas 2" src="https://img.zzxc.ru/img/post-33-medusa-proxy/FWaas-2.jpg" />
<br><br><br>
<p>Правила для socks5 proxy </p>
<img border="0" alt="FWaas 3" src="https://img.zzxc.ru/img/post-33-medusa-proxy/FWaas-3.jpg" />
<br><br><br>
<p>И наконец правила для http proxy голов </p>
<img border="0" alt="FWaas 4" src="https://img.zzxc.ru/img/post-33-medusa-proxy/FWaas-4.jpg" />
<br><br><br>
<p>Что касается правила для порта 8800, то я советую его вообще не добавлять. И вдобавок его можно закомментировать в <b>docker-compose.yml</b> </p>
<p>Итак - все необходимые правила были добавлены. На счёт правил для <b>Исходящего трафика</b> не переживайте - это поле оставляем пустым и всё будет работать как надо. Далее выбираем сервер к которому хотим чтобы эти правила применялись, опционально выбираем имя для фаервола и нажимаем <b>Создать</b>. </p>
<p>В конечном итоге всё должно выглядеть вот так </p>
<a href="https://img.zzxc.ru/img/post-33-medusa-proxy/FWaas-5.jpg" target="_blank"><img border="0" alt="FWaas 5" src="https://img.zzxc.ru/img/post-33-medusa-proxy/FWaas-5.jpg" /></a>
<br>
<p>обязательно проверьте эти правила, например сначала проверьте что всё работает с вашим ip адресом, а потом в правилах <b>FWaas</b> вместо своего ip напишите чужой и проверьте снова - если у вас пропал доступ на чужом ip и восстановился на своём, то это говорит о том что всё прекрасно работает. </p>
<br><br><br><br><br><br>
<H2>Стабильность</H2>
<p>Как оказалось со стабильностью тоже иногда бывают траблы. Если запрос через инстанс TOR завершается неудачей, то в <b>HAProxy</b> эта голова пометиться как не рабочая, не смотря на то, что другие инстансы тора на этой голове в порядке. По прошествию какого то времени доступ к голове восстановиться. </p>
<p>Но иногда случается так что все 4 головы одновременно становятся недоступными из за таких коллизий. Тогда сразу все прокси отказывают. </p>
<p>Я придумал воркэраунд. Создадим в директории с docker-compose.yml скрипт <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Proxy/medusa-proxy/medusa-check.py">medusa-check.py</a></b>. </p>
<p>В основном скрипте используется отправка в Telegram, но вам он может не подойти, т.к. отправка в этом скрипте идёт в группу ботом, причем не просто в группу - а именно в топик группы. Поэтому если вам не нужен функционал отправки в группу, то воспользуйтесь <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Proxy/medusa-proxy/medusa-check-mini.py">скриптом без отправки в тг</a></b>. </p>
<p>Суть работы скрипта заключается в том что мы вписываем адреса для проверки(уже вписаны) и необходимые прокси для проверки. Если вы поднимали контейнер со значениями по умолчанию, то все прокси также вписаны в скрипт. Далее указав информацию, скрипт заходит под разными проксями на ссылки для проверки, и если эти ссылки не открывается то перезагружает контейнер. В случае первого скрипта ещё пишет в тг.</p>
<p>Остается только добавить это всё в крон </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo crontab -e</span></div>
<br>
<p>Я добавил такую запись - выполнять каждые 7 минут </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#4B0082"># check medusa is running</span><br>
*/7 * * * * <span style="color:#f39c12">cd /app/proxy/medusa-proxy</span> && <span style="color:#87a800">python3 medusa-check.py</span></div>
<br>
<p>Тут тоже обратите внимание что перед выполнением скрипт заходит в папку где лежит <b>docker-compose.yml</b>, если вы в процессе установки что то поменяли, то тут надо это тоже отразить. </p>
<p>Ну что ж теперь всё работает как надо, безопасно и стабильно... </p>
<br><br><br><br><br><br>
<H2>Доп инфо</H2>
<p><b><a target="_blank" rel="nofollow" href="https://github.com/datawookie/docker-tor-privoxy">github.com/datawookie/docker-tor-privoxy</a></b> </p>
<p><b><a target="_blank" rel="nofollow" href="https://datawookie.dev/blog/2021/10/medusa-multi-headed-tor-proxy/">medusa multi headed tor proxy</a></b> </p>
<br>
<p>Mission completed! </p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com0tag:blogger.com,1999:blog-244151671096808002.post-67562514991426252922023-03-10T10:33:00.022+03:002023-10-27T20:58:22.060+03:00Базовая установка Alpine Linux<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2023/03/alpine-linux-basic-installation.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="Базовая установка alpine linux" border="0" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/logo-32.jpg"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Этот дистрибутив долгое время попадал в поле моего внимания. Я попробовал его и не пожалел. Сегодня расскажу об установке базовой версии Alpine linux в качестве custom iso на vps/vds хостинге.
</div>
<a name='more'></a><br><br>
<H2>Необходимые требования</H2>
<p> Минимальные: 256 MB RAM </p>
<p> рекомендуется: 2048 MB RAM </p>
<br><br><br><br><br><br>
<h2>Пару слов об Alpine Linux </h2>
<p>Дистрибутива Alpine Linux обладает несколькими сильными преимуществами: </p>
<ul>
<li>Во первых он основан на <b><a target="_blank" rel="nofollow" href="https://ru.wikipedia.org/wiki/Musl">Musl</a></b> и <b><a target="_blank" rel="nofollow" href="https://ru.wikipedia.org/wiki/BusyBox">BusyBox</a></b>, что в свою очередь сильно повлияло на итоговый размер дистрибутива. </li>
<li>За счёт своего небольшого размера и подхода разработчиков дистрибутив славится более продвинутой безопасностью. Чем меньше bloated кода, тем меньше векторов для атаки. </li>
<li>В третьих, опять таки за счёт размера и других отличий таких как инит <b><a target="_blank" rel="nofollow" href="https://ru.wikipedia.org/wiki/OpenRC">OpenRC</a></b> вместо <b><a target="_blank" rel="nofollow" href="https://ru.wikipedia.org/wiki/Systemd">systemd</a></b> этот дистрибутив является более шустрым для более слабого железа. </li>
</ul>
<p>Учитывая все эти особенности, Alpine Linux прекрасно подходит для размещения на нём Docker контейнеров. </p>
<p>Минусы конечно тоже присутствуют. </p>
<ul>
<li>Например эта система не такая популярная и я пока нигде не встречал возможность установки этого дистрибутива нативно у хостеров, её придётся устанавливать <b>из своёго iso</b>, это не сложно и я опишу этот процесс ниже. </li>
<li>Также опять таки из за небольшой популярности по сравнению с другими дистрибутивами, придётся погуглить некоторые моменты, но когда это нас останавливало? </li>
</ul>
<br><br><br><br><br><br>
<h2>Подготовка</h2>
<h4>Работа с ISO образом</h4>
<p>Качаем ISO отсюда <b><a target="_blank" rel="nofollow" href="https://www.alpinelinux.org/downloads/">https://www.alpinelinux.org/downloads/</a></b></p>
<p>Я опишу процесс установки <b>Alpine</b> на хостинге <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host0.html">firstbyte</a></b>, если у вас другой хостинг действуйте по такому же принципу что и в посте, поидее должно сработать везде где есть возможно ставить со своего ISO. </p>
<p>Первым делом отправляемся панельку управления впс серверами. В раздел <b>ISO-образы</b> </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/iso-upload-1.jpg" target="_blank"><img border="0" alt="upload alpine iso 1" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/iso-upload-1.jpg" /></a>
<br><br>
<p>Добавляем наш новый Alpine Linux ISO </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/iso-upload-2.jpg" target="_blank"><img border="0" alt="upload alpine iso 2" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/iso-upload-2.jpg" /></a>
<p>Дожидаемся окончания загрузки. </p>
<br><br>
<p>В результате успешной загрузки образ отобразится в списке доступных образов </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/iso-upload-3.jpg" target="_blank"><img border="0" alt="upload alpine iso 3" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/iso-upload-3.jpg" /></a>
<br><br><br><br><br><br>
<h4>Работа с Дисками </h4>
<p>Отправляемся в главный раздел управления впс и <b>останавливаем</b> ту впску на которую хотим поставить Alpine. После этого снова выделяем её в списке и переходим в пункт <b>диски</b></p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/iso-upload-4.jpg" target="_blank"><img border="0" alt="upload alpine iso 4" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/iso-upload-4.jpg" /></a>
<br><br>
<p>Нас интересует раздел <b>ISO</b> нажимаем на него, после чего выбираем из списка загруженную ранее <b>alpine-standard-3.17.2-x86_64</b> (у вас скорее всего будет уже другое название). И делаем все как на картинке </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/iso-upload-5.jpg" target="_blank"><img border="0" alt="upload alpine iso 5" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/iso-upload-5.jpg" /></a>
<br><br>
<p>Соглашаемся, нажав "ok". В результате раздел будет иметь вид </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/iso-upload-6.jpg" target="_blank"><img border="0" alt="upload alpine iso 6" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/iso-upload-6.jpg" /></a>
<br><br>
<p>Отлично, всё готово для установки. </p>
<br><br><br><br><br><br>
<h2>Установка </h2>
<p>Для того чтобы начать установку сначала стартуем впс и после этого кликаем по иконке <b>VNC</b> </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/vps-settings-1.jpg" target="_blank"><img border="0" alt="vps settings 1" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/vps-settings-1.jpg" /></a>
<br><br><br>
<p>В открывшемся окне мы увидим уже знакомую многим картину. Первым делом нам необходимо авторизоваться, вводим имя пользователя <b>root</b> </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-1.jpg" target="_blank"><img border="0" alt="install alpine 1" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-1.jpg" /></a>
<br><br>
<p>После ввода пользователя <b>root</b>, пароль у нас никто не запрашивает и мы успешно авторизуемся под админской учёткой. Это сделано для облегчения процесса установки, разумеется позже мы сами зададим пароль для root.</p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-2.jpg" target="_blank"><img border="0" alt="install alpine 2" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-2.jpg" /></a>
<br><br>
<p>Чтобы приступить к установке вписываем команду </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">setup-alpine</span></div>
<br>
<p>Вся установка текстовая и сводится к тому что мы просто вдумчиво отвечаем на вопросы инсталлятора, приступаем... </p>
<br><br><br><br><br><br>
<h4>Раскладка клавиатуры </h4>
<p>Первое о чём нас спрашивают это раскладка клавиатуры. Я отвечаю <b>US</b> и далее опять уточняю <b>US</b>. Вписывайте свою или просто повторяйте за мной </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-3.jpg" target="_blank"><img border="0" alt="install alpine 3" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-3.jpg" /></a>
<br><br><br><br><br><br>
<h4>Hostname </h4>
<p>В качестве хостнейма вписываю <b>fb-node-02</b>. Впишите своё название или просто согласитесь с дефолтным localhost</p>
<br><br><br><br><br><br>
<h4>Настройка сети </h4>
<p>Далее у нас идёт настройка сети, если у вас все параметры получаются по <b>DHCP</b> то просто нажмите <b>ENTER</b>. В моём случае мне необходимо было вручную указать сетевые настройки. Зачастую их можно посмотреть в самой панельке в разделе ip-адрес. </p>
<p>Либо на каком нибудь уже установленном дистре линукса:<br>для ip адреса вписать <span style="color:#f39c12">hostname --ip-address</span><br>для gateway вписать <span style="color:#f39c12">sudo route -n</span><br>и взять значения оттуда. </p>
<p>Просто отвечаем по порядку, вписывая <b>ip адрес</b>, <b>маску подсети</b> и <b>gateway</b>. После того как впишем, нам вновь отобразят настройки и спросят хотим ли мы ещё что то поменять. Мне тут больше ничего не нужно отвечаю <b>n</b>. </p>
<p>Также у нас спросят дефолтный домен, если нет домена или пока не определились можно вписать <span style="color:#FF3152">example.com</span> </p>
<p>DNS сервера вписал такие <span style="color:#f39c12">1.1.1.1</span> <span style="color:#2980b9">8.8.8.8</span> </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-4b.jpg" target="_blank"><img border="0" alt="install alpine 4" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-4b.jpg" /></a>
<br><br><br><br><br><br>
<h4>Root user + TimeZone + Proxy </h4>
<p>Задаём пароль руту. А также устанавливаем часовой пояс. Те, кому это надо, вписывают настройки прокси, у меня сеть работает без прокси, поэтому тут я просто нажимаю <b>ENTER</b>. </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-5.jpg" target="_blank"><img border="0" alt="install alpine 5" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-5.jpg" /></a>
<br><br><br><br><br><br>
<h4>Выбор основного репозитория </h4>
<p>Теперь нам предлагают выбрать главный репозиторий. Чтобы пролистать сразу весь список нажимаем пробел и выбираем номер репозитория. Я выбираю пункт <b>F</b>: <b>Detect and add fastest mirror from above list</b>, название говорит само за себя. (Чтобы пролистнуть список репозиториев, вместо того чтобы постоянно нажимать <b>ENTER</b> - можно 1 раз нажать <b>Q</b>) </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-6.jpg" target="_blank"><img border="0" alt="install alpine 6" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-6.jpg" /></a>
<br><br><br><br><br><br>
<h4>Добавление нового пользователя </h4>
<p>Придумываем и вписываем имя пользователя. А также задаём ему пароль. </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-7.jpg" target="_blank"><img border="0" alt="install alpine 7" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-7.jpg" /></a>
<br><br><br><br><br><br>
<h4>Выбор ssh сервера </h4>
<p>Можем выбрать <b>openssh</b> или <b>dropbear</b> в зависимости от вашей конфигурации. Рекомендовано выбирать <b>openssh</b>. </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-8.jpg" target="_blank"><img border="0" alt="install alpine 8" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-8.jpg" /></a>
<br><br><br><br><br><br>
<h4>Разметка диска </h4>
<p>Нам предлагают на выбор несколько вариантов разметки диска. <b>Sys</b>, <b>Data</b>, <b>Crypt</b> или <b>lvm</b>. Для того чтобы узнать больше можно выбрать пункт <b>?</b>. На этом шаге я выбираю самый распространённый вариант разметки <b>Sys</b>. </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-9.jpg" target="_blank"><img border="0" alt="install alpine 9" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-9.jpg" /></a>
<br><br>
<p>Этот шаг является финальным. После успешной разметки диска и копирования фаилов видим что нам предлагают ребутнуться, но мы поступаем немного иначе, вписываем команду </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">poweroff</span></div>
<br><br>
<p>Переходим обратно в панель управления впс и в меню диски - отключаем наш подключенный ранее iso. И теперь уже можем загружаться в свежеустановленную систему. Для этого просто стартуем впс. </p>
<p>Т.к. установка завершена, то можем уже подключатся через привычный нам ssh клиент, вкладка с <b>VNC</b> уже не нужна. </p>
<br><br><br><br><br><br>
<h2>Первоначальная настройка </h2>
<h4>Добавляем community репозиторий </h4>
<p>Мы попали в нашу новую систему. Рекомендуется обновить инфу о репозиториях и сами пакеты в системе. Но перед этим сначала раскомментируем <b>community репозиторий</b>, чтобы увеличить количество пакетов. </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">vi /etc/apk/repositories</span></div>
<br><br>
<p>И раскомментируем репозиторий <b>community</b> </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-10.jpg" target="_blank"><img border="0" alt="install alpine 10" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-10.jpg" /></a>
<br><br><br><br><br><br>
<h4>Добавляем testing репозиторий </h4>
<p>В некоторых случаях пакеты находятся в репозитории <b>testing</b>. Для того чтобы его добавить нужно выполнить пару простых шагов: </p>
<p>Шаг 1: добавляем его в наш лист репозиториев </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories</span></div>
<br><br>
<p>Шаг 2: Теперь для того чтобы поставить какой то пакет из репозитория <b>testing</b> необходимо явно его упомянуть вот так </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">apk add <span style="color:#ffdd31">package-name</span>@testing</span></div>
<p>Например вот так </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">apk add <span style="color:#ffdd31">icewm</span>@testing</span></div>
<br><br><br><br><br><br>
<h4>Работа с менеджером пакетов </h4>
<p>Для того чтобы обновить информацию о репозиториях выполняем команду </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">apk update </span></div>
<br>
<p>Для того чтобы обновить пакеты в системе выполняем </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">apk upgrade </span></div>
<br><br>
<p>Я советую сразу поставить такой набор </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">apk add nano htop speedtest-cli bmon nload pwgen ncdu curl wget mc coreutils bash-completion </span></div>
<br><br>
<p>Для того чтобы удалить какой то пакет пишем </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">apk del <span style="color:#f39c12">пакет</span> </span></div>
<br><br>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-11.jpg" target="_blank"><img border="0" alt="install alpine 11" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-11.jpg" /></a>
<br><br><br><br><br><br>
<h4>Опционально: добавляем QEMU Agent </h4>
<p>Для правильного отображения ресурсов впс, некоторые пользователи захотят поставить себе <b>QEMU Agent</b>, для этого сначала устанавливаем его </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">apk add qemu-guest-agent </span></div>
<br><br>
<p>Добавляем службу в автозагрузку </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">rc-update add qemu-guest-agent boot </span></div>
<br><br>
<p>Можем сразу запустить службу </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">service qemu-guest-agent start </span></div>
<br><br><br><br><br><br>
<h4>Опционально: Добавляем sudo </h4>
<p>Устанавливаем sudo </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">apk add sudo</span> </div>
<br><br>
<p>Делаем конфиг для группы wheel </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano /etc/sudoers.d/wheel</span> </div>
<br><br>
<p>Заполняем таким содержанием если хотим выполнять sudo без ввода пароля </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">%wheel ALL=(ALL:ALL) NOPASSWD: ALL </div>
<p>Либо таким если хотим каждый раз вписывать пароль для sudo </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">%wheel ALL=(ALL) ALL </div>
<br><br>
<p>Добавляем желаемого пользователя в группу wheel </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">adduser <span style="color:#f39c12">worker</span> wheel</span> </div>
<br><br><br><br><br><br>
<h4>Опционально: Добавляем doas </h4>
<p>Устанавливаем doas </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">apk add doas</span> </div>
<br><br>
<p>Редактируем конфиг для группы wheel </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano /etc/doas.d/doas.conf</span> </div>
<br><br>
<p>Заполняем таким содержанием если хотим выполнять doas без ввода пароля </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">permit nopass :wheel </div>
<p>Либо таким если хотим каждый раз вписывать пароль для doas </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">permit persist :wheel </div>
<br><br>
<p>Добавляем желаемого пользователя в группу wheel </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">adduser <span style="color:#f39c12">worker</span> wheel</span> </div>
<br><br><br><br><br><br>
<h4>Опционально: Установка Docker </h4>
<p>Наконец то мы подошли к самому интересному, установке докера. В дистрибутиве Alpine Linux это делается очень просто, ставим пакеты </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo apk add docker docker-compose</span> </div>
<br><br>
<p>Разрешаем запуск службы Docker при старте системы </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo rc-update add docker boot</span> </div>
<br><br>
<p>Опционально: Стартуем службу Docker </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo service docker start</span> </div>
<br><br>
<p>Добавляем нашего пользователя в группу Docker </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo adduser <span style="color:#f39c12">worker</span> docker</span> </div>
<br><br>
<p>После этого рекомендуется перезагрузить систему. </p>
<br><br><br><br><br><br>
<h2>Заключение </h2>
<p>На редкость миниатюрный и шустрый дистрибутив. Шикарно подходит в качестве основы под docker контейнеризацию. Просто взгляните на это смешное использования ресурсов с запущенным докером. </p>
<a href="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-12.jpg" target="_blank"><img border="0" alt="install alpine 12" src="https://img.zzxc.ru/img/post-32-alpine-linux-install/install-alpine-12.jpg" /></a>
<br><br>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com0tag:blogger.com,1999:blog-244151671096808002.post-56015677461703328692022-10-23T18:50:00.085+03:002023-01-24T16:24:56.992+03:00Почтовый сервер на основе Mailcow в Docker контейнере<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2022/10/mailcow-docker.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="docker-compose + mailcow" border="0" src="https://img.zzxc.ru/img/post-31-mailcow/logo-31-mailcow.jpg"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Рассмотрим ещё один современный и хорошо зарекомендовавший себя почтовый сервер Mailcow. Он позволит забыть о томительной настройке всех отдельных сервисов, необходимых для поднятия почтового сервера. Ведь с помощью Mailcow мы выполним большую часть конфигурации в удобном веб интерфейсе. А поднимать всё это добро будем в удобном Docker контейнере.
</div>
<a name='more'></a><br><br>
<H2>Необходимые требования</H2>
<p>Чтобы всё получилось нам понадобится:</p>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>На хостинге должна быть предусмотрена возможность менять <b>PTR запись</b> для своего домена</li>
<li>Доменное имя. Можно бесплатный домен или поддомен</li>
<li>Установленный <b><a href="/p/virtualization-docker-full-install.html" target="_blank" >Docker + Docker-Compose</a></b></li>
<li>30 - 60 минут времени</li>
</ul>
<br><br><br><br><br><br>
<H2>В двух словах про Mailcow </H2>
<p>Mailcow обладает каким то невообразимым количеством настроек, в которых с непривычки можно легко заблудиться. В качестве основных настроек тут есть: добавление и администрирование почтовых доменов, создание и редактирование почтовых ящиков, управление ключами DKIM и другими. </p>
<p>Дополнительно присутствуют такие вещи как: управление через API, настройка входа 2fa, конфигурация мини-фаервола fail2ban, управление квотами / очередями и каратнином. Конфигурация и статистика Rspamd. Роутинг. Настройки для системных оповещений. Логи всех выполняемых сервисов. Алиасы и Catch-All фильтры. Система напоминающая создание cron заданий. Фильтры. Перезапись адресов. Политики TLS. </p>
<p>Одним словом настроек очень много и все их влепить в 1 мануал явно не получится. Однако базовую настройку с нуля до инбокса в Gmail, мы все таки сделаем, с небольшими бонусами по типу настройки Catch-All фильтра. </p>
<p>Стоит так же обязательно напомнить что Mailcow является OpenSource проектом, в том виде в котором его принято видеть, без каких либо скрытых возможностей, которые приобретаются за деньги. Всё прозрачно и бесплатно, для всех! </p>
<br><br><br><br><br><br>
<H2>Особенности почтового сервера </H2>
<p>Установка почтового сервера предусматривает что Вы будете добавлять PTR запись, что в свою очередь приведёт к деанону ip адреса сервера из за специфики работы почтовых протоколов. Настоятельно рекомендуется ставить почтовый сервер на отдельной впске или сервере. </p>
<br><br><br><br><br><br>
<H2>Основы электронной почты </H2>
<p><b>MTA</b> (Mail Transfer Agent) - агент пересылки почты. </p>
<p><b>MDA</b> (Mail Delivery Agent) - агент доставки почты. </p>
<p><b>MUA</b> (Mail User Agent) - почтовый клиент. </p>
<br>
<p><b>SMTP</b> (Simple Mail Transfer Protocol) - основной протокол обмена эл.почты. Стандартный порт 25 </p>
<p><b>POP3</b> - протокол для приёма сообщений электронной почты. </p>
<p><b>IMAP</b> - протокол для приёма сообщений электронной почты. </p>
<br><br><br><br><br><br>
<H2>Предварительная настройка (PTR, DNS, ETC) </H2>
<p>Первым делом нам понадобиться поменять <b>PTR запись</b> для домена, на котором мы планируем держать Mailcow. Это делается в интерфейсе вашего хостинга. В каждом хостинге это делается по разному, покажу как это сделано у меня. </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/ptr-1.jpg" target="_blank"><img alt="mailcow PTR 1" src="https://img.zzxc.ru/img/post-31-mailcow/ptr-1.jpg" border="0"></a>
<br><br>
<p>В настройках сервера вписываем желаемый домен, для которого будет установлена <b>PTR запись</b>. </p>
<br><br>
<blockquote><b>PTR запись</b> может обновляться долгое время, зависит от хостинга и DNS. Проверить что она установилась корректно можно несколькими способами </blockquote>
<br><br>
<h4>Первый способ <b>nslookup</b> </h4>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nslookup -type=PTR <span style="color:#f39c12">ip-адрес-вашего-сервера</span></span></div>
<a href="https://img.zzxc.ru/img/post-31-mailcow/ptr-nslookup.jpg" target="_blank"><img alt="ptr-nslookup 1" src="https://img.zzxc.ru/img/post-31-mailcow/ptr-nslookup.jpg" border="0"></a>
<br><br><br><br>
<h4>Второй способ <b>dig</b> </h4>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">dig -x <span style="color:#f39c12">ip-адрес-вашего-сервера</span></span></div>
<a href="https://img.zzxc.ru/img/post-31-mailcow/ptr-dig.jpg" target="_blank"><img alt="ptr-dig 1" src="https://img.zzxc.ru/img/post-31-mailcow/ptr-dig.jpg" border="0"></a>
<br><br><br><br>
<p>Также обязательно стоит внести необходимые изменения в DNS зону вашего домена, если это ещё не сделано. </p>
<p>Я все свои домены леплю на cloudflare, поэтому на его примере и буду показывать </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/dns-1.jpg" target="_blank"><img alt="dns 1" src="https://img.zzxc.ru/img/post-31-mailcow/dns-1.jpg" border="0"></a>
<br><br><br><br>
<p>Желательно установить <b>hostname</b> для Вашего сервера. Впишите свой домен </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo hostnamectl set-hostname <span style="color:#f39c12">mail.mymailcow.cf</span></span></div>
<a href="https://img.zzxc.ru/img/post-31-mailcow/hostname-2.jpg" target="_blank"><img alt="hostname 2" src="https://img.zzxc.ru/img/post-31-mailcow/hostname-2.jpg" border="0"></a>
<br><br>
<p>Дополнительно добавим наш домен в /etc/hostname </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo nano /etc/hostname</span></div>
<a href="https://img.zzxc.ru/img/post-31-mailcow/hostname-3.jpg" target="_blank"><img alt="hostname 3" src="https://img.zzxc.ru/img/post-31-mailcow/hostname-3.jpg" border="0"></a>
<br><br><br><br>
<p>Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём необходимые директории для mailcow </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/mail </span></div>
<br><br>
<p>Переходим в созданную директорию </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/mail </span></div>
<br><br>
<p>Сделаем нашего пользователя (не root !) владельцем этой директории </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/mail </span></div>
<br><br>
<p>Загружаем последнюю версию Mailcow с github </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">git clone https://github.com/mailcow/mailcow-dockerized </span></div>
<br><br>
<p>На этом предварительная настройка завершена </p>
<br><br><br><br><br><br>
<H2>Установка Mailcow </H2>
<p>Переходим в созданную на предыдущем шаге директорию </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/mail/mailcow-dockerized</span></div>
<br><br>
<p>Теперь необходимо сгенерировать конфигурацию под свой домен. Для этого выполняем команду </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">./generate_config.sh</span></div>
<br>
<p>После чего последовательно отвечаем на поступающие вопросы:<br>Указываем FQDN(домен) я указал <b>mail.mymailcow.cf</b><br>Выбираем таймзону<br>По желанию можно отключить <b>ClamAV</b><br>И выбираем ветвь обновлений, я выбрал <b>master</b> </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/generate_config-1.jpg" target="_blank"><img alt="generate_config 1" src="https://img.zzxc.ru/img/post-31-mailcow/generate_config-1.jpg" border="0"></a>
<br><br>
<p>Если мы хотим вручную посмотреть или отредактировать конфигурационные фаил </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano mailcow.conf</span></div>
<br>
<blockquote>Например на сервере с достаточным количеством оперативной памяти вопрос про отключение антивируса ClamAV могут и не задать, поэтому мы можем вручную ограничить это в этом фаиле, изменив строку на SKIP_CLAMD=y </blockquote>
<br><br>
<p>Наконец запускаем всю эту красоту </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br>
<blockquote>Мне посчастливилось наткнуться на мини-баг, в результате которого в конфиг не была занесена информация на каком ip запускаться контейнеру nginx.<br>После того как я вручную внёс HTTP_BIND=0.0.0.0 и HTTPS_BIND=0.0.0.0 в фаил <b>mailcow.conf</b> всё успешно завелось. </blockquote>
<a href="https://img.zzxc.ru/img/post-31-mailcow/fix-bind-address-1.jpg" target="_blank"><img alt="fix-bind-address 1" src="https://img.zzxc.ru/img/post-31-mailcow/fix-bind-address-1.jpg" border="0"></a>
<br><br>
<a href="https://img.zzxc.ru/img/post-31-mailcow/successful-start.jpg" target="_blank"><img alt="successful-start 1" src="https://img.zzxc.ru/img/post-31-mailcow/successful-start.jpg" border="0"></a>
<br><br>
<p>После того как контейнеры поднялись можем сразу идти на наш домен, который мы указали на этапе генерации конфига, у меня это mail.mymailcow.cf </p>
<p>Но дело в том что по стандарту там будет работать протокол http, который небезопасен. Исправим это </p>
<br><br>
<H4>Настроим автоматический редирект HTTP на HTTPS </H4>
<p>Как следует из официальной <b><a target="_blank" rel="nofollow" href="https://docs.mailcow.email/manual-guides/u_e-80_to_443/">документации</a></b>, находясь в главной папке <b>mailcow</b> создадим новый фаил </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano data/conf/nginx/redirect.conf</span></div>
<br>
<p>С таким содержанием </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">server {<br>
root /web;<br>
listen 80 default_server;<br>
listen [::]:80 default_server;<br>
include /etc/nginx/conf.d/server_name.active;<br>
if ( $request_uri ~* "%0A|%0D" ) { return 403; }<br>
location ^~ /.well-known/acme-challenge/ {<br>
allow all;<br>
default_type "text/plain";<br>
}<br>
location / {<br>
return 301 https://$host$uri$is_args$args;<br>
}<br>
}</div>
<br><br>
<p>После этого изменения необходимо перезапустить контейнеры </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br>
<p>Теперь вводя наш домен мы будем автоматически переадресованы на https протокол. Сертификат генерируется самоподписной поэтому в некоторых браузерах понадобиться подтвердить риск его использования, тут нет ничего такого, это наш сертификат и мы ему доверяем. Наконец мы увидим страницу авторизации </p>
<br>
<a href="https://img.zzxc.ru/img/post-31-mailcow/mailcow-login-page-1.jpg" target="_blank"><img alt="mailcow-login-page 1" src="https://img.zzxc.ru/img/post-31-mailcow/mailcow-login-page-1.jpg" border="0"></a>
<br>
<p>Вводим стандартные данные для авторизации<br>Login: <b>admin</b> <br>Password: <b>moohoo</b> </p>
<p>Для того чтобы мануал получился более универсальным я выберу язык <b>EN</b> </p>
<br><br>
<p>Залогинившись сразу меняем пароль для администратора. Нажимаем кнопку <b>Edit</b> </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/change-password.jpg" target="_blank"><img alt="change-password 1" src="https://img.zzxc.ru/img/post-31-mailcow/change-password.jpg" border="0"></a>
<br><br><br><br>
<p>Теперь, пожалуй, посмотрим состояние сервера. В верхней навигационной панельке выбираем пункт <b>Configuration</b> > <b>System Information</b> </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/system-information-1.jpg" target="_blank"><img alt="system-information 1" src="https://img.zzxc.ru/img/post-31-mailcow/system-information-1.jpg" border="0"></a>
<br>
<p>В этом разделе мы можем посмотреть свободное место на диске, логи, состояние всех контейнеров. Также предусмотрена возможность перезагрузки контейнера, если нажать на кнопку <b>Restart</b>. </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/system-information-2.jpg" target="_blank"><img alt="system-information 2" src="https://img.zzxc.ru/img/post-31-mailcow/system-information-2.jpg" border="0"></a>
<br><br><br><br><br><br>
<H2>Настройка Mailcow </H2>
<p>Пришло время настроить Mailcow, отправляемся в раздел <b>Configuration</b> > <b>Mail Setup</b>. </p>
<br><br>
<H4>Добавление домена</H4>
<p>Для того чтобы работать с почтой мы должны сначала добавить домен. Самих доменов может быть несколько, но мы пока добавим 1. Желательно чтобы это был покупной домен, хотя для тестов можно воспользоваться бесплатным фриномовским доменом. В моём случае домен будет <b>mymailcow.cf</b> </p>
<p>Для того чтобы добавить домен нажимаем кнопку <b>+ Add domain</b> </p>
<p>Заполняем поля </p>
<ul>
<li><b>Domain</b>: желаемый домен</li>
<li><b>Description</b>: описане (по желанию)</li>
<li><b>Tags</b>: теги (по желанию)</li>
<li><b>Алиасы и квоты</b>: можно оставить по умолчанию</li>
<li><b>Max. possible mailboxes</b>: максимальное количество почтовых ящиков</li>
<li><b>DKIM key length (bits)</b>: желательно выбрать 1024 (т.к. не все днс умеют работать с 2048)</li>
</ul>
<br><br>
<p>Наконец нажимаем <b>Add domain and restart SOGo</b> </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/add-domain-1.jpg" target="_blank"><img alt="add-domain 1" src="https://img.zzxc.ru/img/post-31-mailcow/add-domain-1.jpg" border="0"></a>
<br><br>
<p>Спустя какое то время увидим как добавился наш домен </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/add-domain-2.jpg" target="_blank"><img alt="add-domain 2" src="https://img.zzxc.ru/img/post-31-mailcow/add-domain-2.jpg" border="0"></a>
<br><br>
<p>Посмотрим конфигурацию DNS добавленного домена. Для этого в разделе <b>Action</b> нажимаем кнопку <b>DNS</b> </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/add-domain-3.jpg" target="_blank"><img alt="add-domain 3" src="https://img.zzxc.ru/img/post-31-mailcow/add-domain-3.jpg" border="0"></a>
<br><br><br><br><br><br>
<H2>Добавление дополнительных DNS записей для домена</H2>
<p>Теперь нужно добавить все необходимые записи DNS. Как я уже неоднократно писал, свои домены я леплю на <b>cloudflare</b> именно поэтому я и буду показывать на его примере. Если у Вас не cloudflare ищите как добавить все записи конкретно для Вашего случая. </p>
<p>Я буду показывать сразу на конкретном примере для домена <span style="color:#f39c12">mail.<span style="color:#87a800">mymailcow.cf</span></span> Вы же замените на свои данные. Итак, начнём по порядку: </p>
<br><br>
<H4>MX запись </H4>
<p><b>MX</b> (Mail Exchanger) - тип DNS записи. Определяет HOST, на который будут отправлены сообщения. </p>
<ul>
<li><span style="color:#FF3152">Type</span>: <span style="color:#f39c12">MX</span></li>
<li><span style="color:#FF3152">Name</span>: <span style="color:#f39c12">@</span></li>
<li><span style="color:#FF3152">Mail server</span>: <span style="color:#f39c12">mail.<span style="color:#87a800">mymailcow.cf</span></span></li>
<li><span style="color:#FF3152">TTL</span>: <span style="color:#f39c12">Auto</span></li>
<li><span style="color:#FF3152">Priority</span>: <span style="color:#f39c12">10</span></li>
</ul>
<br><br><br><br>
<H4>CNAME запись </H4>
<p><b>CNAME</b> это тип записи DNS, которая привязывает псевдоним к действительному (каноническому) доменному имени. Записи CNAME обычно используются для привязки субдомена, такого как www или mail к домену, в котором размещен контент этого субдомена.</p>
<ul>
<li><span style="color:#FF3152">Type</span>: <span style="color:#f39c12">CNAME</span></li>
<li><span style="color:#FF3152">Name</span>: <span style="color:#f39c12">autodiscover.<span style="color:#87a800">mymailcow.cf</span></span></li>
<li><span style="color:#FF3152">Target</span>: <span style="color:#f39c12">mail.<span style="color:#87a800">mymailcow.cf</span></span></li>
</ul>
<br>
<p>И ещё одну запись </p>
<ul>
<li><span style="color:#FF3152">Type</span>: <span style="color:#f39c12">CNAME</span></li>
<li><span style="color:#FF3152">Name</span>: <span style="color:#f39c12">autoconfig.<span style="color:#87a800">mymailcow.cf</span></span></li>
<li><span style="color:#FF3152">Target</span>: <span style="color:#f39c12">mail.<span style="color:#87a800">mymailcow.cf</span></span></li>
</ul>
<br><br><br><br>
<h4>SPF запись</h4>
<p><b>SPF</b> (Sender Policy Framework) - текстовая запись в TXT-записи DNS домена. Позволяет указать кто имеет право отправлять письма от имени домена. </p>
<ul>
<li><span style="color:#FF3152">Type</span>: <span style="color:#f39c12">TXT</span></li>
<li><span style="color:#FF3152">Name</span>: <span style="color:#f39c12">@</span></li>
<li><span style="color:#FF3152">TTL</span>: <span style="color:#f39c12">Auto</span></li>
<li><span style="color:#FF3152">Content</span>: <span style="color:#f39c12">v=spf1 ip4:<span style="color:#87a800">185.104.114.103</span> include:mail.<span style="color:#87a800">mymailcow.cf</span> ~all</span></li>
</ul>
<p>Замените ipv4 адрес и домен на свои. Либо можно воспользоваться мастером добавления SPF записи в <b>cloudflare</b>, для этого в настройках DNS надо нажать <b>Use wizard to add an SPF record</b> и ввести свои данные. Подробнее про разновидность написания <b>SPF записи</b> можно посмотреть <b><a target="_blank" rel="nofollow" href="http://www.open-spf.org/SPF_Record_Syntax/">тут</a></b>. </p>
<br><br><br><br>
<h4>DMARC запись</h4>
<p><b>DMARC</b> (Domain-based Message Authentication, Reportingand Conformance) - набор правил для писем от вашего имени, которые не прошли аутентификацию по SPF и DKIM. </p>
<p>Для того чтобы сгенерировать правильную DMARC запись воспользуемся специальным <b><a target="_blank" rel="nofollow" href="https://www.kitterman.com/dmarc/assistant.html">сервисом</a></b>. </p>
<p>Вводим домен в соответствующее поле. Далее указываем что мы хотим делать с письмами не прошедшими проверку SPF. Я выбирал <b>quarantine</b> в обоих полях <b>Requested policy type</b> и <b>Subdomain Policy:
Defaults to same as domain</b>. После чего нажимаем <b>Get DMARC Record</b> и получившуюся запись добавляем в DNS в качестве TXT записи. </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/add-domain-4.jpg" target="_blank"><img alt="add-domain 4" src="https://img.zzxc.ru/img/post-31-mailcow/add-domain-4.jpg" border="0"></a>
<br><br>
<ul>
<li><span style="color:#FF3152">Type</span>: <span style="color:#f39c12">TXT</span></li>
<li><span style="color:#FF3152">Name</span>: <span style="color:#f39c12">_dmarc.<span style="color:#87a800">mymailcow.cf</span></span></li>
<li><span style="color:#FF3152">TTL</span>: <span style="color:#f39c12">Auto</span></li>
<li><span style="color:#FF3152">Priority</span>: <span style="color:#f39c12">v=DMARC1; p=quarantine; sp=quarantine</span></li>
</ul>
<br><br><br><br>
<h4>DKIM запись</h4>
<p><b>DKIM</b> (DomainKeys Identified Mail) - метод E-mail аутентификации. Предназначен для антифишинга и антиспама. Уберегает содержимое сообщения при передаче между почтовыми серверами. </p>
<p>Сам ключ указан в свойствах DNS для домена в Mailcow. В более старых версиях необходимо было вручную создать этот ключ зайдя на главную страницу <b>Configuration & Details</b> и выбрав там <b>Configuration</b> > <b>ARC/DKIM keys</b>. В этом же разделе мы можем перегенерировать, экспортировать и импортировать ключи. </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/add-domain-5.jpg" target="_blank"><img alt="add-domain 5" src="https://img.zzxc.ru/img/post-31-mailcow/add-domain-5.jpg" border="0"></a>
<br><br>
<ul>
<li><span style="color:#FF3152">Type</span>: <span style="color:#f39c12">TXT</span></li>
<li><span style="color:#FF3152">Name</span>: <span style="color:#f39c12">dkim._domainkey</span></li>
<li><span style="color:#FF3152">TTL</span>: <span style="color:#f39c12">Auto</span></li>
<li><span style="color:#FF3152">Priority</span>: <span style="color:#f39c12">v=DKIM1; k=rsa; p=...</span></li>
</ul>
<br><br><br><br>
<h4>TLSA запись</h4>
<p><b>TLSA</b> является необязательной записью. Она используется для связывания сертификата сервера TLS или открытого ключа с доменным именем, в котором находится запись. С записью TLSA вы можете хранить отпечаток сертификата TLS/SSL в DNS вашего домена. </p>
<ul>
<li><span style="color:#FF3152">Type</span>: <span style="color:#f39c12">TLSA</span></li>
<li><span style="color:#FF3152">Name</span>: <span style="color:#f39c12">_25._tcp.mail</span></li>
<li><span style="color:#FF3152">TTL</span>: <span style="color:#f39c12">Auto</span></li>
<li><span style="color:#FF3152">Usage</span>: <span style="color:#f39c12">1 число из настроек днс TLSA mailcow</span></li>
<li><span style="color:#FF3152">Selector</span>: <span style="color:#f39c12">2 число из настроек днс TLSA mailcow</span></li>
<li><span style="color:#FF3152">Matching type</span>: <span style="color:#f39c12">3 число из настроек днс TLSA mailcow</span></li>
<li><span style="color:#FF3152">Certificate (hexadecimal)</span>: <span style="color:#f39c12">4 число из настроек днс TLSA mailcow</span></li>
</ul>
<p>Числа указаны в свойствах домена в mailcow </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/add-domain-6.jpg" target="_blank"><img alt="add-domain 6" src="https://img.zzxc.ru/img/post-31-mailcow/add-domain-6.jpg" border="0"></a>
<br>
<p>А вот так необходимо внести в cloudflare </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/add-domain-7.jpg" target="_blank"><img alt="add-domain 7" src="https://img.zzxc.ru/img/post-31-mailcow/add-domain-7.jpg" border="0"></a>
<br><br><br><br>
<p>В конечном итоге при проверке DNS записей вашего домена в mailcow у Вас должно получиться вот так </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/add-domain-8.jpg" target="_blank"><img alt="add-domain 8" src="https://img.zzxc.ru/img/post-31-mailcow/add-domain-8.jpg" border="0"></a>
<p>Я не стал заполнять SRV запись потому что она является не обязательной </p>
<br><br>
<p>А вот так это выглядит в <b>cloudflare</b> </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/add-domain-9.jpg" target="_blank"><img alt="add-domain 9" src="https://img.zzxc.ru/img/post-31-mailcow/add-domain-9.jpg" border="0"></a>
<br><br>
<p>На этом настройка DNS завершена. </p>
<br><br><br><br><br><br>
<H2>Создание почтовых ящиков</H2>
<p>Переходим в раздел <b>Configuration</b> > <b>Mail Setup</b> > <b>Mailboxes</b> и нажимаем кнопку <b>+ Add mailbox</b> </p>
<p>И заполняем поля своими данными </p>
<ul>
<li><b>Username</b>: имя пользователя (то что идёт перед символом @)</li>
<li><b>Domain</b>: домен </li>
<li><b>Full name</b>: полное имя (по желанию)</li>
<li><b>Quota</b>: квота места на диске, занимаемое почтовым ящиком (0 = безлимит)</li>
<li><b>Password</b>: пароль, минимально 6 символов, я советую от 20</li>
<li><b>статус</b>: active</li>
</ul>
<br>
<a href="https://img.zzxc.ru/img/post-31-mailcow/add-mailbox-1.jpg" target="_blank"><img alt="add-mailbox 1" src="https://img.zzxc.ru/img/post-31-mailcow/add-mailbox-1.jpg" border="0"></a>
<br><br>
<p>И нажимаем кнопку <b>Add</b>. </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/add-mailbox-2.jpg" target="_blank"><img alt="add-mailbox 2" src="https://img.zzxc.ru/img/post-31-mailcow/add-mailbox-2.jpg" border="0"></a>
<br><br>
<p>Наш почтовый ящик успешно добавлен. Можно добавить сколько угодно почтовых ящиков. Если Вы превысили лимит например 10 / 10 - зайдите в свойства домена и увеличьте на необходимое значение. 10 это дефолтное значение для всех новых доменов. </p>
<p>После добавления каждого почтового ящика необходимо нажать кнопку в верхнем навигационном меню <b>Restart SOGo</b>. </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/add-mailbox-3.jpg" target="_blank"><img alt="add-mailbox 3" src="https://img.zzxc.ru/img/post-31-mailcow/add-mailbox-3.jpg" border="0"></a>
<br><br><br><br><br><br>
<H2>Проверяем работу</H2>
<p>Для того чтобы проверить работу воспользуемся встроенным почтовым веб клиентом SoGo. </p>
<p>Для этого в верхней навигационной панели нажимаем <b>Apps</b> > <b>Webmail</b>. Далее вводим логин и пароль от только что созданного почтового ящика. </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/sogo-login-1.jpg" target="_blank"><img alt="sogo-login 1" src="https://img.zzxc.ru/img/post-31-mailcow/sogo-login-1.jpg" border="0"></a>
<br><br>
<p>И мы попадаем в web интерфейс </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/sogo-login-2.jpg" target="_blank"><img alt="sogo-login 2" src="https://img.zzxc.ru/img/post-31-mailcow/sogo-login-2.jpg" border="0"></a>
<br><br><br><br>
<p>Чтобы убедиться что мы настроили всё правильно, воспользуемся специальным сервисом <b><a target="_blank" rel="nofollow" href="https://www.mail-tester.com/">mail-tester.com</a></b>. Этот сайт позволит нам делать 3 проверки в день так что используйте эти попытки экономно. </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/mail-check-1.jpg" target="_blank"><img alt="mail-check 1" src="https://img.zzxc.ru/img/post-31-mailcow/mail-check-1.jpg" border="0"></a>
<br><br>
<p>Попав на сайт нам сразу же будет предоставлена временная почта, на которую мы должны отправить тестовое письмо. Копируем эту почту и переходим обратно в <b>SoGo</b>. </p>
<p>Создаём новое сообщение и вставляем адрес почты, полученный с меилтестера. И нажимаем отправить. </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/mail-check-2.jpg" target="_blank"><img alt="mail-check 2" src="https://img.zzxc.ru/img/post-31-mailcow/mail-check-2.jpg" border="0"></a>
<br><br><br><br>
<p>Переходим обратно в Mail-Tester и смотрим результат. Как видим мы получили максимально возможное количество баллов </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/mail-check-3.jpg" target="_blank"><img alt="mail-check 3" src="https://img.zzxc.ru/img/post-31-mailcow/mail-check-3.jpg" border="0"></a>
<br><br><br><br>
<p>Ну и напоследок проверяем инбокс в Gmail </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/mail-check-4.jpg" target="_blank"><img alt="mail-check 4" src="https://img.zzxc.ru/img/post-31-mailcow/mail-check-4.jpg" border="0"></a>
<br><br>
<p>Кстати, если планируете отсылать письма по gmail'ам не лишним будет добавить свой домен на специальную страницу <b><a target="_blank" rel="nofollow" href="https://postmaster.google.com/">https://postmaster.google.com</a></b> </p>
<br><br><br><br><br><br>
<H2 id="catch-all">Добавляем Catch-All filter</H2>
<p>Создадим ещё один ящик. Для примера я назову его catchall@mymailcow.cf На этот ящик будет перенаправляться вся почта которую прислали на несуществующие почтовые ящики нашего домена <b><a target="_blank" rel="nofollow" href="https://www.reddit.com/r/mailcow/comments/jbq9pu/comment/gfdrydf/?utm_source=share&utm_medium=web2x&context=3">(info)</a></b>. </p>
<p>Переходим в раздел <b>Configuration</b> > <b>Mail Setup</b> > <b>Aliases</b> > <b>Aliases</b> и нажимаем кнопку <b>+ Add alias</b> </p>
<p>В секцию <b>Alias address/es</b> вписываем наш домен в таком виде <b>@mymailcow.cf</b> </p>
<p>А в секцию <b>Goto addresses</b> вписываем почтовый ящик на который будут перенаправлены письма, я вписываю <b>catchall@mymailcow.cf</b> </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/catchall-1.jpg" target="_blank"><img alt="catchall 1" src="https://img.zzxc.ru/img/post-31-mailcow/catchall-1.jpg" border="0"></a>
<p>И нажимаем кнопку <b>Add</b> </p>
<br><br>
<p>Таким образом мы создадим наше перенаправление </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/catchall-2.jpg" target="_blank"><img alt="catchall 2" src="https://img.zzxc.ru/img/post-31-mailcow/catchall-2.jpg" border="0"></a>
<br><br>
<p>Теперь если отправить письмо на существующий почтовый ящик, то это письмо попадёт по адресу. А если отправить письмо на несуществующий адрес, то оно попадёт на <b>catchall@mymailcow.cf</b> </p>
<a href="https://img.zzxc.ru/img/post-31-mailcow/catchall-3.jpg" target="_blank"><img alt="catchall 3" src="https://img.zzxc.ru/img/post-31-mailcow/catchall-3.jpg" border="0"></a>
<br><br><br><br><br><br>
<H2 id="useful-links">Полезные ссылки</H2>
<p>Официальный <b><a target="_blank" rel="nofollow" href="https://mailcow.email/">сайт Mailcow</a></b> </p>
<p>Официальная <b><a target="_blank" rel="nofollow" href="https://docs.mailcow.email/">документация Mailcow</a></b> </p>
<p>Официальный <b><a target="_blank" rel="nofollow" href="https://github.com/mailcow/mailcow-dockerized">GitHub</a></b> </p>
<br><br>
<p><b><a target="_blank" rel="nofollow" href="https://docs.mailcow.email/post_installation/firststeps-ssl/">Advanced SSL configuration</a></b> </p>
<p><b><a target="_blank" rel="nofollow" href="https://docs.mailcow.email/prerequisite/prerequisite-dns/">DNS setup</a></b> </p>
<p><b><a target="_blank" rel="nofollow" href="https://docs.mailcow.email/client/client/">Client Configuration</a></b> </p>
<p><b><a target="_blank" rel="nofollow" href="https://docs.mailcow.email/post_installation/firststeps-disable_ipv6/">Disable IPv6</a></b> </p>
<p><b><a target="_blank" rel="nofollow" href="https://docs.mailcow.email/post_installation/firststeps-rp/">Reverse Proxy</a></b> </p>
<p><b><a target="_blank" rel="nofollow" href="https://docs.mailcow.email/post_installation/firststeps-rspamd_ui/">Rspamd UI</a></b> </p>
<p><b><a target="_blank" rel="nofollow" href="https://docs.mailcow.email/backup_restore/b_n_r-backup/">Backup</a></b> + <b><a target="_blank" rel="nofollow" href="https://docs.mailcow.email/backup_restore/b_n_r-restore/">Restore</a></b> </p>
<br><br>
<p>Mission Completed! </p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com10tag:blogger.com,1999:blog-244151671096808002.post-10012688360258389622022-09-29T20:27:00.199+03:002023-01-24T16:25:27.856+03:00Почтовый сервер на основе Mailu в Docker контейнере<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2022/09/mailu-docker.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="docker-compose + mailu" border="0" src="https://img.zzxc.ru/img/post-30-mailu/logo-30-mailu.jpg"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Хотябы 1 раз в жизни админ сталкивается с настройкой своего почтового сервера. Настраивать всё по старинке, довольно долгое занятие и требует тщательного внимания. Сегодня поднимем всё необходимое в докер контейнере что избавит нас от лишних телодвижений.
</div>
<a name='more'></a><br><br>
<H2>Необходимые требования</H2>
<p>Чтобы всё получилось нам понадобится:</p>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>На хостинге должна быть предусмотрена возможность менять <b>PTR запись</b> для своего домена</li>
<li>Доменное имя. Можно бесплатный домен или поддомен</li>
<li>Установленный <b><a href="/p/virtualization-docker-full-install.html" target="_blank" >Docker + Docker-Compose</a></b></li>
<li>30 - 60 минут времени</li>
</ul>
<br><br><br><br><br><br>
<H2>Предыстория </H2>
<p>Какое то время назад мы с другом затеяли поднять игровой сервер <b>Lineage 2</b>. Разумеется что серверу был необходим форум. А для регистрации пользователей свой <b>SMTP</b> сервер. Ведь все письма отсылаются по протоколу <b>SMTP</b>. А получаются при помощи <b>IMAP</b>/<b>POP</b>. Тут то я и озадачился вопросом как поднять свой почтовый сервер. Я как раз тогда изучал <b>Docker</b> и наткнулся на интересный проект <b>mailu</b>, который позволял поднять свой почтовый сервер с нуля, буквально за пол часа. </p>
<p>Разобравшись с его настройкой я сохранил всю необходимую информацию, но долгое время не мог написать этот пост т.к. не было времени. Спустя какое то время всё же появилась возможность структурировать и добавить всю эту информацию сюда. </p>
<br><br><br><br><br><br>
<H2>В двух словах про <b>Mailu</b></H2>
<ul>
<li><b>Open Source</b>. Причём именно в том смысле в котором его принято видеть <b>полностью бесплатен</b>.</li>
<li><b>Прост в эксплуатации.</b></li>
<li><b>Есть веб-интерфейс</b> для приёма и отправки почты.</li>
<li><b>Работает с SSL</b> сам получит необходимые сертификаты, либо есть возможность задать свои.</li>
<li><b>Сгенерирует все необходимые DNS записи</b> <b>SPF</b>, <b>DMARC</b>, <b>DKIM</b>. Которые потом просто добавить в виде DNS записей для своего домена.</li>
</ul>
<br><br><br><br><br><br>
<H2>Особенности почтового сервера </H2>
<p>Установка почтового сервера предусматривает что Вы будете добавлять PTR запись, что в свою очередь приведёт к деанону ip адреса сервера из за специфики работы почтовых протоколов. Настоятельно рекомендуется ставить почтовый сервер на отдельной впске или сервере. </p>
<br><br><br><br><br><br>
<H2>Предварительная настройка (PTR, DNS, ETC)</H2>
<p>Первым делом нам понадобиться поменять <b>PTR запись</b> для домена, на котором мы планируем держать mailu. Это делается в интерфейсе вашего хостинга. В каждом хостинге это делается по разному, покажу как это сделано у меня. </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/ptr-1.jpg" target="_blank"><img alt="PTR 1" src="https://img.zzxc.ru/img/post-30-mailu/ptr-1.jpg" border="0"></a>
<br><br>
<p>В настройках сервера вписываем желаемый домен, для которого будет установлена <b>PTR запись</b>. </p>
<br><br>
<p>PTR запись может обновляться долгое время, зависит от хостинга и DNS. Проверить что она установилась корректно можно двумя способами </p>
<br>
<H4>Первый способ <b>nslookup</b> </H4>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nslookup -type=PTR <span style="color:#f39c12">ip-адрес-вашего-сервера</span></span></div>
<br>
<a href="https://img.zzxc.ru/img/post-30-mailu/ptr-nslookup.jpg" target="_blank"><img alt="ptr nslookup" src="https://img.zzxc.ru/img/post-30-mailu/ptr-nslookup.jpg" border="0"></a>
<br><br>
<H4>Второй способ <b>dig</b> </H4>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">dig -x <span style="color:#f39c12">ip-адрес-вашего-сервера</span></span></div>
<br>
<a href="https://img.zzxc.ru/img/post-30-mailu/ptr-dig.jpg" target="_blank"><img alt="ptr dig 1" src="https://img.zzxc.ru/img/post-30-mailu/ptr-dig.jpg" border="0"></a>
<br><br><br><br>
<p>Также обязательно стоит внести необходимые изменения в DNS зону вашего домена, если это ещё не сделано. Я почти все свои домены леплю на <b>cloudflare</b>, покажу как это сделано у меня </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/dns-1.jpg" target="_blank"><img alt="DNS 1" src="https://img.zzxc.ru/img/post-30-mailu/dns-1.jpg" border="0"></a>
<br><br><br><br>
<p>Желательно установить hostname для Вашего сервера. Впишите свой домен </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo hostnamectl set-hostname <span style="color:#f39c12">mymailu.cf</span></span></div>
<br>
<a href="https://img.zzxc.ru/img/post-30-mailu/hostname-2.jpg" target="_blank"><img alt="hostname 2" src="https://img.zzxc.ru/img/post-30-mailu/hostname-2.jpg" border="0"></a>
<br><br>
<p>Дополнительно добавим наш домен в /etc/hostname </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo nano /etc/hostname</span></div>
<br>
<a href="https://img.zzxc.ru/img/post-30-mailu/hostname-3.jpg" target="_blank"><img alt="hostname 3" src="https://img.zzxc.ru/img/post-30-mailu/hostname-3.jpg" border="0"></a>
<br><br><br><br>
<p>Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём необходимые директории для mailu </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/mail/mailu</span></div>
<br><br>
<p>Сделаем нашего пользователя (не root !) владельцем этой директории </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/mail/mailu</span></div>
<br>
<p>На этом предварительная настройка завершена </p>
<br><br><br><br><br><br>
<H2>Конфигурация <b>mailu</b></H2>
<p>Нам необходимо получить рабочий конфиг <b>docker-compose.yml</b> под свой сервер, поэтому отправляемся на <b><a target="_blank" rel="nofollow" href="https://setup.mailu.io/1.9/">страницу конфигурации mailu</a></b>, выбираем что мы будем использовать <b>compose</b> и начинаем постепенно вводить свои данные. </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-configuration-1.jpg" target="_blank"><img alt="mailu configuration 1" src="https://img.zzxc.ru/img/post-30-mailu/mailu-configuration-1.jpg" border="0"></a>
<br><br>
<p>Далее необходимо вписать данные для своего сервера, я приведу пример как это сделано у меня </p>
<H4>Step 2 - Initial configuration</H4>
<p><b>Mailu storage path</b>: <br><span style="color:#f39c12">/app/mail/mailu</span> </p>
<p><b>Main mail domain and server display name</b> <br><span style="color:#f39c12">mymailu.cf</span> </p>
<p><b>Postmaster local part</b> <br>admin </p>
<p><b>Choose how you wish to handle security</b> <br> выбираем <b>letsencrypt</b> </p>
<p><b>Authentication rate limit per IP for failed login attempts or non-existing accounts</b> <br> по умолчанию </p>
<p><b>Opt-out of statistics</b> <br> Включаем, если не хотим отсылать телеметрию </p>
<p><b>Website name</b> <br><span style="color:#f39c12">mail.mymailu.cf</span> </p>
<p><b>Linked Website URL</b> <br> <span style="color:#f39c12">https://mail.mymailu.cf</span> </p>
<p><b>Enable the admin UI (and path to the admin UI)</b> <br> Включаем и оставляем по умолчанию. </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-configuration-2.jpg" target="_blank"><img alt="mailu configuration 2" src="https://img.zzxc.ru/img/post-30-mailu/mailu-configuration-2.jpg" border="0"></a>
<br><br><br><br><br><br>
<H4>Step 3 - Pick some features</H4>
<p><b>Enable Web email client (and path to the Web email client)</b> <br>если хотим отдельный веб интерфейс для почты выбираем <b>roundcube</b>. Путь /webmail можно оставить по умолчанию. </p>
<p><b>Enable the antivirus service</b> <br>по желанию можно включить антивирус, но он будет есть нехило ресурсов, если у Вас мощный сервер можно включить. Я предпочитаю его не включать. </p>
<p><b>Enable the webdav service</b> <br>по желанию можно включить, для того чтобы была возможность использовать календари. У себя включаю. </p>
<p><b>Enable fetchmail</b> <br>по желанию, включаю. </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-configuration-3.jpg" target="_blank"><img alt="mailu configuration 3" src="https://img.zzxc.ru/img/post-30-mailu/mailu-configuration-3.jpg" border="0"></a>
<br><br><br><br><br><br>
<H4>Step 4 - expose Mailu to the world</H4>
<p><b>IPv4 listen address</b> <br> вписываем ip адрес сервера. </p>
<p><b>Subnet of the docker network.</b> <br> по умолчанию. </p>
<p><b>Enable IPv6</b> <br> Я предпочитаю не включать. </p>
<p><b>Enable an internal DNS resolver (unbound)</b> <br> Включаем. </p>
<p><b>Public hostnames</b> <br> <span style="color:#f39c12">mail.mymailu.cf</span> </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-configuration-4.jpg" target="_blank"><img alt="mailu configuration 4" src="https://img.zzxc.ru/img/post-30-mailu/mailu-configuration-4.jpg" border="0"></a>
<br><br><br><br><br><br>
<H4>Database preferences</H4>
<p>Дабы слишком не усложнять этот и без того большой пост - выбираем sqlite </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-configuration-5.jpg" target="_blank"><img alt="mailu configuration 5" src="https://img.zzxc.ru/img/post-30-mailu/mailu-configuration-5.jpg" border="0"></a>
<br><br>
<p>Наконец нажимаем <b>Setup Mailu</b> </p>
<br><br><br><br><br><br>
<H2>Установка <b>mailu</b></H2>
<p>В результате конфигурации <b>mailu</b> нас перебрасывает на специальную страницу с нашими уникальными конфигами. </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-install-1.jpg" target="_blank"><img alt="mailu install 1" src="https://img.zzxc.ru/img/post-30-mailu/mailu-install-1.jpg" border="0"></a>
<br><br>
<p>Отправляемся в директорию </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/mail/mailu</span></div>
<br><br>
<p>И скачиваем наши уникальные сгенерированные конфиги</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">wget https://setup.mailu.io/1.9/file/<span style="color:#f39c12">ваш-уникальный-id</span>/docker-compose.yml<br>
wget https://setup.mailu.io/1.9/file/<span style="color:#f39c12">ваш-уникальный-id</span>/mailu.env</span></div>
<br><br>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-install-2.jpg" target="_blank"><img alt="mailu install 2" src="https://img.zzxc.ru/img/post-30-mailu/mailu-install-2.jpg" border="0"></a>
<br><br><br><br>
<p>Следующий шаг предполагает ревью кода из конфигов. Кстати тут можно заменить <b>SECRET_KEY</b> в фаиле <b>mailu.env</b> на состоящую из 16 рандомно последовательных символов. Для лучшей безопасности.</p>
<br><br><br><br>
<p>Третий шаг запуск контейнера </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-install-3.jpg" target="_blank"><img alt="mailu install 3" src="https://img.zzxc.ru/img/post-30-mailu/mailu-install-3.jpg" border="0"></a>
<br><br>
<p>Находясь в папке с <b>mailu</b> стартуем наш стек контейнеров</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose -p mailu up -d</span></div>
<br><br>
<p>Начнется продолжительное скачивание и распаковка образов. А после этого будут подняты все необходимые для работы <b>mailu</b> контейнеры. </p>
<br>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-install-5.jpg" target="_blank"><img alt="mailu install 5" src="https://img.zzxc.ru/img/post-30-mailu/mailu-install-5.jpg" border="0"></a>
<br><br>
<p>Иногда полезно сразу взглянуть на логи. Например выявить нет ли каких то проблем с <b>letsencrypt</b>. </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose logs -f front</span></div>
<br><br>
<p>Финализируем установку, задав пароль для учётки администратора </p>
<br>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose -p mailu exec admin flask mailu admin admin mymailu.cf <span style="color:#f39c12">PASSWORD</span></span></div>
<br>
<p>В ответ нам напишут что наш пользователь <b>admin</b> создан </p>
<p>Теперь можно переходить в веб панель у меня она располагается по адресу <b>https://mail.mymailu.cf</b> который я задавал на этапе конфигурации. </p>
<p>Авторизуемся вводя электронную почту <span style="color:#FF3152"><b>admin@mymailu.cf</b></span> и заданный пароль и нажимаем <b>Войти Admin</b> </p>
<br><br><br><br><br><br>
<H2>Настройка <b>mailu</b></H2>
<p>Вся дальнейшая настройка <b>mailu</b> по большей части сводится к тому чтобы правильно прописать необходимые DNS записи. Но сначала я предпочитаю поменять язык на английский, чтобы было более универсально. Это делается сверху-справа наведя курсор на иконку языка.</p>
<p>Переходим в раздел <b>Mail domains</b>. Тут в разделе Actions нажимаем на кнопку гамбургер (3 полоски). </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-settings-1.jpg" target="_blank"><img alt="mailu settings 1" src="https://img.zzxc.ru/img/post-30-mailu/mailu-settings-1.jpg" border="0"></a>
<br><br><br><br>
<p>Тут необходимо сгенерировать необходимые днс записи. Для этого нажимаем на кнопку <b>Generate keys</b>. Нам будет выдано предупреждение с кнопкой <b>Confirm</b>, нажимаем её. </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-settings-2.jpg" target="_blank"><img alt="mailu settings 2" src="https://img.zzxc.ru/img/post-30-mailu/mailu-settings-2.jpg" border="0"></a>
<br><br><br><br>
<p>Мы увидим как добавились такие записи как публичный ключ <b>DKIM</b>, а также запись <b>DMARC</b> и другие. В любой момент мы можем перегенерировать эти записи нажав на кнопку <b>Regenerate keys</b>. </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-settings-3.jpg" target="_blank"><img alt="mailu settings 3" src="https://img.zzxc.ru/img/post-30-mailu/mailu-settings-3.jpg" border="0"></a>
<br><br>
<p>Следующим шагом будет установка всех этих данных в DNS. </p>
<br><br><br><br><br><br>
<H2>Добавляем записи DNS</H2>
<p>Раз уж мы будем работать с <b>DNS</b> то я рекомендую поставить пакет <b>dnsutils</b>, он очень пригодиться для последующих проверок.</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo apt install dnsutils</span></div>
<br><br>
<p>Как я уже говорил ранее я почти для всех доменов использую <b>cloudflare</b>, поэтому буду показывать на его примере. Идём в настройки DNS домена и начинаем постепенно вводить свои данные. У меня домен mymailu.cf </p>
<H4>MX запись</H4>
<ul>
<li><span style="color:#FF3152">Type</span>: <span style="color:#f39c12">MX</span></li>
<li><span style="color:#FF3152">Name</span>: <span style="color:#f39c12">@</span></li>
<li><span style="color:#FF3152">Mail server</span>: <span style="color:#f39c12">mail.mymailu.cf</span></li>
<li><span style="color:#FF3152">TTL</span>: <span style="color:#f39c12">Auto</span></li>
<li><span style="color:#FF3152">Priority</span>: <span style="color:#f39c12">10</span></li>
</ul>
<p>Проверить MX запись можно в терминале командой </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">dig <span style="color:#f39c12">mymailu.cf</span> MX</span></div>
<br><br><br><br>
<H4>SPF запись</H4>
<ul>
<li><span style="color:#FF3152">Type</span>: <span style="color:#f39c12">TXT</span></li>
<li><span style="color:#FF3152">Name</span>: <span style="color:#f39c12">@</span></li>
<li><span style="color:#FF3152">TTL</span>: <span style="color:#f39c12">Auto</span></li>
<li><span style="color:#FF3152">Content</span>: <span style="color:#f39c12">v=spf1 mx a:mail.mymailu.cf ~all</span></li>
</ul>
<p>Содержимое поля content берём из графы <b>DNS SPF entries</b> в <b>mailu</b> то что содержится в кавычках. </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-dns-1.jpg" target="_blank"><img alt="mailu DNS SPF" src="https://img.zzxc.ru/img/post-30-mailu/mailu-dns-1.jpg" border="0"></a>
<br><br><br><br><br><br>
<H4>DKIM запись</H4>
<ul>
<li><span style="color:#FF3152">Type</span>: <span style="color:#f39c12">TXT</span></li>
<li><span style="color:#FF3152">Name</span>: <span style="color:#f39c12">dkim._domainkey</span></li>
<li><span style="color:#FF3152">TTL</span>: <span style="color:#f39c12">Auto</span></li>
<li><span style="color:#FF3152">Priority</span>: <span style="color:#f39c12">v=DKIM1; k=rsa; p=...</span></li>
</ul>
<p>Содержимое поля content берём из графы <b>DNS DKIM entry</b> в <b>mailu</b> то что содержится в кавычках. А поле <b>Name</b> должно быть <b>dkim._domainkey</b>. </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-dns-2.jpg" target="_blank"><img alt="mailu DNS DKIM" src="https://img.zzxc.ru/img/post-30-mailu/mailu-dns-2.jpg" border="0"></a>
<p>Проверить <b>DKIM запись</b> можно командой </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">dig <span style="color:#f39c12">dkim._domainkey.mymailu.cf</span> TXT</span></div>
<br><br><br><br><br><br>
<H4>DMARC запись</H4>
<ul>
<li><span style="color:#FF3152">Type</span>: <span style="color:#f39c12">TXT</span></li>
<li><span style="color:#FF3152">Name</span>: <span style="color:#f39c12">_dmarc.mymailu.cf</span></li>
<li><span style="color:#FF3152">TTL</span>: <span style="color:#f39c12">Auto</span></li>
<li><span style="color:#FF3152">Priority</span>: <span style="color:#f39c12">v=DMARC1; p=reject;...</span></li>
</ul>
<p>Содержимое поля content берём из графы <b>DNS DMARC entry</b> в <b>mailu</b> то что содержится в кавычках. А поле <b>Name</b> должно быть <b>_dmarc.mymailu.cf</b>. </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-dns-3.jpg" target="_blank"><img alt="mailu DNS DMARC" src="https://img.zzxc.ru/img/post-30-mailu/mailu-dns-3.jpg" border="0"></a>
<br>
<p>Проверить <b>DMARC запись</b> можно командой </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">dig <span style="color:#f39c12">_dmarc.mymailu.cf</span> TXT</span></div>
<br><br>
<p>В результате заполнения DNS в cloudflare я получил такую картину </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/cloudflare-ready.jpg" target="_blank"><img alt="cloudflare-ready 1" src="https://img.zzxc.ru/img/post-30-mailu/cloudflare-ready.jpg" border="0"></a>
<br><br><br><br><br><br>
<H2>Добавляем пользователей / почтовые ящики</H2>
<p>Для того чтобы добавить почтовый ящик отправляемся в пункт <b>Mail domains</b> и оттуда кликаем по иконке письма </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-add-mail-1.jpg" target="_blank"><img alt="mailu add mail 1" src="https://img.zzxc.ru/img/post-30-mailu/mailu-add-mail-1.jpg" border="0"></a>
<br><br>
<p>Нажимаем <b>Add User</b> </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-add-mail-2.jpg" target="_blank"><img alt="mailu add mail 2" src="https://img.zzxc.ru/img/post-30-mailu/mailu-add-mail-2.jpg" border="0"></a>
<br><br>
<p>Задаём: </p>
<ul>
<li>Адрес почты </li>
<li>Пароль </li>
<li>Отображаемое имя </li>
<li>Комментарий </li>
<li>Состояние ВКЛ / ВЫКЛ </li>
<li>Квоту в гигабайтах </li>
<li>Возможность использования IMAP </li>
<li>Возможность использования POP3 </li>
</ul>
<p>и нажимаем <b>Save</b> </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-add-mail-3.jpg" target="_blank"><img alt="mailu add mail 3" src="https://img.zzxc.ru/img/post-30-mailu/mailu-add-mail-3.jpg" border="0"></a>
<br><br>
<p>Нам сообщат что почта успешно добавлена </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-add-mail-4.jpg" target="_blank"><img alt="mailu add mail 4" src="https://img.zzxc.ru/img/post-30-mailu/mailu-add-mail-4.jpg" border="0"></a>
<br><br><br><br><br><br>
<H2 id="catchall">Добавляем Catch-All filter</H2>
<p>Работает это так, если кто то отправил почту на несуществующий почтовый ящик вашего домена, то это письмо попадает в специальный <b>Catch-All</b> ящик предназначенный для таких случаев. </p>
<p>В <b>mailu</b> из коробки нет механизма <b>catch-all</b>. Однако можно воспользоваться <b><a target="_blank" rel="nofollow" href="https://github.com/Mailu/Mailu/issues/38">хаком</a></b> и тогда всё заработает. Для включения отправляемся в пункт <b>Mail domains</b> и оттуда кликаем по иконке символа собаки @. </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-catchall-1.jpg" target="_blank"><img alt="mailu catchall 1" src="https://img.zzxc.ru/img/post-30-mailu/mailu-catchall-1.jpg" border="0"></a>
<br><br>
<p>В появившемся окне пишем в поле <b>Alias</b> символ <b>%</b>.<br> Обязательно нажимаем галку <b>Use SQL LIKE Syntax</b>(без нее не будет работать). </p>
<p>Затем выбираем в качестве <b>Destination</b> специально созданную почту для catch-all. У меня это test@mymailu.cf заполняем по желанию описание </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-catchall-2.jpg" target="_blank"><img alt="mailu catchall 2" src="https://img.zzxc.ru/img/post-30-mailu/mailu-catchall-2.jpg" border="0"></a>
<br><br>
<p>После добавления если отправить например почту на ящик fweh3423423iuhfew@mymailu.cf то он будет попадать в test@mymailu.cf а если например отправить на admin@mymaily.cf которая существует, то почта попадёт именно туда. </p>
<p>А в результате после добавления, этого алиаса, мы увидим такую запись. </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailu-catchall-3.jpg" target="_blank"><img alt="mailu catchall 3" src="https://img.zzxc.ru/img/post-30-mailu/mailu-catchall-3.jpg" border="0"></a>
<br><br>
<br><br><br><br><br><br>
<H2 id="check-result">Проверяем работу mailu</H2>
<p>Настало время проверить корректность настройки <b>mailu</b>. Открываем сайт <b><a target="_blank" rel="nofollow" href="https://www.mail-tester.com/">mail-tester.com</a></b>. Этот сайт позволит нам делать 3 проверки в день так что используйте эти попытки экономно. </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailtester-1.jpg" target="_blank"><img alt="mailtester 1" src="https://img.zzxc.ru/img/post-30-mailu/mailtester-1.jpg" border="0"></a>
<p>Попав на сайт нам сразу же будет предоставлена почта, на которую мы должны отправить тестовое письмо. Копируем эту почту и переходим в веб интерфейсе <b>mailu</b> в раздел <b>Webmail</b>. </p>
<p>Создаём новое сообщение и вставляем адрес почты, полученный с меилтестера. И нажимаем отправить. </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/sendmail-1.jpg" target="_blank"><img alt="sendmail 1" src="https://img.zzxc.ru/img/post-30-mailu/sendmail-1.jpg" border="0"></a>
<br><br><br><br>
<p>Наконец проверяем результат </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/mailtester-2.jpg" target="_blank"><img alt="mailtester 2" src="https://img.zzxc.ru/img/post-30-mailu/mailtester-2.jpg" border="0"></a>
<br><br>
<p>Дополнительно я отправил писмо на свой gmail ящик и оно сразу зашло в инбокс </p>
<a href="https://img.zzxc.ru/img/post-30-mailu/gmail-inbox.jpg" target="_blank"><img alt="gmail-inbox 1" src="https://img.zzxc.ru/img/post-30-mailu/gmail-inbox.jpg" border="0"></a>
<br><br>
<p>Кстати, если планируете отсылать письма по gmail'ам не лишним будет добавить свой домен на специальную страницу <b><a target="_blank" rel="nofollow" href="https://postmaster.google.com">https://postmaster.google.com</a></b> </p>
<br><br>
<p>Mission Completed! </p>
<br><br><br><br><br><br>
<H2 id="usefull-links">Полезные ссылки</H2>
<p><b><a target="_blank" rel="nofollow" href="https://mailu.io/1.9/">Офф Сайт</a></b> </p>
<p><b><a target="_blank" rel="nofollow" href="https://github.com/Mailu/Mailu">Офф Github</a></b> </p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com4tag:blogger.com,1999:blog-244151671096808002.post-16527634226529468552022-04-26T13:47:00.068+03:002023-01-24T16:26:04.454+03:00Установка Uptime Kuma в Docker контейнере<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2022/04/uptime-kuma-docker-amd64-arm64.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="docker-compose + linuxserver + wireguard" border="0" src="https://img.zzxc.ru/img/post-29/logo-29-uptime-kuma.png"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Наверняка Вы слышали о разнообразных системах мониторинга. Подавляющее большинство таких систем очень тяжёлые и требуют дополнительного времени для их изучения. Сегодня мы рассмотрим очень простую и лёгкую систему мониторинга аптайма для сайтов и серверов под названием <b>Uptime Kuma</b>.
</div>
<a name='more'></a><br><br>
<H2>Необходимые требования</H2>
<p>Чтобы всё получилось нам понадобится:</p>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>Доменное имя. Можно бесплатный домен или поддомен</li>
<li>Установленный <b><a href="/p/virtualization-docker-full-install.html" target="_blank" >Docker + Docker-Compose</a></b></li>
<li>Установленный и настроенный <b><a href="/2021/09/nginx-proxy-manager-docker-compose.html" target="_blank" >Nginx Proxy Manager</a></b></li>
<li>10 - 20 минут времени</li>
</ul>
<br><br><br><br><br><br>
<H2>В двух словах про <b>uptime-kuma</b></H2>
<p>Open Source</p>
<p>Интуитивно понятная панелька. Не требовательная к ресурсам. Добавляем ресурс который хотим мониторить. Выбираем способ проверки - ping, гет запрос, прямое обращение по tcp/udp например по ssh. Устанавливаем таймер, например проверять каждые 60 секунд.</p>
<p>Результат проверок будет выводиться в настраиваемый график. У каждого добавленного ресурса свой собственный. На графике присутствует метка времени и индикация красный цвет - ресурс не работал, зелёный - всё ок. График можно настраивать по своему усмотрению.</p>
<p>По стандарту для доступа к данным надо авторизоваться, но также есть возможность на специальной странице открыть доступ для всех без авторизации. Например можно добавить туда статус сервера регистрации, форума, основной сайта и вывести эту информацию о работоспособности сервисов для всех.</p>
<p>Киллер фича - оповещение 28-мью разными способами когда ресурс упал. Причём когда при следующей проверке ресурс поднимается, то система об этом так же оповестит. Для себя я выбрал оповещение в телеграм. Из популярных там есть ещё по почте, в дискорд, в матрикс и другие.</p>
<br><br><br><br><br><br>
<H2>Подготовка</H2>
<p>Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём необходимые директории для uptime-kuma</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/misc/uptime-kuma/data</span></div>
<br>
<p>Сделаем нашего пользователя (не root !) владельцем этой директории</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/misc/uptime-kuma</span></div>
<br><br><br><br><br><br>
<H2>Конфигурация и запуск</H2>
<p>Перейдём в директорию, которую мы создавали выше</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/misc/uptime-kuma</span></div>
<br>
<p>Создадим фаил <b>docker-compose.yml</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<p>И заполняем его таким <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Misc/uptime-kuma/1-uptime-kuma/docker-compose.yml">таким содержанием</a></b>. Данный конфиг подойдёт сразу под amd64 и arm64 архитектуры.</p>
<p>Если Вы хотите поднять <b>Uptime Kuma</b> не светя порты наружу, прочитайте про <b><a target="_blank" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html#hostname_proxy">проксирование приложения в NPM через хостнейм</a></b>. После усвоения материала используйте этот <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Misc/uptime-kuma/2-uptime-kuma-network/docker-compose.yml">фаил docker-dompose</a></b>. В противном случае используйте первый вариант, изначально пост писался именно под него!
<br><br>
<p>Стартуем контейнер с <b>uptime-kuma</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br><br><br><br><br><br>
<h2>Посмотрим что у нас получилось</h2>
<p>Если вы ничего не меняли в фаиле docker-compose.yml то порт будет <b>3001</b>. Открываем в браузере</p>
<a href="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-setup.png" target="_blank"><img border="0" alt="Uptume Kuma Setup" class="lazy-ify" src="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-setup.png" /></a>
<br><br>
<p>Придумываем, вводим и запоминаем данные для авторизации. Имя админа может быть любое. И нажимаем <b>Create</b>.</p>
<p>Попадаем в пока что пустую панельку</p>
<a href="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-clean-dashboard.png" target="_blank"><img border="0" alt="Uptume Kuma clean dashboard" class="lazy-ify" src="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-clean-dashboard.png" /></a>
<br><br>
<br><br><br><br><br><br>
<h2>Uptime-kuma на своём домене/поддомене</h2>
<p>На этом шаге я крайне рекомендую прилепить <b>Uptime Kuma</b> на домен или поддомен с SSL сертификатом. Самый простой вариант как это сделать был разобран в предыдущем посте <b><a target="_self" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html">Nginx Proxy Manager в Docker контейнере</a></b>.</p>
<p>Можно воспользоваться бесплатным <b>фриномовским</b> доменом и бесплатным <b>SSL</b> сертификатом от <b>Lets Encrypt</b>.</p>
<br><br><br><br><br><br>
<h2>Добавляем ресурс для мониторинга</h2>
<p>Добавим сайт для мониторинга, для этого на главной странице сверху нажимаем <b>Add New Monitor</b>. Оттуда попадаем на специальную страницу. И начинаем заполнять:</p>
<p>В качестве <b>Monitor type</b> выбираем <b>HTTP(S)</b></p>
<p><b>Friendly Name</b> - какое название будет отображаться для этого ресурса на главной и других страницах</p>
<p><b>URL</b> - урл сайта</p>
<p><b>Heartbeat Interval</b> - периодичность проверки в секундах. Если указать например 600, то будет проверять каждые 10 минут.</p>
<p><b>Domain Name Expiry Notification</b> - проверка срока истечения доменного имени</p>
<p><b>Ignore TLS/SSL</b> - игнорировать ошибки TLS/SSL</p>
<p><b>Upside Down Mode</b> - если отметить этот чекбокс то включается режим наоборот, если сайт доступен и отвечает, то в качестве результата будет выведено что сайт упал.</p>
<p><b>Max. Redirects</b> - максимальное количество редиректов</p>
<p><b>Accepted Status Codes</b> - какие HTTP коды ответа считать успешными, для простой проверки сайта на работоспособность будет достаточно выбрать <b>200-299</b>, во всех остальных случаях установите нужный вам код ответа.</p>
<p><b>Tags</b> теги ресурса. Можно объединять несколько ресурсов в 1 тег. Так же раскрашивать теги по своему усмотрению, таким образом облегчая процесс визуальной аналитики работоспособности важных узлов.</p>
<p><b>Notification</b> - тут можно включить оповещения, например если при проверке будет зафиксировано что ресурс в данный момент не работает то в зависимости от выбора можно получать уведомление в разные мессенджеры или по email. Для себя я выбрал оповещение в телеграм. Сделать такое оповещение очень просто, расскажу на примере Telegram:</p>
<ul>
<li><b><a target="_blank" rel="dofollow" href="/p/telegram-bot-creation-1.html">Создаём своего бота в Telegram</a></b></li>
<li>Получаем <b><a target="_blank" rel="dofollow" href="/p/telegram-bot-creation-1.html#regbot">Bot Token</a></b> и <b><a target="_blank" rel="dofollow" href="/p/telegram-bot-creation-1.html#chatid">Chat ID</a></b></li>
<li>Заносим эту информацию в пункт <b>Notification</b> в <b>Uptime kuma</b></li>
</ul>
<a href="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-telegram-alert.png" target="_blank"><img border="0" alt="Uptume Kuma Telegram Alert" class="lazy-ify" src="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-telegram-alert.png" /></a>
<br><br>
<p>Для проверки можно нажать на кнопку <b>TEST</b></p>
<a href="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-telegram-alert-2.png" target="_blank"><img border="0" alt="Uptume Kuma Telegram Alert check" class="lazy-ify" src="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-telegram-alert-2.png" /></a>
<p>Работает!</p>
<p>Если включить пункт <b>Default enabled</b> только что настроенное оповещение в телеграм будет доступно для всех новых мониторов. Можно сделать например так чтобы о падении одних ресурсов отправлялся алерт в 1 чат в телеграме, а о падении других в другой чат, либо вообще в другой мессенджер.</p>
<p>Добавляя тестовый сайт я получил такие настройки:</p>
<a href="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-addnew--site.png" target="_blank"><img border="0" alt="Uptume Kuma Add New Site" class="lazy-ify" src="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-addnew--site.png" /></a>
<br><br>
<p>Закончив с настройкой нажимаем <b>Save</b></p>
<p>И сразу видим как наш ресурс добавился на главную панель. Зелёные овалы говорят об успешной проверке.</p>
<a href="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-addnew--site-added.png" target="_blank"><img border="0" alt="Uptume Kuma Added New Site" class="lazy-ify" src="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-addnew--site-added.png" /></a>
<br><br>
<p>Добавляя всё новые мониторы(задания для проверки) дашборд приобретает довольно информативный вид</p>
<a href="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-dashboard-filled.png" target="_blank"><img border="0" alt="Uptume Kuma Dashboard Filled" class="lazy-ify" src="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-dashboard-filled.png" /></a>
<br><br><br><br><br><br>
<h2>Status Pages</h2>
<p><b>Uptime Kuma</b> содержит ещё одно настраиваемое представление работоспособности ресурсов. Оно называется <b>Status Page</b>. Эта та самая страница, на которой можно выборочно разместить и структурировать желаемые ресурсы для предоставления информации своим пользователям/клиентам/посетителям.</p>
<p>Например у Вас игровой проект. Вы хотите показать своим игрокам статус серверов, или например статус логин и гейм сервера. Это очень просто сделать на этой странице.</p>
<p>Сверху в меню нажимаем <b>Status Pages</b> > <b>New Status Page</b> </p>
<p>Придумываем и вписываем название и идентификатор url нашей status page</p>
<a href="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-status-add.png" target="_blank"><img border="0" alt="Uptume Kuma Status Add" class="lazy-ify" src="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-status-add.png" /></a>
<br><br>
<p>Нас перекинет на страницу редактирования. Первым делом советую сразу тапнуть по <b>dark mode</b> чтобы снизить нагрузку на глаза.</p>
<p>В поле <b>Description</b> вписываем описание для группы элементов</p>
<p>В поле <b>Add a monitor:</b> выбираем необходимые для отображения мониторы. Появится поле со значением <b>Services</b>, его тоже можем поменять на своё усмотрение</p>
<a href="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-status-add-2.png" target="_blank"><img border="0" alt="Uptume Kuma Status Add 2" class="lazy-ify" src="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-status-add-2.png" /></a>
<br><br>
<p>Можно добавлять несколько независимых групп мониторов для отображения.</p>
<p>Есть возможность сделать анонс, для этого нажимаем <b>Create Incident</b>. В анонсе можно написать например "Плановое обслуживание серверов с 08:00 по 08:30".</p>
<p>Закончив редактирование нажимаем <b>Save</b></p>
<p>Теперь нашим пользователям доступна паблик страница статуса.</p>
<a href="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-status-filled.png" target="_blank"><img border="0" alt="Uptume Kuma Status Filled" class="lazy-ify" src="https://img.zzxc.ru/img/post-29/post-29-uptume-kuma-status-filled.png" /></a>
<br><br>
<p>Интерфейс <b>Uptime Kuma</b> интуитивно понятен и хорошо продуман.</p>
<p>В конечном итоге получился очень классный бесплатный и развивающийся продукт. Мне панелька очень понравилась. Наверняка кто то тоже возьмёт её себе на вооружение. </p>
<br><br><br><br><br><br>
<h2 id="add-docker-host">Обновления в версии 1.18</h2>
<p>В этой версии появилась возможность добавления монитора докер хоста и всех его контейнеров. Для того чтобы задействовать данную возможность необходимо добавить в <b>docker-compose.yml</b> строку с volume для <b><a target="_blank" rel="nofollow" href="https://github.com/louislam/uptime-kuma/issues/2093#issuecomment-1250050007">docker.sock</a></b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">/var/run/docker.sock:/var/run/docker.sock</div>
<p>В моём <b>docker-compose.yml</b> эта строка уже добавлена</p>
<p>После чего необходимо перезапустить контейнер</p>
<br><br>
<p>Идём в настройки в раздел <b>Docker Hosts</b> и нажимаем <b>Setup Docker Host</b></p>
<a href="https://img.zzxc.ru/img/post-29/setup-docker-host-1.jpg" target="_blank"><img alt="uptime kuma setup docker host" src="https://img.zzxc.ru/img/post-29/setup-docker-host-1.jpg" border="0"></a>
<br><br>
<p>В появившемся окне вписываем название нашего докер хоста например <b>docker-local</b> и нажимаем <b>Проверка</b></p>
<a href="https://img.zzxc.ru/img/post-29/setup-docker-host-2.jpg" target="_blank"><img alt="uptime kuma setup docker host 2" src="https://img.zzxc.ru/img/post-29/setup-docker-host-2.jpg" border="0"></a>
<br><br>
<p>Нажимаем <b>Проверка</b>, если всё сделано правильно появится сообщение с количеством контейнеров</p>
<a href="https://img.zzxc.ru/img/post-29/setup-docker-host-3.jpg" target="_blank"><img alt="uptime kuma setup docker host 3" src="https://img.zzxc.ru/img/post-29/setup-docker-host-3.jpg" border="0"></a>
<br><br>
<p>Нажимаем <b>Сохранить</b>, чтобы добавить наш докер хост, после чего он появится в списке</p>
<a href="https://img.zzxc.ru/img/post-29/setup-docker-host-4.jpg" target="_blank"><img alt="uptime kuma setup docker host 4" src="https://img.zzxc.ru/img/post-29/setup-docker-host-4.jpg" border="0"></a>
<br><br><br><br>
<p>Теперь добавим контейнер для мониторинга. Для примера я добавлю мониторинг контейнера <b>wireguard</b>. По большому счёту тут все интуитивно понятно, поэтому я ограничусь скриншотом</p>
<a href="https://img.zzxc.ru/img/post-29/add-docker-monitor-1.jpg" target="_blank"><img alt="uptime kuma add docker monitor" src="https://img.zzxc.ru/img/post-29/add-docker-monitor-1.jpg" border="0"></a>
<br><br>
<p>Добавлю только что <b>имя</b> или <b>id</b> можно посмотреть с помощью команды</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker ps</span></div>
<br><br>
<p>Вписав все необходимые данные добавляем монитор</p>
<a href="https://img.zzxc.ru/img/post-29/add-docker-monitor-2.jpg" target="_blank"><img alt="uptime kuma add docker monitor 2" src="https://img.zzxc.ru/img/post-29/add-docker-monitor-2.jpg" border="0"></a>
<br><br><br><br><br><br>
<h2>Дополнительная информация</h2>
<p><b>Страница <b>Uptime Kuma</b> на <a target="_blank" rel="nofollow" href="https://github.com/louislam/uptime-kuma">Github</a></b></p>
<p><b><a target="_blank" rel="nofollow" href="https://demo.uptime.kuma.pet">Демо страница</a></b></p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com1tag:blogger.com,1999:blog-244151671096808002.post-79105045856889024142022-01-11T18:15:00.071+03:002023-01-24T16:26:30.357+03:00Поднимаем webtop в докер контейнере<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2022/01/webtop-docker-linuxserver-amd64-arm64.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="docker-compose + linuxserver + wireguard" border="0" src="https://img.zzxc.ru/img/post-28/logo-28-webtop-docker.jpg"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Полноценный Linux с GUI в браузере. Действительно? Кому это может понадобиться? Посидев подумав какое то время, идеи начали приходить одна за другой. На данный момент с появлением webtop в моём арсенале, мне удалось решить некоторые необычные кейсы которые я не мог решить довольно долго. Сегодня я расскажу как поставить всё это добро.
</div>
<a name='more'></a><br><br>
<H2>Необходимые требования</H2>
<p>Чтобы всё получилось нам понадобится:</p>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>Доменное имя. Можно бесплатный домен или поддомен</li>
<li>Установленный <b><a href="/p/virtualization-docker-full-install.html" target="_blank" >Docker + Docker-Compose</a></b></li>
<li>Установленный и настроенный <b><a href="/2021/09/nginx-proxy-manager-docker-compose.html" target="_blank" >Nginx Proxy Manager</a></b></li>
<li>15 - 30 минут времени</li>
</ul>
<br><br><br><br><br><br>
<H2>В двух словах о <b>webtop</b></H2>
<p>Webtop представляет из себя, готовый образ, слепок если хотите разнообразных дистрибутивов:</p>
<ul>
<li>Alpine</li>
<li>Arch</li>
<li>Fedora</li>
<li>Ubuntu</li>
</ul>
<p>С разнообразными средами рабочего стола. Такими как:</p>
<ul>
<li>i3</li>
<li>IceWM</li>
<li>KDE</li>
<li>MATE</li>
<li>Openbox</li>
<li>XFCE</li>
</ul>
<p>Всё что нужно сделать конечному пользователю это выбрать тэг отвечающий за саму систему + выбрать сопутствующую для него среду рабочего стола. В данном посте я буду рассматривать <b>Arch-XFCE</b>.</p>
<p>В webtop есть поддержка буфера обмена. Эта штука располагается слева при клике по чёрной стрелке. Там же есть поддержка экранной клавиатуры</p>
<p>Одна из особенностей webtop заключается в том что при остановке контейнера, он забудет все изменения которые вы с ним делали. Хотя и сохранит некоторую информацию. То есть грубо говоря если вы подняв контейнер наставили туда разного софта а потом выключили контейнер - то при следующем запуске установленного софта вы не обнаружете, хотя скаченные данные остануться.</p>
<br><br><br><br><br><br>
<H2>Подготовка</H2>
<p>Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём необходимые директории для webtop</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/misc/webtop/arch-xfce/data</span></div>
<br>
<p>Сделаем нашего пользователя (не root !) владельцем этой директории</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/misc/webtop/arch-xfce</span></div>
<br><br><br><br><br><br>
<H2>Конфигурация и запуск</H2>
<p>Перейдём в директорию, которую мы создавали выше</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/misc/webtop/arch-xfce</span></div>
<br>
<p>Создадим фаил <b>docker-compose.yml</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<p>И заполняем его таким <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Misc/webtop/1-webtop-linuxserver-amd64-aarch64/docker-compose.yml">таким содержанием</a></b>. Данный конфиг подойдёт сразу под amd64 и arm64 архитектуры.</p>
<p>Если Вы хотите поднять Webtop не светя порты наружу, прочитайте про <b><a target="_blank" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html#hostname_proxy">проксирование приложения в NPM через хостнейм</a></b>. После усвоения материала используйте этот <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Misc/webtop/1-webtop-linuxserver-amd64-aarch64-with-network/docker-compose.yml">фаил docker-dompose</a></b>. В противном случае используйте первый вариант, изначально пост писался именно под него!
<br><br>
<p>В конфиге обязательно обращаем внимание на строки <b>PUID</b> и <b>PGID</b>. Если нам это нужно то в них мы можем вписать идентификатор пользователя и группы, от которого хотим запускать контейнер!</p>
<p>Для этого их необходимо раскомментировать. А сами ID можно посмотреть написав в терминале:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">id</span></div>
<p>Самые распространённые идентификаторы <b>1000</b> и <b>1001</b></p>
<br>
<p>Также обратите внимание на строку</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">privileged: true #optional for KDE or i3</div>
<p>Её можно закомментировать - но только если мы не будем использовать окружение <b>KDE</b> или <b>i3</b>. Для них наоборот эта строка должна быть раскомментирована.</p>
<br>
<p>Ещё одна закомментированная строка</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"># - /var/run/docker.sock:/var/run/docker.sock #optional for docker inside docker</div>
<p>Её раскомментируйте, если собираетесь использовать докер внутри контейнера с webtop. Лично я такого не планирую.</p>
<br>
<p>В строке ports: выставляем необходимый порт на хостовой машине</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"> - 13390:3000</div>
<p>Я поставил 13390, вы можете поставить любой угодный. Главное не трогайте правую часть :3000 т.к. это порт внутри контейнера</p>
<br>
<p>Последний параметр который нужно рассмотреть:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">shm_size: "1gb" #optional</div>
<p>Этот параметр отвечает за количество выделяемой оперативной памяти под контейнер. По дефолту он равен 1gb. Можно поставить побольше если это нужно.</p>
<br>
<p>С настройкой закончили. Сохраняем конфиг.</p>
<br>
<blockquote>Я советую периодически проверять <b><a target="_blank" rel="nofollow" href="https://hub.docker.com/r/linuxserver/webtop/">webtop</a></b> на наличие новых версий. Или изменений конфига. </blockquote>
<br>
<p>Стартуем контейнер с <b>webtop</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br><br>
<p>Сразу посмотрим в браузере что у нас там поднялось по адресу</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">http://ip.адрес.вашего.сервера:13390</div>
<p>Порт 13390 меняйте на свой порт если вы его меняли.</p>
<br>
<a href="https://img.zzxc.ru/img/post-28/post-28-webtop-launch-1.png" target="_blank"><img border="0" alt="webtop launch" src="https://img.zzxc.ru/img/post-28/post-28-webtop-launch-1.png" /></a>
<br><br><br><br><br><br>
<H2>Про безопасность</H2>
<p><span style="color:#FF3152">Важно</span> одно дело поднять webtop в локальной сети где ваш контейнер за NAT'ом. И совсем другое дело поднять webtop на боевом сервере! Заранее зная ip и port зайти может по сути любой человек имейте это в виду. <u>Я не рекомендую поднимать webtop на боевом сервере, если вы не знаете как защитить его от посторонних</u>. Например с помощью фильтрации по ip.</p>
<br><br>
<h4>Универсальное решение</h4>
<p>Я достаточно долго искал универсальное решение и оно нашлось.</p>
<p>Во первых нужно отказаться от варианта с проксированием через внешний порт. Для этого нужно воспользоваться вторым фаилом docker-compose, который я добавил в статью. Но сначала обязательно прочтите про <b><a target="_blank" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html#hostname_proxy">проксирование приложения в NPM через хостнейм</a></b>. Также обязательно настройте правила ACL для дополнительного слоя защиты.</p>
<br><br>
<h4>Альтернативное решение</h4>
<p>Расскажу как я решил эту проблему в конкретном частном случае. Сам сервер на котором я поднимал webtop находится в oracle cloud и имеет 4 arm ядра ии 24 gb памяти.</p>
<p>У каждого клиента имеется встроенный firewall в личном кабинете аккаунта в котором по стандарту все порты закрыты. Я добавил новое правило в котором указал что на порт <b>13390</b> можно подключаться только с ipv4 адреса самого сервера.</p>
<br>
<a href="https://img.zzxc.ru/img/post-28/post-28-webtop-security-oracle-1.png" target="_blank"><img border="0" alt="webtop security oracle 1" src="https://img.zzxc.ru/img/post-28/post-28-webtop-security-oracle-1.png" /></a>
<br><br>
<p>После чего проверил заходя по очереди сначала со своего домашнего ip, затем через <b><a target="_blank" rel="dofollow" href="/2021/10/docker-socks5-proxy-amd64-arm64.html">socks5 proxy</a></b> поднятой на сервере с webtop. В результате с домашнего интернета я ничего не увидел, а через проксю как и ожидалось открылся webtop. Но такой способ защиты подойдёт далеко не для всех.</p>
<br><br><br><br><br><br>
<H2>Подключаем домен</H2>
<p>Для удобства можно подключить домен к webtop. Делать это будем при помощи <b><a target="_blank" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html">Nginx Proxy Manager</a></b>, о котором я писал недавно в одноимённой статье.</p>
<p>В <b>Nginx Proxy Manager</b>(далее <b>NPM</b>) создаём новый хост. Заполняем необходимую информацию.</p>
<ul>
<li>Домен либо поддомен</li>
<li>Ip адрес</li>
<li>Порт - <b>13390</b> (если вы не меняли его в <b>docker-compose.yml</b>)</li>
</ul>
<br>
<a href="https://img.zzxc.ru/img/post-28/post-28-npm-create-host-1.png" target="_blank"><img border="0" alt="webtop create host 1" src="https://img.zzxc.ru/img/post-28/post-28-npm-create-host-1.png" /></a>
<br><br>
<p>Нажимаем <b>Save</b> и ждём примерно 60 секунд.</p>
<p>После этого снова редактируем только что добавленный хост, нажав на три точки справа и <b>Edit</b>.</p>
<p>На этот раз отправляемся в раздел <b>SSL</b> в котором запрашиваем новый <b>ssl сертификат</b> для нашего домена - <b>Request a new SSL Certificate</b></p>
<br>
<a href="https://img.zzxc.ru/img/post-28/post-28-npm-create-host-2.png" target="_blank"><img border="0" alt="webtop create host 2" src="https://img.zzxc.ru/img/post-28/post-28-npm-create-host-2.png" /></a>
<br><br>
<p>И нажимаем кнопку <b>Save</b></p>
<p>Обратите внимание, что после нажатия кнопки <b>Save</b> не должно быть никаких ошибок. Если у вас всё же были какие то ошибки, скорее всего это связано с тем что у вас не успели обновиться записи в <b>DNS</b>, либо вы превысили лимиты(количество попыток) <b>LetsEncrypt</b>. В обоих случаях надо просто подождать и повторить попытку позже.</p>
<p>Если же у вас не выдало никаких ошибок с сертификатом, то сразу проверяем результат в браузере, открыв только что добавленный домен.</p>
<p>Мы должны увидеть страницу с <b>webtop</b> в конкретном случае с Archlinux + XFCE</p>
<br>
<a href="https://img.zzxc.ru/img/post-28/post-28-npm-create-host-3.png" target="_blank"><img border="0" alt="webtop create host 3" src="https://img.zzxc.ru/img/post-28/post-28-npm-create-host-3.png" /></a>
<br><br>
<p>Тут есть одна интересная деталь. Несмотря на то что вход по ip:port был разрешён только для определённого ip, в случае с доменом это правило не сработало. И у нас получается опять торчит наружу <strike>голопопый</strike> домен, который никак не защищён от посторонних. Предлагаю сразу решить эту проблему.</p>
<p>Отправляемся в <b>NPM</b> в раздел <b>Access Lists</b> и создаём новый <b>ACL</b> нажав на кнопку <b>Add Access List</b>. Назовём его по имени сервиса <b>webtop</b></p>
<br>
<a href="https://img.zzxc.ru/img/post-28/post-28-npm-create-host-4.png" target="_blank"><img border="0" alt="webtop create host 4" src="https://img.zzxc.ru/img/post-28/post-28-npm-create-host-4.png" /></a>
<br><br>
<p>Теперь придумываем логин и пароль посложнее и вписываем в соответствующие поля.</p>
<p>Я доверил создание пароля программе <b>pwgen</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">pwgen -c -n -s -B 20</div>
<br>
<a href="https://img.zzxc.ru/img/post-28/post-28-npm-create-host-5.png" target="_blank"><img border="0" alt="webtop create host 5" src="https://img.zzxc.ru/img/post-28/post-28-npm-create-host-5.png" /></a>
<br><br>
<p>На вкладке <b>Access</b> можно указать список дозволенных ip, но я специально не стал этого делать, т.к. планирую иногда предоставлять доступ другим людям. Если будете его заполнять, то на первой вкладке <b>Details</b> отключите radio-button <b>Satisfy Any</b> чтобы у вас работала сразу защита по ip и логин + пароль</p>
<p>Ну и всё - сохраняем правила. Теперь идём опять к списку доменов в <b>NPM</b> и для необходимого домена выставляем ACL: webtop</p>
<br>
<a href="https://img.zzxc.ru/img/post-28/post-28-npm-create-host-6.png" target="_blank"><img border="0" alt="webtop create host 6" src="https://img.zzxc.ru/img/post-28/post-28-npm-create-host-6.png" /></a>
<br><br>
<p>Теперь заходя на наш домен нам будет предложено сначала ввести логин и пароль, и если мы не введём правильные то нас никуда не пустит.</p>
<br>
<a href="https://img.zzxc.ru/img/post-28/post-28-npm-create-host-7.png" target="_blank"><img border="0" alt="webtop create host 7" src="https://img.zzxc.ru/img/post-28/post-28-npm-create-host-7.png" /></a>
<br><br>
<p>Иногда нужно почистить кэш браузера или зайти в приватном режиме либо с другого браузера.</p>
<br><br><br><br><br><br>
<H2>Полезные ссылки</H2>
<p><b><a target="_blank" rel="nofollow" href="https://hub.docker.com/r/linuxserver/webtop/">Docker Hub</a></b></p>
<p><b><a target="_blank" rel="nofollow" href="https://github.com/linuxserver/docker-webtop">Github</a></b></p>
<p><b><a target="_blank" rel="nofollow" href="https://docs.linuxserver.io/images/docker-webtop">docs.linuxserver.io</a></b></p>
<p><b><a target="_blank" rel="nofollow" href="https://fleet.linuxserver.io/image?name=linuxserver/webtop">fleet.linuxserver.io</a></b></p>
<p><b><a target="_blank" rel="nofollow" href="https://www.linuxserver.io/blog/2021-05-05-meet-webtops-a-linux-desktop-environment-in-your-browser">Анонс webtop на linuxserver</a></b></p>abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com2tag:blogger.com,1999:blog-244151671096808002.post-12538723586470416042022-01-03T16:55:00.097+03:002023-01-24T16:26:56.536+03:00Установка freshrss в docker контейнере + postgres<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2022/01/freshrss-docker-postgres.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="docker-compose + linuxserver + wireguard" border="0" src="https://img.zzxc.ru/img/post-27/logo-27-freshrss-docker-postgres.jpg"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Получать новости из соц.сетей не продуктивно. Все самые актуальные новости теряются в километрах развлекательного контента. Сегодня будем решать вопрос борьбы с прокрастинацией, а поможет нам в этом <b>freshrss</b>, который мы установим в docker контейнер и подключим к бд postgres
</div>
<a name='more'></a><br><br>
<H2>Необходимые требования</H2>
<p>Чтобы всё получилось нам понадобится:</p>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>Доменное имя. Можно бесплатный домен или поддомен</li>
<li>Установленный <b><a href="/p/virtualization-docker-full-install.html" target="_blank" >Docker + Docker-Compose</a></b></li>
<li>Установленный и настроенный <b><a href="/2021/09/nginx-proxy-manager-docker-compose.html" target="_blank" >Nginx Proxy Manager</a></b></li>
<li>15 - 45 минут времени</li>
</ul>
<br><br><br><br><br><br>
<H2>В двух словах о <b>freshrss</b></H2>
<p>Freshrss является агрегатором Rss лент. <b><a target="_blank" rel="nofollow" href="https://ru.wikipedia.org/wiki/RSS">Rss</a></b> это такой специальный формат написанный с использованием XML разметки, который предназначен для описания новостей конкретного сайта и/или разделов сайта.</p>
<p>В былые времена, когда социальные сети ещё не были мейнстримом, технологии Rss пользовались большой популярностью. Затем с появлением соц. сетей потихоньку ушли на второй план.</p>
<p>В данный момент соц.сети слишком агрессивно навязывающие популярный контент, не оставляют выбора и технология Rss становится снова востребованной. Тем более что сама технология никуда не уходила.</p>
<p>С помощью <b>freshrss</b> мы сможем подписаться и получать последние новости из наших любимых источников информации, если они у них есть. Все новости будут выводиться в приятном минималистичном дизайне в веб интерфейсе.</p>
<p>Полученные новости будут кэшироваться и разбиваться по тегам. Так же мы получим возможность разделять новости на прочитанные и непрочитанные.</p>
<p>Есть возможность менять дизайн, который выглядит приятно и не режет глаз.</p>
<p>Есть система плагинов, расширяющая основной функционал.</p>
<br><br><br><br><br><br>
<H2>Подготовка</H2>
<p>Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём необходимые директории для freshrss</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/misc/freshrss/{data,DB,extensions}</span></div>
<br>
<p>Сделаем нашего пользователя (не root !) владельцем этой директории</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/misc/freshrss</span></div>
<br><br><br><br><br><br>
<H2>Конфигурация и запуск</H2>
<p>Перейдём в директорию, которую мы создавали выше</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/misc/freshrss</span></div>
<br>
<p>Создадим фаил <b>docker-compose.yml</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<p>И заполняем его таким <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Misc/freshrss/1-freshrss-official-postgres/docker-compose.yml">таким содержанием</a></b>. Данный конфиг подойдёт сразу под amd64 и arm64 архитектур.</p>
<p>Если Вы хотите поднять FreshRSS не светя порты наружу, прочитайте про <b><a target="_blank" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html#hostname_proxy">проксирование приложения в NPM через хостнейм</a></b>. После усвоения материала используйте этот <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Misc/freshrss/1-freshrss-official-postgres-with-network/docker-compose.yml">фаил docker-dompose</a></b>. В противном случае используйте первый вариант, изначально пост писался именно под него!
<br><br>
<p>В конфиге обязательно обращаем внимание на строки <b>PUID</b> и <b>PGID</b>. Если нам это нужно то в них мы можем вписать идентификатор пользователя и группы, от которого хотим запускать контейнер!</p>
<p>Для этого их необходимо раскомментировать. А сами ID можно посмотреть написав в терминале:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">id</span></div>
<p>Самые распространённые идентификаторы <b>1000</b> и <b>1001</b></p>
<br><br>
<p>Следующим шагом мы придумываем логин и пароль для базы данных. И вписываем их в этот кусок конфига</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">- POSTGRES_DB=freshrss<br>
- POSTGRES_USER=freshrss<br>
- POSTGRES_PASSWORD=YOURPASSWORD</div>
<br><br>
<p>С настройкой закончили. Сохраняем конфиг.</p>
<br>
<blockquote>Я советую периодически проверять <b><a target="_blank" rel="nofollow" href="https://hub.docker.com/r/freshrss/freshrss">freshrss</a></b> на наличие новых версий. На момент написания статьи актуальная версия была <br> freshrss:1.19.2 </blockquote>
<br>
<p>Стартуем контейнер с <b>freshrss</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br><br><br><br><br><br>
<H2>Подключаем домен</H2>
<p>Пришло время подключить домен к freshrss. Делать это будем при помощи <b><a target="_blank" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html">Nginx Proxy Manager</a></b>, о котором я писал недавно в одноимённой статье.</p>
<p>В <b>Nginx Proxy Manager</b>(далее <b>NPM</b>) создаём новый хост. Заполняем необходимую информацию.</p>
<ul>
<li>Домен либо поддомен</li>
<li>Ip адрес</li>
<li>Порт - <b>13380</b> (если вы не меняли его в <b>docker-compose.yml</b>)</li>
</ul>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-npm-create-host.png" target="_blank"><img border="0" alt="freshrss npm domain" src="https://img.zzxc.ru/img/post-27/post-27-npm-create-host.png" /></a>
<br><br>
<p>Нажимаем <b>Save</b> и ждём примерно 60 секунд.</p>
<p>После этого снова редактируем только что добавленный хост, нажав на три точки справа и <b>Edit</b>.</p>
<p>На этот раз отправляемся в раздел <b>SSL</b> в котором запрашиваем новый <b>ssl сертификат</b> для нашего домена - <b>Request a new SSL Certificate</b></p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-npm-create-host-2.png" target="_blank"><img border="0" alt="freshrss npm add ssl to host 2" src="https://img.zzxc.ru/img/post-27/post-27-npm-create-host-2.png" /></a>
<br><br>
<p>И нажимаем кнопку <b>Save</b></p>
<p>Обратите внимание, что после нажатия кнопки <b>Save</b> не должно быть никаких ошибок. Если у вас всё же были какие то ошибки, скорее всего это связано с тем что у вас не успели обновиться записи в <b>DNS</b>, либо вы превысили лимиты(количество попыток) <b>LetsEncrypt</b>. В обоих случаях надо просто подождать и повторить попытку позже.</p>
<p>Если же у вас не выдало никаких ошибок с сертификатом, то сразу проверяем результат в браузере, открыв только что добавленный домен.</p>
<p>Мы должны увидеть страницу установки <b>freshrss</b></p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-install-1.png" target="_blank"><img border="0" alt="freshrss start install" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-install-1.png" /></a>
<br><br><br><br><br><br>
<H2>Установка freshrss</H2>
<p>Выбираем язык и переходим на следующий шаг</p>
<p>Тут установщик оповестит нас о том всё ли у нас готово для установки</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-install-2.png" target="_blank"><img border="0" alt="freshrss install 2" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-install-2.png" /></a>
<br><br>
<p>У нас всё отлично - переходим к следующему шагу</p>
<p>Так как мы устанавливаем в качестве бд postgres, выбираем его в списке и вводим необходимые данные для подключения к нему из docker-compose.yml</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-install-3.png" target="_blank"><img border="0" alt="freshrss install 3" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-install-3.png" /></a>
<br><br>
<p>Теперь придумываем сложный логин и пароль для учётной записи администратора. Остальных пользователей мы сможем поставить потом, если это будет нужно.</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-install-4.png" target="_blank"><img border="0" alt="freshrss install 4" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-install-4.png" /></a>
<br><br>
<p>На последнем шаге, чуточку подумав - система оповещает нас об успешной установке</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-install-5.png" target="_blank"><img border="0" alt="freshrss install 5" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-install-5.png" /></a>
<br><br>
<p>После этого мы авторизируемся и попадаем на главный экран</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-install-6.png" target="_blank"><img border="0" alt="freshrss install 6" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-install-6.png" /></a>
<br><br><br><br><br><br>
<H2>Настройка freshrss</H2>
<p>Для начала сменим внешний вид. Для этого нажимаем на значок шестеренки который располагается сверху и перейдём в пункт <b>Отображение</b></p>
<p>Лично мне приглянулся стиль <b>Alternative Dark</b> выбираем и применяем</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-settings-1.png" target="_blank"><img border="0" alt="freshrss settings 1" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-settings-1.png" /></a>
<br><br>
<p>Вот так - сразу гораздо лучше</p>
<br><br><br><br><br><br>
<H2>Чиним cron</H2>
<p>Freshrss использует специальный фаил внутри контейнера который называется actualize_script.php для того чтобы обновлять ленты RSS.</p>
<p>Используя freshrss в докере из коробки к сожалению эта фича не работает. Но мы делегируем выполнение этого функционала, штатному cron.</p>
<p>Для этого сначала установим его</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo apt install cron</span></div>
<br>
<p>Проверим что он запущен и работает</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo systemctl status cron</span></div>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-cron-1.png" target="_blank"><img border="0" alt="freshrss cron 1" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-cron-1.png" /></a>
<br><br>
<p>Мы будем запускать наше задание от root поэтому пишем</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo crontab -e</span></div>
<br>
<p>В самую нижнюю строчку добавляем наше задание</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">7,37 * * * * sudo /usr/bin/docker exec --user www-data freshrss php ./app/actualize_script.php > /tmp/FreshRSS.log 2>&1</div>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-cron-2.png" target="_blank"><img border="0" alt="freshrss cron 2" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-cron-2.png" /></a>
<br><br>
<p>Проверить результат очень просто</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-cron-3.png" target="_blank"><img border="0" alt="freshrss cron 3" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-cron-3.png" /></a>
<br><br><br><br><br><br>
<H2>Установка плагинов freshrss</H2>
<p>Плагины помогут нам расширить базовый функционал freshrss. Я покажу установку плагинов на примере плагина <b>ThreePanesView</b>.</p>
<p>Но сначала нам необходимо убедиться что у нас в системе установлен <b>Git</b>. Для этого напишем в терминале </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">git --version</span></div>
<br>
<p>Если гита у нас не оказалось то ставим его </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo apt install git</span></div>
<br>
<p>Кликаем по плагину и попадаем на <b><a target="_blank" rel="nofollow" href="https://framagit.org/nicofrand/xextension-threepanesview">репозиторий</a></b> автора.</p>
<p>Переходим в необходимую папку</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/misc/freshrss/extensions</span></div>
<br>
<p>Скачиваем плагин</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo git clone https://framagit.org/nicofrand/xextension-threepanesview.git</span></div>
<br>
<p>Теперь, обновив страницу с плагинами во freshrss мы увидим что у нас добавился новый плагин.</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-plugins-1.png" target="_blank"><img border="0" alt="freshrss plugins 1" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-plugins-1.png" /></a>
<br><br>
<p>Активируем его кнопкой <b>Включить</b></p>
<p>Теперь переходя на главную страницу freshrss мы обнаружим что теперь у нас 3 панели вместо двух. Очень удобно, т.к. можно прямо на месте прочитать интересующую нас новость.</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-plugins-2.png" target="_blank"><img border="0" alt="freshrss plugins 2" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-plugins-2.png" /></a>
<br><br><br><br><br><br>
<H2>Использование freshrss</H2>
<p>Пришло время показать как пользоваться этим замечательным продуктом.</p>
<p>Так как сидеть от админского пользователя небезопасно, сделаем ещё одного пользователя.</p>
<p>Для этого отправляемся в пункт меню <b>Управление пользователями</b>. И создаём там нового пользователя</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-1.png" target="_blank"><img border="0" alt="freshrss users 1" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-1.png" /></a>
<br><br>
<p>Перелогиниваемся за вновь созданного пользователя</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-2.png" target="_blank"><img border="0" alt="freshrss users 2" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-2.png" /></a>
<br><br>
<p>Сразу поменяем внешний вид и и активируем необходимые плагины</p>
<p>Нас интересует кнопка <b>Управление подписками</b></p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-3.png" target="_blank"><img border="0" alt="freshrss users 3" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-3.png" /></a>
<br><br>
<p>Кликнув по ней попадаем как не странно на страницу с подписками. Я покажу пример на основе хабра.</p>
<p>Сразу создадим новую категорию</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-4.png" target="_blank"><img border="0" alt="freshrss users 4" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-4.png" /></a>
<br><br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-5.png" target="_blank"><img border="0" alt="freshrss users 5" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-5.png" /></a>
<br><br>
<p>Отправляемся на Habr. Мне приглянулся хаб <b><a target="_blank" rel="nofollow" href="https://habr.com/ru/hub/infosecurity/">Информационная безопасность</a></b>. Кликаем по значку Rss и ссылка скопируется в буфер обмена.</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-6.png" target="_blank"><img border="0" alt="freshrss users 6" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-6.png" /></a>
<br><br>
<p>Остаётся лишь добавить эту ссылку в нужный нам раздел в freshrss. На странице <b>Управление подписками</b> нажимаем <b>Добавить RSS-ленту</b></p>
<p>Вставляем ссылку из буфера и выбираем категорию</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-7.png" target="_blank"><img border="0" alt="freshrss users 7" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-7.png" /></a>
<br><br>
<p>И нажимаем добавить</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-8.png" target="_blank"><img border="0" alt="freshrss users 8" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-8.png" /></a>
<br><br>
<p>После чего на главной странице у нас появился фид хаба с хабра в одноимённом разделе</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-9.png" target="_blank"><img border="0" alt="freshrss users 9" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-users-9.png" /></a>
<br><br>
<p>Остаётся лишь подписаться на интересующие вас фиды.</p>
<br><br><br><br><br><br>
<H2>Подключаем мобильное приложение</H2>
<p>Как оказалось у freshrss есть мобильное приложение, которое можно скачать с <b><a target="_blank" rel="nofollow" href="https://f-droid.org/en/packages/fr.chenry.android.freshrss/">F-Droid</a></b>. Возможно оно и не выглядит очень красиво, но свою задачу оно выполняет. А именно синхронизирует данные о прочитанных фидах между телефоном и <b>freshrss</b>.</p>
<p>Если вы просто скачаете приложение и попытаетесь авторизоваться в нём - ничего не заработает. Сначала необходимо разрешить использование API в настройках самого freshrss.</p>
<p>Для этого идём в пункт <b>Аутентификация</b> и в нём отмечаем чекбокс <b>Позволить API доступ (необходимо для мобильных приложений)</b> в положение вкл.</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-mobileapp-1-1.png" target="_blank"><img border="0" alt="freshrss mobileapp 1" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-mobileapp-1-1.png" /></a>
<br><br>
<p>Перелогиниваемся в созданный ранее <u>не админский</u> аккаунт. В котором идём в <b>настройки профиля</b></p>
<p>Тут у нас появился новый пункт <b>Настройки API</b>. Необходимо придумать пароль для мобильного приложения и вписать его в <b>Пароль API</b></p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-mobileapp-2.png" target="_blank"><img border="0" alt="freshrss mobileapp 2" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-mobileapp-2.png" /></a>
<br><br>
<p>После чего в самом приложении необходимо будет вписать этот пароль.</p>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-mobileapp-3.png" target="_blank"><img border="0" alt="freshrss mobileapp 3" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-mobileapp-3.png" /></a>
<br><br>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-mobileapp-4.png" target="_blank"><img border="0" alt="freshrss mobileapp 4" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-mobileapp-4.png" /></a>
<br><br>
<br>
<a href="https://img.zzxc.ru/img/post-27/post-27-freshrss-mobileapp-5.png" target="_blank"><img border="0" alt="freshrss mobileapp 5" src="https://img.zzxc.ru/img/post-27/post-27-freshrss-mobileapp-5.png" /></a>
<br><br>
<p>На этом считаю установку и знакомство с freshrss успешно выполненными.</p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com0tag:blogger.com,1999:blog-244151671096808002.post-6168275147954966542021-12-24T11:58:00.214+03:002023-01-24T16:27:22.026+03:00Установка облака NextCloud в docker контейнере postgres + redis + amd64 или arm64<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2021/12/docker-nextcloud-postgres-redis-amd64.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="docker-compose + linuxserver + wireguard" border="0" src="https://img.zzxc.ru/img/post-26/logo-26-nextcloudlinuxserver-docker.png"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Сегодня будем поднимать облако <b>NextCloud</b> в докер контейнере. Получив в результате отличную альтернативу всяким проприетарным продуктам типа <b>яндекс диск</b>, <b>облако mail.ru</b>, <b>Dropbox</b>, <b>Google диск</b> и т.д.
</div>
<a name='more'></a><br><br>
<H2>Необходимые требования</H2>
<p>Чтобы всё получилось нам понадобится:</p>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>Доменное имя. Можно бесплатный домен или поддомен</li>
<li>Установленный <b><a href="/p/virtualization-docker-full-install.html" target="_blank" >Docker + Docker-Compose</a></b></li>
<li>Установленный и настроенный <b><a href="/2021/09/nginx-proxy-manager-docker-compose.html" target="_blank" >Nginx Proxy Manager</a></b></li>
<li>30 - 45 минут времени</li>
</ul>
<br><br><br><br><br><br>
<H2>В двух словах о <b>Nextcloud</b></H2>
<p>Бесплатный.</p>
<p>Умеет шифровать данные.</p>
<p>Умеет синхронизировать фаилы и папки.</p>
<p>Умеет работать по протоколу сетевой файловой системы <b>WebDAV</b>.</p>
<p>Обладает большим количеством плагинов и дополнений. Есть например плагин для хранения и структурирования ссылок под названием <b>Bookmarks</b>. Плагин <b>аудиоплеер</b>. Плагин для <b>ведения базы паролей</b>. Плагин для <b>редактирования контактов</b> - имена, номера телефонов, почта, дополнительные поля с быстрым поиском. Даже книга с рецептами присутствует)</p>
<p>Кроссплатформенный. Изначально работает в браузере, а так же существуют клиенты под <b>Windows</b>, <b>Linux</b>, <b>MacOS</b>, <b>Android</b>, <b>iOS</b>. Скачать клиент под необходимое п.о. можно <b><a target="_blank" rel="nofollow" href="https://nextcloud.com/install/#install-clients">отсюда</a></b>.</p>
<p>Имеет очень гибкую систему управления пользователями и группами. Такой функционал очень пригодится бизнесу, можно разграничивать разные отделы и иметь полный контроль над всем.</p>
<p>При установке дополнения появляется возможность делиться фаилами через веб-ссылки.</p>
<br><br><br><br><br><br>
<H2>Подготовка</H2>
<p>Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём необходимые директории для Nextcloud</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/nextcloud/nextcloud/{apps,config,data}</span></div>
<br>
<p>Сделаем нашего пользователя (не root !) владельцем этой директории</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/nextcloud/</span></div>
<br><br><br><br><br><br>
<H2>Конфигурация и запуск</H2>
<p>Перейдём в директорию, которую мы создавали выше</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/nextcloud</span></div>
<br>
<p>Создадим фаил <b>docker-compose.yml</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<p>И заполняем его таким <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Cloud/nextcloud/1-nectloud-official-postgres-redis-amd64-aarch64/docker-compose.yml">таким содержанием</a></b>. Данный конфиг подойдёт сразу под amd64 и arm64 архитектуры.</p>
<p>Если Вы хотите поднять NextCloud не светя порты наружу, прочитайте про <b><a target="_blank" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html#hostname_proxy">проксирование приложения в NPM через хостнейм</a></b>. После усвоения материала используйте этот <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Cloud/nextcloud/1-nectloud-official-postgres-redis-network-amd64-aarch64/docker-compose.yml">фаил docker-dompose</a></b>. В противном случае используйте первый вариант, изначально пост писался именно под него!
<br><br>
<p>В конфиге обязательно обращаем внимание на строки <b>PUID</b> и <b>PGID</b>. Если нам это нужно, то в них мы можем вписать идентификатор пользователя и группы, от которого хотим запускать контейнер!</p>
<p>Для этого их необходимо раскомментировать. А сами ID можно посмотреть написав в терминале:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">id</span></div>
<p>Самые распространённые идентификаторы <b>1000</b> и <b>1001</b></p>
<br><br>
<p>Следующим шагом мы придумываем логин и пароль для базы данных. И вписываем их в этот кусок конфига</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">- POSTGRES_DB=nextcloud<br>
- POSTGRES_USER=nextcloud<br>
- POSTGRES_PASSWORD=YOURPASSWORD</div>
<br><br>
<p>Далее. Если это необходимо, то можно изменить название сервиса базы данных <b>postgres-nextcloud</b> на любое угодное. Мы его потом будем вписывать при установке вместо <b>localhost</b>!</p>
<p>С настройкой закончили. Сохраняем конфиг.</p>
<br>
<blockquote>Я советую периодически проверять <b><a target="_blank" rel="nofollow" href="https://hub.docker.com/_/nextcloud">DockerHub</a></b> на наличие новых версий. На момент написания статьи актуальная версия была <br> nextcloud:23.0.1 </blockquote>
<br>
<p>Стартуем контейнер с <b>NextCloud</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br>
<p>Выхлоп в терминале должен быть как на скрине ниже.</p>
<a href="https://img.zzxc.ru/img/post-26/post-26-2-container-start.png" target="_blank"><img border="0" alt="nextcloud container good start" src="https://img.zzxc.ru/img/post-26/post-26-2-container-start.png" /></a>
<br><br><br><br><br><br>
<H2>Подключаем домен</H2>
<p>Пришло время подключить домен к облаку. Делать это будем при помощи <b><a target="_blank" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html">Nginx Proxy Manager</a></b>, о котором я писал недавно в одноимённой статье.</p>
<p>В <b>Nginx Proxy Manager</b>(далее <b>NPM</b>) создаём новый хост. Заполняем необходимую информацию.</p>
<ul>
<li>Домен либо поддомен</li>
<li>Ip адрес</li>
<li>Порт - <b>13370</b> (если вы не меняли его в <b>docker-compose.yml</b>)</li>
</ul>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-3-1-npm-create-host.png" target="_blank"><img border="0" alt="nextcloud npm domain" src="https://img.zzxc.ru/img/post-26/post-26-3-1-npm-create-host.png" /></a>
<br><br>
<p>Нажимаем <b>Save</b> и ждём примерно 60 секунд.</p>
<p>После этого снова редактируем только что добавленный хост, нажав на три точки справа и <b>Edit</b>.</p>
<p>На этот раз отправляемся в раздел <b>SSL</b> в котором запрашиваем новый <b>ssl сертификат</b> для нашего домена - <b>Request a new SSL Certificate</b></p>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-4-npm-addssl-host.png" target="_blank"><img border="0" alt="nextcloud npm add ssl to host" src="https://img.zzxc.ru/img/post-26/post-26-4-npm-addssl-host.png" /></a>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-5-npm-addssl-host2.png" target="_blank"><img border="0" alt="nextcloud npm add ssl to host 2" src="https://img.zzxc.ru/img/post-26/post-26-5-npm-addssl-host2.png" /></a>
<br><br>
<p>И нажимаем кнопку <b>Save</b></p>
<p>Обратите внимание, что после нажатия кнопки <b>Save</b> не должно быть никаких ошибок. Если у вас всё же были какие то ошибки, скорее всего это связано с тем что у вас не успели обновиться записи в <b>DNS</b>, либо вы превысили лимиты(количество попыток) <b>LetsEncrypt</b>. В обоих случаях надо просто подождать и повторить попытку позже.</p>
<p>Если же у вас не выдало никаких ошибок с сертификатом, то сразу проверяем результат в браузере, открыв только что добавленный домен.</p>
<p>Мы должны увидеть страницу установки <b>NextCloud</b></p>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-6-nextcloud-start.png" target="_blank"><img border="0" alt="nextcloud start install" src="https://img.zzxc.ru/img/post-26/post-26-6-nextcloud-start.png" /></a>
<br><br><br><br><br><br>
<H2>Установка NextCloud</H2>
<p>Придумываем комбинацию из сложного логина и пароля для администратора облака и вписываем в соответствующие поля.</p>
<p>Так как мы хотим использовать <b>PostgreSQL</b> вместо <b>SQLite</b>, то нам нужно явно указать это. Для этого нажимаем <b>Хранилище и база данных</b></p>
<p>Откроется окно с дополнительными настройками.</p>
<p><b>Каталог с данными /Data</b> оставляем по умолчанию.</p>
<p>Выбираем пункт <b>PostgreSQL</b>. Нам необходимо вписать туда свои данные, которые находятся в фаиле <b>docker-compose.yml</b>.</p>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-7-2-nextcloud-db.png" target="_blank"><img border="0" alt="nextcloud db select" src="https://img.zzxc.ru/img/post-26/post-26-7-2-nextcloud-db.png" /></a>
<p>Обратите внимание на пункт <b>Хост базы данных</b>, в котором по стандарту уже вписано <b>localhost</b>. В самом начале я говорил что можно поменять название сервиса для базы данных. Если вы меняли его то вписывайте своё название, если не меняли то вместо <b>localhost</b> вписывайте <b>postgres-nextcloud</b></p>
<p>Внимательно проверяем корректность заполненных данных.</p>
<p>По желанию включаем или выключаем пункт <b>Установить рекомендуемые приложения</b>.</p>
<p>Нажимаем кнопку <b>Завершить установку</b>.</p>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-8-nextcloud-install.png" target="_blank"><img border="0" alt="nextcloud install" src="https://img.zzxc.ru/img/post-26/post-26-8-nextcloud-install.png" /></a>
<br><br>
<p>После установки нас перекидывает на страницу приветствия.</p>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-9-nextcloud-succsess.png" target="_blank"><img border="0" alt="nextcloud install succsess" src="https://img.zzxc.ru/img/post-26/post-26-9-nextcloud-succsess.png" /></a>
<p>На этом установку <b>NextCloud</b> можно считать выполненной успешно.</p>
<br><br><br><br><br><br>
<H2>Тюнинг NextCloud</H2>
<p>Наверняка вы замечали что если в админ панели, пойти в <b>Настройки</b> во вкладку <b>Система</b> и пролистнуть до версии php то там выставлены ограничения.</p>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-10-nextcloud-tuning-before.png" target="_blank"><img border="0" alt="nextcloud tuning before" src="https://img.zzxc.ru/img/post-26/post-26-10-nextcloud-tuning-before.png" /></a>
<br><br>
<p>Поменяв эти настройки мы можем в той или иной мере повлиять на производительность нашего облака.</p>
<p>Останавливаем контейнер</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose down</span></div>
<br>
<p>В папке рядом с <b>docker-compose.yml</b> создадим фаил <b>nextcloud.ini</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano nextcloud.ini</span></div>
<br>
<p>С таким содержанием (подправьте под ресурсы вашего сервера!)</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">upload_max_filesize=16G<br>
post_max_size=16G<br>
memory_limit=2G<br>
max_input_time 7200<br>
max_execution_time 7200</div>
<br>
<p>Отлично, фаил добавили, теперь необходимо раскомментировать его же в <b>docker-compose.yml</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<p>просто убираем комментарий и приводим из такого вида</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"># - ./nextcloud.ini:/usr/local/etc/php/conf.d/nextcloud.ini</div>
<br>
<p>к такому виду</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"> - ./nextcloud.ini:/usr/local/etc/php/conf.d/nextcloud.ini</div>
<br>
<p>Сохраняем. И стартуем</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br>
<p>Проверяем</p>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-11-nextcloud-tuning-after.png" target="_blank"><img border="0" alt="nextcloud tuning after" src="https://img.zzxc.ru/img/post-26/post-26-11-nextcloud-tuning-after.png" /></a>
<br><br>
<p>Теперь облако работает шустрее за счёт увеличения лимитов по оперативной памяти. Также мы увеличили время выполнения php скриптов. И увеличили размер максимально загружаемого фаила до 16 GB</p>
<br>
<h4>Возможные проблемы</h4>
<p>Иногда бывает что с релизами версия Php меняется. У некоторых неофициальных образов месторасположение папки с Php находится вообще в другом месте. В таком случае нам необходимо узнать точное расположение папки.</p>
<p>Для этого зайдём внутрь нашего контейнера</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker exec -it nextcloud-23 bash</span></div>
<br>
<p>Находясь внутри контейнера пробуем попасть в папку с Php</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /usr/local/etc/php/conf.d/</span></div>
<br>
<p>В некоторых неофициальных образах Nextcloud пхп находится тут: (напомню в данной статье мы ставим официальный образ)</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /etc/php*</span></div>
<br>
<p>Далее действуем исходя из полученных результатов. Прописываем полный путь до папки с Php в <b>docker-compose.yml</b> если он у вас отличается. И далее всё заработает как надо.</p>
<br><br><br><br><br><br>
<H2>Подключаем Redis</H2>
<p>Наверняка вы заметили его в docker-compose.yml в самом низу.</p>
<p>Находясь в папке рядом с docker-compose.yml останавливаем наш контейнер</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose down</span></div>
<br>
<p>Редактируем фаил docker-compose.yml</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<br>
<p>Тут нам нужно убрать комментарии из строк (поменяв пароль на свой)</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">- REDIS_HOST=redis-nextcloud<br>
- REDIS_HOST_PASSWORD=YOURREDISPASSWORD</div>
<p>а так же полностью расскоментировать сервис redis-nextcloud</p>
<p>Пароль должен быть такой же как в предыдущих строчках которые мы раскомментировали:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">redis-nextcloud:<br>
image: redis:alpine<br>
container_name: redis-nextcloud<br>
command: redis-server --requirepass YOURREDISPASSWORD<br>
restart: unless-stopped</div>
<br>
<p>Вновь стартуем наш контейнер</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br>
<p>Для того чтобы мы могли проверить работу Redis, поставим необходимые пакеты </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo apt install redis-tools</span></div>
<br>
<p>Проще всего проверить работу Redis, обратившись к нему по внутреннему адресу. Для этого сначала напишем</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker ps</span></div>
<br>
<p>и найдём там id'шник redis или его имя. В нашем случае имя <b>redis-nextcloud</b>. Используем это имя в следующей команде:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker inspect redis-nextcloud</span></div>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-12-nextcloud-redis-host-ip.png" target="_blank"><img border="0" alt="nextcloud redis host ip" src="https://img.zzxc.ru/img/post-26/post-26-12-nextcloud-redis-host-ip.png" /></a>
<br><br>
<p>Тут нас интересует секция IPAddress": XXX.XXX.XXX.XXX" она находится почти в самом низу.</p>
<p>Каждый раз этот ip будет разный. В моём случае это оказался 172.27.0.2</p>
<br>
<p>обратимся к нашему инстансу редиса по этому ip используя пароль который мы ему задавали</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">redis-cli -a YOURREDISPASSWORD -h 172.27.0.2 ping</span></div>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-13-nextcloud-redis-host-ping.png" target="_blank"><img border="0" alt="nextcloud redis host ping" src="https://img.zzxc.ru/img/post-26/post-26-13-nextcloud-redis-host-ping.png" /></a>
<br><br>
<p>В ответ мы получим <b>PONG</b></p>
<br>
<p>Теперь посмотрим как общаются Nextcloud и Redis</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">redis-cli -a YOURREDISPASSWORD -h 172.27.0.2 monitor</span></div>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-14-1-nextcloud-redis-host-monitor.png" target="_blank"><img border="0" alt="nextcloud redis host monitor ok" src="https://img.zzxc.ru/img/post-26/post-26-14-1-nextcloud-redis-host-monitor.png" /></a>
<br><br>
<p>Ответ должен быть OK</p>
<p>Переключимся на браузер с Nextcloud и обновим там страницу. В результате чего в логе мы увидим как побежали данные</p>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-15-nextcloud-redis-host-monitor-data.png" target="_blank"><img border="0" alt="nextcloud redis host monitor data" src="https://img.zzxc.ru/img/post-26/post-26-15-nextcloud-redis-host-monitor-data.png" /></a>
<br><br>
<p>На этом подключение Redis успешно завершено</p>
<br><br><br><br><br><br>
<H2>Включаем принудительный режим https</H2>
<p>Некоторые плагины требуют чтобы у нас был включен принудительный режим https. Например плагин для хранения паролей passwords.</p>
<p>Останавливаем контейнер</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose down</span></div>
<br>
<p>Теперь необходимо отредактировать фаил .../nextcloud/config/config.php</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo nano nextcloud/config/config.php</span></div>
<br>
<p>После второй строки вставляем строку</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">'overwriteprotocol' => 'https',</div>
<p>Внимательно, соблюдая отступы, там по 2 пробела в начале каждой новой строки. Должно получиться вот так:</p>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-16-nextcloud-overwriteprotocol.png" target="_blank"><img border="0" alt="nextcloud overwriteprotocol https" src="https://img.zzxc.ru/img/post-26/post-26-16-nextcloud-overwriteprotocol.png" /></a>
<br><br>
<p>Стартуем наш контейнер и проверяем что всё ок</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-17-nextcloud-passwords-no-error.png" target="_blank"><img border="0" alt="nextcloud passwords no error" src="https://img.zzxc.ru/img/post-26/post-26-17-nextcloud-passwords-no-error.png" /></a>
<br><br><br><br><br><br>
<H2>Увеличиваем размер чанков</H2>
<p>Есть один неприятный баг. Проявляется этот баг при загрузке больших фаилов, пишет ошибку 504 и не загружает фаил</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">Error when assembling chunks, status code 504</div>
<p>Судя по <b><a target="_blank" rel="nofollow" href="https://github.com/nextcloud/server/issues/17992">тикету на гитхабе</a></b> - его не могут зафиксить уже несколько лет.</p>
<p>Покопавшись, вроде получилось его побороть. Дело в том что NextCloud из коробки делит фаилы на чанки(chunks). По стандарту размер одного чанка равен 10 MB</p>
<p>Когда мы грузим большой фаил, видимо всё упирается в производительность диска и таймауты php и что то не срабатывает как надо.</p>
<p>Для улучшения картины в лучшую сторону мы увеличим раздел чанков. Для этого необходимо зайти внутрь нашего контейнера и послать ему необходимые параметры</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data <span style="color:#ffdd31">nextcloud-23</span> php -f /var/www/html/occ config:app:set files max_chunk_size --value 20971520</span></div>
<br>
<p>Тут необходимо вместо nextcloud-23 вписать имя вашего контейнера с NextCloud. Вот так:</p>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-18-nextcloud-increase-chunk-size.png" target="_blank"><img border="0" alt="nextcloud increase chunk size" src="https://img.zzxc.ru/img/post-26/post-26-18-nextcloud-increase-chunk-size.png" /></a>
<br><br>
<p>Я пробовал на фаиле в 4 GB и данное сообщение не появлялось, однако, на фаиле в 8 GB оно появлялось, но через какое то время фаил всё равно загружался и был полностью рабочим.</p>
<br><br><br><br><br><br>
<H2 id="nextcloud-cron">Чиним cron</H2>
<p>Nextcloud использует специальный фаил cron.php для того чтобы инициировать такие процессы как сканирование фаилов, музыки, очистку мусора и другие. Желательно выполнять этот фаил каждые 5-10 минут.</p>
<p>Используя NextCloud в докере из коробки к сожалению эта фича не работает и приходится использовать режим <b>AJAX</b>, который выполняет фаил cron.php при загрузке каждой страницы. Это создаёт дополнительную нагрузку на сервер.</p>
<p>Мы делегируем выполнение этого функционала, штатному cron. Для этого сначала установим его</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo apt install cron</span></div>
<br>
<p>Проверим что он запущен и работает</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo systemctl status cron</span></div>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-19-nextcloud-cron.png" target="_blank"><img border="0" alt="nextcloud cron runing" src="https://img.zzxc.ru/img/post-26/post-26-19-nextcloud-cron.png" /></a>
<br><br>
<p>Мы будем запускать наше задание от root поэтому пишем</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo crontab -e</span></div>
<br>
<p>В самую нижнюю строчку добавляем наше задание</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">*/5 * * * * sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/cron.php</div>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-20-nextcloud-cron.png" target="_blank"><img border="0" alt="nextcloud crontab -e" src="https://img.zzxc.ru/img/post-26/post-26-20-nextcloud-cron.png" /></a>
<br><br>
<p>Сохраняем и выходим. Ждём 5 минут и проверяем результат</p>
<br>
<a href="https://img.zzxc.ru/img/post-26/post-26-21-nextcloud-cron-success.png" target="_blank"><img border="0" alt="nextcloud cron success" src="https://img.zzxc.ru/img/post-26/post-26-21-nextcloud-cron-success.png" /></a>
<br><br><br><br><br><br>
<H2>Обновление Nextcloud</H2>
<p>Периодически для <b>Nextcloud</b> выходят обновления, рассмотрим как правильно обновиться.</p>
<p><b>Внимание</b>! Все обновления Nextcloud стоит делать последовательно, не перескакивая через версию. Например если у Вас была версия 21.x.x то чтобы обновиться на версию 23.x.x необходимо сначала обновить nextcloud до версии 22.x.x и только потом уже до 23.x.x ! </p>
<p>Переходим в директорию с nextcloud</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/nextcloud</span></div>
<br><br>
<p>Тушим контейнер</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose down</span></div>
<br><br>
<p>Посмотрим на структуру фаилов и директорий</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">ls</span></div>
<br>
<a href="https://img.zzxc.ru/img/post-26/nextcloud-update-filestructure.png" target="_blank"><img border="0" alt="nextcloud update filestructure" src="https://img.zzxc.ru/img/post-26/nextcloud-update-filestructure.png" /></a>
<br><br>
<p>Создаём папку, куда свалим нашу предыдущую рабочую версию</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">mkdir old</span></div>
<br><br>
<p>Скопируем в эту директорию все фаилы от предыдущей рабочей версии</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo cp -r DB docker-compose.yml nextcloud nextcloud.ini old</span></div>
<br><br>
<p>Редактируем фаил <b>docker-compose.yml</b> заменив в нём версию образа nextcloud на более новую. Версии можно посмотреть в <b><a target="_blank" rel="nofollow" href="https://hub.docker.com/_/nextcloud">DockerHub</a></b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<br>
<a href="https://img.zzxc.ru/img/post-26/nextcloud-update-compfile.png" target="_blank"><img border="0" alt="nextcloud update compfile" src="https://img.zzxc.ru/img/post-26/nextcloud-update-compfile.png" /></a>
<br><br>
<p>Поднимаем контейнер с новой версией</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br><br>
<p>Открываем Nextcloud в браузере. Нас приветствует мастер обновления.</p>
<a href="https://img.zzxc.ru/img/post-26/nextcloud-update-wizard.png" target="_blank"><img border="0" alt="nextcloud update wizard" src="https://img.zzxc.ru/img/post-26/nextcloud-update-wizard.png" /></a>
<br><br>
<p>Запускаем обновление</p>
<a href="https://img.zzxc.ru/img/post-26/nextcloud-update-wizard-2.png" target="_blank"><img border="0" alt="nextcloud update wizard 2" src="https://img.zzxc.ru/img/post-26/nextcloud-update-wizard-2.png" /></a>
<br><br>
<p>Ожидаем какое то время. В результате визард предложит перейти в nextcloud, что завершит процедуру обновления.</p>
<a href="https://img.zzxc.ru/img/post-26/nextcloud-update-wizard-3.png" target="_blank"><img border="0" alt="nextcloud update wizard 3" src="https://img.zzxc.ru/img/post-26/nextcloud-update-wizard-3.png" /></a>
<br><br>
<p>Кстати на скрине видно что были отключены некоторые плагины. В действительности после того как я перешёл в облако, все эти плагины были включены и работали, несмотря на то что в сообщении написано что они не совместимы.</p>
<p>Обновление на новую версию завершено.</p>
<br><br><br><br><br><br>
<H2>Полезные команды</H2>
<p>Рассмотрим специальные служебные команды для NextCloud. Все эти команды подаются в качестве параметров на occ.php</p>
<p>Во всех приведённых ниже командах не забудьте заменить имя контейнера <b>nextcloud-23</b> на своё</p>
<h4>Плагины</h4>
<p>Отобразить список плагинов</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ app:list</span></div>
<br>
<p>Установить плагин</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ app:install files_mindmap</span></div>
<br>
<p>Удалить плагин</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ app:remove files_mindmap</span></div>
<br>
<p>Включить плагин. Например Activity</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ app:enable activity</span></div>
<br>
<p>Отключить плагин. Например Activity</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ app:disable activity</span></div>
<br>
<p>Обновить все плагины (либо вместо --all указать нужный плагин)</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ app:update --all</span></div>
<br>
<p>Получить полный путь папки с плагином. Например плагина Mind Map</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ app:getpath files_mindmap</span></div>
<br><br><br>
<h4>Пользователи</h4>
<p>Отключить юзера</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ user:disable testuser</span></div>
<br>
<p>Включить юзера</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ user:enable testuser</span></div>
<br>
<p>Удалить юзера</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ user:delete testuser</span></div>
<br><br><br>
<h4>Etc</h4>
<p>Произвести сканирование на предмет наличия новых фаилов</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ files:scan --all</span></div>
<br>
<p>Произвести поиск недостоющих индексов в бд</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ db:add-missing-indices</span></div>
<br>
<p>Включить режим обслуживания</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ maintenance:mode --on</span></div>
<br>
<p>Отключить режим обслуживания</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ maintenance:mode --off</span></div>
<br>
<p>Отобразить список доверенных доменов</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ config:system:get trusted_domains</span></div>
<br>
<p>Добавить доверенный домен. В поле value вписываем ip либо домен</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/occ config:system:set trusted_domains 2 --value=http://127.0.0.1</span></div>
<br>
<p>Выполнить cron.php</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo /usr/bin/docker exec -u www-data nextcloud-23 php -f /var/www/html/cron.php</span></div>
<br>
<p>Остальные команды можно найти <b><a target="_blank" rel="nofollow" href="https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/occ_command.html">тут</a></b></p>
<p>На этом всё. Все молодцы кто до сюда дошёл и у кого всё получилось!</p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com18tag:blogger.com,1999:blog-244151671096808002.post-9598721113023128382021-10-11T18:47:00.126+03:002023-01-24T16:27:56.405+03:00Поднимаем socks5 proxy в докер контейнере<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2021/10/docker-socks5-proxy-amd64-arm64.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="docker-compose + linuxserver + wireguard" border="0" src="https://img.zzxc.ru/img/post-24/logo-24-docker-3proxy-socks5.jpg"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Настало время рассказать как очень быстро и просто поднять <b>socks5 ipv4</b> прокси в докер контейнере. В данной статье рассмотрим сразу 2 разных образа - для <b>amd64</b> и для <b>arm64</b> архитектур.
</div>
<a name='more'></a><br><br>
<H2>Необходимые требования</H2>
<p>Чтобы всё получилось нам понадобится:</p>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>Установленный <b><a href="/p/virtualization-docker-full-install.html" target="_blank" >Docker + Docker-Compose</a></b></li>
<li>10 - 15 минут времени</li>
</ul>
<br><br><br><br><br><br>
<h2>В двух словах про socks5 proxy</h2>
<p>В последнее время сфера применения прокси заметно увеличилась.</p>
<ul>
<li>Самый распространённый вариант использования прокси <b>анонимность</b>. Прокси может скрыть настоящий ip адрес, к тому же socks5 ещё и умеет делать DNS запросы.</li>
<li>Для <b>SEO задач</b>. Парсинг / Автоматизация и т.д.</li>
<li>Ещё один вариант применения прокси <b>для усиления безопасности</b>. Например Вы разрешаете в фаерволе доступ к какому то сервису только с ip адреса прокси. И далее раздаёте доступ своим сотрудникам, которые с этим сервисом работают.</li>
<li>В ситуациях, когда контент который мы хотим посмотреть недоступен для нашего региона или вообще заблокирован доступ для целой страны.</li>
<li>В некоторых случаях прокси помогает улучшить <b>Ping</b> и <b>Delay</b> в играх и / или специальном П.О.</li>
<li>Другое...</li>
</ul>
<p>Кому то будет полезно посмотреть информацию по <b><a target="_blank" rel="dofollow" href="/p/proxy-types.html">классификации ip адресов и прокси</a></b>, перед тем как приступить. И можно начинать.</p>
<br><br><br><br><br><br>
<H2>Поднимаем socks5 proxy для архитектуры <span style="color:#FF3152">amd64</span> в одну команду</H2>
<p>Для архитектуры <b>amd64</b> мы будем использовать репозиторий <b><a target="_blank" rel="nofollow" href="https://hub.docker.com/r/olebedev/socks5">olebedev/socks5</a></b></p>
<br>
<p>Синтаксис команды:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker run -d <span style="color:#ffdd31">--name socks5_amd64</span> <span style="color:#f39c12">-p 28131:1080</span> <span style="color:#2980b9">-e PROXY_USER=YOURPROXYLOGIN</span> <span style="color:#FF3152">-e PROXY_PASSWORD=YOURPROXYPASSWORD</span> <span style="color:#7f8c8d">--restart=unless-stopped</span> olebedev/socks5</span></div>
<br>
<p><b><span style="color:#ffdd31">--name</span></b> отвечает за имя контейнера и является необязательным параметром</p>
<p><b><span style="color:#f39c12">-p 28131:1080</span></b> порт прокси. меняем только тот порт который стоит до двоеточия, то есть <b>28131</b> - меняем на любой угодный. <b>1080</b> это порт внутри контейнера и его стоит оставить как есть!</p>
<p><b><span style="color:#2980b9">PROXY_USER=...</span></b> желаемый логин прокси.</p>
<p><b><span style="color:#FF3152">PROXY_PASSWORD=...</span></b> желаемый пароль прокси. Советую делать от 20 символов, если не хотите чтобы прокси использовал ещё кто то кроме вас.</p>
<p><b><span style="color:#7f8c8d">--restart=unless-stopped</span></b> при возникновения какого либо сбоя будет перезагружать контейнер с проксёй до тех пор пока вы сами его не остановите.</p>
<p>Внимательно изучив команду, замените её своими данными в нужных местах и вставляете в терминал. Дальше докер всё сделает сам.</p>
<p>На некоторых хостингах понадобится дополнительно разрешать трафик на выбранный порт. Например на инстансах от оракла, необходимо открыть порт через веб файрвол. То есть открыть порт <b>28131</b>, если вы его не меняли.</p>
<br><br><br><br><br><br>
<H2>Поднимаем socks5 proxy для архитектуры <span style="color:#FF3152">arm64</span> в одну команду</H2>
<p>Для архитектуры <b>arm64</b> мы будем использовать репозиторий <b><a target="_blank" rel="nofollow" href="https://hub.docker.com/r/torquemada163/aarch64-3proxy-scaleway">torquemada163/aarch64-3proxy-scaleway</a></b></p>
<br>
<p>Синтаксис команды:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker run -dt <span style="color:#ffdd31">--name socks5_aarch64</span> <span style="color:#f39c12">-e CRED='YOURPROXYLOGIN:CL:YOURPROXYPASSWORD'</span> <span style="color:#2980b9">-p 28130:3128</span> <span style="color:#FF3152">-p 28131:1080</span> <span style="color:#7f8c8d">--restart always</span> torquemada163/aarch64-3proxy-scaleway</span></div>
<br>
<p><b><span style="color:#ffdd31">--name</span></b> отвечает за имя контейнера и является необязательным параметром</p>
<p><b><span style="color:#f39c12">CRED='YOURPROXYLOGIN:CL:YOURPROXYPASSWORD'</span></b> логин и пароль прокси. обратите внимание что <b>:CL:</b> нужно оставить как есть и заменить только <b>YOURPROXYLOGIN</b> и <b>YOURPROXYPASSWORD</b> на любые угодные вам. Опять таки делайте их помощнее, если не желаете заниматься благотворительностью.</p>
<p><b><span style="color:#2980b9">-p 28130:3128</span></b> порт http прокси. меняем только тот порт который стоит до двоеточия. То есть <b>28130</b> меняем на любой угодный. <b>3128</b> это порт внутри контейнера и его стоит оставить как есть!</p>
<p><b><span style="color:#FF3152">-p 28131:1080</span></b> порт socks5 прокси. меняем только тот порт который стоит до двоеточия. То есть <b>28131</b> меняем на любой угодный. <b>1080</b> это порт внутри контейнера и его стоит оставить как есть!</p>
<p><b><span style="color:#7f8c8d">--restart=unless-stopped</span></b> при возникновения какого либо сбоя будет перезагружать контейнер с проксёй до тех пор пока вы сами его не остановите.</p>
<p>На некоторых хостингах понадобится дополнительно разрешать трафик на выбранный порт. Например на инстансах от оракла, необходимо открыть порт через веб файрвол. То есть открыть порт <b>28131</b>, если вы его не меняли.</p>
<br><br><br><br><br><br>
<H2>Поднимаем socks5 proxy для архитектур <span style="color:#FF3152">amd64</span> и <span style="color:#FF3152">arm64</span> при помощи docker-compose</H2>
<p>Кто то любит поднимать контейнеры используя нативный <b>docker</b>, а кому то больше нравится <b>docker-compose</b>. Поэтому рассмотрим вариант поднятия socks5 сразу для <b>amd64</b> и <b>arm64</b> архитектур при помощи docker-compose.</p>
<p>Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём директорию под ipv4 socks5 proxy</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/proxy/ipv4-socks5-proxy</span></div>
<br>
<p>Меняем владельца папки с рута на нашего пользователя</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/proxy/ipv4-socks5-proxy</span></div>
<br>
<p>Переходим в директорию с Socks5 proxy</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/proxy/ipv4-socks5-proxy</span></div>
<br>
<p>Создаём фаил docker-compose.yml</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<p>И заполняем его данными в зависимости от архитектуры процессора.</p>
<p>Для архитектуры <b>amd64</b> берём <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Proxy/socks5-ipv4/1-olebedev-socks5%5Bamd64%5D/docker-compose.yml">такую заготовку</a></b>
<br>Для архитектуры <b>arm64</b> <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Proxy/socks5-ipv4/2-torquemada163-aarch64-3proxy-scaleway%5Baarch64%5D/docker-compose.yml">такую</a></b></p>
<br>
<p>После этого правим настройки под себя и стартуем контейнер</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br><br><br><br><br><br>
<H2>Проверяем работу прокси</H2>
<p>Проверить работу прокси можно выбрав в браузере соответствующий пункт. В разных браузерах он называется по разному, поэтому я опишу на примере плагина <b><a href="https://addons.mozilla.org/en-US/firefox/addon/foxyproxy-standard/" target="_blank" rel="nofollow">FoxyProxy standart для Firefox</a></b> </p>
<p>Устанавливаем плагин и идём в его настройки</p>
<a href="https://img.zzxc.ru/img/post-24/post-24-3-socks5-foxy1.jpg" target="_blank"><img border="0" alt="socks5 proxy foxyproxy" src="https://img.zzxc.ru/img/post-24/post-24-3-socks5-foxy1.jpg" /></a>
<br><br>
<ul>Добавляем новую прокси
<li> Название или описание: Любое</li>
<li> Цвет: Любой, бывает полезно </li>
<li> Включено: On </li>
<li> Тип прокси: Socks5 </li>
<li> Прокси IP адрес или имя DNS: ваш ip proxy </li>
<li> Порт: 28131 (либо ваш порт) </li>
<li> Имя пользователя: YOURPROXYLOGIN (логин от вашего прокси) </li>
<li> Пароль: YOURPROXYPASSWORD (пароль от вашего прокси) </li>
<li> Send DNS through SOCKS5 proxy: On </li>
</ul>
<br>
<a href="https://img.zzxc.ru/img/post-24/post-24-4-socks5-foxy2.jpg" target="_blank"><img border="0" alt="socks5 proxy foxyproxy edit" src="https://img.zzxc.ru/img/post-24/post-24-4-socks5-foxy2.jpg" /></a>
<br><br><br><br><br><br>
<h2>Посмотрим что у нас получилось</h2>
<p>Я поднимал сразу на нескольких разных впсках как на arm64 так и на amd64. Обычным докером и через докер-композ. И всё отлично работает!</p>
<a href="https://img.zzxc.ru/img/post-24/post-24-1-socks5-result1.jpg" target="_blank"><img border="0" alt="socks5 proxy good result 1" src="https://img.zzxc.ru/img/post-24/post-24-1-socks5-result1.jpg" /></a>
<br><br>
<a href="https://img.zzxc.ru/img/post-24/post-24-2-socks5-result2.jpg" target="_blank"><img border="0" alt="socks5 proxy good result 2" src="https://img.zzxc.ru/img/post-24/post-24-2-socks5-result2.jpg" /></a>
<br><br><br>
<p>Ну всё, все молодцы кто до сюда дочитал</p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com7tag:blogger.com,1999:blog-244151671096808002.post-72505124585013149752021-09-19T02:35:00.049+03:002023-01-24T16:28:22.335+03:00File Browser в docker контейнере<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2021/09/file-browser-docker-compose.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="docker-compose + linuxserver + wireguard" border="0" src="https://img.zzxc.ru/img/post-23/logo-23-file-manager.jpg"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Давно искал себе панельку - простую и легковесную. Чтобы не было каких то непонятных фич которые нагружают процессор. Чтобы была возможность редактирования фаилов через браузер и возможность делиться ссылкой на скачивания при этом была возможность устанавливать пароль.
</div>
<a name='more'></a><br><br>
<H2>Необходимые требования</H2>
<p>Чтобы всё получилось нам понадобится:</p>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>Установленный <b><a href="/p/virtualization-docker-full-install.html" target="_blank" >Docker + Docker-Compose</a></b></li>
<li>15 - 20 минут времени</li>
</ul>
<br><br><br><br><br><br>
<h2>Подробнее про File Browser</h2>
<p>Со временем я пришёл к выводу что не хочу пользоваться проприоритарными облачными сервисами(<b>dropbox</b>, <b>яндекс диск</b>, <b>облако google</b>/<b>mailru</b> и т.д.) для хранения и шаринга фаилов. Слишком много ограничений которые мне не по душе да и сами фаилы хранятся непонятно где. Я хочу хостить всё сам и делиться с тем кому нужно.</p>
<p>Опробовав разные решения, я остановился на <b><a target="_blank" rel="dofollow" href="/search/label/NextCloud">NextCloud</a></b>. В нём действительно много классных фич и он довольно удобный, но в то же время довольно тяжёлый.</p>
<p>Недавно я открыл для себя <b>File Browser</b> - лёгковесный и простой, в тоже время функциональный веб интерфейс с открытым исходным кодом.</p>
<p>К основным фичам File Browser относятся: </p>
<ul>
<li>Быстрая навигация по папкам</li>
<li>Возможность читать содержимое фаилов через веб интерфейс</li>
<li>Превью фаилов, например изображений</li>
<li>Встроенный плеер для видео и просмотра изображений</li>
<li>Перемещение / Копирование / Удаление фаилов и папок</li>
<li>Загрузка и Скачивание фаилов на сервер. С возможностью архивации (zip / tar / tar.gz и т.д.)</li>
<li>Аутентификация по логину и паролю в том числе создание пользователей с различными правами</li>
<li>Возможность устанавливать пароль и время жизни на shared ссылку на фаилы</li>
<li>Весь скрипт занимает 14 мегабайт в докер контейнере</li>
</ul>
<p><b><a target="_blank" rel="nofollow" href="https://filebrowser.org/">Официальный сайт</a></b> и страница FileBrowser на <b><a target="_blank" rel="nofollow" href="https://github.com/filebrowser/filebrowser">github</a></b>.</p>
<br><br><br><br><br><br>
<H2>Подготовка</H2>
<p>Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём директорию под File Browser</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/hosts/<span style="color:#FF3152">files.mydomain.com</span>/filebrowser/data</span></div>
<br>
<p>Необходимо вручную создать фаил <b>filebrowser.db</b> т.к если это не сделать, то докер создаст директорию вместо фаила и будет ошибка</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo touch /app/hosts/<span style="color:#FF3152">files.mydomain.com</span>/filebrowser/filebrowser.db</span></div>
<br>
<p>Меняем владельца папки с рута на нашего пользователя</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/hosts/<span style="color:#FF3152">files.mydomain.com</span>/filebrowser</span></div>
<br><br><br><br><br><br>
<H2>Конфигурация и запуск</H2>
<p>Переходим в директорию с Filebrowser</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/hosts/<span style="color:#FF3152">files.mydomain.com</span>/filebrowser</span></div>
<br>
<p>Создаём фаил docker-compose.yml</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<p>И заполняем его таким <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Misc/filebrowser/1-filebrowser/docker-compose.yml">таким содержанием</a></b>. Либо под <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Misc/filebrowser/2-filebrowser-arm64/docker-compose.yml">arm64</a></b></p>
<p>Если Вы хотите поднять File Browser не светя порты наружу, прочитайте про <b><a target="_blank" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html#hostname_proxy">проксирование приложения в NPM через хостнейм</a></b>. После усвоения материала используйте этот <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Misc/filebrowser/1-filebrowser-with-network/docker-compose.yml">фаил docker-dompose</a></b>. В противном случае используйте первый вариант, изначально пост писался именно под него!
<br><br>
<p>После этого стартуем наш контейнер</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br><br><br><br><br><br>
<h2>Посмотрим что у нас получилось</h2>
<p>Если вы ничего не меняли в фаиле docker-compose.yml то порт будет <b>11000</b>. Открываем в браузере</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">http://ip.адрес.вашего.сервера:порт</div>
<a href="https://img.zzxc.ru/img/post-23/post-23-1-file-browserfresh-install.jpg" target="_blank"><img border="0" alt="File Manager Fresh install" src="https://img.zzxc.ru/img/post-23/post-23-1-file-browserfresh-install.jpg" /></a>
<p>Стандартное имя пользователя и пароль <b>admin</b></p>
<br><br>
<p>Авторизировавшись попадаем на пустую папку</p>
<a href="https://img.zzxc.ru/img/post-23/post-23-2-file-browser-loggedin.jpg" target="_blank"><img border="0" alt="File browser success" src="https://img.zzxc.ru/img/post-23/post-23-2-file-browser-loggedin.jpg" /></a>
<p>В пункте <b>Settings > Profile Settings</b> следует сразу поменять пароль администратора. Советую поставить что нибудь посложнее, а не идти по пути наименьшего сопротивления.</p>
<p>В пункте <b>Settings > Share Managment</b> будут содержаться ссылки со статусом share. Например вы загрузили фаил расшарили его задав при этом длительность сколько эта шара будет доступна по времени и опционально поставили на неё пароль. Дальше все такие фаилы будут попадать в этот раздел для удобного администрирования.</p>
<p>А в <b>Settings > Global Settings</b> можно поменять тему оформления с белой на чёрную.</p>
<p>Пункт <b>Settings > User Managment</b> название говорит само за себя </p>
<p>По большому счёту все элементы <b>File Browser</b> интуитивно понятные поэтому не имеет смысла их описывать.</p>
<br><br><br><br><br><br>
<h2>File Browser на своём домене/поддомене</h2>
<p>На этом шаге я крайне рекомендую прилепить <b>File Browser</b> на домен или поддомен с SSL сертификатом. Самый простой вариант как это сделать был разобран в предыдущем посте <b><a target="_self" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html">Nginx Proxy Manager в Docker контейнере</a></b>.</p>
<p>Можно воспользоваться бесплатным <b>фриномовским</b> доменом и бесплатным <b>SSL</b> сертификатом от <b>Lets Encrypt</b>.</p>
<br><br><br><br><br><br>
<h2>В результате получаем</h2>
<a href="https://img.zzxc.ru/img/post-23/post-23-3-file-browser-tuned.jpg" target="_blank"><img border="0" alt="File browser tuned" src="https://img.zzxc.ru/img/post-23/post-23-3-file-browser-tuned.jpg" /></a>
<p>Ну всё, все молодцы кто до сюда дочитал</p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com2tag:blogger.com,1999:blog-244151671096808002.post-40962727227783178342021-09-14T15:32:00.044+03:002023-01-24T16:24:23.398+03:00LittleLink в докер контейнере<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2021/09/littlelink-server-docker-compose.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="docker-compose + linuxserver + wireguard" border="0" src="https://img.zzxc.ru/img/post-22/logo-22-littlelink-2.png"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Те кто так или иначе работает с адалтом либо с модельным бизнесом наверняка слышали о такой штуке как linktree и про его аналоги. Действительно удобный сервис - но многие нужные фичи платные. Сегодня мы поднимем selfhosted альтернативу linktree в докер контейнере.
</div>
<a name='more'></a><br><br>
<H2>Необходимые требования</H2>
<p>Чтобы всё получилось нам понадобится:</p>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>Установленный <b><a href="/p/virtualization-docker-full-install.html" target="_blank" >Docker + Docker-Compose</a></b></li>
<li>10 - 15 минут времени</li>
</ul>
<br><br><br><br><br><br>
<h2>В двух словах о LittleLink</h2>
<p>Большинство популярных сервисов не предоставляют возможность размещать несколько ссылок в своём профиле в разделе о себе. Зачастую есть возможность разместить всего одну ссылку. Для того чтобы обойти это ограничение мы можем разместить туда ссылку на LittleLink который будет содержать максимально возможное количество способов для того чтобы ваша аудитория могла связаться с вами или получить ваш контент в наиболее удобном для них формате</p>
<p>Плюсы - очень простая и быстрая установка.</p>
<p>Минусы - присутствуют не все сервисы, например нет онлифанса. Но этот недостаток легко решается, т.к. автор предусмотрел это и включил в конфиг добавление своих кастомных кнопок. Таким образом можно создать свою собственную кнопку, пока её ещё нет в официальной версии, назначить ей свой индивидуальный цвет, а так же иконку. Иконки необходимо вписывать в формате FontAwesome, для этого воспользуйтесь <b><a target="_blank" rel="nofollow" href="https://fontawesome.com/search">поиском</a></b>.</p>
<p>Например для вк иконка будет называться <b>fa-brands fa-vk</b> а цвет <b>#0077FF</b></p>
<br><br><br><br><br><br>
<H2>Подготовка</H2>
<p>Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём директорию под <b><a target="_blank" rel="nofollow" href="https://github.com/techno-tim/littlelink-server">LittleLink</a></b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/hosts/link.mydomain.com</span></div>
<br>
<p>Сделаем нашего пользователя (не root !) владельцем этой директории</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/hosts/link.mydomain.com</span></div>
<br><br><br><br><br><br>
<H2>Конфигурация и запуск</H2>
<p>Перейдём в директорию, которую мы создавали выше</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/hosts/link.mydomain.com</span></div>
<br>
<p>Создадим фаил <b>docker-compose.yml</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<p>И заполняем его таким <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Misc/littlelink/1-littlelink-server/docker-compose.yml">таким содержанием</a></b>.</p>
<p>Если Вы хотите поднять LittleLink не светя порты наружу, прочитайте про <b><a target="_blank" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html#hostname_proxy">проксирование приложения в NPM через хостнейм</a></b>. После усвоения материала используйте этот <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Misc/littlelink/1-littlelink-server-with-network/docker-compose.yml">фаил docker-dompose</a></b>. В противном случае используйте первый вариант, изначально пост писался именно под него!
<br><br>
<p>После этого стартуем наш контейнер</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br><br><br><br><br><br>
<h2>Посмотрим что у нас получилось</h2>
<p>Если вы ничего не меняли в фаиле docker-compose.yml то порт будет <b>39390</b>. Открываем в браузере</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">http://ip.адрес.вашего.сервера:порт</div>
<p>И видим там вот что</p>
<a href="https://img.zzxc.ru/img/post-22/post-22-1-littlelink-default.jpg" target="_blank"><img border="0" alt="LittleLink fresh install" src="https://img.zzxc.ru/img/post-22/post-22-1-littlelink-default.jpg" /></a>
<br><br>
<p>Для того чтобы поменять внешний вид и содержание необходимо отредактировать фаил <b>docker-compose.yml</b></p>
<p>Те сервисы которые нам не нужны мы просто комментируем знаком <span style="color:#87a800">#</span></p>
<p>Содержание конфига интуитивно понятное поэтому меняем всё по своему усмотрению. А как закончим, чтобы обновить изменения пересоздаём контейнер командой</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d --force-recreate</span></div>
<br><br><br><br><br><br>
<h2>Лепим контейнер на свой домен/поддомен</h2>
<p>Для полного комплекта остаётся только прилепить это всё к домену или поддомену. Самый простой вариант как это сделать был разобран в предыдущем посте <b><a target="_self" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html">Nginx Proxy Manager в Docker контейнере</a></b>.</p>
<br><br><br><br><br><br>
<h2>Результат</h2>
<a href="https://img.zzxc.ru/img/post-22/post-22-2-littlelink-tuned.jpg" target="_blank"><img border="0" alt="LittleLink tuned" src="https://img.zzxc.ru/img/post-22/post-22-2-littlelink-tuned.jpg" /></a>
<p>Ну всё, все молодцы кто до сюда дочитал</p>
<br><br><br><br><br><br>
<H2>Полезные ссылки</H2>
<p>Официальный <b><a target="_blank" rel="nofollow" href="https://github.com/sethcottle/littlelink">github</a></b>, только сам исходный код.</p>
<p>Официальный <b><a target="_blank" rel="nofollow" href="https://github.com/techno-tim/littlelink-server">github</a></b> образа для докера</p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com0tag:blogger.com,1999:blog-244151671096808002.post-34367494812014093362021-09-12T16:49:00.081+03:002023-08-25T18:13:13.918+03:00Поднимаем статику на Nginx при помощи docker-compose<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2021/09/nginx-static-docker-compose.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="docker-compose + linuxserver + wireguard" border="0" src="https://img.zzxc.ru/img/post-21/logo-21-docker-nginx-static.jpg"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
В предыдущем посте мы рассмотрели обратный прокси Nginx Proxy Manager как отличную альтернативу всем этим громоздким веб панелькам. Самое время рассмотреть создания docker контейнера Nginx для статики под HTML, картинки, аудио/видео/архивы и т.д.
</div>
<a name='more'></a><br><br>
<H2>Необходимые требования</H2>
<p>Чтобы всё получилось нам понадобится:</p>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>Установленный <b><a href="/p/virtualization-docker-full-install.html" target="_blank" >Docker + Docker-Compose</a></b></li>
<li>10 - 15 минут времени</li>
</ul>
<br><br><br><br><br><br>
<H2>Подготовка</H2>
<p>Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём директорию под хост <b>Nginx</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/hosts/img.mydomain.com/{data,log}</span></div>
<br>
<p>Сделаем нашего пользователя (не root !) владельцем этой директории</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/hosts/img.mydomain.com</span></div>
<br><br><br><br><br><br>
<H2>Конфигурация и запуск</H2>
<p>Перейдём в директорию, которую мы создавали выше</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/hosts/img.mydomain.com</span></div>
<br>
<p>Создадим фаил <b>docker-compose.yml</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<p>И заполняем его таким <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/webserver/nginx/2-basic-nginx-static-with-version/docker-compose.yml">таким содержанием</a></b>.</p>
<p>Если Вы хотите поднять статику Nginx не светя порты наружу, прочитайте про <b><a target="_blank" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html#hostname_proxy">проксирование приложения в NPM через хостнейм</a></b>. После усвоения материала используйте этот <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/webserver/nginx/2-basic-nginx-static-with-version-and-network/docker-compose.yml">фаил docker-dompose</a></b>. В противном случае используйте первый вариант, изначально пост писался именно под него!
<br><br>
<p>После этого стартуем наш контейнер</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br>
<blockquote>Уделите внимание параметру ports внутри docker-compose.yml Сначала идёт тот порт который мы выставляем наружу на хостовой машине и после двоеточия порт внутри контейнера.</blockquote>
<p>Во время запуска будет создано 2 папки, а именно <b>log</b> и <b>data</b>. Названия говорят сами за себя.</p>
<br><br><br><br><br><br>
<h2>Посмотрим что у нас там поднялось</h2>
<p>Если вы ничего не меняли в фаиле docker-compose.yml то порт будет <b>39080</b>. Открываем в браузере</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">http://ip.адрес.вашего.сервера:порт</div>
<p>И видим там вот что</p>
<a href="https://img.zzxc.ru/img/post-21/post-21-1-nginx-fresh-start-error.jpg" target="_blank"><img border="0" alt="Nginx Fresh Start Error" src="https://img.zzxc.ru/img/post-21/post-21-1-nginx-fresh-start-error.jpg" /></a>
<br><br>
<p>Ошибка? Не спешим расстраиваться. Контейнер мы подняли, а внутрь ничего не положили - вот он и ругается что нечего показывать! </p>
<p>Сначала поправим права, потому что запустив контейнер от sudo он создал папки с у которых владелец root. Исправляем</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/hosts/img.mydomain.com</span></div>
<br>
<p>А ошибку можно исправить просто создав index.html внутри папки data </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">echo IT WORKzZz > /app/hosts/img.mydomain.com/data/index.html</span></div>
<br>
<p>Я же предпочитаю в фаиле index.html ставить <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/webserver/nginx/0-html-files/simple-adaptive-html-youtube/index.html">такую заглушку</a></b> в виде статичного и адаптивного html фаила который проигрывает видео с youtube когда мы к нему обращаемся. Если вы хотите использовать другое видео - просто замените его на нужный id видео на youtube. В html коде он идёт в ссылке после .../embed/...</p>
<a href="https://img.zzxc.ru/img/post-21/post-21-2-nginx-fix.jpg" target="_blank"><img border="0" alt="Nginx Fresh Start Fix" src="https://img.zzxc.ru/img/post-21/post-21-2-nginx-fix.jpg" /></a>
<br><br>
<p>Эстеты ещё могут загрузить фаил favicon.ico</p>
<br><br><br><br><br><br>
<h2>Лепим контейнер на свой домен/поддомен</h2>
<p>Для полного комплекта остаётся только прилепить это всё к домену или поддомену. Самый простой вариант как это сделать был разобран в предыдущем посте <b><a target="_self" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html">Nginx Proxy Manager в Docker контейнере</a></b>.</p>
<br><br><br><br><br><br>
<H2 id="404-redirect">Автоматический редирект на страницу 404, если запрошенная страница не существует</H2>
<p>Я столкнулся с этой проблемой при обновлении старого сайта - некоторых страниц на сайте уже нет, а пользователи продолжают ходить по старым ссылкам из поисковой выдачи. По большому счёту это всё нужно <b><a target="_blank" rel="nofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html#nginx-rewrites">разруливать 301 редиректом в NPM</a></b> или в обычном nginx, но на первое время этот вариант может быть полезен. То есть поставить абсолютно на все несуществующие страницы редирект на страницу <b>404.html</b> </p>
<p>Всё достаточно просто и сводится к 1 действию, просто раскомментировать строку в конфиге NGINX. А для этого понадобится зайти внутрь контейнера </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">docker exec -it <span style="color:#f39c12">containername</span> /bin/bash</span></div>
<br><br>
<p>Далее необходимо отредактировать фаил с дефолтным сайтом NGINX. Но есть одна проблема, в данном контейнере по дефолту у нас нету никакого редактора - установим его:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">apt update && apt install nano</span></div>
<br><br>
<p>Теперь отредактируем сам фаил </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano /etc/nginx/conf.d/default.conf</span></div>
<br><br>
<p>Всё что необходимо сделать это убрать комментарий перед строчкой <b>#error_page</b> просто удалив символ <b>#</b>. Должно получиться вот так: </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">error_page 404 /404.html;</div>
<br><br>
<p>Вот и всё. А теперь выходим из контейнера </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">exit</span></div>
<p>и перезагружаем его </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker restart <span style="color:#f39c12">containername</span></span></div>
<p>Теперь со всех несуществующих страниц будет происходить редирект на 404.html </p>
<br><br>
<p>Ну всё, все молодцы кто до сюда дочитал</p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com0tag:blogger.com,1999:blog-244151671096808002.post-28272221350971719562021-09-09T15:39:00.204+03:002024-02-08T23:11:16.704+03:00Установка и знакомство с Portainer<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2021/09/install-portainer-docker.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="docker-compose + linuxserver + wireguard" border="0" src="https://img.zzxc.ru/img/post-20/logo-20-portainer.jpg"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Этот пост посвящен панельке для управления докер контейнерами <b>Portainer</b>. Мы установим <b>Portainer</b> внутрь докер контейнера, а так же рассмотрим его функционал и базовые настройки...
</div>
<a name='more'></a><br><br>
<H2>Необходимые требования</H2>
<p>Чтобы всё получилось нам понадобится:</p>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>Установленный <b><a href="/p/virtualization-docker-full-install.html" target="_blank" >Docker + Docker-Compose</a></b></li>
<li>20 - 30 минут времени</li>
</ul>
<br><br><br><br><br><br>
<H2>В двух словах о Portainer</H2>
<p><b>Portainer</b> представляет из себя <b>GUI</b> интерфейс для управления докер контейнерами. С его помощью можно Добавлять / Удалять / Клонировать / Стартовать / Перезагружать / Останавливать контейнеры.</p>
<p>Также очень просто можно посмотреть логи конкретного контейнера. Присоединяться к терминалу конкретного контейнера. Выбираем интересующий нас и нажимаем на соответствующую кнопку. Всё интуитивно понятно.</p>
<p>Помимо вышеперечисленного, <b>Portainer</b> умеет работать с <b>Kubernetes</b>. А ещё его можно использовать как единый узел для управления сразу несколькими серверами.</p>
<p>Portainer сильно упростит изучение технологий <b>Docker</b> на самом раннем этапе.</p>
<br><br><br><br><br><br>
<H2>Установка Portainer</H2>
<p>Создадим Volume где будет храниться информация</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker volume create portainer_data</span></div>
<p>Теперь необходимо выбрать способ установки. Для новичков я рекомендую Способ 1, т.к. он более прост в понимании. Изначально этот пост писался именно под этот способ. Минусом данного способа будут торчащие наружу порты. Те самые которые вы замапите на <b>8000</b> и <b>9443</b>.</p>
<p>Однако, существует и альтернативный вариант, рассмотренный во втором способе. Данный способ подразумевает что вы прочитали пост про <b><a target="_blank" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html">Nginx Proxy Manager</a></b>. В особенности раздел <u>Вариант 2: Проксируем приложение через хостнейм</u>. Этот способ чуть сложнее, но при этом он лучше в плане безопасности.</p>
<br><br>
<h4>Способ 1: установка Portainer с торчащими наружу портами</h4>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker run -d -p 44149:8000 -p 44150:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:2.16.1</span></div>
<p>Мы замапили порт <b>9000</b> внутри контейнера на порт <b>44150</b> на хостовую машину.</p>
<p>Обратите внимание порт <b>8000</b> внутри контейнера используется для агента Portainer. А порт <b>9000</b> внутри контейнера используется для веб интерфейса.</p>
<p>О том как добавить SSL сертификат для этого способа - читайте ниже в этом посте.</p>
<br><br><br><br><br><br>
<h4>Способ 2: установка Portainer с привязкой по хостнейму</h4>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker run -d --name portainer --network=evilcorp --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:2.16.1</span></div>
<p>Перед тем как подключить SSL сертификат для этого способа, обязательно прочтите раздел: <u>Вариант 2: Проксируем приложение через хостнейм</u> из поста про <b><a target="_blank" rel="dofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html">Nginx Proxy Manager</a></b>. Имейте в виду что в виду особенностей этого способа проксировать надо не на ip+внешний порт, а на <b>portainer:9443</b></p>
<br><br><br><br><br><br>
<H4 id="portainer-docker-compose">Способ 3: установка Portainer Portainer с помощью docker-compose</H4>
<p>Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём необходимые директории для Portainer</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/misc/portainer</span></div>
<br>
<p>Сделаем нашего пользователя (не root !) владельцем этой директории </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/misc/portainer</span></div>
<br>
<p>Перейдём в директорию, которую мы создавали на предыдущем шаге </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/misc/portainer</span></div>
<br>
<p>Создадим фаил docker-compose.yml </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<p>И заполняем его таким <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Misc/portainer/portainer-ce/1-custom-version/docker-compose.yml">таким содержанием</a></b>. Данный конфиг подойдёт сразу под amd64 и arm64 архитектуры.</p>
<p>Если Вы хотите поднять Portainer не светя порты наружу, прочитайте про <b><a target="_blank" rel="dofollow" href="https://antoshabrain.blogspot.com/2021/09/nginx-proxy-manager-docker-compose.html#hostname_proxy">проксирование приложения в NPM через хостнейм</a></b>. После усвоения материала используйте этот <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Misc/portainer/portainer-ce/1-custom-version-and-network/docker-compose.yml">фаил docker-dompose</a></b>. В противном случае используйте первый вариант, изначально пост писался именно под него! </p>
<br><br><br>
<blockquote>Я советую периодически проверять <b><a target="_blank" rel="nofollow" href="https://hub.docker.com/r/portainer/portainer-ce/tags">DockerHub</a></b> на наличие новых версий. На момент написания статьи актуальная версия была <br> portainer-ce:2.19.4 </blockquote>
<br><br><br><br><br><br>
<H2>SSL сертификат для Portainer</H2>
<p>Необязательным но желательным шагом будет получение <b>SSL</b> сертификата. Дело в том что в данный момент все данные передаются по незащищённому протоколу <b>http</b>. Логин и пароль передаются в открытом виде.</p>
<p>Если вы ставите портейнер для того чтобы потренироваться на домашнем сервере то можно обойтись и без SSL. На продакшн сервере <u>SSL musthave!</u></p>
<p>Самый простой вариант завести поддомен например <b>portainer.domain.com</b> и посадить на этот поддомен Portainer. Проще всего это сделать при помощи <b>Nginx Proxy Manager</b>. Если вы не знаете как, то читайте предыдущий пост <b><a target="_self" rel="nofollow" href="/2021/09/nginx-proxy-manager-docker-compose.html">Nginx Proxy Manager в Docker контейнере</a></b>.</p>
<p>В Nginx Proxy Manager(далее NPM) создаём новый хост. Заполняем необходимую информацию.</p>
<ul>
<li>Домен либо поддомен</li>
<li>Scheme - <b>https</b></li>
<li>Ip адрес</li>
<li>Порт - <b>44150</b></li>
<li>Обязательно включаем - <b>Websockets Support</b> если не включим то не сможем атачиться внутрь контейнеров через web интерфейс</li>
</ul>
<br>
<a href="https://img.zzxc.ru/img/post-20/post20-1-1-npm-portainer.png" target="_blank"><img border="0" alt="npm portainer" src="https://img.zzxc.ru/img/post-20/post20-1-1-npm-portainer.png" /></a>
<br><br>
<p>Нажимаем <b>Save</b> и ждём примерно 60 секунд.</p>
<p>После этого снова редактируем только что добавленный хост, нажав на три точки справа и <b>Edit</b>.</p>
<p>На этот раз отправляемся в раздел <b>SSL</b> в котором запрашиваем новый <b>ssl сертификат</b> для нашего домена - <b>Request a new SSL Certificate</b></p>
<br>
<a href="https://img.zzxc.ru/img/post-20/post20-1-1-npm-portainer-2.jpg" target="_blank"><img border="0" alt="npm portainer 2" src="https://img.zzxc.ru/img/post-20/post20-1-1-npm-portainer-2.jpg" /></a>
<br><br>
<p>И нажимаем кнопку <b>Save</b></p>
<p>Обратите внимание, что после нажатия кнопки <b>Save</b> не должно быть никаких ошибок. Если у вас всё же были какие то ошибки, скорее всего это связано с тем что у вас не успели обновиться записи в <b>DNS</b>, либо вы превысили лимиты(количество попыток) <b>LetsEncrypt</b>. В обоих случаях надо просто подождать и повторить попытку позже.</p>
<p>Если же у вас не выдало никаких ошибок с сертификатом, то сразу проверяем результат в браузере, открыв только что добавленный домен.</p>
<p>Мы должны увидеть страницу установки <b>Portainer</b></p>
<br><br><br><br><br><br>
<H2>Базовая настройка Portainer</H2>
<p>Открываем адрес</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">http://ip.адрес.вашего.сервера:44150</div>
<p>Либо тот порт который вы замапили на порт <b>9000</b> внутри контейнера.</p>
<p>Нас приветствует Portainer и предлагает задать логин и пароль для администратора</p>
<a href="https://img.zzxc.ru/img/post-20/post20-1-portainer-welcome-1.png" target="_blank"><img border="0" alt="Portainer Fresh Install" src="https://img.zzxc.ru/img/post-20/post20-1-portainer-welcome-1.png" /></a>
<br><br>
<p>Следующим шагом будет задание эндпоинта. В рамках данной статьи мы рассматриваем работу Portainer в среде Docker - выбираем соответствующий пункт и нажимаем connect</p>
<a href="https://img.zzxc.ru/img/post-20/post20-2-portainer-endpoint.png" target="_blank"><img border="0" alt="Portainer Select Docker Endpoint" src="https://img.zzxc.ru/img/post-20/post20-2-portainer-endpoint.png" /></a>
<br><br>
<p>Нас перекинет на главную страницу Portainer</p>
<a href="https://img.zzxc.ru/img/post-20/post20-3-portainer-install-complete.png" target="_blank"><img border="0" alt="Portainer Install Complete" src="https://img.zzxc.ru/img/post-20/post20-3-portainer-install-complete.png" /></a>
<br><br>
<p>На этом установка завершена.</p>
<br><br><br><br><br><br>
<H2>Что умеет Portainer</H2>
<p>Кликая по значку кита мы попадаем на <b>Dashboard</b> конкретного эндпоинта. В нашем случае локального. </p>
<a href="https://img.zzxc.ru/img/post-20/post20-4-portainer-dashboard.png" target="_blank"><img border="0" alt="Portainer Dashboard" src="https://img.zzxc.ru/img/post-20/post20-4-portainer-dashboard.png" /></a>
<br><br>
<p>Тут мы наблюдаем сразу несколько разделов</p>
<p><b>Stacks</b> - Тут содержатся так называемые стэк контейнеры. В таких контейнерах присутствует сразу же несколько сервисов например Nginx + Php + MySQL.</p>
<p>Выгодным отличием стэк контейнера заключается в том что мы можем устанавливать какой сервис запускать после какого. Например в случае веб сервера имеет смысл сначала запустить БД потом PHP и После этого запустить Nginx. Если бы мы сначала запустили Nginx то наблюдали бы ошибки связанные с невозможностью подключиться к базе данных или же ошибки Php. Это фишка самого докера, а не портейнера. </p>
<p><b>Containers</b> - Наши контейнеры. Запущенные и остановленные.</p>
<p><b>Images</b> - образы для контейнеров. Те что скачиваются с докерхаба либо же те которые мы сами билдим.</p>
<p><b>Volume</b> - название говорит само за себя. Тут содержаться наши виртуальные фаиловые системы для контейнеров.</p>
<p><b>Networks</b> - сети.</p>
<br><br><br><br><br><br>
<H2 id="portainer-practice">Практика</H2>
<p>Предлагаю попрактиковаться и поставить что нибудь из шаблонов портейнера. Пускай это будет нода (node).</p>
<p>Из главного меню переходим в раздел <b>App Templates</b>. Из списка выбираем ноду</p>
<a href="https://img.zzxc.ru/img/post-20/portainer-template-install-1.jpg" target="_blank"><img border="0" alt="Portainer Templates install" src="https://img.zzxc.ru/img/post-20/portainer-template-install-1.jpg" /></a>
<br><br><br>
<p>В поле name вписываем название используя только маленькие латинские буквы a-z. У меня это будет <b>nodesurge</b>. После этого разворачиваем спойлер на котором написано <b>+Show advanced options</b>.</p>
<p>(Если вам нужно чтобы контейнер был присоединён к кастомной сети то вместо <b>bridge</b> выберите желаемую сеть, у меня это будет сеть <b>evilcorp</b>)</p>
<a href="https://img.zzxc.ru/img/post-20/portainer-template-install-2.jpg" target="_blank"><img border="0" alt="Portainer Templates install 2" src="https://img.zzxc.ru/img/post-20/portainer-template-install-2.jpg" /></a>
<br><br><br>
<p>В выпадающем списке нас интересует пункт <b>Volume mapping</b> в котором кликаем по пункту <b>map additional volume </b>.</p>
<p>Перед тем как замапить директорию создадим её, например такую</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/misc/nodesurge/data</span></div>
<br><br>
<p>И сразу дадим нашему пользователю права для этой директории</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/misc/nodesurge/data</span></div>
<br><br><br>
<p>Возвращаемся к мэпингу директории в portainer. После того как мы нажали <b>map additional volume</b> выбираем <b>Bind</b></p>
<p>В поле <b><span style="color:#ffdd31">container</span></b> вписываем <b><span style="color:#ffdd31">/app</span></b></p>
<p>В поле <b><span style="color:#f39c12">host</span></b> вписываем <b><span style="color:#f39c12">/app/misc/nodesurge/data</span></b></p>
<a href="https://img.zzxc.ru/img/post-20/portainer-template-install-3.jpg" target="_blank"><img border="0" alt="Portainer Templates install 3" src="https://img.zzxc.ru/img/post-20/portainer-template-install-3.jpg" /></a>
<br>
<p>И нажимаем <b>Deploy the container</b></p>
<br><br><br>
<p>Если всё сделано правильно, то спустя какое то время мы увидим оповещение что всё хорошо</p>
<a href="https://img.zzxc.ru/img/post-20/portainer-template-install-4-big.jpg" target="_blank"><img border="0" alt="Portainer Templates install 4" src="https://img.zzxc.ru/img/post-20/portainer-template-install-4-big.jpg" /></a>
<br><br>
<p>Находим наш только что созданный контейнер по имени и нажимаем на него, попадая таким образом в его настройки</p>
<a href="https://img.zzxc.ru/img/post-20/portainer-template-install-5.jpg" target="_blank"><img border="0" alt="Portainer Templates install 5" src="https://img.zzxc.ru/img/post-20/portainer-template-install-5.jpg" /></a>
<br><br><br>
<p>В любой момент мы можем посмотреть логи контейнера, зайдя в соответствующий раздел. Я же предлагаю сразу зайти в пункт <b>>_Console</b><br>Мы можем зайти внутрь нашего контейнера нажав кнопку <b>Connect</b></p>
<br><br>
<p>Попав внутрь поставим модуль для NPM <b>Surge</b> для этого вписываем</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">npm install --global --save-dev surge</span></div>
<br>
<a href="https://img.zzxc.ru/img/post-20/portainer-node-install-surge-1.jpg" target="_blank"><img border="0" alt="Portainer Templates install 5" src="https://img.zzxc.ru/img/post-20/portainer-node-install-surge-1.jpg" /></a>
<br><br><br>
<p>Ну и напоследок добавим какой нибудь простой HTML код в качестве сайта для Surge. Создаём папку с фаилом <b>index.html</b> с таким содержанием.</p>
<p>(Во время первой закачки необходимо будет авторизоваться вписав почту и пароль для входа, вас автоматически зарегистрирует если почта в сервисе используется 1 раз)</p>
<a href="https://img.zzxc.ru/img/post-20/portainer-node-add-surge-1.jpg" target="_blank"><img border="0" alt="Node add Surge 1" src="https://img.zzxc.ru/img/post-20/portainer-node-add-surge-1.jpg" /></a>
<br><br><br>
<p>Видим что наш сайт опубликован на домене <b><a target="_blank" rel="nofollow" href="https://temporary-talk.surge.sh/">temporary-talk.surge.sh</a></b> переходим на него, только подставим перед доменом <b>https</b> иначе откроется сайт без SSL сертификата.</p>
<a href="https://img.zzxc.ru/img/post-20/portainer-node-add-surge-2.jpg" target="_blank"><img border="0" alt="Portainer Templates install 2" src="https://img.zzxc.ru/img/post-20/portainer-node-add-surge-2.jpg" /></a>
<br>
<p>Сработало!</p>
<br><br><br>
<H4>Хитрости Surge</H4>
<p>Если вы хотите использовать свой придуманный домен, то перед заливкой сайта создайте в его корне фаил <b>CNAME</b> в котором напишите желаемый домен.</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">echo <span style="color:#f39c12">mydomain</span>.surge.sh > CNAME</span></div>
<p>Вам никто не запрещает создать <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/scripts/posts/html/redirect1.html">HTML редирект</a></b> с красивым доменом и потом использовать его в своих целях.</p>
<p>На этом с практикой закончили.</p>
<br><br><br><br><br><br>
<H2>Переустановка Portainer</H2>
<p>Иногда бывает нужно переустановить portainer. Для этого сначала понадобится удалить прежнюю версию. Делается это довольно</p>
<p>Останавливаем контейнер с portainer</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker stop portainer</span></div>
<br>
<p>Удаляем контейнер с portainer</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker rm portainer</span></div>
<br>
<p>Опционально - смотрим список всех имаджей</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker images</span></div>
<br>
<p>Опционально - удаляем имадж portainer</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker rmi [image ID]</span></div>
<br>
<p>Удаляем volume с данными portainer</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker volume rm portainer_data</span></div>
<br>
<p>После этого можем заново установить portainer</p>
<br><br><br><br><br><br>
<H2>Полезные ссылки</H2>
<p><b><a target="_blank" rel="nofollow" href="https://documentation.portainer.io/v2.0/deploy/ceinstalldocker/">Deploying Portainer CE in Docker</a></b></p>
<p>Portainer на <b><a target="_blank" rel="nofollow" href="https://hub.docker.com/r/portainer/portainer-ce">DockerHub</a></b></p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com2tag:blogger.com,1999:blog-244151671096808002.post-91999131258132829572021-09-05T17:05:00.363+03:002023-10-17T12:24:35.060+03:00Nginx Proxy Manager в Docker контейнере<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2021/09/nginx-proxy-manager-docker-compose.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="docker-compose + linuxserver + wireguard" border="0" src="https://img.zzxc.ru/img/post-19/logo-19-NPM-install.png"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Привет. Сегодня поднимаем панельку и по совместительству reverse-proxy <b>Nginx Proxy Manager</b> внутри докер контейнера. Ну и немного потренируемся для закрепления результата.
</div>
<a name='more'></a><br><br>
<H2>Необходимые требования</H2>
<p>Чтобы всё получилось нам понадобится:</p>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>Установленный <b><a href="/p/virtualization-docker-full-install.html" target="_blank" >Docker + Docker-Compose</a></b></li>
<li>20 - 30 минут времени</li>
</ul>
<br><br><br><br><br><br>
<H2>В двух словах о <b>Nginx Proxy Manager</b></H2>
<p>NPM является обратным прокси(reverse proxy), основанным на Nginx. Имеет приятный и интуитивно понятный веб интерфейс.</p>
<p>Используется для того чтобы проксировать Ваше приложение на необходимый домен либо поддомен. Другими словами для привязывания контейнера к домену или поддомену.</p>
<p>Привязывать (проксировать) домены можно двумя разными способами</p>
<p>По порту - самый простой способ при этом есть минус в качестве торчащего наружу порта.</p>
<p>По хостнейму - более продвинутый способ, для которого нужно открыть только 3 порта <b>80</b>, <b>443</b> и порт управления панелькой NPM. Порты всех остальных проксированных контейнеров не будут торчать наружу.</p>
<p>В пределах этого поста рассмотрим оба варианта проксирования.</p>
<p>Помимо проксирования в панельке предусмотрена работа с <b>TLS</b>(<b>SSL</b>) сертификатами. В рамках этого поста затронем несколько способов получения бесплатных SSL сертификатов:</p>
<br>
<ul>
<li>Бесплатный самообновляющийся сертификат от <b>Lets Encrypt</b></li>
<li>Бесплатный самообновляющийся <b>wildcard</b> сертификат от <b>Lets Encrypt</b></li>
<li>Бесплатный <b>origin</b> сертификат от <b>CloudFlare</b> на 15 лет</li>
</ul>
<br>
<p>NPM в автоматическом режиме будет продлевать самообновляющийся сертификаты каждые 3 месяца за нас. </p>
<p>В NPM присутствуют специальные правила <b>ACL</b> для предоставления/ограничения доступа к вашим приложениям. На основе ip адреса, пароля, либо и того и того одновременно.</p>
<p>Ещё NPM умеет работать с редиректами и стримами, но их касаться в пределах этой статьи мы не будем.</p>
<br><br><br><br><br><br>
<H2>Подготовка</H2>
<p>Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём директорию под NPM</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/NPM</span></div>
<br>
<p>Сделаем нашего пользователя (не root !) владельцем этой директории</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/NPM</span></div>
<br><br><br><br><br><br>
<H2>Конфигурация и запуск</H2>
<p>Перейдём в директорию, которую мы создавали выше</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/NPM</span></div>
<br>
<p>Создадим фаил <b>docker-compose.yml</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<p>С <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/ReverseProxy/NginxProxyManager/1-npm-basic-amd64/docker-compose.yml">таким содержанием</a></b>.</p>
<p>На всякий случай оставлю конфиг под <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/ReverseProxy/NginxProxyManager/2-npm-basic-aarch64-github-develop/docker-compose.yml">aarch64</a></b>, <b><a target="_blank" rel="nofollow" href="https://nginxproxymanager.com/guide/#quick-setup">оффсайт</a></b> и <b><a target="_blank" rel="nofollow" href="https://hub.docker.com/r/jc21/nginx-proxy-manager">dockerhub</a></b></p>
<br>
<p>Стартуем контейнер NPM</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br><br><br><br><br><br>
<H2>Настройка <b>Nginx Proxy Manager</b></H2>
<p>В браузере открываем нашу панельку NPM. Порт будет либо 81 либо тот который вы замапили на 81. Я советую на всякий случай замапить какой нибудь нестандартный порт например <b>43013</b> </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">http://ip.адрес.вашего.сервера:порт</div>
<a href="https://img.zzxc.ru/img/post-19/post19-1-npm-auth.png" target="_blank"><img border="0" alt="Nginx Proxy Maneger Auth" src="https://img.zzxc.ru/img/post-19/post19-1-npm-auth.png" /></a>
<br><br>
<p>Выполняем вход с такими данными</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">Email: admin@example.com<br>
Password: changeme</div>
<p>Нас перебросит на страницу на которой любезно спросят как мы хотим назвать учётную запись, наше имя и почту. Почта будет в дальнейшем использована в качестве логина. Настоятельно рекомендую вписывать валидную почту.</p>
<p>После этого откроется диалог смены пароля - вписываем стандартный <b>changeme</b> и ставим свой сложный пароль.</p>
<br><br><br><br><br><br>
<h2>Обновляем записи DNS</h2>
<p>Для того чтобы проксировать наше приложение нам понадобится изменить DNS записи нашего домена. Если у вас нет свободного домена под рукой вы можете получить его бесплатно <b><a target="_blank" rel="nofollow" href="https://www.freenom.com">тут</a></b>.</p>
<p>Так как у всех скорее всего будут разные регистраторы то для удобства я буду показывать дальнейший процесс в <b>cloudflare</b>.</p>
<p>Первым делом я предлагаю проксировать саму панельку на поддомен <b>npm.example.com</b>. Для этого в CloudFlare переходим в раздел <b>DNS</b> и создаём <b>A-запись</b> в поле <b>Name</b> вписываем <b>npm</b>, а в поле IPv4 address вписываем <b>ip адресс сервера</b>. Нажимаем <b>save</b>. Ждём какое то время, обычно около 5-10 минут иногда быстрее иногда дольше.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-create-cloudflare-subdomains.png" target="_blank"><img border="0" alt="Add Cloudflare Subdomain" src="https://img.zzxc.ru/img/post-19/post19-create-cloudflare-subdomains.png" /></a>
<br><br>
<p>Proxy status то есть проксирование - выключаем.</p>
<p>Обратите внимание на скриншоте приведён пример с поддоменом, если вы хотите привязать сам домен то вписывайте его туда целиком вместо npm</p>
<br><br><br><br><br><br>
<h2>Вариант 1: Проксируем приложение через NPM по порту</h2>
<p>Как я уже написал выше, у этого способа есть один недостаток. Заключается он в том что помимо того что ваше приложение отзывается по проксируемому домену, оно также отзывается по внешнему порту контейнера. То есть другими словами торчат наружу порты. Данный способ более прост в реализации чем проксирование по хостнейму. Но обо всём по порядку.</p>
<p>Возвращаемся в нашу Веб-панель NPM. В ней открываем <b>Proxy Hosts</b> и кликаем <b>Add Proxy Host</b>. И добавляем наш хост.</p>
<p>Вписываем имя домена или поддомена, ip адрес сервера, порт на котором у нас запущена админка NPM - по стандарту 81, я всё таки советую сменить на что нибудь неприметное наподобие <b>43013</b></p>
<a href="https://img.zzxc.ru/img/post-19/post19-npm-addhost-port-1.png" target="_blank"><img border="0" alt="npm addhost by port 1" src="https://img.zzxc.ru/img/post-19/post19-npm-addhost-port-1.png" /></a>
<br><br>
<p>Сразу добавим наш хост нажатием кнопки <b>Save</b>. Он появится в списке проксируемых хостов. В данный момент он должен открываться по протоколу http проверяем кликнув по хосту в панельке. В результате нам должен открыться сайт http://npm.example.com</p>
<p>Если всё хорошо и необходимый сайт открылся - переходим к следующему шагу - добавление SSL сертификата. Для этого нажимаем на три точки справа от хоста и нажимаем <b>Edit</b>. Переходим на вкладку <b>SSL</b> и запрашиваем новый SSL сертификат нажав на кнопку <b>Save</b>.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-4-npm-addhost-2ssl.png" target="_blank"><img border="0" alt="Nginx Proxy Manager Add Host 2" src="https://img.zzxc.ru/img/post-19/post19-4-npm-addhost-2ssl.png" /></a>
<br><br>
<p>Снова кликаем по нашему хосту и проверяем что у нас автоматически редиректнуло на https://npm.example.com и что теперь у домена установлен вилидный SSL сертификат. Об этом сигнализирует знак замка в адресной строке.</p>
<p>Работает.</p>
<p>По мере добавления новых хостов, панелька будет выглядеть вот так.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-5-npm-all-hosts.png" target="_blank"><img border="0" alt="Nginx Proxy Dashboard" src="https://img.zzxc.ru/img/post-19/post19-5-npm-all-hosts.png" /></a>
<br><br>
<p><span style="color:#FF3152">Важно - для IDN-доменов нужно вписывать только punnycode!<br>Например для домена <b>домен.com</b> нужно вписать <b>xn--d1acufc.com</b> (при этом вписывать домен.com не нужно!). </span></p>
<br><br><br><br><br><br>
<h2 id="hostname_proxy">Вариант 2: Проксируем приложение через хостнейм</h2>
<p>Со временем понимаешь что все эти торчащие наружу порты никчему. И мы можем от них избавиться. Оставим открытыми только <b>80</b> и <b>443</b> порты, а всё остальное будет проксироваться с помощью магии докера.</p>
<p>Для сначала нужно создать отдельную сеть. В эту сеть мы добавим NPM а также все контейнеры, которые хотим проксировать. Создаём сеть</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker network create -d bridge evilcorp</span></div>
<br>
<p>Если вы хотите добавить какой то контейнер в эту сеть есть специальная команда, например вот так это выглядит для portainer.</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker network connect evilcorp portainer</span></div>
<br>
<p>Но лучше описать эту сеть в самом docker-compose.yml в таком случае мы избавимся он необходимости каждый раз добавлять контейнеры через CLI.</p>
<p>Я подготовил специальный <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/ReverseProxy/NginxProxyManager/1-npm-basic-amd64-with-network/docker-compose.yml">фаил docker-compose.yml</a></b> для NPM. В нём уже добавлены все необходимые параметры.</p>
<p>Отредактируйте старый фаил docker-compose.yml заменив его новым и перезагрузите контейнер</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d --force-recreate</span></div>
<br>
<p>Посмотрим что было добавлено</p>
<p>У каждого контейнера появились директивы container_name:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">container_name: nginx-proxy-manager-...</div>
<br>
<p>У каждого контейнера появились директивы networks:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">networks:<br>
- default</div>
<br>
<p>В самом конце была добавлена определяющая директива</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">networks:<br>
default:<br>
external: true<br>
name: evilcorp</div>
<br>
<p>Мы прямо в docker-compose.yml указали что оба контейнера NPM: app(главное приложение) и db(база данных) находятся в одной сети <span style="color:#ffdd31">evilcorp</span>.</p>
<p>Ещё раз все последующие хосты которые мы будем проксировать следует добавлять в эту сеть. В моих фаилах docker-compose.yml это уже будет. Но если вы будете добавлять какой то новый сервис сами - не забудьте его добавить в сеть <span style="color:#ffdd31">evilcorp</span>!</p>
<p>Дополнительно мы назначили container_name для каждого контейнера и теперь мы можем обращаться к ним по имени как по DNS, внутри этой сети.</p>
<p>Возвращаемся в нашу панель и добавляем или редактируем хост npm</p>
<p>В графу Forward Hostname / IP* вписываем имя нашего контейнера <b>nginx-proxy-manager-app</b></p>
<p>А в графу порт вписываем <b>81</b></p>
<a href="https://img.zzxc.ru/img/post-19/post19-npm-addhost-hostname-1.png" target="_blank"><img border="0" alt="npm addhost by hostname 1" src="https://img.zzxc.ru/img/post-19/post19-npm-addhost-hostname-1.png" /></a>
<br><br>
<p>И нажимаем кнопку <b>Save</b>.</p>
<p>В результате мы получим вот это</p>
<a href="https://img.zzxc.ru/img/post-19/post19-npm-addhost-hostname-2.png" target="_blank"><img border="0" alt="npm addhost by hostname 2" src="https://img.zzxc.ru/img/post-19/post19-npm-addhost-hostname-2.png" /></a>
<br><br>
<p>Но почему мы вписали порт <b>81</b>, а не <b>43013</b>? Дело в том что мы обращаемся к контейнеру из внутренней сети. Представьте что оба контейнера это 2 отдельных компьютера. На одном поднято само приложение, а на другом база данных. Находясь внутри этой сети вы будете обращаться к приложениям по внутреннему порту, который в docker обычно располагается справа. А не по внешнему порту, который располагается слева.</p>
<p>А раз теперь у нас всё общение происходит через внутреннюю сеть, то и порт выставлять наружу нам просто незачем. Поэтому ещё раз заходим в docker-compose.yml и комментируем строку</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">ports:<br>
- '80:80'<br>
<span style="color:#ffdd31"># - '43013:81'</span><br>
- '443:443'</div>
<br>
<p>После чего вновь пересоздадим контейнер</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br>
<p>В результате у нас открыты только 2 порта <b>80</b> и <b>443</b>, а всё остальное проксируется средствами NPM. И нету больше никаких торчащих наружу портов.</p>
<br><br><br><br><br><br>
<h2 id="npm-acl">Защищаем наши хосты NPM</h2>
<p>В <b>Nginx Proxy Manager</b> есть встроенный механизм <b>Access-control list</b>(<b>ACL</b>), который позволит улучшить безопасность проксируемых приложений. Создадим для примера такое правило.</p>
<p>Переходим в пункт <b>Access Lists</b> и создаём новое правило <b>Add Access List</b></p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-acl-1.jpg" target="_blank"><img border="0" alt="Nginx Proxy Manager ACL Creation" src="https://img.zzxc.ru/img/post-19/post19-6-npm-acl-1.jpg" /></a>
<br>
<p>Далее у нас будут 2 варианта валидации хорошего пользователя по <b>Login + Password</b> и <b>по ip адресу</b>.</p>
<p><b>Satisfy Any</b> в выключенном состоянии означает что для успешной авторизации мы должны проходить сразу по двум правилам: <b>Login + Password</b> и <b>по ip адресу</b>. Если же мы включим Satisfy Any то для авторизации будет достаточно выполнения любого из условий. </p>
<br><br>
<p>Переходим на вкладку Authorization</p>
<a href="https://img.zzxc.ru/img/post-19/post19-7-npm-acl-2.jpg" target="_blank"><img border="0" alt="Nginx Proxy Manager ACL Authorization" src="https://img.zzxc.ru/img/post-19/post19-7-npm-acl-2.jpg" /></a>
<br>
<p>Тут мы вписываем любые угодные данные для авторизации, которые будем впоследствии вводить в качестве логина и пароля. Если нужно сделать доступ для нескольких пользователей - нажимаем Add.</p>
<br><br>
<p>Переходим на вкладку Access</p>
<a href="https://img.zzxc.ru/img/post-19/post19-8-npm-acl-3.jpg" target="_blank"><img border="0" alt="Nginx Proxy Manager ACL Access" src="https://img.zzxc.ru/img/post-19/post19-8-npm-acl-3.jpg" /></a>
<br>
<p>Тут мы перечисляем списки ip адресов, которым хотим разрешить доступ. Поддерживаемый формат просто ip xxx.zzz.ccc.vvv и/или ip+подсеть xxx.zzz.ccc.vvv/24 </p>
<br>
<p>Вводим данные и сохраняем по кнопке save. Появляется наше правило.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-9-npm-acl-4.jpg" target="_blank"><img border="0" alt="Nginx Proxy Manager ACL Success" src="https://img.zzxc.ru/img/post-19/post19-9-npm-acl-4.jpg" /></a>
<br><br>
<p>Возвращаемся к нашим хостам в <b>Dashboard</b> > <b>Proxy Hosts</b> </p>
<p>Выбираем хост к которому хотим применять только что созданные правила. Нажимаем справа на три точки и <b>Edit</b> попадаем в редактирование хоста. Выбираем только что созданный нами <b>ACL</b>. </p>
<a href="https://img.zzxc.ru/img/post-19/post19-10-npm-acl-5.jpg" target="_blank"><img border="0" alt="Nginx Proxy Manager ACL select" src="https://img.zzxc.ru/img/post-19/post19-10-npm-acl-5.jpg" /></a>
<br><br>
<p>Проверим что у нас получилось. Все проверки настоятельно рекомендую делать в браузере в режиме инкогнито.</p>
<p>В <b>FireFox</b> активируем сочетанием клавиш <b>CTRL + SHIFT + P</b></p>
<p>В <b>Chrome</b> активируем сочетанием клавиш <b>CTRL + SHIFT + N</b></p>
<p>Отправляемся по адресу где живёт нашё приложение и видим там</p>
<a href="https://img.zzxc.ru/img/post-19/post19-11-npm-acl-6.jpg" target="_blank"><img border="0" alt="Nginx Proxy Manager ACL select" src="https://img.zzxc.ru/img/post-19/post19-11-npm-acl-6.jpg" /></a>
<br>
<p>Введя валидные данные мы попадаем в наше приложение.</p>
<p>Для эксперимента я зашел туда же через VPN, ip адрес которого не в списке разрешённых и в результате получил такой результат</p>
<a href="https://img.zzxc.ru/img/post-19/post19-12-npm-acl-7.jpg" target="_blank"><img border="0" alt="Nginx Proxy Manager ACL" src="https://img.zzxc.ru/img/post-19/post19-12-npm-acl-7.jpg" /></a>
<br><br>
<p>Что говорит о том что мы успешно защитили вход на наши секретные хосты от недоброжелателей. Помним, что идеальной защиты не бывает, но так всё таки лучше чем с дверью нараспашку.</p>
<br><br><br><br><br><br>
<h2 id="free-cf-ssl">Бесплатный SSL сертификат от cloudflare на 15 лет</h2>
<p>Бесплатные SSL/TLS сертификаты выдаёт не только <b>Letsencrypt</b> но и <b>Cloudflare</b>. Причём у CF его можно взять сразу на 15 лет. Но не спешите радоваться, помимо плюсов есть и минусы. Например для таких сертификатов нужно включить обязательное проксирование. То самое которое вместо вашего реального ip адреса выдаёт ip адреса <b>Cloudflare</b>. Это не всегда нужно, а в некоторых случаях вообще не нужно. Во всех остальных случаях это скорее плюс, т.к. улучшает нашу безопасность подменяя настоящий ip.</p>
<p>Основной минус проксирования состоит в том что там есть ограничение на размер передаваемого/загружаемого фаила при включенной проксификации. На бесплатном тарифе он равен 100 MB и срабатывает когда вы что то загружаете на сервер. Какие то виды <b>П.О.</b> разбивают загружаемые фаилы на чанки, тем самым обходя это ограничение, например <b><a target="_blank" rel="nofollow" href="/2021/12/docker-nextcloud-postgres-redis-amd64.html">Nextcloud</a></b> так делает. А вот в каком то <b>П.О.</b> это не предусмотрено. Например <b><a target="_blank" rel="nofollow" href="/2021/09/file-browser-docker-compose.html">File Browser</a></b> так не делает и в результате фаилы больше 100 MB не загружаются. В таких случаях можно использовать сертификат от <b>Letsencrypt</b> при этом отключить проксирование на конкретный поддомен.</p>
<p>С минусами разобрались. Теперь переходим непосредственно к получению. Логинимся в свой аккаунт Cloudflare. У вас должен быть уже привязан домен, можно бесплатный от freenom. Отправляемся в раздел <b>SSL/TLS</b> > <b>Origin Server</b>. Изначально там будет пусто.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-get-cf-cert-1.png" target="_blank"><img border="0" alt="cloudflare get Origin Server certificate" src="https://img.zzxc.ru/img/post-19/post19-6-npm-get-cf-cert-1.png" /></a>
<br><br>
<p>Нажимаем на кнопку <b>Create Certificate</b>. Попадаем в раздел создания сертификата. Там будет указано его название и в самом низу время на которое мы хотим получить этот сертификат. Указываем 15 лет и нажимаем ok.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-get-cf-cert-2.png" target="_blank"><img border="0" alt="cloudflare get Origin Server certificate create" src="https://img.zzxc.ru/img/post-19/post19-6-npm-get-cf-cert-2.png" /></a>
<br><br>
<p>Нас перекинет на специальную страницу. Сохраняем содержимое полей так как это указано на скриншоте в фаилы <b>example.com.pem</b> и <b>example.com.key</b></p>
<p>Просто скопируйте содержимое и вставьте в блокнот, сохранив в фаил с необходимым именем. Обратите внимание что фаил не должен содержать пустых строк ни в начале ни в конце. Обязательно сохраните оба фаила. Если вы по какой то причине не сохранили оба фаила сразу то придётся перевыпускать сертификат, потому что во зайдя во второй раз на ту же самую страницу вы не увидите там <b>example.com.key</b>!</p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-get-cf-cert-3.png" target="_blank"><img border="0" alt="cloudflare get Origin Server certificate key and pem" src="https://img.zzxc.ru/img/post-19/post19-6-npm-get-cf-cert-3.png" /></a>
<br><br>
<p>Нажав ок мы вернёмся в раздел <b>SSL/TLS</b> > <b>Origin Server</b> на этот раз в графе <b>Hosts</b> будет наш только что созданный сертификат.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-get-cf-cert-4.png" target="_blank"><img border="0" alt="cloudflare get Origin Server certificate completed" src="https://img.zzxc.ru/img/post-19/post19-6-npm-get-cf-cert-4.png" /></a>
<br><br>
<p>Теперь переходим в раздел <b>SSL/TLS</b> > <b>Overview</b>. Тут необходимо выставить режим <b>Full strict</b> либо <b>Full</b>. Работать будет в обоих случаях но режим <b>Full strict</b> предпочтительнее.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-get-cf-cert-5-1.png" target="_blank"><img border="0" alt="cloudflare SST/TLS mode" src="https://img.zzxc.ru/img/post-19/post19-6-npm-get-cf-cert-5-1.png" /></a>
<br><br>
<p>Отправляемся в раздел <b>DNS</b>. Добавляем домен либо поддомен с включённой проксификацией.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-add-cf-domain-1.png" target="_blank"><img border="0" alt="cloudflare add new-domain" src="https://img.zzxc.ru/img/post-19/post19-6-npm-add-cf-domain-1.png" /></a>
<br><br>
<p>Далее весь процесс будет происходить в <b>NPM</b>. Идём в раздел <b>SSL Certificates</b> и добавляем новый <b>Custom</b> SSL сертификат.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-1.png" target="_blank"><img border="0" alt="Nginx Proxy Manager add new Certificate" src="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-1.png" /></a>
<br><br>
<p>В появившемся окне заполняем</p>
<ul>
<li><b>Name *</b> - любое имя для сертификата</li>
<li><b>Certificate Key*</b> - путь до фаила example.com.key</li>
<li><b>Certificate*</b> - путь до фаила example.com.pem</li>
</ul>
<br>
<p>Последний пункт <b>Intermediate Certificate</b> необязательный поэтому его не заполняем. У меня фаил домена для примера называется example.com у вас же будет ваш домен поэтому заполняйте с учётом названия вашего домена. После чего нажимаем <b>Save</b>.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-2.png" target="_blank"><img border="0" alt="Nginx Proxy Manager add new Certificate 2" src="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-2.png" /></a>
<br><br>
<p>Мы добавили новый сертификат в <b>NPM</b></p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-3.png" target="_blank"><img border="0" alt="Nginx Proxy Manager add new Certificate 3" src="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-3.png" /></a>
<br><br>
<p>Идём в раздел <b>Hosts</b> > <b>Proxy Hosts</b></p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-4.png" target="_blank"><img border="0" alt="Nginx Proxy Manager add new host" src="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-4.png" /></a>
<br><br>
<p>Добавляем новый домен/хост. Я добавлю хост для самого <b>NPM</b></p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-5.png" target="_blank"><img border="0" alt="Nginx Proxy Manager add new host 2" src="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-5.png" /></a>
<br><br>
<p>Переходим в раздел <b>SSL</b> и выбираем наш кастомный сертификат</p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-6.png" target="_blank"><img border="0" alt="Nginx Proxy Manager add new host 3" src="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-6.png" /></a>
<br><br>
<p>Выставляем для него необходимые настройки и применяем</p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-7.png" target="_blank"><img border="0" alt="Nginx Proxy Manager add new host 4" src="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-7.png" /></a>
<br><br>
<p>В итоге получаем рабочий хост с SSL/TLS сертификатом на 15 лет</p>
<a href="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-8.png" target="_blank"><img border="0" alt="Nginx Proxy Manager add new host 5" src="https://img.zzxc.ru/img/post-19/post19-6-npm-set-cf-cert-8.png" /></a>
<br><br>
<p>С <b>CloudFlare</b> всё.</p>
<br><br><br><br><br><br>
<H2 id="free-cf-wildcard">Получаем бесплатный wildcard сертификат от letsencrypt</H2>
<p>Wildcard сертификат от letsencrypt это отличная альтернатива сертификату cloudflare, т.к. для этого сертификата не обязательно включать проксирование. На некоторых сервисах принудительное проксирование ограничивает нас в загрузке фаилов не больше чем 100 mb, а тут у нас получается развязаны руки - хотим включаем проксирование не хотим не включаем.</p>
<p>К сожалению этот сертификат нельзя получить для freenom доменов(.cf .tk .gq .ga .ml).</p>
<p>На главной странице <b>Overview</b> прокручиваем в самый низ до раздела <b>API</b> и нажимаем справа <b>Get your API token</b>.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-1.png" target="_blank"><img border="0" alt="Cloudflare wildcard letsencrypt Certificate 1" src="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-1.png" /></a>
<br><br>
<p>На этой странице создаём новый токен нажав на <b>Create Token</b>.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-2.png" target="_blank"><img border="0" alt="Cloudflare wildcard letsencrypt Certificate 2" src="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-2.png" /></a>
<br><br>
<p>Нас перекинет на страницу где уже содержатся разнообразные шаблоны.</p>
<p>В самом низу в разделе <b>Create Custom Token</b> создаём свой шаблон. Нажав на соответствующую кнопку <b>Get started</b>.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-3.png" target="_blank"><img border="0" alt="Cloudflare wildcard letsencrypt Certificate 3" src="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-3.png" /></a>
<br><br>
<p>Придумываем ему название, я написал туда <b>NginxProxyManager</b>, можете написать любое угодное Вам название.</p>
<p>В разделе <b>Permissions</b> в выпадающем списке выбираем <b>Zone</b>. Во втором выпадающем списке выбираем <b>DNS</b>. В третьем <b>Edit</b>.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-4.png" target="_blank"><img border="0" alt="Cloudflare wildcard letsencrypt Certificate 4" src="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-4.png" /></a>
<br><br>
<p>Всё остальное оставляем по умолчанию и нажимаем <b>Continue to summary</b>.</p>
<p>Попадаем на страницу где нам ещё раз показывают какими правами будет наделён наш токен, соглашаемся нажав по кнопке <b>Create Token</b>.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-5.png" target="_blank"><img border="0" alt="Cloudflare wildcard letsencrypt Certificate 5" src="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-5.png" /></a>
<br><br>
<p>После этого нас перекинет на страницу с самим токеном. Обязательно сохраните его, потому что во второй раз попасть на эту страницу Вы не сможете, придётся отзывать токен и создавать сначала если по какой то причине он у вас потеряется.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-6.png" target="_blank"><img border="0" alt="Cloudflare wildcard letsencrypt Certificate 6" src="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-6.png" /></a>
<br><br>
<p>Так же на этой странице будет строка для проверки curl'ом можно протестировать в терминале, но это не обязательно.</p>
<br><br>
<p>Возвращаемся в NPM, идём в пункт <b>SSL Certificates</b> и добавляем сертификат <b>Let's Encrypt</b></p>
<a href="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-7.png" target="_blank"><img border="0" alt="Cloudflare wildcard letsencrypt Certificate 7" src="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-7.png" /></a>
<br><br>
<br><br>
<p>В поле <b>Domain Names *</b> вписываем <b>*.example.com</b> и <b>example.com</b> (подставьте свой домен вместо example.com). Можно по желанию также вписать сюда и основной домен, я не стал вписывать.</p>
<p>Нажимаем на радио-кнопки <b>Use a DNS Challenge</b> и <b>I Agree to the Let's Encrypt Terms of Service</b></p>
<p>В разделе <b>DNS Provider</b> выбираем <b>Cloudflare</b></p>
<p>В появившемся поле вместо 0123456789abcdef0123456789abcdef01234567 вписываем свой токен и нажимаем <b>Save</b>.</p>
<a href="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-8.png" target="_blank"><img border="0" alt="Cloudflare wildcard letsencrypt Certificate 8" src="https://img.zzxc.ru/img/post-19/post19-npm-set-cf-letsencrypt-wildcard-cert-8.png" /></a>
<br><br>
<p>Раздел <b>Propagation Seconds</b> можно не заполнять.</p>
<p>Ожидаем несколько минут, обычно около 1 минуты, и получаем готовый <b>wildcard</b> сертификат.</p>
<p>Теперь мы можем использовать его для всех поддоменов. Для этого просто выбираем его в списке ssl сертификатов, вместо того чтобы запрашивать по сертификату для каждого поддомена. Npm в свою очередь сам позаботится об автообновлении этого сертификата.</p>
<br><br><br><br><br><br>
<H2 id="nginx-rewrites">Как сделать 301 и 302 редирект</H2>
<p>Иногда так бывает что вы обновили какой то свой старый сайт и у него изменяется структура и названия страниц. А траффик то идёт на старые страницы где пользователей любезно встречает страница 404. Самым правильным решением в этом случае будет сделать 301 редирект со старой страницы на новую. В этом случае пользователи будут автоматически перенаправлены на нужную страницу. Помимо этого поисковые системы не влепят вам штрафные баллы за такие финты ушами с исчезновением некоторых страниц. </p>
<p>Чтобы сделать такие редиректы открываем NPM далее идём в <b>Proxy Hosts</b> выбираем необходимый домен, справа нажимаем на троеточие и выбираем пункт <b>Edit</b>. В открывшемся окне выбираем пункт <b>Advanced</b> </p>
<p>Остаётся только вписать ваши редиректы. Делается это с помощью синтаксиса NGINX </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">rewrite ^/old-page$ /new-page permanent;</div>
<p>Приведу пару примеров </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">rewrite ^/blog/$ /blog.html permanent;<br>
rewrite ^/drugaya_forma\.html$ /different-shape.html permanent;<br>
rewrite ^/deleted\.html$ /404.html permanent;</div>
<p>Ура всё работает!!! Mission Completed!</p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com54tag:blogger.com,1999:blog-244151671096808002.post-87473855010818601862021-08-12T16:49:00.158+03:002023-11-09T20:51:57.041+03:00Wireguard VPN в Docker контейнере<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2021/08/docker-compose-wireguard-linuxserver.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="docker-compose + linuxserver + wireguard" border="0" src="https://img.zzxc.ru/img/post-18/logo-18-dc-wireguard.jpg"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Привет. Сегодня будем поднимать <b>WireGuard VPN</b> внутри докер контейнера. Использовать при этом будем <b>Docker-Compose</b> фаил от LinuxServer. Так же мы рассмотрим варианты подключения клиентов к получившемуся VPN туннелю.
</div>
<a name='more'></a><br><br>
<H2>Зачем/для чего нужен WireGuard</H2>
<p>Ситуаций когда может пригодится свой <b>VPN</b> на самом деле вагон и маленькая тележка. Вот некоторые из них:</p>
<ul>
<li>Мы подключились со смартфона к публичной/открытой <b>wifi сети</b> и не хотим стать жертвой <b>MITM атаки</b></li>
<li>Для организации виртуальной локальной сети между клиентами подключенными к VPN</li>
<li>Контент который мы хотим посмотреть недоступен для нашего региона</li>
<li>Контент который мы хотим посмотреть <b>заблокирован</b> в стране в которой мы находимся</li>
<li>Какие то специальные <b>акции и предложения</b> для определённой страны/города/региона</li>
<li>Просто хотим <b>скрыть</b> свой настоящий <b>ip адрес</b> или <b>местонахождение</b></li>
<li>В некоторых случаях помогает улучшить <b>Ping</b> и <b>Delay</b> в играх</li>
<li>Другое...</li>
</ul>
<p>Обладая большим количеством разных серверов, есть соблазн поставить такой VPN на каждый из них. Тем более что это очень просто и быстро. К тому же клиенты под <b>Wireguard</b> есть на <b>Windows</b> / <b>Linux</b> / <b>Mac</b> / <b>Android</b> / <b>ios</b></p>
<br><br><br><br><br><br>
<H2>Необходимые требования</H2>
<p>Чтобы всё получилось нам понадобится:</p>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>Установленный <b><a href="/p/virtualization-docker-full-install.html" target="_blank" >Docker + Docker-Compose</a></b></li>
<li>Фаил <b>Docker-Compose</b> от linuxserver любо из моего репозитория на гитхабе (см ниже)</li>
<li>10 - 15 минут времени</li>
</ul>
<br><br><br><br><br><br>
<H2>Подготовка</H2>
<p>Я привык хранить докер контейнеры со всей нужной для их работы информацией в отдельных директориях, а не где то там в <b>var</b>. Создадим специальную папку для <b>wireguard</b>, а так же юзера с нужным <b>id</b>'шником. И дадим этому юзеру права на только что созданную папку</p>
<p>Если помимо пользователя Root у вас нет никаких других пользователей, то желательно создать нового, т.к. это лучше для безопасности вашего сервера.</p>
<p>Добавим пользователя [необязательный шаг]</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo useradd -s /bin/bash -u 1337 -G sudo -m username</span></div>
<br>
<p>Установим ему пароль [необязательный шаг]</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">passwd username</span></div>
<br>
<p>Создадим директории</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/vpn/wireguard</span></div>
<br>
<p>Назначим пользователя владельцем этой директорий</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/vpn/wireguard</span></div>
<br><br><br><br><br><br>
<H2>Установка</H2>
<p>Я долго думал как лучше предоставить фаил docker-compose. Пришёл к выводу - что лучше оставлю сразу 2 ссылки. Дело в том что прогресс не стоит на месте и может случиться так, что фаил который я предоставлю устареет через какое то время. Для такого случая я оставлю ссылку на официальный докер хаб где всегда можно найти актуальный docker-compose фаил</p>
<p>Переходим в директорию <b>/app/vpn/wireguard</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/vpn/wireguard</span></div>
<br>
<p>Создаём фаил <b>docker-compose.yaml</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<br>
<p>И наполняем его содержимым из выбранного вами варианта.</p>
<p>1) Мой <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/VPN/Wireguard/linuxserver-wireguard/docker-compose.yaml">Docker-Compose фаил</a></b> на github</p>
<p>2) Официальный докер хаб <b><a target="_blank" rel="nofollow" href="https://hub.docker.com/r/linuxserver/wireguard">LinuxServer/Wireguard</a></b> где всегда можно найти актуальную версию docker-compose фаила</p>
<br>
<p>Рассмотрим основные параметры:</p>
<ul>
<li><b><span style="color:#f39c12">PUID=1000</span></b> - ID пользователя от которого запускаем контейнер. Если вы создавали пользователя с айдишником 1337 то вписываем сюда 1337.</li><br>
<li><b><span style="color:#f39c12">PGID=1000</span></b> - ID группы от которой запускаем контейнер. Если вы создавали пользователя с айдишником 1337 то вписываем сюда 1337.<br><br>Если у Вас уже есть пользователь, его <b>UID</b> и <b>GID</b> можно узнать введя в терминале команду id будучи залогиненным за этого пользователя.</li><br>
<li><b><span style="color:#f39c12">TZ=Europe/London</span></b> - Таймзона например Europe/Netherlands</li><br>
<li><b><span style="color:#f39c12">SERVERURL=auto</span></b> - Если у нас есть домен можем вписать его сюда для удобства либо оставляем значение по умолчанию</li><br>
<li><b><span style="color:#f39c12">SERVERPORT=51820</span></b> - Порт на котором будет висеть wireguard. Не забываем разрешить в фаерволле</li><br>
<li><b><span style="color:#f39c12">PEERS=1</span></b> - Количество создаваемых конфигов. Хорошая практика 1 конфиг = 1 клиент, а не сажать 10 клиентов на 1 конфиг. При подключении каждый клиент будет иметь уникальный ip в виртуальной подсети</li><br>
<li><b><span style="color:#f39c12">PEERDNS=auto</span></b> - Можно вписать кастомные днс или например 1.1.1.1 или оставить значение auto</li><br>
<li><b><span style="color:#f39c12">INTERNAL_SUBNET=10.13.13.0</span></b> - Внутренняя виртуальная сеть</li><br>
<li><b><span style="color:#f39c12">ALLOWEDIPS=0.0.0.0/0</span></b> - Диапазоны ip к которым пиры могут обращаться через VPN тунель. По стандарту все ip.<br><br>Если вы хотите только создавать тунель и при этом не хотите менять свой ip адрес на ip адрес сервера VPN, то тогда тут необходимо вписать маску сети, например <b>10.0.0.0/8</b> или <b>10.13.13.0/24</b></li><br>
<li><b><span style="color:#f39c12">/app/vpn/wireguard/config:/config</span></b> - Место для хранения данных докер контейнера</li><br>
<li><b><span style="color:#f39c12">PERSISTENTKEEPALIVE_PEERS=all</span></b> - Для каких пиров устанавливать постоянное рукопожатие через каждые 25 секунд. Я обычно ставлю all, либо можно поставить вот так 1,4,laptop и т.д. </li><br>
<li><b><span style="color:#f39c12">LOG_CONFS=false</span></b> - Отображать или нет сгенерированные QR-коды в логе docker. </li><br>
</ul>
<p>С настройками разобрались. Стартуем контейнер:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br>
<p>При запуске будут созданы конфиги в папке <b>/app/vpn/wireguard/config</b></p>
<p>Именно эти конфиги мы используем в клиенте <b>wireguard</b></p>
<br><br><br><br><br><br>
<H2>Параметр PersistentKeepalive</H2>
<p><b>PersistentKeepalive</b> в <b>WireGuard</b> является настройкой, позволяющей поддерживать постоянное активное соединение между двумя узлами (например, между клиентом и сервером). Эта опция полезна в случаях, когда сетевое оборудование или программное обеспечение между узлами может закрывать неактивные соединения. </p>
<p>Когда опция <b>PersistentKeepalive</b> включена и установлена определенная частота, WireGuard автоматически отправляет пакеты "<b>keepalive</b>" между узлами для поддержания активного состояния соединения. Это позволяет избежать закрытия соединения между узлами, даже если они не обмениваются актуальными данными. </p>
<p>Частота <b>PersistentKeepalive</b> определяется в секундах и указывается в конфигурационном файле для каждого узла. Например, PersistentKeepalive = 25 означает, что WireGuard будет отправлять пакеты "keepalive" каждые 25 секунд. </p>
<p>PersistentKeepalive особенно полезен в ситуациях, когда маршрутизаторы или брандмауэры на сетевом пути между узлами имеют ограничения на время бездействия и могут закрывать неактивные соединения. Использование PersistentKeepalive помогает поддерживать активное соединение и предотвращает проблемы с нестабильным соединением в таких случаях. </p>
<p>Однако следует учитывать, что использование PersistentKeepalive может потреблять небольшой объем дополнительного трафика, поскольку пакеты "keepalive" отправляются регулярно даже при отсутствии актуальных данных для передачи. Поэтому рекомендуется выбирать разумную частоту, чтобы избежать излишней нагрузки на сеть. </p>
<p>Для того чтобы задействовать работу этого механизма необходимо просто добавить строку </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">PersistentKeepalive = 25</div>
<p>в секцию [Peer] вашего желаемого конфига(пира). Теперь связь будет ещё более стабильна.</p>
<br><br><br><br><br><br>
<H2>Статистика</H2>
<p>Мы можем посмотреть статистику в которой можно увидеть кто сейчас подключен к туннелю и какой ему присвоен ip. Там же можно увидеть статистику по трафику. Чтобы посмотреть статистику - выполняем:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker exec -it wireguard wg</span></div>
<br>
<a href="https://img.zzxc.ru/img/post-18/post18-1-statistic.jpg" target="_blank"><img border="0" alt="wireguard statistic" src="https://img.zzxc.ru/img/post-18/post18-1-statistic.jpg" /></a><br><br>
<p>Чтобы каждый раз не вводить команду и смотреть статистику в реальном времени, обновляемую каждую секунду, воспользуйтесь данной командой</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">watch -n 1 -c sudo docker exec -it wireguard wg</span></div>
<br><br><br><br><br><br>
<H2>Управление конфигами</H2>
<p>Бывают ситуации, когда нужно изменить количество конфигов - например добавить. Для этого необходимо сначала изменить параметр <b>PEERS=</b> в <b>docker-compose.yaml</b> а затем выполнить:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d --force-recreate</span></div>
<p>Имейте в виду что будут перегенерированы все конфиги включая старые. Это одновременно является <b>минусом</b> - все старые конфиги перестанут работать и придётся на каждом клиенте опять закачивать конфиг. И <b>плюсом</b> - если по какой то причине наши конфиги попали туда куда не планировалось, то там они тоже перестанут работать</p>
<br><br><br><br><br><br>
<H2>QR код для мобильного приложения</H2>
<p>Если мы планируем использовать <b>VPN на смартфоне</b>, то есть отличная функция которая упростит жизнь. С её помощью мы можем получить все настройки для клиента wireguard при помощи <b>QR кода</b>. Выполняем:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker exec -it wireguard /app/show-peer <span style="color:#f39c12">НОМЕР-ПИРА</span></span></div>
<p>QR код будет выведен на экран прямо в терминале - гораздо удобнее чем заливать вручную конфиг на телефон.</p>
<br><br><br><br><br><br>
<H2>Подключение</H2>
<p>Официально <b>wireguard</b> имеет клиенты почти под все OS. То есть на <b>Windows / Linux / Mac / BSD / Android / iOS и другие</b>. Я буду рассматривать подключение с помощью клиента под windows</p>
<p>Переходим на официальный сайт Wireguard в раздел <b><a href="https://www.wireguard.com/install/" target="_blank" rel="nofollow">install</a></b>. Скачиваем клиент, устанавливаем его. После того как установили открываем и добавляем наш конфиг (он же peer) и нажимаем подключить:</p>
<a href="https://img.zzxc.ru/img/post-18/post18-2-winclient.jpg" target="_blank"><img border="0" alt="wireguard winndows client" src="https://img.zzxc.ru/img/post-18/post18-2-winclient.jpg" /></a><br><br>
<p>Наслаждаемся полученным результатом. Как я и говорил очень быстро и просто.</p>
<br>
<a href="https://img.zzxc.ru/img/post-18/post18-3-result.jpg" target="_blank"><img border="0" alt="wireguard vpn result" src="https://img.zzxc.ru/img/post-18/post18-3-result.jpg" /></a>
<br><br><br><br><br><br>
<H2>Как установить свой порт</H2>
<p>Некоторые пользователи предпочитают поднимать vpn wireguard на нестандартном порту. Для того чтобы это сделать понадобится изменить 1 параметр в docker-compose.yml</p>
<p>Переходим в папку с wireguard</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/vpn/wireguard</span></div>
<br>
<p>Редактируем фаил docker-compose.yml</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano docker-compose.yml</span></div>
<br>
<p>Теперь меняем порт для хоста(выделен цветом) на любой другой.</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">ports:<br>
- <span style="color:#ffdd31">51820</span>:51820/udp</div>
<br>
<p>После чего обязательно перезагружаем контейнер wireguard</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d --force-recreate</span></div>
<br>
<p>Для примера я поменял стандартный порт на <b>5182</b>. Теперь необходимо сменить этот порт в самом подключении. Покажу на примере мобильного приложения. Обратите внимание что порт надо поменять в двух местах!</p>
<a href="https://img.zzxc.ru/img/post-18/post18-2-wireguard-change-port.jpg" target="_blank"><img border="0" alt="wireguard change port" src="https://img.zzxc.ru/img/post-18/post18-2-wireguard-change-port.jpg" /></a>
<br><br>
<p>После внесения этих изменений у вас всё заработает.</p>
<a href="https://img.zzxc.ru/img/post-18/post18-2-wireguard-change-port-2.jpg" target="_blank"><img border="0" alt="wireguard change port 2" src="https://img.zzxc.ru/img/post-18/post18-2-wireguard-change-port-2.jpg" /></a>
<br><br>
<p>Mission completed!</p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com7tag:blogger.com,1999:blog-244151671096808002.post-20984368901911134692021-06-02T02:15:00.119+03:002023-01-13T00:45:30.728+03:00Debian + tigervnc + xfce<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2021/06/debian-tigervnc-xfce.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="tigervnc + debian + xfce" border="0" src="https://img.zzxc.ru/img/post-17/logo-17.jpg"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Всё началось одним летним вечером. В распоряжении появился слабенький ноут на котором нет картинки. Толи дисплей, толи видяха пришли в негодность. Хозяин девайса уже хотел его выкидывать, но не тут то было. Вдохнули буквально новую жизнь в данный аппарат и теперь он служит верой и правдой выполняя возложенные на него задачи - рассматривать которые в пределах этой статьи мы не будем, зато рассмотрим как поставить <b>VNC</b> сервер на <b>Linux</b> (debian)
</div>
<a name='more'></a><br><br>
<h2>Установка Xfce</h2>
<p>Тут всё просто. Ставим необходимые пакеты</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils</span></div>
<p>Установка всех пакетов займет какое то количество времени и напрямую зависит от мощности вашего сервера.</p>
<br><br><br><br><br><br>
<h2>Установка Tigervnc</h2>
<p>В дебиановских репах есть как минимум 3 известных мне VNC сервера:</p>
<ul>
<li><b>x11vnc</b></li>
<li><b>TightVNC</b></li>
<li><b>TigerVNC</b></li>
</ul>
<p>У каждого из них есть свои плюсы и минусы. Ставим <b>TigerVNC</b>:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo apt install tigervnc-standalone-server tigervnc-common lightdm</span></div>
<p>Если всплывёт сообщение то выбираем <b>lightdm</b></p>
<a href="https://img.zzxc.ru/img/post-17/post17-0.jpg" target="_blank"><img border="0" alt="lightdm" src="https://img.zzxc.ru/img/post-17/post17-0.jpg" /></a><br><br>
<br>
<p>Как только установка будет завершена, необходимо выполнить команду <b>vncserver</b> которая создаст фаил конфигурации. Не используем при этом sudo!</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">vncserver</span></div>
<p>Нам предложат ввести и подтвердить пароль. Так же спросят про <b>view-only</b> пароль в котором у пользователя нет возможности управлять через клавиатуру и мышь - ставим по желанию.</p><br>
<a href="https://img.zzxc.ru/img/post-17/post17-1.jpg" target="_blank"><img border="0" alt="vncserver" src="https://img.zzxc.ru/img/post-17/post17-1.jpg" /></a><br><br>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">Если вы хотите изменить пароль или добавить пароль для просмотра, вы можете это сделать с помощью команды <span style="color:#87a800">vncpasswd</span></div>
<p>Выполняя команду <b>vncserver</b> создаётся конфигурационный фаил в директории <b>~/.vnc</b> если что то пойдёт не так - просто удалите эту папку и начните настройку с команды <b>vncserver</b></p>
<br>
<p>Обратите внимание на <b>:1</b> после хостнейма. Данная информация поможет нам определить порт на котором работает <b>VNC сервер</b>. В данном примере сервер работает на <b>TCP</b> порту <b>5901</b> (5900+1). Если создать ещё 1 инстанс VNC сервера то он запуститься на следующем свободном порту. например <b>:2</b>, запуститься на порту <b>5902</b> (5900+2).</p>
<p>Перед тем как приступить к следующему шагу - остановим VNC инстанс используя команду <b>vncserver</b> с опцией <b>-kill</b> и номером сервера в качестве аргумента. В нашем случае сервер запущен на порту <b>5901</b> (:1), поэтому остановим его командой:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">vncserver -kill :1</span></div>
<br><br><br><br><br><br>
<h2>Конфигурация VNC сервера</h2>
<p>После того как мы успешно установили <b>Xfce</b> и <b>TigerVNC</b> нам необходимо их сконфигурировать для правильной работы. Открываем</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano ~/.vnc/xstartup</span></div>
<p>И приводим к виду:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">#!/bin/sh<br>
unset SESSION_MANAGER<br>
unset DBUS_SESSION_BUS_ADDRESS<br>
exec startxfce4 </div>
<p>Сохраняем скрипт и так же даём ему необходимые права для корректной работы</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">chmod u+x ~/.vnc/xstartup</span></div>
<br>
<p>Мы можем передавать дополнительные параметры <b>VNC серверу</b>. Для этого нужно создать конфигурационный фаил:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">nano ~/.vnc/config</span></div>
<p>Пример параметров</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">geometry=1920x1080<br>
dpi=96<br>
rfbport 5901</div>
<br><br><br><br><br><br>
<h2>Конфигурация Systemd</h2>
<p>Данный шаг позволит нам иметь возможность легко стартовать, останавливать и перезагружать службу VNC сервера.</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo nano /etc/systemd/system/vncserver@.service</span></div>
<p>Приводим к виду</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">[Unit]<br>
Description=Remote desktop service (VNC)<br>
After=syslog.target network.target<br>
<br>
[Service]<br>
Type=simple<br>
User=<br>
PAMName=login<br>
PIDFile=/home/%u/.vnc/%H%i.pid<br>
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill :%i > /dev/null 2>&1 || :'<br>
ExecStart=/usr/bin/vncserver :%i -geometry 1440x900 -alwaysshared -fg<br>
ExecStop=/usr/bin/vncserver -kill :%i<br>
Restart=on-failure<br>
<br>
[Install]<br>
WantedBy=multi-user.target</div>
<p>В графе <b>User=</b> <u>обязательно впишите своего пользователя</u> от которого будет запускаться процесс VNC сервера.</p><br>
<p>Теперь нам нужно оповестить <b>Systemd</b> о новой службе для этого выполняем</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo systemctl daemon-reload</span></div>
<br>
<p>Разрешаем её запуск</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo systemctl enable vncserver@1.service</span></div>
<br>
<p>Запускаем</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo systemctl start vncserver@1.service</span></div>
<br>
<p>Смотрим статус</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo systemctl status vncserver@1.service</span></div>
<br>
<a href="https://img.zzxc.ru/img/post-17/post17-2.jpg" target="_blank"><img border="0" alt="vncserver systemd service" src="https://img.zzxc.ru/img/post-17/post17-2.jpg" /></a>
<br><br><br><br><br><br>
<h2>Подключаемся к VNC</h2>
<p>Из коробки у нас к сожалению отсутствует какое либо шифрование и это может стать предметом для обсуждения <b>mitm</b> атак или сниффинга пакетов.</p>
<p>Но мы всё равно можем легко поправить данную недоработку подключаясь к <b>VNC</b> через <b>SSH туннель</b>, который будет шифровать наше соединение и скрывать его от лишних глаз, перенаправляя траффик через себя.</p><br>
<p><b>SSH туннель на Linux / BSD / Mac OS:</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">ssh -L 5901:127.0.0.1:5901 -N -f -l username server_ip_address</span></div>
<p>После ввода данной команды у нас попросят пароль. Не забудьте вписать имя вашего пользователя и ip адрес сервера. Теперь в VNC клиенте необходимо изменить "<b>удалённый ip адрес сервера:port</b>" на "<b>localhost:port</b>" т.к. мы хотим подключаться по зашифрованному соединению через <b>ssh туннель</b>.</p><br>
<p><b>SSH туннель на Windows:</b> <b><a target="_blank" rel="nofollow" href="https://www.putty.org/">PuTTY</a></b></p>
<p>Открываем <b>PuTTY</b>, вписываем ip адрес сервера. Переходим в раздел <b>Connection</b> > <b>SSH</b> > <b>Tunnels</b>. Вписываем порт(5901) VNC сервера в поле <b>Source Port</b>. А в поле <b>Destination</b> вписываем server_ip_address:5901 и нажимаем кнопку <b>add</b> </p><br>
<a href="https://img.zzxc.ru/img/post-17/post17-3.jpg" target="_blank"><img border="0" alt="putty ssh port forwarding" src="https://img.zzxc.ru/img/post-17/post17-3.jpg" /></a><br><br>
<p>Возвращаемся в раздел <b>Session</b> вписываем любое угодное название для этой сессии и сохраняем тем самым освобождаем себя от необходимости вводить каждый раз всё то что мы вводили до этого. Теперь весь процесс сводиться к тому чтобы открыть <b>PuTTY</b>, выбрать нашу сессию и подключиться к ней.</p><br>
<p><b>SSH туннель на Windows:</b> <b><a target="_blank" rel="nofollow" href="https://www.bitvise.com/ssh-client-download">Bitvise SSH Client</a></b></p>
<p>Открываем настройки подключения секцию <b>C2S</b> (client to server) и делаем как на скрине ниже </p><br>
<a href="https://img.zzxc.ru/img/post-17/post17-4-bitwise-pf.jpg" target="_blank"><img border="0" alt="Bitvise SSH tunnel" src="https://img.zzxc.ru/img/post-17/post17-4-bitwise-pf.jpg" /></a>
<br><br>
<p>Нам остаётся лишь подключиться к нашему VNC серверу через VNC клиент, я обычно использую <a href="https://www.realvnc.com/en/connect/download/viewer/" target="_blank" rel="nofollow">VNC Viewer</a></p><br>
<p>Вводим как на скрине</p>
<a href="https://img.zzxc.ru/img/post-17/post17-5-settings.jpg" target="_blank"><img border="0" alt="VNC Viewer Settings" src="https://img.zzxc.ru/img/post-17/post17-5-settings.jpg" /></a>
<br><br><br><br><br><br>
<h2>Статичный порт VNC</h2>
<p>Если вы хотите чтобы VNC всегда запускался на одном и том же порту, добавьте значение --rfbport ПОРТ в <b>~/.vnc/config</b> либо в саму команду запуска в <b>/etc/systemd/system/vncserver@.service</b> например вот так</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">ExecStart=/usr/bin/vncserver :%i -geometry 1440x900 --rfbport 10000 -alwaysshared -fg</div>
<br><br><br><br><br><br>
<h2>Результат</h2>
<a href="https://img.zzxc.ru/img/post-17/post17-5.jpg" target="_blank"><img border="0" alt="vnc successful connection" src="https://img.zzxc.ru/img/post-17/post17-5.jpg" /></a><br><br>
<br><br><br><br><br><br>
<h2>Автологин</h2>
<p>Несмотря на то что на работу самого VNC это никак не повлияет - бывает полезно сделать автоматический логин. Чтобы не вводить свой логин и пароль на самом устройстве.</p>
<p>Для этого необходимо отредактировать фаил: <b>/etc/lightdm/lightdm.conf</b></p>
<p>Внеся изменения в эти строки:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">[Seat:*]<br>
autologin-user=$USER<br>
autologin-user-timeout=0</div>abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com0tag:blogger.com,1999:blog-244151671096808002.post-32182975690986973192021-03-11T02:04:00.169+03:002023-01-24T16:21:17.810+03:00Docker + SQL + Zenno Poster Быстрый старт<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2021/03/docker-sql-zennoposter-faststart.html"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img
alt="Docker + SQL + Zenno Poster Быстрый старт " border="0" src="https://img.zzxc.ru/img/post-16/logo-16.jpg"
width="100%" /></a>
</div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Расширяем возможности <b><a href="/p/zenno-poster-intro.html">Zenno Poster</a></b>. Установим полноценную "карманную" базу данных <b>MySQL</b> с помощью <b><a href="/p/virtualization-docker.html">Docker</a></b>. Подключимся и создадим тестовую базу данных. Создадим тестовый проект и научимся взаимодействовать со всем этим добром.
</div>
<br />
<a name='more'></a><br><br>
<h2>Необходимые требования</h2>
<ul>
<li>Сервер с Root доступом. Рекомендую <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b></li>
<li>Установленный и работающий <b>Docker</b> (его установка была описана <b><a href="/2021/03/installing-docker-basic-env.html">тут</a></b>)</li>
<li>База данных. Мы создадим отдельный <b>Docker</b> контейнер с <b>MySQL</b> и нашей переносной базой.</li>
<li>Клиент для подключения к созданной базе данных</li>
<li>Лицензия <b><a target="_blank" rel="dofollow" href="/p/zenno-poster-intro.html">Zenno Poster</a></b></li>
<li>Шаблон <b>Zenno Poster</b></li>
</ul>
<br><br><br><br><br><br>
<h2>Подготовка</h2>
<p>Создадим папку где будем хранить контейнер с базой. </p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo mkdir -p /app/publicproxy-db/DB</span></div>
<br>
<p>Выставляем необходимые права</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo chown -R $USER:$USER /app/publicproxy-db</span></div>
<br>
<p>Создаём и заполняем фаил <b>docker-compose.yml</b> <b><a target="_blank" rel="nofollow" href="https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/Database/MariaDB/1-basic-mariadb/docker-compose.yml">таким содержимым</a></b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo nano /app/publicproxy-db/docker-compose.yml</span></div>
<br>
<p>В процессе заполнения обращаем внимание на переменные окружения в которых нас интересуют такие параметры как:
<ul>
<li><b>Пользователь</b>: <span style="color:#FF3152">MYSQL_USER</span></li>
<li><b>Пароль</b>: <span style="color:#FF3152">MYSQL_PASSWORD</span></li>
<li><b>Пароль Root</b>: <span style="color:#FF3152">MYSQL_ROOT_PASSWORD</span></li>
<li><b>База данных</b>: <span style="color:#FF3152">MYSQL_DATABASE</span></li>
<li><b>Внешний Порт</b>: <span style="color:#FF3152">10000:3306</span></li>
</ul>
<br><br>
<p>Переходим в только что созданную папку</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">cd /app/publicproxy-db</span></div>
<br>
<p>Стартуем наш контейнер.</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo docker-compose up -d</span></div>
<br>
<a href="https://img.zzxc.ru/img/post-16/post16-1.jpg" target="_blank"><img border="0" alt="Docker MySQL" src="https://img.zzxc.ru/img/post-16/post16-1.jpg" /></a><br>
<p>Если у вас тоже самое что на скрине - поздравляю, можно переходить к следующему шагу</p>
<br><br><br><br><br><br>
<h2>Подключаемся к нашей БД</h2>
<p>Для подключения нам понадобится Клиент <b><a target="_blank" rel="nofollow" href="https://www.heidisql.com/download.php">Heidisql</a></b>. Подойдёт <b>Portable</b>
версия. Рекомендую поставить стиль <b>Charcoal Dark Slate</b> и шрифт <b>Arial 12 px</b>.</p>
<p>При открытии <b>Heidisql</b> нас приветствует мастер настройки новых подключений</p>
<a href="https://img.zzxc.ru/img/post-16/post16-2.jpg" target="_blank"><img border="0" alt="Heidisql settings" src="https://img.zzxc.ru/img/post-16/post16-2.jpg" /></a><br><br>
<p>Советую сразу настроить папки как вам удобно. Создаём новое подключение которое заполняем данными из фаила <b>docker-compose.yml</b></p>
<ul>
<li><b>ip адрес Хоста</b></li>
<li><b>Пользователь</b></li>
<li><b>Пароль</b></li>
<li><b>Порт</b></li>
</ul>
<p>Если всё сделано правильно то при подключении мы увидим:</p>
<a href="https://img.zzxc.ru/img/post-16/post16-3.jpg" target="_blank"><img border="0" alt="Heidisql successful connection" src="https://img.zzxc.ru/img/post-16/post16-3.jpg" /></a>
<br><br><br><br><br><br>
<h2>Работаем с БД через клиент</h2>
<p>Самое время потренироваться на чём нибудь.</p>
<p>Для начала нужно создать саму базу данных. В <b>Heidisql</b> открываем вкладку запрос, вставляем туда то что написано в блоке ниже и нажимаем <b>F9</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">CREATE TABLE IF NOT EXISTS `public_proxy_checker` (<br>
`id` int unsigned NOT NULL AUTO_INCREMENT,<br>
`proxy_full` varchar(35) DEFAULT NULL,<br>
`proxy_date` datetime DEFAULT NULL,<br>
`proxy_unixdate` varchar(35) DEFAULT NULL,<br>
`proxy_ip` varchar(35) DEFAULT NULL,<br>
`proxy_port` varchar(35) DEFAULT NULL,<br>
`proxy_type` varchar(35) DEFAULT NULL,<br>
`proxy_country` varchar(35) DEFAULT NULL,<br>
`proxy_country_code` varchar(35) DEFAULT NULL,<br>
`proxy_region` varchar(35) DEFAULT NULL,<br>
`proxy_zip` varchar(35) DEFAULT NULL,<br>
`proxy_lat` varchar(35) DEFAULT NULL,<br>
`proxy_lon` varchar(35) DEFAULT NULL,<br>
`proxy_timezone` varchar(35) DEFAULT NULL,<br>
`proxy_isp` varchar(35) DEFAULT NULL,<br>
`proxy_org` varchar(35) DEFAULT NULL,<br>
`proxy_as` varchar(35) DEFAULT NULL,<br>
`proxy_deadz` smallint unsigned DEFAULT '0',<br>
`proxy_status` smallint unsigned DEFAULT '0',<br>
`proxy_use_time` int unsigned DEFAULT '0',<br>
PRIMARY KEY (`id`)<br>
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8MB4;</div>
<p>Результатом будет создана база. Иногда сразу по нажатию F5 а иногда нужно перезайти в <b>Heidisql</b> но ничего страшного. Я долгое время не понимал тоже, а потом привык к периодическим крэшам. И мне программа спустя время начала нравиться, нужно отдать должное разработчикам, ведь программа бесплатная</p>
<br><br><br><br><br><br>
<h2>О шаблоне</h2>
<p>Последние версии прокси чекера обладают рядом недостатков, которые я предлагаю решить шаблоном Zenno на post/get.</p>
<ul>Функционал шаблона
<li>Во многопотоке берёт проксю из большой сырой базы прокси. Которую мы спарсили заранее. Если у вас нет такой базы рекомендую ознакомится с <b><a href="/2017/07/Zenno-Get-Proxylists-Parser.html">шаблоном по парсингу proxy на get запросах</a></b>.</li>
<li>Назначает каждому <b>Get</b> запросу проксю взятую из сырухи</li>
<li>Выполняет <b>Get</b> запрос на ресурс который отображает информацию об <b>ip адресе</b></li>
<li>Если был получен ответ - значит прокси живой</li>
<li>Производит запись живой прокси в базу данных</li>
</ul>
<br><br><br><br><br><br>
<h2>Работаем с таблицей из шаблона Zenno Poster</h2>
<p>Для того чтобы работать с созданной базой из <b>Zenno Poster</b> предлагаю рассмотреть вот <b><a target="_blank" rel="nofollow" href="https://disk.yandex.ru/d/ccmNxodLUettSQ">этот шаблон</a></b>. В последнем экшене нам необходимо подредактировать под себя</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">server=<span style="color:#87a800">ZZZ.XXX.CCC.VVV</span>;user
id=<span style="color:#87a800">publicproxy</span>;database=<span style="color:#87a800">publicproxy</span>;password=<span style="color:#87a800">YOUR_PASSWORD</span>;persistsecurityinfo=True;port=<span style="color:#87a800">10000</span></div>
<br>
<p>Вписываем свои данные и сохраняем шаблон. А в фаил <b>input-proxy.txt</b> кладём всю проксю которую мы хотим проверять.</p>
<p>Обязательное условие <u>все строки в этом фаиле должны начинаться с протокола</u> вот так:</p>
<ul>
<b><li style="list-style-type: none;">socks5://111.111.111.111:2222</li></b>
<b><li style="list-style-type: none;">socks5://111.111.111.111:3333</li></b>
<b><li style="list-style-type: none;">socks4://111.111.111.111:4444</li></b>
<b><li style="list-style-type: none;">socks4://111.111.111.111:5555</li></b>
<b><li style="list-style-type: none;">http://111.111.111.111:23410</li></b>
<b><li style="list-style-type: none;">http://111.111.111.111:10800</li></b>
</ul>
<br>
<p>Если не знаете какой протокол - советую вписать наугад <b>socks4</b> или <b>socks5</b>. Быстро и массово добавить протокол в начало строки можно например в <b>notepad++</b> нужно:
<ul>
<li style="list-style-type: none;">Нажать сочетание клавиш CTRL + H</li>
<li style="list-style-type: none;">Установить: "режим поиска Регуляр. Выражен."</li>
<li style="list-style-type: none;">В поле Найти вписываем "^" без кавычек</li>
<li style="list-style-type: none;">В поле заменить на вписываем "socks5://" без кавычек</li>
<li style="list-style-type: none;">Нажать "Заменить все"</li>
</ul>
<p>Разобрались - запускаем шаблон и через какое то время обновив <b>Heidisql</b>(F5) получаем:</p>
<a href="https://img.zzxc.ru/img/post-16/post16-4.jpg" target="_blank"><img border="0" alt="succsessfull proxycheck" src="https://img.zzxc.ru/img/post-16/post16-4.jpg" /></a><br><br>
<br><br><br><br><br><br>
<h2>Результаты чека + магия MySQL запросов</h2>
<p>Спустя какое то время у нас накопятся данные и мы сможем поиграться с возможностями которые нам даёт <b>MySQL</b>.</p>
<p>В проксичекере реализован механизм в котором можно добавить диапазоны ip адресов для того чтобы сделать <b>white</b> или <b>blacklist</b>. Сама концепция там очень не удобная и потребляет много ресурсов. Попробуем сделать это сами но при помощи SQL запроса(ов).</p>
<p>Рассмотрим примеры запросов. Их вбиваем в <b>Heidisql</b> на закладке "запрос" и нажимаем F9</p>
<p>Таким запросом отобразим все рабочие прокси из <b>Russia</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">SELECT proxy_full<br>
FROM public_proxy_checker WHERE proxy_country='Russia';</div>
<br>
<a href="https://img.zzxc.ru/img/post-16/post16-5.jpg" target="_blank"><img border="0" alt="Heidisql querry" src="https://img.zzxc.ru/img/post-16/post16-5.jpg" /></a><br><br>
<p>Далее я пошёл сначала более сложным путём</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">SELECT proxy_full<br>
FROM public_proxy_checker<br>
WHERE proxy_country='Russia' OR proxy_country='Belarus' OR proxy_country='Ukraine' OR<br>
proxy_country='Kazakhstan' OR proxy_country='Albania' OR proxy_country='Armenia' OR proxy_country='Austria' OR<br>
proxy_country='Bosnia and Herzegovina' OR proxy_country='Bulgaria' OR proxy_country='Bulgaria' OR<br>
proxy_country='Croatia' OR proxy_country='Czechia' OR proxy_country='Denmark' OR proxy_country='France' OR<br>
proxy_country='Georgia' OR proxy_country='Germany' OR proxy_country='Hungary' OR proxy_country='Ireland' OR<br>
proxy_country='Israel' OR proxy_country='Italy' OR proxy_country='Kosovo' OR proxy_country='Kyrgyzstan' OR<br>
proxy_country='Latvia' OR proxy_country='Lithuania' OR proxy_country='Moldova' OR proxy_country='Netherlands' OR<br>
proxy_country='Poland' OR proxy_country='Portugal' OR proxy_country='Romania' OR proxy_country='Serbia' OR<br>
proxy_country='Slovakia' OR proxy_country='Slovenia' OR proxy_country='Spain' OR proxy_country='Sweden' OR<br>
proxy_country='Turkey' OR proxy_country='United Kingdom';</div>
<a href="https://img.zzxc.ru/img/post-16/post16-6.jpg" target="_blank"><img border="0" alt="Heidisql querry 2" src="https://img.zzxc.ru/img/post-16/post16-6.jpg" /></a><br><br>
<br><br>
<p>Как оказалось можно гораздо проще</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">SELECT proxy_full<br>
FROM public_proxy_checker WHERE proxy_timezone REGEXP '^(Europe/)';</div>
<br><br>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">SELECT proxy_full<br>
FROM public_proxy_checker WHERE proxy_timezone REGEXP '^(America/)';</div>
<br><br>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">SELECT proxy_full<br>
FROM public_proxy_checker WHERE proxy_timezone REGEXP '^(Asia/)';</div>
<br><br>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">SELECT proxy_full<br>
FROM public_proxy_checker WHERE proxy_timezone REGEXP '^(Pacific/)';</div>
<br><br>
<p>Если мы хотим отобразить содержимое всех столбцов</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">SELECT *<br>
FROM public_proxy_checker WHERE proxy_timezone REGEXP '^(Europe/)';</div>
<br><br>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">SELECT *<br>
FROM public_proxy_checker WHERE proxy_timezone LIKE "Europe%" ORDER BY proxy_country;</div>
<br><br>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">SELECT *<br>
FROM public_proxy_checker WHERE proxy_timezone LIKE "%merica%" ORDER BY proxy_country;</div>
<br><br>
<a href="https://img.zzxc.ru/img/post-16/post16-7.jpg" target="_blank"><img border="0" alt="Heidisql querry 3" src="https://img.zzxc.ru/img/post-16/post16-7.jpg" /></a><br><br>
<p>Ещё интересные запросы:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">SELECT *
FROM public_proxy_checker WHERE proxy_timezone LIKE "%merica%" AND proxy_timezone <> 'America/Sao_Paulo' ORDER BY proxy_country;</div>
<br><br>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">SELECT *<br>
FROM public_proxy_checker WHERE proxy_timezone LIKE "%merica%" AND proxy_country <> 'Argentina' AND proxy_country <> 'Brazil' ORDER BY proxy_country;</div>
<br><br>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">TRUNCATE `public_proxy_checker`;<br>
<span style="color:#FF3152">Удалит всё из бд!!!</span></div>
<br><br><br><br><br><br>
<h2>Про переносимость</h2>
<p>Теперь в любой момент мы можем потушить наш контейнер. Затем заархивировать его и в таком виде передать на любой другой сервер с установленным <b>Docker</b>, и стартануть его оттуда. Тогда мы будем работать с того же самого места на котором мы остановились, а <b>MySQL</b> даже не заметит что он куда то переехал.</p>
<br><br><br><br><br><br>
<h2>Итог</h2>
<p>Мы научились быстро разворачивать "переносимую" базу данных, писать данные в эту <b>БД</b> из <b>Zenno Poster</b>, тому что некоторые штуки будет проще сделать на стороне самого <b>SQL</b> </p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com0tag:blogger.com,1999:blog-244151671096808002.post-26739171180434444132018-07-11T09:47:00.123+03:002023-01-13T00:43:56.751+03:00DNS кэшер под windows<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2018/07/dns-caching-windows.html" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Десктопный DNS кэшер под windows" border="0" src="https://img.zzxc.ru/img/post-14/logo-14.jpg" width="100%" /></a></div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Повышаем комфортабельность интернет сёрфинга с помощью днс кэшера для <b>Windows</b>. Установка очень простая, а результат - более быстрая работа крупных сайтов и сервисов. Особенно это заметно на <b>WiFi</b> соединении. <b><a href="/p/xrumer.html">Хрумоводам</a></b> и <b><a href="/p/zenno-poster.html">зенноводам</a></b> musthave </div>
<br />
<a name='more'></a><br><br>
<h2>Принцип работы</h2>
<p><b>DNS</b> это специальная служба операционной системы которая преобразует домены в <b>ip</b> адреса. Чтобы набирая сайт вы попадали на нужный веб сервер, на котором этот сайт расположен. Самих днс серверов большое множество. Все они расположены в разных частях мира.</p>
<p>Чтобы зайти на какой то сайт вы вбиваете его домен. Ваш браузер шлет <b>DNS</b> запрос который обрабатывается примерно <b>0.5 - 3 секунды</b> после чего приходит <b>ответный пакет с ip адресом</b>. Получив ip адрес браузер уже шлет пакет на этот ip и при условии что всё хорошо - вы попадаете на нужный вам сайт. </p>
<p>Это упрощённый пример в действительности всё немного сложнее и на скорость обработки днс запроса влияют несколько факторов.</p>
<p>Одним из таких факторов - <b>медленный</b> или <b>перегруженный</b> DNS сервер вашего провайдера. Очень распространённый случай.</p>
<p>Другим фактором является сама система в целом. Если случается так, что сделав DNS запрос - ответа на конкретном DNS-Сервере не обнаруживается, то выполняется запрос к вышестоящему DNS серверу, если и на нём нет то это будет повторяться вплоть до корневых DNS - которые являются главными узлами. К ним обращаются более мелкие серверы. Не исключено что ответа нет и там т.к. он ещё не обновился/не добавился. Всё это спокойно может растянуться на 10 и более секунд ожидания.</p>
<p>В подавляющем большинстве пользователи не особо запариваются и просто выставляют автоматическую настройку <b>DNS</b> по <b>DHCP</b>. Тем самым они скорее всего получают перегруженный запросами DNS сервер провайдера.</p>
<br><br><br><br><br><br>
<h2>Выигрыш от кэширования DNS</h2>
<p>Используя технологию кэширования днс мы как бы минуем все эти ненужные паузы, и просто берём ip сразу из кэша, тем самым увеличивая скорость загрузки сайта. А в случае ошибки, происходит повторный запрос, но уже к днс серверу. Полученный ответ разумеется попадает в кэш. Сам кэш хранится у нас на диске. В большинстве случаев он занимает <b>~ 100 mb</b> места.</p>
<p>Рассмотрим практический пример. Посещая сайт социальной сети Вконтакте, когда мы хотим посмотреть какую нибудь фотографию или видео - можно обнаружить как браузер делает запрос на какой нибудь служебный поддомен - что то типа <b>sun9-30.userapi.com</b>. Этот домен в свою очередь ведёт на сервер на котором расположен этот мультимедиа контент. Выполнив запрос и занеся его в кэш мы будем получать его ip адрес мгновенно, тем самым контент загрузится быстрее, чем если бы мы не кэшировали запросы.</p>
<p>Софт который мы сегодня будем устанавливать работает сразу с несколькими днс серверами а не с одним. Причём работает по принципу слать запрос сразу всем днс серверам прописанным в конфиге и от какого быстрее пришёл валидный ответ, то мы и кладём к себе в кэш. Таким образом мы тоже выигрываем время и получаем прирост скорости.</p>
<br><br><br><br><br><br>
<h2>Установка</h2>
<p>Итак, мы будем использовать <b>Acrylic DNS Proxy</b>. Открытый исходный код. Быстрая и простая установка и настройка. Так же не могу не отметить отличную стабильность каждый день на протяжении нескольких лет 24/7 у меня работают всякие парсеры, чекеры, сабмитеры во многопотоке и данный софт у меня ещё ни разу не скрэшился, всё стабильненько</p>
<p>Заходим на <b><a target="_blank" rel="nofollow" href="https://mayakron.altervista.org/wikibase/show.php?id=AcrylicHome">официальный сайт</a></b> и качаем <b>Download Setup for Windows</b> (или <a href="https://yadi.sk/d/SvP4uU_13Z3htP" rel="nofollow" target="_blank">бэкап на облаке</a>)</p>
<a href="https://img.zzxc.ru/img/post-14/post14-1.jpg" target="_blank"><img border="0" alt="acrylic-setup" src="https://img.zzxc.ru/img/post-14/post14-1.jpg" /></a><br><br>
<p>Ставим и запоминаем папку куда поставили. В установке нет ничего сложного, просто нажимаем далее как обычно.</p>
<br><br><br><br><br><br>
<h2>Настройка</h2>
<p>Идём в папку куда поставили и открываем там фаил <b>AcrylicConfiguration.ini</b> в нем меняем эти строки:</p>
<br>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">...<br>
PrimaryServerAddress=8.8.8.8<br>
...<br>
SecondaryServerAddress=8.8.4.4<br>
...<br>
TertiaryServerAddress=Сюда вписываем DNS сервер вашего провайдера N1<br>
...<br>
QuaternaryServerAddress=Сюда вписываем DNS сервер вашего провайдера N2<br>
...<br>
QuinaryServerAddress=77.88.8.8<br>
...<br>
SenaryServerAddress=77.88.8.1<br>
...<br>
SeptenaryServerAddress=208.67.222.222<br>
...<br>
OctonaryServerAddress=208.67.220.220<br>
...<br>
NonaryServerAddress=1.1.1.1<br>
...<br>
DenaryServerAddress=1.0.0.1</div>
<br>
<p>Таким образом мы вписали 5 разных днс серверов по 2 штуки на каждый:</p>
<ul>
<li>Google: 8.8.8.8 и 8.8.4.4</li>
<li>Провайдерский днс: (по желанию, иногда нужно для внутренних сайтов провайдера)</li>
<li>Yandex.DNS: 77.88.8.8 и 77.88.8.1</li>
<li>OpenDNS: 208.67.222.222 и 208.67.220.220</li>
<li>Cloudflare DNS: 1.1.1.1 и 1.0.0.1</li>
</ul>
<br>
<p>Нам остается только выбрать наш днс-кэшер в качестве основного днс сервера ОС. Заходим в Сетевые подключения и делаем как на скрине ниже (если не видно - по клику откроется фулл сайз скрин).</p>
<p>Обратите внимание - на скриншоте показано как это делается на семёрке, если у вас другая версия виндоус у вас может незначительно отличаться финальный шаг. Если возникнут какие то проблемы то смотрим <b><a target="_blank" rel="nofollow" href="https://mayakron.altervista.org/wikibase/show.php?id=AcrylicHome">тут</a></b> как это делается на вашей системе.</p>
<br>
<a href="https://img.zzxc.ru/img/post-14/post14-2.jpg" target="_blank"><img border="0" alt="кэширующий dns настройка" src="https://img.zzxc.ru/img/post-14/post14-2.jpg" /></a><br><br>
<p>Подтверждаем и перезагружаем комп во избежание артефактов. Наслаждаемся быстрой работой интернетика.</p>
</div>abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com1tag:blogger.com,1999:blog-244151671096808002.post-87147620636761465612018-03-06T17:50:00.052+03:002023-01-13T00:43:36.840+03:00Генерация списка валидных номеров мобильных операторов<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2018/03/mob-numbers-generate.html" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="генерация номеров телефонов мобильных операторов" border="0" src="https://img.zzxc.ru/img/post-13/logo-13.jpg" width="100%" /></a></div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
В статье расскажу как можно сгенерировать полный список номеров абонентов популярных мобильных операторов, определённого региона - основываясь на общедоступных данных.</div>
<a name='more'></a><br><br>
<h2>Предупреждение</h2>
<p>Зачем вообще может понадобится такой список. Бывают разные задачи , всё ограничивается только вашей фантазией. Скажу только что не советую использовать полученный список для чего то незаконного, я за это ответственность не несу, используйте на свой страх и риск.</p>
<br><br><br><br><br><br>
<h2>Необходимые требования</h2>
<p>Итак, для создания такой базы нам понадобится программа <b>crunch</b>. Изначально кранч это софт для генерации списка паролей, но мы приспособим его под свои нужды. Программа полностью бесплатна и имеет открытый исходный код.</p>
<p>В рамках этой статьи я опишу установку под ОС Linux. Такие как <b>Debian</b> или <b>Ubuntu</b>, т.к. по моему опыту чаще всего встречается на разных серваках. А так как софт достаточно распространён то вам не составит труда найти и поставить его под свой дистр.</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">sudo apt-get update && sudo apt-get install crunch</span></div>
<br>
<p>Теперь нам нужны диапазоны номеров. Которые элементарно нагугливается запросом: коды мобильных операторов спб. Из выдачи мне приглянулся <b><a target="_blank" rel="nofollow" href="http://www.mobile-networks.ru/articles/kody_sotovyh_operatorov_rossii/sankt-peterburg.html">такой сайт</a></b>.</p>
<br><br><br><br><br><br>
<h2>Синтаксис crunch</h2>
<p>Отлично, нам известны диапазоны нужно понять синтаксис crunch поэтому идем в ман и читаем.</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">man crunch</span></div>
<p>Из мануала становится ясно - чтобы задать диапазон нам понадобится ввести два ключа -t начало -l конец</p>
<br>
<p>Возьмем для примера <b>8911</b> с началом серии <b>90000000</b> и концом серии <b>9999999</b> синтаксис будет такой:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">crunch 11 11 -t 89119%%%%%% -l 89120000000</span></div>
<p>то есть сгенерируются номера начиная от <b>89119000000</b> до <b>89119999999</b></p>
<p>Остаётся по сути только наваять паттерны для кранча и заставить его сгенерировать нам полную базу. Я оставлю для примера свои паттерны для всех операторов спб</p>
<br>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">crunch 11 11 -t 89013%%%%%% -l 89014000000<br>
crunch 11 11 -t 890137%%%%% -l 89013800000<br>
crunch 11 11 -t 890197%%%%% -l 89019800000<br>
crunch 11 11 -t 8903092%%%% -l 89030930000<br>
crunch 11 11 -t 890433%%%%% -l 89043400000<br>
crunch 11 11 -t 890451%%%%% -l 89045200000<br>
crunch 11 11 -t 890455%%%%% -l 89045600000<br>
crunch 11 11 -t 890460%%%%% -l 89046200000<br>
crunch 11 11 -t 890463%%%%% -l 89046500000<br>
crunch 11 11 -t 89052%%%%%% -l 89052400000<br>
crunch 11 11 -t 890525%%%%% -l 89052900000<br>
crunch 11 11 -t 8906225%%%% -l 89062300000<br>
crunch 11 11 -t 8906240%%%% -l 89062800000<br>
crunch 11 11 -t 8909577%%%% -l 89095940000<br>
crunch 11 11 -t 8911%%%%%%% -l 89110400000<br>
crunch 11 11 -t 892109%%%%% -l 89210999999<br>
crunch 11 11 -t 8921111%%%% -l 89211120000<br>
crunch 11 11 -t 892118%%%%% -l 89211900000<br>
crunch 11 11 -t 89213%%%%%% -l 89214500000<br>
crunch 11 11 -t 892155%%%%% -l 89215600000<br>
crunch 11 11 -t 892163%%%%% -l 89216600000<br>
crunch 11 11 -t 892174%%%%% -l 89218000000<br>
crunch 11 11 -t 8921845%%%% -l 89218500000<br>
crunch 11 11 -t 8921855%%%% -l 89220000000<br>
crunch 11 11 -t 8921%%%%%%% -l 89220000000<br>
crunch 11 11 -t 89291%%%%%% -l 89291200000<br>
crunch 11 11 -t 89312%%%%%% -l 89312500000<br>
crunch 11 11 -t 893125%%%%% -l 89313200000<br>
crunch 11 11 -t 8950%%%%%%% -l 89500400000<br>
crunch 11 11 -t 895164%%%%% -l 89516600000<br>
crunch 11 11 -t 895166%%%%% -l 89516900000<br>
crunch 11 11 -t 89522%%%%%% -l 89522300000<br>
crunch 11 11 -t 895223%%%%% -l 89522500000<br>
crunch 11 11 -t 895235%%%%% -l 89523800000<br>
crunch 11 11 -t 895238%%%%% -l 89523999999<br>
crunch 11 11 -t 895239%%%%% -l 89523999999<br>
crunch 11 11 -t 895334%%%%% -l 89533600000<br>
crunch 11 11 -t 895336%%%%% -l 89533800000<br>
crunch 11 11 -t 896023%%%%% -l 89602800000<br>
crunch 11 11 -t 89618%%%%%% -l 89618200000<br>
crunch 11 11 -t 896268%%%%% -l 89627300000<br>
crunch 11 11 -t 8963241%%%% -l 89632500000<br>
crunch 11 11 -t 89633%%%%%% -l 89633220000<br>
crunch 11 11 -t 8963322%%%% -l 89633330000<br>
crunch 11 11 -t 896334%%%%% -l 89633500000<br>
crunch 11 11 -t 896434%%%%% -l 89643500000<br>
crunch 11 11 -t 896436%%%%% -l 89644000000<br>
crunch 11 11 -t 8965%%%%%%% -l 89651000000<br>
crunch 11 11 -t 896575%%%%% -l 89657800000<br>
crunch 11 11 -t 896675%%%%% -l 89667600000<br>
crunch 11 11 -t 89817%%%%%% -l 89817500000<br>
crunch 11 11 -t 898175%%%%% -l 89818000000<br>
crunch 11 11 -t 89818%%%%%% -l 89818200000<br>
crunch 11 11 -t 89992%%%%%% -l 89992200000</span></div>
<br>
<p>Но данный листинг команд нам только генерирует без записи в файл, поэтому наиболее разумно будет сделать скрипт который весь результат запишет нам в файл mob-numbers.txt Для этого создаём скрипт и обзываем его mobs-gen.sh, даём ему нужные права для выполнения</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#FF3152">touch mobs-gen.sh && chmod +x mobs-gen.sh</span></div>
<p>и вставляем в него все строки что ниже:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">crunch 11 11 -t 89013%%%%%% -l 89014000000 >> mob-numbers.txt<br>
crunch 11 11 -t 890137%%%%% -l 89013800000 >> mob-numbers.txt<br>
crunch 11 11 -t 890197%%%%% -l 89019800000 >> mob-numbers.txt<br>
crunch 11 11 -t 8903092%%%% -l 89030930000 >> mob-numbers.txt<br>
crunch 11 11 -t 890433%%%%% -l 89043400000 >> mob-numbers.txt<br>
crunch 11 11 -t 890451%%%%% -l 89045200000 >> mob-numbers.txt<br>
crunch 11 11 -t 890455%%%%% -l 89045600000 >> mob-numbers.txt<br>
crunch 11 11 -t 890460%%%%% -l 89046200000 >> mob-numbers.txt<br>
crunch 11 11 -t 890463%%%%% -l 89046500000 >> mob-numbers.txt<br>
crunch 11 11 -t 89052%%%%%% -l 89052400000 >> mob-numbers.txt<br>
crunch 11 11 -t 890525%%%%% -l 89052900000 >> mob-numbers.txt<br>
crunch 11 11 -t 8906225%%%% -l 89062300000 >> mob-numbers.txt<br>
crunch 11 11 -t 8906240%%%% -l 89062800000 >> mob-numbers.txt<br>
crunch 11 11 -t 8909577%%%% -l 89095940000 >> mob-numbers.txt<br>
crunch 11 11 -t 8911%%%%%%% -l 89110400000 >> mob-numbers.txt<br>
crunch 11 11 -t 892109%%%%% -l 89210999999 >> mob-numbers.txt<br>
crunch 11 11 -t 8921111%%%% -l 89211120000 >> mob-numbers.txt<br>
crunch 11 11 -t 892118%%%%% -l 89211900000 >> mob-numbers.txt<br>
crunch 11 11 -t 89213%%%%%% -l 89214500000 >> mob-numbers.txt<br>
crunch 11 11 -t 892155%%%%% -l 89215600000 >> mob-numbers.txt<br>
crunch 11 11 -t 892163%%%%% -l 89216600000 >> mob-numbers.txt<br>
crunch 11 11 -t 892174%%%%% -l 89218000000 >> mob-numbers.txt<br>
crunch 11 11 -t 8921845%%%% -l 89218500000 >> mob-numbers.txt<br>
crunch 11 11 -t 8921855%%%% -l 89220000000 >> mob-numbers.txt<br>
crunch 11 11 -t 8921%%%%%%% -l 89220000000 >> mob-numbers.txt<br>
crunch 11 11 -t 89291%%%%%% -l 89291200000 >> mob-numbers.txt<br>
crunch 11 11 -t 89312%%%%%% -l 89312500000 >> mob-numbers.txt<br>
crunch 11 11 -t 893125%%%%% -l 89313200000 >> mob-numbers.txt<br>
crunch 11 11 -t 8950%%%%%%% -l 89500400000 >> mob-numbers.txt<br>
crunch 11 11 -t 895164%%%%% -l 89516600000 >> mob-numbers.txt<br>
crunch 11 11 -t 895166%%%%% -l 89516900000 >> mob-numbers.txt<br>
crunch 11 11 -t 89522%%%%%% -l 89522300000 >> mob-numbers.txt<br>
crunch 11 11 -t 895223%%%%% -l 89522500000 >> mob-numbers.txt<br>
crunch 11 11 -t 895235%%%%% -l 89523800000 >> mob-numbers.txt<br>
crunch 11 11 -t 895238%%%%% -l 89523999999 >> mob-numbers.txt<br>
crunch 11 11 -t 895239%%%%% -l 89523999999 >> mob-numbers.txt<br>
crunch 11 11 -t 895334%%%%% -l 89533600000 >> mob-numbers.txt<br>
crunch 11 11 -t 895336%%%%% -l 89533800000 >> mob-numbers.txt<br>
crunch 11 11 -t 896023%%%%% -l 89602800000 >> mob-numbers.txt<br>
crunch 11 11 -t 89618%%%%%% -l 89618200000 >> mob-numbers.txt<br>
crunch 11 11 -t 896268%%%%% -l 89627300000 >> mob-numbers.txt<br>
crunch 11 11 -t 8963241%%%% -l 89632500000 >> mob-numbers.txt<br>
crunch 11 11 -t 89633%%%%%% -l 89633220000 >> mob-numbers.txt<br>
crunch 11 11 -t 8963322%%%% -l 89633330000 >> mob-numbers.txt<br>
crunch 11 11 -t 896334%%%%% -l 89633500000 >> mob-numbers.txt<br>
crunch 11 11 -t 896434%%%%% -l 89643500000 >> mob-numbers.txt<br>
crunch 11 11 -t 896436%%%%% -l 89644000000 >> mob-numbers.txt<br>
crunch 11 11 -t 8965%%%%%%% -l 89651000000 >> mob-numbers.txt<br>
crunch 11 11 -t 896575%%%%% -l 89657800000 >> mob-numbers.txt<br>
crunch 11 11 -t 896675%%%%% -l 89667600000 >> mob-numbers.txt<br>
crunch 11 11 -t 89817%%%%%% -l 89817500000 >> mob-numbers.txt<br>
crunch 11 11 -t 898175%%%%% -l 89818000000 >> mob-numbers.txt<br>
crunch 11 11 -t 89818%%%%%% -l 89818200000 >> mob-numbers.txt<br>
crunch 11 11 -t 89992%%%%%% -l 89992200000 >> mob-numbers.txt</span></div>
<br>
<p>Нам остаётся только запустить скрипт и дождаться его выполнения:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#FF3152">./mobs-gen.sh</span></div><br>
<p>Результат будет в файле <b>mob-numbers.txt</b></p>
</div>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com1tag:blogger.com,1999:blog-244151671096808002.post-20758410458646188902017-07-31T18:06:00.086+03:002023-12-30T01:59:00.767+03:00Списки всех доменов ru su рф<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2017/07/Spiski-Vseh-Domenov-RU-SU-RF.html" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Списки всех доменов ru su рф" border="0" width="100%" src="https://img.zzxc.ru/img/post-12/logo-12.jpg" /></a></div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Довольно часто приходится пользоваться этими списками. А они как назло куда то улетучиваются из закладок :) приходится каждый раз гуглить, терять время. Так что лучше запишу ка я их сюда. Заодно поговорим как их максимально быстро обработать. </div>
<br />
<a name='more'></a><br><br>
<H2>Это что за списки такие?</H2>
<p>Регистраторы записывают статистику по зарегистрированным доменам. Некоторые из них хранят её в общем доступе, что очень удобно, особенно для <b><a href="/p/xrumer.html">хрумовода</a></b> или <b><a href="/p/zenno-poster.html">зенновода</a></b>.</p>
<p>Очень удобно заряжать софт который чекает движки (например вордпресс), либо другую интересную информацию по таким спискам.</p>
<p>К тому же мы сразу получаем именно русскоговорящий сегмент, не надо лишний раз напрягать пс, хотя большая часть ру ресов располагается вне <b>.ru</b> зоны и это не для кого не секрет. Мы же будем идти по пути наименьшего сопротивления:</p>
<ul>
<li>Скачать список <a href="https://partner.r01.ru/zones/ru_domains.gz" target="_blank" rel="nofollow" >доменов в зоне .RU</a><br /></li>
<li>Скачать список <a href="https://partner.r01.ru/zones/su_domains.gz" target="_blank" rel="nofollow" >доменов в зоне .SU</a><br /></li>
<li>Скачать список <a href="https://partner.r01.ru/zones/rf_domains.gz" target="_blank" rel="nofollow" >доменов в зоне .РФ</a></li>
</ul>
<p>По стандарту списки скачиваются в формате <b>.gz</b> архива и имеют кучу ненужного нам мусора такого как дата создания, окончания и т.д. Нам нужны только сами домены, поэтому переходим к следующему этапу.</p>
<br><br><br><br><br><br>
<h2>Обработка</h2>
<p>Самый простой и быстрый способ обработать списки - обработать их на своём хостинге. Лучше всего подойдёт VPS, VDS, Dedicated Server (например <b><a target="_blank" rel="nofollow" href="https://ad.zzxc.ru/url/host1.html">вот этот</a></b>). Хотя и шаред тоже должен работать. На шаред хостинге вам скорее всего надо будет попросить чтобы включили <b>SSH</b>. Объяснять как пользоваться <b>SSH</b> я не буду, изучайте сами и развивайтесь.</p>
<p>Итак, нам подойдёт любой <b>Linux</b> дистрибутив. Фряха и любой *<b>BSD</b> тоже закатят. Единственное, что не уверен по поводу дистрибутива LFS(Linux From Scratch), А так 99% Линукс дистрибутивов содержат нужный нам функционал из коробки, даже будучи только установленными на сервер.</p>
<p>Как подключитесь по <b>SSH</b> - советую перейти в какую нибудь темповую директорию по типу <b>/tmp</b> или например создать специальную директорию только под работу команды, чтобы не запутаться</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">mkdir domainsss && cd domainsss</span></div>
<p>Ну и дальше всё сводится к одной простой команде.</p>
<p>Чтобы скачать и обработать список <b>.RU</b> доменов вводим</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">wget 'https://partner.r01.ru/zones/ru_domains.gz' && gunzip ru_domains.gz && awk {'print $1'} ru_domains | awk '{ printf "http://"; print }' | tr [:upper:] [:lower:] > Ru-Domains.txt && rm -rf ru_domains</span></div>
<br><br>
<p>По аналогии делаем тоже самое для <b>.SU</b> доменов</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">wget 'https://partner.r01.ru/zones/su_domains.gz' && gunzip su_domains.gz && awk {'print $1'} su_domains | awk '{ printf "http://"; print }' | tr [:upper:] [:lower:] > Su-Domains.txt && rm -rf su_domains</span></div>
<br><br>
<p>Завершающим этапом обработаем домены <b>.РФ</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">wget 'https://partner.r01.ru/zones/rf_domains.gz' && gunzip rf_domains.gz && awk {'print $1'} rf_domains | awk '{ printf "http://"; print }' | tr [:upper:] [:lower:] > Rf-Domains.txt && rm -rf rf_domains</span></div>
<br>
<p>Логика работы команд такая <br />
- Качаем архив со списком зоны <br />
- Распаковываем его <br />
- Парсим только домены из текста <br />
- Добавляем в каждой строке перед доменом http:// <br />
- Удаляем фаил с мусором</p>
<br>
<ul>В результате выполнения команд у нас появятся фаилы
<li>Ru-Domains.txt</li>
<li>Su-Domains.txt</li>
<li>Rf-Domains.txt</li>
</ul><br>
<br>
</div>
<br><br><br><br><br><br>
<h2>Bonus Альтернативный регистратор</h2>
<p>Дополнительно домены можно скачать у другого регистратора </p>
<ul>
<li>Скачать список <a href="https://reghouse.ru/tools/ru_domains_reghouse.gz" target="_blank" rel="nofollow" >доменов в зоне .RU</a><br /></li>
<li>Скачать список <a href="https://reghouse.ru/tools/su_domains_reghouse.gz" target="_blank" rel="nofollow" >доменов в зоне .SU</a><br /></li>
<li>Скачать список <a href="https://reghouse.ru/tools/rf_domains_reghouse.gz" target="_blank" rel="nofollow" >доменов в зоне .РФ</a></li>
</ul>
<p>Чтобы скачать и обработать список <b>.RU</b> доменов вводим</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">wget https://reghouse.ru/tools/ru_domains_reghouse.gz && gunzip ru_domains_reghouse.gz && awk {'print $1'} ru_domains_reghouse | awk '{ printf "http://"; print }' | tr [:upper:] [:lower:] > Ru-Domains.txt && rm -rf ru_domains_reghouse</span></div>
<br><br>
<p>По аналогии делаем тоже самое для <b>.SU</b> доменов</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">wget https://reghouse.ru/tools/su_domains_reghouse.gz && gunzip su_domains_reghouse.gz && awk {'print $1'} su_domains_reghouse | awk '{ printf "http://"; print }' | tr [:upper:] [:lower:] > Su-Domains.txt && rm -rf su_domains_reghouse</span></div>
<br><br>
<p>Завершающим этапом обработаем домены <b>.РФ</b></p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">wget https://reghouse.ru/tools/rf_domains_reghouse.gz && gunzip rf_domains_reghouse.gz && awk {'print $1'} rf_domains_reghouse | awk '{ printf "http://"; print }' | tr [:upper:] [:lower:] > Rf-Domains.txt && rm -rf rf_domains_reghouse</span></div>
<br>
<br><br><br><br><br><br>
<h2>Bonus Punycode</h2>
<p>Мне часто приходится работать с большими списками доменов. Некоторые доменные зоны закодированы в Punycode. С ними неудобно работать, поэтому я добавлю список в этом формате, чтобы постоянно не искать какие домены мне подходят. Кому то ещё это может быть полезно. </p>
<p><b>Punycode RU</b><br>
xn--p1ai (рф)<br>
xn--p1acf (рус)<br>
xn--d1acj3b (дети)<br>
xn--c1avg (орг)<br>
xn--90ais (бел)<br>
xn--80aswg (сайт)<br>
xn--80asehdb (онлайн)<br>
xn--j1aef (ком)<br>
xn--80adxhks (москва) <br>
xn--80aqecdr1a (католик)</p>
<br>
<p><b>Punycode SNG</b><br>
xn--90a3ac (срб)<br>
xn--o1ach.xn--90a3ac (упр.срб)<br>
xn--o1ac.xn--90a3ac (пр.срб)<br>
xn--l1acc (мон)<br>
xn--e1a4c (ею)<br>
xn--d1at.xn--90a3ac (пд.срб)<br>
xn--d1alf (мкд)<br>
xn--c1avg.xn--90a3ac (орг.срб)<br>
xn--90azh.xn--90a3ac (пбр.срб)<br>
xn--90ae (бг)<br>
xn--80ao21a (қаз)</p>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com9tag:blogger.com,1999:blog-244151671096808002.post-79121869511010979162017-07-26T13:55:00.037+03:002023-01-13T00:42:50.809+03:00Парсер прокси листов на GET запросах<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2017/07/Zenno-Get-Proxylists-Parser.html" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Парсер публичных прокси листов на GET запросах" border="0" src="https://img.zzxc.ru/img/post-11/logo-11.jpg" width="100%" /></a></div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Чтобы набрать хороший список соксов из публичных прокси листов нужно хорошо потрудится. Со временем я пришёл к тому что софт который чекает и парсит соксы да и вообще проксю обладает рядом недостатков. Шаблон которым я делюсь в посте призван оптимизировать работу по поиску проксей и соксов из базы паблик прокси листов.</div>
<br />
<a name='more'></a><br><br>
<h2>Зачем мне этот шаблон?</h2>
<p>Большинство софта не умеет чистить дубли проксей. Это приводит к тому, что вы теряете время, когда проверяете(чекаете) одни и те же прокси, которые были одновременно сразу в нескольких источниках(паблик прокси листах).</p>
<p>Бывает так, что софт умеет чистить дубли проксей, однако, эта процедура может нехило отъедать ресурсы вашего компа/сервера в зависимости от того насколько большая у вас база.</p>
<p>Я встречал ещё софт который весь процесс парсинга производит через браузер Internet Explorer, вообще не понимаю создателей таких парсеров - зачем? Когда есть гет запросы)))</p>
<p>Чтобы оптимизировать часть процесса поиска проксей был написан данный шаблон, который во многопотоке <b>GET</b> запросами проходит всю базу с прокси листами и выпаршивает регуляркой всю найденную проксю в фаил <code>proxys.txt</code></p>
<p>Остаётся только убрать дубли прокси из полученного фаила и можно заряжать всё в свой проксичекер. По моему опыту: когда я в последний раз после парсинга удалил дубли - у меня вышло около <b>3 кк</b> уникальной прокси. Представьте сколько времени бы занял чек такой базы имея дубли, не говоря уже о том что база в <b>3 кк</b> чекается довольно долго.</p>
<br><br><br><br><br><br>
<h2>Как работает шаблон</h2>
<p>Скачиваем, распаковываем в нужную папку фаилы шаблона. Закидываем в фаил <b>url-list.txt</b> все проксилисты которые у вас есть.</p>
<p>Смотрим сколько у нас строк и пишем в самом зенно постере столько же строк в графу "сколько делать". Запускаем в столько потоков сколько нам нужно.</p>
<p>В процессе парсинга внутри папки шаблона появится фаил <b>proxys.txt</b> с результатом.</p>
<p>Как завершите парсинг удалите дубли. Я это делаю KeyWordKeeper'ом он тоже лежит в архиве.</p>
<p>Также я добавил фаил <b>Filters-bad-urls.txt</b> в нём содержатся мусорные адреса прокси листов, которые часто попадают в базу но не содержат прокси. Можно тем же <b>KeyWordKeeper</b>'ом сделать выборку из базы листов, поместив в исключения урлы из бэд урлс.</p>
<br>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">Ссылка на скачивание шаблона: <b><a target="_blank" rel="nofollow" href="https://yadi.sk/d/DOrCm2-13LRVbA">https://yadi.sk/d/DOrCm2-13LRVbA</a></b></div>
<br><br><br><br><br><br>
<h2>Каких результатов можно достичь</h2>
<p>Если делать все правильно, то можно спокойно набрать <b>5-10 к</b> живых соксов. Обратите внимание именно <b>соксов</b>, а не http прокси, в этом можно убедиться посмотрев скрин ниже. Все прокси уникальные, не повторяются, на многих открыты интересные порты.</p>
<a href="https://img.zzxc.ru/img/post-11/post11-1.jpg" target="_blank"><img border="0" alt="результат проверки socks4 и socks5 прокси" src="https://img.zzxc.ru/img/post-11/post11-1.jpg" /></a><br><br>
<p>Не забывайте сохранять результаты чека. Они вам пригодятся, когда понадобится быстро получить много живых прокси. У меня в виду особенности работы софта, вся живая прокся сохраняется в 3 отдельных фаила: </p>
<ul>
<li>all-alive-http-proxy.txt</li>
<li>all-alive-socks4.txt</li>
<li>all-alive-socks5.txt</li>
</ul>
<p>Время от времени я чищу фаилы от дублей. И когда нужно очень быстро получаю много живых проксей, чекая только эти фаилы.</p>
</div>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com2tag:blogger.com,1999:blog-244151671096808002.post-78767135409378825652017-07-23T15:19:00.022+03:002023-01-13T00:42:20.146+03:00Парсер прямого эфира yandex<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2017/07/parser-pryamogo-efira-yandex.html" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Парсер прямого эфира yandex" border="0" width="100%" src="https://img.zzxc.ru/img/post-10/logo-10.jpg" /></a></div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Увидел как то в функционале одного софта продавали за деньги парсер прямого эфира яндекса. Посмотрел и накатил по быстрому шаблон для <b><a href="/p/content-downloader-intro.html"> Content-Downloader </a></b> под парсинг прямого эфира. Решил Выложить для всех бесплатно. Возможно, буду заливать на этот блог некоторые ништяки бесплатно, пока ещё не решил до конца.</div>
<br />
<a name='more'></a><br><br>
<p>Итак - данный шаблон предназначен для программы <b><a href="/p/content-downloader.html">Content-Downloader</a></b>. Очень простой шаблон, скармливаем ему одну и ту же ссылку:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#FF3152">https://export.yandex.ru/last/last20x.xml</span></div>
<p>и устанавливаем таймаут через сколько времени обращаться к <b>xml</b> повторно. Рекомендуется парсить в 1 поток с таймаутом <code>60000 мсек</code> т.е 60 сек.</p>
<p>Если больше потоков или меньше таймаут, то будет много дублей - запаритесь потом чистить.</p>
<br>
<a href="https://img.zzxc.ru/img/post-10/post10-1.jpg" target="_blank"><img border="0" alt="Парсер прямого эфира yandex" src="https://img.zzxc.ru/img/post-10/post10-1.jpg" /></a><br><br>
<br>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px">Ссылка на скачивание шаблона: <b><a target="_blank" rel="nofollow" href="https://yadi.sk/d/_VYKwhIr3LJyCE">https://yadi.sk/d/_VYKwhIr3LJyCE</a></b></div>
</div>abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com5tag:blogger.com,1999:blog-244151671096808002.post-29829193261104000032016-08-20T10:11:00.117+03:002023-01-13T00:41:58.711+03:00Траф и Бэки с блогов на wordpress<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2016/08/wordpress-xrumer-backlinks-and-traffic.html" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="..." border="0" src="https://img.zzxc.ru/img/post-9/logo-9.jpg" /></a></div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Привет. Долгое время <b><a href="/p/xrumer-intro.html">хрумер</a></b> лежал у меня на полке и пылился. Нынешняя версия работает хуже, чем было пару лет назад. Обусловлено это тем что время не стоит на месте и накатывают ребята всякие защиты, на джы'assах SFS ханейпотах и остальных известных сервисах. В ожидании пока ботмастер пилит хрумер 2017 с обработкой js, появился неплохой варик получить профит с блогов на вп, об этом и будет данная статья.</div>
<br />
<a name='more'></a><br><br>
<h2>Wordpress?</h2>
<ul>
<li>Самый популярный двиган в мире</li>
<li>Бесплатный</li>
<li>Постоянно обновляется. Багфиксы / секьюрити фиксы</li>
<li>Есть возможность оставить ссылку в комменте, причем как в теле сообщения так и просто сныкать ссылку за своим ником</li>
</ul><br>
<p>Подавляющее большинство человек, на старте отдают предпочтению именно вордпрессу, ввиду того что он простой и со временем наработал ответы на все вопросы для новичков. Не разобраться в нем довольно сложно. Что в свою очередь выгодно нам - хрумоводам.</p>
<br><br><br>
<h2>Протекшн</h2>
<p>У движка вордпресс есть защита от спама называется она <b>akismet</b>. Постим мы простынями ссылок или наоборот читаем пост и вручную постим месадж в тему поста, мы так или иначе сталкиваемся с тем что наш комент идет на премодерацию, тут уже в игру вступает этот самый акисмет.</p>
<p>Разумеется что шанс запостить на полном автомате <b><a href="/p/xrumer.html">хрумером</a></b> и попасть в тему поста стремится к нулю. Именно поэтому многие хрумоводы просто забивают на данный движок.</p>
<p>Конечно, можно постить нейтральные фразы, типо "Отличный пост" или "Пиши есчо" но спешу вас огорчить, что таких находчивых пацанов довольно много и идея фэилится потому что открывая премодерацию, админ блога наблюдает 1000 однотипных комментов и просто их скипает, если он конечно не какой нибудь чсв.</p>
<br><br><br><br><br><br>
<h2>Принцип работы</h2>
<p>Напрашивается вопрос - как же все таки запостить в тему, чтобы коммент прошел модерацию? Такая возможность появилась после 5 конкурса статей от ботмастера, в которой мой теска <b>rec801_1</b> продемонстрировал свой инновационный способ поиска и постинга релевантных комментариев к посту. Этакий антиспам, только по блогам. <b><a target="_blank" rel="nofollow" href="https://www.youtube.com/watch?v=V2CkQgZtTdw">Видос из статьи</a></b>.</p>
<p>Он написал софт который проксирует пост запрос хрумера через себя. То есть после того как хрумер после гет запроса получил куки, увидел нужные поля и далее разгадал капчу и шлёт пост запрос в этот момент активизируется проксик.</p>
<p>В зависимости от настроек проксик производит парсинг через <b>google api</b> по ключу из <b>H1</b> из заголовка/названия поста или по содержанию поста. Находит комменты из похожих статей. И после этого изменяет сообщение в пост запросе и уже сам его досылает серваку.</p>
<p>В случае если релевантный коммент не найден то пост запрос не отправится, что тоже отлично т.к. мы избавимся от потенциально палевных комментов для белого/серого продвижения очень найс. К сожалению на момент выхода конкурсной статьи у хрумера были большие траблы с рекапчей, именно поэтому не было возможности проверить проксик в работе. Спустя время такая возможность появилась.</p>
<br><br><br><br><br><br>
<h2>Платная версия</h2>
<p>Около двух недель назад релизнулся хрум 12.0.17 в котором заявлен пробив рекапчи, я продлил абонентку заодно почитал новости о проксике. Проксик из статьи называется примочка, он бесплатен и развивался вплоть до версии 1.99. Но были некоторые проблемы с не сохранением настроек. Да и к тому же с того времени автор сделал платную версию в которой данная проблема и большинство других были решены. Я принял решение приобрести платную версию и не пожалел. О ней и будем говорить ниже.</p>
<br><br><br><br><br><br>
<h2>Наглядный пример</h2>
<p>Наглядно это работает вот так:</p>
<br>
<a href="https://img.zzxc.ru/img/post-9/post9-1.jpg" target="_blank"><img border="0" alt="Одобренный комментарий в Wordpress" src="https://img.zzxc.ru/img/post-9/post9-1.jpg" /></a>
<br><br>
<p>Бывает очень угарные комменты апрувят</p>
<br>
<a href="https://img.zzxc.ru/img/post-9/post9-2.jpg" target="_blank"><img border="0" alt="Одобренный комментарий в Wordpress 2" src="https://img.zzxc.ru/img/post-9/post9-2.jpg" /></a><br><br>
<p>Мне постоянно приходится чекать большое количество сырых баз на разные движки. И постоянно замечаю что выходит много вордпресов, но как то обходил их стороной. Теперь же имея рабочий хрум + купленный <b>newcommenter</b> - так называется платная версия примочки, остается только найти живые вордпрессы и сделать по ним прогон.</p>
<p>Под живыми я подразумеваю: рабочие блоги, не содержащие ошибок, не лом, не на бесплатных хостингах и которые при этом активно постят а не забытые с последним постом в 2008 году.</p>
<br><br><br><br><br><br>
<h2>Подготовка базы</h2>
<p>Была у меня какая то сыруха на <b>20 кк</b> ссылок, я поделил ее на 20 фаилов по <b>1 кк</b> ссылок в каждом и где то около 15 дней чекал их на движки прогой которая называется <b><a target="_blank" rel="dofollow" href="/p/gsa-pi.html">GSA Platform Identifier</a></b>.</p>
<p>В принципе мог и быстрее чекнуть, но чет видимо днс сервак провайдера мягко говоря не в восторге от дейли 64 - 100 потоков в секунду. То есть 100 потоков это край, я же чекал на 50 потоках чтобы осталось немного на посидеть в интернетике и при этом поменьше палится провайдеру. Так то все в рамках закона, но сами они тоже не в восторге как и днс сервер.</p>
<p>Значит начекал я примерно <b>1.3 кк</b> уникальных вордпрессов. Это число с учетом удаления дублей и бесплатных блогов расположенных на поддомене "<b>.wordpress.com</b>".</p>
<p>Дальше встаёт вопрос о том что официально заявлена поддержка русского языка и бурж. А всякие китайские там итальянские хз будут работать или нет.</p>
<p>По быстренькому накатал шаблон на <b><a target="_blank" rel="dofollow" href="/p/content-downloader.html">Content-Downloader</a></b> которым зачекал все вордпрессы на язык. Где то за часов 18 прошел все ссылки и у меня уже была готова база из которой я мог извлечь только русские или только англ. блоги. Делалось это примерно так с небольшими доработками:</p>
<br>
<div>
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="315" mozallowfullscreen="mozallowfullscreen" msallowfullscreen="msallowfullscreen" oallowfullscreen="oallowfullscreen" src="https://www.youtube.com/embed/xb7EeA0RR3k?rel=0" webkitallowfullscreen="webkitallowfullscreen" width="100%"></iframe>
</div>
<br><br>
<p>Следом был сделан шаблон который парсит уже день / месяц / год / тайтл / и саму ссылку постов из большой базы постов.</p>
<br><br><br><br><br><br>
<h2>Постим контент</h2>
<p>Для начала я взял русские блоги т.к. их быстрее пройти и оценить релевантность комментов. После окончательного парсинга взял по 1 ссылке из каждого блога/домена. Вышло примерно <b>23 к</b> уник ссылок.</p>
<p>Открыл хрумак, создал проект настроил проксик для начала на дефолтных настройках. Активировал опцию если по какой то причине нашелся дубль коммента - чтобы он не постился. Сайт поставил свой древний адалт блог на тумблере и поставил на постинг.</p>
<p>По времени прогон начался примерно часов в 6 утра. Через пол часа я уже наблюдал в гугл аналитикс 3рех живых челов в режиме реального времени. Потупив забил и ушел спать. На следующий день (хотя это на самом деле был вечер того же дня но не суть) - решил чекнуть на ссылку все ссылки по которым гонял. Сначала было в районе <b>50</b> ссылок, через пару часов <b>66</b>, на момент написания статьи прошло около 2-3рех дней ссылок стало уже <b>91</b> то есть видна динамика и она радует.</p>
<br>
<a href="https://img.zzxc.ru/img/post-9/post9-3.jpg" target="_blank"><img border="0" alt="Динамика ростта ссылок" src="https://img.zzxc.ru/img/post-9/post9-3.jpg" /></a><br><br>
<p>По гугл аналитикс наблюдаю такую картину</p>
<a href="https://img.zzxc.ru/img/post-9/post9-4.jpg" target="_blank"><img border="0" alt="Динамика ростта ссылок google analytics" src="https://img.zzxc.ru/img/post-9/post9-4.jpg" /></a><br><br>
<p>А это ведь только по Ру блогам, на очереди бурж, которого на порядок больше, как и аудитории у бурж на порядок больше. Ссылки будут вечные и ссылочная будет расти постепенно - если не жестить. Ну всё все молодцы кто до сюда дочитал.</p>
<br><br><br><br><br><br>
<h2>UPDATE 18.09.2017</h2>
<p>Прогоняю по ру базе, эффект за 3 дня.</p>
<a href="https://img.zzxc.ru/img/post-9/post9-5.jpg" target="_blank"><img border="0" alt="Динамика роста ссылок" src="https://img.zzxc.ru/img/post-9/post9-5.jpg" /></a><br><br>
</div>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com5tag:blogger.com,1999:blog-244151671096808002.post-74038765360469142282016-02-10T23:01:00.052+03:002023-01-13T00:40:51.793+03:00Чистим мегабазы для хрумера при помощи TextPipe pro<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2016/02/chistim-bazy-dlya-xrumer-textpipe-pro.html" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Xrumer Base Clean with TextPipe pro" border="0" src="https://img.zzxc.ru/img/post-8/logo-8.jpg" /></a></div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Мне регулярно приходится обновлять свои базы и поддерживать их в актуальном состоянии. На это уходит много времени, а время как мы все знаем это деньги. Хотя и прикупил себе на днях <b><a href="/p/gsa-pi-intro.html">GSA Platform Identifier</a></b>, который заметно облегчает процесс сортировки и поиска пробивных движков, но по прежнему приходится выполнять много ручной работы. В данном посте я коснусь темы аж 2008 года, которая не перестает быть актуальной и по сей день. Сегодня мы поговорим о чистке больших баз при помощи <b>Text Pipe pro</b>. </div>
<br />
<a name='more'></a><br><br>
<h2>Необходимые требования</h2>
<p>Берем для опытов какую нибудь базу побольше. Я взял сыруху на <b>1 кк</b> ссылок которую парсил 2-3 дня назад. Ещё нам понадобится сама <b>TextPipe Pro</b> и сайт <b><a target="_blank" rel="nofollow" href="https://regexr.com/">regexr.com</a></b> на котором очень удобно составлять регулярки.</p>
<p>Вся суть сводится к тому чтобы сначала найти ненужные ссылки, которые хрумом не пробьются.</p>
<p>Скорее всего это будут популярные <b>web 2.0 сервисы</b>, к которым нужен отдельный подход или мод. Или по каким то причинам данные ресы тормозят прогон потому что перенасыщены рекапчей, кейкапчей, лагают, притворяются нерабочими и т.д</p>
<br><br>
<p>Так вот сначала мы по простейшим признакам выпаршиваем из базы такие ресы в отдельную базу. Затем делаем под них универсальную регулярку, проверяем её, если все ок то используем. Сразу скажу - процесс довольно трудоемкий, однако, сэкономит очень много времени в дальнейшем.</p>
<p>Открываем <b>Text Pipe pro</b> и добавляем нашу базу для обработки.</p>
<p>Выбираем в фильтрах <b>Extract > Extract lines not matching (inverse grep)</b> то есть извлечь все строки не подходящие к следующим рег. экспам:</p>
<br>
<a href="https://img.zzxc.ru/img/post-8/post8-1.jpg" target="_blank"><img border="0" alt="TextPipe Pro inverse grep" src="https://img.zzxc.ru/img/post-8/post8-1.jpg" /></a><br><br>
<p>И первым у нас будет blogspot, который мы удалим при помощи такого рег. экспа:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">.*\.blogspot(\.com|\.ru|\.se|\.de|\.ro|\.jp|\.dk|\.fr|\.pt|\.cz|\.nl|\.in|\.ca|\.kr|\.ae|\.hu|\.tw|\.ch|\.fi|\.lt|\.be|\.gr|\.it|\.mx|\.sk|\.hk|\.sg|\.ie|\.cl|\.my|\.no|\.co|\.co\.|\.com\.|\.pe|\.rs|\.si|\.hr|\.es|\.qa|\.al).*</span></div>
<br><br>
<p>Следом у нас будут web2.0 сервисы и блоги - вордпрессы, лайвджорналы, tumblr, weebly и т.д.:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">.*(\.wordpress|\.livejournal|\.tumblr|\.weebly|\.pinterest|\.reddit|\.blog)\.com.*</span></div>
<br><br>
<p>Хостинги картинок(не могу представить каким образом они попадают в базу, но они нам не нужны)</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">.*(\.photobucket|\.deviantart).com\/.*</span></div>
<br><br>
<p>Бесплатные хостинги. Бурж хосты, добавлю чуть позже:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">.*(\.wix|\.000webhost|\.110mb|\.16mb|\.125mb|\.100freemb)\.com.*</span></div>
<br><br>
<p>Отдельного внимания заслуживает ucoz(список пока неполный):</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">.*\.ucoz(\.com|\.com\.|\.ru|\.net|\.org|\.org\.ua|\.kz|\.ua|\.es|\.lv|\.co\.|\.de|\.ae|\.hu|\.ro|\.pl|\.fr).*</span></div>
<br><br>
<p>Ещё ucoz:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">.*(\.clan\.su|\.my1\.ru|\.3dn\.ru|\.moy\.su|\.do\.am|\.at\.ua).*</span></div>
<br><br>
<p>Ссылки на отправку почты:</p>
<div style="background-color: rgba(155,155,155,0.05);color: #ffffff;padding: 15px 25px; margin: 0; border-radius: 10px"><span style="color:#87a800">(http:|https:)\/\/mailto:.*</span></div>
<br><br>
<p>Весь список еще неполный и будет периодически обновляться.</p>
<br>
<a href="https://img.zzxc.ru/img/post-8/post8-2.jpg" target="_blank"><img border="0" alt="TextPipe Pro clean result" src="https://img.zzxc.ru/img/post-8/post8-2.jpg" /></a><br><br>
<p>Наглядный пример использования данного метода, показывает сколько можно экономить времени отсекая ненужные сайты и сервисы. <b>223 mb</b> ресурсов мы отсекли буквально за 5 минут, а сколько времени у нас бы занял чек этих ресурсов.</p>
<p>Могу сказать что как то чекал подряд много юкоза, без прокси. И он резал скорость чека на столько что где то 300к-600к ссылок чекалось часов 11.</p>
</div>
abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com1tag:blogger.com,1999:blog-244151671096808002.post-45672319617308676342015-04-17T08:44:00.021+03:002023-01-13T00:40:07.447+03:00Artelized Visions 001 (January 2014) with guest Astropilot<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="/2015/04/artelized-visions-001-january-2014-with.html" imageanchor="1"><img alt="Artelized Visions" border="0" src="https://img.zzxc.ru/img/post-7/logo-7.jpg" /></a></div>
<div dir="ltr" style="text-align: justify;" trbidi="on">
Отличный дарк эмбиент микс, точнее это мой любимый подкаст из артелайзд вижонс. Очень затягивает и помогает сконцентрироватся. Треклист прилагается.</div><br />
<a name='more'></a>
<br><br>
<iframe width="100%" height="120" src="https://www.mixcloud.com/widget/iframe/?hide_cover=1&hide_artwork=1&feed=%2Fcjartt%2Fartelized-visions-001-january-2014-with-guest-astropilot%2F" frameborder="0" ></iframe>
<br><br><br>
1.Artelized Visions Intro <br />
2.Escape - CARBON BASED LIFEFORMS <br />
3.Tungsten - Beat Bizarre <br />
4.Area C Level 0 - Relaunch <br />
5.See The Fear - Kliment <br />
6.Omega (club mix) - Anton Chernikov & The Digital Blonde <br />
7.Liquid Meadow - Ascent <br />
8.Hallucinations - Solar Spectrum, Egorythmia <br />
9.Hemija - Vertex, Molok & Subliminal codes <br />
10.Sonic Masala - Zentura <br />
11.Mahadeva (Lyctum Remix) - Astral Projection <br />
12.Feeling Very Weird (Astral Projection Remix) - The Infinity Project Feat. Raja Ram <br />
13.Artelized Visions Guest Mix - Astropilot <br /><br />
<p><b><a target="_blank" rel="nofollow" href="https://www.mixcloud.com/cjartt/artelized-visions-001-january-2014-with-guest-astropilot/"> Artelized Visions 001 (January 2014) with guest Astropilot </a></b></p>
</div>abhttp://www.blogger.com/profile/16673327370919649884noreply@blogger.com0