#Программирование #Go
Я, кажется, наконец-таки понял, почему часто разработчики выбирают написать свою реализацию вместо использования готовых библиотек.
Я сейчас разрабатываю Telegram-бота на Golang.
При старте разработки я выбрал библиотеку telebot, чтобы сэкономить себе время и силы.
Ну, там же есть уже готовые хендлеры для команд, для типов контента, есть готовая система middleware...
Проходит несколько дней, и я понимаю, что, скорее всего, либо перейду на другую библиотеку, которая даёт больше контроля, либо вообще откажусь от внешних зависимостей и использую старый добрый http в чистом виде.
Почему?
Всё просто: в Go есть фундаментальная концепция контекста. В каждую функцию, которая потенциально выполняется долго, совершает какие-то сетевые запросы, передаётся объект контекста в различных его вариациях: контекст с таймаутом, с ручной отменой, с дедлайном.
Причём каждый новый слой может навешивать на переданный контекст новые обёртки, ужесточая условия отмены (но не упрощая их).
Например, в начале работы программы мы создаём контекст с функцией ручной отмены и подвешиваем вызов этой самой отмены на SIGINT и SIGTERM.
Далее, выполняя сетевой запрос, мы на этот контекст навешиваем таймаут в 15 секунд.
Внутри функции сетевого запроса нам нужно обратиться к базе данных: мы навешиваем на контекст ещё один таймаут, уже на 5 секунд.
В итоге, локально для запросов отработают их локальные контексты, но при этом из самого начала программы мы можем "дёрнуть за верёвочку" и отменить абсолютно всё, с этими контекстами связанное.
Так вот, telebot абсолютно игнорирует концепцию контекстов, из-за чего приходится костылить какие-то параллельные мониторы, которые будут реагировать на контекст и вызывать синхронные функции остановки бота.
В общем, библиотека может и хорошая, но подходит только для того, чтобы быстренько нашлёпать несложного бота без грамотной конкурентной модели.
Я, кажется, наконец-таки понял, почему часто разработчики выбирают написать свою реализацию вместо использования готовых библиотек.
Я сейчас разрабатываю Telegram-бота на Golang.
При старте разработки я выбрал библиотеку telebot, чтобы сэкономить себе время и силы.
Ну, там же есть уже готовые хендлеры для команд, для типов контента, есть готовая система middleware...
Проходит несколько дней, и я понимаю, что, скорее всего, либо перейду на другую библиотеку, которая даёт больше контроля, либо вообще откажусь от внешних зависимостей и использую старый добрый http в чистом виде.
Почему?
Всё просто: в Go есть фундаментальная концепция контекста. В каждую функцию, которая потенциально выполняется долго, совершает какие-то сетевые запросы, передаётся объект контекста в различных его вариациях: контекст с таймаутом, с ручной отменой, с дедлайном.
Причём каждый новый слой может навешивать на переданный контекст новые обёртки, ужесточая условия отмены (но не упрощая их).
Например, в начале работы программы мы создаём контекст с функцией ручной отмены и подвешиваем вызов этой самой отмены на SIGINT и SIGTERM.
Далее, выполняя сетевой запрос, мы на этот контекст навешиваем таймаут в 15 секунд.
Внутри функции сетевого запроса нам нужно обратиться к базе данных: мы навешиваем на контекст ещё один таймаут, уже на 5 секунд.
В итоге, локально для запросов отработают их локальные контексты, но при этом из самого начала программы мы можем "дёрнуть за верёвочку" и отменить абсолютно всё, с этими контекстами связанное.
Так вот, telebot абсолютно игнорирует концепцию контекстов, из-за чего приходится костылить какие-то параллельные мониторы, которые будут реагировать на контекст и вызывать синхронные функции остановки бота.
В общем, библиотека может и хорошая, но подходит только для того, чтобы быстренько нашлёпать несложного бота без грамотной конкурентной модели.
🔥1
Новый Год совсем близко, а значит настало время подвести околоайтишные итоги уходящего периода обращения Земли вокруг Солнца.
В этом году все достижения у меня случились ближе к осени и зиме; остальную часть года ничем особым отметить не могу.
Я наконец-таки созрел для использования Ansible и уже радостно применяю его на практике.
Ещё я приобрёл очередной микроконтроллер, на этот раз M5stack Cardputer Adv, и снова погружаюсь в премудрости разработки для подобных устройств.
Также, я в принципе заинтересовался программированием на низком уровне и активно изучаю язык ассемблера для нескольких архитектур. Практической пользы это занятие может и не несёт, но уж точно позволяет понимать, как работают написанные мной программы на языках по типу C++, Go и Rust.
А ещё, готовясь к собеседованиям и разрабатывая парочку домашних проектов, я здорово прокачался в знаниях языка Go, его внутренних особенностей и нюансов поведения рантайма.
И вот это уже безумно полезно, так как, обладая такой информацией, можно вполне себе не напрягаясь оптимизировать свой код, часто даже не ухудшая его читаемость.
И кстати, я кажется стал совсем взрослым в программировании. Возможно даже постарел.
Дело в том, что недавно я скачал исходники самого языка Go и теперь долгими зимними вечерами их изучаю.
Тут должна была бы быть какая-то крутая цитата одного из создателей языка, но я решил потратить это место в памяти на стандартную библиотеку, а не на заучивание высказываний.
Поэтому просто скажу, что внутри самой стандартной библиотеки Go есть чему поучиться: много интересных решений, крутых практик и элегантных подходов, которые можно было бы назвать хаками, если бы они не были так красивы.
В общем, насколько непродуктивной в плане саморазвития была первая половина 2025 года, настолько же продвинула меня вперёд вторая.
Это яркий пример того, каким серьёзным мотиватором к саморазвитию может стать риск остаться без стабильного дохода. :D
Всех поздравляю с наступающим новым годом!
В этом году все достижения у меня случились ближе к осени и зиме; остальную часть года ничем особым отметить не могу.
Я наконец-таки созрел для использования Ansible и уже радостно применяю его на практике.
Ещё я приобрёл очередной микроконтроллер, на этот раз M5stack Cardputer Adv, и снова погружаюсь в премудрости разработки для подобных устройств.
Также, я в принципе заинтересовался программированием на низком уровне и активно изучаю язык ассемблера для нескольких архитектур. Практической пользы это занятие может и не несёт, но уж точно позволяет понимать, как работают написанные мной программы на языках по типу C++, Go и Rust.
А ещё, готовясь к собеседованиям и разрабатывая парочку домашних проектов, я здорово прокачался в знаниях языка Go, его внутренних особенностей и нюансов поведения рантайма.
И вот это уже безумно полезно, так как, обладая такой информацией, можно вполне себе не напрягаясь оптимизировать свой код, часто даже не ухудшая его читаемость.
И кстати, я кажется стал совсем взрослым в программировании. Возможно даже постарел.
Дело в том, что недавно я скачал исходники самого языка Go и теперь долгими зимними вечерами их изучаю.
Тут должна была бы быть какая-то крутая цитата одного из создателей языка, но я решил потратить это место в памяти на стандартную библиотеку, а не на заучивание высказываний.
Поэтому просто скажу, что внутри самой стандартной библиотеки Go есть чему поучиться: много интересных решений, крутых практик и элегантных подходов, которые можно было бы назвать хаками, если бы они не были так красивы.
В общем, насколько непродуктивной в плане саморазвития была первая половина 2025 года, настолько же продвинула меня вперёд вторая.
Это яркий пример того, каким серьёзным мотиватором к саморазвитию может стать риск остаться без стабильного дохода. :D
Всех поздравляю с наступающим новым годом!
👍1
#Администрирование #Windows #WSL
Сегодня выяснил, что у меня в системе жёсткий бардак с сетью: адаптер Bluetooth (просто потому, что его кто-то создал), штук 5 адаптеров от старых установок всяческих OpenVPN (для подключения к корпоративной сети), несколько зависших старых мостов от старых версий VMWare...
Из-за всего этого я не мог нормально завести режим Mirrored в wsl, чтобы трафик из wsl тоже шёл под vpn (для доступа к корпоративным ресурсам и для доступа к сервисам по типу Gemini и OpenAI).
Wsl просто отказывался запускаться в режиме Mirrored или VirtioProxy, сваливаясь в лучшем случае в NAT, в худшем - в None, оставляя виртуалку совсем без сети, даже локальной для общения с хостом.
Что именно мешало wsl жить, я не знаю. Выяснить конкретную проблему, конкретный затык не удалось.
Я до последнего убалтывал Gemini решить вопрос без радикальных шагов, ибо страшно было остаться совсем без интернета, но в итоге вот такой алгоритм действий помог.
1. Закрываем весь софт, который может сломаться от резкого исчезновения сети (vpn сервисы, браузер, TeamTalk и другие). В том числе останавливаем wsl командой
2. Полностью сбрасываем все сетевые адаптеры командой в Powershell от имени администратора
3. Тоже от имени администратора, можно в той же консоли, полностью сбрасываем весь сетевой стек. Тут две команды:
4. Тут же идём в ребут.
После ребута всё завелось какк часы: OpenVPN пересоздал себе новый адаптер при необходимости, sing-box тоже создаёт себе устройство при старте службы, wsl корректно настроился автоматически при первом запуске оболочки. VMWare ещё не проверял, так как он мне пока не нужен, но в крайнем случае переустановка программы однозначно поможет.
Также, поделюсь тут своим конфигом от Wsl, с которым у меня всё работает.
Ведёт оно себя следующим образом:
в правила sing-box для разделения трафика добавлено следующее: проксировать vpn.ifconfig.me.
В итоге видим следующее поведение под Wsl:
Доступ к заблокировавшимся от российских пользователей OpenAI и Claude тоже проходит без проблем как ис-под хоста, так и под wsl.
ps: Важно отметить, что у меня sing-box работает как чистое ядро, завёрнутое в WinSW для запуска в качестве службы Windows. Я не использую графические клиенты вроде Throne, Hiddify или Clash.
Будет ли всё это работать так же с ними - не знаю.
Сегодня выяснил, что у меня в системе жёсткий бардак с сетью: адаптер Bluetooth (просто потому, что его кто-то создал), штук 5 адаптеров от старых установок всяческих OpenVPN (для подключения к корпоративной сети), несколько зависших старых мостов от старых версий VMWare...
Из-за всего этого я не мог нормально завести режим Mirrored в wsl, чтобы трафик из wsl тоже шёл под vpn (для доступа к корпоративным ресурсам и для доступа к сервисам по типу Gemini и OpenAI).
Wsl просто отказывался запускаться в режиме Mirrored или VirtioProxy, сваливаясь в лучшем случае в NAT, в худшем - в None, оставляя виртуалку совсем без сети, даже локальной для общения с хостом.
Что именно мешало wsl жить, я не знаю. Выяснить конкретную проблему, конкретный затык не удалось.
Я до последнего убалтывал Gemini решить вопрос без радикальных шагов, ибо страшно было остаться совсем без интернета, но в итоге вот такой алгоритм действий помог.
1. Закрываем весь софт, который может сломаться от резкого исчезновения сети (vpn сервисы, браузер, TeamTalk и другие). В том числе останавливаем wsl командой
wsl --shutdown;2. Полностью сбрасываем все сетевые адаптеры командой в Powershell от имени администратора
netcfg -d. Команда может зависнуть секунд на 30 при большом количестве проблемных сетевых устройств;3. Тоже от имени администратора, можно в той же консоли, полностью сбрасываем весь сетевой стек. Тут две команды:
netsh winsock reset, затем netsh int ip reset;4. Тут же идём в ребут.
После ребута всё завелось какк часы: OpenVPN пересоздал себе новый адаптер при необходимости, sing-box тоже создаёт себе устройство при старте службы, wsl корректно настроился автоматически при первом запуске оболочки. VMWare ещё не проверял, так как он мне пока не нужен, но в крайнем случае переустановка программы однозначно поможет.
Также, поделюсь тут своим конфигом от Wsl, с которым у меня всё работает.
[wsl2]
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=false
Ведёт оно себя следующим образом:
в правила sing-box для разделения трафика добавлено следующее: проксировать vpn.ifconfig.me.
В итоге видим следующее поведение под Wsl:
~ % curl ifconfig.me
<мой реальный IP>
~ % curl vpn.ifconfig.me
<Ip адрес vpn сервера, к которому подключается sing-box>
Доступ к заблокировавшимся от российских пользователей OpenAI и Claude тоже проходит без проблем как ис-под хоста, так и под wsl.
ps: Важно отметить, что у меня sing-box работает как чистое ядро, завёрнутое в WinSW для запуска в качестве службы Windows. Я не использую графические клиенты вроде Throne, Hiddify или Clash.
Будет ли всё это работать так же с ними - не знаю.
👍2
Archlinux, ну как так-то?!!
Почему в старом и консервативном Debian пакет borgbackup2 есть, и даже почти свежий, а в Arch пакет borg2 доступен только в aur и то не устанавливается из-за криво написанного pkgbuild, а именно кривой секции тестов.
Грустненько.
Но пакет мне нужен, так что пофиг, без тестов, но поставим. Уж очень хочется мигрировать на новую структуру репозиториев с бэкапами на абсолютно всех серверах.
Почему в старом и консервативном Debian пакет borgbackup2 есть, и даже почти свежий, а в Arch пакет borg2 доступен только в aur и то не устанавливается из-за криво написанного pkgbuild, а именно кривой секции тестов.
Грустненько.
Но пакет мне нужен, так что пофиг, без тестов, но поставим. Уж очень хочется мигрировать на новую структуру репозиториев с бэкапами на абсолютно всех серверах.
#Программирование #AI
Ну, вот и я дозрел до полноценного вайбкодинга.
Вайбкодинг, если что - это процесс написания кода без написания кода, с помощью искусственного интеллекта, промптов и лишь внешнего контроля на этапе техзадания и тестирования.
Есть мод для игры Rim World. Сам мод активно разрабатывается с помощью ИИ, и я подумал: "у меня есть дешёвый и неплохой DeepSeek. На тестирование антиспам-бота и разработку пары фич для кардпьютера ушло меньше доллара. Почему бы мне не улучшить мод для игры, в которой я сам провожу каждый день по паре часов минимум".
В общем, за качество кода ручаться не буду, не читал, страшно. Но то, что делает DeepSeek через Cline в VSCode, это очень и очень интересно.
За полчаса я добавил полезную лично для меня фичу, которую, возможно, примут и в основной репозиторий. Ещё за 10 минут исправил пару неточностей в её поведении, а сейчас доделываю финальные штрихи, чтобы протестировать и с чистой душой делать merge request в основной репозиторий.
Ну, вернее, доделывает AI, а я сижу, пью чай, болтаю с друзьями и слушаю, как VSCode что-то там сохраняет, форматирует и сравнивает файлы (судя по звукам самой IDE).
И пусть хоть кто-то попробует сказать, что это сделал не я! Знаете, как было лениво настраивать Cline? Да и всё же полдоллара, потраченные на эту задачу, взяты из моего кармана 😀
Всем добра и поменьше багов!
Ну, вот и я дозрел до полноценного вайбкодинга.
Вайбкодинг, если что - это процесс написания кода без написания кода, с помощью искусственного интеллекта, промптов и лишь внешнего контроля на этапе техзадания и тестирования.
Есть мод для игры Rim World. Сам мод активно разрабатывается с помощью ИИ, и я подумал: "у меня есть дешёвый и неплохой DeepSeek. На тестирование антиспам-бота и разработку пары фич для кардпьютера ушло меньше доллара. Почему бы мне не улучшить мод для игры, в которой я сам провожу каждый день по паре часов минимум".
В общем, за качество кода ручаться не буду, не читал, страшно. Но то, что делает DeepSeek через Cline в VSCode, это очень и очень интересно.
За полчаса я добавил полезную лично для меня фичу, которую, возможно, примут и в основной репозиторий. Ещё за 10 минут исправил пару неточностей в её поведении, а сейчас доделываю финальные штрихи, чтобы протестировать и с чистой душой делать merge request в основной репозиторий.
Ну, вернее, доделывает AI, а я сижу, пью чай, болтаю с друзьями и слушаю, как VSCode что-то там сохраняет, форматирует и сравнивает файлы (судя по звукам самой IDE).
И пусть хоть кто-то попробует сказать, что это сделал не я! Знаете, как было лениво настраивать Cline? Да и всё же полдоллара, потраченные на эту задачу, взяты из моего кармана 😀
Всем добра и поменьше багов!
👍1
#Программирование #Python
Сегодня ночью написал свою первую в жизни нейросеть.
Это, конечно, громко сказано: один нейрон и простейшая логика, но я это делал ради понимания принципа, а не с целью зафигачить свой искусственный интеллект за пару часов.
Сначала сделал это на чистой математике, без всяких ваших pytorch и прочих.
Затем переписал на torch, ибо серьёзные нейронки вручную никто нынче не пишет. Тем более у torch многое уже написано за нас, и можно описывать логику, а не возиться с формулами расчётов ошибок, градиентов для обучения и обновлением весов и смещений.
Теперь есть парочка идей для саморазвития в этой области: для одной идеи нужно, чтобы один хороший человек накодил на своей стороне интерфейс для внешнего софта; другие же идеи нужно просто сесть и написать.
Одна из них, кстати, напрямую связана с уже так полюбившейся мне темой лингвистики в программировании, обработкой текстов и преобразованием слов и их частей.
ps: Долго думал, написать об этом сюда или в основной канал, ибо пост не так что бы и сильно технический, да и короткий. В итоге решил, что просто сделаю репост 🙂
Сегодня ночью написал свою первую в жизни нейросеть.
Это, конечно, громко сказано: один нейрон и простейшая логика, но я это делал ради понимания принципа, а не с целью зафигачить свой искусственный интеллект за пару часов.
Сначала сделал это на чистой математике, без всяких ваших pytorch и прочих.
Затем переписал на torch, ибо серьёзные нейронки вручную никто нынче не пишет. Тем более у torch многое уже написано за нас, и можно описывать логику, а не возиться с формулами расчётов ошибок, градиентов для обучения и обновлением весов и смещений.
Теперь есть парочка идей для саморазвития в этой области: для одной идеи нужно, чтобы один хороший человек накодил на своей стороне интерфейс для внешнего софта; другие же идеи нужно просто сесть и написать.
Одна из них, кстати, напрямую связана с уже так полюбившейся мне темой лингвистики в программировании, обработкой текстов и преобразованием слов и их частей.
ps: Долго думал, написать об этом сюда или в основной канал, ибо пост не так что бы и сильно технический, да и короткий. В итоге решил, что просто сделаю репост 🙂
И от этих невнимательных рукожопов зависит наша карьера!
Прохожу тест на hh.ru, Golang, средний уровень, практика.
Перед началом написано, что мол наши тесты проверены компанией "Магнит чё-то там". Типа пафосно!
Первая же задача:
реализуйте алгоритм фильтрации.
На вход подаётся первой строкой тип фильтра, один из перечисленных:
capital - вернуть "да" для строк, начинающихся с заглавной буквы;
digits - вернуть "да" для строк только из цифр;
long - вернуть "да" для строк строго длиннее 5 символов.
Иначе вернуть "Ошибка. Неизвестный фильтр".
Примеры входных данных:
capital
Hello
Вернуть строку Hello.
unique
hello go go go is fun 123
Вернуть "уникальных слов столько-то"...
Продолжать нет смысла.
Какой, нахрен, unique?!!
Вы двумя абзацами выше пишете про три фильтра, среди которых такого не существует. При этом в примерах и, что самое страшное, в тестах, фильтр есть, и без него всё падает.
При этом в требованиях описывается одно, а в структуре кода ожидается имплементация самих структур фильтров, без возврата текстовых ответов в принципе.
При этом ваши же тесты на абсолютно верном вводе падают с невнятной ошибкой в стиле "ой, оно не собралось". И ошибка торчит куда-то в ту область кода, которая мне неподконтрольна. Тот кусок, который собирает и использует мой пакет с фильтрами на их стороне в тестовом запуске.
Российский бигтех: безжалостный и беспощадный.
Видимо в таком стиле предполагается и работать дальше: сделать вчера! Как? Не ебёт. Сделать, иначе казнить! Не работает, разбирайся сам. Документация? Нууу, её писал наш бывший коллега 5 лет назад, мы хз чё там вообще. Сам как-нибудь. Иначе будешь уволен задним числом.
Походу именно к такому нас и готовят на ХХ.
Прохожу тест на hh.ru, Golang, средний уровень, практика.
Перед началом написано, что мол наши тесты проверены компанией "Магнит чё-то там". Типа пафосно!
Первая же задача:
реализуйте алгоритм фильтрации.
На вход подаётся первой строкой тип фильтра, один из перечисленных:
capital - вернуть "да" для строк, начинающихся с заглавной буквы;
digits - вернуть "да" для строк только из цифр;
long - вернуть "да" для строк строго длиннее 5 символов.
Иначе вернуть "Ошибка. Неизвестный фильтр".
Примеры входных данных:
capital
Hello
Вернуть строку Hello.
unique
hello go go go is fun 123
Вернуть "уникальных слов столько-то"...
Продолжать нет смысла.
Какой, нахрен, unique?!!
Вы двумя абзацами выше пишете про три фильтра, среди которых такого не существует. При этом в примерах и, что самое страшное, в тестах, фильтр есть, и без него всё падает.
При этом в требованиях описывается одно, а в структуре кода ожидается имплементация самих структур фильтров, без возврата текстовых ответов в принципе.
При этом ваши же тесты на абсолютно верном вводе падают с невнятной ошибкой в стиле "ой, оно не собралось". И ошибка торчит куда-то в ту область кода, которая мне неподконтрольна. Тот кусок, который собирает и использует мой пакет с фильтрами на их стороне в тестовом запуске.
Российский бигтех: безжалостный и беспощадный.
Видимо в таком стиле предполагается и работать дальше: сделать вчера! Как? Не ебёт. Сделать, иначе казнить! Не работает, разбирайся сам. Документация? Нууу, её писал наш бывший коллега 5 лет назад, мы хз чё там вообще. Сам как-нибудь. Иначе будешь уволен задним числом.
Походу именно к такому нас и готовят на ХХ.
🔥1
Code with Cyrmax
И от этих невнимательных рукожопов зависит наша карьера! Прохожу тест на hh.ru, Golang, средний уровень, практика. Перед началом написано, что мол наши тесты проверены компанией "Магнит чё-то там". Типа пафосно! Первая же задача: реализуйте алгоритм фильтрации.…
upd: И по результатам этой невнятной ссанины предлагается получать "сертификат Минцифры на ГосУслугах", да?
#Администрирование #Linux
По следам трёхдневного ярого совокупления с поломавшимся домашним сервером.
Расписывать подробно уже нет сил, поэтому пост будет в формате коротких советов и можно сказать чеклистов.
Если сервер ведёт себя странно, то принимает подключения, то не принимает; то пинги по 20 секунд, а попытка запустить обновление системы выливается в часовое ожидание в подключении к внешним адресам.
Ясно, что дело в сетевой конфигурации.
Первым делом проверь dns.
Смотри на содержимое
Если там обычное содержимое без предупреждений, прочитай его и убедись вручную пингом, что до каждого или хотя бы до первого сервера имён есть доступ. В условиях нашей цензуры лишним не будет.
Ещё один способ изолировать проблему с dns - это пропинговать сайт с доменом, например
Помни, что dns кэшируется. После изменений в конфиге пробуй не только старый домен, но и что-то новое. Имей в голове список из пары десятков сайтов для проверки без участия кэша.
Если проблема не в dns, тогда смотри маршруты через
Как минимум должен быть маршрут по умолчанию, причём верный и рабочий.
Обычно этим занимается dhcp-клиент, служба сетевых интерфейсов (ifupdown или systemd-networkd). Их можно подёргать в надежде на чудо. Ну или читай логи.
Кстати, настройки dns тоже могут прилетать по dhcp, имей это в виду, если выяснил, что проблема в dns.
Если всё изложенное выше не дало наводок на корень проблемы, проверь mtu.
Особенно актуально, если одни пакеты проходят, другие - нет, а закономерность непонятна.
Командой
У основного интерфейса посмотри параметр mtu. Он может быть 1500, 1492, 1280 или изредка другое необычное значение.
От значения mtu отними 28 байт и запомни получившееся число.
Дальше подставь его в команду пинга с большим размером пакета:
Если пакет пролезает без фрагментации, значит всё окей. Если же нет, начинаются непредсказуемые приколы.
Размер пакета можно уменьшать или увеличивать, пока не найдёте потолок.
А далее к этому безопасному размеру пакета добавляем 28. Это и будет наш эффективный mtu.
У меня из-за pppoe на роутере максимальный mtu не 1500 как позволяет стандарт ethernet, а 1492 (pppoe требует 8 байт на свои служебные заголовки).
Выставить mtu временно -
Имя интерфейса может быть другим вместо eth0.
А вот как сохранить эти изменения - зависит от того, используете вы systemd-networkd, ifupdown, или ваши интерфейсы всецело под контролем NetworkManager.
И это тема для отдельного поста, в котором я пожалуй ещё и разберу различия этих трёх утилит в деталях. Заодно и сам разберусь.
Надеюсь эти торопливые заметки мамкиного сисадмина кому-то помогут.
По следам трёхдневного ярого совокупления с поломавшимся домашним сервером.
Расписывать подробно уже нет сил, поэтому пост будет в формате коротких советов и можно сказать чеклистов.
Если сервер ведёт себя странно, то принимает подключения, то не принимает; то пинги по 20 секунд, а попытка запустить обновление системы выливается в часовое ожидание в подключении к внешним адресам.
Ясно, что дело в сетевой конфигурации.
Первым делом проверь dns.
Смотри на содержимое
/etc/resolv.conf. Если там написано, что это заглушка от systemd-resolved, тогда проверяй статус через команду resolvectl status.Если там обычное содержимое без предупреждений, прочитай его и убедись вручную пингом, что до каждого или хотя бы до первого сервера имён есть доступ. В условиях нашей цензуры лишним не будет.
Ещё один способ изолировать проблему с dns - это пропинговать сайт с доменом, например
ping ifconfig.me, а затем пинговать просто ip-адрес, например ping 77.88.8.8 (dns Яндекса).Помни, что dns кэшируется. После изменений в конфиге пробуй не только старый домен, но и что-то новое. Имей в голове список из пары десятков сайтов для проверки без участия кэша.
Если проблема не в dns, тогда смотри маршруты через
ip route show.Как минимум должен быть маршрут по умолчанию, причём верный и рабочий.
Обычно этим занимается dhcp-клиент, служба сетевых интерфейсов (ifupdown или systemd-networkd). Их можно подёргать в надежде на чудо. Ну или читай логи.
Кстати, настройки dns тоже могут прилетать по dhcp, имей это в виду, если выяснил, что проблема в dns.
Если всё изложенное выше не дало наводок на корень проблемы, проверь mtu.
Особенно актуально, если одни пакеты проходят, другие - нет, а закономерность непонятна.
Командой
ip link show или ip addr show выведи список интерфейсов, найди свой основной, у которого получен публичный ip (или локальный от роутера).У основного интерфейса посмотри параметр mtu. Он может быть 1500, 1492, 1280 или изредка другое необычное значение.
От значения mtu отними 28 байт и запомни получившееся число.
Дальше подставь его в команду пинга с большим размером пакета:
ping -M do -c 4 -s 1472 8.8.8.8-c 4 - пинговать не бесконечно, а всего 4 раза.-s 1472 - указать размер пакета (1472 это 1500 минус 28 байт заголовков пакета).-M do - помечать пакет как "Do not fragment" (не фрагментировать).Если пакет пролезает без фрагментации, значит всё окей. Если же нет, начинаются непредсказуемые приколы.
Размер пакета можно уменьшать или увеличивать, пока не найдёте потолок.
А далее к этому безопасному размеру пакета добавляем 28. Это и будет наш эффективный mtu.
У меня из-за pppoe на роутере максимальный mtu не 1500 как позволяет стандарт ethernet, а 1492 (pppoe требует 8 байт на свои служебные заголовки).
Выставить mtu временно -
sudo ip link set dev eth0 mtu 1492.Имя интерфейса может быть другим вместо eth0.
А вот как сохранить эти изменения - зависит от того, используете вы systemd-networkd, ifupdown, или ваши интерфейсы всецело под контролем NetworkManager.
И это тема для отдельного поста, в котором я пожалуй ещё и разберу различия этих трёх утилит в деталях. Заодно и сам разберусь.
Надеюсь эти торопливые заметки мамкиного сисадмина кому-то помогут.
❤🔥1🤝1
#Администрирование #Windows
Многие знают про менеджер пакетов для Windows под названием WinGet.
И если уж вы им пользуетесь не только для установки, но и для обновления пакетов, наверняка вас бесила невозможность обновить всё разом или быстро указать конкретный список пакетов для обновления без прописывания ID каждой программы вручную.
Меня тоже это достало, и я, попутно изучая возможности языка PowerShell, накидал маленький скрипт под это дело.
Он получает список всех доступных обновлений, а дальше для каждого пакета спрашивает, либо обновить, либо пропустить, либо пропустить все оставшиеся и приступить к обновлению.
Ещё я лично для себя добавил действие "удалить прямо сейчас", ибо как раз после обновления винды чистил её от мусора. Вы эту ветку можете убрать, если она вам не нужна. Лично мне не мешает.
Скрипт корректно работает на PowerShell 7 и требует установленного модуля для взаимодействия с WinGet.
Поэтому сначала пишем
Кода получилось очень мало, так что вставлю его прямо сюда. Кому надо, забирайте.
Многие знают про менеджер пакетов для Windows под названием WinGet.
И если уж вы им пользуетесь не только для установки, но и для обновления пакетов, наверняка вас бесила невозможность обновить всё разом или быстро указать конкретный список пакетов для обновления без прописывания ID каждой программы вручную.
Меня тоже это достало, и я, попутно изучая возможности языка PowerShell, накидал маленький скрипт под это дело.
Он получает список всех доступных обновлений, а дальше для каждого пакета спрашивает, либо обновить, либо пропустить, либо пропустить все оставшиеся и приступить к обновлению.
Ещё я лично для себя добавил действие "удалить прямо сейчас", ибо как раз после обновления винды чистил её от мусора. Вы эту ветку можете убрать, если она вам не нужна. Лично мне не мешает.
Скрипт корректно работает на PowerShell 7 и требует установленного модуля для взаимодействия с WinGet.
Поэтому сначала пишем
Install-Module -Name 'Microsoft.Winget.Client", а лишь затем используем скрипт.Кода получилось очень мало, так что вставлю его прямо сюда. Кому надо, забирайте.
$ErrorActionPreference = "Stop"
Set-StrictMode -Version Latest
Write-Host "Looking for available WinGet updates..."
$allUpdates = Get-WingetPackage | Where-Object { $_.IsUpdateAvailable }
if (-Not $allUpdates) {
Write-Host "No available WinGet updates found"
exit
}
Write-Host "$($allUpdates.Count) updatable packages found."
$packagesToUpgrade = @()
$skipRemaining = $false
foreach ($pkg in $allUpdates) {
if ($skipRemaining) { break }
Write-Host "Package: $($pkg.Name)"
Write-Host "$($pkg.Id)"
Write-Host "Installed version: $($pkg.InstalledVersion)"
Write-Host "Available version: $($pkg.AvailableVersions[0])"
$choices = @(
New-Object System.Management.Automation.Host.ChoiceDescription "&Update", "Add to upgrade queue"
New-Object System.Management.Automation.Host.ChoiceDescription "&Skip", "Skip this package"
New-Object System.Management.Automation.Host.ChoiceDescription "Skip &All", "Skip all remaining packages"
New-Object System.Management.Automation.Host.ChoiceDescription "&Remove", "Queue this package for removal"
)
$answer = $host.UI.PromptForChoice("Action for $($pkg.Name)", "Choose an action", $choices, 0)
switch ($answer) {
0 {
$packagesToUpgrade += $pkg
}
1 {
Write-Host "Skipping"
}
2 {
Write-Host "Skipping all remaining packages"
$skipRemaining = $true
}
3 {
Uninstall-WinGetPackage -Id $pkg.Id
}
}
}
if ($packagesToUpgrade.Count -eq 0) {
Write-Host "No packages were selected for upgrade"
exit
}
Write-Host "Upgrading $($packagesToUpgrade.Count) packages..."
foreach ($pkg in $packagesToUpgrade) {
Write-Host "Upgrading $($pkg.Name)"
try {
Update-WinGetPackage -Id $pkg.Id -ErrorAction Stop
}
catch {
Write-Host "Upgrade for $($pkg.Id) failed"
Write-Host "Reason: $($_.Exception.Message)"
}
}
#Администрирование #Блокировки
Нет, речь не пойдёт про обход цензуры.
Недавно у меня на одном из московских серверов начали с завидной регулярностью падать ежедневные бэкапы.
Нашлось немного времени, пошёл разбираться. Выяснил, что сами бэкапы проходят, а падать их заставляет неработающий скрипт уведомлений в Telegram.
Всё, походу серверы теперь тоже местами отрезают от API мессенджера.
Грустно, но будем приспосабливаться.
Кстати, второй сервер в этом же датацентре почему-то ходит к боту без проблем и ещё ни разу не падал по таймауту.
Нет, речь не пойдёт про обход цензуры.
Недавно у меня на одном из московских серверов начали с завидной регулярностью падать ежедневные бэкапы.
Нашлось немного времени, пошёл разбираться. Выяснил, что сами бэкапы проходят, а падать их заставляет неработающий скрипт уведомлений в Telegram.
Всё, походу серверы теперь тоже местами отрезают от API мессенджера.
Грустно, но будем приспосабливаться.
Кстати, второй сервер в этом же датацентре почему-то ходит к боту без проблем и ещё ни разу не падал по таймауту.
#Администрирование #Linux #nftables
Я наконец-таки сдался под напором прогресса и пересадил сервисы на одном из серверов в Docker.
У Docker вроде всё стало лучше с nftables, да и опыта я поднабрался, чтобы какие-то сетевые нестыковки диагностировать и лечить вручную.
В общем, этим и занимался вчера почти весь день.
Но речь не об этом.
На заметку тем, кто не знал:
команда
Час времени я потратил на совокупление в попытках подружить докер со своим набором сетевых правил, пока не догадался сделать
В итоге опыт получен, цена за опыт уплачена нервными клетками, как всегда, а в личную коллекцию админских заметок улетело нечто вроде:
***
Не использовать
Использовать только
Restart nftables сносит runtime-правила Docker из-за
***
Да да, TailScale отваливается по тому же принципу и как и докер, лечиться рестартом сервиса.
А ещё вдогонку полезное вам про nftables:
Если на сервере крутится выше описанный зоопарк, то делать
А накладывать новые правила поверх старых и вообще смешивать - ещё хуже.
В современных nftables появилась прикольная команда.
Теперь начало моего скрипта выглядит так:
В отличие от
Идеально для идемпотентного применения конфигурации: удалил при наличии и тут же создал в нужном виде.
А, учитывая то, что весь скрипт nftables применяет в рамках одной транзакции и откатывает изменения при любом падении, вы либо примените скрипт целиком, либо у вас ничего не удалится, а старые сущности останутся на своих местах.
p.s. Пользуйтесь и не тупите, как я предыдущие 6 часов.
Я наконец-таки сдался под напором прогресса и пересадил сервисы на одном из серверов в Docker.
У Docker вроде всё стало лучше с nftables, да и опыта я поднабрался, чтобы какие-то сетевые нестыковки диагностировать и лечить вручную.
В общем, этим и занимался вчера почти весь день.
Но речь не об этом.
На заметку тем, кто не знал:
команда
systemctl restart nftables перед применением новых правил из /etc/nftables.conf сначала очищает напрочь весь рулсет, затирая и правила Docker, и настройки TailScale (у меня он тоже поднят).Час времени я потратил на совокупление в попытках подружить докер со своим набором сетевых правил, пока не догадался сделать
systemctl cat nftables и не заметил строчку вида ExecStop=/usr/sbin/nft ..... flush ruleset.В итоге опыт получен, цена за опыт уплачена нервными клетками, как всегда, а в личную коллекцию админских заметок улетело нечто вроде:
***
Не использовать
systemctl restart nftables на сервере с Docker/Tailscale.Использовать только
reload или nft -f /etc/nftables.conf.Restart nftables сносит runtime-правила Docker из-за
ExecStop=flush ruleset.***
Да да, TailScale отваливается по тому же принципу и как и докер, лечиться рестартом сервиса.
А ещё вдогонку полезное вам про nftables:
Если на сервере крутится выше описанный зоопарк, то делать
flush ruleset в начале вашего скрипта с правилами очевидно плохо.А накладывать новые правила поверх старых и вообще смешивать - ещё хуже.
В современных nftables появилась прикольная команда.
Теперь начало моего скрипта выглядит так:
destroy table inet custom_filter
destroy table ip vpn_nat
destroy chain inet lupa pupa zalupa
В отличие от
delete table или flush table destroy либо удалит сущность, либо промолчит, если её не было.Идеально для идемпотентного применения конфигурации: удалил при наличии и тут же создал в нужном виде.
А, учитывая то, что весь скрипт nftables применяет в рамках одной транзакции и откатывает изменения при любом падении, вы либо примените скрипт целиком, либо у вас ничего не удалится, а старые сущности останутся на своих местах.
p.s. Пользуйтесь и не тупите, как я предыдущие 6 часов.
❤1
#Администрирование #Linux
Когда очень быстро нужен одноразовый пароль, например после аренды нового сервера у FirstVDS (мать его), самое простое, что можно сделать -
На выходе получаем строку вида
Только вот проблема: FirstVDS такие пароли не принимает без объяснения причин. Просто "Ошибка при задании пароля. Попробуйте ещё раз или обратитесь в поддержку".
В итоге опытным путём выяснилось, что пароль не должен быть длиннее 12 символов. Бред же?!!
Когда очень быстро нужен одноразовый пароль, например после аренды нового сервера у FirstVDS (мать его), самое простое, что можно сделать -
openssl rand -hex 64.На выходе получаем строку вида
2dcad818d431ecf35e6656179481ff1f52cd2915020fde2dfe7031b0098ecbb26de2d0c810b6e70371546f0d66cadc27836dc407d59b12b6dd6d26ac08018efd, спокойно копируем и пользуемся.Только вот проблема: FirstVDS такие пароли не принимает без объяснения причин. Просто "Ошибка при задании пароля. Попробуйте ещё раз или обратитесь в поддержку".
В итоге опытным путём выяснилось, что пароль не должен быть длиннее 12 символов. Бред же?!!
👍1
Кто пользуется Total Commander: коротко без дополнительной воды:
команда shift+f4 позволяет создать новый текстовый файл в текущей директории и сразу открыть его в редакторе по умолчанию.
Несколько лет страдал и только сегодня догадался загуглить.
команда shift+f4 позволяет создать новый текстовый файл в текущей директории и сразу открыть его в редакторе по умолчанию.
Несколько лет страдал и только сегодня догадался загуглить.
👍1
#Программирование #cpp
ВОзможно, опытные разработчики меня сейчас заклюют за очевидность, но для меня было сюрпризом.
Пишу код на C++ в блокноте без IDE.
Собирается без ошибок.
Использую clang-format со включённой сортировкой include.
Код не собирается.
Выяснилось, что был у меня такой кусок кода:
И он собирался корректно до тех пор, пока clang-format в другом файле, подключающем этот заголовок, не поменял местами два инклюда.
оказалось выше, чем
и всё сломалось.
Понятно, что я сам дурак: забыл включить cstdint для использования uint8_t. Но отлавливать такие ошибки как-то надо.
Единственный убийственно надёжный способ - на каждый хедер из проекта создавать
Далее это собирается как object library, и уже на этапе сборки проблемы точно вылезут, если они есть.
Но писать такой тест руками на каждый хедер в проекте - та ещё головная боль.
Сейчас ищу инструмент, который умеет такое сам. Проблема, очевидно, не новая, и её наверное как-то решают.
Идея: генерировать такие cpp файлы на этапе конфигурации, чтобы сборка их подхватила.
Да, мы ещё более замедляем и так неспешную компиляцию проектов на C++, но хотя бы избавляемся от сюрпризов в будущем.
ВОзможно, опытные разработчики меня сейчас заклюют за очевидность, но для меня было сюрпризом.
Пишу код на C++ в блокноте без IDE.
Собирается без ошибок.
Использую clang-format со включённой сортировкой include.
Код не собирается.
Выяснилось, что был у меня такой кусок кода:
#pragma once
enum class PathScope : std::uint8_t {
Unknown,
Process,
User,
System
};
И он собирался корректно до тех пор, пока clang-format в другом файле, подключающем этот заголовок, не поменял местами два инклюда.
#include "myheader.hpp"оказалось выше, чем
#include <cstddef>и всё сломалось.
Понятно, что я сам дурак: забыл включить cstdint для использования uint8_t. Но отлавливать такие ошибки как-то надо.
Единственный убийственно надёжный способ - на каждый хедер из проекта создавать
myheader_self-containment_test.cpp, в котором подключается этот заголовок, больше ничего, а дальше создаётся одна простая функция.Далее это собирается как object library, и уже на этапе сборки проблемы точно вылезут, если они есть.
Но писать такой тест руками на каждый хедер в проекте - та ещё головная боль.
Сейчас ищу инструмент, который умеет такое сам. Проблема, очевидно, не новая, и её наверное как-то решают.
Идея: генерировать такие cpp файлы на этапе конфигурации, чтобы сборка их подхватила.
Да, мы ещё более замедляем и так неспешную компиляцию проектов на C++, но хотя бы избавляемся от сюрпризов в будущем.
🔥1
#Инцидент
У GitHub сегодня официально проблемы с Actions и Pages.
Официальное заявление компании об инциденте опубликовано в 10:57 UTC.
Actions отмечены как Major Outage (по-русски: почти не работает), а Pages - как Degraded Performance (то есть работает, но медленно и нестабильно).
Так что не пугаемся, это не нас заблокировали, это Гитхаб страдает.
У GitHub сегодня официально проблемы с Actions и Pages.
Официальное заявление компании об инциденте опубликовано в 10:57 UTC.
Actions отмечены как Major Outage (по-русски: почти не работает), а Pages - как Degraded Performance (то есть работает, но медленно и нестабильно).
Так что не пугаемся, это не нас заблокировали, это Гитхаб страдает.
#Администрирование #Windows #PowerShell
Я активно пользуюсь командной строкой с 15 лет. Но это всё в Linux.
Cmd в винде всегда казался мне морально устаревшим, отвратным на вид, плохо читаемым и слабо предсказуемым.
А вот PowerShell, конечно, чуток многословный, но за то много что умеет из коробки.
Про него, а точнее про его команды и возможности, я и решил написать статью.
Я периодически буду обновлять её, дополняя новыми командами, разделами и примечаниями.
Так что сохраняйте в закладки и пользуйтесь.
https://cyrmax.ru/posts/powershell-cheatsheet/
Я активно пользуюсь командной строкой с 15 лет. Но это всё в Linux.
Cmd в винде всегда казался мне морально устаревшим, отвратным на вид, плохо читаемым и слабо предсказуемым.
А вот PowerShell, конечно, чуток многословный, но за то много что умеет из коробки.
Про него, а точнее про его команды и возможности, я и решил написать статью.
Я периодически буду обновлять её, дополняя новыми командами, разделами и примечаниями.
Так что сохраняйте в закладки и пользуйтесь.
https://cyrmax.ru/posts/powershell-cheatsheet/
👍4❤1🔥1
#Windows #Заметка
После переустановки Windows нужно было на всю папку с проектами сменить владельца и права (иначе git возмущается и не хочет работать).
Проектов много, подпапок и файлов сотни тысяч (из-за виртуальных окружений и папок типа node_modules).
При смене владельца и прав на каждый файл консоль пишет об успешности операции отдельной строкой. Получается поток примерно в 5 экранов текста в секунду.
И либо Windows Terminal, либо PowerShell 7, либо NVDA обновилась таким образом, что теперь выдерживает такие потоки текста без зависаний и лагов.
Даже Orca и fenrir на Linux захлёбываются, а тут вообще полная стабильность.
Ниже для справки мои версии участвующего софта:
- NVDA 2025.3.3
- Windows 11 25H2 (AMD64) build 26200.8524
- Windows terminal 1.24.11321.0
- PowerShell 7.6.2
В NVDA настройки, касающиеся UIA-событий, такие:
Копировал вывод скринридера, ибо так быстрее.
- Registration for UI Automation events and property changes: combo box Automatic (prefer selective) collapsed Alt+ s
- Windows Console support: combo box Automatic (prefer UIA) collapsed Alt+ o
- Use enhanced event processing (requires restart) combo box Default (Enabled) collapsed Alt+ h
- Speak passwords in all enhanced terminals (may improve performance) check box checked Alt+ p
- Use enhanced typed character support in legacy Windows Console when available check box checked Alt+ y
- Diff algorithm: combo box Automatic (prefer Diff Match Patch) collapsed Alt+ d
- Speak new text in Windows Terminal via: combo box UIA notifications collapsed
- Attempt to cancel speech for expired focus events: combo box Default (Yes) collapsed
После переустановки Windows нужно было на всю папку с проектами сменить владельца и права (иначе git возмущается и не хочет работать).
Проектов много, подпапок и файлов сотни тысяч (из-за виртуальных окружений и папок типа node_modules).
При смене владельца и прав на каждый файл консоль пишет об успешности операции отдельной строкой. Получается поток примерно в 5 экранов текста в секунду.
И либо Windows Terminal, либо PowerShell 7, либо NVDA обновилась таким образом, что теперь выдерживает такие потоки текста без зависаний и лагов.
Даже Orca и fenrir на Linux захлёбываются, а тут вообще полная стабильность.
Ниже для справки мои версии участвующего софта:
- NVDA 2025.3.3
- Windows 11 25H2 (AMD64) build 26200.8524
- Windows terminal 1.24.11321.0
- PowerShell 7.6.2
В NVDA настройки, касающиеся UIA-событий, такие:
Копировал вывод скринридера, ибо так быстрее.
- Registration for UI Automation events and property changes: combo box Automatic (prefer selective) collapsed Alt+ s
- Windows Console support: combo box Automatic (prefer UIA) collapsed Alt+ o
- Use enhanced event processing (requires restart) combo box Default (Enabled) collapsed Alt+ h
- Speak passwords in all enhanced terminals (may improve performance) check box checked Alt+ p
- Use enhanced typed character support in legacy Windows Console when available check box checked Alt+ y
- Diff algorithm: combo box Automatic (prefer Diff Match Patch) collapsed Alt+ d
- Speak new text in Windows Terminal via: combo box UIA notifications collapsed
- Attempt to cancel speech for expired focus events: combo box Default (Yes) collapsed
👍4❤1🔥1
#Администрирование
Короткая заметка о надёжности почтовых спам-фильтров.
Настраиваю себе почтовый сервер.
Сервер только поднят, не настроены ни dkim, ни dmarc, ни spf. Конфиги пришиты белыми нитками, а кастомные параметры вообще прописываются в консоли ради теста.
Отправляю письмо с test@cyrmax.ru на свой основной ящик от ВК:
отправитель: test@cyrmax.ru
Имя отправителя: dms tester
Тема: this is an awesome email test
Тело письма пустое
Письмо доходит мгновенно и не попадает в спам.
И это при том, что реальный домен cyrmax.ru добавлен в vk workspace и пока что управляется им, а я по сути сейчас вмешался в его работу как самый настоящий проклятый спамер.
Интересно,у Яндекса и гугла результаты будут такие же?
Короткая заметка о надёжности почтовых спам-фильтров.
Настраиваю себе почтовый сервер.
Сервер только поднят, не настроены ни dkim, ни dmarc, ни spf. Конфиги пришиты белыми нитками, а кастомные параметры вообще прописываются в консоли ради теста.
Отправляю письмо с test@cyrmax.ru на свой основной ящик от ВК:
отправитель: test@cyrmax.ru
Имя отправителя: dms tester
Тема: this is an awesome email test
Тело письма пустое
Письмо доходит мгновенно и не попадает в спам.
И это при том, что реальный домен cyrmax.ru добавлен в vk workspace и пока что управляется им, а я по сути сейчас вмешался в его работу как самый настоящий проклятый спамер.
Интересно,у Яндекса и гугла результаты будут такие же?
🔥2❤1👍1
#Администрирование #Почта
Вести с полей self-hosted почты без экосистем и подписок.
Уже пару недель как работает моя вручную настроенная почта на своём сервере.
Особенно горжусь тем, что настроил её полностью при помощи Ansible, не делая никаких правок в конфигах на сервере по ssh. Написал роль, запустил для выбранных серверов - профит.
Конфигурация полностью повторяемая, все изменения, будь то новые почтовые ящики, удаление старых адресов, изменения квот - всё документируется через коммиты в репозиторий.
Для меня Ansible - очень новая штука, с которой раньше работать не было надобности, так что считаю микроэкзамен пройденным успешно.
На админский ящик уже поступают регулярные отчёты от различных крупных почтовых провайдеров, в их числе Google и mail.ru.
Я впервые такое вижу и сначала очень испугался, думал меня все решили массово забанить за кривые настройки и подозрение на спам.
Оказывается, такие отчёты - норма, и сыпаться они будут со всех серверов, с которыми мой сервер взаимодействовал.
Один вопрос: где отчёты от Яндекса? Хотя, может они таких и не шлют.
У всех отчитавшихся провайдеров я пока что прохожу все проверки на отлично, подозрительных маркеров нет.
Доставка почты тоже работает отлично, за одним неприятным исключением, которое вероятно исчезнет через сутки.
Для нескольких сайтов я уже сменил основную почту на новую и продолжаю потихоньку это делать, проверяя сервер под нагрузкой рекламных буклетов, сомнительной срани из бесплатных курсов и "очень выгодных бизнес-предложений".
Несколько игровых профилей для вновь купленных игр вообще сразу зарегистрировал на новую почту. Вот такой я рисковый.
Проблемы вижу пока что только две.
Первая - это опять же грёбаный mail.ru с его таймаутом в 14 дней. Долгое время, с пару лет наверное, почта для домена cyrmax.ru была вверена biz.mail.ru, он же vk workspace.
Как только я запустил свой сервер и всё перенастроил, я инициировал процедуру удаления домена из их экосистемы. Но по их же правилам должно пройти 14 дней перед окончательным удалением.
На это время ВК отказывается присылать что-либо на мою почту, потому что их инфра думает, что мой домен всё ещё обслуживается у них, и сообщения, отправленные с адресов экосистемы ВК даже не покидают их сервера. А внутри-то моего домена уже нет. В итоге "ваше сообщение недоставлено".
Вторая проблема - скорее даже опасение, которое потенциально может вылезти в проблему в далёком будущем.
Это нагрузка и масштабируемость.
Для пары реальных и десятка служебных ящиков одного сервера хватит ещё на десятки лет. А вот если нагрузка вырастет раз в 20, то может понадобиться масштабируемость.
Да и держать всю почту на одном сервере очень очень плохо, как и любой production-ready сервис.
Как масштабировать систему в текущем виде я не знаю. Возможно придётся в лучшем случае постигать kubernetes и прочее интересное, а в худшем - искать систему, которая масштабируется горизонтально, поддерживает всё вот это модное high availability и отказоустойчивость через реплики и прочие страшные девопсерские штуки.
Одно хорошо: резервное копирование у меня уже давно настроено, восстановление из бэкапов я репетирую раз в пару месяцев, а копии лежат на географически удалённых друг от друга серверах от разных провайдеров. Плюс одна копия всегда живёт у меня дома.
Возможно, если найду не совсем говнистое s3-хранилище по адекватной цене, буду лить копии ещё и туда. Всё же большие дяди с большими... датацентрами явно имеют больше серверов и меньше точек отказа при хранении данных.
p.s. Интересно, если я - единственный настоящий пользователь моей почты, должен ли я соблюдать 152-фз в отношении себя и хранить свои персональные данные только в юрисдикции РФ или это работает только для юридических лиц?
Вести с полей self-hosted почты без экосистем и подписок.
Уже пару недель как работает моя вручную настроенная почта на своём сервере.
Особенно горжусь тем, что настроил её полностью при помощи Ansible, не делая никаких правок в конфигах на сервере по ssh. Написал роль, запустил для выбранных серверов - профит.
Конфигурация полностью повторяемая, все изменения, будь то новые почтовые ящики, удаление старых адресов, изменения квот - всё документируется через коммиты в репозиторий.
Для меня Ansible - очень новая штука, с которой раньше работать не было надобности, так что считаю микроэкзамен пройденным успешно.
На админский ящик уже поступают регулярные отчёты от различных крупных почтовых провайдеров, в их числе Google и mail.ru.
Я впервые такое вижу и сначала очень испугался, думал меня все решили массово забанить за кривые настройки и подозрение на спам.
Оказывается, такие отчёты - норма, и сыпаться они будут со всех серверов, с которыми мой сервер взаимодействовал.
Один вопрос: где отчёты от Яндекса? Хотя, может они таких и не шлют.
У всех отчитавшихся провайдеров я пока что прохожу все проверки на отлично, подозрительных маркеров нет.
Доставка почты тоже работает отлично, за одним неприятным исключением, которое вероятно исчезнет через сутки.
Для нескольких сайтов я уже сменил основную почту на новую и продолжаю потихоньку это делать, проверяя сервер под нагрузкой рекламных буклетов, сомнительной срани из бесплатных курсов и "очень выгодных бизнес-предложений".
Несколько игровых профилей для вновь купленных игр вообще сразу зарегистрировал на новую почту. Вот такой я рисковый.
Проблемы вижу пока что только две.
Первая - это опять же грёбаный mail.ru с его таймаутом в 14 дней. Долгое время, с пару лет наверное, почта для домена cyrmax.ru была вверена biz.mail.ru, он же vk workspace.
Как только я запустил свой сервер и всё перенастроил, я инициировал процедуру удаления домена из их экосистемы. Но по их же правилам должно пройти 14 дней перед окончательным удалением.
На это время ВК отказывается присылать что-либо на мою почту, потому что их инфра думает, что мой домен всё ещё обслуживается у них, и сообщения, отправленные с адресов экосистемы ВК даже не покидают их сервера. А внутри-то моего домена уже нет. В итоге "ваше сообщение недоставлено".
Вторая проблема - скорее даже опасение, которое потенциально может вылезти в проблему в далёком будущем.
Это нагрузка и масштабируемость.
Для пары реальных и десятка служебных ящиков одного сервера хватит ещё на десятки лет. А вот если нагрузка вырастет раз в 20, то может понадобиться масштабируемость.
Да и держать всю почту на одном сервере очень очень плохо, как и любой production-ready сервис.
Как масштабировать систему в текущем виде я не знаю. Возможно придётся в лучшем случае постигать kubernetes и прочее интересное, а в худшем - искать систему, которая масштабируется горизонтально, поддерживает всё вот это модное high availability и отказоустойчивость через реплики и прочие страшные девопсерские штуки.
Одно хорошо: резервное копирование у меня уже давно настроено, восстановление из бэкапов я репетирую раз в пару месяцев, а копии лежат на географически удалённых друг от друга серверах от разных провайдеров. Плюс одна копия всегда живёт у меня дома.
Возможно, если найду не совсем говнистое s3-хранилище по адекватной цене, буду лить копии ещё и туда. Всё же большие дяди с большими... датацентрами явно имеют больше серверов и меньше точек отказа при хранении данных.
p.s. Интересно, если я - единственный настоящий пользователь моей почты, должен ли я соблюдать 152-фз в отношении себя и хранить свои персональные данные только в юрисдикции РФ или это работает только для юридических лиц?
👍2🔥2❤1
#Работа
Я же тут в поиске новой работы, и не только активно прокачиваюсь в различных навыках, но и много размышляю о том, что ещё мог бы вписать себе в резюме, дабы повысить свои шансы.
И вот о чём задумался.
Вот приходишь ты весь такой замотивированный и с кучей денег на "крутой курс по разработке на (подставить любой популярный стек)".
Тебе в программе курса обещают изучение самого стека, что очевидно, а ещё часто технический английский, что тоже нужно для чтения документации, и тот же git, без которого не делается ни один проект в мире.
А вот чего тебе никто не даёт, так это знаний, которые упростят твои первые месяцы в компании и снизят уровень головной боли у тебя и твоего HR на это время.
Я говорю про знание о том, как устроены типичные процессы в разработке: какой путь проходит задача от мысли в голове директора или топ-менеджера до продукта на устройствах пользователей, что такое agile, scrum, что входит в задачи тимлида, чем отличается продакт от проджект менеджера и может ли это быть один и тот же человек, зачем в конце концов нужны такие поруганные в разработческом фольклоре дейлики, ретро, груминги, как пользоваться всеми этими статусами в Jira, какие ещё есть системы отслеживания задач, как чаще всего устроены спринты, как принято формировать релизы, зачем нужны кодфризы и чем отличается мягкий кодфриз от жёсткого...
Вопросов можно напридумывать больше сотни, а ответов в одном конкретном месте, увы, хрен найдёшь.
Остаётся только гуглить или отчаянно топтать кнопки в диалогах с нейронкой, дабы овладеть хотя бы примерной контурной картой всего этого безобразия.
Если я найду полезные материалы по этой обширной теме, обязательно поделюсь с вами.
А когда знаний накопится больше пары страниц, обязательно сделаю страничку с ними на своём сайте.
Кстати, если кто ещё не видел, я перенёс сайт на Hugo, теперь он быстрый как понос, почти невзламываемый из-за своей статической природы, а статьи на него я наконец-таки пишу в своём любимом markdown, а не вот эти все визуальные редакторы.
Ну и если сервер упадёт, я могу поднять сайт на любом другом за пару минут, из которых минуту буду материться на упавший сервер.
Я же тут в поиске новой работы, и не только активно прокачиваюсь в различных навыках, но и много размышляю о том, что ещё мог бы вписать себе в резюме, дабы повысить свои шансы.
И вот о чём задумался.
Вот приходишь ты весь такой замотивированный и с кучей денег на "крутой курс по разработке на (подставить любой популярный стек)".
Тебе в программе курса обещают изучение самого стека, что очевидно, а ещё часто технический английский, что тоже нужно для чтения документации, и тот же git, без которого не делается ни один проект в мире.
А вот чего тебе никто не даёт, так это знаний, которые упростят твои первые месяцы в компании и снизят уровень головной боли у тебя и твоего HR на это время.
Я говорю про знание о том, как устроены типичные процессы в разработке: какой путь проходит задача от мысли в голове директора или топ-менеджера до продукта на устройствах пользователей, что такое agile, scrum, что входит в задачи тимлида, чем отличается продакт от проджект менеджера и может ли это быть один и тот же человек, зачем в конце концов нужны такие поруганные в разработческом фольклоре дейлики, ретро, груминги, как пользоваться всеми этими статусами в Jira, какие ещё есть системы отслеживания задач, как чаще всего устроены спринты, как принято формировать релизы, зачем нужны кодфризы и чем отличается мягкий кодфриз от жёсткого...
Вопросов можно напридумывать больше сотни, а ответов в одном конкретном месте, увы, хрен найдёшь.
Остаётся только гуглить или отчаянно топтать кнопки в диалогах с нейронкой, дабы овладеть хотя бы примерной контурной картой всего этого безобразия.
Если я найду полезные материалы по этой обширной теме, обязательно поделюсь с вами.
А когда знаний накопится больше пары страниц, обязательно сделаю страничку с ними на своём сайте.
Кстати, если кто ещё не видел, я перенёс сайт на Hugo, теперь он быстрый как понос, почти невзламываемый из-за своей статической природы, а статьи на него я наконец-таки пишу в своём любимом markdown, а не вот эти все визуальные редакторы.
Ну и если сервер упадёт, я могу поднять сайт на любом другом за пару минут, из которых минуту буду материться на упавший сервер.
❤2👍2🔥2