Forwarded from SnowOne-канал
Всем привет!
До конца года остается чуть меньше двух недель, а мы к вам уже с подарками 🎁
Во-первых, мы опубликовали новых прекрасных спикеров на сайт. Во-вторых, теперь это не просто имена, а темы и тезисы докладов!
Давайте посмотрим, что уже есть в программе SnowOne 2026:
1) Секция "Enterprise":
‒ Сергей Петрелевич расскажет о NIO, как одним потоком обработать множество сетевых запросов;
‒ Антон Курако приведет глубокий анализ производительности аспектов в Spring;
‒ Александр Токарев представит продолжение своего доклада про дебаггинг в Java, где покажет, как отлаживать многопоточный, автогенеренный и нативный код;
2) Секция Хардкор:
‒ Александр Ланцов будет сравнивать алгоритмы GC (включая новейшие) в Java и Go, чтобы разобраться, чем они отличаются и какой лучше подходит для ваших сценариев;
‒ Иван Углянский расскажет о мега-проекте Valhalla и добавлении value классов в Java: зачем это вообще нужно, как повлияет на Java, и как развитие языка помогло реализации рантайма;
3) Секция "Расширение кругозора":
‒ Пётр Портнов покажет, как Java разработчикам пользоваться инструментом Error Prone, чтобы заранее ловить их баги статическим анализом;
‒ Сергей Луговой поделится опытом создания нового языка с JetBrains MPS;
‒ Михаил Пилип расскажет о построении SCADA-системы своими руками, и как ему в этом помог Kotlin.
—
Мы продолжаем работать над программой и конференцией в целом. И уже с нетерпением ждем конца февраля, чтобы встретиться на ней с вами ☺️
Ну и напомним, что сейчас идеальный момент, чтобы купить билет. Так вы успеете до следующего подорожания (с января), а заодно сразу запланируете приятное дело на следующий год.
Всех с наступающим! 🎄
До конца года остается чуть меньше двух недель, а мы к вам уже с подарками 🎁
Во-первых, мы опубликовали новых прекрасных спикеров на сайт. Во-вторых, теперь это не просто имена, а темы и тезисы докладов!
Давайте посмотрим, что уже есть в программе SnowOne 2026:
1) Секция "Enterprise":
‒ Сергей Петрелевич расскажет о NIO, как одним потоком обработать множество сетевых запросов;
‒ Антон Курако приведет глубокий анализ производительности аспектов в Spring;
‒ Александр Токарев представит продолжение своего доклада про дебаггинг в Java, где покажет, как отлаживать многопоточный, автогенеренный и нативный код;
2) Секция Хардкор:
‒ Александр Ланцов будет сравнивать алгоритмы GC (включая новейшие) в Java и Go, чтобы разобраться, чем они отличаются и какой лучше подходит для ваших сценариев;
‒ Иван Углянский расскажет о мега-проекте Valhalla и добавлении value классов в Java: зачем это вообще нужно, как повлияет на Java, и как развитие языка помогло реализации рантайма;
3) Секция "Расширение кругозора":
‒ Пётр Портнов покажет, как Java разработчикам пользоваться инструментом Error Prone, чтобы заранее ловить их баги статическим анализом;
‒ Сергей Луговой поделится опытом создания нового языка с JetBrains MPS;
‒ Михаил Пилип расскажет о построении SCADA-системы своими руками, и как ему в этом помог Kotlin.
—
Мы продолжаем работать над программой и конференцией в целом. И уже с нетерпением ждем конца февраля, чтобы встретиться на ней с вами ☺️
Ну и напомним, что сейчас идеальный момент, чтобы купить билет. Так вы успеете до следующего подорожания (с января), а заодно сразу запланируете приятное дело на следующий год.
Всех с наступающим! 🎄
🔥5
Как вы, надеюсь, поняли по предыдущему сообщению, мы в программном комитете #SnowOne уже вовсю активно работаем над конференцией, чтобы она была интересной и полезной. В этой связи возник вопрос:
Хотите ли вы видеть в программе доклады про AI на Java?
Хотите ли вы видеть в программе доклады про AI на Java?
Anonymous Poll
33%
Нет, этот AI и так уже из каждого утюга
52%
Да, парочка докладов не помешает
14%
Конечно, и чем больше, тем лучше!
1%
(свой вариант в комментариях)
👌1
(спасибо всем проголосовавшим выше🤝)
И ещё разок про AI, но не в Java 🐍
На одном из сопутствующих проектов довелось поработать с облачным хостингом Render.com, куда мы деплоим приложение, почти целиком разрабатываемое в Cursor IDE (навайбокодили, да). Заметив на главной странице хостинга баннер про появившийся у них MCP-сервер, я из любопытства на него тыкнул, хотя даже не понимал, зачем облачной платформе нужна такая приблуда 🛠
Оказалось (ожидаемо), что она позволяет мониторить и управлять деплоем через команды на человеческом языке прямо из среды общения с ИИ, т.е. в нашем случае из Cursor. Это позволило, кроме прочего, в буквально смысле писать такой промпт:
, и он (агент) это делает — см. скриншот. Чудесато! 💫
Правда, есть и обратная сторона — косячить в коде агент от этого меньше не стал. Но если раньше ручное копирование логов в промпт как-то заставляло также вручную проверять все правки локально, то теперь возможность показать агенту проблему прямо на проде очень сильно подмывает и проверить её фикс там же — ведь нужно только закоммитить, дальше всё само. А поскольку фиксы нередко кривые, то и прод стал частенько оказываться "отрицательно доступен" (© наш DevOps). Благо, что проект пока игрушечный, и никого это не аффектит🫠
Вкупе с тем, что и сообщения для коммитов теперь генерит агент, участие человека кажется всё менее значимым — написать промпт, прожать OK на ревью, клацнуть Commit & Push. Всё это мог быть делать ИИ. Но пока он так отчаянно косячит и генерит порой правдоподобную чушь, за роль кожаного мешка перед экраном можно не беспокоиться ☺️
И ещё разок про AI, но не в Java 🐍
На одном из сопутствующих проектов довелось поработать с облачным хостингом Render.com, куда мы деплоим приложение, почти целиком разрабатываемое в Cursor IDE (навайбокодили, да). Заметив на главной странице хостинга баннер про появившийся у них MCP-сервер, я из любопытства на него тыкнул, хотя даже не понимал, зачем облачной платформе нужна такая приблуда 🛠
Оказалось (ожидаемо), что она позволяет мониторить и управлять деплоем через команды на человеческом языке прямо из среды общения с ИИ, т.е. в нашем случае из Cursor. Это позволило, кроме прочего, в буквально смысле писать такой промпт:
Там на проде че-то упало. Сходи посмотри логи да пофикси
, и он (агент) это делает — см. скриншот. Чудесато! 💫
Правда, есть и обратная сторона — косячить в коде агент от этого меньше не стал. Но если раньше ручное копирование логов в промпт как-то заставляло также вручную проверять все правки локально, то теперь возможность показать агенту проблему прямо на проде очень сильно подмывает и проверить её фикс там же — ведь нужно только закоммитить, дальше всё само. А поскольку фиксы нередко кривые, то и прод стал частенько оказываться "отрицательно доступен" (© наш DevOps). Благо, что проект пока игрушечный, и никого это не аффектит🫠
Вкупе с тем, что и сообщения для коммитов теперь генерит агент, участие человека кажется всё менее значимым — написать промпт, прожать OK на ревью, клацнуть Commit & Push. Всё это мог быть делать ИИ. Но пока он так отчаянно косячит и генерит порой правдоподобную чушь, за роль кожаного мешка перед экраном можно не беспокоиться ☺️
👍6🕊1🙈1
Media is too big
VIEW IN TELEGRAM
Я тут периодически упоминаю, что тружусь над отечественной интеграционной low-code платформой #AggreGate, но мало кто понимает, что это за штука и какие задачи она решает 🏺
А на днях коллега-тимлид развлекался с новым ИИ-сервисом от Google под названием NotebookLM и скормил ему документацию на нашу платформу, чтобы посмотреть, что тот сможет по ней выдать. Помимо стандартного "chat with your docs", сервис предложил сгенерировать ознакомительный видеоролик-презентацию о продукте. Коллега согласился, и вот что из этого вышло ☝️
Признаться, я был приятно удивлён: утверждения корректные, примеры наглядные, изложение стройное. Конечно, есть косяки в оформлении и произношении, но учитывая, что это сделано за считанные минуты и не человеком, получилось вполне достойно 🆗
В общем, кому интересно, на чем сегодня строится цифровизация промышленности в России (да и не только, на самом деле), уделите 7 минут этому видео. А если вдруг захочется узнать больше, можно продолжить здесь: https://aggregate.digital/ru/ (видосик там тоже есть, но уже рукотворный 🎬 )
А на днях коллега-тимлид развлекался с новым ИИ-сервисом от Google под названием NotebookLM и скормил ему документацию на нашу платформу, чтобы посмотреть, что тот сможет по ней выдать. Помимо стандартного "chat with your docs", сервис предложил сгенерировать ознакомительный видеоролик-презентацию о продукте. Коллега согласился, и вот что из этого вышло ☝️
Признаться, я был приятно удивлён: утверждения корректные, примеры наглядные, изложение стройное. Конечно, есть косяки в оформлении и произношении, но учитывая, что это сделано за считанные минуты и не человеком, получилось вполне достойно 🆗
В общем, кому интересно, на чем сегодня строится цифровизация промышленности в России (да и не только, на самом деле), уделите 7 минут этому видео. А если вдруг захочется узнать больше, можно продолжить здесь: https://aggregate.digital/ru/ (видосик там тоже есть, но уже рукотворный 🎬 )
🔥4👍2❤1
В последние несколько лет крайняя тренировка года в бассейне проходит для нашего любительского спортивного клуба в виде какого-нибудь упахательного заплыва, например, 50 раз по 100 м вольным стилем в режиме 2 минуты на каждый отрезок, или 5 раз по 1000 м кролем в разной экипировке — словом, освобождаем место под оливье как можем 🥣
Но в этот раз, заговорив о планах на конец года, мы вдруг вспомнили, что почему-то давно не играли в водное поло, и сошлись на том, что было бы здорово завершить плавательный год, устроив это дружескоерубилово развлечение 🤽♂️
На удивление, нас собралось полноценные 2 команды: по 6 игроков в поле и 1 вратарь. Таймы решили сделать по 5 минут. В начале это казалось как-то несерьёзно (мало), но уже в конце первого тайма в наших покрасневших от воды глазах отчётливо читалось: "Батюшки, неужели это только начало!?" Да, даже для опытных вотерполистов (а среди нас были и такие) с непривычки этомесилово мероприятие оказалось весьма трудозатратным 🫠
Не знаю, как остальные, а я где-то к середине игры всё же как-то вработался и несмотря на усердноетопилово воздействие со стороны защитников противника таки сумел забить один гол. Правда, ещё две голевых передачи продолбал. Тем не менее, наша команда выиграла со счётом 3:1 🏐
После игры мы всей гурьбой (вместе с болельщиками, коих было чуть ли не столько же, как игроков) плотно заполнили собою небольшую каморку в здании бассейна, полопали мандаринов, поделились впечатлениями и поздравили с Новым Годом тренера, который играл вместе с нами — без него всё это бы не состоялось 🍊
Едва ли такоемочилово занятие можно рекомендовать всем подряд в качестве популярного вида спорта, но если вдруг обычное плавание вам кажется скучным, однообразным и/или недостаточно динамичным, обратите внимание на водное поло. Наверняка вам очень (не) захочется в этом поучаствовать🤪
#спорт
Но в этот раз, заговорив о планах на конец года, мы вдруг вспомнили, что почему-то давно не играли в водное поло, и сошлись на том, что было бы здорово завершить плавательный год, устроив это дружеское
На удивление, нас собралось полноценные 2 команды: по 6 игроков в поле и 1 вратарь. Таймы решили сделать по 5 минут. В начале это казалось как-то несерьёзно (мало), но уже в конце первого тайма в наших покрасневших от воды глазах отчётливо читалось: "Батюшки, неужели это только начало!?" Да, даже для опытных вотерполистов (а среди нас были и такие) с непривычки это
Не знаю, как остальные, а я где-то к середине игры всё же как-то вработался и несмотря на усердное
После игры мы всей гурьбой (вместе с болельщиками, коих было чуть ли не столько же, как игроков) плотно заполнили собою небольшую каморку в здании бассейна, полопали мандаринов, поделились впечатлениями и поздравили с Новым Годом тренера, который играл вместе с нами — без него всё это бы не состоялось 🍊
Едва ли такое
#спорт
🔥18👍1🙈1
Вот теперь с Наступившим! 🎉 🎄 🎁
Последние дни и часы минувшего года у меня прошли отнюдь не налегке — нужно было подготовить и провести две большие презентации по итогам года: 30 декабря для коллег и 31-го для родсвтенников (это такая семейная традиция; я рассказывал о ней год назад). А поскольку хотелось порадовать и тех, и других, пришлось хорошенько потрудиться, поэтому к праздничной полуночи мне хотелось уже не тусить и поздравляться, а упасть лицом в мягкий салат и булькать там до конца каникул 🥘
К счастью, это занятие надоело раньше, и вот я снова на связи. Надеюсь, и вы отметили хорошо! 🙏🏻
Чтобы всё же принести хоть какую-то пользу этой заметкой, поделюсь с вами инструментом, который здорово выручил меня при подготовке семейной презентации. Поскольку почти все мои родственники живут в разных местах, мне давно хотелось как-то визуализировать их места пребывания на карте. Я уже совершал несколько подступов к этому снаряду в прошлые годы (в основном, через сервсиы Google), но успехом они ни разу ни разу не увенчались: получалось то сложно, то стрёмно, то 2-в-1 🪣
На сей раз с помощью DeepSeek я набрёл на бесплатный сервис MapChart, который как раз позволяет рисовать географические карты, кастомизированные под многие специфичные нужды. Основной порядок работы с ним довольно прост:
1. Выбираете базовую карту, например, весь мир, Европу, отдельную страну или несколько.
2. Разукрашиваете мышкой интересные вам регионы: целые страны, штаты/субъекты или их комбинации.
3. Экспортируете в картинку и используете на своё усмотрение 🗺
Конечно, это далеко не всё, что может потребоваться (например, если нужно показать на карте отдельно выбранные города), но для простых сценариев вполне достаточно. Например, мне нужно было отобразить две страны и подсветить в них определенные регионы. Результат в виде готового слайда прилагаю (подписи наносил отдельно, чтобы анимировать их) 👇
Из любопытного: среди базовых сервис предлагает карты фантастических, в том числе игровых миров и возможность строить свои карты альтернативных сценариев истории: https://www.mapchart.net/wargames.html
Только если залипнете, чур не жаловаться, что это я показал🤭
Последние дни и часы минувшего года у меня прошли отнюдь не налегке — нужно было подготовить и провести две большие презентации по итогам года: 30 декабря для коллег и 31-го для родсвтенников (это такая семейная традиция; я рассказывал о ней год назад). А поскольку хотелось порадовать и тех, и других, пришлось хорошенько потрудиться, поэтому к праздничной полуночи мне хотелось уже не тусить и поздравляться, а упасть лицом в мягкий салат и булькать там до конца каникул 🥘
К счастью, это занятие надоело раньше, и вот я снова на связи. Надеюсь, и вы отметили хорошо! 🙏🏻
Чтобы всё же принести хоть какую-то пользу этой заметкой, поделюсь с вами инструментом, который здорово выручил меня при подготовке семейной презентации. Поскольку почти все мои родственники живут в разных местах, мне давно хотелось как-то визуализировать их места пребывания на карте. Я уже совершал несколько подступов к этому снаряду в прошлые годы (в основном, через сервсиы Google), но успехом они ни разу ни разу не увенчались: получалось то сложно, то стрёмно, то 2-в-1 🪣
На сей раз с помощью DeepSeek я набрёл на бесплатный сервис MapChart, который как раз позволяет рисовать географические карты, кастомизированные под многие специфичные нужды. Основной порядок работы с ним довольно прост:
1. Выбираете базовую карту, например, весь мир, Европу, отдельную страну или несколько.
2. Разукрашиваете мышкой интересные вам регионы: целые страны, штаты/субъекты или их комбинации.
3. Экспортируете в картинку и используете на своё усмотрение 🗺
Конечно, это далеко не всё, что может потребоваться (например, если нужно показать на карте отдельно выбранные города), но для простых сценариев вполне достаточно. Например, мне нужно было отобразить две страны и подсветить в них определенные регионы. Результат в виде готового слайда прилагаю (подписи наносил отдельно, чтобы анимировать их) 👇
Из любопытного: среди базовых сервис предлагает карты фантастических, в том числе игровых миров и возможность строить свои карты альтернативных сценариев истории: https://www.mapchart.net/wargames.html
Только если залипнете, чур не жаловаться, что это я показал🤭
🔥6❤3
Завершаю тему итогов года статистикой #спорт 📊
Физкультуры в минувшем году почему-то оказалось больше, чем в предыдущих, хотя планов таких не строил и обещаний никому не давал, даже себе. Вот как это выражается в цифрах (в скобках изменение к 2024 году):👇
● 2154 (+587) км преодолено бегом, на лыжах и вплавь 📏
Строго говоря, это бесполезная цифра, так как складывать километры на лыжах с км вплавь — это как сравнивать теплое с мягким, но подобная цифра есть во многих публичных отчётах, поэтому я включил её и сюда.
● 281 (+53) ч проведено на тренировках ⏱️
Это уже куда более адекватная метрика, отражающая мою "тренировочную способность", но её надо воспринимать с щепоткой соли (см. ниже*).
● 17 (+4) соревнований, в которых принял участие 🏆
Парочка из них были сдвоенными (типа в субботу один старт, в воскресенье другой), но я считаю их по отдельности, потому что у них разные дистанции, протоколы, медали, а у некоторых и дисциплины, например, акватлон+плавание.
* Примечание к длительности тренировок. Простота интерфейса спортивных часов позволяет мне относительно точно фиксировать периоды отдыха на тренировках, благодаря чему теперь можно ответить на вопрос (голосом жены с руками на боках): "А сколько из этого времени ты реально двигался?" Оказывается, коэффициент булкования (©) в этом году составил аж 11,23%, то есть из 281 часов тренировок аж 32 часа я провёл без движения, болтая на бортике в бассейне, фотая красоты на пробежках и заправляясь чаем из поясного бака на лыжах. 1,5 суток в год на такие дела, представляете? Вот так старость и подступается 👨🦳
Из наиболее ярких спортивных достижений года отмечаю:
● лыжный марафон (50 км) в Томске в марте — мой третий марафон наряду с беговым и плавательным 3️⃣
● большой SwimRun (33 км) под Питером в июне — лютая гонка среди чудесных лесов и озёр 🏞
● беговой полумарафон (21,1 км) в Новосибирске в сентябре — ещё раз обновил личный рекорд до 1:25:11 👟
Год выдался славным на физкультурные дела, здесь есть чем гордиться, но я отношусь к этому больше как к приятному стечению обстоятельств, нежели как к личному достижению. И поэтому же не зарекаюсь и даже не обещаю эти результаты превзойти. Куда важнее сохранить постоянство, пусть даже ценой сокращения объёмов и/или результатов. Ну а пока просто продолжаем тренироваться ✊
Прилагаю несколько слайдов по этой теме со своей недавней презентации ☝️
А как прошёл 2025 спортивный год у вас? Давайте делиться результатами 🙂
Физкультуры в минувшем году почему-то оказалось больше, чем в предыдущих, хотя планов таких не строил и обещаний никому не давал, даже себе. Вот как это выражается в цифрах (в скобках изменение к 2024 году):👇
● 2154 (+587) км преодолено бегом, на лыжах и вплавь 📏
Строго говоря, это бесполезная цифра, так как складывать километры на лыжах с км вплавь — это как сравнивать теплое с мягким, но подобная цифра есть во многих публичных отчётах, поэтому я включил её и сюда.
● 281 (+53) ч проведено на тренировках ⏱️
Это уже куда более адекватная метрика, отражающая мою "тренировочную способность", но её надо воспринимать с щепоткой соли (см. ниже*).
● 17 (+4) соревнований, в которых принял участие 🏆
Парочка из них были сдвоенными (типа в субботу один старт, в воскресенье другой), но я считаю их по отдельности, потому что у них разные дистанции, протоколы, медали, а у некоторых и дисциплины, например, акватлон+плавание.
* Примечание к длительности тренировок. Простота интерфейса спортивных часов позволяет мне относительно точно фиксировать периоды отдыха на тренировках, благодаря чему теперь можно ответить на вопрос (голосом жены с руками на боках): "А сколько из этого времени ты реально двигался?" Оказывается, коэффициент булкования (©) в этом году составил аж 11,23%, то есть из 281 часов тренировок аж 32 часа я провёл без движения, болтая на бортике в бассейне, фотая красоты на пробежках и заправляясь чаем из поясного бака на лыжах. 1,5 суток в год на такие дела, представляете? Вот так старость и подступается 👨🦳
Из наиболее ярких спортивных достижений года отмечаю:
● лыжный марафон (50 км) в Томске в марте — мой третий марафон наряду с беговым и плавательным 3️⃣
● большой SwimRun (33 км) под Питером в июне — лютая гонка среди чудесных лесов и озёр 🏞
● беговой полумарафон (21,1 км) в Новосибирске в сентябре — ещё раз обновил личный рекорд до 1:25:11 👟
Год выдался славным на физкультурные дела, здесь есть чем гордиться, но я отношусь к этому больше как к приятному стечению обстоятельств, нежели как к личному достижению. И поэтому же не зарекаюсь и даже не обещаю эти результаты превзойти. Куда важнее сохранить постоянство, пусть даже ценой сокращения объёмов и/или результатов. Ну а пока просто продолжаем тренироваться ✊
Прилагаю несколько слайдов по этой теме со своей недавней презентации ☝️
А как прошёл 2025 спортивный год у вас? Давайте делиться результатами 🙂
🏆8👍3❤1
Про Caddy ⚙️
Помимо безудержного переедания, вопиющего нарушения режима сна и прочих непотребств, эти каникулы я посвящаю одному семейному IT-проекту, до которого раньше никак не доходили руки. Расскажу о нём отдельно в другой раз, а пока — об одной его подзадачке 👇🏼
Возникла потребность принимать на публичном сервере HTTPS-траффик с клиентских устройств, терминировать на нём TLS и отправлять дальше в прикладной сервис. В общем, типичная работёнка для обратного прокси-сервера. Заодно хотелось бы избежать головняка и расходов на SSL-сертификаты (намекаю на Let's Encrypt) и обеспечить перенаправление http(80)->https(443). Значит, нужен какой-то веб-сервер. Благо, варианты есть 📚
1️⃣ Мой собственный опыт в этой сфере сводится только к настройке Apache HTTPD — я вдоволь "наигрался" с этим сначала в универе, потом на работе. Вариант рабочий, но в 2026-ом году, пожалуй, нет, спасибо; здоровье дороже 🤢
2️⃣ В интернетах >80% ответов на подобный запрос сводятся к совету брать Nginx+Certbot — эта связка настолько популярна, что под неё есть даже готовые решения (пример), правда, со своими особенностями применения. В какой-то момент я уже принял мысль, что пойду этим путём, но всё же почти страничный конфиг и 10+ шагов инструкции по его применению не давали покоя, и я решил покопать дальше ⛏️
3️⃣ Модно-молодёжный вариант решения — Traefik — входная точка для микросервисов, поддерживает применение Let's Ecnrypt серфтификатов из коробки и ещё кучу всего. Но вот эта куча меня как раз и смутила — показалось, что это целый комбайн с тонной фич, которые мне не нужны, но за которые придётся "платить" ресурсами машины, а у меня их кот наплакал. Возможно, это заблуждение, но всё же решил поискать ещё 🔍
4️⃣ И тут наткнулся на Caddy — полнофункционональный, но при этом (вроде как) легковесный веб-сервер на Go, главными фичами которого заявлены полная автоматизация настройки TLS и простота конфигурации. Оба пункта прозвучали для меня очень вкусно, и я решил попробовать 😋
После недолгих изысканий я понял, что весь мой конфиг будет состоять из всего 3 строчек в специальном декларативном Caddyfile:
При первом запуске Caddy увидел, что Let's Encrypt сертификата ещё нет, и автоматически провернул всю процедуру по его получению, а она, кто не в курсе, отнюдь не тривиальна:
* нужно инициировать запрос на выпуск
* пройти т.н. challenge (проверку владения доменом, она бывает 3 типов)
* получить и применить сам сертификат (+ключ)
* настроить перенаправление траффика 80->443.
Так вот Caddy всё это сделал сам с первого раза, чем уже меня порадовал 🪄
Но оставалось опасение, что он будет прожорлив по ресурсам. В качестве бенчмарка (и основного применения) я стал заливать через Caddy на сервер бинарные данные по 100 МБит/с каналу на протяжении нескольких часов с регулярным наблюдением за состоянием витуальной машины. Перед этим я проводил аналогичную процедуру через SSH-туннель — хуже точно не стало, а кое в чем (по мелочи) даже лучше. Это, конечно, не полноценный нагрузочный тест, но для моих целей он пройден ✅
Возможно, мне просто повезло с тем, что Caddy пришёлся кстати именно в моём случае, но 69К звёзд на его GitHub позволяют думать, что он всё же реально неплох, поэтому в следующий раз, когда потребуется поднять реверс-прокси, сбалансировать нагрузку или просто удобно раздать статику, я намерен применить его снова. Предлагаю взять его на заметку и вам 📝
#инструменты
Помимо безудержного переедания, вопиющего нарушения режима сна и прочих непотребств, эти каникулы я посвящаю одному семейному IT-проекту, до которого раньше никак не доходили руки. Расскажу о нём отдельно в другой раз, а пока — об одной его подзадачке 👇🏼
Возникла потребность принимать на публичном сервере HTTPS-траффик с клиентских устройств, терминировать на нём TLS и отправлять дальше в прикладной сервис. В общем, типичная работёнка для обратного прокси-сервера. Заодно хотелось бы избежать головняка и расходов на SSL-сертификаты (намекаю на Let's Encrypt) и обеспечить перенаправление http(80)->https(443). Значит, нужен какой-то веб-сервер. Благо, варианты есть 📚
1️⃣ Мой собственный опыт в этой сфере сводится только к настройке Apache HTTPD — я вдоволь "наигрался" с этим сначала в универе, потом на работе. Вариант рабочий, но в 2026-ом году, пожалуй, нет, спасибо; здоровье дороже 🤢
2️⃣ В интернетах >80% ответов на подобный запрос сводятся к совету брать Nginx+Certbot — эта связка настолько популярна, что под неё есть даже готовые решения (пример), правда, со своими особенностями применения. В какой-то момент я уже принял мысль, что пойду этим путём, но всё же почти страничный конфиг и 10+ шагов инструкции по его применению не давали покоя, и я решил покопать дальше ⛏️
3️⃣ Модно-молодёжный вариант решения — Traefik — входная точка для микросервисов, поддерживает применение Let's Ecnrypt серфтификатов из коробки и ещё кучу всего. Но вот эта куча меня как раз и смутила — показалось, что это целый комбайн с тонной фич, которые мне не нужны, но за которые придётся "платить" ресурсами машины, а у меня их кот наплакал. Возможно, это заблуждение, но всё же решил поискать ещё 🔍
4️⃣ И тут наткнулся на Caddy — полнофункционональный, но при этом (вроде как) легковесный веб-сервер на Go, главными фичами которого заявлены полная автоматизация настройки TLS и простота конфигурации. Оба пункта прозвучали для меня очень вкусно, и я решил попробовать 😋
После недолгих изысканий я понял, что весь мой конфиг будет состоять из всего 3 строчек в специальном декларативном Caddyfile:
<мой_домен> {
reverse_proxy http://<адрес_моего_сервиса>
}При первом запуске Caddy увидел, что Let's Encrypt сертификата ещё нет, и автоматически провернул всю процедуру по его получению, а она, кто не в курсе, отнюдь не тривиальна:
* нужно инициировать запрос на выпуск
* пройти т.н. challenge (проверку владения доменом, она бывает 3 типов)
* получить и применить сам сертификат (+ключ)
* настроить перенаправление траффика 80->443.
Так вот Caddy всё это сделал сам с первого раза, чем уже меня порадовал 🪄
Но оставалось опасение, что он будет прожорлив по ресурсам. В качестве бенчмарка (и основного применения) я стал заливать через Caddy на сервер бинарные данные по 100 МБит/с каналу на протяжении нескольких часов с регулярным наблюдением за состоянием витуальной машины. Перед этим я проводил аналогичную процедуру через SSH-туннель — хуже точно не стало, а кое в чем (по мелочи) даже лучше. Это, конечно, не полноценный нагрузочный тест, но для моих целей он пройден ✅
Возможно, мне просто повезло с тем, что Caddy пришёлся кстати именно в моём случае, но 69К звёзд на его GitHub позволяют думать, что он всё же реально неплох, поэтому в следующий раз, когда потребуется поднять реверс-прокси, сбалансировать нагрузку или просто удобно раздать статику, я намерен применить его снова. Предлагаю взять его на заметку и вам 📝
#инструменты
Caddy Web Server
Caddy - The Ultimate Server with Automatic HTTPS
Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go
👍17🔥7
Верхняя полка📝
Расскажу о нём отдельно в другой раз
Вероятно, картина покажется вам знакомой, если я скажу, что мой семейный фотоархив представляет собой хаотичное месиво фоток и видео, разбросанных по телефону, облаку (куда они льются сами) и домашним дискам/флешкам. И вряд ли стоит пояснять, что в таком виде эти (в общем-то весьма дорогие мне) воспоминания легко потерять, неудобно пересматривать и весьма трудоёмко искать 🙁
Конечно, я давно осознавал, что надо навести здесь порядок. И ещё долго бы продолжал просто осознавать, если бы накануне Нового Года случайное невысокое падение внешнего HDD с огромной кучей фоток не превратило его в тыкву и не обошлось в несколько десятков килорублей на восстановление. И вот тогда "надо" внезапно превратилось в "пора"... ⏰
Под "навести порядок" я принял для себя следующее:
1. Организовать надёжное хранение в едином месте, но с резервированием локально и в облаке
2. Обеспечить автоматическое добавление снимков и видео с телефонов с попутной фильтрацией дубликатов и каталогизацией
3. Предоставить быстрый поиск по людям, датам, местам и объектам с любого авторизованного устройства (для родственников) 🎯
Раньше почти все эти цели достигались использованием Google Photos, но в новых реалиях от него пришлось отказаться, а достойных альтернатив на российском рынке я не нашёл (хотя и попробовал платный Яндекс.Диск). К тому же захотелось получить больше контроля и возможностей, поэтому я решил попробовать self-hosted решение и выбрал Immich — opensource'ный аналог Google Photos, который мне когда-то порекомендовал Артём @artipop Шабуров. Этот сервис превосходит конкурентов не только по числу звёзд на GitHub, но и по зрелости фич, а это для меня очень важно 🔝
Я развернул его c помощью Docker Compose на российском VPS с 2 ядрами CPU, 4 ГБ памяти и 1,5 ТБ места на HDD. Такой сервер обошёлся в 1400 руб/мес на первые три месяца (новогодняя акция), потом будет порядка 1900 руб/мес (хостинг FirstVDS). В целом, основное взаимодействие с сервисом при такой его скромной мощи пока что полностью устраивает: лента скроллится, видосики грузятся, поиск ищёт и находит. Основной дискомфорт вызывает только извлечение метаданных из загружаемых медиа файлов — для мощного поиска под капотом у Immich работает целая банда моделей машинного обучения, а оно на голом CPU работает, мягко говоря, не быстро — чуть ли не бОльшую часть каникул VPS лопатил круглые сутки на полную мощность, чтобы отсмотреть все мои фото/видео и правильно их проиндексировать (векторизовать картинки, извлечь тексты, распознать людей и т.д.) Мне даже пришлось увеличить ему размер SWAP-файла, чтобы во время распознавания Python-процесс не прибивался OOM Killer'ом. Впрочем, такой объём данных требуется обработать лишь раз; дальше медиа файлы будут добавляться поштучно, и минутная задержка на их индексацию кажется вполне приемлемой 👌
Зато теперь у меня наконец-то появилось более-менее целостное, управляемое и удобное хранилище, в котором на сегодня:
• 42К фотографий (уже без дубликатов и почти без "мусора")
• 3,5К видеозаписей
• 20 лет воспоминаний (плюс несколько сотен оцифрованных бумажных снимков более старшего возраста) 📷
Следующими шагами будет настройка резервирования на домашнее сетевое хранилище (заказано, едет) и постепенное наведение смыслового порядка: разметка людей (имена, даты рождения), уточнение дат съёмки, удаление лишних снимков и т.п. Наверняка на этом пути ещё выяснятся какие-нибудь неприятные моменты, но пока впечатление об Immich как сервисе очень даже позитивное. Особо порадовали:
• удобное мобильное приложение (наряду с сайтом)
• мощное распознавание людей (в том числе в полоборота, в том числе детей, в том числе в очках/масках и в воде)
• клёвый контекстный поиск (запросы типа "закат на пляже", "пятнистый кот на руках у мальчика", "девушка на мотоцикле" исполняются на ура) 🪄
Намерен продолжать осваивать и рассказывать вам по мере появления новых любопытных наблюдений. А если у вас уже есть свой опыт в решении подобных задач, поделитесь — нам наверняка есть, чему поучиться друг у друга 🙂
Конечно, я давно осознавал, что надо навести здесь порядок. И ещё долго бы продолжал просто осознавать, если бы накануне Нового Года случайное невысокое падение внешнего HDD с огромной кучей фоток не превратило его в тыкву и не обошлось в несколько десятков килорублей на восстановление. И вот тогда "надо" внезапно превратилось в "пора"... ⏰
Под "навести порядок" я принял для себя следующее:
1. Организовать надёжное хранение в едином месте, но с резервированием локально и в облаке
2. Обеспечить автоматическое добавление снимков и видео с телефонов с попутной фильтрацией дубликатов и каталогизацией
3. Предоставить быстрый поиск по людям, датам, местам и объектам с любого авторизованного устройства (для родственников) 🎯
Раньше почти все эти цели достигались использованием Google Photos, но в новых реалиях от него пришлось отказаться, а достойных альтернатив на российском рынке я не нашёл (хотя и попробовал платный Яндекс.Диск). К тому же захотелось получить больше контроля и возможностей, поэтому я решил попробовать self-hosted решение и выбрал Immich — opensource'ный аналог Google Photos, который мне когда-то порекомендовал Артём @artipop Шабуров. Этот сервис превосходит конкурентов не только по числу звёзд на GitHub, но и по зрелости фич, а это для меня очень важно 🔝
Я развернул его c помощью Docker Compose на российском VPS с 2 ядрами CPU, 4 ГБ памяти и 1,5 ТБ места на HDD. Такой сервер обошёлся в 1400 руб/мес на первые три месяца (новогодняя акция), потом будет порядка 1900 руб/мес (хостинг FirstVDS). В целом, основное взаимодействие с сервисом при такой его скромной мощи пока что полностью устраивает: лента скроллится, видосики грузятся, поиск ищёт и находит. Основной дискомфорт вызывает только извлечение метаданных из загружаемых медиа файлов — для мощного поиска под капотом у Immich работает целая банда моделей машинного обучения, а оно на голом CPU работает, мягко говоря, не быстро — чуть ли не бОльшую часть каникул VPS лопатил круглые сутки на полную мощность, чтобы отсмотреть все мои фото/видео и правильно их проиндексировать (векторизовать картинки, извлечь тексты, распознать людей и т.д.) Мне даже пришлось увеличить ему размер SWAP-файла, чтобы во время распознавания Python-процесс не прибивался OOM Killer'ом. Впрочем, такой объём данных требуется обработать лишь раз; дальше медиа файлы будут добавляться поштучно, и минутная задержка на их индексацию кажется вполне приемлемой 👌
Зато теперь у меня наконец-то появилось более-менее целостное, управляемое и удобное хранилище, в котором на сегодня:
• 42К фотографий (уже без дубликатов и почти без "мусора")
• 3,5К видеозаписей
• 20 лет воспоминаний (плюс несколько сотен оцифрованных бумажных снимков более старшего возраста) 📷
Следующими шагами будет настройка резервирования на домашнее сетевое хранилище (заказано, едет) и постепенное наведение смыслового порядка: разметка людей (имена, даты рождения), уточнение дат съёмки, удаление лишних снимков и т.п. Наверняка на этом пути ещё выяснятся какие-нибудь неприятные моменты, но пока впечатление об Immich как сервисе очень даже позитивное. Особо порадовали:
• удобное мобильное приложение (наряду с сайтом)
• мощное распознавание людей (в том числе в полоборота, в том числе детей, в том числе в очках/масках и в воде)
• клёвый контекстный поиск (запросы типа "закат на пляже", "пятнистый кот на руках у мальчика", "девушка на мотоцикле" исполняются на ура) 🪄
Намерен продолжать осваивать и рассказывать вам по мере появления новых любопытных наблюдений. А если у вас уже есть свой опыт в решении подобных задач, поделитесь — нам наверняка есть, чему поучиться друг у друга 🙂
Immich
Self-hosted photo and video management solution. Easily back up, organize, and manage your photos on your own server. Immich helps you browse, search and organize your photos and videos with ease, without sacrificing your privacy.
👍13🔥3🤔1