InfoGrab DocsInfoGrab Docs

워크플로 관리

요약

이 섹션의 내용은 원문 문서를 참조하세요. 팀 또는 조직에 걸친 n8n OEM 배포를 관리할 때 여러 사용자를 위해 동일하거나 유사한 워크플로를 실행해야 할 가능성이 높습니다. 이 문서에서 참조하는 API는 언제든지 변경될 수 있습니다.

Note

이 섹션의 내용은 원문 문서를 참조하세요. (oem-agreement.md)

팀 또는 조직에 걸친 n8n OEM 배포를 관리할 때 여러 사용자를 위해 동일하거나 유사한 워크플로를 실행해야 할 가능성이 높습니다. 이를 위한 두 가지 사용 가능한 옵션이 있습니다:

솔루션 장점 단점
각 사용자에 대한 워크플로 생성 워크플로 시작 방법에 제한 없음(모든 트리거 사용 가능) 여러 워크플로 관리 필요.
단일 워크플로 생성, 실행 시 사용자 자격증명 전달 간소화된 워크플로 관리(하나의 워크플로만 변경 필요). 워크플로를 실행하려면 제품이 호출해야 함
Warning

이 문서에서 참조하는 API는 언제든지 변경될 수 있습니다. 각 버전 업그레이드 시 지속적인 기능을 확인하세요.

사용자별 워크플로#

따라야 할 세 가지 일반적인 단계가 있습니다:

  • 각 사용자의 자격증명과 워크플로를 기반으로 필요할 수 있는 추가 파라미터를 얻습니다.
  • 이 사용자에 대한 n8n 자격증명을 생성합니다.
  • 워크플로를 생성합니다.

1. 사용자 자격증명 얻기#

여기서 이 사용자가 인증해야 하는 모든 노드/서비스에 대한 모든 자격증명과 특정 워크플로에 필요한 추가 파라미터를 캡처해야 합니다. 필요한 자격증명 및 파라미터는 워크플로와 수행하려는 작업에 따라 다릅니다.

2. 사용자 자격증명 생성#

관련 자격증명 세부 정보를 모두 얻은 후 n8n에서 관련 서비스 자격증명을 생성할 수 있습니다. 에디터 UI 또는 API 호출을 사용하여 수행할 수 있습니다.

에디터 UI 사용#

  1. 메뉴에서 자격증명 > 신규를 선택합니다.
  2. 드롭다운을 사용하여 생성할 자격증명 유형을 선택합니다(예: Airtable). 새 자격증명 생성 드롭다운
  3. 새 자격증명 생성 모달에서 사용자의 해당 자격증명 세부 정보를 입력하고 이 자격증명에 접근할 수 있는 노드를 선택합니다. 새 자격증명 생성 모달
  4. 만들기를 클릭하여 완료하고 저장합니다.

API 사용#

에디터 UI에서 사용하는 프론트엔드 API를 호출하여 동일한 결과를 얻을 수 있습니다. API 엔드포인트 형식은 https://<n8n-domain>/rest/credentials입니다.

예를 들어 위의 에디터 UI 예시에서 자격증명을 생성하려면 요청은 다음과 같습니다:

POST https://<n8n-domain>/rest/credentials

요청 본문:

{
   "name":"MyAirtable",
   "type":"airtableApi",
   "nodesAccess":[
      {
         "nodeType":"n8n-nodes-base.airtable"
      }
   ],
   "data":{
      "apiKey":"q12we34r5t67yu"
   }
}

응답에는 이 사용자의 워크플로를 생성할 때 사용할 새 자격증명의 ID가 포함됩니다:

{
   "data":{
      "name":"MyAirtable",
      "type":"airtableApi",
      "data":{
         "apiKey":"q12we34r5t67yu"
      },
      "nodesAccess":[
         {
            "nodeType":"n8n-nodes-base.airtable",
            "date":"2021-09-10T07:41:27.770Z"
         }
      ],
      "id":"29",
      "createdAt":"2021-09-10T07:41:27.777Z",
      "updatedAt":"2021-09-10T07:41:27.777Z"
   }
}

