#corpix
Open in Telegram
Пишу о своих проектах. - https://corpix.dev - https://twitter.com/iamcorpix
Show more386
Subscribers
No data24 hours
No data7 days
No data30 days
Posts Archive
386
Личным проектам пока уделяю меньше времени, подался в цифровое кочевничество на неопределенный срок. Хотя, есть у меня кое-чего интересное про метрики и ClickHouse, скоро выложу :)
Ищу контракт на удалёнку.
Умею в Go, Linux, люблю делать инструменты.
CV https://corpix.dev/about.html
386
За время затишья я пофиксил множество неприятных багов в Terraform провайдере для NixOS.
Что позволило мне наконец-то закончить пост в бложик, в котором постарался разложить по полочкам все доступные настройки и их смысл:
https://corpix.dev/2022/08/terraforming-nixos-hosts.html
Terraform SDK очень переусложненная и хрупкая вещь. Например в виду ограниченной модели не получилось сделать слияние опций, указанных на уровне провайдера и ресурса (deep merge).
Причины две:
- невозможно отличить дефолтное значение опции от указанного пользователем
- баги при вычислении diff'а между заданными пользователем и сохраненными в Terraform state вложенными структурами
Проблемам годы. Но даже не смотря на это кажется получилось неплохо.
386
Упаковал Tarantool под NixOS и поставил эксперимент с поддержкой Fennel для написания кода под этот рантайм.
Деривация + сервис-модуль для NixOS доступны по ссылке.
Fennel интересен тем что это по сути минималистичный диалект lisp'а, компилирующийся в Lua, доступный соответственно везде где есть Lua.
Еще примечательно что его можно собрать в бинарник засчет luajit (правда по настоящему статический бинарь у меня получить пока не вышло). Трэд про эти эксперименты у меня в твиттере.
#nix #fennel #tarantool
386
Набросал минималистичное окружение для запуска SBCL (Common Lisp) с Quicklisp, Slynk и вендорингом из коробки.
https://github.com/corpix/xcl
Это окружение можно будет отвязать от SBCL в будущем, добавив параметров и выделив в отдельный flake (способ реиспользования кода в Nix сообществе). Но потом :)
386
Вкатываюсь тут еще в ведение заметок с использованием Emacs.
Друг посоветовал zetteldeft, который умеет строить базу знаний по тэгам & ссылкам и искать по созданной базе.
Каждая заметка создается в отдельном файле внутри директории с плоской структурой.
В моем случае все заметки лежат в отдельном git репозитории.
Пока не могу сказать что распробовал, но выглядит интересно. С таким подходом можно сделать платформу для публикации заметок & статей, быть может это будет более простой заменой для Frog, которым я сейчас пользуюсь для ведения https://corpix.dev
Параллельно с этим понадобилось иметь доступ репозиторию с заметками из всех инстансов Emacs, которых у меня может быть запущено несколько (по 1 на каждый проект).
И т.к. я использую для разработки песочницы (из которых есть весьма ограниченный доступ к файловой системе) потребовалось поддержать несколько конфигураций для инструмента, который эти песочницы создает.
#emacs #zettelkasten #nix
386
Про терраформ провайдер готовлю большой пост (чтобы заявить об инструменте в сообществе и рассказать о замысле). Но он задерживается, нужно инфраструктурку настроить (с).
Поэтому я сейчас пробую Agola CI. Первые впечатления весьма приятные, этот сервис удобно кастомизировать. Код написан на Go и на мой вкус структура всего проекта проста, а мне как раз нужны генерируемые из кода пайплайны (я ненавижу писать YAML) и собираюсь добавить поддержку Nix (в качестве источника для конфигурации), скорее всего это не составит большого труда, парсинг конфигурации очень простой.
А еще он интегрируется с Gitea, которую я также использую в своей инфраструктуре.
Оба сервиса я уже развернул и написал для них соответствующую конфигурацию.
AgolaCI понадобилось "опакетить" и сделать к ней модуль для конфигурирования, ими я с радостью поделюсь.
Но для этого всего нужна авторизация. У меня есть (собственная) реализация сервиса для решения таких задач. Что-то типа oauth2-proxy на стероидах, в котором я экспериментирую с источниками данных о пользователях (от oauth2 & OIDC до клиентских сертификатов).
Я собираюсь выложить его в опенсорс и рефакторю прямо сейчас.
В процессе я избавляюсь от гошного фреймворка echo (для моих потребностей его гибкости мало) и унифицирую код, создавая свой собственный SDK.
Пока я делаю это исключительно для своих собственных проектов, чтобы избавить их от копипаста, который (порой в безобразных количествах) кочует от проекта к проекту.
Работы навалом 😱
386
Выпустил релиз 0.0.8 с поддержкой провайдеров секретов.
На данный момент поддерживаются:
- gopass
- command
- filesystem (используется по умолчанию)
Пример использования можно подсмотреть в тестах.
Помимо этого сделал вывод stderr от nix в логи (включаются указанием переменной окружения
TF_LOG=INFO). Это нужно чтобы смотреть за прогрессом. Пока считаю эту фичу сомнительной, буду искать решение получше (чертов Terraform задизайнен так что на экран просто так ничего не напечатаешь).
#nixos #terraform386
Некоторое время у меня был аддон для NixOS в виде модуля, предоставляющего более высокоуровневый интерфейс к фаерволу.
Я использовал его на протяжении нескольких лет чтобы "пробивать дырки" для своих хостов.
Сегодня в процессе рефакторинга инфраструктуры я сильно сократил и переработал этот модуль, так что теперь его даже не стыдно показать.
А на скриншотах показаны входные данные и правила, которые генерируются в результате.
#nixos #iptables
386
Релиз terraform провайдера пока отложил (еще пару дней), хочу попользоваться им какое-то время, чтобы ничего не поломать.
Одновременно с этим хочу обновить свою инфраструктуру.
У меня есть два сервера, как на фото. Они старые (лет 10), повидавшие жизнь.
Хочу сделать NAS в корпусах открытого типа и разобраться в FreeCAD. Показываю скриншоты процесса (модели оборудования не мои, нашел на grabcad).
Вот кстати крутой тур, который "ставит мозги на место".
386
Тестирую поддержку конфигурируемых пользователем провайдеров для предоставления секретов.
Пока поддержал:
- filesystem (читает секреты из указанных файлов)
- command (читает секреты из stdout сконфигурированной команды)
- gopass (читает секректы из инструмента gopass)
На этом пока остановлюсь, этого достаточно для релиза и позволит людям интегрироваться с практически любым инструментом для хранения секретов.
Релиз завтра (нужно еще сгладить шероховатости и попользоваться самому).
Референсы:
- Реализация
- Документация
386
Сделал начальную поддержку секретов.
Пока без шифрования (слижком много всего хочется поддержать, так что ограничимся минимумом в этой версии).
Внутри реализовано через упаковку указанных секретов в tar архив (с указанием owner+group+permissions), передачу по SSH и распаковку в корневой каталог.
Референсы:
- Реализация
- Документация
#nixos #terraform
386
Случился небольшой "ребрендинг". В последнее время это весьма не упорядоченный рабочий журнал, так что я собираюсь немного изменить формат.
386
Опубликовал первую версию Terraform провайдера для NixOS.
https://registry.terraform.io/providers/corpix/nixos/0.0.2
Некоторые идеи (такие как поддержка SSH bastion'ов) взяты из модуля от Tweag, но я считаю что мой провайдер лучше, как минимум потому что он написан на нативном для Terraform языке - Go, а не на ограниченном в своих возможностях HCL.
Документации не так много, но есть:
1) Деплой в vultr
2) Минимальные интеграционные тесты
3) Референс на сайте реестра Terraform (силами Hashicorp заблокирован для РФ)
386
Сегодня получился короткий стрим про возню вокруг libuv. Подключил обработку входящих соединений с вызовом коллбэка при наличии данных для чтения в сокете.
Это начальная реализация. На днях обработаю дисконнекты и создание канала, в который пользователю можно будет что-нибудь написать.
Сервер немного причесал за кадром, отделив основную логику диспетчеризации, и упростив себе управление ресурсами за счет создания контекстов (обычные struct с полями и функциями для инициализации и финализации(free)). Это позволило мне добавить libuv как бы отдельным слоем, почти не меняя кода.
386
Первая попытка стримить в телеграм.
Эта штука не анонсировалась здесь, но я пытаюсь сделать кастомный ssh сервер с использованием libssh.
Сначала на C чтобы понять как взаимодействовать с libssh на низком уровне. Позже получившийся код будет переписан на CommonLisp+CFFI в неблокирующем стиле.
386
Заметка на тему совместного редактирования текста/кода в Emacs с использованием пакета crdt.el
https://corpix.dev/2022/02/collaborative-editing-with-emacs.html
На мой вкус работает неплохо, но есть шероховатости. Например SLY (читай: Lisp IDE) REPL получилось пошарить, но хост коллаборативной сессии писать там ничего не может.
386
Немного удивляюсь что пишу такое, но в виду огромного количества облачных сервисов мы начали забывать как настраивать необходимые сервисы без них, а инструкции все чаще выглядят магическими и все больше напоминают знаменитую картинку "как нарисовать сову".
Например, как выпустить сертификат через Let's Encrypt без облачного DNS?
Мы на работе для инфраструктурного кластера используем Knot DNS. И было немного удивительно что никто еще не написал статью, описывающую концептуально: 1) как сделать динамический DNS на его основе и 2) выпускать сертификаты с DNS-01 аутентификацией используя knsupdate.
Исправляю ситуацию https://corpix.dev/2022/02/using-certbot-with-knot-dns-knsupdate.html
386
Написал простенький 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 и индексирование данных о слоях386
Экспериментирую с 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
386
Сделал генератор парсеров, правила для которого описываются в стиле вдохновленном 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.
