В общем, Python и Java мне кодить лень, но кодить на языке cmd ума мне хватило. Кто знает, я уже писал пост о игре "Magnet-Fishing", которую тоже создал на чистом batch. Сервис запустится на "любой капле воды", если там есть Windows.
В этой утилите есть многое:
Её функционал:
Простая и очень быстрая установка.
Множество инструментов в одном файле.
Красивое меню из рамок (не знаю, как вам, но мне нравится!).
Инструменты в ней:
Очистка папок Temp.
Очистка логов по нужному пути.
Секундомер формата 00:00.
Конвертер км/ч в м/с или наоборот.
TWR калькулятор до сотых чисел (0.00).
Прогноз погоды (никакой магии, это просто отличный wttr.in!).
Пинг-тестер по нужной ссылке и количеству пакетов (от 1 до 3).
Переносчик файлов нужного формата и нужного пути.
Проверка обновлений сервиса.
Весь батник весит всего лишь какие-то 12 кб, а в сжатом виде вообще так 4.25 кб. Делает больше, чем простые чистилки под 50 мб.
К тому же, там есть раздел "От автора", где можно скачать тот же "Magnet-Fishing" или "Batch files pack", или просто зайти на корень моего репозитория GitHub.
История дня: сел работать, а Claude Code взял и кончился — всё, лимит, гуляй до завтра. Руки чешутся, а поработать не на чем. Поставил себе Hermes Agent — свежего десктопного ИИ-агента от Nous Research, посмотреть что за зверь. И первая же задача, которую я ему поручил — сделать самому себе полную русскую локализацию. Да, я в курсе, как это выглядит со стороны. А чего вы ещё от меня ждали, кроме русификации и портативок? 😄
Получилось хорошо — так что не жалко выложить в опенсорс.
Что такое Hermes Agent
Десктопный ИИ-агент от Nous Research — чат с поддержкой кучи моделей (DeepSeek и любые другие через провайдеров/OpenRouter), голосовой режим, интеграция с мессенджерами (Telegram, Discord, Slack, WhatsApp, Matrix и ещё десяток), собственные скиллы и хаб навыков, задачи по расписанию, шлюз для внешних интеграций. По сути персональный агент-комбайн на десктопе, а не в браузерной вкладке. Из коробки — только английский, ни слова по-русски.
Что я сделал
Перевёл весь интерфейс — 2218 строк: чат, все разделы настроек (модель, внешний вид, рабочая область, безопасность, память и контекст, голос, провайдеры, шлюз, инструменты и ключи), мессенджеры, горячие клавиши, задачи по расписанию. Даже подписи полей в настройках переведены, не только основной UI — видно на скринах выше.
Как это работает технически
Перевод сделан через defineLocale() — родной механизм Hermes для частичных локалей. Перевод не ломается при обновлении Hermes: если разработчики добавят новые строки интерфейса, они просто останутся на английском до следующего апдейта перевода, а не всё приложение уйдёт в тарабарщину из-за рассинхрона версий.
2218 переведённых ключей — весь интерфейс десктопа
defineLocale — обновления Hermes больше не сносят русский
install.ps1 сам находит установку Hermes, копирует файлы, патчит конфиги и пересобирает приложение
переведены даже подписи и описания полей в настройках
алиасы раскладки — ru, ru-ru, ru_ru, русский — заведётся в любом виде
один файл перевода (ru.ts) — легко доработать и дополнить самому
Требования: Hermes Agent v0.18.0+, Node.js и npm для сборки, Windows 10/11 (скрипт установки на PowerShell).
Бета-версия — гонял на себе, работает стабильно, но если что-то пойдёт не так — спросите у самого Hermes, он в курсе своей архитектуры и обычно сам подсказывает, как починить.
Последнее время я много работаю с ИИ, который пишет код. И заметил одну проблему: сам по себе ИИ часто ведет себя как новый сотрудник, который каждый раз приходит в проект с нуля.
Он может:
- забыть правила проекта;
- полезть править не то;
- написать красивую, но бесполезную заглушку;
- взять слишком много лишнего контекста;
- не проверить результат;
- случайно предложить опасную команду;
- начать “умничать”, когда нужно просто аккуратно доделать задачу.
Поэтому я сделал систему, которую назвал Srednoff OS.
Если объяснять просто, это не отдельная нейросеть и не “магическая кнопка”. Это слой правил, проверок и сценариев вокруг ИИ-программиста.
Как это работает:
1. Сначала система проверяет проект
Есть ли нужные файлы, правила, настройки, проверки, структура.
2. Потом понимает тип задачи
Например: это сайт, backend, мобильное приложение, SEO, дизайн, безопасность, 3D, автоматизация или работа с базой данных.
3. Потом выбирает только нужные навыки
Не грузит в ИИ огромную инструкцию “на все случаи жизни”, а выбирает маленький набор правил под конкретную задачу.
4. Потом следит за безопасностью
Например, не дает без подтверждения удалять данные, ломать production, трогать секреты, деплоить, менять платежи или выполнять опасные команды.
5. После работы требует проверки
Тесты, сборка, линт, ручной review, отчёт: что сделано, что проверено, какие риски остались.
Для обычного пользователя это можно представить так:
ИИ-программист без такой системы — это умный, но хаотичный помощник.
ИИ-программист с Srednoff OS — это помощник, который сначала читает инструкцию, понимает задачу, берет правильные инструменты, работает по чеклисту и в конце показывает акт выполненных работ.
Я добавил туда:
- роутер задач;
- каталог навыков;
- проверки безопасности;
- систему выбора навыков по “польза / стоимость контекста”;
- правила для сайтов, приложений, SEO, дизайна, 3D, backend, AI-агентов;
- проверки для UI-компонентов и внешних библиотек;
- ежедневное исследование новых подходов;
- диагностику, которая показывает, что система жива и ничего важного не сломалось.
Сейчас это скорее инженерный инструмент для тех, кто работает с Codex и похожими ИИ-агентами. Но сама идея шире: вокруг ИИ нужны не только промпты, а нормальная рабочая среда — с правилами, проверками, безопасностью и памятью о процессе.
Потому что чем сильнее становятся ИИ-инструменты, тем важнее не просто “попросить написать код”, а правильно организовать их работу.
У Anthropic картинка в API стоит фиксированное число токенов — ровно столько, сколько задают её пиксели, вне зависимости от объёма текста внутри. Обычный текст считается посимвольно. Разработчик Стивен Чонг заметил эту дыру в прайсинге и написал pxpipe — открытый локальный прокси, который встаёт между Claude Code и API Anthropic, перехватывает системный промпт, документацию по инструментам и старую историю чата, перерисовывает их в плотные PNG-страницы и подсовывает модели вместо текста. Модель читает картинку почти как текст, а платите вы по цене изображения.
Работает это не только в теории: одна и та же сессия в Claude Code обошлась в $42.21 обычным текстом и в $4.51 — через pxpipe. На выборке продакшен-трафика за несколько недель — устойчивые 59–70% экономии на итоговом счёте.
Автор честно предупреждает: способ лоссовый. Точные строки — хэши, ID, ключи — иногда считываются с картинки неверно, причём молча, без ошибки. Поэтому байт-точные данные pxpipe всегда оставляет текстом, а по умолчанию включён только для Fable 5 — она читает картинки надёжнее всего; Opus и GPT-5.5 подключаются вручную.
Идея, кстати, не новая. Полгода назад к тому же выводу пришли в DeepSeek: в октябре 2025 они открыли DeepSeek-OCR — модель, которая сжимает страницу документа в компактные визуальные токены (до 16×) и надёжно разворачивает их обратно в текст, вместо того чтобы гнать документ через LLM посимвольно. В январе 2026 вышла DeepSeek-OCR 2 со своим токенизатором-энкодером (DeepEncoder V2, механизм «Visual Causal Flow»), который переупорядочивает визуальные токены по смыслу страницы, а не построчно слева направо — точность на OmniDocBench выросла до 91%. Разница с pxpipe в том, что DeepSeek с самого начала строил это как архитектуру, заточенную под сжатие документов, а pxpipe — просто хак поверх обычного чат-API, который для такого сценария никто не проектировал.
Смысл же в обоих случаях один: модели не обязательно видеть ваш текст или код посимвольно, чтобы понимать его — она по сути сама «самокорректируется» и достраивает смысл из контекста, примерно как человек читает смазанный текст. Поэтому низкое разрешение картинки — не фатальная проблема. И тут напрашивается вопрос: не захочет ли теперь Anthropic тарифицировать «плотные» изображения по отдельному, более дорогому тарифу — под предлогом вроде «улучшили качество распознавания, чтобы ваш код с картинок читался лучше».
npx pxpipe-proxy ANTHROPIC_BASE_URL=http://127.0.0.1:47821 claude
— и Claude Code работает через прокси прозрачно, без единой правки в клиенте. На встроенном дашборде видно экономию токенов в реальном времени и можно сравнить оригинал с тем, что реально увидела модель.
Ваш ИИ-агент давно ведёт на вас досье. Каждая сессия Claude Code тихо ложится на диск в JSONL-логах: каждая команда, каждое «проверь», каждый капс в три часа ночи. У меня таких логов накопилось на 200 тысяч слов за полтора месяца — и в какой-то момент стало интересно: а как я вообще выгляжу со стороны машины?
Так родился Prompt Warrior — открытый скилл, который вскрывает этот архив и собирает из него честный психологический портрет того, как вы НА САМОМ ДЕЛЕ общаетесь с нейросетью. И подаёт его так, что скриншотом хочется делиться: с титулом, уровнем и ачивками, как в Стиме. На скрине выше — мой собственный портрет: «Неистовый Командир Терминала 90 уровня, Железная Длань». Летопись, как видите, не щадит никого — даже автора.
Отдельная фишка — «Хроника воина»: короткую биографию по вашим повадкам пишет сама нейросеть, по фактам из профиля. Она заметила, что я почти всё диктую голосом, ругаюсь ночью ровно так же, как днём, и ни разу не открыл план-режим. Выходит пугающе точно и слегка неловко. В хорошем смысле.
Работает это просто: скрипт на чистом Python (только stdlib, ноль зависимостей) читает локальные логи в режиме «только чтение», считает десятки метрик по замороженной шкале SCALE и отдаёт профиль. Дальше агент собирает карточку в стиле старинного гримуара: пергамент, латунь, сургучная печать, иконки с game-icons.net. Формулы у всех одинаковые — так что карточками можно честно меряться с коллегами и выяснять, кто тут настоящий Тиран.
Что скилл вытаскивает из логов. Шесть шкал характера: Ярость, Теплота, Дотошность, Совиность, Нетерпеливость и Кэш-скряга. Цифры, которых вы о себе не знали: индекс оборотня (ночной мат против дневного), точка кипения сессий (на какой реплике случается первая вспышка), частота дабл-текстов, армии призванных субагентов и час суток, в который вы наиболее опасны.
Тут же экономика и арсенал: сколько миллионов токенов сожжено (с дедупликацией повторных записей, как в ccusage), кэш-эффективность, какие инструменты и MCP-серверы в ходу, роли вашего стиля работы — Оператор, Хирург, Археолог или Кукловод — и самая дорогая сессия. У меня, например, одна сессия съела девять миллионов токенов — «Сессия-левиафан», есть за это отдельная ачивка.
Ачивки — как в Стиме, только честнее. Их 74, четырёх редкостей, у каждой своя иконка, а условие получения всплывает при наведении. От простого «Клуба ста» (сто реплик в корпусе) до легендарного «Тирана» — это когда негатива в десять раз больше, чем похвалы, — и «Гутенберга» за 25 миллионов сгенерированных токенов. Пороги заморожены, даром не даётся ни одна. Сразу показываются только legendary и epic, остальные — под спойлером, чтобы не превращать карточку в простыню.
Аватар-монстр в шапке — тоже локальный: собирается офлайн из PNG-слоёв по вашему титулу и эволюционирует, когда меняетесь вы. Никаких нейрогенераций по API — детерминированная сборка, у одного титула всегда одна морда.
Про ДНК проекта. Весь скилл — от первой метрики до последней иконки — собран за одни сутки в диалоге с Claude: он и статистику по своим же логам считал, и дизайн гримуара рисовал, и сам себя потом тестировал с нуля как «свежий пользователь». Финальный штрих вышел рекурсивным: карточку про то, как я командую нейросетью, собрала та самая нейросеть, которой я командовал.
Это не только цирк с ачивками. В конце карточки — разбор сильного и слабого строго по вашим цифрам, и к каждой слабости приложен фикс со ссылкой на исследование или документацию Anthropic. А в базе скилла лежит отдельный список развенчанных мифов промпт-инженеринга — про «магические» приёмы, которые на качество ответов не влияют, только жгут токены.
Установка — самый ленивый способ: в README лежит готовый промпт, вставляете его в Claude Code целиком, и агент сам клонирует репозиторий, прогонит анализ и откроет карточку в браузере. Руками тоже просто: git clone в папку скиллов (~/.claude/skills/), потом сказать агенту «построй мой промпт-профиль» — получите HTML-карточку на русском или английском, виджет и разбор с рекомендациями. Claude Code поддержан из коробки; форматы логов Codex CLI, OpenCode, Gemini CLI и GitHub Copilot задокументированы в репо — идею можно перенести на любой харнесс.
Всё локально, приватно и бесплатно: ни одного сетевого вызова, ни ключей, ни телеметрии — логи не покидают вашу машину, код открыт под MIT. Профиль запоминается локально: вернётесь через неделю — увидите новые ачивки, левел-апы и сдвиги метрик. Никакой пользы для бизнеса, чистое удовольствие: узнать, что ты «Полуночный Верховный Ревизор с Коротким фитилём», — бесценно.
Наткнулся на проект, который превращает рабочий стол в живой 2.5D-офис с ИИ-сотрудниками — и это не скринсейвер. BagIdea Office рендерит уютный пиксельный опенспейс прямо позади иконок Windows, а «сотрудники» в нём — полноценные агенты на Claude Code: они реально выполняют задачи, пишут отчёты, делегируют друг другу работу и собираются на летучки. За окнами офиса меняется погода и время суток.
Главная фишка — каждому агенту можно выдать свою «голову»: CEO крутится на Claude, дизайнер на GLM, аналитик на DeepSeek, а кто-то вообще на локальной модели через Ollama. Поддерживаются Claude, GLM, DeepSeek, Qwen, Kimi, OpenAI, Gemini, Groq и другие провайдеры — переключается в пару кликов, с индикатором расхода контекста.
Поручения раздаются через круглый чат-оверлей: пишешь CEO — тот сам решает, кому из команды делегировать, или обращаешься к конкретному сотруднику напрямую. Есть 3D-редактор, чтобы перестроить офис под себя: комнаты, мебель, планировка. Система плагинов с установкой прямо с GitHub: брифинг-панель с утренней сводкой, музыкальный плеер, калькулятор, доска настроения команды. Для консольщиков — полноценный CLI: bagidea ask «вопрос», bagidea chat с конкретным агентом, отчёт по активности и расходам за 7 дней.
Управлять офисом можно даже не глядя на рабочий стол — через Telegram, Discord или LINE. Проект открытый, работает на Windows, macOS и Linux, активно развивается: 130+ звёзд за месяц, релизы выходят почти ежедневно.
Схема стандартная: мне нужно было выкатить наружу очередной сервис из своего хоумлаба (дашборд Grafana, внутреннее API, музыкальный сервер - неважно). Я открывал админку Cloudflare, создавал туннель, прописывал DNS-запись, настраивал политики Zero Trust Access, копировал ID туннеля, генерировал конфиг, устанавливал службу на сервер и со спокойной душой закрывал вкладку. Первые несколько раз меня это вообще не парило.
Примерно на пятом сервисе до меня дошло: я больше не настраиваю инфраструктуру. Я исполняю ритуал.
И я задался вопросом нафига я вообще это делаю руками? У Cloudflare есть отличный API. Всё, по чему я кликаю мышкой в красивом (не очень) интерфейсе, в конечном итоге превращается в обычный HTTP-запрос. Так почему весь этот адский воркфлоу нельзя упаковать в одну единственную команду?
Так родился проект cfzt.
Изначально это не планировалось как какой-то коммерческий продукт или крутой опенсорс. Мне просто хотелось перестать страдать фигнёй по выходным.
Идеальная цель выглядела так:
zt up grafana 3000
И всё. За этими четырьмя словами утилита сама создаёт туннель Cloudflare, настраивает правила ингресса, регистрирует DNS, вешает авторизацию через Zero Trust Access, ставит демона в систему и запоминает состояние, чтобы потом всё это можно было чисто удалить одной командой.
Команда выглядит крошечной. Объём работы под капотом - огромный. И, как выяснилось позже, это была самая простая часть.
Процесс от init до поднятия туннеля
Дело было не в Cloudflare
Самое забавное, что я вообще не пытался заменить Cloudflare. Скорее наоборот.
Cloudflare Tunnel - это одна из тех штук, которая при первом знакомстве кажется чистой магией. Твой сервер может сидеть за NAT, за жёстким провайдерским CGNAT, вообще где угодно, но он всё равно будет доступен из интернета без единого открытого входящего порта на роутере.
Добавь сверху zero trust - и бах! Каждый твой внутренний сервис по дефолту защищён нормальной авторизацией, привязан к identity-провайдеру и еще сертификат насыпают на сдачу.
База просто монументальная. Проблема была во всём том, что её окружало. Каждый новый чих требовал повторения одного и того же алгоритма:
- Создать туннель.
- Прописать DNS-запись.
- Настроить Ingress rule.
- Создать приложение в Access.
- Привязать к нему политику доступа.
- Сгенерировать конфигурационный файл.
- Установить системную службу на сервере.
- Запустить её.
Ни один шаг сам по себе не сложен. Они просто… нудные. И хуже всего была даже не потеря времени, а ментальная нагрузка. А я точно создал DNS? А access включить не забыл? Какой туннель держит этот домен? А если я его удалю, ничего не сломается?
В хоумлабе и так хватает хаоса, чтобы ещё держать в голове весь этот чек-лист деплоя.
И я подумал: а что, если бы публикация сервиса в сеть была такой же простой, как запуск Docker-контейнера?
Docker внутри устроен невероятно сложно, но его интерфейс скрывает весь этот ужас от пользователя. Ты пишешь команду - Docker разбирается со всем остальным. Это и стало главной фишкой cfzt: не плодить миллион галочек и настроек, а сделать стандартный путь банальным и скучным.
За одной строчкой скрывается куча работы с API, но пользователю до этого не должно быть никакого дела. Сложность должна оставаться внутри инструмента. Мне кажется, создателям современного софта для инфраструктуры стоит почаще выбирать именно такой подход.
Фича, которую никто не заметит
Ирония в том, что больше всего я горжусь функцией, которую пользователи, надеюсь, никогда не увидят. Это роллбэк или откат по-нашему.
Инструменты автоматизации обожают ломаться на середине пути. То API Cloudflare выдаст rate limit, то сессия протухнет, то один запрос пройдёт, а следующий за ним упадет с ошибкой. В итоге у вас остаётся полурабочее нечто:
- Туннель вроде создался, но до него не достучаться.
- DNS-запись смотрит в никуда.
- В панели access висит приложение для сервиса, которого уже нет.
Убирать это дерьмо руками несложно, но выбешивает знатно.
Я хотел, чтобы cfzt работал иначе. Любой деплой - это транзакция. Если все шаги прошли успешно - сервис онлайн. Если споткнулись хоть на одном этапе - утилита автоматически сносит всё, что успела насоздавать до этого момента. Никаких осиротевших ресурсов и никакого гадания в веб-морде Cloudflare, что там надо подчистить.
Звучит очевидно? Да. На практике же пришлось детально логировать каждый чих к API, записывать ID каждого созданного ресурса и писать под них логику удаления. Зато теперь я могу запускать утилиту и не бояться, что она оставит после себя кучу мусора. Лучший откат - это тот, о котором тебе не пришлось думать.
Но откат шага в своей проге это не то же, что откат на стороне cloudflare...
А потом я почитал логи...
В какой-то момент проект дошёл до стадии, когда пилить фичи надоело и я начал просто пользоваться утилитой каждый день. Вот тут-то и полезли самые интересные артефакты.
Как-то вечером после очередного деплоя я заглянул в логи и заметил странное: cloudflared (официальный демон Cloudflare) внезапно переключился с протокола QUIC на старый добрый HTTP/2.
Вообще, это штатное поведение. QUIC работает поверх UDP, и если с UDP что-то идёт не так (роутер ребутнулся, Wi-Fi мигнул, провайдер решил подрезать пакеты) - туннель автоматически падает в фоллбэк на HTTP/2 поверх TCP, чтобы связь вообще не оборвалась.
Странно было другое. Он никогда не переключался обратно.
Подождите... Это что, навсегда?
Сначала я подумал, что чего-то не понимаю в работе туннелей. Ну, наверное, он проверяет сеть раз в пару минут? Или есть скрытая настройка?
Я сидел и караулил логи. Прошёл час, два. Туннель работал идеально, трафик шёл, но намертво сидел на TCP.
Я перерыл официальную документацию - тишина. Пошёл штурмовать гитхаб. И бинго! Нашёл старый тикет, где чувак жаловался ровно на то же самое. Логика у демона Cloudflare простая: если туннель один раз упал в HTTP/2, он больше никогда не попытается вернуться на быстрый QUIC. Только если полностью перезапустить сам процесс ручками. И баг этот висел в issues в официальном репозитории уже очень давно.
Выбора было два: либо смириться и ждать, пока пацаны из Cloudflare это починят (спойлер: можно не дождаться), либо костылить обходной путь. Я выбрал второй вариант.
Пишем вочдог вместо патча
Лезть в исходники самого cloudflared, форкать его и пересобирать сетевой стек ради одного бага - так себе идея. Поэтому я посмотрел на задачу проще: какие данные у меня реально есть на руках?
Ответ оказался банальным: при переходе с QUIC на HTTP/2 демон пишет в stderr конкретную строчку. Всё, это и есть наш API! Зачем анализировать пакеты или пинговать порты, если можно просто читать логи процесса?
План получился такой: cfzt запускает туннель и начинает грепать его логи на лету. Как только ловим строчку о фоллбэке, запускается таймер. Мы не рубим процесс сразу - вдруг сеть ещё штормит. Выжидаем паузу, и если туннель всё ещё на HTTP/2 - тихонько дергаем службу.
При перезапуске cloudflared снова пытается инициировать модный QUIC. Если UDP всё ещё лежит - ок, он опять упадёт в HTTP/2. Наш вочдог это увидит и увеличит таймер ожидания: 10 минут, 20, 40... В итоге шаг баг-оффа упирается в 1 час. Мы не боремся с сетью, мы просто даём туннелю шанс очухаться, когда шторм пройдёт.
Выглядит этот «инженерный фикс» до смешного просто. Вот кусок кода на Go, который закрыл эту проблему раз и навсегда:
// Строка, которую выплёвывает Cloudflare, когда сдается и уходит на TCP
const FallbackSignal = "Failed to connect to the edge over QUIC, falling back to HTTP2"
log.Warn("Обнаружен откат с QUIC на HTTP/2. Запускаем вочдог.")
// Ждём, пока сеть стабилизируется
time.Sleep(backoff)
// Триггерим мягкий перезапуск процесса
restartTrigger <- true
// Экспоненциальный шаг ожидания (максимум до 1 часа)
backoff = min(backoff * 2, 1 * time.Hour)
}
}
}
Решение не претендует на учебники по Computer Science, но оно работает. Теперь, если посреди ночи роутер решит обновиться, утилита подхватит этот момент, переждет грозу и молча вернет туннель на быстрый протокол.
Чему меня научил этот проект
Я начинал писать эту утилиту просто потому, что мне надоело кликать по кнопкам в браузере. В итоге я несколько недель залипал в жизненные циклы процессов, парсинг логов и логику сетевых фоллбэков.
И в этом вся прелесть создания своих инструментов для автоматизации (переизобретенных велосипедов, если хотите). Ты берёшь мелкую бытовую проблему, думаешь: да ладно, сейчас набросаю тонкую CLI обертку за пару часов в субботу. Но как только ты пытаешься сделать интерфейс по-настоящему простым для пользователя, тебе приходится впитать в свой код всю ту сложность, которую разработчики платформы оставили за бортом.
Ты пишешь транзакционный откат, чтобы не разгребать полуживое состояние руками. Ты пишешь вочдог, чтобы не думать о моргающем интернете.
Интерфейс остается крошечным. Инструмент делает всю грязную работу. Ритуал наконец-то разрушен.
Теперь, когда мне нужно поднять новый сервис, я не открываю пять вкладок в браузере. Я просто пишу в консоли:
$ zt up grafana 3000
✔ Creating Cloudflare Tunnel... Done.
✔ Provisioning DNS records... Done.
✔ Setting up Zero Trust Access policies... Done.
✔ Launching background service with QUIC... Done.
Service is live at https: //grafana. yourdomain. com
И спокойно иду пить кофе. Потому что инфраструктура, черт возьми, должна быть скучной.
Ссылка на проект
Если вам тоже надоел этот бесконечный марафон по дашбордам Cloudflare ради домашнего сервера или стейджинга - проект полностью открыт, пользуйтесь.
Буду рад фидбеку. Ломайте, тестируйте, закидывайте ишью или предлагайте фичи. Если утилита сэкономит вам пару минут на выходных - значит, все это было не зря. Только не просите меня добавлять в CLI новые кнопки. Я написал его как раз для того, чтобы их больше никогда не видеть.
Я как любитель хоумлабинга и хранитель локалнета решил организовать себе локальную DNS зону, чтобы не печатать длинные ip адреса и не редачить hosts на всех машинах. После долгого простоя решил возобновить работу сервака. Накатил CentOS (роутер в DHCP прописал его как ubunu-server, ну и ладно), взял в помощь Алису, и провел вечер за настройкой bind2.
Через пару дней решил сделать pet-проект, чтобы прокачаться в go разработке, пошел за идеей к Алисе. Та запомнив, что я недавно ставил DNS предложила сделать свою реализацию (без блэкджека и всякого такого, и вообще РКН версию DNS сервера полностью урезанного интернета). Идея понравилась, но решил сделать с возможностью удобной конфигурации, раз уж начал.
За основу взял пакет github.com/miekg/dns и изучил блог разработчика (там есть примеры кода). Начал разбираться что и к чему. Под ночь мне уже не хотелось копаться в RFC, изучать термины и флаги сообщений к серверу, а просто сделать так, чтобы все заработало минимально.
Изначально я собирался хранить в базе пару name-ip, но потом вернулся к проектированию, чтобы дать возможность определять локальные зоны и отсекать по NXDOMAIN без опроса вышестоящих DNS. Добавил кэширование, но пока TTL срабатывает во время проверки, надо бы прикрутить time.AfterFunc удаление.
Настройку и управление зонами решил организовать в веб-интерфейсе. Навайбкодил с первого выстрела веб-интерфейс (надо бы еще туда базовую авторизацию добавить хотя бы, но можно упороться и сделать систему токенов для сторонних приложений)
Страница со списком зон
Модалка для добавления зон
Проваливаемся в зону
Добавляем домен
Конечно, навайбкожено на скорую руку, но планирую сделать ввод только домена, а зону приклеивать позже. Еще желательно прикрутить валидации с опорой на тип записи.
Запустил
Пример запроса DNS
Проект доступен в github: https://github.com/vesh95/dnso Про имя проекта не спрашивайте, это я когда вводил имя случайно ввел лишний символ, решил оставить.
Если что-то сделано неправильно или увидели проблему - пишите в gh issues или комментариях. Может у кого-то появятся советы и рекомендации, дайте знать 😊
TODO - На данный момент есть проблемы с командами запуска докера (напутаны порты для запуска и те что пробрасываются, см. переменные окружения, чтобы запустить с нужными) - Переделать форму, чтобы указывать домены без зоны - Добавить авторизацию в интерфейсе - Добавить валидации