This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Mehrsprachige Hintergrundseite
|
||||
|
||||
Version 2.0.0 stellt unter `/background` eine eigenständige Informationsseite zur KI-Kennzeichnung und zu Artikel 50 des EU AI Act bereit.
|
||||
Version 2.0.2 stellt unter `/background` eine eigenständige Informationsseite zur KI-Kennzeichnung und zu Artikel 50 des EU AI Act bereit.
|
||||
|
||||
## Routen
|
||||
|
||||
|
||||
+13
-2
@@ -1,6 +1,6 @@
|
||||
# Bulk API
|
||||
|
||||
Der Bulk-Dienst ist für Publisher, CMS-Integrationen, Agenturen und andere Server-to-Server-Workflows gedacht.
|
||||
Der Bulk-Dienst ist für Publisher, CMS-Integrationen, Agenturen und andere professionelle Workflows gedacht. Er stellt sowohl eine browserbasierte Bulk Workspace als auch die serverseitige API bereit.
|
||||
|
||||
## Capability
|
||||
|
||||
@@ -29,7 +29,18 @@ BULK_REQUIRE_API_KEY=true
|
||||
API_ALLOWED_ORIGIN=
|
||||
```
|
||||
|
||||
Damit enthält die Angriffsoberfläche keine Generator-, Produkt- oder Hintergrundseite.
|
||||
Der dedizierte Modus enthält bewusst keine öffentliche Generator-, Produkt- oder Hintergrundseite, stellt aber die spezialisierte Bulk Workspace unter `/` und `/bulk` bereit. Die eigentliche Verarbeitung erfolgt weiterhin über denselben authentifizierten API-Endpunkt.
|
||||
|
||||
## Bulk Workspace
|
||||
|
||||
Die browserbasierte Oberfläche ist erreichbar unter:
|
||||
|
||||
```text
|
||||
/
|
||||
/bulk
|
||||
```
|
||||
|
||||
Sie bietet einen visuellen Mehrfach-Workflow, einen erweiterten JSON-Modus, Ergebnislinks sowie JSON-/CSV-Export. Details stehen in [`BULK-WORKSPACE.md`](BULK-WORKSPACE.md).
|
||||
|
||||
## Authentifizierung
|
||||
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
# Bulk Workspace
|
||||
|
||||
Der dedizierte Bulk-Modus stellt neben `POST /v1/bulk/declarations` wieder eine browserbasierte Arbeitsoberfläche bereit.
|
||||
|
||||
## Routen
|
||||
|
||||
```text
|
||||
GET /
|
||||
GET /bulk
|
||||
POST /v1/bulk/declarations
|
||||
```
|
||||
|
||||
Die Oberfläche ist für interne Publisher-, Agentur- und Enterprise-Workflows gedacht. Sie ersetzt die API nicht, sondern verwendet denselben Endpunkt.
|
||||
|
||||
## Visueller Workflow
|
||||
|
||||
Im Standardworkflow werden Inhalte zeilenweise angegeben:
|
||||
|
||||
```text
|
||||
article-1001 | https://example.org/articles/1001
|
||||
article-1002 | https://example.org/articles/1002
|
||||
```
|
||||
|
||||
Alternativ genügt eine URL pro Zeile. IDs werden dann automatisch erzeugt.
|
||||
|
||||
Ein gemeinsames Artikelprofil kann u. a. festlegen:
|
||||
|
||||
- Text, Titelbild, weitere Bilder, Recherche, Übersetzung und Code;
|
||||
- KI-Anteil und menschliche Prüfung pro Bereich;
|
||||
- Nachweisgrundlage;
|
||||
- relevante Artikel-50-Angaben;
|
||||
- redaktionelle Verantwortung.
|
||||
|
||||
## Erweiterter JSON-Modus
|
||||
|
||||
Heterogene Daten können als regulärer Bulk-Request eingefügt werden. Dadurch können einzelne Artikel vollständig unterschiedliche Parameter erhalten.
|
||||
|
||||
## API-Key
|
||||
|
||||
Ist `BULK_REQUIRE_API_KEY=true`, fragt die Oberfläche den Schlüssel lokal ab. Er wird nur im `sessionStorage` des aktuellen Browser-Tabs gehalten und als `Authorization: Bearer ...` an den Bulk-Endpunkt gesendet.
|
||||
|
||||
Der Schlüssel wird nicht serverseitig in HTML eingebettet und nicht in Exportdateien übernommen.
|
||||
|
||||
## Ergebnisse
|
||||
|
||||
Die Oberfläche zeigt pro Datensatz:
|
||||
|
||||
- ID;
|
||||
- Validierungsstatus;
|
||||
- technische Artikel-50-Einordnung;
|
||||
- Link zur Erklärung;
|
||||
- Link zum JSON-LD-Manifest;
|
||||
- Badge-Link;
|
||||
- Validierungsfehler.
|
||||
|
||||
Das Gesamtergebnis kann als JSON oder CSV exportiert werden.
|
||||
|
||||
## Sicherheitsmodell
|
||||
|
||||
Der dedizierte Container behält die 2.0-Sicherheitsdefaults:
|
||||
|
||||
```text
|
||||
SERVICE_MODE=bulk
|
||||
REQUIRE_LICENSE=true
|
||||
BULK_REQUIRE_API_KEY=true
|
||||
API_ALLOWED_ORIGIN=
|
||||
```
|
||||
|
||||
Die Oberfläche ist deshalb kein Ersatz für Netzwerksegmentierung. Für externe Veröffentlichung sollte weiterhin ein TLS-Reverse-Proxy bzw. API-Gateway mit zusätzlicher Authentifizierung eingesetzt werden.
|
||||
@@ -0,0 +1,94 @@
|
||||
# Runtime configuration
|
||||
|
||||
`.env.example` is the canonical and complete reference for environment-based runtime configuration in version 2.0.2.
|
||||
|
||||
The application deliberately does **not** support the former `SALES_URL` or `PRICE_*` variables. Pricing and Pro advertising were removed from the public UI; dead configuration keys are not kept for compatibility.
|
||||
|
||||
## HTTP and identity
|
||||
|
||||
- `LISTEN_ADDRESS`
|
||||
- `BASE_URL`
|
||||
- `OUTPUT_BASE_URL`
|
||||
- `PUBLIC_NAME`
|
||||
- `CONTACT_URL`
|
||||
- `DEFAULT_LANGUAGE`
|
||||
- `HEALTHCHECK_URL`
|
||||
- `SERVICE_MODE`
|
||||
- `API_ALLOWED_ORIGIN`
|
||||
|
||||
## Proxy, logging and transport security
|
||||
|
||||
- `TRUST_PROXY`
|
||||
- `TRUSTED_PROXY_CIDRS`
|
||||
- `LOG_CLIENT_IP`
|
||||
- `ENABLE_HSTS`
|
||||
- `REQUIRE_LICENSE`
|
||||
- `WHITE_LABEL`
|
||||
|
||||
`TRUST_PROXY=true` is rejected unless at least one valid CIDR is configured. Forwarded client-IP headers are only considered when the direct peer address is inside one of those networks.
|
||||
|
||||
`LOG_CLIENT_IP=false` keeps client addresses out of structured request logs.
|
||||
|
||||
`ENABLE_HSTS=true` emits `Strict-Transport-Security: max-age=31536000; includeSubDomains`; enable it only on deployments that are actually HTTPS-only.
|
||||
|
||||
## Prometheus
|
||||
|
||||
- `METRICS_ENABLED`
|
||||
- `METRICS_TOKEN`
|
||||
- `METRICS_TOKEN_FILE`
|
||||
|
||||
Metrics are disabled by default. When enabled, a bearer token of at least 32 characters is mandatory. A configured `METRICS_TOKEN_FILE` has priority over `METRICS_TOKEN`.
|
||||
|
||||
## Operator, privacy and accessibility pages
|
||||
|
||||
The following settings feed `/legal`, `/privacy` and `/accessibility` in `full` and `bulk` mode:
|
||||
|
||||
- `LEGAL_STRICT`
|
||||
- `LEGAL_NAME`
|
||||
- `LEGAL_ADDRESS`
|
||||
- `LEGAL_REPRESENTATIVE`
|
||||
- `LEGAL_EMAIL`
|
||||
- `LEGAL_PHONE`
|
||||
- `LEGAL_REGISTER`
|
||||
- `LEGAL_REGISTER_NUMBER`
|
||||
- `LEGAL_VAT_ID`
|
||||
- `EDITORIAL_RESPONSIBLE_NAME`
|
||||
- `EDITORIAL_RESPONSIBLE_ADDRESS`
|
||||
- `DATA_PROTECTION_CONTACT`
|
||||
- `HOSTING_PROVIDER`
|
||||
- `HOSTING_ADDRESS`
|
||||
- `LOG_RETENTION`
|
||||
- `DATA_RECIPIENTS`
|
||||
- `THIRD_COUNTRY_TRANSFERS`
|
||||
- `SUPERVISORY_AUTHORITY_NAME`
|
||||
- `SUPERVISORY_AUTHORITY_URL`
|
||||
- `CONSUMER_DISPUTE_STATUS`
|
||||
- `CONSUMER_DISPUTE_BODY`
|
||||
- `CONSUMER_DISPUTE_URL`
|
||||
- `ACCESSIBILITY_CONTACT`
|
||||
- `ACCESSIBILITY_STATUS`
|
||||
|
||||
`LEGAL_STRICT=true` is a deployment guard, not a legal-compliance determination. It prevents startup if the core operator/privacy data is empty or still contains common placeholder markers. The pages themselves explicitly state that they do not replace legal review.
|
||||
|
||||
## Runtime licensing
|
||||
|
||||
- `LICENSE_TOKEN`
|
||||
- `LICENSE_TOKEN_FILE`
|
||||
- `LICENSE_INSTANCE_ID`
|
||||
- `LICENSE_MODE`
|
||||
- `LICENSE_SERVER_URL`
|
||||
- `LICENSE_CACHE_FILE`
|
||||
- `LICENSE_REFRESH_INTERVAL`
|
||||
- `LICENSE_REQUEST_TIMEOUT`
|
||||
|
||||
The application contains no licence issuer, private signing key or configurable issuer public key. Licence creation remains external in the Universal License Platform.
|
||||
|
||||
## Bulk
|
||||
|
||||
- `BULK_MAX_ITEMS`
|
||||
- `BULK_MAX_BODY_BYTES`
|
||||
- `BULK_REQUIRE_API_KEY`
|
||||
- `BULK_API_KEY`
|
||||
- `BULK_API_KEY_FILE`
|
||||
|
||||
The `bulk_items` licence limit can further reduce the effective item count. A configured `BULK_API_KEY_FILE` has priority over `BULK_API_KEY`.
|
||||
@@ -16,7 +16,7 @@ Initialization is performed in `internal/app/server.go`. The product ID and embe
|
||||
```go
|
||||
licenses := licenseclient.New(ctx, licenseclient.Config{
|
||||
Product: "ai-disclosure-standard",
|
||||
ClientVersion: "2.0.0",
|
||||
ClientVersion: "2.0.2",
|
||||
Token: cfg.LicenseToken,
|
||||
TrustStore: trustStore,
|
||||
BaseURL: cfg.BaseURL,
|
||||
|
||||
@@ -119,7 +119,7 @@ Anfrage:
|
||||
"baseUrl": "https://ai.example.org",
|
||||
"host": "ai.example.org",
|
||||
"instanceId": "production-eu-1",
|
||||
"clientVersion": "2.0.0"
|
||||
"clientVersion": "2.0.2"
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
# Operator, privacy and accessibility pages
|
||||
|
||||
Version 2.0.2 provides multilingual operator pages in `full` and `bulk` mode:
|
||||
|
||||
- `/legal` (`/imprint` is an alias)
|
||||
- `/privacy`
|
||||
- `/accessibility`
|
||||
|
||||
All eight application languages are supported through `?lang=de`, `?lang=en`, `?lang=fr`, `?lang=es`, `?lang=it`, `?lang=nl`, `?lang=pt` and `?lang=pl`. Each page emits language-alternate metadata.
|
||||
|
||||
These routes remain reachable when `REQUIRE_LICENSE=true` and the runtime licence is unavailable, so legally relevant operator information does not disappear because of a licensing incident. Their static assets are exempt for the same reason.
|
||||
|
||||
The content is generated from environment configuration. Empty optional fields are not rendered. `LEGAL_STRICT` can be used as a production deployment guard, but it does not assert that every field required by every jurisdiction is present.
|
||||
Reference in New Issue
Block a user