a615b7ebfd
Closes leeworks-agents/api-company#5 (docs-site Astro scaffold) Closes leeworks-agents/api-company#9 (metrics instrumentation standard) Closes leeworks-agents/api-company#10 (Gitea Actions openapi aggregation pipeline) Closes leeworks-agents/api-company#11 (docs-site Flux HelmRelease) Closes leeworks-agents/api-company#12 (SEO blog posts x3) Closes leeworks-agents/api-company#13 (legal docs ToS/Privacy/AUP) Closes leeworks-agents/api-company#14 (DNS documentation) ## Changes ### docs/legal/ - terms-of-service.md — API usage, liability, account termination, governing law - privacy-policy.md — request log retention (90d), no PII sold, data sharing - acceptable-use-policy.md — rate limit abuse, scraping prohibition, resale ban ### docs/metrics-standard.md - Defines api_requests_total, api_response_duration_seconds, api_data_freshness_seconds - Fastify (TypeScript) and FastAPI (Python) reference middleware implementations - Prometheus scrape config and Grafana dashboard guidance ### docs/registry.md - Decision: use Gitea built-in container registry (no new infra) - Image naming convention, auth, Kubernetes imagePullSecrets, ingress config ### docs/dns.md - Required A records for all 6 subdomains - cert-manager ClusterIssuer and Ingress TLS examples - Verification commands and human-operator action items ### docs-site/ - Astro 4 + MDX + sitemap scaffold - Base layout with nav linking all APIs, blog, RapidAPI, status - Landing page with API cards - Per-API Redoc viewer pages (zip-enrichment, holidays, air-quality) - Blog index + 3 SEO blog posts (~1000 words each with JSON-LD) - Dockerfile (multi-stage: node build + nginx serve) - nginx.conf with gzip, caching, health endpoint ### flux/ - gitea-runner/: gitea-act-runner HelmRelease (org-scope, dind) - monitoring/: kube-prometheus-stack + Gatus HelmReleases - Prometheus with pod annotation scraping - Grafana at grafana.leeworks.dev with persistence - Gatus status page at status.leeworks.dev, 90-day retention - docs-site/: Deployment + Service + Ingress via raw chart - api-company-source/: GitRepository + Kustomization reference manifests - kustomization.yaml: root kustomize entry point (build validated) ### .gitea/workflows/build-docs.yaml - Aggregates openapi.yaml from zip-enrichment, holidays, air-quality repos - Builds Astro docs-site - Pushes image to registry.leeworks.dev/leeworks-agents/docs-site - Triggered on push to main, schedule daily 02:00 UTC, workflow_dispatch
30 lines
1.2 KiB
Plaintext
30 lines
1.2 KiB
Plaintext
---
|
|
import Base from '../../layouts/Base.astro';
|
|
|
|
const posts = await Astro.glob('./*.mdx');
|
|
posts.sort((a, b) => new Date(b.frontmatter.date).getTime() - new Date(a.frontmatter.date).getTime());
|
|
---
|
|
<Base title="Blog" description="leeworks.dev developer blog">
|
|
<style>
|
|
.blog-hero { padding: 3rem 2rem 1rem; text-align: center; }
|
|
.blog-hero h1 { font-size: 2.5rem; font-weight: 700; margin-bottom: 0.5rem; }
|
|
.blog-hero p { color: #a0aec0; }
|
|
.posts { max-width: 800px; margin: 2rem auto; padding: 0 2rem; }
|
|
.post-card { border-bottom: 1px solid #2d3748; padding: 2rem 0; }
|
|
.post-card h2 a { color: #90cdf4; text-decoration: none; font-size: 1.5rem; }
|
|
.meta { color: #718096; font-size: 0.875rem; margin: 0.5rem 0; }
|
|
.description { color: #a0aec0; }
|
|
</style>
|
|
<div class="blog-hero"><h1>Blog</h1><p>Tutorials and news from leeworks.dev</p></div>
|
|
<div class="posts">
|
|
{posts.map(post => (
|
|
<div class="post-card">
|
|
<h2><a href={post.url}>{post.frontmatter.title}</a></h2>
|
|
<div class="meta">{post.frontmatter.date}</div>
|
|
<p class="description">{post.frontmatter.description}</p>
|
|
</div>
|
|
))}
|
|
{posts.length === 0 && <p style="color: #718096">No posts yet.</p>}
|
|
</div>
|
|
</Base>
|