Erste Vereins-App, die fremde Drittseiten crawlt und aggregiert (Event-Übersicht Konstanz/Kreuzlingen, DE+CH zusammen). Phase-0- Build dependency-arm (manaspur-Pattern): keine @mana/* via Verdaccio, Föderations-Boilerplate inline. - Hono+Bun-API mit health/manifest/search/takedown/dsgvo - Drizzle-Schema (8 Tabellen) gemäß AGGREGATOR_POLICY §6: countries, regions, venues, event_sources, events, crawl_jobs (mit robots_check_passed-Compliance-Beweis), takedown_requests, blocked_domains - Crawl-Policy-Skelett (assertCrawlAllowed) mit Block-List-Check + Pro-Host-Rate-Limit; robots.txt-Lookup pending α-1 - mana-research- und mana-geocoding-Client-Stubs - Search-Endpoint public (kein Auth — Browse-only MVP) - Postgres lokal :5441, db:push grün, /healthz + /readyz + /.well-known/mana-app.json smoke-getestet Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
79 lines
2.6 KiB
Markdown
79 lines
2.6 KiB
Markdown
# Seepuls
|
||
|
||
Veranstaltungen am Bodensee, beidseits der Grenze. Konstanz, Kreuzlingen
|
||
und Umgebung — Deutschland und Schweiz auf einer Plattform.
|
||
|
||
> Föderierte mana-Vereins-App. Aggregiert Event-Daten von Drittseiten
|
||
> (Kulturhäuser, Clubs, Bars, Vereine) und stellt sie länder-
|
||
> übergreifend dar. Spricht das mana-Föderations-Protokoll, gilt
|
||
> [`AGGREGATOR_POLICY.md`](../mana/docs/AGGREGATOR_POLICY.md) als
|
||
> nicht-verhandelbares Regelwerk für das Crawlen fremder Inhalte.
|
||
|
||
## Quick Start
|
||
|
||
```bash
|
||
# Verdaccio-Token holen (einmalig pro Maschine)
|
||
ssh mana-server "cat ~/.npm_token" > /tmp/t
|
||
echo "//pkg.mana.how/:_authToken=$(cat /tmp/t)" >> ~/.npmrc
|
||
chmod 600 ~/.npmrc && rm /tmp/t
|
||
|
||
# Datenbank starten (Postgres auf :5441)
|
||
docker compose up -d
|
||
|
||
# Dependencies + Boot
|
||
NPM_AUTH_TOKEN=$(awk -F= '/_authToken=/{print $2}' ~/.npmrc) pnpm install
|
||
pnpm --filter ./apps/api dev
|
||
```
|
||
|
||
API läuft auf http://localhost:3095. Web (Astro) folgt in Phase α-4.
|
||
|
||
## Architektur (kurz)
|
||
|
||
| Komponente | Stack | Port |
|
||
|---|---|---|
|
||
| API | Hono + Bun + Drizzle | 3095 |
|
||
| Web | Astro (Node-Adapter, SSR + Islands) — folgt α-4 | 3096 |
|
||
| Postgres | docker-compose, lokal | 5441 |
|
||
| Crawler | konsumiert `mana-research` :3068 (Firecrawl/Jina) |
|
||
| Geo | konsumiert `mana-geocoding` :3075 (Photon Europe) |
|
||
| Bilder | konsumiert `mana-media` :3065 (nur App-eigene, gecrawlte → Hot-Link) |
|
||
|
||
## Phasen (Plan)
|
||
|
||
- α-0 (jetzt): Repo-Skelett ✅
|
||
- α-1: Venue-Add-Flow (URL → mana-research → mana-llm → Reviewer-Stop)
|
||
- α-2: Event-Source-Add + Probe-Crawl
|
||
- α-3: node-cron Re-Crawl mit Diff/Dedupe/Politeness
|
||
- α-4: Astro-Web Listenansicht + Filter
|
||
- α-5: Karten-Ansicht (Leaflet + mana-geocoding)
|
||
- β-1: AGGREGATOR_POLICY anwaltliche Review *(Pre-Live-Gate)*
|
||
- β-2: Claim + Take-Down-Endpoints *(Pre-Live-Gate)*
|
||
- β-3: Notifications via mana-notify (Lieblings-Venue-Abo)
|
||
- β-4: Deploy auf mana-server + Live-Smokes
|
||
|
||
## Endpoints (im MVP, public)
|
||
|
||
| Method | Path | Beschreibung |
|
||
|---|---|---|
|
||
| `GET` | `/healthz` | Liveness |
|
||
| `GET` | `/.well-known/mana-app.json` | Manifest |
|
||
| `GET` | `/api/v1/search?q=` | Event/Venue-Suche, public |
|
||
| `GET` | `/api/v1/dsgvo/export?user_id=` | DSGVO-Auskunft auf takedown_requests (Service-Key) |
|
||
|
||
## Crawler-Disziplin
|
||
|
||
robots.txt + ≥1s Crawl-Delay + User-Agent mit Kontakt-Mail. Volle
|
||
Pflichten in [`AGGREGATOR_POLICY.md`](../mana/docs/AGGREGATOR_POLICY.md).
|
||
|
||
Verstöße gegen die Policy sind **kein** akzeptabler Speed-Trade-off.
|
||
Pre-Live-Veto durch `mana-compliance`-Subagent.
|
||
|
||
## Validierung
|
||
|
||
```bash
|
||
pnpm validate-manifest
|
||
pnpm type-check
|
||
pnpm test
|
||
```
|
||
|
||
CI führt alle drei in `.github/workflows/ci.yml` aus.
|