<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://ender3.club/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Linvinus</id>
	<title>Ender 3 Wiki - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://ender3.club/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Linvinus"/>
	<link rel="alternate" type="text/html" href="https://ender3.club/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Linvinus"/>
	<updated>2026-04-28T18:12:57Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://ender3.club/index.php?title=AUTO_POWER_CONTROL&amp;diff=128</id>
		<title>AUTO POWER CONTROL</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=AUTO_POWER_CONTROL&amp;diff=128"/>
		<updated>2019-05-29T18:28:53Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: черновик...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Автоматическое управление питанием в Marlin =&lt;br /&gt;
&lt;br /&gt;
3D принтер это в первую очередь нагревательный прибор, и как все нагривательные приборы он требует особой техники безопасности.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Многие пользователи после покупки принтера задумываются о том каким образом можно обезопасить принтер.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Благодаря тому что Ender3 это полностью открытый принтер вы можете скачать конфигурационные файлы тут  https://github.com/Creality3DPrinting/Ender-3&lt;br /&gt;
&lt;br /&gt;
Оригинальная прошивка Ender3 от Creality, которая идёт с завода, это Marlin 1.1.6.&lt;br /&gt;
&lt;br /&gt;
Но в ней отключены некоторые полезные функции.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
вот что должно быть включено в прошивке чтобы работала защита&lt;br /&gt;
#define THERMAL_PROTECTION_HOTENDS&lt;br /&gt;
#define THERMAL_PROTECTION_BED&lt;br /&gt;
#define POWER_SUPPLY 2&lt;br /&gt;
#define PS_DEFAULT_OFF&lt;br /&gt;
#define AUTO_POWER_CONTROL&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=123</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=123"/>
		<updated>2019-05-25T18:48:22Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: /* настроим nginx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
Наиболее простой способ установить Octoprint, скачать официальный образ для миникомпьютера raspberry pi, причём желательно raspberry pi 3. &lt;br /&gt;
&lt;br /&gt;
Также подойдёт  китайский аналог orange pi 4х ядерный с 1Гб оперативной памяти. (фактически для работы octoprint требуется порядка 150Мб оперативной памяти, но для компиляции модулей python требуется больше), но устанавливать linux и  octoprint придётся самостоятельно.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Сгенерируем самоподписанный сертифекат ===&lt;br /&gt;
&lt;br /&gt;
этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/ssl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
все поля можно заполнять произвольными значениями кроме вопроса&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []: my.ender3.club&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
тут лучше всего указать dns адрес по которому будет доступен ваш принтер в интернете, если у вас такого адреса нет то его нужно придумать (например my.ender3.club).&lt;br /&gt;
&lt;br /&gt;
В последствии самоподписанный сертификат можно импортировать в &amp;quot;корневые доверенные центры сертификации&amp;quot; а dns имя прописать в файле c:\windows\system32\drivers\etc\hosts.&lt;br /&gt;
&lt;br /&gt;
например &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;my.ender3.club 111.222.111.222&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом вы сможете подключаться к принтеру и будете защищены от подмены сертификата, несмотря на то что сертификат самоподписанный.&lt;br /&gt;
&lt;br /&gt;
Кроме того это единственный способ как заставить работать cura с самоподписанным сертификатом.&lt;br /&gt;
&lt;br /&gt;
=== настроим nginx ===&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл sudo nano /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/nginx/ssl/nginx.crt;&lt;br /&gt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Небольшое отступление.&lt;br /&gt;
Для работы ssl этой настройки достаточно, но для повышения безопасности сервера лучше всего с генерировать дополнительный ключ командой&lt;br /&gt;
 &lt;br /&gt;
sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048  но это займёт достаточно много времени&lt;br /&gt;
&lt;br /&gt;
а после этого раскомментировать строку &amp;quot;ssl_dhparam /etc/nginx/dhparam.pem;&amp;quot; в файле /etc/nginx/snippets/ssl-params.conf , а затем перезапустить nginx командой sudo systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
сейчас этого можно не делать, но после того как всё настроите не забудьте сделать этот шаг.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint sudo nano /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл sudo nano /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
отключим порт 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#listen 80 default_server;&lt;br /&gt;
#listen [::]:80 default_server;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
включим порт 443, для этого раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location / {...}&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим mjpeg_streamer ===&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт sudo nano /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от устройства video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл sudo nano /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим octoprint ===&lt;br /&gt;
&lt;br /&gt;
так чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
nano /home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fail2ban ===&lt;br /&gt;
для того чтобы защититься от подбора пароля настроим fail2ban&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/fail2ban/jail.d/nginx-http-auth.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[nginx-http-auth]&lt;br /&gt;
enabled = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo systemctl restart fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firewall ===&lt;br /&gt;
&lt;br /&gt;
если вы публикуете octoprint на роутере, то достаточно пробросить только один порт например внешний порт роутера 9090 пробросить на внутренний порт octoprint 443 (этот порт слушает nginx), настраивать firewall на самом octoprint необязательно.&lt;br /&gt;
&lt;br /&gt;
Но если у вас сервер octoprint имеет белый ip адрес, т.е непосредственно подключен к сети internet то дополнительно необходимо настроить firewall на самом octoprint сервере.&lt;br /&gt;
&lt;br /&gt;
наиболее удобный для этого shorewall&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install shorewall&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
о том как он настраивается лучше всего почитать в документации или в статье https://www.opennet.ru/base/net/shorewall.txt.html&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=122</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=122"/>
		<updated>2019-05-25T18:46:36Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: /* настроим nginx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
Наиболее простой способ установить Octoprint, скачать официальный образ для миникомпьютера raspberry pi, причём желательно raspberry pi 3. &lt;br /&gt;
&lt;br /&gt;
Также подойдёт  китайский аналог orange pi 4х ядерный с 1Гб оперативной памяти. (фактически для работы octoprint требуется порядка 150Мб оперативной памяти, но для компиляции модулей python требуется больше), но устанавливать linux и  octoprint придётся самостоятельно.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Сгенерируем самоподписанный сертифекат ===&lt;br /&gt;
&lt;br /&gt;
этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/ssl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
все поля можно заполнять произвольными значениями кроме вопроса&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []: my.ender3.club&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
тут лучше всего указать dns адрес по которому будет доступен ваш принтер в интернете, если у вас такого адреса нет то его нужно придумать (например my.ender3.club).&lt;br /&gt;
&lt;br /&gt;
В последствии самоподписанный сертификат можно импортировать в &amp;quot;корневые доверенные центры сертификации&amp;quot; а dns имя прописать в файле c:\windows\system32\drivers\etc\hosts.&lt;br /&gt;
&lt;br /&gt;
например &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;my.ender3.club 111.222.111.222&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом вы сможете подключаться к принтеру и будете защищены от подмены сертификата, несмотря на то что сертификат самоподписанный.&lt;br /&gt;
&lt;br /&gt;
Кроме того это единственный способ как заставить работать cura с самоподписанным сертификатом.&lt;br /&gt;
&lt;br /&gt;
=== настроим nginx ===&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл sudo nano /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/nginx/ssl/nginx.crt;&lt;br /&gt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Небольшое отступление.&lt;br /&gt;
Для работы ssl этой настройки достаточно, но для повышения безопасности сервера лучше всего с генерировать дополнительный ключ командой&lt;br /&gt;
 &lt;br /&gt;
sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048  но это займёт достаточно много времени&lt;br /&gt;
&lt;br /&gt;
а после этого раскомментировать строку &amp;lt;code&amp;gt;ssl_dhparam /etc/nginx/dhparam.pem;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
сейчас этого можно не делать, но после того как всё настроите не забудьте сделать этот шаг.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint sudo nano /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл sudo nano /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
отключим порт 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#listen 80 default_server;&lt;br /&gt;
#listen [::]:80 default_server;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
включим порт 443, для этого раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location / {...}&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим mjpeg_streamer ===&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт sudo nano /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от устройства video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл sudo nano /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим octoprint ===&lt;br /&gt;
&lt;br /&gt;
так чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
nano /home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fail2ban ===&lt;br /&gt;
для того чтобы защититься от подбора пароля настроим fail2ban&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/fail2ban/jail.d/nginx-http-auth.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[nginx-http-auth]&lt;br /&gt;
enabled = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo systemctl restart fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firewall ===&lt;br /&gt;
&lt;br /&gt;
если вы публикуете octoprint на роутере, то достаточно пробросить только один порт например внешний порт роутера 9090 пробросить на внутренний порт octoprint 443 (этот порт слушает nginx), настраивать firewall на самом octoprint необязательно.&lt;br /&gt;
&lt;br /&gt;
Но если у вас сервер octoprint имеет белый ip адрес, т.е непосредственно подключен к сети internet то дополнительно необходимо настроить firewall на самом octoprint сервере.&lt;br /&gt;
&lt;br /&gt;
наиболее удобный для этого shorewall&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install shorewall&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
о том как он настраивается лучше всего почитать в документации или в статье https://www.opennet.ru/base/net/shorewall.txt.html&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=120</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=120"/>
		<updated>2019-05-25T17:05:57Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: /* Публикация octoprint */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
