<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Yucca CCTV</title><subtitle>Рассказываем  о нашем проекте для видеонаблюдения Юкка и смежных проектах, опыте и многом другом 🙂</subtitle><author><name>Yucca CCTV</name></author><id>https://teletype.in/atom/yuccastream</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/yuccastream?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@yuccastream?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=yuccastream"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/yuccastream?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-05-14T02:14:35.479Z</updated><entry><id>yuccastream:nginx-letsencript-en</id><link rel="alternate" type="text/html" href="https://teletype.in/@yuccastream/nginx-letsencript-en?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=yuccastream"></link><title>Setup Nginx + Let's Encrypt reverse proxy before Yucca</title><published>2023-09-29T09:41:33.504Z</published><updated>2023-09-29T09:41:33.504Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/f6/d7/f6d7835e-3852-499e-a539-04a20b5134b0.png"></media:thumbnail><category term="cctv" label="cctv"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/aa/0b/aa0bfb67-21ca-4f33-8057-da4d3ab25bee.png&quot;&gt;In this tutorial I will describe how to set up Nginx and issue a Let's Encrypt SSL certificate that will be automatically renewed. Nginx will act as a simple Web server in front of Yucca to terminate the SSL session and redirect from port 80 to 443.</summary><content type="html">
  &lt;p id=&quot;E3qJ&quot;&gt;In this tutorial I will describe how to set up Nginx and issue a Let&amp;#x27;s Encrypt SSL certificate that will be automatically renewed. Nginx will act as a simple Web server in front of Yucca to terminate the SSL session and redirect from port 80 to 443.&lt;/p&gt;
  &lt;p id=&quot;dN52&quot;&gt;Why install Nginx at all, since Yucca itself can terminate SSL and even has &lt;a href=&quot;https://docs.yucca.app/ru/configuration/#cert_file&quot; target=&quot;_blank&quot;&gt;flags&lt;/a&gt;? This is true, but when you occupy port 443 it will be inaccessible to other software, you will have to use some other one, and there will also be no redirect from HTTP to HTTPS - if this suits you, then you can safely skip the section with installing and configuring Nginx &lt;strong&gt;Step 1&lt;/strong&gt; and go straight to &lt;strong&gt;Step 2&lt;/strong&gt; .&lt;/p&gt;
  &lt;p id=&quot;kSQr&quot;&gt;I will do all the steps on Ubuntu Server 22.04, but everything will work the same on SUSE, CentOS, Fedora, Debian and so on. Unless everyone will have their own package manager, but I hope you can tell the difference between apt and zypper :)&lt;/p&gt;
  &lt;h2 id=&quot;AcVn&quot;&gt;Step 0. Preparation&lt;/h2&gt;
  &lt;p id=&quot;1jCR&quot;&gt;And so we need:&lt;/p&gt;
  &lt;ol id=&quot;IDHv&quot;&gt;
    &lt;li id=&quot;OeH7&quot;&gt;Host with &lt;em&gt;a white&lt;/em&gt; IP address&lt;/li&gt;
    &lt;li id=&quot;3w4j&quot;&gt;Domain or subdomain that looks at this address&lt;/li&gt;
    &lt;li id=&quot;hGWe&quot;&gt;Yucca installed&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;EK8N&quot;&gt;In the instructions I will use the domain &lt;strong&gt;foobar.yuccastream.com&lt;/strong&gt; , your domain will be different.&lt;/p&gt;
  &lt;pre data-lang=&quot;shell&quot; id=&quot;q2J0&quot;&gt;nslookup foobar.yuccastream.com
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	foobar.yuccastream.com
Address: 128.140.2.103&lt;/pre&gt;
  &lt;figure id=&quot;Wg8c&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/aa/0b/aa0bfb67-21ca-4f33-8057-da4d3ab25bee.png&quot; width=&quot;976&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jRVT&quot;&gt;So I have Yucca, which is available at &lt;a href=&quot;http://foobar.yuccastream.com:9910&quot; target=&quot;_blank&quot;&gt;http://foobar.yuccastream.com:9910&lt;/a&gt;&lt;/p&gt;
  &lt;h2 id=&quot;rM8p&quot;&gt;Step 1. Install and configure Nginx&lt;/h2&gt;
  &lt;p id=&quot;0LCv&quot;&gt;Install nginx:&lt;/p&gt;
  &lt;pre data-lang=&quot;shell&quot; id=&quot;DHSQ&quot;&gt;sudo apt install nginx&lt;/pre&gt;
  &lt;p id=&quot;WyQq&quot;&gt;Check &lt;a href=&quot;http://foobar.yuccastream.com&quot; target=&quot;_blank&quot;&gt;http://foobar.yuccastream.com&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;HgBj&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4f/cb/4fcb0871-62f0-4790-8631-55d45d2b8f44.png&quot; width=&quot;976&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2QxK&quot;&gt;Next, create a configuration file for Yucca:&lt;/p&gt;
  &lt;pre data-lang=&quot;shell&quot; id=&quot;Ebll&quot;&gt;sudo nano /etc/nginx/conf.d/yucca.conf&lt;/pre&gt;
  &lt;p id=&quot;Cbv8&quot;&gt;⚠️ You need to replace the domain &lt;strong&gt;foobar.yuccastream.com&lt;/strong&gt; with your own.&lt;/p&gt;
  &lt;pre data-lang=&quot;nginx&quot; id=&quot;U3Ol&quot;&gt;upstream yucca_upstream {
  server 127.0.0.1:9910 fail_timeout=0;
}

