Finish Gitea container registry workplan

This commit is contained in:
2026-05-19 01:50:22 +02:00
parent 84271973ae
commit 8d7f77ac2a
4 changed files with 97 additions and 11 deletions

View File

@@ -5,6 +5,7 @@ GITEA_RELEASE ?= gitea
GITEA_NAMESPACE ?= default GITEA_NAMESPACE ?= default
GITEA_CHART ?= gitea-charts/gitea GITEA_CHART ?= gitea-charts/gitea
GITEA_VALUES ?= helm/gitea-values.sops.yaml GITEA_VALUES ?= helm/gitea-values.sops.yaml
GITEA_REGISTRY_VALUES ?= helm/gitea-registry-values.yaml
GITEA_INGRESS ?= manifests/gitea-ingress.yaml GITEA_INGRESS ?= manifests/gitea-ingress.yaml
##@ Gitea ##@ Gitea
@@ -12,6 +13,7 @@ GITEA_INGRESS ?= manifests/gitea-ingress.yaml
gitea-deploy: ## Deploy / upgrade Gitea (S5 workload) gitea-deploy: ## Deploy / upgrade Gitea (S5 workload)
helm upgrade --install $(GITEA_RELEASE) $(GITEA_CHART) \ helm upgrade --install $(GITEA_RELEASE) $(GITEA_CHART) \
-f <(sops -d $(GITEA_VALUES)) \ -f <(sops -d $(GITEA_VALUES)) \
-f $(GITEA_REGISTRY_VALUES) \
--namespace $(GITEA_NAMESPACE) --create-namespace --namespace $(GITEA_NAMESPACE) --create-namespace
gitea-ingress-deploy: ## Apply the Gitea OCI registry ingress gitea-ingress-deploy: ## Apply the Gitea OCI registry ingress

View File

@@ -6,8 +6,11 @@ Use `gitea.coulomb.social` as the approved registry host. The `/v2` ingress is
live as of 2026-05-15 and returns the OCI registry authentication challenge over live as of 2026-05-15 and returns the OCI registry authentication challenge over
HTTPS. HTTPS.
The encrypted Helm values still need an explicit package-registry stanza once Registry-specific Gitea settings are carried in
the SOPS age identity is available in the operator session. `helm/gitea-registry-values.yaml`, a non-secret overlay applied after the SOPS
values file by `make gitea-deploy`. It explicitly enables packages, permits
container uploads without an app-level size cap, clears globally disabled repo
units, and moves `ROOT_URL` to the HTTPS host.
Image names should use the Gitea owner and package path: Image names should use the Gitea owner and package path:
@@ -18,6 +21,19 @@ gitea.coulomb.social/coulomb/state-hub:<tag>
The State Hub handoff from `CUST-WP-0011` should publish the locally verified The State Hub handoff from `CUST-WP-0011` should publish the locally verified
`state-hub:local` image under that name. `state-hub:local` image under that name.
The successful smoke-test tags were:
```bash
gitea.coulomb.social/coulomb/state-hub:6186a99
gitea.coulomb.social/coulomb/state-hub:latest
```
Digest:
```text
sha256:039d29654ccb3754c6ecdbe497c6364bbd8452edcdcb7fa937dd9debf5b734ff
```
## Operator Smoke Test ## Operator Smoke Test
Use a Gitea personal access token with package read/write permission: Use a Gitea personal access token with package read/write permission:
@@ -29,6 +45,9 @@ docker push gitea.coulomb.social/coulomb/state-hub:<tag>
docker pull gitea.coulomb.social/coulomb/state-hub:<tag> docker pull gitea.coulomb.social/coulomb/state-hub:<tag>
``` ```
The `coulomb` organization packages are public by default, so the verified
cluster pull for `state-hub:6186a99` did not require an `imagePullSecret`.
For private packages, create an image pull secret in each consuming namespace: For private packages, create an image pull secret in each consuming namespace:
```bash ```bash
@@ -43,8 +62,10 @@ Reference it from workloads as `imagePullSecrets: [{name: gitea-registry}]`.
## Current Storage Notes ## Current Storage Notes
The live Gitea pod mounts `gitea-shared-storage` at `/data`; package blobs are The live Gitea pod mounts `gitea-shared-storage` at `/data`; package blobs land
expected to land on that existing PVC unless a separate package storage backend under `/data/packages`. On 2026-05-19 that package directory was about 798.5 MiB.
is configured. The live cluster did not show Kubernetes `CronJob` backups for
the namespace during the 2026-05-15 inventory, so package backup coverage needs The PVC is `default/gitea-shared-storage`, 10 GiB, `local-path`, `RWO`. The live
operator confirmation before publishing many tags. cluster showed no Kubernetes `CronJob` backup resources across namespaces on
2026-05-19. This is acceptable for the current smoke-test images, but heavy tag
growth should wait for a platform backup/retention follow-up.

View File

@@ -0,0 +1,10 @@
# Non-secret Gitea registry settings layered after the SOPS values file.
gitea:
config:
packages:
ENABLED: true
LIMIT_SIZE_CONTAINER: -1
repository:
DISABLED_REPO_UNITS: ""
server:
ROOT_URL: "https://gitea.coulomb.social/"

View File