Наиболее простой способ установить Octoprint, скачать официальный образ для миникомпьютера raspberry pi, причём желательно raspberry pi 3. &lt;br /&gt;
&lt;br /&gt;
Также подойдёт  китайский аналог orange pi 4х ядерный с 1Гб оперативной памяти. (фактически для работы octoprint требуется порядка 150Мб оперативной памяти, но для компиляции модулей python требуется больше), но устанавливать linux и  octoprint придётся самостоятельно.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Сгенерируем самоподписанный сертифекат ===&lt;br /&gt;
&lt;br /&gt;
этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/ssl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
все поля можно заполнять произвольными значениями кроме вопроса&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []: my.ender3.club&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
тут лучше всего указать dns адрес по которому будет доступен ваш принтер в интернете, если у вас такого адреса нет то его нужно придумать (например my.ender3.club).&lt;br /&gt;
&lt;br /&gt;
В последствии самоподписанный сертификат можно импортировать в &amp;quot;корневые доверенные центры сертификации&amp;quot; а dns имя прописать в файле c:\windows\system32\drivers\etc\hosts.&lt;br /&gt;
&lt;br /&gt;
например &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;my.ender3.club 111.222.111.222&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом вы сможете подключаться к принтеру и будете защищены от подмены сертификата, несмотря на то что сертификат самоподписанный.&lt;br /&gt;
&lt;br /&gt;
Кроме того это единственный способ как заставить работать cura с самоподписанным сертификатом.&lt;br /&gt;
&lt;br /&gt;
=== настроим nginx ===&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл sudo nano /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/nginx/ssl/nginx.crt;&lt;br /&gt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint sudo nano /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл sudo nano /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
отключим порт 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#listen 80 default_server;&lt;br /&gt;
#listen [::]:80 default_server;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
включим порт 443, для этого раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location / {...}&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим mjpeg_streamer ===&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт sudo nano /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от устройства video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл sudo nano /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим octoprint ===&lt;br /&gt;
&lt;br /&gt;
так чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
nano /home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fail2ban ===&lt;br /&gt;
для того чтобы защититься от подбора пароля настроим fail2ban&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/fail2ban/jail.d/nginx-http-auth.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[nginx-http-auth]&lt;br /&gt;
enabled = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo systemctl restart fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firewall ===&lt;br /&gt;
&lt;br /&gt;
если вы публикуете octoprint на роутере, то достаточно пробросить только один порт например внешний порт роутера 9090 пробросить на внутренний порт octoprint 443 (этот порт слушает nginx), настраивать firewall на самом octoprint необязательно.&lt;br /&gt;
&lt;br /&gt;
Но если у вас сервер octoprint имеет белый ip адрес, т.е непосредственно подключен к сети internet то дополнительно необходимо настроить firewall на самом octoprint сервере.&lt;br /&gt;
&lt;br /&gt;
наиболее удобный для этого shorewall&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install shorewall&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
о том как он настраивается лучше всего почитать в документации или в статье https://www.opennet.ru/base/net/shorewall.txt.html&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=119</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=119"/>
		<updated>2019-05-25T16:58:10Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: /* fail2ban */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
