fix(forgejo-runner): обычные job-поды доверяют внутреннему CA #146

Merged
grachevko merged 1 commit from fix/runner-default-ca into main 2026-09-23 18:45:55 +00:00
Collaborator

Что было

После переключения адреса в MikroTik имя git.grachevko.ru внутри кластера обслуживает новый шлюз, и его лист подписан внутренним CA. В подах меток ubuntu-latest/default этот CA не смонтирован, поэтому Node-экшены теряют доверие к сертификату и падают:

Flate - Filter → Get Changed Files
::error::unable to verify the first certificate; if the root CA is installed locally, try running Node.js with --use-system-ca

Это первый красный прогон — №100 (до этого, в №98, та же джоба была зелёной, потому что имя смотрело в старый кластер, а там тот же хост отдаёт лист Let's Encrypt — публичный). Ломает любой новый PR, не только конкретный, и той же причиной упрётся следующая за фильтром джоба Flate — её actions/checkout тоже ходит на git.grachevko.ru через Node.

Доказательства (проверено вручную):

  • по SNI: openssl s_client -connect 192.168.1.2:443 -servername git.grachevko.ru → issuer=Let's Encrypt; то же к 192.168.40.11 → issuer=CN=internal-ca;
  • в поде нового кластера: node -e "fetch('https://git.grachevko.ru/api/v1/version')" → fetch failed, а с NODE_EXTRA_CA_CERTS=/etc/ssl/internal-ca/ca.crt → код 200.

Что правит PR

В podspec-default.yaml (метки ubuntu-latest и default) добавляется то, что у podspec-dind уже есть:

  • том из ConfigMap internal-ca смонтирован в /etc/ssl/internal-ca (readOnly);
  • NODE_EXTRA_CA_CERTS и SSL_CERT_FILE — оба на /etc/ssl/internal-ca/ca.crt.

Бандл internal-ca включает и публичные корни (useDefaultCAs), поэтому доступ к GitHub и апстримным реестрам не страдает.

Проверки

  • flate test all -p ./kubernetes/flux/cluster — 125 passed.
  • Блоб в ветке совпал с локальным коммитом: f7d8bbfceff50ad9fde9815ace0cb9d38c838dc6, +18 строк, один файл, других изменений нет.
  • Слов-двойников Unicode в добавленных строках нет (проверено тем же чекером).

Чего ожидать после мёржа

Первым прогоном этот PR будет с красным чеком Flate - Filter: проверка ломается ровно той причиной, которую лечит, — исправленный podspec начнёт действовать только с момента мёржа. После мёржа перезапуск любого прогона должен становиться зелёным; проверю первым же.

Заодно после этого MR: PR #145 придётся перебазировать (оба трогают этот файл), а из воркфлоу сборки образа в container-images можно убрать собственный NODE_EXTRA_CA_CERTS — это отдельной правкой, когда захочешь.

## Что было После переключения адреса в MikroTik имя `git.grachevko.ru` внутри кластера обслуживает новый шлюз, и его лист подписан внутренним CA. В подах меток `ubuntu-latest`/`default` этот CA не смонтирован, поэтому Node-экшены теряют доверие к сертификату и падают: ``` Flate - Filter → Get Changed Files ::error::unable to verify the first certificate; if the root CA is installed locally, try running Node.js with --use-system-ca ``` Это первый красный прогон — №100 (до этого, в №98, та же джоба была зелёной, потому что имя смотрело в старый кластер, а там тот же хост отдаёт лист Let's Encrypt — публичный). Ломает любой новый PR, не только конкретный, и той же причиной упрётся следующая за фильтром джоба Flate — её `actions/checkout` тоже ходит на `git.grachevko.ru` через Node. Доказательства (проверено вручную): - по SNI: `openssl s_client -connect 192.168.1.2:443 -servername git.grachevko.ru` → `issuer=Let's Encrypt`; то же к 192.168.40.11 → `issuer=CN=internal-ca`; - в поде нового кластера: `node -e "fetch('https://git.grachevko.ru/api/v1/version')"` → `fetch failed`, а с `NODE_EXTRA_CA_CERTS=/etc/ssl/internal-ca/ca.crt` → код 200. ## Что правит PR В `podspec-default.yaml` (метки `ubuntu-latest` и `default`) добавляется то, что у `podspec-dind` уже есть: - том из ConfigMap `internal-ca` смонтирован в `/etc/ssl/internal-ca` (readOnly); - `NODE_EXTRA_CA_CERTS` и `SSL_CERT_FILE` — оба на `/etc/ssl/internal-ca/ca.crt`. Бандл `internal-ca` включает и публичные корни (`useDefaultCAs`), поэтому доступ к GitHub и апстримным реестрам не страдает. ## Проверки - `flate test all -p ./kubernetes/flux/cluster` — 125 passed. - Блоб в ветке совпал с локальным коммитом: `f7d8bbfceff50ad9fde9815ace0cb9d38c838dc6`, +18 строк, один файл, других изменений нет. - Слов-двойников Unicode в добавленных строках нет (проверено тем же чекером). ## Чего ожидать после мёржа Первым прогоном этот PR будет с красным чеком `Flate - Filter`: проверка ломается ровно той причиной, которую лечит, — исправленный podspec начнёт действовать только с момента мёржа. После мёржа перезапуск любого прогона должен становиться зелёным; проверю первым же. Заодно после этого MR: PR #145 придётся перебазировать (оба трогают этот файл), а из воркфлоу сборки образа в `container-images` можно убрать собственный `NODE_EXTRA_CA_CERTS` — это отдельной правкой, когда захочешь.
fix(forgejo-runner): обычные job-поды доверяют внутреннему CA
All checks were successful
Flate / Flate - Filter (pull_request) Successful in 4s
Flate / Flate (pull_request) Successful in 26s
Flate / Flate - Success (pull_request) Successful in 3s
4aecf0375b
grachevko deleted branch fix/runner-default-ca 2026-09-23 18:45:55 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
grachevko/home-ops!146
No description provided.