server {
  listen 80;
  server_name foobar.yuccastream.com;
  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://yucca_upstream;
  }
}&lt;/pre&gt;
  &lt;p id=&quot;sdJS&quot;&gt;Save the file and check the configuration is correct:&lt;/p&gt;
  &lt;pre data-lang=&quot;shell&quot; id=&quot;3ai8&quot;&gt;sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful&lt;/pre&gt;
  &lt;p id=&quot;PtxD&quot;&gt;If everything is correct you will see &lt;em&gt;syntax is ok&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;o15S&quot;&gt;Update nginx configuration:&lt;/p&gt;
  &lt;pre data-lang=&quot;shell&quot; id=&quot;s7S2&quot;&gt;nginx -s reload&lt;/pre&gt;
  &lt;p id=&quot;kyJ1&quot;&gt;We refresh the page and see the Yucca web interface &lt;a href=&quot;http://foobar.yuccastream.com&quot; target=&quot;_blank&quot;&gt;http://foobar.yuccastream.com&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;wZdY&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7a/69/7a69c53a-ea78-4376-aafc-23404676eb17.png&quot; width=&quot;976&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;eSkf&quot;&gt;Step 2. Install Certbot and issue a letsencrypt certificate&lt;/h2&gt;
  &lt;p id=&quot;qnbI&quot;&gt;Install packages:&lt;/p&gt;
  &lt;pre data-lang=&quot;shell&quot; id=&quot;vb48&quot;&gt;sudo apt install certbot python3-certbot-nginx&lt;/pre&gt;
  &lt;p id=&quot;r4Cv&quot;&gt;We issue a certificate for our domain:&lt;/p&gt;
  &lt;p id=&quot;ZWTP&quot;&gt;⚠️ You need to replace the domain &lt;strong&gt;foobar.yuccastream.com&lt;/strong&gt; with your own.&lt;/p&gt;
  &lt;pre data-lang=&quot;shell&quot; id=&quot;ntMh&quot;&gt;sudo certbot --nginx -d foobar.yuccastream.com&lt;/pre&gt;
  &lt;figure id=&quot;P5bU&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0d/6a/0d6a6662-4eb0-42cc-adf9-e29b1798014e.png&quot; width=&quot;890&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Klbw&quot;&gt;Certbot will ask you to enter your E-mail (1), I recommend entering your real mailbox, if the certificate expires and does not renew automatically Let&amp;#x27;s Encrypt will send you a notification about this. You will also need to agree to the terms and conditions (2), (3). Next, certbot itself will find the required configuration file with the required domain, configure the SSL section and redirect, and show you a link at the output.&lt;/p&gt;
  &lt;p id=&quot;fD5D&quot;&gt;You can see what happened in the end in the file /etc/nginx/conf.d/yucca.conf&lt;/p&gt;
  &lt;pre data-lang=&quot;nginx&quot; id=&quot;Kht5&quot;&gt;
upstream yucca_upstream {
  server 127.0.0.1:9910 fail_timeout=0;
}

server {
  server_name foobar.yuccastream.com;
  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://yucca_upstream;
  }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/foobar.yuccastream.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/foobar.yuccastream.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = foobar.yuccastream.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name foobar.yuccastream.com;
    return 404; # managed by Certbot
}&lt;/pre&gt;
  &lt;p id=&quot;OM4s&quot;&gt;I recommend checking that certbot has created a timer for certificate renewal, it must be active:&lt;/p&gt;
  &lt;pre data-lang=&quot;shell&quot; id=&quot;U4Cv&quot;&gt;sudo systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Fri 2023-09-22 11:54:02 UTC; 7min ago
    Trigger: Fri 2023-09-22 14:13:25 UTC; 2h 11min left
   Triggers: ● certbot.service

Sep 22 11:54:02 foobar systemd[1]: Started Run certbot twice daily.&lt;/pre&gt;
  &lt;p id=&quot;T6WC&quot;&gt;We update the page &lt;a href=&quot;http://foobar.yuccastream.com&quot; target=&quot;_blank&quot;&gt;http://foobar.yuccastream.com&lt;/a&gt; and see that everything works via HTTPS, the redirect also works.&lt;/p&gt;
  &lt;figure id=&quot;5Smi&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/fb/36/fb36a9b2-505e-48e6-8a06-bd5be0b113ae.png&quot; width=&quot;976&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;wxTJ&quot;&gt;Step 3. Security setup&lt;/h2&gt;
  &lt;p id=&quot;Ch5y&quot;&gt;We configured access via HTTPS via nginx, but Yucca is still available via HTTP at &lt;a href=&quot;http://foobar.yuccastream.com:9910&quot; target=&quot;_blank&quot;&gt;http://foobar.yuccastream.com:9910&lt;/a&gt; . This is due to this default setting:&lt;/p&gt;
  &lt;pre data-lang=&quot;toml&quot; id=&quot;b3iZ&quot;&gt;listen_address = &amp;quot;:9910&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;eQbs&quot;&gt;Go to the Yucca configuration file and edit this parameter:&lt;/p&gt;
  &lt;pre data-lang=&quot;shell&quot; id=&quot;wnyZ&quot;&gt;sudo nano /opt/yucca/yucca.toml&lt;/pre&gt;
  &lt;p id=&quot;osKu&quot;&gt;We make Yucca listen only to localhost:&lt;/p&gt;
  &lt;pre data-lang=&quot;toml&quot; id=&quot;Cf9R&quot;&gt;listen_address = &amp;quot;127.0.0.1:9910&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;0Jff&quot;&gt;And reboot the Yucca server:&lt;/p&gt;
  &lt;pre data-lang=&quot;shell&quot; id=&quot;wCGq&quot;&gt; sudo systemctl restart yucca&lt;/pre&gt;
  &lt;p id=&quot;iSN7&quot;&gt;We check, now there is nothing at &lt;a href=&quot;http://foobar.yuccastream.com:9910&quot; target=&quot;_blank&quot;&gt;http://foobar.yuccastream.com:9910&lt;/a&gt; , but here &lt;a href=&quot;https://foobar.yuccastream.com&quot; target=&quot;_blank&quot;&gt;https://foobar.yuccastream.com&lt;/a&gt; everything works.&lt;/p&gt;
  &lt;p id=&quot;i7Dx&quot;&gt;Thanks for using Yucca :)&lt;/p&gt;
  &lt;p id=&quot;BA1H&quot;&gt;If you have any questions, you can ask them in our community chat on Telegram &lt;a href=&quot;https://t.me/yuccastream&quot; target=&quot;_blank&quot;&gt;@yuccastream&lt;/a&gt; or email us at &lt;a href=&quot;mailto:info@yucca.app&quot; target=&quot;_blank&quot;&gt;info@yucca.app&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>yuccastream:nginx-letsencript</id><link rel="alternate" type="text/html" href="https://teletype.in/@yuccastream/nginx-letsencript?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=yuccastream"></link><title>Настройка Nginx + Let's Encrypt обратный прокси перед Yucca</title><published>2023-09-22T13:53:25.654Z</published><updated>2023-09-22T14:26:45.510Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/0c/3e/0c3e3d2d-f19c-4d22-b0f0-1a31c5a53a75.png"></media:thumbnail><category term="videonablyudenie" label="видеонаблюдение"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/fb/36/fb36a9b2-505e-48e6-8a06-bd5be0b113ae.png&quot;&gt;В этой инструкции я опишу как настроить Nginx и выпустить Let&amp;#39;s Encrypt SSL сертификат, который будет автоматически продлеваться.</summary><content type="html">
  &lt;p id=&quot;E3qJ&quot;&gt;В этой инструкции я опишу как настроить Nginx и выпустить Let&amp;#x27;s Encrypt SSL сертификат, который будет автоматически продлеваться. Nginx будет выступать как простой Web сервер перед Yucca для терминации SSL сессии и редиректа с 80 на 443 порт.&lt;/p&gt;
  &lt;p id=&quot;dN52&quot;&gt;Зачем вообще устанавливать Nginx, ведь Yucca и сама может терминировать SSL и даже &lt;a href=&quot;https://docs.yucca.app/ru/configuration/#cert_file&quot; target=&quot;_blank&quot;&gt;флаги&lt;/a&gt; есть? Это верно, но когда вы займёте 443 порт он будет недоступен для другого ПО, придется использовать какой-то другой, а так же не будет редиректа с HTTP на HTTPS – если вас это устраивает, то можете смело пропускать секцию с установкой и настройкой Nginx &lt;strong&gt;Шаг 1&lt;/strong&gt; и сразу перейти на &lt;strong&gt;Шаг 2&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;kSQr&quot;&gt;Все действия я буду проделывать на Ubuntu Server 22.04, но всё тоже самое будет работать и на SUSE, CentOS, Fedora, Debian и так далее. Разве что пакетный менеджер у всех будет свой, но я надеюсь вы отличите apt от zypper :)&lt;/p&gt;
  &lt;h2 id=&quot;AcVn&quot;&gt;Шаг 0. Подготовка&lt;/h2&gt;
  &lt;p id=&quot;1jCR&quot;&gt;И так нам понадобится:&lt;/p&gt;
  &lt;ol id=&quot;IDHv&quot;&gt;
    &lt;li id=&quot;OeH7&quot;&gt;Хост с &lt;em&gt;белым&lt;/em&gt; IP адресом&lt;/li&gt;
    &lt;li id=&quot;3w4j&quot;&gt;Домен или поддомен который смотрит на этот адрес&lt;/li&gt;
    &lt;li id=&quot;hGWe&quot;&gt;Установленная Yucca&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;EK8N&quot;&gt;В инструкции я буду использовать домен &lt;strong&gt;foobar.yuccastream.com&lt;/strong&gt;, ваш домен будет отличаться.&lt;/p&gt;
  &lt;pre id=&quot;oK2r&quot; data-lang=&quot;shell&quot;&gt;nslookup foobar.yuccastream.com
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	foobar.yuccastream.com
Address: 128.140.2.103&lt;/pre&gt;
  &lt;figure id=&quot;GguG&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/aa/0b/aa0bfb67-21ca-4f33-8057-da4d3ab25bee.png&quot; width=&quot;976&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jRVT&quot;&gt;Итак у меня есть Yucca, которая доступна по адресу &lt;a href=&quot;http://foobar.yuccastream.com:9910&quot; target=&quot;_blank&quot;&gt;http://foobar.yuccastream.com:9910&lt;/a&gt;&lt;/p&gt;
  &lt;h2 id=&quot;rM8p&quot;&gt;Шаг 1. Установка и настройка Nginx&lt;/h2&gt;
  &lt;p id=&quot;0LCv&quot;&gt;Устанавливаем nginx:&lt;/p&gt;
  &lt;pre id=&quot;r20M&quot; data-lang=&quot;shell&quot;&gt;sudo apt install nginx&lt;/pre&gt;
  &lt;p id=&quot;WyQq&quot;&gt;Проверяем &lt;a href=&quot;http://foobar.yuccastream.com&quot; target=&quot;_blank&quot;&gt;http://foobar.yuccastream.com&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;sMnq&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4f/cb/4fcb0871-62f0-4790-8631-55d45d2b8f44.png&quot; width=&quot;976&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2QxK&quot;&gt;Далее создаём конфигурационный файл для Yucca:&lt;/p&gt;
  &lt;pre id=&quot;noWD&quot; data-lang=&quot;shell&quot;&gt;sudo nano /etc/nginx/conf.d/yucca.conf&lt;/pre&gt;
  &lt;p id=&quot;Cbv8&quot;&gt;⚠️ Домен &lt;strong&gt;foobar.yuccastream.com &lt;/strong&gt;вам нужно заменить на свой.&lt;/p&gt;
  &lt;pre id=&quot;UqOF&quot; data-lang=&quot;nginx&quot;&gt;upstream yucca_upstream {
  server 127.0.0.1:9910 fail_timeout=0;
}