Наиболее простой способ установить Octoprint, скачать официальный образ для миникомпьютера raspberry pi, причём желательно raspberry pi 3, либо китайский аналог orange pi 4х ядерный с 1Гб оперативной памяти. (фактически для работы octoprint требуется порядка 150Мб оперативной памяти, но для компиляции модулей python требуется больше)&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Сгенерируем самоподписанный сертифекат ===&lt;br /&gt;
&lt;br /&gt;
этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/ssl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
все поля можно заполнять произвольными значениями кроме вопроса&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []: my.ender3.club&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
тут лучше всего указать dns адрес по которому будет доступен ваш принтер в интернете, если у вас такого адреса нет то его нужно придумать (например my.ender3.club).&lt;br /&gt;
&lt;br /&gt;
В последствии самоподписанный сертификат можно импортировать в &amp;quot;корневые доверенные центры сертификации&amp;quot; а dns имя прописать в файле c:\windows\system32\drivers\etc\hosts.&lt;br /&gt;
&lt;br /&gt;
например &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;my.ender3.club 111.222.111.222&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом вы сможете подключаться к принтеру и будете защищены от подмены сертификата, несмотря на то что сертификат самоподписанный.&lt;br /&gt;
&lt;br /&gt;
Кроме того это единственный способ как заставить работать cura с самоподписанным сертификатом.&lt;br /&gt;
&lt;br /&gt;
=== настроим nginx ===&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл sudo nano /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/nginx/ssl/nginx.crt;&lt;br /&gt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint sudo nano /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл sudo nano /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
отключим порт 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#listen 80 default_server;&lt;br /&gt;
#listen [::]:80 default_server;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
включим порт 443, для этого раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location / {...}&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим mjpeg_streamer ===&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт sudo nano /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от устройства video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл sudo nano /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим octoprint ===&lt;br /&gt;
&lt;br /&gt;
так чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
nano /home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fail2ban ===&lt;br /&gt;
для того чтобы защититься от подбора пароля настроим fail2ban&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/fail2ban/jail.d/nginx-http-auth.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[nginx-http-auth]&lt;br /&gt;
enabled = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo systemctl restart fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firewall ===&lt;br /&gt;
&lt;br /&gt;
если вы публикуете octoprint на роутере, то достаточно пробросить только один порт например внешний порт роутера 9090 пробросить на внутренний порт octoprint 443 (этот порт слушает nginx), настраивать firewall на самом octoprint необязательно.&lt;br /&gt;
&lt;br /&gt;
Но если у вас сервер octoprint имеет белый ip адрес, т.е непосредственно подключен к сети internet то дополнительно необходимо настроить firewall на самом octoprint сервере.&lt;br /&gt;
&lt;br /&gt;
наиболее удобный для этого shorewall&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install shorewall&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
о том как он настраивается лучше всего почитать в документации или в статье https://www.opennet.ru/base/net/shorewall.txt.html&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=118</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=118"/>
		<updated>2019-05-25T16:56:54Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: /* Публикация octoprint */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
