docs: update IT_Abteilung/Automatisierung/Channable_stack
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
title: Channable Stack LT24 Profice Dokumentation
|
title: Channable Stack LT24 Profice Dokumentation
|
||||||
description:
|
description:
|
||||||
published: true
|
published: true
|
||||||
date: 2026-03-06T11:09:09.239Z
|
date: 2026-03-06T11:13:13.929Z
|
||||||
tags:
|
tags:
|
||||||
editor: markdown
|
editor: markdown
|
||||||
dateCreated: 2026-03-06T11:09:09.239Z
|
dateCreated: 2026-03-06T11:09:09.239Z
|
||||||
@@ -49,48 +49,38 @@ Die Pipeline ersetzt den kommerziellen SaaS-Dienst **Channable** durch eine voll
|
|||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
graph TB
|
graph TB
|
||||||
subgraph SERVER["🖥️ DEBIAN SERVER — Docker-Host"]
|
subgraph N8N [n8n - Docker Container]
|
||||||
direction TB
|
CRON[Cron-Trigger - 00:00 Uhr]
|
||||||
|
ERR_HANDLER[Error-Handler - E-Mail / Slack]
|
||||||
subgraph N8N["⚙️ n8n — Docker Container"]
|
|
||||||
CRON["⏰ Cron-Trigger<br/><i>täglich 00:00 Uhr</i>"]
|
|
||||||
ERR_HANDLER["🔔 Error-Handler<br/><i>E-Mail / Slack Alert</i>"]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
subgraph PYTHON["🐍 PYTHON 3.11+ — Virtual Environment"]
|
subgraph EXTRACT [EXTRACT - Datenquellen]
|
||||||
direction LR
|
JTL[JTL-WAWI CSV-Export]
|
||||||
|
GAPI[Google Ads/GA API - 90 Tage]
|
||||||
subgraph EXTRACT["📥 EXTRACT"]
|
|
||||||
JTL["📄 JTL-WAWI<br/>CSV-Export"]
|
|
||||||
GAPI["☁️ Google Ads/GA<br/>API — 90 Tage"]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
subgraph TRANSFORM["🔄 TRANSFORM"]
|
subgraph TRANSFORM [TRANSFORM - Verarbeitung]
|
||||||
DUCKDB_JOIN["🦆 DuckDB<br/>LEFT JOIN<br/><i>Produkte ⟕ Sales</i>"]
|
DUCKDB_JOIN[DuckDB - LEFT JOIN]
|
||||||
POLARS["⚡ Polars<br/>Regel-Engine<br/><i>rules.yaml</i>"]
|
POLARS[Polars Regel-Engine - rules.yaml]
|
||||||
end
|
end
|
||||||
|
|
||||||
subgraph LOAD["📤 LOAD"]
|
subgraph LOAD [LOAD - Upload]
|
||||||
GCONTENT["🛒 Google<br/>Content API<br/><i>Batch-Upload<br/>mit Rate-Limiting</i>"]
|
GCONTENT[Google Content API - Batch-Upload]
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
DUCKDB_FILE[("💾 DuckDB<br/><i>products.duckdb</i>")]
|
DUCKDB_FILE[(DuckDB - products.duckdb)]
|
||||||
LOGS["📋 Logs & Monitoring<br/><i>/opt/etl-pipeline/logs/</i>"]
|
LOGS[Logs und Monitoring]
|
||||||
end
|
|
||||||
|
|
||||||
CRON -->|"startet Pipeline"| JTL
|
CRON -->|startet| JTL
|
||||||
CRON -->|"startet Pipeline"| GAPI
|
CRON -->|startet| GAPI
|
||||||
JTL -->|"CSV Import"| DUCKDB_JOIN
|
JTL -->|CSV Import| DUCKDB_JOIN
|
||||||
GAPI -->|"Sales-Daten"| DUCKDB_JOIN
|
GAPI -->|Sales-Daten| DUCKDB_JOIN
|
||||||
DUCKDB_JOIN -->|"DataFrame"| POLARS
|
DUCKDB_JOIN -->|DataFrame| POLARS
|
||||||
POLARS -->|"transformierte Daten"| GCONTENT
|
POLARS -->|transformierte Daten| GCONTENT
|
||||||
DUCKDB_JOIN -.->|"persistiert"| DUCKDB_FILE
|
DUCKDB_JOIN -.->|persistiert| DUCKDB_FILE
|
||||||
ERR_HANDLER -.->|"bei Exit-Code 1"| LOGS
|
ERR_HANDLER -.->|bei Fehler| LOGS
|
||||||
|
|
||||||
style SERVER fill:#1a1a2e,stroke:#16213e,color:#e0e0e0
|
|
||||||
style N8N fill:#2d3436,stroke:#636e72,color:#dfe6e9
|
style N8N fill:#2d3436,stroke:#636e72,color:#dfe6e9
|
||||||
style PYTHON fill:#2d3436,stroke:#636e72,color:#dfe6e9
|
|
||||||
style EXTRACT fill:#0a3d62,stroke:#3c6382,color:#dfe6e9
|
style EXTRACT fill:#0a3d62,stroke:#3c6382,color:#dfe6e9
|
||||||
style TRANSFORM fill:#1e3799,stroke:#4a69bd,color:#dfe6e9
|
style TRANSFORM fill:#1e3799,stroke:#4a69bd,color:#dfe6e9
|
||||||
style LOAD fill:#6a0572,stroke:#a834a8,color:#dfe6e9
|
style LOAD fill:#6a0572,stroke:#a834a8,color:#dfe6e9
|
||||||
@@ -108,11 +98,11 @@ graph TB
|
|||||||
### ETL-Datenfluss (vereinfacht)
|
### ETL-Datenfluss (vereinfacht)
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
flowchart LR
|
graph LR
|
||||||
A["📄 JTL CSV<br/><i>200k+ Artikel</i>"] --> C["🦆 DuckDB<br/><b>LEFT JOIN</b>"]
|
A[JTL CSV - 200k+ Artikel] --> C[DuckDB - LEFT JOIN]
|
||||||
B["☁️ Google API<br/><i>Sales 90 Tage</i>"] --> C
|
B[Google API - Sales 90 Tage] --> C
|
||||||
C --> D["⚡ Polars<br/><b>rules.yaml</b><br/><i>Custom Labels<br/>Titel-Optimierung<br/>Preis-Logik<br/>Ausschlüsse</i>"]
|
C --> D[Polars - rules.yaml]
|
||||||
D --> E["🛒 Google Content API<br/><b>Batch-Upload</b><br/><i>Rate-Limiting</i>"]
|
D --> E[Google Content API - Batch-Upload]
|
||||||
|
|
||||||
style A fill:#079992,stroke:#38ada9,color:#fff
|
style A fill:#079992,stroke:#38ada9,color:#fff
|
||||||
style B fill:#079992,stroke:#38ada9,color:#fff
|
style B fill:#079992,stroke:#38ada9,color:#fff
|
||||||
@@ -2386,17 +2376,17 @@ Die Kommunikation zwischen n8n (Docker-Container) und der Python-Pipeline auf de
|
|||||||
## 7.2 Workflow-Architektur
|
## 7.2 Workflow-Architektur
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
flowchart TD
|
graph TD
|
||||||
CRON["⏰ <b>Cron Trigger</b><br/><i>täglich 00:00 Uhr</i>"]
|
CRON[Cron Trigger - 00:00 Uhr]
|
||||||
EXEC["⚡ <b>Execute Command</b><br/><code>/opt/etl-pipeline/venv/bin/python<br/>-m scripts.main</code>"]
|
EXEC[Execute Command - python -m scripts.main]
|
||||||
CHECK{"🔍 <b>Exit-Code<br/>prüfen</b>"}
|
CHECK{Exit-Code pruefen}
|
||||||
SUCCESS["✅ <b>Erfolgs-Meldung</b><br/><i>Log + optionale E-Mail</i>"]
|
SUCCESS[Erfolgs-Meldung - Log + E-Mail]
|
||||||
ERROR["❌ <b>Fehler-Alarm</b><br/><i>E-Mail / Slack<br/>Benachrichtigung</i>"]
|
ERROR[Fehler-Alarm - E-Mail / Slack]
|
||||||
|
|
||||||
CRON --> EXEC
|
CRON --> EXEC
|
||||||
EXEC --> CHECK
|
EXEC --> CHECK
|
||||||
CHECK -->|"Exit = 0 — OK"| SUCCESS
|
CHECK -->|Exit 0 - OK| SUCCESS
|
||||||
CHECK -->|"Exit = 1 — Fehler"| ERROR
|
CHECK -->|Exit 1 - Fehler| ERROR
|
||||||
|
|
||||||
style CRON fill:#e58e26,stroke:#fa983a,color:#fff
|
style CRON fill:#e58e26,stroke:#fa983a,color:#fff
|
||||||
style EXEC fill:#0c2461,stroke:#1e3799,color:#fff
|
style EXEC fill:#0c2461,stroke:#1e3799,color:#fff
|
||||||
|
|||||||
Reference in New Issue
Block a user