- qwen3.5:9b-q8_0 → id-9b:latest 전체 교체 (워크플로우, Python 스크립트) - deploy_workflows.sh 생성 (n8n REST API 자동 배포) - .env.example: CalDAV/IMAP/Karakeep 기본값 수정 - 문서 업데이트: tk_qc_issues 컬렉션, 맥미니 Ollama 기동 안내 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
85 lines
2.4 KiB
Bash
Executable File
85 lines
2.4 KiB
Bash
Executable File
#!/bin/bash
|
|
# n8n REST API로 워크플로우 업데이트
|
|
# 사용법: ./deploy_workflows.sh [--activate]
|
|
# 필요: N8N_API_KEY 환경변수 또는 .env 파일
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
N8N_URL="${N8N_URL:-http://localhost:5678}"
|
|
WORKFLOW_DIR="$SCRIPT_DIR/n8n/workflows"
|
|
|
|
# .env에서 API 키 로드
|
|
if [ -z "${N8N_API_KEY:-}" ] && [ -f "$SCRIPT_DIR/.env" ]; then
|
|
N8N_API_KEY=$(grep '^N8N_API_KEY=' "$SCRIPT_DIR/.env" | cut -d= -f2-)
|
|
fi
|
|
if [ -z "${N8N_API_KEY:-}" ]; then
|
|
echo "ERROR: N8N_API_KEY not set. Set it in .env or as environment variable."
|
|
exit 1
|
|
fi
|
|
|
|
AUTH_HEADER="X-N8N-API-KEY: $N8N_API_KEY"
|
|
ACTIVATE="${1:-}"
|
|
|
|
# 워크플로우 이름 → ID 매핑 (n8n API에서 조회)
|
|
get_workflow_id() {
|
|
local name="$1"
|
|
curl -s -H "$AUTH_HEADER" "$N8N_URL/api/v1/workflows?limit=100" \
|
|
| python3 -c "
|
|
import sys, json
|
|
data = json.loads(sys.stdin.read())
|
|
for wf in data.get('data', []):
|
|
if wf['name'] == '$name':
|
|
print(wf['id'])
|
|
break
|
|
"
|
|
}
|
|
|
|
deploy_workflow() {
|
|
local file="$1"
|
|
local name
|
|
name=$(python3 -c "import json; print(json.load(open('$file'))['name'])")
|
|
local wf_id
|
|
wf_id=$(get_workflow_id "$name")
|
|
|
|
if [ -z "$wf_id" ]; then
|
|
echo " Creating new workflow: $name"
|
|
wf_id=$(curl -s -X POST "$N8N_URL/api/v1/workflows" \
|
|
-H "$AUTH_HEADER" \
|
|
-H "Content-Type: application/json" \
|
|
-d @"$file" \
|
|
| python3 -c "import sys, json; print(json.loads(sys.stdin.read())['id'])")
|
|
echo " Created: $wf_id"
|
|
else
|
|
echo " Updating workflow: $name (id=$wf_id)"
|
|
local http_code
|
|
http_code=$(curl -s -o /dev/null -w '%{http_code}' -X PUT \
|
|
"$N8N_URL/api/v1/workflows/$wf_id" \
|
|
-H "$AUTH_HEADER" \
|
|
-H "Content-Type: application/json" \
|
|
-d @"$file")
|
|
if [ "$http_code" -ge 400 ]; then
|
|
echo " FAILED (HTTP $http_code)"
|
|
return 1
|
|
fi
|
|
echo " Updated (HTTP $http_code)"
|
|
fi
|
|
|
|
if [ "$ACTIVATE" = "--activate" ]; then
|
|
curl -s -X POST "$N8N_URL/api/v1/workflows/$wf_id/activate" \
|
|
-H "$AUTH_HEADER" > /dev/null
|
|
echo " Activated"
|
|
fi
|
|
}
|
|
|
|
echo "=== n8n Workflow Deploy ==="
|
|
echo "Target: $N8N_URL"
|
|
echo ""
|
|
|
|
for file in "$WORKFLOW_DIR"/*.json; do
|
|
echo "[$(basename "$file")]"
|
|
deploy_workflow "$file"
|
|
echo ""
|
|
done
|
|
|
|
echo "Done."
|