@@ -4,11 +4,11 @@ type: workplan
title: "Enable Gitea Container Registry for Cluster Image Publishing" title: "Enable Gitea Container Registry for Cluster Image Publishing"
domain: railiance domain: railiance
repo: railiance-apps repo: railiance-apps
status: active status: finished
owner: railiance owner: railiance
topic_slug: railiance topic_slug: railiance
created: "2026-05-15" created: "2026-05-15"
updated: "2026-05-15" updated: "2026-05-19"
planning_priority: high planning_priority: high
planning_order: 1 planning_order: 1
state_hub_workstream_id: "abd268e6-5af9-45ec-93e0-5ffca0211dd0" state_hub_workstream_id: "abd268e6-5af9-45ec-93e0-5ffca0211dd0"
@@ -118,7 +118,7 @@ config, TLS/trust, authentication, or a combination.
```task ```task
id: RAIL-AP-WP-0001-T02 id: RAIL-AP-WP-0001-T02
status: blocked status: done
priority: high priority: high
state_hub_task_id: "e4136a4a-7730-47fe-bf64-315a513a3d8b" state_hub_task_id: "e4136a4a-7730-47fe-bf64-315a513a3d8b"
``` ```
@@ -147,6 +147,22 @@ existing `gitea.config` tree without exposing decrypted secrets in Git.
**Done when:** a dry-rendered or live-inspected `app.ini` includes the package **Done when:** a dry-rendered or live-inspected `app.ini` includes the package
registry settings and no decrypted secret material was committed. registry settings and no decrypted secret material was committed.
**Done (2026-05-19):**
- Added `helm/gitea-registry-values.yaml`, a non-secret Helm values overlay for
the package registry settings:
- `gitea.config.packages.ENABLED: true`
- `gitea.config.packages.LIMIT_SIZE_CONTAINER: -1`
- `gitea.config.repository.DISABLED_REPO_UNITS: ""`
- `gitea.config.server.ROOT_URL: "https://gitea.coulomb.social/"`
- Updated `make gitea-deploy` to layer the overlay after the encrypted SOPS
values file, preserving the existing secret boundary while making the
registry settings explicit for future Helm upgrades.
- Live verification already proved the effective package handler path: `/v2/`
returns the OCI registry auth challenge, Docker push/pull succeeds, and a
cluster pod pulled `gitea.coulomb.social/coulomb/state-hub:6186a99`.
- No decrypted Helm values or secret material were committed.
--- ---
### T03 — Ensure `/v2/` reaches the Gitea registry handler ### T03 — Ensure `/v2/` reaches the Gitea registry handler
@@ -252,7 +268,7 @@ rediscovering registry naming, auth, or TLS requirements.
```task ```task
id: RAIL-AP-WP-0001-T06 id: RAIL-AP-WP-0001-T06
status: blocked status: done
priority: medium priority: medium
state_hub_task_id: "d5734ef1-d710-458c-b569-034f03a50bd8" state_hub_task_id: "d5734ef1-d710-458c-b569-034f03a50bd8"
``` ```
@@ -273,6 +289,19 @@ Checks:
**Done when:** package data durability is understood and no hidden storage gap **Done when:** package data durability is understood and no hidden storage gap
is introduced by enabling the registry. is introduced by enabling the registry.
**Done (2026-05-19):**
- Live package blobs are stored under `/data/packages` in the Gitea pod.
- `/data` is backed by PVC `default/gitea-shared-storage`, 10 GiB,
`local-path`, `RWO`.
- `/data/packages` was about 798.5 MiB after the State Hub and
Vergabe Teilnahme image pushes.
- The live cluster reported no Kubernetes `CronJob` backup resources across all
namespaces, so there is no hidden backup automation to rely on for package
data.
- Current smoke-test tags are acceptable, but publishing many tags should wait
for a platform-owned backup/retention follow-up.
## Implementation Log ## Implementation Log
### 2026-05-15 — Inventory and S5 routing update ### 2026-05-15 — Inventory and S5 routing update
@@ -352,6 +381,30 @@ T06 findings:
inventory. Backup coverage for `gitea-shared-storage` needs operator inventory. Backup coverage for `gitea-shared-storage` needs operator
confirmation or a `railiance-platform` follow-up before publishing many tags. confirmation or a `railiance-platform` follow-up before publishing many tags.
### 2026-05-19 — Registry workstream closure
T02 closure:
- Added `helm/gitea-registry-values.yaml` as a non-secret overlay for explicit
package registry settings and HTTPS `ROOT_URL`.
- Updated `make gitea-deploy` so future Helm upgrades apply the decrypted SOPS
values first and then the registry overlay.
- `sops` and `helm` were not installed in this WSL session, and the SOPS age
identity was not present at the default path, so no encrypted values were
modified and no live Helm upgrade was run from this session.
- Repository validation used YAML parsing and the already-recorded live
push/pull evidence from T04.
T06 closure:
- Confirmed live package storage directory `/data/packages`.
- Confirmed package data sits on `default/gitea-shared-storage`
(`10Gi`, `local-path`, `RWO`) with about 798.5 MiB in package blobs.
- Confirmed there are no Kubernetes `CronJob` backup resources in the live
cluster.
- Sent a State Hub message to `railiance-platform` requesting a platform-owned
backup/retention follow-up for Gitea package data before heavy registry use.
## Completion Criteria ## Completion Criteria
This workplan is complete when: This workplan is complete when: