203 lines
5.0 KiB
Markdown
203 lines
5.0 KiB
Markdown
# scalable-sync
|
|
|
|
Synchronisiert Scalable Capital Broker-Transaktionen nach Wealthfolio via MCP.
|
|
|
|
## Voraussetzungen
|
|
|
|
- Docker + Docker Compose
|
|
- Wealthfolio mit MCP aktiviert (`WF_MCP_ENABLED=true`)
|
|
- Scalable Capital: Agentic Investing aktiviert (Profil → Sicherheit)
|
|
- `sc`-CLI auf dem Host installiert (siehe unten)
|
|
|
|
## Dateien
|
|
|
|
| Datei | Zweck |
|
|
|---|---|
|
|
| `Dockerfile` | Container-Image |
|
|
| `compose.yaml` | Docker Compose Config |
|
|
| `example.env` | Vorlage für `.env` |
|
|
| `scalable_sync.py` | Sync-Adapter |
|
|
| `requirements.txt` | Python-Abhängigkeiten |
|
|
|
|
## Setup
|
|
|
|
### 1. Scalable CLI auf dem Host installieren
|
|
|
|
**Linux / WSL:**
|
|
```bash
|
|
curl -fsSL -o /tmp/sc.tar.gz \
|
|
"[https://github.com/ScalableCapital/scalable-cli/releases/download/v1.0.0/sc-v1.0.0-linux-x86_64-gnu.tar.gz](https://github.com/ScalableCapital/scalable-cli/releases/download/v1.0.0/sc-v1.0.0-linux-x86_64-gnu.tar.gz)"
|
|
|
|
curl -fsSL -o /tmp/SHA256SUMS \
|
|
"[https://github.com/ScalableCapital/scalable-cli/releases/download/v1.0.0/sc-v1.0.0-SHA256SUMS](https://github.com/ScalableCapital/scalable-cli/releases/download/v1.0.0/sc-v1.0.0-SHA256SUMS)"
|
|
|
|
cd /tmp && grep "linux-x86_64-gnu.tar.gz" SHA256SUMS | awk '{print $1 " sc.tar.gz"}' | sha256sum -c -
|
|
|
|
tar -xzf sc.tar.gz
|
|
sudo mv sc-v1.0.0-linux-x86_64-gnu/sc /usr/local/bin/sc
|
|
sudo chmod +x /usr/local/bin/sc
|
|
sc --version
|
|
```
|
|
|
|
### 2. Login auf dem Host (einmalig)
|
|
|
|
WSL/Linux hat keinen Keyring — daher `session_backend = "file"` setzen:
|
|
|
|
```bash
|
|
mkdir -p ~/.config/scalable-cli
|
|
cat > ~/.config/scalable-cli/config.toml <<'EOF'
|
|
[auth]
|
|
session_backend = "file"
|
|
signing_key_backend = "file"
|
|
EOF
|
|
|
|
sc login --local-read-only
|
|
```
|
|
|
|
### 3. .env anlegen
|
|
|
|
```bash
|
|
cp example.env .env
|
|
# WF_MCP_URL, WF_MCP_TOKEN, WF_ACCOUNT_ID, ASSET_MAP, PUID, PGID anpassen
|
|
```
|
|
|
|
### 4. Bind-Mount in compose.yaml anpassen
|
|
|
|
```yaml
|
|
volumes:
|
|
- scalable-sync-data:/app/data
|
|
- /home/<dein-user>/.config/scalable-cli:/tmp/sc-config:ro
|
|
```
|
|
|
|
### 5. Testen und starten
|
|
|
|
```bash
|
|
docker compose build
|
|
|
|
# Session testen
|
|
docker compose run --rm scalable-sync sc whoami
|
|
docker compose run --rm scalable-sync sc broker holdings
|
|
|
|
# Dry-Run
|
|
docker compose run --rm scalable-sync python /app/scalable_sync.py --once --dry-run
|
|
|
|
# Start
|
|
docker compose up -d
|
|
```
|
|
|
|
## .env Referenz
|
|
|
|
```bash
|
|
WF_MCP_URL=http://wealthfolio:8088/mcp
|
|
WF_MCP_TOKEN=wf_mcp_dein_token_hier
|
|
WF_ACCOUNT_ID=dein-konto-uuid
|
|
|
|
SYNC_INTERVAL_HOURS=6
|
|
SC_OVERLAP_DAYS=14
|
|
SC_SETTLED_ONLY=true
|
|
|
|
# ISIN → Wealthfolio-Symbol
|
|
ASSET_MAP={"IE00B4L5Y983":"EUNL.DE","IE00B3RBWM25":"VWCE.DE"}
|
|
|
|
PUID=1000
|
|
PGID=1000
|
|
```
|
|
|
|
### WF_ACCOUNT_ID finden
|
|
|
|
Wealthfolio → Accounts → Konto anklicken → ID aus der URL kopieren.
|
|
|
|
### ASSET_MAP
|
|
|
|
JSON-Objekt `"ISIN": "Symbol"`. ISINs ermitteln mit:
|
|
```bash
|
|
sc broker holdings
|
|
```
|
|
|
|
### SC_PORTFOLIO_ID
|
|
|
|
Nur bei mehreren Scalable-Portfolios. Ermitteln mit:
|
|
```bash
|
|
docker compose run --rm scalable-sync sc broker context show
|
|
```
|
|
|
|
## Session erneuern
|
|
|
|
```bash
|
|
sc login --local-read-only
|
|
docker compose restart scalable-sync
|
|
```
|
|
|
|
## Befehle
|
|
|
|
| Befehl | Beschreibung |
|
|
|---|---|
|
|
| `docker compose run --rm scalable-sync python /app/scalable_sync.py --once --dry-run` | Testlauf ohne Schreiben |
|
|
| `docker compose run --rm scalable-sync python /app/scalable_sync.py --once` | Einmaliger Sync |
|
|
| `docker compose logs -f` | Logs anzeigen |
|
|
| `docker compose down && docker compose up -d` | Neustart |
|
|
|
|
## Volumes
|
|
|
|
| Volume | Inhalt | Zweck |
|
|
|---|---|---|
|
|
| `scalable-sync-data` | state.db, audit.jsonl, dead-letter.jsonl | Sync-Status und Logs |
|
|
|
|
Die Session liegt auf dem Host unter `~/.config/scalable-cli/` und wird als read-only Bind-Mount eingehängt.
|
|
|
|
## Troubleshooting
|
|
|
|
| Problem | Lösung |
|
|
|---|---|
|
|
| `sc whoami` schlägt fehl | Session abgelaufen — `sc login --local-read-only` wiederholen, dann `docker compose restart` |
|
|
| Keine Transaktionen | `SC_SETTLED_ONLY` und `SC_OVERLAP_DAYS` prüfen |
|
|
| Unmapped ISIN | ISIN in `ASSET_MAP` ergänzen |
|
|
| Mehrere Portfolios | `SC_PORTFOLIO_ID` in `.env` setzen |
|
|
| Doppelte Activities | `WF_ACCOUNT_ID` prüfen |
|
|
|
|
## Wealthfolio-Vorbereitung
|
|
|
|
### 1. MCP aktivieren
|
|
|
|
In der Wealthfolio `compose.yaml`:
|
|
|
|
```yaml
|
|
environment:
|
|
WF_MCP_ENABLED: "true"
|
|
WF_MCP_TOKEN: "wf_mcp_dein_geheimer_token"
|
|
```
|
|
|
|
Danach Wealthfolio neu starten.
|
|
|
|
### 2. Account anlegen
|
|
|
|
Wealthfolio → **Accounts** → **Add Account**:
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `Scalable Capital` (frei wählbar) |
|
|
| Type | `Brokerage` |
|
|
| Currency | `EUR` |
|
|
|
|
**WF_ACCOUNT_ID ermitteln:** Account anklicken → ID aus der URL kopieren:
|
|
|
|
````
|
|
/accounts/550e8400-e29b-41d4-a716-446655440000/ → diese UUID ist deine WF_ACCOUNT_ID
|
|
````
|
|
|
|
### 3. Assets anlegen
|
|
|
|
Jedes ETF muss in Wealthfolio als Asset existieren. Wealthfolio → **Assets** → Asset suchen oder neu anlegen.
|
|
|
|
ISINs deiner gehaltenen ETFs ermitteln:
|
|
```bash
|
|
sc broker holdings
|
|
```
|
|
|
|
Das **Symbol** in Wealthfolio (z. B. `EUNL.DE`) exakt in `ASSET_MAP` übernehmen:
|
|
|
|
```bash
|
|
ASSET_MAP={"IE00B4L5Y983":"EUNL.DE","IE00B3RBWM25":"VWCE.DE","DE0002635307":"EXSA.DE"}
|
|
```
|
|
|
|
> **Wichtig:** Symbol muss exakt übereinstimmen — am besten aus Wealthfolio kopieren, nicht raten. |