en
Feedback
#corpix

#corpix

Open in Telegram
386
Subscribers
No data24 hours
No data7 days
No data30 days
Posts Archive
Личным проектам пока уделяю меньше времени, подался в цифровое кочевничество на неопределенный срок. Хотя, есть у меня кое-чего интересное про метрики и ClickHouse, скоро выложу :) Ищу контракт на удалёнку. Умею в Go, Linux, люблю делать инструменты. CV https://corpix.dev/about.html

За время затишья я пофиксил множество неприятных багов в Terraform провайдере для NixOS. Что позволило мне наконец-то закончить пост в бложик, в котором постарался разложить по полочкам все доступные настройки и их смысл: https://corpix.dev/2022/08/terraforming-nixos-hosts.html Terraform SDK очень переусложненная и хрупкая вещь. Например в виду ограниченной модели не получилось сделать слияние опций, указанных на уровне провайдера и ресурса (deep merge). Причины две: - невозможно отличить дефолтное значение опции от указанного пользователем - баги при вычислении diff'а между заданными пользователем и сохраненными в Terraform state вложенными структурами Проблемам годы. Но даже не смотря на это кажется получилось неплохо.

Упаковал Tarantool под NixOS и поставил эксперимент с поддержкой Fennel для написания кода под этот рантайм. Деривация + серв
+2
Упаковал Tarantool под NixOS и поставил эксперимент с поддержкой Fennel для написания кода под этот рантайм. Деривация + сервис-модуль для NixOS доступны по ссылке. Fennel интересен тем что это по сути минималистичный диалект lisp'а, компилирующийся в Lua, доступный соответственно везде где есть Lua. Еще примечательно что его можно собрать в бинарник засчет luajit (правда по настоящему статический бинарь у меня получить пока не вышло). Трэд про эти эксперименты у меня в твиттере. #nix #fennel #tarantool

Набросал минималистичное окружение для запуска SBCL (Common Lisp) с Quicklisp, Slynk и вендорингом из коробки. https://github.com/corpix/xcl Это окружение можно будет отвязать от SBCL в будущем, добавив параметров и выделив в отдельный flake (способ реиспользования кода в Nix сообществе). Но потом :)

Вкатываюсь тут еще в ведение заметок с использованием Emacs. Друг посоветовал zetteldeft, который умеет строить базу знаний по тэгам & ссылкам и искать по созданной базе. Каждая заметка создается в отдельном файле внутри директории с плоской структурой. В моем случае все заметки лежат в отдельном git репозитории. Пока не могу сказать что распробовал, но выглядит интересно. С таким подходом можно сделать платформу для публикации заметок & статей, быть может это будет более простой заменой для Frog, которым я сейчас пользуюсь для ведения https://corpix.dev Параллельно с этим понадобилось иметь доступ репозиторию с заметками из всех инстансов Emacs, которых у меня может быть запущено несколько (по 1 на каждый проект). И т.к. я использую для разработки песочницы (из которых есть весьма ограниченный доступ к файловой системе) потребовалось поддержать несколько конфигураций для инструмента, который эти песочницы создает. #emacs #zettelkasten #nix

Про терраформ провайдер готовлю большой пост (чтобы заявить об инструменте в сообществе и рассказать о замысле). Но он задерживается, нужно инфраструктурку настроить (с). Поэтому я сейчас пробую Agola CI. Первые впечатления весьма приятные, этот сервис удобно кастомизировать. Код написан на Go и на мой вкус структура всего проекта проста, а мне как раз нужны генерируемые из кода пайплайны (я ненавижу писать YAML) и собираюсь добавить поддержку Nix (в качестве источника для конфигурации), скорее всего это не составит большого труда, парсинг конфигурации очень простой. А еще он интегрируется с Gitea, которую я также использую в своей инфраструктуре. Оба сервиса я уже развернул и написал для них соответствующую конфигурацию. AgolaCI понадобилось "опакетить" и сделать к ней модуль для конфигурирования, ими я с радостью поделюсь. Но для этого всего нужна авторизация. У меня есть (собственная) реализация сервиса для решения таких задач. Что-то типа oauth2-proxy на стероидах, в котором я экспериментирую с источниками данных о пользователях (от oauth2 & OIDC до клиентских сертификатов). Я собираюсь выложить его в опенсорс и рефакторю прямо сейчас. В процессе я избавляюсь от гошного фреймворка echo (для моих потребностей его гибкости мало) и унифицирую код, создавая свой собственный SDK. Пока я делаю это исключительно для своих собственных проектов, чтобы избавить их от копипаста, который (порой в безобразных количествах) кочует от проекта к проекту. Работы навалом 😱

