четверг, 17 июля 2025 г.

Wildcard SSL сертификат

Понадобилось сгенерировать wildcard SSL сертификат и раскладывать его по пространствам имён в Kubernetes кластере. Этот сертификат будет использоваться в тестах которые выполняются для набора приложений на каждый запрос на слияние.

В cert-manager настроен ClusterIssuer LE с валидацией через DNS01. Выпуск wildcard сертификата у Let's Encrypt поддерживается только через DNS валидацию и протокол ACMEv2. В примере использован сервис Cloud DNS от Google Cloud Platform.

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-production
spec:
  acme:
    email: certificates@example.com
    privateKeySecretRef:
      name: letsencrypt-production
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
    - dns01:
        cloudDNS:
          project: GCP_PROJECT_ID

Манифест для wildcard сертификата (сам сертификат и ключ будут созданы в пространстве имён cert-manager)

вторник, 15 июля 2025 г.

Привилегии приложений в контейнерах

Хорошей практикой является принцип наименьших привилегий (давать только те права которые нужны для выполнения задачи). На практике разработчики зачастую идут путём наименьшего сопротивления и копируют "рецепты" из интернета.

Далее несколько частых случаев с которыми мне доводится сталкиваться и варианты их решения.

Прослушивание портов ниже 1024

Если программа требует повышения привилегий для прослушивания портов 80 и 443 (или любых других до 1024), то можно изменить конфигурацию для прослушивания портов выше 1024 (например 8080 и 8443), а на балансировщике сделать преобразование портов. Если переназначение портов невозможно, то можно воспользоваться Linux capabilities и выдать только CAP_NET_BIND_SERVICE вместо выдачи прав пользователя root.

воскресенье, 13 июля 2025 г.

Ремонт Amazon Kindle 4

 Купил на барахолке Kindle 4 с разбитым экраном, который послужил донором материнской платы для моего Kindle, который перестал включаться (скорее всего из-за износа внутренней памяти, но это не точно).

Слева это донор с барахолки, а справа - уже разобранный реципиент у которого виднеется отладочный провод UART. Донор включался и у него работала неповреждённая часть экрана.

Для ремонта использовал инструкцию по замене материнской платы с сайта iFixit.com, дополнительно стоит посмотреть инструкцию по замене экрана.

суббота, 12 июля 2025 г.

Java программа не видит переменных окружения с точкой в имени

 Столкнулся с интересной проблемой когда внедрял сборку контейнеров под ARM64 процессоры. Есть программа на Java контейнер которой использовал образ "eclipse-temurin:17-jre-alpine" в качестве базового. Для этого базового образа отсутствует вариант для платформы linux/arm64 и стоял вопрос что безопаснее сделать:

  • перейти на "eclipse-temurin:17-jre-noble" который использует Ubuntu вместо Alpine
  • перейти на "eclipse-temurin:21-jre-alpine" который влечёт обновление Java с 17 на 21

Разработчик выбрал первый вариант (перейти на "eclipse-temurin:17-jre-noble"), т.к. обновление версии Java выглядит рискованным (может повлечь неожиданные эффекты в какой-либо из библиотек) и требует полного цикла тестирования которое провести сейчас нет возможности.

Я также считал что замена Alpine на Ubuntu при сохранении версии Java является менее рискованным, хотя и повлечёт увеличение размера образа контейнера и возможные риски из-за замены musl на libc (хотя я не особо верю в вероятность таких неприятностей). Забегая вперёд, мы потратили несколько часов разбираясь почему программа перестала запускаться.

четверг, 10 июля 2025 г.

Рассинхронизация звука и видео в LibreELEC 12

 Какое-то время назад обновил домашние HTPC с LibreELEC 9.x на 12.x ради возможности смотреть YouTube на большом экране (отправляю ссылку с телефона на нужный HTPC через Kore). Сейчас в строю два HTPC - один собран на базе Gigabyte BRIX, а второй был на базе Raspberry PI 3B. Вот на втором из них и начались проблемы с синхронизацией звука и видео - спустя 10 минут звук начинал спешить, а через пол-часа уже невозможно смотреть.

Я пробовал менять настройки вывода звука, но заметного эффекта это не дало. Нагрузка на процессор была около 40% это не выглядело как нехватка ресурсов. В логе Kodi никаких интересных записей не нашлось.

На прошедших выходных занялся этой проблемой и заменил Raspberry PI 3B, на Raspberry PI 4. Насколько я могу судить по нескольким дням использования, проблема с синхронизацией больше не проявлялась.

среда, 9 июля 2025 г.

Держатель аккумуляторов для Zoyi ZT-DQ02

Для измерения внутреннего сопротивления аккумуляторов или иных источников питания Zoyi ZT-DQ02 комплектуется зажимами в виде крокодилов. Их удобно использовать для измерения выводных источников питания (например аккумулятор 18650 с приваренными лепестками). Если стоит задача быстро проверить десяток обычных ячеек, то гораздо быстрее будет использовать специализированный держатель.

Разъём для измерения внутреннего сопротивления у ZT-DQ02 это авиационный XS10-4P. Назначение пинов XS10-4P взял от штатного провода с крокодилами:

  1. положительный вывод
  2. положительный вывод
  3. отрицательный вывод
  4. отрицательный вывод

Какой-либо разницы по какому из них подаётся измерительный сигнал, а с какого считываются показания, по сути нет.

воскресенье, 6 июля 2025 г.

Исправление ошибки QIDIStudio при отправке на печать

Если отправить модель на печать напрямую из QIDIStudio, то программа аварийно завершится.

Чтобы этого не случалось QIDI рекомендует добавить несколько переменных окружения

$ export WEBKIT_DISABLE_COMPOSITING_MODE=0
$ export WEBKIT_DISABLE_DMABUF_RENDERER=0
$ ./QIDIStudio_1.10.02.76_Linux_Ubuntu_20.AppImage

В описании этого способа указано что будет работать только в Ubuntu 24, но на самом деле отлично работает в Debian 12.

Альтернативный варианты:

  • добавить в адрес принтера порт 7125, но перестанет работать подключение к Fluidd из QIDIStudio.
  • Сохранять файл gcode на флешку и запускать печать с принтера.