Einrichtung
Diese Anleitung verbindet eine Signal-Nummer Schritt für Schritt mit OctoMesh: Sie betreiben die signal-cli-rest-api-Bridge, geben ihr eine Signal-Identität (registrieren eine dedizierte Nummer oder verknüpfen ein bestehendes Konto), verdrahten die beiden Pipeline-Nodes und testen.
Voraussetzungen
- Docker (für die Bridge).
- Ein laufender OctoMesh Mesh Adapter für den Ziel-Tenant, gebaut mit den
FromSignal@1/SignalSender@1Nodes. - Eine dedizierte Telefonnummer für die Bridge (Prepaid-SIM / eSIM / Ersatznummer). Signal bindet ein Konto pro Nummer — verwenden Sie keine persönliche Nummer wieder, auf die Sie angewiesen sind. (Sie können die Bridge stattdessen mit einem bestehenden Konto verknüpfen — siehe Schritt 2, Option B.)
Die Beispiele verwenden das Bridge-Konto +4366012345678 und den Adapter unter
http://localhost:8080 für die Bridge sowie den Tenant salzburgdev. Ersetzen Sie diese durch
Ihre eigenen Werte.
Schritt 1 — Die Bridge betreiben
Betreiben Sie die Bridge im native-Modus — sie stellt GET /v1/receive/{number} bereit,
das FromSignal@1 abfragt. (Der json-rpc-Modus wird nur für den Push-Webhook-Stil benötigt und
wird hier nicht verwendet.) Binden Sie ein Volume ein, damit das registrierte/verknüpfte
Konto Neustarts übersteht — behandeln Sie es wie ein Credential und committen Sie es niemals.
services:
signal-cli-rest-api:
image: bbernhard/signal-cli-rest-api:latest
container_name: signal-cli-rest-api
restart: unless-stopped
environment:
- MODE=native
ports:
- "8080:8080"
volumes:
- ./signal-cli-config:/home/.local/share/signal-cli # account secrets — do NOT commit
docker compose up -d
curl http://localhost:8080/v1/about # {"versions":[...],"mode":"native",...}
Schritt 2 — Der Bridge eine Signal-Identität geben
Option A — Eine dedizierte Nummer registrieren (empfohlen)
Die Bridge ist das Konto. Die Registrierung benötigt ein Captcha und einen per SMS/Anruf an die Nummer zugestellten Code.
# 1. Request registration — this returns a captcha-required error the first time.
curl -X POST http://localhost:8080/v1/register/+4366012345678 -d '{}'
Lösen Sie das Captcha und versuchen Sie es dann erneut mit dem Token:
- Öffnen Sie
https://signalcaptchas.org/registration/generate.htmlin einem Browser. - Lösen Sie das Captcha; klicken Sie mit der rechten Maustaste auf den Link „Open Signal" →
Link kopieren (klicken Sie ihn nicht an). Der Link sieht so aus:
signalcaptcha://signal-hcaptcha.<token>. - Registrieren Sie mit dem Token (Tokens sind einmalig verwendbar und laufen in wenigen
Minuten ab — ein veraltetes schlägt mit
[403] Authorization failedfehl, holen Sie einfach ein frisches):
curl -X POST http://localhost:8080/v1/register/+4366012345678 \
-H 'Content-Type: application/json' \
-d '{"captcha":"signalcaptcha://signal-hcaptcha.<token>"}'
- Signal sendet einen 6-stelligen SMS-Code an die Nummer. Verifizieren Sie ihn:
curl -X POST http://localhost:8080/v1/register/+4366012345678/verify/123456
curl http://localhost:8080/v1/accounts # ["+4366012345678"]
Option B — Als sekundäres Gerät verknüpfen (keine neue Nummer)
Die Bridge teilt sich ein bestehendes Signal-Konto (dessen Nummer bleibt die Konto-Identität).
curl "http://localhost:8080/v1/qrcodelink?device_name=octo-accounting-bridge" -o link.png
Öffnen Sie link.png und scannen Sie es in der Signal-App: Einstellungen → Verknüpfte Geräte →
Neues Gerät verknüpfen. Bestätigen Sie mit curl http://localhost:8080/v1/accounts.
Eine verknüpfte Bridge handelt als dieses Konto — Antworten werden von der eigenen Nummer der
Person gesendet, und der Assistent beantwortet jede eingehende Nachricht. Bevorzugen Sie für
einen echten Assistenten eine dedizierte Nummer (Option A) und verwenden Sie senderFilter
während des Testens.
Schritt 3 — Die Pipeline verdrahten
Eine Signal-Pipeline spiegelt den E-Mail-Assistenten: ein FromSignal@1-Trigger, dann zwei
Zweige (Text → Antwort, Anhang → Dokument-Ingest) und SignalSender@1 für die Antwort.
triggers:
- type: FromSignal@1
apiUrl: "http://localhost:8080"
number: "+4366012345678" # quote it — an unquoted +number is parsed as an integer
pollingIntervalSeconds: 5
# senderFilter: "+4366098765432" # optional allow-list (contains match)
transformations:
- type: ForEach@1
iterationPath: $.Messages
targetPath: $.results
transformations:
# capture the sender BEFORE any nested ForEach rebinds $.key
- type: SetPrimitiveValue@1
targetPath: $.msgSource
valueType: String
valuePath: $.key.Source
# --- text question -> answer ---
- type: If@1
path: $.key.Message
operator: NotEquals
valueType: String
transformations:
- type: AnthropicAiQuery@1
question: "Answer the user's accounting question."
dataPaths: [ $.key.Message ]
apiKeyConfigurationName: AnthropicAiConfig
mcpServerUrl: "https://localhost:5017"
mcpServiceAccountConfigName: ServiceAccountConfig
responseFormat: text
maxToolRounds: 12
targetPath: $.replyText
continueOnError: true
- type: SignalSender@1
apiUrl: "http://localhost:8080"
number: "+4366012345678"
recipientPath: $.msgSource
messagePath: $.replyText
- Setzen Sie die Nummer in Anführungszeichen (
number: "+43…"). Ohne Anführungszeichen parst YAML+4366012345678als Integer und lässt das führende+fallen, was jeden Bridge-Aufruf bricht. - Innerhalb eines verschachtelten
ForEachwird einvaluePathim Item-Scope ausgewertet. Um einen auf Nachrichtenebene gesetzten Wert (oder ein Request-Root-Feld) zu erreichen, verwenden Sie den Eltern-Alias$.full— z. B.$.full.msgSource. Genau das nutzt dasSourceSender-Provenienz-Attribut.
Anhang-Ingest & Provenienz
Für den Anhang-Zweig hat FromSignal@1 die Bytes bereits nach $.key.Attachments[].Data
(base64) heruntergeladen. Stagen Sie sie als UploadedDocument, genau wie der Upload-Ablauf der
App, und setzen Sie die Herkunft, damit eine Rückfrage den Absender wieder erreichen kann:
- type: CreateUpdateInfo@1
updateKind: Insert
ckTypeId: Meshmakers.Accounting/UploadedDocument
attributeUpdates:
- { attributeName: ProcessingState, attributeValueType: Enum, value: NEW }
- { attributeName: SourceChannel, attributeValueType: Enum, value: SIGNAL }
- { attributeName: SourceSender, attributeValueType: String, valuePath: $.full.msgSource }
# … OriginalFileName / FileRtId / FileHash / UploadedAt as usual
Schritt 4 — Bereitstellen & testen
Importieren Sie die Pipeline und stellen Sie ihren Datenfluss auf dem Adapter bereit:
octo-cli -c ImportRt -f rt-pipeline-signal-accounting-assistant.yaml -r -w
octo-cli -c DeployDataFlow -id <dataFlowRtId>
Bestätigen Sie, dass der Trigger die Bridge abfragt (das Adapter-Log zeigt
GET http://localhost:8080/v1/receive/+4366012345678), und schreiben Sie dann von einem anderen
Signal-Konto an die Bridge-Nummer — der Assistent antwortet innerhalb weniger Sekunden. Senden
Sie ein Foto/PDF, um den Dokument-Ingest-Zweig auszuüben.
Fügen Sie vor dem Produktivbetrieb eine Absender-Allow-List (senderFilter oder ein
SignalContact-Mapping) hinzu — sonst kann jeder, der die Nummer kennt, Live-Daten abfragen.
Denken Sie daran, dass die Telefonnummer und alle Rechnungsbilder die Bridge durchlaufen und für
Q&A in den KI-/MCP-Kontext gelangen — decken Sie das in Ihrem DSGVO-Verzeichnis ab.