server {
  listen 80;
  server_name foobar.yuccastream.com;
  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://yucca_upstream;
  }
}&lt;/pre&gt;
  &lt;p id=&quot;sdJS&quot;&gt;Сохраните файл и проверьте корректность конфигурации:&lt;/p&gt;
  &lt;pre id=&quot;A9ch&quot; data-lang=&quot;shell&quot;&gt;sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful&lt;/pre&gt;
  &lt;p id=&quot;PtxD&quot;&gt;Если всё корректно вы увидите &lt;em&gt;syntax is ok&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;o15S&quot;&gt;Обновляем конфигурацию nginx:&lt;/p&gt;
  &lt;pre id=&quot;uL0x&quot; data-lang=&quot;shell&quot;&gt;nginx -s reload&lt;/pre&gt;
  &lt;p id=&quot;kyJ1&quot;&gt;Обновляем страничку и видим уже веб интерфейс Yucca &lt;a href=&quot;http://foobar.yuccastream.com&quot; target=&quot;_blank&quot;&gt;http://foobar.yuccastream.com&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;9yQ8&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7a/69/7a69c53a-ea78-4376-aafc-23404676eb17.png&quot; width=&quot;976&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;eSkf&quot;&gt;Шаг 2. Установка Certbot и выпуск letsencrypt сертификата&lt;/h2&gt;
  &lt;p id=&quot;qnbI&quot;&gt;Устанавливаем пакеты:&lt;/p&gt;
  &lt;pre id=&quot;kijE&quot; data-lang=&quot;shell&quot;&gt;sudo apt install certbot python3-certbot-nginx&lt;/pre&gt;
  &lt;p id=&quot;r4Cv&quot;&gt;Выпускаем сертификат для нашего домена:&lt;/p&gt;
  &lt;p id=&quot;ZWTP&quot;&gt;⚠️ Домен &lt;strong&gt;foobar.yuccastream.com &lt;/strong&gt;вам нужно заменить на свой.&lt;/p&gt;
  &lt;pre id=&quot;e8Bq&quot; data-lang=&quot;shell&quot;&gt;sudo certbot --nginx -d foobar.yuccastream.com&lt;/pre&gt;
  &lt;figure id=&quot;kq9V&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0d/6a/0d6a6662-4eb0-42cc-adf9-e29b1798014e.png&quot; width=&quot;890&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Klbw&quot;&gt;Сertbot попросит ввести E-mail (1), рекомендую ввести ваш реальный ящик, в случае если сертификат будет истекать и не продлиться автоматически Let&amp;#x27;s Encrypt пришлёт вам об этом уведомление. Также нужно будет согласится с условиями и правилами (2), (3). Далее certbot сам найдёт нужный конфигурационный файл с нужным доменом, настроит секцию с SSL и редирект, на выходе покажет вам ссылку.&lt;/p&gt;
  &lt;p id=&quot;fD5D&quot;&gt;Можете посмотреть что в итоге получилось в файле /etc/nginx/conf.d/yucca.conf&lt;/p&gt;
  &lt;pre id=&quot;9QJh&quot; data-lang=&quot;nginx&quot;&gt;
