{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Андрей Садулин: заметки с тегом administration",
    "_rss_description": "Андрей Садулин — заметки разработчика",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/closed-ai.tech\/tags\/administration\/",
    "feed_url": "https:\/\/closed-ai.tech\/tags\/administration\/json\/",
    "icon": "https:\/\/closed-ai.tech\/pictures\/userpic\/userpic@2x.jpg?1715292324",
    "authors": [
        {
            "name": "Андрей Садулин",
            "url": "https:\/\/closed-ai.tech\/",
            "avatar": "https:\/\/closed-ai.tech\/pictures\/userpic\/userpic@2x.jpg?1715292324"
        }
    ],
    "items": [
        {
            "id": "33",
            "url": "https:\/\/closed-ai.tech\/all\/ubuntu-na-vmware-fusion\/",
            "title": "Ubuntu на VMware Fusion",
            "content_html": "<p>Попробовал поработать на виртуалке c Ubuntu 25.04, поднятой в VMware Fusion — пока что очень нравится. Хост машина у меня — MacBook на M1 Pro с 32 GB памяти, для гостевой я немного поправил базовые настройки: выделил ей 4 vCPU, 8 GB RAM, 40 GB HDD и ткнул опцию «Use full resolution for Retina display». Уже в Ubuntu выбрал разрешение экрана 4K и поднял масштабирование интерфейса до 200%. Супер. Работает быстро, визуально разве что скроллинг не такой плавный, как на Mac, ну и есть явно ощутимые задержки в выводе звука, например, с видео на YouTube. И пока почему-то не работает copy-paste ни в какую сторону даже после установки VMware Tools — пока не понятно, почему, попробую разобраться на досуге. В целом, с учетом того, что VMware Fusion официально распространяется бесплатно (хотя нынче всё-таки, видимо, придется регистрироваться на портале Broadcom — я раньше писал, что можно было скачать его напрямую по <a href=\"https:\/\/softwareupdate.vmware.com\/cds\/vmw-desktop\/\">ссылке<\/a> или с помощью <a href=\"https:\/\/formulae.brew.sh\/cask\/vmware-fusion#default\">Brew<\/a>, но лавочку прикрыли), на текущий момент это неплохая замена платному Parallels, если вам не нужна бесшовная интеграция с MacOS.<\/p>\n",
            "date_published": "2025-08-11T06:17:13+05:00",
            "date_modified": "2025-08-11T06:16:12+05:00",
            "tags": [
                "administration"
            ],
            "_date_published_rfc2822": "Mon, 11 Aug 2025 06:17:13 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "33",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "18",
            "url": "https:\/\/closed-ai.tech\/all\/cloudflare-https-i-ssl\/",
            "title": "Cloudflare: HTTPS и SSL",
            "content_html": "<p>Итак, у вас есть домен, который вы перенесли в Cloudflare. Сразу же после его добавления и настройки на платформе к нему автоматически выдаются два SSL-сертификата: основной и запасной, с разными Certificate Authority — Let’s Encrypt, Sectigo, Google Trust Services. Время жизни сертификатов — 3 месяца, после — автопродление. Удобно.<\/p>\n<p>Вот, как это выглядит:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-21.57.37@2x.png.jpg\" width=\"2560\" height=\"1672\" alt=\"\" \/>\n<\/div>\n<p>Обратите внимание, что это <b>Edge Certificates<\/b>. Поскольку платформа по-умолчанию проксирует трафик на сайт через себя, эти «пограничные» сертификаты используются <b>только на участке «пользователь — Cloudflare»<\/b>. Там же можно включить настройку «Always use HTTPS», и ожидаемо получить автоматические редиректы — но только всё на том же участке! Трафик от Cloudflare до сервера будет передаваться без шифрования!<\/p>\n<p>Обновив страницу блога, я получил несколько ошибок в консоли вида <a href=\"https:\/\/developers.cloudflare.com\/ssl\/troubleshooting\/mixed-content-errors\/.\" class=\"nu\">«<u>Mixed content: request has been blocked<\/u>»<\/a> — падали асинхронные запросы, инициированные где-то в JavaScript. Также не работало сохранение записей и некоторые редиректы — видимо, всё по той же причине 😭<\/p>\n<p>Опытным путем я понял, что надо бы шифровать весь трафик E2E, а для этого нам понадобится <b>Origin Certificate<\/b> — как раз-таки тот, который отвечает за оставшийся путь от Cloudflare до сервера (в моем случае до Nginx).<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-22.44.07@2x.png.jpg\" width=\"2560\" height=\"1672\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Да, его действительно можно получить на 15 (!) лет<\/div>\n<\/div>\n<p>Нажав на кнопку «Create», мы получим, по сути, две строки: сам сертификат и приватный ключ для него. Для добавления их в Nginx Proxy Manager, я сохранил их как файлы и импортировал так, как показано на втором снимке в галерее ниже:<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"2560\" data-ratio=\"1.5311004784689\">\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-22.51.14@2x.png.jpg\" width=\"2560\" height=\"1672\" alt=\"\" \/>\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-22.53.04@2x.png.jpg\" width=\"2560\" height=\"1672\" alt=\"\" \/>\n<\/div>\n<\/div>\n<p>Отлично, осталось только подключить полное шифрование в Cloudflare...<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-23.04.00@2x.png.jpg\" width=\"2560\" height=\"1657\" alt=\"\" \/>\n<\/div>\n<p>...и проверить, что всё прекрасно работает.<\/p>\n",
            "date_published": "2024-05-28T23:10:48+05:00",
            "date_modified": "2025-11-07T11:59:20+05:00",
            "tags": [
                "administration",
                "cloudflare",
                "networking"
            ],
            "image": "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-21.57.37@2x.png.jpg",
            "_date_published_rfc2822": "Tue, 28 May 2024 23:10:48 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "18",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-21.57.37@2x.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-22.44.07@2x.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-22.51.14@2x.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-22.53.04@2x.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-23.04.00@2x.png.jpg"
                ]
            }
        },
        {
            "id": "17",
            "url": "https:\/\/closed-ai.tech\/all\/obnovlenie-infrastruktury\/",
            "title": "Обновление инфраструктуры",
            "content_html": "<p>Сегодня хочу рассказать про то, как я подключил платформу <b>Cloudflare<\/b> для обеспечения безопасного доступа к сервисным приложениям, которыми я пользуюсь для управления этим сайтом.<\/p>\n<h3>Начало<\/h3>\n<p>Кратко про архитектуру: «под капотом» здесь VPS c Ubuntu 22.04, веб-сервер и база данных запускаются в Docker-контейнерах, для их удобного администрирования я использую <a href=\"https:\/\/docs.portainer.io\/v\/2.20\">Portainer<\/a>. Также здесь установлен <a href=\"https:\/\/nginxproxymanager.com\/\">Nginx Proxy Manager<\/a> (тоже в контейнере), который перенаправляет трафик с www на основной домен, обеспечивает подключение по HTTPS, проверяет подлинность домена, и т. д. В качестве удобного интерфейса для конфигурации сервера и доступа к терминалу я выбрал <a href=\"https:\/\/cockpit-project.org\/\">Cockpit<\/a>.<\/p>\n<p>Поскольку все эти инструменты — веб-приложения, доступные публично (мне хотелось иметь возможность подключаться с любого устройства), необходимо было по-максимуму <b>защитить их от несанкционированного доступа<\/b>. Да, у них у всех по-умолчанию есть формы авторизации, но проверка там однофакторная, по логину и паролю — они хоть и длинные, но все равно могут быть скомпрометированы путем фишинга или подбора. Также вполне возможно появление уязвимостей и эксплойтов для них, позволяющих, в теории, каким-то образом обойти защиту. В общем, хотелось бы что-то понадежнее, в идеале — вообще не давать случайному пользователю доступ к этим сервисам.<\/p>\n<h3>Подключаем Cloudflare<\/h3>\n<p><a href=\"https:\/\/developers.cloudflare.com\/cloudflare-one\/connections\/connect-networks\/\">Zero Trust Tunnel<\/a> позволяет связать субдомен и внутренний адрес на host-машине с установленным приложением-коннектором (его, кстати, тоже можно развернуть в контейнере). Не нужно открывать порты или отключать firewall, т. к. коннектор поднимает egress-соединение с облаком, и самое крутое — через панель управления Cloudflare можно также <b>задать правила доступа<\/b> к ресурсу и <b>подключить дополнительный фактор аутентификации<\/b>, например, отправку одноразового кода на почту или вход через Google-аккаунт.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/closed-ai.tech\/pictures\/network-diagram_hu35c98d3bbf0ecf738b5b543af7009e44_79161_2296x1101_resize_q75_box_3-fe1feb83.png.jpg\" width=\"2560\" height=\"1427\" alt=\"\" \/>\n<\/div>\n<p class=\"lead\">То есть, можно буквально в два клика открыть доступ по HTTPS к <tt>localhost:9090<\/tt> через <tt>private-service.my-site.com<\/tt> для тех, кто введет правильный email из whitelist’а и укажет верный код, отправленный в письме.<\/p>\n<p>Красота! ❤️<\/p>\n<p>Вот, как это выглядит в панели управления Cloudflare: на каждый «приватный» сервис я создал отдельный туннель. Обратите внимание на адреса — контейнер с коннектором <tt>cloudflared<\/tt> я добавил в bridge-сеть в Docker, которую создал вручную. Благодаря этому, во-первых, работает DNS, и можно обращаться к контейнерам по имени, а также легко можно получить доступ к host, указав Default Gateway.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-01.52.08@2x.png.jpg\" width=\"2560\" height=\"1722\" alt=\"\" \/>\n<\/div>\n<p>Добавим policy с группой доступа по-умолчанию — у меня это «разрешить любому пользователю с email из списка получать одноразовый код на почту». Настраивать можно как угодно: работает фильтрация по странам, по IP-адресам, можно проверять токены и т. д.<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"2560\" data-ratio=\"1.3897937024973\">\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-15.51.20@2x.png.jpg\" width=\"2560\" height=\"1842\" alt=\"\" \/>\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-15.51.49@2x.png.jpg\" width=\"2560\" height=\"1842\" alt=\"\" \/>\n<\/div>\n<\/div>\n<p>Теперь при попытке обратиться к туннелю по public hostname, откроется форма авторизации. Выглядит она вот так, и её, кстати, можно настроить — добавить свой логотип, поменять цвет фона, написать какой-нибудь текст, добавить подсказки для входа.<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"2560\" data-ratio=\"1.4997070884593\">\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-03.57.53@2x.png.jpg\" width=\"2560\" height=\"1707\" alt=\"\" \/>\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-04.38.08@2x.png.jpg\" width=\"2560\" height=\"1722\" alt=\"\" \/>\n<\/div>\n<\/div>\n<p>На всякий случай повторюсь — если введенного адреса нет в whitelist, код просто не придет.<\/p>\n<p>А ещё можно создать «приложения» и добавить их на главный экран — он называется App Launcher. Естественно, он тоже доступен только для авторизованных пользователей.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-01.47.32@2x.png.jpg\" width=\"2560\" height=\"1722\" alt=\"\" \/>\n<\/div>\n<p>Отмечу, что работает это всё только с доменами, перенесенными в Cloudflare или изначально приобретенными у них. Мой был куплен в reg.ru, перенос занял минут 15, ничего сложного.<\/p>\n<h3>Сколько стоит?<\/h3>\n<p>Весь описанный выше функционал <b>абсолютно бесплатен<\/b>, как и кэширование, защита от DDOS, и куча разных дополнительных виртуальных сетевых функций, но нужно привязать карточку. Наверное, единственный минус, который я могу выделить — Cloudflare функционально довольно перегружен: много дашбордов, панелей, настроек; но, благо, есть хорошая документация.<\/p>\n<h3>P. S.<\/h3>\n<p>В Cloudflare можно автоматически добавить SSL-сертификат и настроить редиректы с HTTP на HTTPS — об этом читайте <a href=\"\/all\/cloudflare-https-i-ssl\/\">в следующей заметке<\/a>.<\/p>\n<p>Большое спасибо Михаилу Щербине за консультации.<\/p>\n",
            "date_published": "2024-05-28T04:58:32+05:00",
            "date_modified": "2024-07-02T00:27:54+05:00",
            "tags": [
                "administration",
                "cloudflare",
                "docker",
                "networking"
            ],
            "image": "https:\/\/closed-ai.tech\/pictures\/network-diagram_hu35c98d3bbf0ecf738b5b543af7009e44_79161_2296x1101_resize_q75_box_3-fe1feb83.png.jpg",
            "_date_published_rfc2822": "Tue, 28 May 2024 04:58:32 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "17",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/closed-ai.tech\/pictures\/network-diagram_hu35c98d3bbf0ecf738b5b543af7009e44_79161_2296x1101_resize_q75_box_3-fe1feb83.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-01.52.08@2x.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-15.51.20@2x.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-15.51.49@2x.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-03.57.53@2x.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-04.38.08@2x.png.jpg",
                    "https:\/\/closed-ai.tech\/pictures\/CleanShot-2024-05-28-at-01.47.32@2x.png.jpg"
                ]
            }
        }
    ],
    "_e2_version": 4134,
    "_e2_ua_string": "Aegea 11.3 (v4134)"
}