Наиболее простой способ установить Octoprint, скачать официальный образ для миникомпьютера raspberry pi, причём желательно raspberry pi 3, либо китайский аналог orange pi 4х ядерный с 1Гб оперативной памяти. (фактически для работы octoprint требуется порядка 150Мб оперативной памяти, но для компиляции модулей python требуется больше)&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Сгенерируем самоподписанный сертифекат ===&lt;br /&gt;
&lt;br /&gt;
этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/ssl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
все поля можно заполнять произвольными значениями кроме вопроса&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []: my.ender3.club&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
тут лучше всего указать dns адрес по которому будет доступен ваш принтер в интернете, если у вас такого адреса нет то его нужно придумать (например my.ender3.club).&lt;br /&gt;
&lt;br /&gt;
В последствии самоподписанный сертификат можно импортировать в &amp;quot;корневые доверенные центры сертификации&amp;quot; а dns имя прописать в файле c:\windows\system32\drivers\etc\hosts.&lt;br /&gt;
&lt;br /&gt;
например &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;my.ender3.club 111.222.111.222&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом вы сможете подключаться к принтеру и будете защищены от подмены сертификата, несмотря на то что сертификат самоподписанный.&lt;br /&gt;
&lt;br /&gt;
Кроме того это единственный способ как заставить работать cura с самоподписанным сертификатом.&lt;br /&gt;
&lt;br /&gt;
=== настроим nginx ===&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл sudo nano /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/nginx/ssl/nginx.crt;&lt;br /&gt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint sudo nano /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл sudo nano /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
отключим порт 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#listen 80 default_server;&lt;br /&gt;
#listen [::]:80 default_server;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
включим порт 443, для этого раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location / {...}&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим mjpeg_streamer ===&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт sudo nano /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от устройства video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл sudo nano /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим octoprint ===&lt;br /&gt;
&lt;br /&gt;
так чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
nano /home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fail2ban ===&lt;br /&gt;
для того чтобы защититься от подбора пароля настроим fail2ban&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/fail2ban/jail.d/nginx-http-auth.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[nginx-http-auth]&lt;br /&gt;
enabled = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firewall ===&lt;br /&gt;
&lt;br /&gt;
если вы публикуете octoprint на роутере, то достаточно пробросить только один порт например внешний порт роутера 9090 пробросить на внутренний порт octoprint 443 (этот порт слушает nginx), настраивать firewall на самом octoprint необязательно.&lt;br /&gt;
&lt;br /&gt;
Но если у вас сервер octoprint имеет белый ip адрес, т.е непосредственно подключен к сети internet то дополнительно необходимо настроить firewall на самом octoprint сервере.&lt;br /&gt;
&lt;br /&gt;
наиболее удобный для этого shorewall&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install shorewall&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
о том как он настраивается лучше всего почитать в документации или в статье https://www.opennet.ru/base/net/shorewall.txt.html&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=117</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=117"/>
		<updated>2019-05-25T16:45:52Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: /* firewall */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Сгенерируем самоподписанный сертифекат ===&lt;br /&gt;
&lt;br /&gt;
этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/ssl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
все поля можно заполнять произвольными значениями кроме вопроса&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []: my.ender3.club&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
тут лучше всего указать dns адрес по которому будет доступен ваш принтер в интернете, если у вас такого адреса нет то его нужно придумать (например my.ender3.club).&lt;br /&gt;
&lt;br /&gt;
В последствии самоподписанный сертификат можно импортировать в &amp;quot;корневые доверенные центры сертификации&amp;quot; а dns имя прописать в файле c:\windows\system32\drivers\etc\hosts.&lt;br /&gt;
&lt;br /&gt;
например &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;my.ender3.club 111.222.111.222&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом вы сможете подключаться к принтеру и будете защищены от подмены сертификата, несмотря на то что сертификат самоподписанный.&lt;br /&gt;
&lt;br /&gt;
Кроме того это единственный способ как заставить работать cura с самоподписанным сертификатом.&lt;br /&gt;
&lt;br /&gt;
=== настроим nginx ===&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл sudo nano /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/nginx/ssl/nginx.crt;&lt;br /&gt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint sudo nano /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл sudo nano /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
отключим порт 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#listen 80 default_server;&lt;br /&gt;
#listen [::]:80 default_server;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
включим порт 443, для этого раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location / {...}&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим mjpeg_streamer ===&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт sudo nano /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от устройства video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл sudo nano /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим octoprint ===&lt;br /&gt;
&lt;br /&gt;
так чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
nano /home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fail2ban ===&lt;br /&gt;
для того чтобы защититься от подбора пароля настроим fail2ban&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/fail2ban/jail.d/nginx-http-auth.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[nginx-http-auth]&lt;br /&gt;
enabled = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firewall ===&lt;br /&gt;
&lt;br /&gt;
если вы публикуете octoprint на роутере, то достаточно пробросить только один порт например внешний порт роутера 9090 пробросить на внутренний порт octoprint 443 (этот порт слушает nginx), настраивать firewall на самом octoprint необязательно.&lt;br /&gt;
&lt;br /&gt;
Но если у вас сервер octoprint имеет белый ip адрес, т.е непосредственно подключен к сети internet то дополнительно необходимо настроить firewall на самом octoprint сервере.&lt;br /&gt;
&lt;br /&gt;
наиболее удобный для этого shorewall&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install shorewall&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
о том как он настраивается лучше всего почитать в документации или в статье https://www.opennet.ru/base/net/shorewall.txt.html&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=116</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=116"/>
		<updated>2019-05-25T16:41:37Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: /* Сгенерируем самоподписанный сертифекат */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Сгенерируем самоподписанный сертифекат ===&lt;br /&gt;