upstream yucca_upstream {
  server 127.0.0.1:9910 fail_timeout=0;
}

server {
  server_name foobar.yuccastream.com;
  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://yucca_upstream;
  }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/foobar.yuccastream.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/foobar.yuccastream.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = foobar.yuccastream.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name foobar.yuccastream.com;
    return 404; # managed by Certbot
}&lt;/pre&gt;
  &lt;p id=&quot;OM4s&quot;&gt;Рекомендую проверить, что certbot создал таймер для продления сертификата, он должен быть активен:&lt;/p&gt;
  &lt;pre id=&quot;SBxF&quot; data-lang=&quot;shell&quot;&gt;sudo systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Fri 2023-09-22 11:54:02 UTC; 7min ago
    Trigger: Fri 2023-09-22 14:13:25 UTC; 2h 11min left
   Triggers: ● certbot.service

Sep 22 11:54:02 foobar systemd[1]: Started Run certbot twice daily.&lt;/pre&gt;
  &lt;p id=&quot;T6WC&quot;&gt;Обновляем стринцу &lt;a href=&quot;http://foobar.yuccastream.com&quot; target=&quot;_blank&quot;&gt;http://foobar.yuccastream.com&lt;/a&gt; и видим что всё работает уже через HTTPS, редирект тоже работает.&lt;/p&gt;
  &lt;figure id=&quot;9xyg&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/fb/36/fb36a9b2-505e-48e6-8a06-bd5be0b113ae.png&quot; width=&quot;976&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;wxTJ&quot;&gt;Шаг 3. Настройка безопасности&lt;/h2&gt;
  &lt;p id=&quot;Ch5y&quot;&gt;Мы настроили досту по HTTPS через nginx, но Yucca до сих пор доступна по HTTP на адресе &lt;a href=&quot;http://foobar.yuccastream.com:9910&quot; target=&quot;_blank&quot;&gt;http://foobar.yuccastream.com:9910&lt;/a&gt;. Это связанно вот с этой настройкой по умолчанию:&lt;/p&gt;
  &lt;pre id=&quot;ezHJ&quot; data-lang=&quot;toml&quot;&gt;listen_address = &amp;quot;:9910&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;eQbs&quot;&gt;Идём в конфигурационный файл Yucca и правим этот параметр:&lt;/p&gt;
  &lt;pre id=&quot;aUoQ&quot; data-lang=&quot;shell&quot;&gt;sudo nano /opt/yucca/yucca.toml&lt;/pre&gt;
  &lt;p id=&quot;osKu&quot;&gt;Делаем так, чтобы Yucca слушала только localhost:&lt;/p&gt;
  &lt;pre id=&quot;rmV5&quot; data-lang=&quot;toml&quot;&gt;listen_address = &amp;quot;127.0.0.1:9910&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;0Jff&quot;&gt;И перезагружаем сервер Yucca:&lt;/p&gt;
  &lt;pre id=&quot;ZIfq&quot; data-lang=&quot;shell&quot;&gt; sudo systemctl restart yucca&lt;/pre&gt;
  &lt;p id=&quot;iSN7&quot;&gt;Проверяем, теперь по адресу &lt;a href=&quot;http://foobar.yuccastream.com:9910&quot; target=&quot;_blank&quot;&gt;http://foobar.yuccastream.com:9910&lt;/a&gt; ничего нет, а тут  &lt;a href=&quot;https://foobar.yuccastream.com&quot; target=&quot;_blank&quot;&gt;https://foobar.yuccastream.com&lt;/a&gt; всё работает.&lt;/p&gt;
  &lt;p id=&quot;i7Dx&quot;&gt;Спасибо что используете Yucca :)&lt;/p&gt;
  &lt;p id=&quot;BA1H&quot;&gt;Если у вас есть какие либо вопросы вы можете задать их в нашем чате сообщества в Телеграм &lt;a href=&quot;https://t.me/yuccastream&quot; target=&quot;_blank&quot;&gt;@yuccastream&lt;/a&gt; или нам на почту &lt;a href=&quot;mailto:info@yucca.app&quot; target=&quot;_blank&quot;&gt;info@yucca.app&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>yuccastream:tuna</id><link rel="alternate" type="text/html" href="https://teletype.in/@yuccastream/tuna?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=yuccastream"></link><title>Как мы тестировали платежи, а в итоге сделали свой ngrok</title><published>2023-08-26T08:16:53.754Z</published><updated>2023-08-26T08:16:53.754Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/32/8a/328a2124-5e95-4d99-b0ca-d9909d7391d7.png"></media:thumbnail><category term="razrabotka" label="Разработка"></category><summary type="html">&lt;img src=&quot;https://blog.skillfactory.ru/wp-content/uploads/2023/02/image3-7788620.png&quot;&gt;Способов интеграций с платежной системой бывает несколько, мы используем самый простой и очевидный – получение сообщения о проведенном или отмененном платеже на публичный endpoint нашего сервиса или просто – webhook.</summary><content type="html">
  &lt;p id=&quot;FKfo&quot;&gt;Способов интеграций с платежной системой бывает несколько, мы используем самый простой и очевидный – получение сообщения о проведенном или отмененном платеже на публичный endpoint нашего сервиса или просто – webhook.&lt;/p&gt;
  &lt;p id=&quot;e4gr&quot;&gt;Процесс выгляди так:&lt;/p&gt;
  &lt;ol id=&quot;dcpW&quot;&gt;
    &lt;li id=&quot;A7S5&quot;&gt;пользователь кликает по кнопке Купить&lt;/li&gt;
    &lt;li id=&quot;uD9a&quot;&gt;мы получаем событие, создаем счет на оплату в платежной системе&lt;/li&gt;
    &lt;li id=&quot;Ztjp&quot;&gt;создаем счет на оплату в своей системе&lt;/li&gt;
    &lt;li id=&quot;qLch&quot;&gt;перенаправляем пользователя в платежную систему&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;V41n&quot;&gt;Если пользователь совершил платеж или отменил его, мы получаем статус от платежной системы с указанием номера счета с которым дальше и работаем - обновляем статус или реализуем саму покупку товара.&lt;/p&gt;
  &lt;p id=&quot;SsbN&quot;&gt;В реализации нет никаких сложностей – изучаем документацию платежной системы, реализуем нужные методы, публикуем, проверяем. Но что делать если документация сервиса не очень хороша, клиента под нужный язык нет или он не поддерживается, ну или просто хотим удостовериться, что все работает корректно до того, как это представить пользователям? Для получения событий, отправляемых платежной системой, нам нужно иметь какой-то endpoint, который был бы доступен публично, в случае тестовых сред или производственного окружения с этим никаких проблем нет, теперь надо разобраться, как организовать локальное окружение, которое бы позволяло комфортно вести разработку.&lt;/p&gt;
  &lt;h2 id=&quot;fRqw&quot;&gt;Вариант 1. Использовать свой IP-адрес&lt;/h2&gt;
  &lt;figure id=&quot;zKxc&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://blog.skillfactory.ru/wp-content/uploads/2023/02/image3-7788620.png&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Gums&quot;&gt;Тут может быть стразу несколько сложностей. Во первых сейчас мы живём в 2023-м году, а значит ipv6 ещё не заменил ipv4 и дефицит публичных IP адресов остаётся актуальной проблемой. От сюда проблема- публичного адреса нет и провайдер не может его дать, так как сам во всю использует CGNAT. Но даже если есть публичный IP тогда вам нужен маршрутизатор в настройках которого вы сможете настроить &lt;em&gt;проброс порта &lt;/em&gt;на свою локальную машину. Если же вы решили пойти поработать в кафе, то это становится не возможно в принципе.&lt;/p&gt;
  &lt;p id=&quot;MCnh&quot;&gt;Плюсы&lt;/p&gt;
  &lt;ul id=&quot;ApNI&quot;&gt;
    &lt;li id=&quot;vr2F&quot;&gt;бесплатно&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;F4gA&quot;&gt;Минусы:&lt;/p&gt;
  &lt;ul id=&quot;gJV3&quot;&gt;
    &lt;li id=&quot;SdLl&quot;&gt;нужен публичный IP адрес&lt;/li&gt;
    &lt;li id=&quot;d7Md&quot;&gt;маршрутизаторы разные отсюда могут быть разные ограничения&lt;/li&gt;
    &lt;li id=&quot;5Ic0&quot;&gt;сложность настройки самому&lt;/li&gt;
    &lt;li id=&quot;7YP1&quot;&gt;при изменении места работы меняется адрес&lt;/li&gt;
    &lt;li id=&quot;tmyH&quot;&gt;платежной системе может быть нужен SSL&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;onJ0&quot;&gt;Вариант 2. Разрабатывать в облаке&lt;/h2&gt;
  &lt;figure id=&quot;NrjE&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://smidcloud.com/wp-content/uploads/2018/01/10-1.jpg&quot; width=&quot;400&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;biqH&quot;&gt;Разработкой в облаке уже никого не удивишь, есть такие решения как &lt;a href=&quot;https://www.telepresence.io&quot; target=&quot;_blank&quot;&gt;Telepresence&lt;/a&gt;, &lt;a href=&quot;https://garden.io&quot; target=&quot;_blank&quot;&gt;Garden&lt;/a&gt;, &lt;a href=&quot;https://www.devspace.sh&quot; target=&quot;_blank&quot;&gt;DevSpace&lt;/a&gt;, &lt;a href=&quot;https://www.okteto.com&quot; target=&quot;_blank&quot;&gt;okteto&lt;/a&gt;. Типичный процесс работы с подобными системами выглядит следующим образом – я создаю какой-то файл-манифест, в котором описываю свой проект и способ его развертывания, запускаю какую-то команду &lt;code&gt;up&lt;/code&gt;, стенд поднимается, мне предоставляется публичная ссылка, по условной команде &lt;code&gt;dev&lt;/code&gt; мой сервис, запущенный в облаке, переключается в режим разработки – открываются нужные порты в облачную среду, запускается синхронизация файлов, теперь я могу зайти внутрь этого виртуального окружения и запускать/отлаживать свое приложение.&lt;/p&gt;
  &lt;p id=&quot;G9FR&quot;&gt;Плюсы:&lt;/p&gt;
  &lt;ul id=&quot;oS4u&quot;&gt;
    &lt;li id=&quot;aErr&quot;&gt;статичные адреса для окружений – это удобно при интеграции с платежными системами, где надо указывать адрес входящих сообщений об изменении статуса платежа&lt;/li&gt;
    &lt;li id=&quot;9cRF&quot;&gt;все уже настроено и работает&lt;/li&gt;
    &lt;li id=&quot;UQcb&quot;&gt;изолировано от локального окружения, более безопасно&lt;/li&gt;
    &lt;li id=&quot;U496&quot;&gt;многокомпонентные проекты проще тестировать&lt;/li&gt;
    &lt;li id=&quot;cBmz&quot;&gt;можно запускать сколько угодно тестовых стендов&lt;/li&gt;
    &lt;li id=&quot;jvVM&quot;&gt;не нужно переживать за поддержку инструмента&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;OZZc&quot;&gt;Минусы:&lt;/p&gt;
  &lt;ul id=&quot;7pSH&quot;&gt;
    &lt;li id=&quot;P1Tn&quot;&gt;для старта могут потребоваться дополнительные узкоспециализированные знания&lt;/li&gt;
    &lt;li id=&quot;Qg9C&quot;&gt;в случае бесплатных решений – нужно самому сопровождать&lt;/li&gt;
    &lt;li id=&quot;LYaJ&quot;&gt;в случае платных решений – стоят деньги, в режиме экономии подобные сервисы вряд ли будут в приоритете&lt;/li&gt;
    &lt;li id=&quot;zO99&quot;&gt;сложность в отладке проблем&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;zpM5&quot;&gt;Вариант 3. Использовать готовый сервис&lt;/h2&gt;
  &lt;figure id=&quot;3bPT&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ee/bd/eebd2271-1bb6-43b8-af09-a57663d770a9.png&quot; width=&quot;1580&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;AWC1&quot;&gt;Еще один вариант – открывать туннель в свою локальную сеть, чтобы все запросы на публичный адрес попадали напрямую в мой сервис. Тут тоже разнообразие сервисов и, наверное, самый известный – это &lt;a href=&quot;https://ngrok.com&quot; target=&quot;_blank&quot;&gt;ngrok&lt;/a&gt;, есть еще &lt;a href=&quot;https://inlets.dev&quot; target=&quot;_blank&quot;&gt;inlets&lt;/a&gt;, &lt;a href=&quot;https://tunnelin.com&quot; target=&quot;_blank&quot;&gt;tunnelin&lt;/a&gt;, &lt;a href=&quot;https://localxpose.io&quot; target=&quot;_blank&quot;&gt;localxpose&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;xf8o&quot;&gt;Работают эти все решения по одному принципу – некоторый консольный клиент при запуске подключается к какому-то публичному хосту и открывает сессию, которой присваивает публичный адрес, запрос пользователя к этому адресу сначала идет на этот публичный хост, а потом через открытую с консольным клиентом сессию попадает в уже пользовательский сервис.&lt;/p&gt;
  &lt;p id=&quot;hv9b&quot;&gt;Плюсы:&lt;/p&gt;
  &lt;ul id=&quot;Xj0r&quot;&gt;
    &lt;li id=&quot;JSq0&quot;&gt;статичные адреса&lt;/li&gt;
    &lt;li id=&quot;DYH3&quot;&gt;удобство локальной разработки – мы просто предоставляем публичный доступ к конкретному порту сервиса, никакая синхронизация не нужна, никакие дополнительные среды для этого поднимать не надо, все локально&lt;/li&gt;
    &lt;li id=&quot;VJOX&quot;&gt;легковесное решение – клиент предоставляется в виде консольного приложения под любые архитектуры и операционные системы&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ErpQ&quot;&gt;Минусы:&lt;/p&gt;
  &lt;ul id=&quot;rlMp&quot;&gt;
    &lt;li id=&quot;BgTe&quot;&gt;статичные адреса только по платной подписке&lt;/li&gt;
    &lt;li id=&quot;SZPy&quot;&gt;ограниченное время работы туннеля в бесплатном режиме&lt;/li&gt;
    &lt;li id=&quot;PDQZ&quot;&gt;если вы в России и у вас нет не российской карты, вы не можете купить подписку&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;mRXY&quot;&gt;Вариант 4. ngrok своими руками (грубо говоря)&lt;/h2&gt;
  &lt;figure id=&quot;4GHH&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://static.tvtropes.org/pmwiki/pub/images/6db_3.jpg&quot; width=&quot;350&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;WQMA&quot;&gt;Можно арендовать свой небольшой сервер у любого провайдера и пробрость порт по SSH. Технические детали описывать не буду, статей на эту тему много, например &lt;a href=&quot;https://habr.com/ru/articles/81607/&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;DoXx&quot;&gt;Плюсы:&lt;/p&gt;
  &lt;ul id=&quot;Xj0r&quot;&gt;
    &lt;li id=&quot;282a&quot;&gt;статичные адреса&lt;/li&gt;
    &lt;li id=&quot;t6cH&quot;&gt;относительно дёшево&lt;/li&gt;
    &lt;li id=&quot;kRiT&quot;&gt;распространенное решение, много статей на эту тему и если возникнет проблема, с большой долей вероятности можно найти ответ на Stack Overflow&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;qPkV&quot;&gt;Минусы:&lt;/p&gt;
  &lt;ul id=&quot;BuLt&quot;&gt;
    &lt;li id=&quot;yrjT&quot;&gt;нет автоматизации процесса&lt;/li&gt;
  &lt;/ul&gt;
  &lt;ul id=&quot;Ouvz&quot;&gt;
    &lt;li id=&quot;sw7s&quot;&gt;нужен SSH клиент на рабочей станции, с Windows будет сложно&lt;/li&gt;
    &lt;li id=&quot;O6hS&quot;&gt;платежной системе может быть нужен SSL&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;oJcw&quot;&gt;Результат&lt;/h2&gt;
  &lt;p id=&quot;5ZWR&quot;&gt;В итоге недолгих обсуждений мы решили и сделали свой сервис – &lt;a href=&quot;https://tuna.am&quot; target=&quot;_blank&quot;&gt;tuna&lt;/a&gt;, у него низкая цена относительно конкурентов, статичные домены, встроенный файловый и SSH-сервер – в целом все, что нам самим может пригодиться в работе.&lt;/p&gt;
  &lt;p id=&quot;3m3E&quot;&gt;Работать с сервисом несложно – после первичной настройки запускаем команду &lt;code&gt;tuna http 8080&lt;/code&gt; и получаем ссылку на наш сервис, которую и используем в конфигурации платежной системы тестового магазина:&lt;/p&gt;
  &lt;figure id=&quot;LsF8&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/67/a0/67a03582-e0b3-479b-a3ba-0b9d341a63f9.png&quot; width=&quot;1067&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;M9pD&quot;&gt;Чтобы получить статичный домен нужно передать соответствующий флаг, поэтому запускать нужно так – &lt;code&gt;tuna http 8080 --subdomain=my-service-lev&lt;/code&gt;, команда стала чуть больше, но все еще понятна, однако каждый раз вспоминать порт сервиса и привязанный к оплате домен неудобно, поэтому дополнительно локально мы используем такой инструмент как &lt;a href=&quot;https://direnv.net&quot; target=&quot;_blank&quot;&gt;direnv&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;qslH&quot;&gt;Все наши серверные приложения конфигурируются с помощью переменных окружения, поэтому мы взяли за правило в каждом репозитории создавать файл &lt;code&gt;.envrc&lt;/code&gt;, который содержит неперсонализированные настройки тестовой среды, которые актуализируются и применяются при каждом запуске сервиса, вот пример содержимого такого файла:&lt;/p&gt;
  &lt;pre id=&quot;Htcc&quot; data-lang=&quot;bash&quot;&gt;export SERVER_ENVIRONMENT=local