3. 워크플로 생성#

모범 사례는 "기본" 워크플로를 만든 다음 각 새 사용자의 자격증명(및 기타 세부 정보)으로 복제하고 커스터마이징하는 것입니다.

에디터 UI 또는 API 호출을 사용하여 템플릿 워크플로를 복제하고 커스터마이징할 수 있습니다.

에디터 UI 사용#

  1. 메뉴에서 워크플로 > 열기를 선택하여 복제할 템플릿 워크플로를 엽니다.

  2. 워크플로 > 복제를 선택하고 새 워크플로의 이름을 입력한 후 저장을 클릭합니다. 워크플로 복제

  3. 관련 노드를 모두 업데이트하여 이 사용자의 자격증명(위에서 생성)을 사용하도록 합니다.

  4. 이 워크플로를 저장하고 오른쪽 상단의 토글을 사용하여 활성으로 설정합니다.

API 사용#

  1. 엔드포인트를 사용하여 템플릿 워크플로의 JSON을 가져옵니다: https://<n8n-domain>/rest/workflows/<workflow_id>
GET https://<n8n-domain>/rest/workflows/1012

응답에는 선택한 워크플로의 JSON 데이터가 포함됩니다:

{
  "data": {
    "id": "1012",
    "name": "Nathan's Workflow",
    "active": false,
    "nodes": [
      {
        "parameters": {},
        "name": "Start",
        "type": "n8n-nodes-base.start",
        "typeVersion": 1,
        "position": [
          130,
          640
        ]
      },
      {
        "parameters": {
          "authentication": "headerAuth",
          "url": "https://internal.users.n8n.cloud/webhook/custom-erp",
          "options": {
            "splitIntoItems": true
          },
          "headerParametersUi": {
            "parameter": [
              {
                "name": "unique_id",
                "value": "recLhLYQbzNSFtHNq"
              }
            ]
          }
        },
        "name": "HTTP Request",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 1,
        "position": [
          430,
          300
        ],
        "credentials": {
          "httpHeaderAuth": "beginner_course"
        }
      },
      {
        "parameters": {
          "operation": "append",
          "application": "appKBGQfbm6NfW6bv",
          "table": "processingOrders",
          "options": {}
        },
        "name": "Airtable",
        "type": "n8n-nodes-base.airtable",
        "typeVersion": 1,
        "position": [
          990,
          210
        ],
        "credentials": {
          "airtableApi": "Airtable"
        }
      },
      {
        "parameters": {
          "conditions": {
            "string": [
              {
                "value1": "={{$json[\"orderStatus\"]}}",
                "value2": "processing"
              }
            ]
          }
        },
        "name": "IF",
        "type": "n8n-nodes-base.if",
        "typeVersion": 1,
        "position": [
          630,
          300
        ]
      },
      {
        "parameters": {
          "keepOnlySet": true,
          "values": {
            "number": [
              {
                "name": "=orderId",
                "value": "={{$json[\"orderID\"]}}"
              }
            ],
            "string": [
              {
                "name": "employeeName",
                "value": "={{$json[\"employeeName\"]}}"
              }
            ]
          },
          "options": {}
        },
        "name": "Set",
        "type": "n8n-nodes-base.set",
        "typeVersion": 1,
        "position": [
          800,
          210
        ]
      },
      {
        "parameters": {
          "functionCode": "let totalBooked = items.length;\nlet bookedSum = 0;\n\nfor(let i=0; i < items.length; i++) {\n  bookedSum = bookedSum + items[i].json.orderPrice;\n}\nreturn [{json:{totalBooked, bookedSum}}]\n"
        },
        "name": "Function",
        "type": "n8n-nodes-base.function",
        "typeVersion": 1,
        "position": [
          800,
          400
        ]
      },
      {
        "parameters": {
          "webhookUri": "https://discord.com/api/webhooks/865213348202151968/oD5_WPDQwtr22Vjd_82QP3-_4b_lGhAeM7RynQ8Js5DzyXrQEnj0zeAQIA6fki1JLtXE",
          "text": "=This week we have {{$json[\"totalBooked\"]}} booked orders with a total value of {{$json[\"bookedSum\"]}}. My Unique ID: {{ $(\"HTTP Request\").params.headerParameters.parameters[0].value }}"
        },
        "name": "Discord",
        "type": "n8n-nodes-base.discord",
        "typeVersion": 1,
        "position": [
          1000,
          400
        ]
      },
      {
        "parameters": {
          "triggerTimes": {
            "item": [
              {
                "mode": "everyWeek",
                "hour": 9
              }
            ]
          }
        },
        "name": "Cron",
        "type": "n8n-nodes-base.cron",
        "typeVersion": 1,
        "position": [
          220,
          300
        ]
      }
    ],
    "connections": {
      "HTTP Request": {
        "main": [
          [
            {
              "node": "IF",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Start": {
        "main": [
          []
        ]
      },
      "IF": {
        "main": [
          [
            {
              "node": "Set",
              "type": "main",
              "index": 0
            }
          ],
          [
            {
              "node": "Function",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Set": {
        "main": [
          [
            {
              "node": "Airtable",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Function": {
        "main": [
          [
            {
              "node": "Discord",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Cron": {
        "main": [
          [
            {
              "node": "HTTP Request",
              "type": "main",
              "index": 0
            }
          ]
        ]
      }
    },
    "createdAt": "2021-07-16T11:15:46.066Z",
    "updatedAt": "2021-07-16T12:05:44.045Z",
    "settings": {},
    "staticData": null,
    "tags": []
  }
}
  1. 반환된 JSON 데이터를 저장하고 새 사용자를 위해 관련 자격증명 및 필드를 업데이트합니다.

  2. 업데이트된 JSON을 요청 본문으로 사용하여 엔드포인트에서 새 워크플로를 생성합니다: https://<n8n-domain>/rest/workflows

POST https://<n8n-domain>/rest/workflows/

응답에는 다음 단계에서 사용할 새 워크플로의 ID가 포함됩니다.

  1. 마지막으로 새 워크플로를 게시합니다:
PATCH https://<n8n-domain>/rest/workflows/1012

JSON 페이로드에 추가 값 active를 전달합니다:

// ...
"active":true,
"settings": {},
"staticData": null,
"tags": []

단일 워크플로#

이 방법을 구현하기 위해 따라야 할 네 가지 단계가 있습니다:

  • 각 사용자의 자격증명과 워크플로를 기반으로 필요할 수 있는 추가 파라미터를 얻습니다. 위의 사용자 자격증명 얻기를 참조하세요.
  • 이 사용자에 대한 n8n 자격증명을 생성합니다. 위의 사용자 자격증명 생성을 참조하세요.
  • 워크플로를 생성합니다.
  • 필요에 따라 워크플로를 호출합니다.

워크플로 생성#

이 워크플로의 세부 사항과 범위는 개별 사용 사례에 따라 크게 다르겠지만, 염두에 두어야 할 몇 가지 설계 구현 사항이 있습니다:

  • 이 워크플로는 웹훅 노드로 트리거되어야 합니다.
  • 수신 웹훅 호출에는 사용자의 자격증명과 필요한 기타 워크플로 파라미터가 포함되어야 합니다.
  • 사용자 자격증명이 필요한 각 노드는 웹훅 호출에서 제공된 자격증명을 읽도록 노드의 자격증명 필드에 표현식을 사용해야 합니다.
  • 워크플로를 저장하고 게시하여 웹훅 노드에 대한 프로덕션 URL이 선택되어 있는지 확인합니다. 자세한 내용은 웹훅 노드를 참조하세요.

워크플로 호출#

각 새 사용자 또는 필요에 따라 기존 사용자의 경우, 워크플로 트리거로 정의된 웹훅을 호출하고 필요한 자격증명(및 기타 워크플로 파라미터)을 제공합니다.

워크플로 관리

n8n v2.25
원문 보기
요약

이 섹션의 내용은 원문 문서를 참조하세요. 팀 또는 조직에 걸친 n8n OEM 배포를 관리할 때 여러 사용자를 위해 동일하거나 유사한 워크플로를 실행해야 할 가능성이 높습니다. 이 문서에서 참조하는 API는 언제든지 변경될 수 있습니다.

Note

이 섹션의 내용은 원문 문서를 참조하세요. (oem-agreement.md)

팀 또는 조직에 걸친 n8n OEM 배포를 관리할 때 여러 사용자를 위해 동일하거나 유사한 워크플로를 실행해야 할 가능성이 높습니다. 이를 위한 두 가지 사용 가능한 옵션이 있습니다:

솔루션 장점 단점
각 사용자에 대한 워크플로 생성 워크플로 시작 방법에 제한 없음(모든 트리거 사용 가능) 여러 워크플로 관리 필요.
단일 워크플로 생성, 실행 시 사용자 자격증명 전달 간소화된 워크플로 관리(하나의 워크플로만 변경 필요). 워크플로를 실행하려면 제품이 호출해야 함
Warning

이 문서에서 참조하는 API는 언제든지 변경될 수 있습니다. 각 버전 업그레이드 시 지속적인 기능을 확인하세요.

사용자별 워크플로#

따라야 할 세 가지 일반적인 단계가 있습니다:

  • 각 사용자의 자격증명과 워크플로를 기반으로 필요할 수 있는 추가 파라미터를 얻습니다.
  • 이 사용자에 대한 n8n 자격증명을 생성합니다.
  • 워크플로를 생성합니다.

1. 사용자 자격증명 얻기#

여기서 이 사용자가 인증해야 하는 모든 노드/서비스에 대한 모든 자격증명과 특정 워크플로에 필요한 추가 파라미터를 캡처해야 합니다. 필요한 자격증명 및 파라미터는 워크플로와 수행하려는 작업에 따라 다릅니다.

2. 사용자 자격증명 생성#

관련 자격증명 세부 정보를 모두 얻은 후 n8n에서 관련 서비스 자격증명을 생성할 수 있습니다. 에디터 UI 또는 API 호출을 사용하여 수행할 수 있습니다.

에디터 UI 사용#

  1. 메뉴에서 자격증명 > 신규를 선택합니다.
  2. 드롭다운을 사용하여 생성할 자격증명 유형을 선택합니다(예: Airtable). 새 자격증명 생성 드롭다운
  3. 새 자격증명 생성 모달에서 사용자의 해당 자격증명 세부 정보를 입력하고 이 자격증명에 접근할 수 있는 노드를 선택합니다. 새 자격증명 생성 모달
  4. 만들기를 클릭하여 완료하고 저장합니다.

API 사용#

에디터 UI에서 사용하는 프론트엔드 API를 호출하여 동일한 결과를 얻을 수 있습니다. API 엔드포인트 형식은 https://<n8n-domain>/rest/credentials입니다.

예를 들어 위의 에디터 UI 예시에서 자격증명을 생성하려면 요청은 다음과 같습니다:

POST https://<n8n-domain>/rest/credentials

요청 본문:

{
   "name":"MyAirtable",
   "type":"airtableApi",
   "nodesAccess":[
      {
         "nodeType":"n8n-nodes-base.airtable"
      }
   ],
   "data":{
      "apiKey":"q12we34r5t67yu"
   }
}

응답에는 이 사용자의 워크플로를 생성할 때 사용할 새 자격증명의 ID가 포함됩니다:

{
   "data":{
      "name":"MyAirtable",
      "type":"airtableApi",
      "data":{
         "apiKey":"q12we34r5t67yu"
      },
      "nodesAccess":[
         {
            "nodeType":"n8n-nodes-base.airtable",
            "date":"2021-09-10T07:41:27.770Z"
         }
      ],
      "id":"29",
      "createdAt":"2021-09-10T07:41:27.777Z",
      "updatedAt":"2021-09-10T07:41:27.777Z"
   }
}

3. 워크플로 생성#

모범 사례는 "기본" 워크플로를 만든 다음 각 새 사용자의 자격증명(및 기타 세부 정보)으로 복제하고 커스터마이징하는 것입니다.

에디터 UI 또는 API 호출을 사용하여 템플릿 워크플로를 복제하고 커스터마이징할 수 있습니다.

에디터 UI 사용#

  1. 메뉴에서 워크플로 > 열기를 선택하여 복제할 템플릿 워크플로를 엽니다.

  2. 워크플로 > 복제를 선택하고 새 워크플로의 이름을 입력한 후 저장을 클릭합니다. 워크플로 복제

  3. 관련 노드를 모두 업데이트하여 이 사용자의 자격증명(위에서 생성)을 사용하도록 합니다.

  4. 이 워크플로를 저장하고 오른쪽 상단의 토글을 사용하여 활성으로 설정합니다.

API 사용#

  1. 엔드포인트를 사용하여 템플릿 워크플로의 JSON을 가져옵니다: https://<n8n-domain>/rest/workflows/<workflow_id>
GET https://<n8n-domain>/rest/workflows/1012

응답에는 선택한 워크플로의 JSON 데이터가 포함됩니다:

{
  "data": {
    "id": "1012",
    "name": "Nathan's Workflow",
    "active": false,
    "nodes": [
      {
        "parameters": {},
        "name": "Start",
        "type": "n8n-nodes-base.start",
        "typeVersion": 1,
        "position": [
          130,
          640
        ]
      },
      {
        "parameters": {
          "authentication": "headerAuth",
          "url": "https://internal.users.n8n.cloud/webhook/custom-erp",
          "options": {
            "splitIntoItems": true
          },
          "headerParametersUi": {
            "parameter": [
              {
                "name": "unique_id",
                "value": "recLhLYQbzNSFtHNq"
              }
            ]
          }
        },
        "name": "HTTP Request",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 1,
        "position": [
          430,
          300
        ],
        "credentials": {
          "httpHeaderAuth": "beginner_course"
        }
      },
      {
        "parameters": {
          "operation": "append",
          "application": "appKBGQfbm6NfW6bv",
          "table": "processingOrders",
          "options": {}
        },
        "name": "Airtable",
        "type": "n8n-nodes-base.airtable",
        "typeVersion": 1,
        "position": [
          990,
          210
        ],
        "credentials": {
          "airtableApi": "Airtable"
        }
      },
      {
        "parameters": {
          "conditions": {
            "string": [
              {
                "value1": "={{$json[\"orderStatus\"]}}",
                "value2": "processing"
              }
            ]
          }
        },
        "name": "IF",
        "type": "n8n-nodes-base.if",
        "typeVersion": 1,
        "position": [
          630,
          300
        ]
      },
      {
        "parameters": {
          "keepOnlySet": true,
          "values": {
            "number": [
              {
                "name": "=orderId",
                "value": "={{$json[\"orderID\"]}}"
              }
            ],
            "string": [
              {
                "name": "employeeName",
                "value": "={{$json[\"employeeName\"]}}"
              }
            ]
          },
          "options": {}
        },
        "name": "Set",
        "type": "n8n-nodes-base.set",
        "typeVersion": 1,
        "position": [
          800,
          210
        ]
      },
      {
        "parameters": {
          "functionCode": "let totalBooked = items.length;\nlet bookedSum = 0;\n\nfor(let i=0; i < items.length; i++) {\n  bookedSum = bookedSum + items[i].json.orderPrice;\n}\nreturn [{json:{totalBooked, bookedSum}}]\n"
        },
        "name": "Function",
        "type": "n8n-nodes-base.function",
        "typeVersion": 1,
        "position": [
          800,
          400
        ]
      },
      {
        "parameters": {
          "webhookUri": "https://discord.com/api/webhooks/865213348202151968/oD5_WPDQwtr22Vjd_82QP3-_4b_lGhAeM7RynQ8Js5DzyXrQEnj0zeAQIA6fki1JLtXE",
          "text": "=This week we have {{$json[\"totalBooked\"]}} booked orders with a total value of {{$json[\"bookedSum\"]}}. My Unique ID: {{ $(\"HTTP Request\").params.headerParameters.parameters[0].value }}"
        },
        "name": "Discord",
        "type": "n8n-nodes-base.discord",
        "typeVersion": 1,
        "position": [
          1000,
          400
        ]
      },
      {
        "parameters": {
          "triggerTimes": {
            "item": [
              {
                "mode": "everyWeek",
                "hour": 9
              }
            ]
          }
        },
        "name": "Cron",
        "type": "n8n-nodes-base.cron",
        "typeVersion": 1,
        "position": [
          220,
          300
        ]
      }
    ],
    "connections": {
      "HTTP Request": {
        "main": [
          [
            {
              "node": "IF",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Start": {
        "main": [
          []
        ]
      },
      "IF": {
        "main": [
          [
            {
              "node": "Set",
              "type": "main",
              "index": 0
            }
          ],
          [
            {
              "node": "Function",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Set": {
        "main": [
          [
            {
              "node": "Airtable",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Function": {
        "main": [
          [
            {
              "node": "Discord",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Cron": {
        "main": [
          [
            {
              "node": "HTTP Request",
              "type": "main",
              "index": 0
            }
          ]
        ]
      }
    },
    "createdAt": "2021-07-16T11:15:46.066Z",
    "updatedAt": "2021-07-16T12:05:44.045Z",
    "settings": {},
    "staticData": null,
    "tags": []
  }
}
  1. 반환된 JSON 데이터를 저장하고 새 사용자를 위해 관련 자격증명 및 필드를 업데이트합니다.

  2. 업데이트된 JSON을 요청 본문으로 사용하여 엔드포인트에서 새 워크플로를 생성합니다: https://<n8n-domain>/rest/workflows

POST https://<n8n-domain>/rest/workflows/

응답에는 다음 단계에서 사용할 새 워크플로의 ID가 포함됩니다.

  1. 마지막으로 새 워크플로를 게시합니다:
PATCH https://<n8n-domain>/rest/workflows/1012

JSON 페이로드에 추가 값 active를 전달합니다:

// ...
"active":true,
"settings": {},
"staticData": null,
"tags": []

단일 워크플로#

이 방법을 구현하기 위해 따라야 할 네 가지 단계가 있습니다:

  • 각 사용자의 자격증명과 워크플로를 기반으로 필요할 수 있는 추가 파라미터를 얻습니다. 위의 사용자 자격증명 얻기를 참조하세요.
  • 이 사용자에 대한 n8n 자격증명을 생성합니다. 위의 사용자 자격증명 생성을 참조하세요.
  • 워크플로를 생성합니다.
  • 필요에 따라 워크플로를 호출합니다.

워크플로 생성#

이 워크플로의 세부 사항과 범위는 개별 사용 사례에 따라 크게 다르겠지만, 염두에 두어야 할 몇 가지 설계 구현 사항이 있습니다:

  • 이 워크플로는 웹훅 노드로 트리거되어야 합니다.
  • 수신 웹훅 호출에는 사용자의 자격증명과 필요한 기타 워크플로 파라미터가 포함되어야 합니다.
  • 사용자 자격증명이 필요한 각 노드는 웹훅 호출에서 제공된 자격증명을 읽도록 노드의 자격증명 필드에 표현식을 사용해야 합니다.
  • 워크플로를 저장하고 게시하여 웹훅 노드에 대한 프로덕션 URL이 선택되어 있는지 확인합니다. 자세한 내용은 웹훅 노드를 참조하세요.

워크플로 호출#

각 새 사용자 또는 필요에 따라 기존 사용자의 경우, 워크플로 트리거로 정의된 웹훅을 호출하고 필요한 자격증명(및 기타 워크플로 파라미터)을 제공합니다.