Андрей Садулин

о разработке и не только

Искать по годам: 2024 | по тегам | смотреть избранное ⭐️ или сразу всё

29

Сегодня мне 29 лет. Захотелось поделиться тем, как прошел этот год, и немного подумать о том, как провести следующий.

Итак, за прошедшие 366 дней я:

  1. Много работал, стал руководителем небольшой группы разработчиков, линейным и нанимающим менеджером, увеличил свой доход.

Уволил сотрудника. Занимался наймом, проводил много интервью, придумывал тестовые задания для кандидатов. Получил пару интересных предложений трудоустройства в российские компании с ростом как в зарплате, так и в уровне ответственности, но сознательно отклонил их, отдав предпочтение развитию компетенций на своем текущем месте работы. К слову, в прошлом году я был сотрудником своей компании уже восьмой год подряд.

Летом курировал работу стажеров, придумал им классную задачу и довёл её до конца, получив отличные отзывы от коллег на защите проекта.

  1. Дважды съездил в отпуск с девушкой: во Вьетнам и в Азербайджан. Во Вьетнаме жил в шикарном отеле, в номере с балконом и видом на море, без толп отдыхающих, без детей, аниматоров и дискотек по ночам. Попробовал свежий дуриан (тот самый фрукт с противоречивым ароматом), посетил местный аква- и зоопарк, много гулял по Нячангу, ездил в тур по стране на бывшем военном УАЗике, купался под водопадом, ел свежеприготовленных на костре креветок, прошел путь монаха внутри каменного дракона.

В Азербайджане мы были на свадьбе друга, но успели и погулять по старому Баку, и посетить музей Гейдара Алиева, и прекрасно поужинать в ресторане Аркадия Новикова, и даже пожить один день в прекрасном отеле на берегу Каспийского моря, несколько раз с удовольствием там же искупавшись.

  1. Избавился от вредных привычек. Больше не пью пиво вечером (иногда разве что безалкогольное), почти не употребляю мучного и сладкого (хотя, если честно, с последним пока ещё есть проблемы: мне очень нравится местный зефир), не курю.
  2. Пережил 2 землетрясения магнитудой в 5-6 баллов каждое.
  3. Сделал себе вот этот блог, где могу делиться своим опытом, мыслями и интересными находками без каких-либо функциональных ограничений социальных сетей.
  4. Немного катался на сноуборде, но под конец горнолыжного сезона, к сожалению, бросил — очень хотелось приобрести свой собственный комплект экипировки, и в процессе езды у меня редко получалось уверенно менять кант с переднего на задний, что закономерно приводило к падениям.
  5. Совсем не катался на мотоцикле — в предыдущих выездах сильно уставал от низкой посадки на KTM 350 Freeride, а Yamaha 450 была для меня слишком тяжелой и неповоротливой. Недавно появилась возможность взять в аренду новенькие Husqvarna 350 — надеюсь, на них будет комфортнее.
  6. Много занимался в спортзале. Тренировки стали для меня отличным способом избавиться от стресса, обрести уверенность в себе, стать сильнее и выносливее. На сегодняшний день я вежу 112 кг при росте 203 см, мой присед со штангой — 120 кг, жим от груди лежа на горизонтальной скамье — 90 кг, становая тяга — 120 кг (всё на 1 повторение). Очень доволен результатами, однако, определённо ещё есть, к чему стремиться. В двух упражнениях рубеж в 100 кг был преодолён как раз в прошлом году.
  7. Так и не получил водительское удостоверение, не купил машину и мотоцикл.
  8. Не доделал своё мобильное приложение, не прошел курс по 3D-моделированию.
  9. Не прочитал подаренную мне книжку, не прошел видеоигры, которые хотел, постоянно откладывал просмотр интересных мне фильмов.
  10. Мне отказали в визе в Италию и, соответственно, я не поехал в командировку.
  11. Оформил наконец-то военный билет.
  12. Посетил несколько летних open-air музыкальных фестивалей, концерт любимой группы, дегустацию вина и ужин от шеф-повара со звездой Мишлен в ресторане в горах.

Вот. Надеюсь, через год список будет длиннее, а писать я его буду не с горьким сожалением об окончательно прошедшей молодости, а с приятным предвкушением того, что принесет мне новая страница моей истории. И писать желательно где-нибудь, где подают «Секс на пляже».

Ну что, за работу?

Непопулярное мнение

