docs: update Profice-services/feedgine
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
title: FEEDGINE
|
title: FEEDGINE
|
||||||
description:
|
description:
|
||||||
published: true
|
published: true
|
||||||
date: 2026-03-26T13:14:25.187Z
|
date: 2026-03-26T13:33:30.807Z
|
||||||
tags:
|
tags:
|
||||||
editor: markdown
|
editor: markdown
|
||||||
dateCreated: 2026-03-26T13:12:31.315Z
|
dateCreated: 2026-03-26T13:12:31.315Z
|
||||||
@@ -12,7 +12,7 @@ dateCreated: 2026-03-26T13:12:31.315Z
|
|||||||
|
|
||||||
**Projekt:** POAS Feed Enricher
|
**Projekt:** POAS Feed Enricher
|
||||||
**Sprache:** Python 3.11
|
**Sprache:** Python 3.11
|
||||||
**Stand:** März 2026
|
**Stand:** 26.01.2026
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ flowchart TD
|
|||||||
D --> E["Angereicherter XML-Feed"]
|
D --> E["Angereicherter XML-Feed"]
|
||||||
E --> F["Google Merchant Center"]
|
E --> F["Google Merchant Center"]
|
||||||
E --> G["nginx Feed-Server"]
|
E --> G["nginx Feed-Server"]
|
||||||
D --> H["Telegram-Benachrichtigung"]
|
D --> H["Chat- & E-Mail-Benachrichtigung"]
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -228,7 +228,7 @@ Der Scheduler ist der Haupteinstiegspunkt. Er läuft dauerhaft und startet die P
|
|||||||
- Berechnung des nächsten Ausführungszeitpunkts aus `SCHEDULE_HOUR` und `SCHEDULE_MINUTE`
|
- Berechnung des nächsten Ausführungszeitpunkts aus `SCHEDULE_HOUR` und `SCHEDULE_MINUTE`
|
||||||
- Wartemodus in 60-Sekunden-Intervallen (CPU-schonend)
|
- Wartemodus in 60-Sekunden-Intervallen (CPU-schonend)
|
||||||
- Unterstützt `--run-now` (sofortige Ausführung), `--once` (einmalig, dann Beenden), `--lookback-days N`
|
- Unterstützt `--run-now` (sofortige Ausführung), `--once` (einmalig, dann Beenden), `--lookback-days N`
|
||||||
- Sendet Telegram-Benachrichtigung beim Start des Schedulers
|
- Sendet Chat- und E-Mail-Benachrichtigung beim Start des Schedulers
|
||||||
|
|
||||||
### 3.2 Watchdog / Pipeline-Ausführer (`Startup/watchdog.py`)
|
### 3.2 Watchdog / Pipeline-Ausführer (`Startup/watchdog.py`)
|
||||||
|
|
||||||
@@ -240,7 +240,7 @@ Der Watchdog orchestriert den gesamten Ausführungsablauf und implementiert Fehl
|
|||||||
- Startet die Pipeline als Subprozess (mit Timeout)
|
- Startet die Pipeline als Subprozess (mit Timeout)
|
||||||
- Retry-Logik: bis zu `MAX_RETRIES` Versuche mit `RETRY_DELAY_SECONDS` Pause
|
- Retry-Logik: bis zu `MAX_RETRIES` Versuche mit `RETRY_DELAY_SECONDS` Pause
|
||||||
- **Integritätsprüfungen** vor der Veröffentlichung (siehe 3.6)
|
- **Integritätsprüfungen** vor der Veröffentlichung (siehe 3.6)
|
||||||
- Telegram-Benachrichtigungen bei Erfolg und Fehler (inkl. Log-Anhang)
|
- Chat- und E-Mail-Benachrichtigungen bei Erfolg und Fehler (inkl. Log-Anhang)
|
||||||
|
|
||||||
### 3.3 Google Ads Datenabruf (`poas_feed_enricher/app.py`)
|
### 3.3 Google Ads Datenabruf (`poas_feed_enricher/app.py`)
|
||||||
|
|
||||||
@@ -300,7 +300,7 @@ Vor der Veröffentlichung des Feeds werden drei Sicherheitsprüfungen durchgefü
|
|||||||
| Integritäts-Check | Keine Produkte mit fehlender `g:id` | Strukturfehler im XML |
|
| Integritäts-Check | Keine Produkte mit fehlender `g:id` | Strukturfehler im XML |
|
||||||
| Sanity-Check | Produktanzahl weicht < ±1000 vom Vorrun ab | Anomaler Produktverlust |
|
| Sanity-Check | Produktanzahl weicht < ±1000 vom Vorrun ab | Anomaler Produktverlust |
|
||||||
|
|
||||||
Schlägt eine Prüfung fehl, wird der Feed **nicht** veröffentlicht und eine Telegram-Warnung gesendet.
|
Schlägt eine Prüfung fehl, wird der Feed **nicht** veröffentlicht und eine Chat- sowie E-Mail-Warnung gesendet.
|
||||||
|
|
||||||
### 3.7 Feed-Veröffentlichung (`Startup/feed_publisher.py`)
|
### 3.7 Feed-Veröffentlichung (`Startup/feed_publisher.py`)
|
||||||
|
|
||||||
@@ -320,21 +320,21 @@ Verwaltet Speicherplatz durch automatische Rotation der datierten Ordner.
|
|||||||
- Behält die neuesten `KEEP_LAST_N` (Standard: 3) Ordner
|
- Behält die neuesten `KEEP_LAST_N` (Standard: 3) Ordner
|
||||||
- Löscht ältere Ordner automatisch
|
- Löscht ältere Ordner automatisch
|
||||||
|
|
||||||
### 3.9 Telegram-Benachrichtigungen (`Startup/telegram_notifier.py`)
|
### 3.9 Chat- und E-Mail-Benachrichtigungen (`Startup/notifier.py`)
|
||||||
|
|
||||||
Sendet Status-Nachrichten an konfigurierte Telegram-Chats.
|
Sendet Status-Nachrichten über zwei Kanäle: als **Chat-Nachricht** (z. B. an einen konfigurierten Messaging-Dienst) und als **E-Mail** an definierte Empfängeradressen.
|
||||||
|
|
||||||
**Nachrichten-Typen:**
|
**Nachrichten-Typen:**
|
||||||
|
|
||||||
| Ereignis | Inhalt |
|
| Ereignis | Chat-Nachricht | E-Mail |
|
||||||
|---|---|
|
|---|---|---|
|
||||||
| Scheduler-Start | Programmstart, geplante Uhrzeit, Lookback-Tage |
|
| Scheduler-Start | Programmstart, geplante Uhrzeit, Lookback-Tage | Startbestätigung |
|
||||||
| Pipeline gestartet | Ausführungsbeginn |
|
| Pipeline gestartet | Ausführungsbeginn | — |
|
||||||
| **Erfolg** | Feed-Statistiken, Label-Verteilung, Feed-URL |
|
| **Erfolg** | Feed-Statistiken, Label-Verteilung, Feed-URL | Zusammenfassung mit allen Kennzahlen |
|
||||||
| **Fehler** | Fehlermeldung + vollständige Log-Datei als Anhang |
|
| **Fehler** | Fehlermeldung + Log-Anhang | Detaillierte Fehlermeldung + Log-Datei im Anhang |
|
||||||
| Feed gesperrt | Grund der Sicherheitsprüfung (Zero/Integrität/Sanity) |
|
| Feed gesperrt | Grund der Sicherheitsprüfung (Zero/Integrität/Sanity) | Detaillierte Sperrmeldung mit Empfehlung |
|
||||||
|
|
||||||
**Beispielformat einer Erfolgsmeldung:**
|
**Beispielformat einer Chat-Erfolgsnachricht:**
|
||||||
|
|
||||||
```
|
```
|
||||||
POAS Pipeline — SUCCESS
|
POAS Pipeline — SUCCESS
|
||||||
@@ -364,6 +364,36 @@ GMC Feed: https://[FEED-SERVER]/[CLIENT_PREFIX]/poas_feed.xml
|
|||||||
|
|
||||||
> *Dies ist ein Beispielformat — Zahlen und URLs sind Platzhalter.*
|
> *Dies ist ein Beispielformat — Zahlen und URLs sind Platzhalter.*
|
||||||
|
|
||||||
|
**Beispielformat einer E-Mail-Erfolgsnachricht:**
|
||||||
|
|
||||||
|
```
|
||||||
|
Betreff: [POAS Pipeline] Feed-Lauf erfolgreich — TT.MM.JJJJ
|
||||||
|
|
||||||
|
Guten Tag,
|
||||||
|
|
||||||
|
der tägliche Feed-Lauf wurde erfolgreich abgeschlossen.
|
||||||
|
|
||||||
|
Datum: TT.MM.JJJJ HH:MM
|
||||||
|
Ausgabeordner: Output TT.MM.JJJJ
|
||||||
|
|
||||||
|
Feed-Zusammenfassung:
|
||||||
|
Quell-XML: XXX.XXX Produkte
|
||||||
|
Endgültiger Feed: XXX.XXX Produkte
|
||||||
|
Ads-Treffer: XXX.XXX Produkte
|
||||||
|
|
||||||
|
Label-Verteilung:
|
||||||
|
Longtail: XX.XXX (XX,X %)
|
||||||
|
Core: XX.XXX (XX,X %)
|
||||||
|
Feeder: XX.XXX (XX,X %)
|
||||||
|
|
||||||
|
Feed-URL: https://[FEED-SERVER]/[CLIENT_PREFIX]/poas_feed.xml
|
||||||
|
|
||||||
|
Mit freundlichen Grüßen
|
||||||
|
POAS Pipeline
|
||||||
|
```
|
||||||
|
|
||||||
|
> *Dies ist ein Beispielformat — Zahlen, Adressen und URLs sind Platzhalter.*
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 4. Installation ohne Docker (Direktinstallation)
|
## 4. Installation ohne Docker (Direktinstallation)
|
||||||
@@ -422,8 +452,11 @@ nano .env
|
|||||||
Die folgenden Variablen **müssen** gesetzt werden (Details siehe [Abschnitt 6](#6-konfiguration)):
|
Die folgenden Variablen **müssen** gesetzt werden (Details siehe [Abschnitt 6](#6-konfiguration)):
|
||||||
|
|
||||||
```dotenv
|
```dotenv
|
||||||
TELEGRAM_BOT_TOKEN=...
|
NOTIFY_CHAT_TOKEN=...
|
||||||
TELEGRAM_CHAT_IDS=...
|
NOTIFY_CHAT_IDS=...
|
||||||
|
NOTIFY_EMAIL_TO=...
|
||||||
|
NOTIFY_EMAIL_FROM=...
|
||||||
|
NOTIFY_EMAIL_SMTP=...
|
||||||
SHOP_NAME=...
|
SHOP_NAME=...
|
||||||
SHOP_URL=...
|
SHOP_URL=...
|
||||||
FEED_ZIPS=...
|
FEED_ZIPS=...
|
||||||
@@ -621,9 +654,15 @@ services:
|
|||||||
container_name: poas-pipeline
|
container_name: poas-pipeline
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
# Telegram
|
# Chat-Benachrichtigung
|
||||||
TELEGRAM_BOT_TOKEN: "[BOT_TOKEN]"
|
NOTIFY_CHAT_TOKEN: "[CHAT_BOT_TOKEN]"
|
||||||
TELEGRAM_CHAT_IDS: "[CHAT_ID_1],[CHAT_ID_2]"
|
NOTIFY_CHAT_IDS: "[CHAT_ID_1],[CHAT_ID_2]"
|
||||||
|
|
||||||
|
# E-Mail-Benachrichtigung
|
||||||
|
NOTIFY_EMAIL_TO: "[empfaenger@beispiel.de]"
|
||||||
|
NOTIFY_EMAIL_FROM: "[absender@beispiel.de]"
|
||||||
|
NOTIFY_EMAIL_SMTP: "[smtp.beispiel.de]"
|
||||||
|
NOTIFY_EMAIL_SMTP_PORT: "587"
|
||||||
|
|
||||||
# Shop-Informationen
|
# Shop-Informationen
|
||||||
SHOP_NAME: "[SHOPNAME]"
|
SHOP_NAME: "[SHOPNAME]"
|
||||||
@@ -760,16 +799,16 @@ graph TB
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
INTERNET["Internet\nGoogle Ads API / Telegram / Shop-ZIP"]
|
INTERNET["Internet\nGoogle Ads API / Shop-ZIP"]
|
||||||
GMC["Google Merchant Center"]
|
GMC["Google Merchant Center"]
|
||||||
TELEGRAM["Telegram"]
|
NOTIFY["Chat- & E-Mail-Benachrichtigung"]
|
||||||
|
|
||||||
PIPELINE --> V1
|
PIPELINE --> V1
|
||||||
PIPELINE --> V2
|
PIPELINE --> V2
|
||||||
NGINX --> V2
|
NGINX --> V2
|
||||||
PIPELINE --> INTERNET
|
PIPELINE --> INTERNET
|
||||||
NGINX -->|"Port 8525"| GMC
|
NGINX -->|"Port 8525"| GMC
|
||||||
PIPELINE --> TELEGRAM
|
PIPELINE --> NOTIFY
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -782,8 +821,12 @@ Alle Konfigurationsparameter werden über die `.env`-Datei (Direktinstallation)
|
|||||||
|
|
||||||
| Variable | Beispielformat | Beschreibung |
|
| Variable | Beispielformat | Beschreibung |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `TELEGRAM_BOT_TOKEN` | `[TOKEN]:AAG...` | Token des Telegram-Bots |
|
| `NOTIFY_CHAT_TOKEN` | `[TOKEN]` | API-Token für den Chat-Benachrichtigungsdienst |
|
||||||
| `TELEGRAM_CHAT_IDS` | `[ID1],[ID2]` | Chat-IDs (kommagetrennt) |
|
| `NOTIFY_CHAT_IDS` | `[ID1],[ID2]` | Empfänger-IDs für Chat-Nachrichten (kommagetrennt) |
|
||||||
|
| `NOTIFY_EMAIL_TO` | `[empfaenger@beispiel.de]` | E-Mail-Empfängeradresse(n), kommagetrennt |
|
||||||
|
| `NOTIFY_EMAIL_FROM` | `[absender@beispiel.de]` | Absenderadresse für E-Mail-Benachrichtigungen |
|
||||||
|
| `NOTIFY_EMAIL_SMTP` | `[smtp.beispiel.de]` | SMTP-Serveradresse |
|
||||||
|
| `NOTIFY_EMAIL_SMTP_PORT` | `587` | SMTP-Port (587 für STARTTLS, 465 für SSL) |
|
||||||
| `SHOP_NAME` | `[Shopname]` | Name des Shops (für Feed-Titel) |
|
| `SHOP_NAME` | `[Shopname]` | Name des Shops (für Feed-Titel) |
|
||||||
| `SHOP_URL` | `https://[shop-domain]` | Shop-URL (für Feed-Link) |
|
| `SHOP_URL` | `https://[shop-domain]` | Shop-URL (für Feed-Link) |
|
||||||
| `SHOP_DESCRIPTION` | `[Beschreibung]` | Shop-Beschreibung |
|
| `SHOP_DESCRIPTION` | `[Beschreibung]` | Shop-Beschreibung |
|
||||||
@@ -842,9 +885,9 @@ sequenceDiagram
|
|||||||
participant API as Google Ads API
|
participant API as Google Ads API
|
||||||
participant ZIP as Shop-ZIP-Server
|
participant ZIP as Shop-ZIP-Server
|
||||||
participant N as nginx
|
participant N as nginx
|
||||||
participant TG as Telegram
|
participant MSG as Chat & E-Mail
|
||||||
|
|
||||||
S->>TG: Scheduler gestartet
|
S->>MSG: Scheduler gestartet
|
||||||
Note over S: Wartet bis SCHEDULE_HOUR:SCHEDULE_MINUTE
|
Note over S: Wartet bis SCHEDULE_HOUR:SCHEDULE_MINUTE
|
||||||
|
|
||||||
loop Täglich
|
loop Täglich
|
||||||
@@ -857,7 +900,7 @@ sequenceDiagram
|
|||||||
W->>W: Integritätsprüfungen
|
W->>W: Integritätsprüfungen
|
||||||
W->>N: Feed veröffentlichen
|
W->>N: Feed veröffentlichen
|
||||||
W->>W: Alte Ordner löschen
|
W->>W: Alte Ordner löschen
|
||||||
W->>TG: Erfolgsmeldung mit Statistiken
|
W->>MSG: Erfolgsmeldung mit Statistiken
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -974,13 +1017,13 @@ graph TD
|
|||||||
LABEL["label_engine.py — POAS-Berechnung"]
|
LABEL["label_engine.py — POAS-Berechnung"]
|
||||||
PUB["feed_publisher.py — Veröffentlichung"]
|
PUB["feed_publisher.py — Veröffentlichung"]
|
||||||
CLEAN["cleanup.py — Speicherverwaltung"]
|
CLEAN["cleanup.py — Speicherverwaltung"]
|
||||||
TG["telegram_notifier.py — Benachrichtigung"]
|
TG["notifier.py — Chat- & E-Mail-Benachrichtigung"]
|
||||||
end
|
end
|
||||||
|
|
||||||
subgraph OUTPUT["Ausgabe"]
|
subgraph OUTPUT["Ausgabe"]
|
||||||
FEED["poas_feed.xml (angereicherter GMC-Feed)"]
|
FEED["poas_feed.xml (angereicherter GMC-Feed)"]
|
||||||
NGINX["nginx — Feed-Server"]
|
NGINX["nginx — Feed-Server"]
|
||||||
TELEGRAM["Telegram — Benachrichtigung"]
|
NOTIFY["Chat- & E-Mail-Benachrichtigung"]
|
||||||
end
|
end
|
||||||
|
|
||||||
ZIP --> WATCH
|
ZIP --> WATCH
|
||||||
@@ -997,7 +1040,7 @@ graph TD
|
|||||||
FEED --> NGINX
|
FEED --> NGINX
|
||||||
WATCH --> CLEAN
|
WATCH --> CLEAN
|
||||||
WATCH --> TG
|
WATCH --> TG
|
||||||
TG --> TELEGRAM
|
TG --> NOTIFY
|
||||||
```
|
```
|
||||||
|
|
||||||
### 8.2 Dateistruktur
|
### 8.2 Dateistruktur
|
||||||
@@ -1033,7 +1076,7 @@ poas-pipeline/
|
|||||||
│ ├── watchdog.py ← Pipeline-Ausführer + Retry
|
│ ├── watchdog.py ← Pipeline-Ausführer + Retry
|
||||||
│ ├── cleanup.py ← Ordner-Erstellung & -Rotation
|
│ ├── cleanup.py ← Ordner-Erstellung & -Rotation
|
||||||
│ ├── feed_publisher.py ← Feed nach nginx kopieren
|
│ ├── feed_publisher.py ← Feed nach nginx kopieren
|
||||||
│ ├── telegram_notifier.py ← Telegram-Benachrichtigungen
|
│ ├── notifier.py ← Chat- & E-Mail-Benachrichtigungen
|
||||||
│ └── logs/ ← Ausführungs-Logs
|
│ └── logs/ ← Ausführungs-Logs
|
||||||
│
|
│
|
||||||
├── Datei/ ← Statische Eingabedaten
|
├── Datei/ ← Statische Eingabedaten
|
||||||
@@ -1058,13 +1101,13 @@ sequenceDiagram
|
|||||||
participant APP as Ads-Abruf
|
participant APP as Ads-Abruf
|
||||||
participant TRN as XML-Anreicherung
|
participant TRN as XML-Anreicherung
|
||||||
participant PUB as Feed-Publisher
|
participant PUB as Feed-Publisher
|
||||||
participant TG as Telegram
|
participant MSG as Chat & E-Mail
|
||||||
|
|
||||||
SCH->>TG: Scheduler gestartet
|
SCH->>MSG: Scheduler gestartet
|
||||||
Note over SCH: Wartet bis SCHEDULE_HOUR:SCHEDULE_MINUTE (UTC)
|
Note over SCH: Wartet bis SCHEDULE_HOUR:SCHEDULE_MINUTE (UTC)
|
||||||
|
|
||||||
SCH->>WDG: execute_pipeline(lookback_days)
|
SCH->>WDG: execute_pipeline(lookback_days)
|
||||||
WDG->>TG: Pipeline gestartet
|
WDG->>MSG: Pipeline gestartet
|
||||||
|
|
||||||
WDG->>CLN: Datierten Input-Ordner erstellen
|
WDG->>CLN: Datierten Input-Ordner erstellen
|
||||||
CLN->>CLN: ZIP-Feeds herunterladen
|
CLN->>CLN: ZIP-Feeds herunterladen
|
||||||
@@ -1099,9 +1142,9 @@ sequenceDiagram
|
|||||||
PUB->>PUB: ZIP-Archiv erstellen
|
PUB->>PUB: ZIP-Archiv erstellen
|
||||||
PUB-->>WDG: OK
|
PUB-->>WDG: OK
|
||||||
WDG->>CLN: Alte Ordner rotieren
|
WDG->>CLN: Alte Ordner rotieren
|
||||||
WDG->>TG: Erfolgsmeldung mit Statistiken
|
WDG->>MSG: Erfolgsmeldung + Statistiken (Chat & E-Mail)
|
||||||
else Prüfung fehlgeschlagen
|
else Prüfung fehlgeschlagen
|
||||||
WDG->>TG: Warnung: Feed gesperrt (Grund)
|
WDG->>MSG: Warnung: Feed gesperrt (Chat & E-Mail)
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -1132,8 +1175,7 @@ flowchart TD
|
|||||||
F6 -- Ja --> FU["underperformer — custom_label_4"]
|
F6 -- Ja --> FU["underperformer — custom_label_4"]
|
||||||
F6 -- Nein --> FI["invisibles — custom_label_4"]
|
F6 -- Nein --> FI["invisibles — custom_label_4"]
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Letzte Aktualisierung:** 26.03.2026
|
|
||||||
|
|
||||||
*Dokumentation für POAS Feed Enricher — alle Namen, URLs, IDs und Zahlen in dieser Dokumentation sind Platzhalter und dienen ausschließlich der Veranschaulichung.*
|
*Dokumentation für POAS Feed Enricher — alle Namen, URLs, IDs und Zahlen in dieser Dokumentation sind Platzhalter und dienen ausschließlich der Veranschaulichung.*
|
||||||
|
|||||||
Reference in New Issue
Block a user