&lt;br /&gt;
этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/ssl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
все поля можно заполнять произвольными значениями кроме вопроса&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []: my.ender3.club&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
тут лучше всего указать dns адрес по которому будет доступен ваш принтер в интернете, если у вас такого адреса нет то его нужно придумать (например my.ender3.club).&lt;br /&gt;
&lt;br /&gt;
В последствии самоподписанный сертификат можно импортировать в &amp;quot;корневые доверенные центры сертификации&amp;quot; а dns имя прописать в файле c:\windows\system32\drivers\etc\hosts.&lt;br /&gt;
&lt;br /&gt;
например &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;my.ender3.club 111.222.111.222&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом вы сможете подключаться к принтеру и будете защищены от подмены сертификата, несмотря на то что сертификат самоподписанный.&lt;br /&gt;
&lt;br /&gt;
Кроме того это единственный способ как заставить работать cura с самоподписанным сертификатом.&lt;br /&gt;
&lt;br /&gt;
=== настроим nginx ===&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл sudo nano /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/nginx/ssl/nginx.crt;&lt;br /&gt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint sudo nano /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл sudo nano /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
отключим порт 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#listen 80 default_server;&lt;br /&gt;
#listen [::]:80 default_server;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
включим порт 443, для этого раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location / {...}&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим mjpeg_streamer ===&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт sudo nano /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от устройства video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл sudo nano /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим octoprint ===&lt;br /&gt;
&lt;br /&gt;
так чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
nano /home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fail2ban ===&lt;br /&gt;
для того чтобы защититься от подбора пароля настроим fail2ban&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/fail2ban/jail.d/nginx-http-auth.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[nginx-http-auth]&lt;br /&gt;
enabled = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firewall ===&lt;br /&gt;
если у вас сервер octoprint имеет белый ip адрес, т.е непосредственно подключен к сети internet то дополнительно необходимо настроить firewall.&lt;br /&gt;
&lt;br /&gt;
наиболее удобный для этого shorewall&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install shorewall&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
о том как он настраивается лучше всего почитать в документации или в статье https://www.opennet.ru/base/net/shorewall.txt.html&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=115</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=115"/>
		<updated>2019-05-25T16:37:35Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: /* Сгенерируем самоподписанный сертифекат */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Сгенерируем самоподписанный сертифекат ===&lt;br /&gt;
&lt;br /&gt;
этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/ssl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
все поля можно заполнять произвольными значениями кроме вопроса&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []: my.ender3.club&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
тут лучше всего указать dns адрес по которому будет доступен ваш принтер в интернете, если у вас такого адреса нет то его нужно придумать (например my.ender3.club).&lt;br /&gt;
&lt;br /&gt;
В последствии самоподписанный сертификат можно импортировать в &amp;quot;корневые доверенные центры сертификации&amp;quot; а dns имя прописать в файле c:\windows\system32\drivers\etc\hosts.&lt;br /&gt;
&lt;br /&gt;
например &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;my.ender3.club 111.222.111.222&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом вы сможете подключаться к принтеру и будете защищены от подмены сертификата, несмотря на то что сертификат самоподписанный.&lt;br /&gt;
&lt;br /&gt;
Кроме того это единственный способ как заставить работать cura с самоподписанным сертификатом.&lt;br /&gt;
&lt;br /&gt;
=== настроим nginx ===&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл sudo nano /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/nginx/ssl/nginx.crt;&lt;br /&gt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint sudo nano /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл sudo nano /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
отключим порт 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#listen 80 default_server;&lt;br /&gt;
#listen [::]:80 default_server;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
включим порт 443, для этого раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location / {...}&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим mjpeg_streamer ===&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт sudo nano /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от устройства video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл sudo nano /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим octoprint ===&lt;br /&gt;
&lt;br /&gt;
так чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
nano /home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fail2ban ===&lt;br /&gt;
для того чтобы защититься от подбора пароля настроим fail2ban&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/fail2ban/jail.d/nginx-http-auth.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[nginx-http-auth]&lt;br /&gt;
enabled = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firewall ===&lt;br /&gt;
если у вас сервер octoprint имеет белый ip адрес, т.е непосредственно подключен к сети internet то дополнительно необходимо настроить firewall.&lt;br /&gt;
&lt;br /&gt;
наиболее удобный для этого shorewall&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install shorewall&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
о том как он настраивается лучше всего почитать в документации или в статье https://www.opennet.ru/base/net/shorewall.txt.html&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=114</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=114"/>
		<updated>2019-05-25T16:32:55Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: /* Сгенерируем самоподписанный сертифекат */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Сгенерируем самоподписанный сертифекат ===&lt;br /&gt;
&lt;br /&gt;
этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/ssl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
все поля можно заполнять произвольными значениями кроме вопроса&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
тут лучше всего указать dns адрес по которому будет доступен ваш принтер в интернете, если у вас такого адреса нет то его нужно придумать.&lt;br /&gt;
&lt;br /&gt;
В последствии самоподписанный сертификат можно импортировать в &amp;quot;корневые доверенные центры сертификации&amp;quot; а dns имя прописать в файле hosts.&lt;br /&gt;
&lt;br /&gt;
Таким образом вы сможете подключаться к принтеру и будете защищены от подмены сертификата, несмотря на то что сертификат самоподписанный.&lt;br /&gt;
&lt;br /&gt;
Кроме того это единственный способ как заставить работать cura с самоподписанным сертификатом.&lt;br /&gt;
&lt;br /&gt;
=== настроим nginx ===&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл sudo nano /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/nginx/ssl/nginx.crt;&lt;br /&gt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint sudo nano /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл sudo nano /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
отключим порт 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#listen 80 default_server;&lt;br /&gt;
#listen [::]:80 default_server;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
включим порт 443, для этого раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location / {...}&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим mjpeg_streamer ===&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт sudo nano /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от устройства video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл sudo nano /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим octoprint ===&lt;br /&gt;
&lt;br /&gt;
так чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
nano /home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fail2ban ===&lt;br /&gt;
для того чтобы защититься от подбора пароля настроим fail2ban&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/fail2ban/jail.d/nginx-http-auth.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[nginx-http-auth]&lt;br /&gt;
enabled = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firewall ===&lt;br /&gt;
если у вас сервер octoprint имеет белый ip адрес, т.е непосредственно подключен к сети internet то дополнительно необходимо настроить firewall.&lt;br /&gt;
&lt;br /&gt;
наиболее удобный для этого shorewall&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install shorewall&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
о том как он настраивается лучше всего почитать в документации или в статье https://www.opennet.ru/base/net/shorewall.txt.html&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=113</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=113"/>
		<updated>2019-05-25T16:19:49Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Сгенерируем самоподписанный сертифекат ===&lt;br /&gt;
