Integracja
Integracja z n8n – self-hostowana automatyzacja audio
Twój n8n + Twoje serwery DeepScript = pełna suwerenność danych. Bez automatyzacji w chmurze, bez ryzyka Schrems II.
n8n to self-hostowalna alternatywa dla Zapier i Make – silnik workflow uruchamiasz samodzielnie, na przykład na tym samym serwerze Hetzner co reszta Twojej infrastruktury. W połączeniu z DeepScript (również hostowanym w Niemczech) powstaje pipeline, w którym dane audio, dane workflow i metadane nigdy nie trafiają do amerykańskich dostawców chmury – idealne dla szpitali, kancelarii prawnych i administracji. Oficjalny node społecznościowy DeepScript jest w przygotowaniu; do tego czasu korzystaj z generycznego node'a HTTP Request w n8n z nagłówkiem `X-API-KEY`. Poniżej znajdziesz kompletny eksport workflow w formacie JSON, który możesz zaimportować do swojej instancji n8n (`Workflows → Import from File`). Webhooki z powrotem do n8n działają przez node Webhook, dzięki czemu nawet długie transkrypcje (> 30 min) działają płynnie bez pętli pollingu.
Dokumentacja n8n: node HTTP RequestCo możesz zbudować
- Wszystko self-hosted: n8n + kontenery DeepScript + Twój reverse proxy = pełna suwerenność danych na jednej maszynie.
- Node HTTP Request z nagłówkiem `X-API-KEY` – bez dodatkowej wtyczki, działa od razu.
- Node Webhook dla zdarzeń `transcription.completed`, czysty przepływ asynchroniczny bez pollingu.
- Rozgałęzienia, pętle, code node'y (JavaScript/Python) – złożona logika bezpośrednio w workflow.
- Idealne dla administracji, szpitali i kancelarii prawnych: nic nie trafia do amerykańskiej chmury, wszystko zostaje na Twojej maszynie.
Przykłady kodu
{
"name": "DeepScript: Upload and Process",
"nodes": [
{
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [240, 300],
"parameters": {}
},
{
"name": "Read Audio File",
"type": "n8n-nodes-base.readBinaryFile",
"typeVersion": 1,
"position": [440, 300],
"parameters": { "filePath": "/data/audio/meeting.mp3" }
},
{
"name": "Upload to DeepScript",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [640, 300],
"parameters": {
"method": "POST",
"url": "https://api.deepscript.com/v1/transcriptions",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{ "name": "X-API-KEY", "value": "={{ $env.DEEPSCRIPT_API_KEY }}" }
]
},
"sendBody": true,
"contentType": "multipart-form-data",
"bodyParameters": {
"parameters": [
{ "name": "file", "value": "={{ $binary.data }}", "parameterType": "formBinaryData" },
{ "name": "model", "value": "premium" },
{ "name": "language", "value": "de" }
]
}
}
},
{
"name": "Webhook (transcription.completed)",
"type": "n8n-nodes-base.webhook",
"typeVersion": 1,
"position": [840, 300],
"parameters": {
"path": "deepscript-completed",
"responseMode": "responseNode"
}
},
{
"name": "Get Transcript",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [1040, 300],
"parameters": {
"method": "GET",
"url": "=https://api.deepscript.com/v1/transcriptions/{{ $json.data.transcriptionId }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{ "name": "X-API-KEY", "value": "={{ $env.DEEPSCRIPT_API_KEY }}" }
]
}
}
}
],
"connections": {
"Manual Trigger": { "main": [[{ "node": "Read Audio File", "type": "main", "index": 0 }]] },
"Read Audio File": { "main": [[{ "node": "Upload to DeepScript", "type": "main", "index": 0 }]] },
"Webhook (transcription.completed)": { "main": [[{ "node": "Get Transcript", "type": "main", "index": 0 }]] }
}
}// In an n8n Code node placed right after the Webhook node.
// Verifies the X-DeepScript-Signature header against the raw body.
const crypto = require("crypto");
const SIGNING_SECRET = $env.DEEPSCRIPT_WEBHOOK_SECRET; // "whsec_xxx"
const header = $input.first().json.headers["x-deepscript-signature"];
const rawBody = $input.first().json.body;
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const { t: timestamp, v1: signature } = parts;
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) {
throw new Error("Webhook timestamp out of tolerance (>5min)");
}
const signedPayload = `${timestamp}.${JSON.stringify(rawBody)}`;
const expected = crypto
.createHmac("sha256", SIGNING_SECRET)
.update(signedPayload)
.digest("hex");
const valid = crypto.timingSafeEqual(
Buffer.from(signature, "hex"),
Buffer.from(expected, "hex")
);
if (!valid) throw new Error("Invalid webhook signature");
return [{ json: { verified: true, event: rawBody } }];Konfiguracja w kilku krokach
- 1
Zainstaluj n8n lub uruchom kontener Docker
Przez Docker: `docker run -d --name n8n -p 5678:5678 -v ~/.n8n:/home/node/.n8n n8nio/n8n`. W produkcji zalecamy uruchamianie n8n za Caddy lub Traefik z TLS Let's Encrypt na tym samym serwerze co reszta Twojej infrastruktury.
- 2
Zapisz klucz API jako credential
W n8n w sekcji Credentials utwórz nowy „Generic Credential Type” z nazwą nagłówka `X-API-KEY` i wartością `ds_live_xxx`. Alternatywnie: zamontuj klucz API jako zmienną środowiskową `DEEPSCRIPT_API_KEY` i odwołuj się do niej w node'ach HTTP przez `{{ $env.DEEPSCRIPT_API_KEY }}`.
- 3
Zaimportuj workflow
Skopiuj powyższy eksport JSON do pliku `.json`, a następnie `Workflows → Import from File`. n8n automatycznie wykrywa node'y – wystarczy przypisać credential DeepScript i w razie potrzeby dostosować ścieżki plików.
- 4
Zarejestruj webhook w DeepScript
Node Webhook w n8n daje Ci URL w rodzaju `https://your-n8n.example.com/webhook/deepscript-completed`. Zarejestruj ten URL w `POST /v1/webhooks` ze zdarzeniem `transcription.completed`. Zapisz zwrócony secret w node Code weryfikującym HMAC.
Często zadawane pytania
Czy potrzebuję node'a społecznościowego, czy wystarczy HTTP Request?
HTTP Request wystarcza do każdego przypadku użycia – API jest wystarczająco proste. Node społecznościowy jest w przygotowaniu, ale wniesie głównie udogodnienia (pętla auto-pollingu, typowane wyjścia). Funkcjonalnie nic, czego nie da się zrobić już dziś.
Czy mogę uruchomić n8n na tym samym serwerze co mój reverse proxy?
Tak – zalecane. Konfiguracja Docker Compose z Caddy lub Traefik przed n8n. Przy kilku workflowach na sekundę sensowna jest architektura queue mode w n8n (workery + Redis). Przy niskich wolumenach wystarczy tryb single-instance.
Jak duże mogą być pliki audio w node HTTP Request?
Domyślny limit body w n8n to 16 MB. Aby wykorzystać limit uploadu 500 MB w DeepScript, ustaw `N8N_PAYLOAD_SIZE_MAX=512` (w MB) w swojej instancji n8n. Alternatywa dla bardzo dużych plików: najpierw prześlij je do magazynu zgodnego z S3 i wyślij do API DeepScript tylko URL.
Czy jakiekolwiek dane opuszczają moją infrastrukturę?
Do DeepScript (Hetzner DE) trafia tylko plik audio i metadane. Jeśli DeepScript uruchamiasz również na własnym sprzęcie (setup enterprise), nawet to zostaje u Ciebie. Dane workflow n8n, credentiale i logi w każdym przypadku pozostają na Twoim serwerze.
Czy mogę wersjonować workflowy w Git?
Tak – od wersji 1.0 n8n obsługuje natywną integrację z Git przez Source Control (funkcja enterprise). Community edition: eksportuj workflowy jako JSON i commituj je ręcznie. To ostatnie wystarcza w większości konfiguracji.
Gotowy, aby wdrożyć to na produkcję?
Załóż konto, wygeneruj klucz API i działaj. Trzy transkrypcje za darmo na test. Pełna dokumentacja OpenAPI 3.1 pod api.deepscript.com/docs.