Compare commits

..

1 Commits

Author SHA1 Message Date
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
11 changed files with 102 additions and 157 deletions
+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).
+29 -18
View File
@@ -1,18 +1,29 @@
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
# 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
@@ -1,50 +0,0 @@
# 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
@@ -1,30 +0,0 @@
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
@@ -1,8 +0,0 @@
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
@@ -1,7 +0,0 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- namespace.yaml
- helmrepository.yaml
- helmrelease.yaml
- clustersecretstore.yaml
-4
View File
@@ -1,4 +0,0 @@
apiVersion: v1
kind: Namespace
metadata:
name: external-secrets
+29 -18
View File
@@ -1,18 +1,29 @@
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
# 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
-1
View File
@@ -1,7 +1,6 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- external-secrets
- gitea-runner
- monitoring
- docs-site
+29 -18
View File
@@ -1,18 +1,29 @@
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
# 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