&lt;br /&gt;
этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/ssl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== настроим nginx ===&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл sudo nano /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/nginx/ssl/nginx.crt;&lt;br /&gt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint sudo nano /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл sudo nano /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
отключим порт 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#listen 80 default_server;&lt;br /&gt;
#listen [::]:80 default_server;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
включим порт 443, для этого раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location / {...}&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим mjpeg_streamer ===&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт sudo nano /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от устройства video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл sudo nano /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим octoprint ===&lt;br /&gt;
&lt;br /&gt;
так чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
nano /home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fail2ban ===&lt;br /&gt;
для того чтобы защититься от подбора пароля настроим fail2ban&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/fail2ban/jail.d/nginx-http-auth.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[nginx-http-auth]&lt;br /&gt;
enabled = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firewall ===&lt;br /&gt;
если у вас сервер octoprint имеет белый ip адрес, т.е непосредственно подключен к сети internet то дополнительно необходимо настроить firewall.&lt;br /&gt;
&lt;br /&gt;
наиболее удобный для этого shorewall&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install shorewall&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
о том как он настраивается лучше всего почитать в документации или в статье https://www.opennet.ru/base/net/shorewall.txt.html&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=112</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=112"/>
		<updated>2019-05-25T16:18:38Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Сгенерируем самоподписанный сертифекат ===&lt;br /&gt;
&lt;br /&gt;
этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/ssl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== настроим nginx ===&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл sudo nano /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/nginx/ssl/nginx.crt;&lt;br /&gt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint sudo nano /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл sudo nano /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
отключим порт 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#listen 80 default_server;&lt;br /&gt;
#listen [::]:80 default_server;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
включим порт 443, для этого раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location / {...}&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим mjpeg_streamer ===&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт sudo nano /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от устройства video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл sudo nano /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== настроим octoprint ===&lt;br /&gt;
&lt;br /&gt;
так чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
nano /home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== fail2ban ===&lt;br /&gt;
для того чтобы защититься от подбора пароля настроим fail2ban&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/fail2ban/jail.d/nginx-http-auth.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[nginx-http-auth]&lt;br /&gt;
enabled = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== firewall ===&lt;br /&gt;
если у вас сервер octoprint имеет белый ip адрес, т.е непосредственно подключен к сети internet то дополнительно необходимо настроить firewall.&lt;br /&gt;
&lt;br /&gt;
наиболее удобный для этого shorewall&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install shorewall&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
о том как он настраивается лучше всего почитать в документации или в статье https://www.opennet.ru/base/net/shorewall.txt.html&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=111</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=111"/>
		<updated>2019-05-25T16:01:27Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сгенерируем самоподписанный сертифекат, этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/ssl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
настроим nginx&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл sudo nano /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/nginx/ssl/nginx.crt;&lt;br /&gt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint sudo nano /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл sudo nano /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
отключим порт 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#listen 80 default_server;&lt;br /&gt;
#listen [::]:80 default_server;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
включим порт 443, для этого раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location / {...}&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
настроим mjpeg_streamer&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт sudo nano /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от устройства video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл sudo nano /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
настроим octoprint чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
nano /home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=110</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=110"/>
		<updated>2019-05-25T16:00:09Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сгенерируем самоподписанный сертифекат, этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/ssl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
настроим nginx&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл sudo nano /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/nginx/ssl/nginx.crt;&lt;br /&gt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint sudo nano /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл sudo nano /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
отключим порт 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#listen 80 default_server;&lt;br /&gt;
#listen [::]:80 default_server;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
включим порт 443, для этого раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location {...}/&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
настроим mjpeg_streamer&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт sudo nano /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от устройства video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл sudo nano /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
настроим octoprint чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
nano /home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=109</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=109"/>
		<updated>2019-05-25T15:56:49Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сгенерируем самоподписанный сертифекат, этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/ssl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
настроим nginx&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл sudo nano /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/nginx/ssl/nginx.crt;&lt;br /&gt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint sudo nano /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл sudo nano /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location /&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
настроим mjpeg_streamer&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт sudo nano /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от устройства video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл sudo nano /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
настроим octoprint чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
nano /home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=108</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=108"/>
		<updated>2019-05-25T15:44:34Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: /* Публикация octoprint */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сгенерируем самоподписанный сертифекат, этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