После того, как в России заблокировали замедлили YouTube, я присмотрелся к его альтернативам, и обнаружил с удивлением, что на RUTUBE есть множество классных фильмов с отличным качеством картинки и звука, в том числе и зарубежные новинки 2023 и -24-х годов: «Индиана Джонс и Колесо Судьбы», «Головоломка 2», «Трансформеры — Восхождение Звероботов» (вот он, кстати, отвратительный!), «Наполеон» и др. Мой папа любит сериалы по вселенной «Звездных Войн» — пожалуйста: «Мандалорец», «Книга Бобы Фетта» — всё доступно.

Работает всё, кстати, довольно неторопливо, но видео «не тормозит». И рекомендации, конечно, так себе.

А вот чего я там не нашел — так это фильмов и сериалов, каким-либо образом аффилированных с Кинопоиском (например, «Беспринципные», или новый «Майор Гром: Игра»): Яндекс за авторские права может и спросить, в отличие от зарубежных дистрибьюторов 😁

Если не принимать во внимание этический и юридический аспекты такого «пиратства» , то в сухом остатке для конечного пользователя мы имеем большой плюс в отсутствии необходимости смотреть тот же самый контент на сомнительных сайтах с рекламой букмекеров и казино (уверен, вы хотя бы раз на такой точно заходили и понимаете, о чем я) или искать его на торрент-трекерах. Естественно, о полноценной замене YouTube речи не идет, но, как говорится, нет худа без добра.

Cloudflare: HTTPS и SSL

Итак, у вас есть домен, который вы перенесли в Cloudflare. Сразу же после его добавления и настройки на платформе к нему автоматически выдаются два SSL-сертификата: основной и запасной, с разными Certificate Authority — Let’s Encrypt, Sectigo, Google Trust Services. Время жизни сертификатов — 3 месяца, после — автопродление. Удобно.

Вот, как это выглядит:

Обратите внимание, что это Edge Certificates. Поскольку платформа по-умолчанию проксирует трафик на сайт через себя, эти «пограничные» сертификаты используются только на участке «пользователь — Cloudflare». Там же можно включить настройку «Always use HTTPS», и ожидаемо получить автоматические редиректы — но только всё на том же участке! Трафик от Cloudflare до сервера будет передаваться без шифрования!

Обновив страницу блога, я получил несколько ошибок в консоли вида «Mixed content: request has been blocked» — падали асинхронные запросы, инициированные где-то в JavaScript. Также не работало сохранение записей и некоторые редиректы — видимо, всё по той же причине 😭

Опытным путем я понял, что надо бы шифровать весь трафик E2E, а для этого нам понадобится Origin Certificate — как раз-таки тот, который отвечает за оставшийся путь от Cloudflare до сервера (в моем случае до Nginx).

Да, его действительно можно получить на 15 (!) лет

Нажав на кнопку «Create», мы получим, по сути, две строки: сам сертификат и приватный ключ для него. Для добавления их в Nginx Proxy Manager, я сохранил их как файлы и импортировал так, как показано на втором снимке в галерее ниже:

Отлично, осталось только подключить полное шифрование в Cloudflare...

...и протестировать, что получилось.

Добро пожаловать на новый домен: eviterno.online!

Обновление инфраструктуры

Сегодня хочу рассказать про то, как я подключил платформу Cloudflare для обеспечения безопасного доступа к сервисным приложениям, которыми я пользуюсь для управления этим сайтом.

Начало

Кратко про архитектуру: «под капотом» здесь VPS c Ubuntu 22.04, веб-сервер и база данных запускаются в Docker-контейнерах, для их удобного администрирования я использую Portainer. Также здесь установлен Nginx Proxy Manager (тоже в контейнере), который перенаправляет трафик с www на основной домен, обеспечивает подключение по HTTPS, проверяет подлинность домена, и т. д. В качестве удобного интерфейса для конфигурации сервера и доступа к терминалу я выбрал Cockpit.

Поскольку все эти инструменты — веб-приложения, доступные публично (мне хотелось иметь возможность подключаться с любого устройства), необходимо было по-максимуму защитить их от несанкционированного доступа. Да, у них у всех по-умолчанию есть формы авторизации, но проверка там однофакторная, по логину и паролю — они хоть и длинные, но все равно могут быть скомпрометированы путем фишинга или подбора. Также вполне возможно появление уязвимостей и эксплойтов для них, позволяющих, в теории, каким-то образом обойти защиту. В общем, хотелось бы что-то понадежнее, в идеале — вообще не давать случайному пользователю доступ к этим сервисам.

Подключаем Cloudflare