# Чтение файла .env
dotenv&lt;/pre&gt;
  &lt;p id=&quot;MuO1&quot;&gt;При каждом запуске мы даем понять сервису, что он работает в локальном окружении, поэтому часть функционала расширена или просто отключена. Последней строкой мы даем понять direnv, что нужно прочитать пользовательские персонализированные настройки из файла &lt;code&gt;.env&lt;/code&gt; – этот файл ни в коем случае не должен попасть в репозиторий, у каждого разработчика этот файл свой (проверьте содержимое &lt;code&gt;.gitignore&lt;/code&gt;, что файл &lt;code&gt;.env&lt;/code&gt; там указан), как правило в этом файле перечислены тестовые пароли, ключи, почтовые ящики.&lt;/p&gt;
  &lt;p id=&quot;IfcA&quot;&gt;Ну, а теперь соединяем все вместе, содержимое файла &lt;code&gt;.envrc&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;0Rov&quot; data-lang=&quot;bash&quot;&gt;export SERVER_ENVIRONMENT=local
export TUNA_PORT=8080

# Чтение файла .env
dotenv&lt;/pre&gt;
  &lt;p id=&quot;kd2h&quot;&gt;В добавленной строке мы даем понять tuna на каком порту работает наш сервис – это настройка универсальна для всех, поэтому храним в общем файле. А так выглядит содержимое моего файла &lt;code&gt;.env&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;WN5z&quot; data-lang=&quot;bash&quot;&gt;export TUNA_SUBDOMAIN=my-service-lev&lt;/pre&gt;
  &lt;p id=&quot;EXCD&quot;&gt;У каждого разработчика свой тестовый магазин и в нем задан свой адрес для получения входящих сообщений платежной системы, поэтому эту настройку храним в своем файле настроек.&lt;/p&gt;
  &lt;p id=&quot;Pl3n&quot;&gt;Все готово, теперь при запуске команды &lt;code&gt;tuna http&lt;/code&gt; я получу нужный статичный домен, который смотрит на нужный локальный сервис, осталось дело за малым – проверить что весь функционал оплаты работает корректно и отдать на ревью.&lt;/p&gt;
  &lt;p id=&quot;jm3i&quot;&gt;Есть у tuna и дополнительный полезный функционал, о нем расскажу ниже.&lt;/p&gt;
  &lt;h3 id=&quot;UAzV&quot;&gt;Инспектор запросов&lt;/h3&gt;
  &lt;p id=&quot;Qi0Y&quot;&gt;Для более удобной отладки есть встроенный Web интерфейс, где можно посмотреть все запросы которые проходят через &lt;strong&gt;tuna&lt;/strong&gt;.&lt;/p&gt;
  &lt;figure id=&quot;NI8H&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/43/ce/43ce279c-6a70-44fc-946b-f303bf98944d.png&quot; width=&quot;906&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;TPuX&quot;&gt;Файловый сервер&lt;/h3&gt;
  &lt;p id=&quot;CQeH&quot;&gt;Часто надо поделиться каким-то файлом и приходится загружать его в Google Drive или Telegram. Встроенный файловый сервер позволяет легко расшарить любой каталог на вашем компьютере, скопировать ссылку и дать её другу. Работает всё также просто, нужно просто добавить 1 флаг и указать путь к желаемому каталогу, в ответ вы получаете ссылку, перейдя по которой можно увидеть содержимое вашего каталога и скачать любой файл:&lt;/p&gt;
  &lt;pre id=&quot;z22y&quot;&gt;tuna http --file-server ./&lt;/pre&gt;
  &lt;figure id=&quot;RSqC&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c0/84/c0841dad-e210-44ed-b670-56a0b8203337.png&quot; width=&quot;916&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;zaFb&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/50/78/5078f048-afb2-441f-b7f0-e2e933c894bd.png&quot; width=&quot;906&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;vTRS&quot;&gt;SSH сервер&lt;/h3&gt;
  &lt;p id=&quot;X5VD&quot;&gt;Когда вы хотите получить техническую поддержку от друга или какой либо компании, но не можете предоставить подключение по SSH или ленитесь настраивать, то в &lt;a href=&quot;https://tuna.am&quot; target=&quot;_blank&quot;&gt;tuna&lt;/a&gt; достаточно написать:&lt;/p&gt;
  &lt;pre id=&quot;kKjd&quot;&gt;tuna ssh&lt;/pre&gt;
  &lt;p id=&quot;F8r3&quot;&gt;Будет запущен встроенный SSH-server, а в терминале вы увидите короткую инструкцию для подключения:&lt;/p&gt;
  &lt;figure id=&quot;p8j3&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/59/8a/598ab239-bd32-4587-b0eb-008fb40c1e8c.png&quot; width=&quot;1349&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;AUfx&quot;&gt;Отправляете это вашему другу/тех. поддержке и когда он подключится, это вы тоже увидите.&lt;/p&gt;
  &lt;h3 id=&quot;jT3c&quot;&gt;Другое&lt;/h3&gt;
  &lt;p id=&quot;7AZC&quot;&gt;Также можно настраивать аутентификацию, задать разрешённые подсети, добавлять заголовки, включать CORS, пробрасывать TCP порт, указать в назначении сторонний IP, в общем, функционал получился достаточно богатый, да и запланировано еще много интересного.&lt;/p&gt;
  &lt;p id=&quot;2Rhm&quot;&gt;А ещё у нас есть хосты (через который строится туннель) в России, а это значит, что трафик не будет делать огромный крюк через дата центры в Европе или Америке.&lt;/p&gt;
  &lt;h3 id=&quot;j5mc&quot;&gt;Цена&lt;/h3&gt;
  &lt;p id=&quot;610S&quot;&gt;Сервис &lt;strong&gt;можно оплатить рублями&lt;/strong&gt; через сервис Юкасса, а цена более чем приятная.&lt;/p&gt;
  &lt;figure id=&quot;3zjr&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/53/4d/534d652e-a42d-4318-810f-e8431c6937da.png&quot; width=&quot;1148&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7T3E&quot;&gt;На бесплатном тарифе вы сможете попробовать большую часть функционала, а за &lt;strong&gt;299 рублей&lt;/strong&gt; в месяц получаете полный доступ ко всем функциям. При оформлении годовой подписки получаете 2 месяца в подарок.&lt;/p&gt;
  &lt;p id=&quot;NBEE&quot;&gt;Подробнее можете посмотреть всё на сайте &lt;a href=&quot;https://tuna.am/#pricing&quot; target=&quot;_blank&quot;&gt;https://tuna.am/#pricing&lt;/a&gt;, надеюсь вам понравится работать с &lt;a href=&quot;https://tuna.am&quot; target=&quot;_blank&quot;&gt;tuna&lt;/a&gt; и спасибо, что дочитали до конца 🙂&lt;/p&gt;
  &lt;p id=&quot;UBTE&quot;&gt;Если у вас возникли вопросы, можете задать их нам по почте &lt;a href=&quot;mailto:info@tuna.am&quot; target=&quot;_blank&quot;&gt;info@tuna.am&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>yuccastream:09VFQhHseub</id><link rel="alternate" type="text/html" href="https://teletype.in/@yuccastream/09VFQhHseub?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=yuccastream"></link><title>Автоматизация в Gitlab</title><published>2023-04-25T06:33:06.159Z</published><updated>2023-07-04T19:06:36.061Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/14/71/14711677-1c7b-4795-8605-211f02cac696.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/09/c0/09c012a9-4b19-4077-91fd-affeb781e65f.png&quot;&gt;Привет всем, Лев у микрофона. В Gitlab'е у нас хранится все – документация, задачи, код, артефакты. Мы, хоть и благодарны за этот инструмент, но платить по 29 долларов за человека не хотим, поэтому так повелось, что у нас есть некоторая пачка сервисов, которая упрощает нам жизнь, о них и расскажу.</summary><content type="html">
  &lt;figure id=&quot;S0cF&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/09/c0/09c012a9-4b19-4077-91fd-affeb781e65f.png&quot; width=&quot;347.5&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;9gmS&quot;&gt;Привет всем, Лев у микрофона. В &lt;a href=&quot;https://gitlab.com&quot; target=&quot;_blank&quot;&gt;Gitlab&amp;#x27;е&lt;/a&gt; у нас хранится все – документация, задачи, код, артефакты. Мы, хоть и благодарны за этот инструмент, но платить по &lt;a href=&quot;https://about.gitlab.com/pricing/&quot; target=&quot;_blank&quot;&gt;29 долларов за человека&lt;/a&gt; не хотим, поэтому так повелось, что у нас есть некоторая пачка сервисов, которая упрощает нам жизнь, о них и расскажу.&lt;/p&gt;
  &lt;h3 id=&quot;UGqW&quot;&gt;gitlab-webhook-setter&lt;/h3&gt;
  &lt;p id=&quot;3G58&quot;&gt;Небольшая утилита, которая, имея токен и конфигурационный файл, актуализирует настройки Webhook во всех наших репозиториях, групповых интеграции у нас нет, поэтому выкручиваемся так.&lt;/p&gt;
  &lt;h3 id=&quot;8w8n&quot;&gt;gitlab-telegram-bot&lt;/h3&gt;
  &lt;p id=&quot;OceE&quot;&gt;Один из наших основных помощников – небольшой сервер, который получает события от Gitlab и отправляем нам сообщения в Telegram, так мы видим новые комментарии, новые задачи, движения Merge Request&amp;#x27;ов:&lt;/p&gt;
  &lt;figure id=&quot;JYUv&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/99/c3/99c3275a-eaeb-4c40-aea6-4de35ba3b4be.png&quot; width=&quot;505&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;BMTr&quot;&gt;У нас небольшая команда и работаем мы в свободное время, поэтому видя, как кто-то что-то делает появляется мотивация и самому добавить новый функционал в проект.&lt;/p&gt;
  &lt;h3 id=&quot;wbRT&quot;&gt;remindme&lt;/h3&gt;
  &lt;p id=&quot;IM8W&quot;&gt;Не то чтобы напрямую относится к Gitlab&amp;#x27;у, но описано и запускается именно там через Sheduled Jobs, с помощью этого приложения мы напоминаем в Telegram о необходимости провести общий созвон:&lt;/p&gt;
  &lt;figure id=&quot;ysIw&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0e/99/0e991ce1-9936-44ba-8bf5-3ae8a3010bf7.png&quot; width=&quot;401&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;4eg7&quot;&gt;pullreminders&lt;/h3&gt;
  &lt;p id=&quot;UfT7&quot;&gt;Когда мы только начинали работу над Юккой, было сложно сработаться из-за разного ритма работы и разного опыта, поэтому мы запретили пуши в мастер и любые вливания изменений без аппрува Merge Request, а pullreminders занимался тем, что по субботам напоминал кому и что нужно проверить перед попаданием в мастер.&lt;/p&gt;
  &lt;h3 id=&quot;VycB&quot;&gt;pullninja&lt;/h3&gt;
  &lt;p id=&quot;CJSp&quot;&gt;Это наш основной помощник, он отвечает за целую пачку задач, эти маленькие кусочки функционала мы называем плагинами, вот некоторые из них:&lt;/p&gt;
  &lt;ol id=&quot;ZRO1&quot;&gt;
    &lt;li id=&quot;UqjY&quot;&gt;areas – добавляет на MR лейблы относительно измененных файлов, так проще понять, какого рода изменения здесь произведены относительно мастера;&lt;/li&gt;
    &lt;li id=&quot;DAak&quot;&gt;default milestone – задачи созданные без указания Milestone попадают в Backlog – отдельный Milestone для всех непрошеных задач;&lt;/li&gt;
    &lt;li id=&quot;g3fi&quot;&gt;epic link – задачи с лейблом kind/feature и kind/bug могут быть автоматически слинкованы с задачей kind/epic, если у них есть общий групповой лейбл, так мы все мелкие задачи собираем в одну большую;&lt;/li&gt;
    &lt;li id=&quot;9Q0o&quot;&gt;require due date – задачи в некоторых проектах требуют указания Due Date, если дата не задана, будет добавлен соответствующий лейбл, так проще найти подобные задачи среди всех проектов;&lt;/li&gt;
    &lt;li id=&quot;sE8g&quot;&gt;require matching label – каждая из задач в нашем трекере требует наличия двух характеристик – тип задачи и приоритет, если одного из них нет, то будет создан соответствующий лейбл, по которому, опять же, просто найти неописанные задачи;&lt;/li&gt;
    &lt;li id=&quot;1K2e&quot;&gt;size – на каждый MR накидывается лейбл описывающий общий размер изменений;&lt;/li&gt;
    &lt;li id=&quot;7a5F&quot;&gt;watinig for info – задачи помечаются специальным лейблом, если у них отсутствует описание;&lt;/li&gt;
    &lt;li id=&quot;8jG8&quot;&gt;welcome – с помощью этого плагина мы приветствуем пользователей и поздравляем с первым Merge Request в нашем репозитории с документацией.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;W5qx&quot;&gt;Выглядит все примерно так:&lt;/p&gt;
  &lt;figure id=&quot;rhVd&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a4/de/a4de64d2-7f99-43b5-bf2e-4ed9a08e98e8.png&quot; width=&quot;1496&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;zOzU&quot;&gt;Помимо перечисленных плагинов были и экспериментальные, от которых мы отказались со временем, так как сработались и дополнительный контроль в виде автоматизации не требуется, например, плагин freeze, который добавлял в Pipeline шаг в статусе Failed, что блокировали вливание изменений в мастер.&lt;/p&gt;
  &lt;p id=&quot;3ata&quot;&gt;Некоторые инструменты мы открыли и вы можете свободно их использовать (остальные, со временем, откроем тоже):&lt;/p&gt;
  &lt;ul id=&quot;Rhe8&quot;&gt;
    &lt;li id=&quot;otHT&quot;&gt;&lt;a href=&quot;https://gitlab.com/yuccastream/pullninja&quot; target=&quot;_blank&quot;&gt;https://gitlab.com/yuccastream/pullninja&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;v51K&quot;&gt;&lt;a href=&quot;https://gitlab.com/yuccastream/pullreminders&quot; target=&quot;_blank&quot;&gt;https://gitlab.com/yuccastream/pullreminders&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;3Rp4&quot;&gt;&lt;a href=&quot;https://gitlab.com/yuccastream/gitlab-telegram-bot&quot; target=&quot;_blank&quot;&gt;https://gitlab.com/yuccastream/gitlab-telegram-bot&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;7kzX&quot;&gt;Ну и напоследок, если хочется получать уведомления в Telegram, но не хочется что-то дополнительно запускать самому, переходите в раздел Settings -&amp;gt; Webhooks вашего проекта в Gitlab и добавляйте туда новый webhook с такими параметрами:&lt;/p&gt;
  &lt;ol id=&quot;1Ca6&quot;&gt;
    &lt;li id=&quot;bGKZ&quot;&gt;URL: &lt;a href=&quot;https://gitlab.yuccastream.com/telegram?chat_id=1234567890&quot; target=&quot;_blank&quot;&gt;https://gitlab.yuccastream.com/telegram?chat_id=1234567890&lt;/a&gt; (где 1234567890 - это идентификатор вашего чата/контакта в Telegram, куда будут приходить уведомления)&lt;/li&gt;
    &lt;li id=&quot;QXda&quot;&gt;Trigger – установите флаги: issue events, comments, merge request events.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;BDbl&quot;&gt;И не забудьте пригласить к себе в чат нашего бота Pull Ninja (@Testico_Bot), сообщения будут отправляться от его имени.&lt;/p&gt;

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