настроим nginx&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;&lt;br /&gt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
/etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location /&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
создадим пользователя и пароль для доступа к серверу&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;htpasswd -с /etc/nginx/.htpasswd myoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
настроим mjpeg_streamer&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
скрипт запуска имеет зависимость от video0 для того чтобы это работало необходимо чтобы udev сообщил systemd когда это устройство появится&lt;br /&gt;
&lt;br /&gt;
для этого создадим файл /etc/udev/rules.d/99-v4lsystemd.rules с таким содержимым&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KERNEL==&amp;quot;video*&amp;quot;, SUBSYSTEM==&amp;quot;video4linux&amp;quot;, SUBSYSTEMS==&amp;quot;usb&amp;quot;, TAG+=&amp;quot;systemd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
настроим octoprint чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
/home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=107</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=107"/>
		<updated>2019-05-25T15:41:21Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: черновик2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сгенерируем самоподписанный сертифекат, этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
настроим nginx&lt;br /&gt;
&lt;br /&gt;
создадим директорию&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mkdir /etc/nginx/snippets&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в ней создадим файл /etc/nginx/snippets/self-signed.conf в котором укажем путь до сертификата&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;&lt;br /&gt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
поскольку на arm архитектуре очень часто нет аппаратной поддержки шифрования aes настроим ssl на алгоритм chacha20 который в 3 раза быстрее aes.&lt;br /&gt;
&lt;br /&gt;
/etc/nginx/snippets/ssl-params.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;ssl_protocols TLSv1.2;&lt;br /&gt;
ssl_prefer_server_ciphers on;&lt;br /&gt;
#ssl_dhparam /etc/nginx/dhparam.pem;&lt;br /&gt;
ssl_ciphers                 &#039;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:PSK-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384&#039;;&lt;br /&gt;
ssl_ecdh_curve secp384r1; # Requires nginx &amp;gt;= 1.1.0&lt;br /&gt;
ssl_session_timeout  10m;&lt;br /&gt;
ssl_session_cache shared:SSL:10m;&lt;br /&gt;
ssl_session_tickets off; # Requires nginx &amp;gt;= 1.5.9&lt;br /&gt;
ssl_stapling on; # Requires nginx &amp;gt;= 1.3.7&lt;br /&gt;
ssl_stapling_verify on; # Requires nginx =&amp;gt; 1.3.7&lt;br /&gt;
resolver 8.8.8.8 8.8.4.4 valid=300s;&lt;br /&gt;
resolver_timeout 5s;&lt;br /&gt;
# Disable strict transport security for now. You can uncomment the following&lt;br /&gt;
# line if you understand the implications.&lt;br /&gt;
# add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubDomains; preload&amp;quot;;&lt;br /&gt;
add_header X-Frame-Options DENY;&lt;br /&gt;
add_header X-Content-Type-Options nosniff;&lt;br /&gt;
add_header X-XSS-Protection &amp;quot;1; mode=block&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
создадим файл с настройками проксирования для octoprint /etc/nginx/snippets/octoprint.conf&lt;br /&gt;
&lt;br /&gt;
октопринт настроен слушать на локальном ip 127.0.0.1 порт 5000&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        proxy_pass http://127.0.0.1:5000/; # make sure to add trailing slash here!&lt;br /&gt;
        proxy_set_header Host $http_host;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Scheme $scheme;&lt;br /&gt;
        #proxy_set_header X-Script-Name /octoprint;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
&lt;br /&gt;
        client_max_body_size 0; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
отредактируем файл /etc/nginx/sites-enabled/default&lt;br /&gt;
&lt;br /&gt;
раскомментируем строку &amp;lt;code&amp;gt;listen 443 ssl default_server;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а после строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # include snippets/snakeoil.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
добавим &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        include snippets/self-signed.conf;&lt;br /&gt;
        include snippets/ssl-params.conf;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
