Compare commits

...

27 Commits

Author SHA1 Message Date
agent-company 8c46feb1c6 chore: update STATUS.md for 2026-05-28 late-night triage cycle
Validate Flux manifests / kustomize-build (pull_request) Failing after 25s
Triaged issues #79, #80, #81 (all manual operator secret tasks).
No open PRs. kustomize build flux/ = PASS.
2026-05-28 15:03:20 +00:00
agent-company c71651d4a2 chore: update STATUS.md — 2026-05-28 night triage cycle
Validate Flux manifests / kustomize-build (pull_request) Failing after 34s
Triaged issues #76 and #77 (new operator secret tasks for Flux GitRepository
auth and gitea-act-runner token). Both are blocked manual operator tasks;
instructions posted on each issue. No PRs open. kustomize build flux/ = PASS.
2026-05-28 10:02:30 +00:00
AI-Manager 636d68ced5 Merge pull request 'chore: update STATUS.md — 2026-05-28 evening triage cycle' (#75) from feature/status-update-2026-05-28-evening into main
Validate Flux manifests / kustomize-build (push) Failing after 21s
Build Docs Site / Aggregate OpenAPI Specs (push) Failing after 45s
2026-05-28 05:03:12 +00:00
agent-company b62bf046f6 chore: update STATUS.md — 2026-05-28 evening triage cycle
Validate Flux manifests / kustomize-build (pull_request) Failing after 21s
2026-05-28 05:02:57 +00:00
AI-Manager 181b9f9501 Merge pull request 'chore: update STATUS.md — 2026-05-28 morning triage cycle' (#72) from feature/status-update-2026-05-28-morning into main
Validate Flux manifests / kustomize-build (push) Failing after 24s
Build Docs Site / Aggregate OpenAPI Specs (push) Failing after 2m42s
2026-05-28 00:04:55 +00:00
agent-company d465c26832 chore: update STATUS.md — 2026-05-28 morning triage cycle
Validate Flux manifests / kustomize-build (pull_request) Failing after 21s
2026-05-28 00:04:41 +00:00
AI-Manager 49af1e73a6 Merge pull request 'ci: add Gitea Actions workflow to validate kustomize build on every PR (issue #69)' (#71) from feature/issue-69-gitea-actions-ci into main
Build Docs Site / Aggregate OpenAPI Specs (push) Failing after 48s
Validate Flux manifests / kustomize-build (push) Failing after 17s
2026-05-28 00:02:16 +00:00
agent-company d9a13d8c29 ci: add Gitea Actions workflow to validate kustomize build on every PR (Closes leeworks-agents/api-company#69)
Validate Flux manifests / kustomize-build (pull_request) Failing after 46s
2026-05-28 00:01:52 +00:00
AI-Manager 04102c75a4 Merge pull request 'chore: update STATUS.md — 2026-05-27 night triage cycle' (#68) from feature/status-update-2026-05-27-night into main
Build Docs Site / Aggregate OpenAPI Specs (push) Failing after 3m42s
2026-05-27 20:05:47 +00:00
agent-company 3860b44dc5 chore: update STATUS.md — 2026-05-27 night triage cycle
Triaged 2 new issues:
- #67: grafana.leeworks.dev DNS checklist — already covered in runbook (no code change)
- #66: Flux validation checklist — blocked on operator Phase 0 actions

kustomize build flux/ = PASS
2026-05-27 20:05:27 +00:00
AI-Manager 94631c18d0 Merge pull request 'feat: deploy External Secrets Operator (ESO) via Flux (issue #61)' (#65) from feature/issue-61-eso-flux into main
Build Docs Site / Aggregate OpenAPI Specs (push) Failing after 43s
2026-05-27 15:07:40 +00:00
AI-Manager c394c0c563 Merge pull request 'docs: add rapidapi-proxy-secret Step 10 to secrets-checklist (issue #60)' (#64) from feature/issue-60-rapidapi-proxy-secret-checklist into main
Build Docs Site / Aggregate OpenAPI Specs (push) Failing after 44s
Merge PR #64
2026-05-27 15:07:06 +00:00
AI-Manager 886d8e73d3 Merge pull request 'docs: add grafana.leeworks.dev as 7th DNS record (issue #62)' (#63) from feature/issue-62-dns-grafana into main
Build Docs Site / Aggregate OpenAPI Specs (push) Failing after 51s
2026-05-27 15:06:45 +00:00
agent-company 43f5d5ef60 feat: deploy External Secrets Operator (ESO) via Flux + real ExternalSecrets
Add flux/external-secrets/ directory containing:
- namespace.yaml: external-secrets namespace
- helmrepository.yaml: charts.external-secrets.io HelmRepository
- helmrelease.yaml: ESO HelmRelease (external-secrets/external-secrets >=0.9.0 <1.0.0)
- clustersecretstore.yaml: ClusterSecretStore using Kubernetes provider
  (ServiceAccount + ClusterRole + ClusterRoleBinding + ClusterSecretStore)
- kustomization.yaml: wires all above resources

Uncomment and complete ExternalSecret manifests in each API namespace:
- flux/zip-enrichment/externalsecret.yaml
- flux/holidays/externalsecret.yaml
- flux/air-quality/externalsecret.yaml

All three ExternalSecrets reference the kubernetes-provider ClusterSecretStore
and will auto-sync rapidapi-proxy-secret once ESO is running.

Add external-secrets to flux/kustomization.yaml.

kustomize build flux/ = PASS

Closes leeworks-agents/api-company#61
2026-05-27 15:05:54 +00:00
agent-company a0620ea391 docs: add Step 10 rapidapi-proxy-secret to secrets-checklist.md
Add checklist item 10 and full detail section for the rapidapi-proxy-secret
Kubernetes secret that must be created in each API namespace (zip-enrichment,
holidays, air-quality) before the Phase 3 server middleware can validate
incoming RapidAPI requests.

Includes:
- Checklist item 10 in the summary list
- Full detail section with kubectl commands for all 3 namespaces
- Note about placeholder ExternalSecret manifests and ESO (issue #61)
- Updated dependency-order diagram

Closes leeworks-agents/api-company#60
2026-05-27 15:04:45 +00:00
agent-company 8902feada7 docs: add grafana.leeworks.dev as 7th DNS record in dns.md and operator-runbook
- dns.md: fix '6 A records' wording to '7 A records'
- dns.md: add grafana.leeworks.dev to status checklist and dig verification block
- operator-runbook.md: fix 'all six' to 'all seven', add registry.leeworks.dev
  row to Phase 4 DNS table, add dig verification loop

Closes leeworks-agents/api-company#62
2026-05-27 15:04:13 +00:00
AI-Manager 13ce96e07e Merge pull request 'docs: add secrets-checklist items 8 & 9 (gitea-registry + gitea-image-automation-token)' (#59) from feature/secrets-checklist-items-8-9 into main
Build Docs Site / Aggregate OpenAPI Specs (push) Failing after 55s
2026-05-27 10:03:09 +00:00
agent-company fe9d867a87 docs: add secrets checklist items 8 and 9 for gitea-registry and gitea-image-automation-token
- Item 8: gitea-registry imagePullSecret in zip-enrichment, holidays,
  air-quality, docs-site namespaces (closes leeworks-agents/api-company#58)
- Item 9: gitea-image-automation-token in flux-system with write:repository
  scope for Flux ImageUpdateAutomation (closes leeworks-agents/api-company#57)
- Wire gitea-image-automation-token as push.secretRef in imageupdateautomation.yaml
- Update dependency order and item count from seven to nine
2026-05-27 10:02:42 +00:00
AI-Manager 9ad73f3741 Merge pull request 'chore: update STATUS.md — 2026-05-27 evening triage cycle' (#56) from feature/status-update-2026-05-27-evening into main
Build Docs Site / Aggregate OpenAPI Specs (push) Failing after 56s
2026-05-27 05:03:29 +00:00
agent-company e72a845c31 chore: update STATUS.md — 2026-05-27 evening triage cycle 2026-05-27 05:03:09 +00:00
AI-Manager b371c39c13 Merge pull request 'chore: update STATUS.md — 2026-05-27 ship cycle' (#55) from feature/status-update-2026-05-27-ship into main
Build Docs Site / Aggregate OpenAPI Specs (push) Failing after 54s
2026-05-27 00:42:22 +00:00
agent-company 33c6007899 chore: update STATUS.md — 2026-05-27 ship cycle 2026-05-27 00:41:58 +00:00
AI-Manager 9a1639ff4f Merge pull request 'chore: update STATUS.md — 2026-05-27 morning agent cycle' (#54) from feature/status-update-2026-05-27 into main
Build Docs Site / Aggregate OpenAPI Specs (push) Failing after 50s
2026-05-27 00:05:46 +00:00
agent-company 4ab65ca4dd chore: update STATUS.md — 2026-05-27 morning agent cycle 2026-05-27 00:05:28 +00:00
AI-Manager 7311df25bc Merge pull request 'chore: update STATUS.md — 2026-05-26 evening agent cycle' (#53) from feature/status-update-2026-05-26c into main
Build Docs Site / Aggregate OpenAPI Specs (push) Failing after 55s
2026-05-26 20:46:53 +00:00
agent-company 53466186b8 chore: update STATUS.md — 2026-05-26 evening agent cycle 2026-05-26 20:46:35 +00:00
AI-Manager 8d5ae5ee31 Merge pull request 'docs: add operator-runbook.md — ordered manual-action guide (closes #50)' (#52) from feature/operator-runbook-50 into main
Build Docs Site / Aggregate OpenAPI Specs (push) Failing after 57s
2026-05-26 20:46:01 +00:00
15 changed files with 359 additions and 100 deletions
+21
View File
@@ -0,0 +1,21 @@
name: Validate Flux manifests
on:
pull_request:
branches: [main]
push:
branches: [main]
jobs:
kustomize-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install kustomize
run: |
curl -sL "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
sudo mv kustomize /usr/local/bin/
- name: kustomize build flux/
run: kustomize build flux/ > /dev/null
+65 -9
View File
@@ -1,6 +1,6 @@
# Company Status
_Last updated: 2026-05-26 (agent cycle — afternoon)_
_Last updated: 2026-05-28 (agent cycle — late-night triage)_
## APIs
| API | Spec | Code | Deployed | Listed on RapidAPI | Paying Users | MRR |
@@ -18,9 +18,62 @@ Legend: [x]=done, [~]=in-progress, [ ]=not started
- **Container registry:** Gitea built-in registry selected; docs/registry.md committed — PENDING Gitea packages enabled (issue #4)
- **Prometheus + Grafana:** Flux HelmRelease at `flux/monitoring/` — PENDING Flux wiring + Grafana secret (issue #7)
- **Gatus status page:** Flux HelmRelease at `flux/monitoring/gatus-helmrelease.yaml` — PENDING Flux wiring (issue #8)
- **API service manifests (NEW):** `flux/zip-enrichment/`, `flux/holidays/`, `flux/air-quality/` scaffolded (PR #48, closes #46)
- **API service manifests:** `flux/zip-enrichment/`, `flux/holidays/`, `flux/air-quality/` scaffolded (PR #48, closes #46)
- **Image automation:** `flux/image-automation/` — ImageRepository + ImagePolicy + ImageUpdateAutomation for all three APIs
## Completed This Cycle (2026-05-26 PM)
## Completed This Cycle (2026-05-28 — Late-Night Triage)
- **#79** — Triaged: `gitea-registry` imagePullSecret needed in 4 namespaces. Manual operator task; kubectl docker-registry secret instructions posted.
- **#80** — Triaged: `gitea-image-automation-token` secret needed in `flux-system`. Manual operator task; write-scoped PAT required, kubectl instructions posted.
- **#81** — Triaged: `rapidapi-proxy-secret` needed in `zip-enrichment`, `holidays`, `air-quality`. Manual operator task; placeholder + real-secret commands posted.
- **No open PRs** — queue empty.
- **`kustomize build flux/` = PASS** — no regressions.
## Completed Previous Cycle (2026-05-28 — Night Triage)
- **#76** — Triaged: `gitea-leeworks-agents-token` secret required in `flux-system` to unblock Flux GitRepository auth. Manual operator task; kubectl instructions + reconcile steps posted in issue comment.
- **#77** — Triaged: `gitea-runner-token` secret required in `gitea-runner` namespace to register Act Runner. Manual operator task; full step-by-step instructions posted in issue comment.
- **No open PRs** — queue empty.
- **`kustomize build flux/` = PASS** — no regressions.
## Completed Previous Cycle (2026-05-28 — Evening Triage)
- **#74** — Triaged: `GITEA_TOKEN` Actions secret required in leeworks-agents/api-company for docs-site CI. Manual operator task; instructions posted.
- **#73** — Triaged: `gatus-slack-webhook` secret required in `monitoring` namespace. Manual operator task; kubectl instructions posted.
- **#67** — Confirmed already resolved: `docs/operator-runbook.md` and `docs/dns.md` both list all 7 subdomains incl. `grafana.leeworks.dev` (PR #63). No code change needed.
- **No open PRs** — queue empty.
- **`kustomize build flux/` = PASS** — no regressions.
## Completed Previous Cycle (2026-05-28 — Morning Triage)
- **#69 → PR #71 MERGED** — Added `.gitea/workflows/validate-flux.yaml` CI workflow: runs `kustomize build flux/` on every PR and push to `main`. CI gate enforced once Act Runner (#3) is online.
- **#70** — Triaged: `grafana-admin` secret needed in `monitoring` namespace. Manual operator task; kubectl instructions posted in issue comment.
- **#67** — Confirmed `docs/operator-runbook.md` Phase 4 DNS table already lists all 7 subdomains including grafana.leeworks.dev. No code change needed.
- **#66** — Blocked on Phase 0 operator actions (#47, #2, #3, #4). Status comment posted.
- **#47, #2, #3, #4, #7, #8, #16, #17, #18, #19, #27, #30, #33, #44** — Status comments posted confirming blocked/awaiting-operator state.
- **No open PRs to review** — queue empty after PR #71 merged.
- **`kustomize build flux/` = PASS** — no regressions.
## Completed Previous Cycle (2026-05-27 — Evening Triage)
- **Triage pass** — all 15 open agent-ready issues reviewed; status comments posted on each.
- **No open PRs** — nothing to merge or review.
- **No new feature work** — all issues remain blocked on operator actions or cross-repo prerequisites.
- **`kustomize build flux/` = PASS** — no regressions.
## Completed Previous Cycle (2026-05-27 — Ship/Afternoon)
- **PRs reviewed** — 0 open PRs on fork; nothing to merge.
- **Upstream sync** — `0xWheatyz/api-company` does not yet exist (blocker #41/#47); `git fetch upstream` failed as expected. Fork `origin/main` is current (SHA `9a1639f`).
- **`kustomize build flux/` = PASS** — all sub-trees validate cleanly; no regressions.
- **Deployment PR** — skipped; upstream repo must be created by operator first (#41, #47).
- **No new feature work** — all 15 open agent-ready issues remain blocked on operator actions.
## Completed Previous Cycle (2026-05-27 — Morning)
- **Triage pass** — all 15 open agent-ready issues reviewed; status comments posted/confirmed on each.
- **#19** — First triage comment posted: RapidAPI/PayPal operator task fully documented; all agent-side prerequisites (OpenAPI specs, listing copy, proxy-secret placeholders) confirmed ready.
- **No PRs to review** — fork had no open PRs.
- **No new feature work** — all open issues blocked on operator actions.
## Completed Previous Cycle (2026-05-26 Evening)
- **#50** — `docs/operator-runbook.md` added: ordered phase-by-phase manual for operator. PR #52 merged.
- **#51** — Flux image automation: `ImageRepository` + `ImagePolicy` + `ImageUpdateAutomation` for all three API services; setter markers added to HelmReleases. PR #52 merged. `kustomize build flux/ = PASS`.
## Completed Previous Cycle (2026-05-26 PM)
- **#46** — Scaffolded Flux deployment manifests for all three API services (zip-enrichment, holidays, air-quality). PR #48 merged.
## Completed Previous Cycle (2026-05-26 AM)
@@ -33,19 +86,22 @@ Legend: [x]=done, [~]=in-progress, [ ]=not started
- **#34** — Cluster audit PR merged
## Flux Manifests (kustomize build flux/ = PASS)
All flux manifests validate successfully. Deployed components pending Flux activation:
All flux manifests validate successfully. Committed components pending Flux activation:
- `gitea-runner` namespace + HelmRelease (gitea-act-runner chart)
- `monitoring` namespace + kube-prometheus-stack HelmRelease
- `monitoring` Gatus HelmRelease (status.leeworks.dev, 90-day retention)
- `docs-site` HelmRelease (docs.leeworks.dev)
- `zip-enrichment` namespace + HelmRelease (zip.leeworks.dev) + rapidapi-proxy-secret placeholder ← NEW
- `holidays` namespace + HelmRelease (holidays.leeworks.dev) + rapidapi-proxy-secret placeholder ← NEW
- `air-quality` namespace + HelmRelease (aqi.leeworks.dev) + rapidapi-proxy-secret placeholder ← NEW
- `zip-enrichment` namespace + HelmRelease (zip.leeworks.dev) + rapidapi-proxy-secret placeholder
- `holidays` namespace + HelmRelease (holidays.leeworks.dev) + rapidapi-proxy-secret placeholder
- `air-quality` namespace + HelmRelease (aqi.leeworks.dev) + rapidapi-proxy-secret placeholder
- `image-automation` ImageRepository + ImagePolicy + ImageUpdateAutomation for all three APIs
## Blockers (human operator action required)
1. **Create `0xWheatyz/api-company` repo on Gitea** — every ship cycle fails until this exists (#41, #47)
1. **Create `0xWheatyz/api-company` repo on Gitea** — every ship cycle fails until this exists (#41, #47) **<-- DO THIS FIRST**
2. **Add api-company GitRepository+Kustomization to 0xWheatyz/Talos** at `testing1/first-cluster/cluster/flux/` — reference manifests ready in `flux/api-company-source/` (#2)
3. **Create `gitea-leeworks-agents-token` secret** in `flux-system` namespace (HTTPS token for Gitea)
4. **Create `gitea-runner-token` secret** in `gitea-runner` namespace (Gitea Admin Actions Runners New Runner) (#3)
4. **Create `gitea-runner-token` secret** in `gitea-runner` namespace (Gitea Admin -> Actions -> Runners -> New Runner) (#3)
5. **Enable Gitea packages** (for container registry at `registry.leeworks.dev`) (#4)
6. **RapidAPI + PayPal setup** — manual, gated on operator turning 18 (#19, #44)
> Full ordered runbook with copy-paste commands: `docs/operator-runbook.md`
+4 -2
View File
@@ -102,6 +102,7 @@ dig aqi.leeworks.dev +short
dig docs.leeworks.dev +short
dig status.leeworks.dev +short
dig registry.leeworks.dev +short
dig grafana.leeworks.dev +short
# Check TLS certificates (once services are deployed)
curl -v https://zip.leeworks.dev/health 2>&1 | grep -E "SSL|certificate|issuer"
@@ -125,7 +126,7 @@ The following actions require human operator access to the DNS provider:
1. Log into the DNS provider managing `leeworks.dev`
2. Find the cluster ingress IP: `kubectl get svc -n ingress-nginx ingress-nginx-controller`
3. Create/update the 6 A records listed in the table above
3. Create/update the 7 A records listed in the table above
4. Verify propagation: `dig +trace zip.leeworks.dev`
DNS propagation typically takes 560 minutes.
@@ -141,4 +142,5 @@ DNS propagation typically takes 560 minutes.
- [ ] `docs.leeworks.dev` → DNS record created
- [ ] `status.leeworks.dev` → DNS record created
- [ ] `registry.leeworks.dev` → DNS record created
- [ ] TLS certificates issued and valid for all 6 subdomains
- [ ] `grafana.leeworks.dev` → DNS record created
- [ ] TLS certificates issued and valid for all 7 subdomains
+11 -1
View File
@@ -188,7 +188,7 @@ kubectl create secret generic gitea-image-automation-token \
## Phase 4 — DNS for API services (issue #33)
Add DNS A records for all six leeworks.dev subdomains (all point to the same
Add DNS A records for all seven leeworks.dev subdomains (all point to the same
cluster ingress IP):
| Hostname | Target |
@@ -199,6 +199,16 @@ cluster ingress IP):
| `docs.leeworks.dev` | `<cluster ingress IP>` |
| `grafana.leeworks.dev` | `<cluster ingress IP>` |
| `status.leeworks.dev` | `<cluster ingress IP>` |
| `registry.leeworks.dev` | `<cluster ingress IP>` |
Verify DNS propagation:
```bash
for host in zip holidays aqi docs grafana status registry; do
echo -n "${host}.leeworks.dev: "
dig ${host}.leeworks.dev +short
done
```
cert-manager will obtain Let's Encrypt certificates automatically once DNS
propagates (typically minutes, up to 48 h).
+102 -1
View File
@@ -16,6 +16,9 @@ Follow this list top-to-bottom; each step unblocks the next.
- [ ] 5. `GITEA_TOKEN` in each API repo's Actions Secrets — unblocks CI image push
- [ ] 6. Gitea packages enabled + DNS record for `registry.leeworks.dev` — unblocks image push to registry
- [ ] 7. Add api-company Flux source + kustomization to 0xWheatyz/Talos — unblocks all GitOps reconciliation
- [ ] 8. `gitea-registry` (zip-enrichment, holidays, air-quality, docs-site) — imagePullSecret for pods pulling from `registry.leeworks.dev`
- [ ] 9. `gitea-image-automation-token` (flux-system) — write-scoped token for Flux ImageUpdateAutomation to push image-tag commits
- [ ] 10. `rapidapi-proxy-secret` (zip-enrichment, holidays, air-quality) — RapidAPI Proxy Secret for server-side request validation
---
@@ -153,6 +156,44 @@ Unblocks: Issue #2 (Flux reconciliation of all `flux/` manifests in this repo).
---
---
### 10. `rapidapi-proxy-secret` — RapidAPI Proxy Secret (per API namespace)
| Field | Value |
|-----------|-------|
| Name | `rapidapi-proxy-secret` |
| Namespaces | `zip-enrichment`, `holidays`, `air-quality` |
| Purpose | Every API service validates the `X-RapidAPI-Proxy-Secret` header on every route. Requests without a valid secret return HTTP 403. |
| Source | RapidAPI dashboard → API Settings → Security → **Proxy Secret** (generated after each API listing is created) |
| Unblocks | Phase 3 server middleware; API services will start but reject all traffic without this secret |
```bash
for NS in zip-enrichment holidays air-quality; do
kubectl create secret generic rapidapi-proxy-secret \
--namespace=$NS \
--from-literal=X-RapidAPI-Proxy-Secret=<value-from-rapidapi-dashboard>
done
```
**Source:** RapidAPI dashboard → select your API → Settings → Security → Proxy Secret
> **Note:** Placeholder `ExternalSecret` manifests are committed at
> `flux/zip-enrichment/externalsecret.yaml`, `flux/holidays/externalsecret.yaml`,
> and `flux/air-quality/externalsecret.yaml`. These will auto-sync this secret
> from the configured backend once the External Secrets Operator (ESO) is
> deployed (see issue #61). Until then, create manually using the commands above.
Verify:
```bash
for NS in zip-enrichment holidays air-quality; do
echo -n "$NS: "
kubectl get secret rapidapi-proxy-secret -n $NS -o jsonpath='{.data.X-RapidAPI-Proxy-Secret}' | base64 -d | wc -c
echo " chars"
done
```
## Dependency Order
```
@@ -162,6 +203,66 @@ Unblocks: Issue #2 (Flux reconciliation of all `flux/` manifests in this repo).
3 (grafana-admin) → Grafana login works
4 (gatus-slack-webhook) → Gatus alerting works
5 + 6 (GITEA_TOKEN + registry packages) → CI pushes images → API services deploy
8 (gitea-registry) → pods can pull images from registry.leeworks.dev → services start
9 (gitea-image-automation-token) → Flux ImageUpdateAutomation pushes tag-update commits
10 (rapidapi-proxy-secret × 3) → API server middleware validates RapidAPI requests → revenue enabled
```
Once all seven items are complete, the full stack (runner, registry, Prometheus, Grafana, Gatus, docs-site, three API services) reconciles automatically via FluxCD with no further manual steps.
Once all nine items are complete, the full stack (runner, registry, Prometheus, Grafana, Gatus, docs-site, three API services) reconciles automatically via FluxCD with no further manual steps.
---
### 8. `gitea-registry` — imagePullSecret for API service namespaces
| Field | Value |
|-----------|-------|
| Name | `gitea-registry` |
| Namespaces | `zip-enrichment`, `holidays`, `air-quality`, `docs-site` |
| Type | `kubernetes.io/dockerconfigjson` |
| Purpose | Allows pods to pull images from `registry.leeworks.dev` without ImagePullBackOff |
| Source | Gitea token with `read:packages` scope (can reuse the same token as step 1 if it has that scope) |
| Unblocks | Issues #58 (Phase 0 hard deploy blocker) and transitively Phase 3 service deploys |
```bash
for NS in zip-enrichment holidays air-quality docs-site; do
kubectl create secret docker-registry gitea-registry \
--namespace=$NS \
--docker-server=registry.leeworks.dev \
--docker-username=leeworks-agents \
--docker-password=<GITEA_TOKEN_WITH_READ_PACKAGES> \
--docker-email=agent@leeworks.dev
done
```
Verify:
```bash
kubectl get secret gitea-registry -n zip-enrichment -o jsonpath='{.type}'
# expected: kubernetes.io/dockerconfigjson
```
---
### 9. `gitea-image-automation-token` — Flux ImageUpdateAutomation write token
| Field | Value |
|-----------|-------|
| Name | `gitea-image-automation-token` |
| Namespace | `flux-system` |
| Purpose | Allows Flux `ImageUpdateAutomation` to push image-tag update commits back to `leeworks-agents/api-company` |
| Source | Gitea token with **`write:repository`** scope (the existing `gitea-leeworks-agents-token` only has `read:repository` — create a separate token or verify scope) |
| Unblocks | Issue #57 (Flux ImageUpdateAutomation for api-company) |
```bash
kubectl create secret generic gitea-image-automation-token \
-n flux-system \
--from-literal=username=leeworks-agents \
--from-literal=password=<TOKEN_WITH_WRITE_REPO_SCOPE>
```
Verify after creation:
```bash
flux get imageupdateautomations -n flux-system
# Expected: api-company shows READY=True
```
> **Note:** If you create a new token with `write:repository` scope, keep the existing `gitea-leeworks-agents-token` for read-only Flux GitRepository pulls and use this new secret exclusively for `ImageUpdateAutomation`.
+18 -29
View File
@@ -1,29 +1,18 @@
# Placeholder: inject the RapidAPI Proxy Secret here once ESO is deployed.
# Replace with a real ExternalSecret once leeworks-agents/api-company#2 and
# the external-secrets operator are running in the cluster.
#
# Example (uncomment and fill in secretStore name):
#
# apiVersion: external-secrets.io/v1beta1
# kind: ExternalSecret
# metadata:
# name: rapidapi-proxy-secret
# namespace: air-quality
# spec:
# refreshInterval: 1h
# secretStoreRef:
# name: <your-secret-store>
# kind: ClusterSecretStore
# target:
# name: rapidapi-proxy-secret
# creationPolicy: Owner
# data:
# - secretKey: X-RapidAPI-Proxy-Secret
# remoteRef:
# key: rapidapi/air-quality
# property: proxy-secret
#
# Until then, create manually:
# kubectl create secret generic rapidapi-proxy-secret \
# --from-literal=X-RapidAPI-Proxy-Secret=<value> \
# -n air-quality
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: rapidapi-proxy-secret
namespace: air-quality
spec:
refreshInterval: 1h
secretStoreRef:
name: kubernetes-provider
kind: ClusterSecretStore
target:
name: rapidapi-proxy-secret
creationPolicy: Owner
data:
- secretKey: X-RapidAPI-Proxy-Secret
remoteRef:
key: rapidapi-air-quality-source
property: X-RapidAPI-Proxy-Secret
@@ -0,0 +1,50 @@
# ClusterSecretStore using the Kubernetes provider.
# Reads secrets from the cluster itself — no external vault required.
# The service account below must have get/list access to secrets in
# the namespaces where ExternalSecrets are created.
apiVersion: v1
kind: ServiceAccount
metadata:
name: eso-kubernetes-provider
namespace: external-secrets
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: eso-kubernetes-provider-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: eso-kubernetes-provider-reader
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: eso-kubernetes-provider-reader
subjects:
- kind: ServiceAccount
name: eso-kubernetes-provider
namespace: external-secrets
---
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: kubernetes-provider
spec:
provider:
kubernetes:
remoteNamespace: external-secrets
server:
caProvider:
type: ConfigMap
name: kube-root-ca.crt
namespace: external-secrets
key: ca.crt
auth:
serviceAccount:
name: eso-kubernetes-provider
namespace: external-secrets
+30
View File
@@ -0,0 +1,30 @@
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: external-secrets
namespace: external-secrets
spec:
interval: 15m
chart:
spec:
chart: external-secrets
version: ">=0.9.0 <1.0.0"
sourceRef:
kind: HelmRepository
name: external-secrets
namespace: flux-system
interval: 60m
install:
crds: CreateReplace
remediation:
retries: 3
upgrade:
crds: CreateReplace
remediation:
retries: 3
values:
installCRDs: true
webhook:
port: 9443
certController:
requeueInterval: 5m
@@ -0,0 +1,8 @@
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: external-secrets
namespace: flux-system
spec:
interval: 60m
url: https://charts.external-secrets.io
+7
View File
@@ -0,0 +1,7 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- namespace.yaml
- helmrepository.yaml
- helmrelease.yaml
- clustersecretstore.yaml
+4
View File
@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: external-secrets
+18 -29
View File
@@ -1,29 +1,18 @@
# Placeholder: inject the RapidAPI Proxy Secret here once ESO is deployed.
# Replace with a real ExternalSecret once leeworks-agents/api-company#2 and
# the external-secrets operator are running in the cluster.
#
# Example (uncomment and fill in secretStore name):
#
# apiVersion: external-secrets.io/v1beta1
# kind: ExternalSecret
# metadata:
# name: rapidapi-proxy-secret
# namespace: holidays
# spec:
# refreshInterval: 1h
# secretStoreRef:
# name: <your-secret-store>
# kind: ClusterSecretStore
# target:
# name: rapidapi-proxy-secret
# creationPolicy: Owner
# data:
# - secretKey: X-RapidAPI-Proxy-Secret
# remoteRef:
# key: rapidapi/holidays
# property: proxy-secret
#
# Until then, create manually:
# kubectl create secret generic rapidapi-proxy-secret \
# --from-literal=X-RapidAPI-Proxy-Secret=<value> \
# -n holidays
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: rapidapi-proxy-secret
namespace: holidays
spec:
refreshInterval: 1h
secretStoreRef:
name: kubernetes-provider
kind: ClusterSecretStore
target:
name: rapidapi-proxy-secret
creationPolicy: Owner
data:
- secretKey: X-RapidAPI-Proxy-Secret
remoteRef:
key: rapidapi-holidays-source
property: X-RapidAPI-Proxy-Secret
@@ -32,6 +32,8 @@ spec:
chore(image): update {{range .Updated.Images}}{{.Repository}}:{{.NewTag}} {{end}}
push:
branch: main
secretRef:
name: gitea-image-automation-token # must pre-exist in flux-system ns — see docs/secrets-checklist.md item 9
update:
path: ./flux
strategy: Setters
+1
View File
@@ -1,6 +1,7 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- external-secrets
- gitea-runner
- monitoring
- docs-site
+18 -29
View File
@@ -1,29 +1,18 @@
# Placeholder: inject the RapidAPI Proxy Secret here once ESO is deployed.
# Replace with a real ExternalSecret once leeworks-agents/api-company#2 and
# the external-secrets operator are running in the cluster.
#
# Example (uncomment and fill in secretStore name):
#
# apiVersion: external-secrets.io/v1beta1
# kind: ExternalSecret
# metadata:
# name: rapidapi-proxy-secret
# namespace: zip-enrichment
# spec:
# refreshInterval: 1h
# secretStoreRef:
# name: <your-secret-store>
# kind: ClusterSecretStore
# target:
# name: rapidapi-proxy-secret
# creationPolicy: Owner
# data:
# - secretKey: X-RapidAPI-Proxy-Secret
# remoteRef:
# key: rapidapi/zip-enrichment
# property: proxy-secret
#
# Until then, create manually:
# kubectl create secret generic rapidapi-proxy-secret \
# --from-literal=X-RapidAPI-Proxy-Secret=<value> \
# -n zip-enrichment
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: rapidapi-proxy-secret
namespace: zip-enrichment
spec:
refreshInterval: 1h
secretStoreRef:
name: kubernetes-provider
kind: ClusterSecretStore
target:
name: rapidapi-proxy-secret
creationPolicy: Owner
data:
- secretKey: X-RapidAPI-Proxy-Secret
remoteRef:
key: rapidapi-zip-enrichment-source
property: X-RapidAPI-Proxy-Secret