Выпустил релиз 0.0.8 с поддержкой провайдеров секретов. На данный момент поддерживаются: - gopass - command - filesystem (используется по умолчанию) Пример использования можно подсмотреть в тестах. Помимо этого сделал вывод stderr от nix в логи (включаются указанием переменной окружения TF_LOG=INFO). Это нужно чтобы смотреть за прогрессом. Пока считаю эту фичу сомнительной, буду искать решение получше (чертов Terraform задизайнен так что на экран просто так ничего не напечатаешь). #nixos #terraform

Некоторое время у меня был аддон для NixOS в виде модуля, предоставляющего более высокоуровневый интерфейс к фаерволу. Я испо
+1
Некоторое время у меня был аддон для NixOS в виде модуля, предоставляющего более высокоуровневый интерфейс к фаерволу. Я использовал его на протяжении нескольких лет чтобы "пробивать дырки" для своих хостов. Сегодня в процессе рефакторинга инфраструктуры я сильно сократил и переработал этот модуль, так что теперь его даже не стыдно показать. А на скриншотах показаны входные данные и правила, которые генерируются в результате. #nixos #iptables

Релиз terraform провайдера пока отложил (еще пару дней), хочу попользоваться им какое-то время, чтобы ничего не поломать. Одн
+3
Релиз terraform провайдера пока отложил (еще пару дней), хочу попользоваться им какое-то время, чтобы ничего не поломать. Одновременно с этим хочу обновить свою инфраструктуру. У меня есть два сервера, как на фото. Они старые (лет 10), повидавшие жизнь. Хочу сделать NAS в корпусах открытого типа и разобраться в FreeCAD. Показываю скриншоты процесса (модели оборудования не мои, нашел на grabcad). Вот кстати крутой тур, который "ставит мозги на место".

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

Сделал начальную поддержку секретов. Пока без шифрования (слижком много всего хочется поддержать, так что ограничимся минимумом в этой версии). Внутри реализовано через упаковку указанных секретов в tar архив (с указанием owner+group+permissions), передачу по SSH и распаковку в корневой каталог. Референсы: - Реализация - Документация #nixos #terraform

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

Опубликовал первую версию Terraform провайдера для NixOS. https://registry.terraform.io/providers/corpix/nixos/0.0.2 Некоторые идеи (такие как поддержка SSH bastion'ов) взяты из модуля от Tweag, но я считаю что мой провайдер лучше, как минимум потому что он написан на нативном для Terraform языке - Go, а не на ограниченном в своих возможностях HCL. Документации не так много, но есть: 1) Деплой в vultr 2) Минимальные интеграционные тесты 3) Референс на сайте реестра Terraform (силами Hashicorp заблокирован для РФ)

Сегодня получился короткий стрим про возню вокруг libuv. Подключил обработку входящих соединений с вызовом коллбэка при наличии данных для чтения в сокете. Это начальная реализация. На днях обработаю дисконнекты и создание канала, в который пользователю можно будет что-нибудь написать. Сервер немного причесал за кадром, отделив основную логику диспетчеризации, и упростив себе управление ресурсами за счет создания контекстов (обычные struct с полями и функциями для инициализации и финализации(free)). Это позволило мне добавить libuv как бы отдельным слоем, почти не меняя кода.

Первая попытка стримить в телеграм. Эта штука не анонсировалась здесь, но я пытаюсь сделать кастомный ssh сервер с использованием libssh. Сначала на C чтобы понять как взаимодействовать с libssh на низком уровне. Позже получившийся код будет переписан на CommonLisp+CFFI в неблокирующем стиле.

Заметка на тему совместного редактирования текста/кода в Emacs с использованием пакета crdt.el https://corpix.dev/2022/02/collaborative-editing-with-emacs.html На мой вкус работает неплохо, но есть шероховатости. Например SLY (читай: Lisp IDE) REPL получилось пошарить, но хост коллаборативной сессии писать там ничего не может.

Немного удивляюсь что пишу такое, но в виду огромного количества облачных сервисов мы начали забывать как настраивать необходимые сервисы без них, а инструкции все чаще выглядят магическими и все больше напоминают знаменитую картинку "как нарисовать сову". Например, как выпустить сертификат через Let's Encrypt без облачного DNS? Мы на работе для инфраструктурного кластера используем Knot DNS. И было немного удивительно что никто еще не написал статью, описывающую концептуально: 1) как сделать динамический DNS на его основе и 2) выпускать сертификаты с DNS-01 аутентификацией используя knsupdate. Исправляю ситуацию https://corpix.dev/2022/02/using-certbot-with-knot-dns-knsupdate.html

Написал простенький docker registry на go. В основном сделано для упрощения распространения контейнеров на NixOS системы, где конфигурация системы и деплоймент контейнеров производятся через nix. Но я заложил возможность добавить дополнительные provider'ы данных в будущем. Как этот реестр использовать: - сохраняем (через docker save) один или несколько контейнеров в tar.gz - распаковываем этот tar.gz в отдельную директорию (например ./example) - добавляем контейнер в конфигурацию local provider как указано в readme (config.yml) в виде "example:latest": "./example" - запускаем unregistry с обновленной на предыдущем шаге конфигурацией - можем сделать docker pull 127.0.0.1:5000/example:latest Репозиторий https://github.com/corpix/unregistry Хайлайты по реализации: - regexp'ы для матчинга endpoint'ов - обработка запросов - реализация обработчиков local provider - preload и индексирование данных о слоях

Экспериментирую с DSL для описания SQL в виде s-expressions. На картинке пример SELECT, который поддерживает только указание
Экспериментирую с DSL для описания SQL в виде s-expressions. На картинке пример SELECT, который поддерживает только указание колонок и таблицы. В процессе метания между диалектами схемы и common lisp переписывал свой клиент к clickhouse по нескольку раз и мне это немного надоело, хочу попробовать упростить себе жизнь, сделав несколько макросов, которые позволят расширять DSL без изменения кода самой библиотеки. На подобный подход вдохновило изучение исходников https://common-lisp.net/project/iterate/ Полный листинг: https://github.com/corpix/clx/blob/27b41762ea82377452f14e5fc60fa6a674b8f7ad/src/sql.lisp#L9 Кстати, у меня есть twitter, где я пишу почаще https://twitter.com/iamcorpix

Сделал генератор парсеров, правила для которого описываются в стиле вдохновленном BNF (примеры в последней ссылке, там тесты) https://github.com/corpix/gerbilstd/blob/109484967695565607da43b1b2032810a97cbd1b/encoding/bnf.ss https://github.com/corpix/gerbilstd/blob/109484967695565607da43b1b2032810a97cbd1b/encoding/bnf-test.ss Внутри устроено все очень тупо: макрос, который преобразует правила в функции, через которые пропускается объект состояния парсера, а он при наличии совпадения уже мутируется (увеличивается счетчик позиции, поглощается сматченный кусок буфера). Реализовано под https://cons.io (называется Gerbil Scheme, это мета-диалект на Gambit-C). Перебрался на него с Racket пока искал более быструю реализацию Scheme.