заменим &amp;lt;code&amp;gt;location /&amp;lt;/code&amp;gt; таким содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        auth_basic  &amp;quot;auth:&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
        location /video {&lt;br /&gt;
            proxy_buffering off;&lt;br /&gt;
            proxy_pass http://127.0.0.1:8080/?action=stream;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        location / {&lt;br /&gt;
                include snippets/octoprint.conf;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
здесь мы так же определили location для mjpg_streamer, который настроим ниже.&lt;br /&gt;
&lt;br /&gt;
создадим пользователя и пароль для доступа к серверу&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;htpasswd -с /etc/nginx/.htpasswd myoctoprintuser&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
теперь nginx настроен можно перезапускать &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl restart nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
настроим mjpeg_streamer&lt;br /&gt;
&lt;br /&gt;
для запуска сервиса будем использовать вот такой скрипт /usr/lib/systemd/system/mjpg_streamer\@.service&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=A server for streaming Motion-JPEG from a video capture device&lt;br /&gt;
After=network.target&lt;br /&gt;
Wants=dev-video0.device&lt;br /&gt;
After=dev-video0.device&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=&amp;quot;LD_LIBRARY_PATH=/usr/lib/mjpg-streamer&amp;quot;&lt;br /&gt;
User=mjpg_streamer&lt;br /&gt;
#ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 1280x720   -q 85 -timeout 10 -dv_timings&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
ExecStart=/usr/bin/mjpg_streamer -i &#039;/usr/lib/mjpg-streamer/input_uvc.so -d /dev/%I -r 640x480   -q 50&#039; -o &#039;/usr/lib/mjpg-streamer/output_http.so -l 127.0.0.1 -p 8080 -w /usr/share/mjpg_streamer/www&#039;&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для того чтобы mjpg_streamer работал с устройством &amp;lt;code&amp;gt;/dev/video0&amp;lt;/code&amp;gt; нужно выполнить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl start mjpg_streamer\@video0.service&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
настроим octoprint чтобы слушал только локальный ip, после этой операции доступ к octoprint будет только через nginx&lt;br /&gt;
&lt;br /&gt;
в файле конфигурации octoprint, у меня это &lt;br /&gt;
&lt;br /&gt;
/home/octoprint/.octoprint/config.yaml&lt;br /&gt;
&lt;br /&gt;
в секции server:&lt;br /&gt;
&lt;br /&gt;
добавим или заменим два параметра&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 host: 127.0.0.1&lt;br /&gt;
 port: 5000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в секции webcam:&lt;br /&gt;
&lt;br /&gt;
изменим два параметра для видео потока&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  snapshot: http://127.0.0.1:8080/?action=snapshot&lt;br /&gt;
  stream: /video&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
после этого перезапустим octoprint&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
	<entry>
		<id>https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=106</id>
		<title>Octoprint publishing</title>
		<link rel="alternate" type="text/html" href="https://ender3.club/index.php?title=Octoprint_publishing&amp;diff=106"/>
		<updated>2019-05-24T14:57:03Z</updated>

		<summary type="html">&lt;p&gt;Linvinus: черновик 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Публикация octoprint ==&lt;br /&gt;
Печать идёт очень долго, но находиться рядом с принтером не всегда возможно, эта инструкция для тех кто хочет иметь возможность удалённого управления принтером.&lt;br /&gt;
&lt;br /&gt;
Для удалённого управления можно использовать два варианта.&lt;br /&gt;
# Подключить принтер к компьютеру по usb, а к компьютеру подключаться удалённо по RDP или TeamViewer-у или аналогам.&lt;br /&gt;
# Подключить принтер к специальному принт-серверу OctoPrint https://octoprint.org&lt;br /&gt;
&lt;br /&gt;
Рассмотрим второй вариант.&lt;br /&gt;
&lt;br /&gt;
О том как правильно удалённо управлять принтером используя OctoPrint есть официальный ответ разработчиков есть тут https://octoprint.org/blog/2018/09/03/safe-remote-access/&lt;br /&gt;
&lt;br /&gt;
Если вкратце то они советуют использовать плагины для OctoPrint, такие как  &amp;quot;Polar Cloud&amp;quot;, &amp;quot;OctoPrint Anywhere&amp;quot;, &amp;quot;Telegram&amp;quot; и другие.&lt;br /&gt;
&lt;br /&gt;
Используя плагины вы перекладываете вопрос по безопасности на сторонних людей, которые, теоретически, разбираются в этом вопросе лучше вас.&lt;br /&gt;
&lt;br /&gt;
Поэтому если у вас нет достаточного понимания в том как работает стек протоколов TCP/IP , что такое firewall и как работает шифрование то вам скорее всего лучше использовать плагины, если вы пользуетесь месседжером Телеграмм то наиболее удобно использовать бота для управления вашим принтером.&lt;br /&gt;
&lt;br /&gt;
Дале инструкция для тех у кого уже есть установленный OctoPrint но по какой либо причине необходимо опубликовать свой принтер на своём оборудовании.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какие могут быть варианты с точки зрения безопасности&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|Публикация порта Octoprint на роутере без ssl&lt;br /&gt;
|Очень низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом&lt;br /&gt;
|Низкая безопасность&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&lt;br /&gt;
|Достаточно высокая безопасность при соблюдении ряда условий&lt;br /&gt;
|-&lt;br /&gt;
|Публикация через Nginx с сертификатом LetsEncrypt (либо с любым платным сертификатом)  + Basic авторизация&lt;br /&gt;
|Высокая безопасность&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стратегия повышения безопасности сводится к тому чтобы отдалить атакующего от ненадёжного приложения, такого как octoprint.&lt;br /&gt;
&lt;br /&gt;
Для этого лучше всего использовать nginx либо любой другой прокси сервер который поддерживает SSL и basic авторизацию, можно и авторизацию по сертификатам, но если вы знаете как это работаете то скорее всего вам эта инструкция не нужна.&lt;br /&gt;
&lt;br /&gt;
Я буду рассматривать вариант &amp;quot;Публикация через Nginx с самоподписанным сертификатом + Basic авторизация&amp;quot; поскольку не у всех есть возможность использовать доменное имя, а какой именно сертификат самоподписанный или любой другой с точки зрения настроек сервера значения не имеет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конечном итоге нам нужно сделать так чтобы запрос приходил на наш Nginx, он проверит авторизацию посредством basic авторизации, и если всё верно пропустит до octoprint или  mjpg_streamer.&lt;br /&gt;
&lt;br /&gt;
Начнём с установки Nginx и необходимых пакетов, я предполагаю что у вас Debian based образ либо Raspberry либо Armbian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;apt install nginx-light apache2-utils&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сгенерируем самоподписанный сертифекат, этот этап можно пропустить если у вас уже есть другой сертификат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создадим файл с логином и паролем, логин и пароль должны быть достаточно сложными, поскольку это основная защита от атакующего.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;htpasswd -c /etc/nginx/.htpasswd secretoctoprintuser&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Linvinus</name></author>
	</entry>
</feed>