Zero Trust Tunnel позволяет связать субдомен и внутренний адрес на host-машине с установленным приложением-коннектором (его, кстати, тоже можно развернуть в контейнере). Не нужно открывать порты или отключать firewall, т. к. коннектор поднимает egress-соединение с облаком, и самое крутое — через панель управления Cloudflare можно также задать правила доступа к ресурсу и подключить дополнительный фактор аутентификации, например, отправку одноразового кода на почту или вход через Google-аккаунт.

То есть, можно буквально в два клика открыть доступ по HTTPS к localhost:9090 через private-service.my-site.com для тех, кто введет правильный email из whitelist’а и укажет верный код, отправленный в письме.

Красота! ❤️

Вот, как это выглядит в панели управления Cloudflare: на каждый «приватный» сервис я создал отдельный туннель. Обратите внимание на адреса — контейнер с коннектором cloudflared я добавил в bridge-сеть в Docker, которую создал вручную. Благодаря этому, во-первых, работает DNS, и можно обращаться к контейнерам по имени, а также легко можно получить доступ к host, указав Default Gateway.

Добавим policy с группой доступа по-умолчанию — у меня это «разрешить любому пользователю с email из списка получать одноразовый код на почту». Настраивать можно как угодно: работает фильтрация по странам, по IP-адресам, можно проверять токены и т. д.

Теперь при попытке обратиться к туннелю по public hostname, откроется форма авторизации. Выглядит она вот так, и её, кстати, можно настроить — добавить свой логотип, поменять цвет фона, написать какой-нибудь текст, добавить подсказки для входа.

На всякий случай повторюсь — если введенного адреса нет в whitelist, код просто не придет.

А ещё можно создать «приложения» и добавить их на главный экран — он называется App Launcher. Естественно, он тоже доступен только для авторизованных пользователей.

Отмечу, что работает это всё только с доменами, перенесенными в Cloudflare или изначально приобретенными у них. Мой был куплен в reg.ru, перенос занял минут 15, ничего сложного.

Сколько стоит?

Весь описанный выше функционал абсолютно бесплатен, как и кэширование, защита от DDOS, и куча разных дополнительных виртуальных сетевых функций, но нужно привязать карточку. Наверное, единственный минус, который я могу выделить — Cloudflare функционально довольно перегружен: много дашбордов, панелей, настроек; но, благо, есть хорошая документация.

P. S.

В Cloudflare можно автоматически добавить SSL-сертификат и настроить редиректы с HTTP на HTTPS — об этом читайте в следующей заметке.

Большое спасибо Михаилу Щербине за консультации.

Все новое — это хорошо забытое старое

На прошлой неделе вышло переиздание игры Braid 2009 года: добавили новые уровни, улучшили музыкальное сопровождение, перерисовали визуальную часть, появился раздел с комментариями разработчиков. Кто пропустил — крайне рекомендую попробовать! Braid: Anniversary Edition доступна на всех цифровых площадках, включая Steam и Google Play (на 4PDA можно найти версию для Android без привязки к подписке Netflix).

Не поднимался тот, кто не падал

... и это я о wildcard-сертификате. Да, всё заработало.

Оказалось, что у reg.ru в личном кабинете нужно задать список IP-адресов (или сразу подсеть), с которых разрешается обращение к их API. Указав IP своей машины, я попробовал получить сертификат ещё раз — и запрос упал с Gateway Time-out.

Что ж, попробуем ещё раз — результат тот же.

ОК, у Nginx Proxy Manager есть параметр «Propagation seconds». Увеличив его в 2.5 раза, я снова словил таймаут, полез в логи посмотреть — и оказалось, что всё сработало!

Настройки nginx получились примерно следующие:

🔎 www.[domain]

301 ➡️ www.[domain] (wildcard-сертификат)

🔎 [domain]

принудительный переход на SSL ➡️ https + [domain] (отдельный сертификат под [domain])

Нет, в принципе, можно было бы обойтись и без wildcard-сертификата, просто это добавляет дополнительный шаг при создании очередного субдомена.

P. S. У cloud.ru потрясающая техподдержка. Если кому-то нужна бесплатная виртуальная машина на linux — наверное, это один из лучших вариантов на данный момент: тык

Про деньги

Что мне особенно нравится — всё это удовольствие (сервер, IP, домен, SSL-сертификат, artifactory для Docker-образов) стоит всего

147 рублей в месяц*
+ 119 рублей за домен на год

* и первые 2 месяца бесплатно

Ранее Ctrl + ↓