n8n 워크플로 백업하고 복원하기 — PC 바꿀 때 뭘 챙겨야 하는지 직접 해본 기록

실패 알림을 만들었을 때는 워크플로가 멈춰도 하루 뒤에야 알았고, 자동 시작을 걸었을 때는 PC 를 껐다 켜면 n8n 이 안 떠 있는 것을 다뤘습니다. 이번은 그 다음입니다. 그 PC 가 없어지면. PC 를 바꾸거나, n8n 을 두었던 사람이 회사를 나가거나, 디스크가 죽었을 때 무엇을 챙겨 두어야 다른 PC 에서 같은 워크플로가 도는지, 직접 지우고 되살려 본 기록입니다.

5~50인 회사에서 n8n 을 사무실 PC 한 대에 두면 백업은 대개 「워크플로 JSON 내려받아 두기」로 끝납니다. 그게 얼마만큼인지 보려고, ④ 글에서 만든 워크플로 A(실패 알림, Publish 됨)·B·C 가 그대로 있는 이 PC 의 n8n 을 대상으로 했습니다.

먼저 결론 셋. 워크플로 JSON 은 절반입니다. 자격증명은 따로 내보내야 하고, 내보내도 56바이트짜리 파일 하나가 없으면 열리지 않습니다. 그리고 지우고 되살린 워크플로는 ID 가 바뀌거나 Publish 가 풀려서, 「같은 것」이 아니었습니다. 셋 다 아래에 있습니다.

다른 PC 가 없어서 이렇게 했습니다

다른 PC 가 없었습니다. 그래서 같은 PC 에서 두 가지로 대신했습니다.

  1. 같은 n8n 에서 워크플로를 지우고 JSON 으로 되살리기 — ID·트리거·자격증명 연결·Publish 상태가 그대로인지 봅니다.
  2. 빈 데이터 폴더로 n8n 을 하나 더 띄우기 — n8n 은 N8N_USER_FOLDER 로 데이터 폴더를 바꿀 수 있어서, 빈 폴더를 주면 「처음 깐 PC」와 같은 상태가 됩니다. 여기에 내보낸 파일을 들여와 봅니다. 포트는 5680 으로 바꿔 원래 것(5678)과 같이 띄웠습니다.

2번이 「다른 PC」에 가깝지만 같지는 않습니다. node 와 n8n 버전이 같고, 경로도 같고, 무엇보다 원래 PC 가 옆에 살아 있습니다. 진짜 PC 가 죽었을 때 원래 폴더에서 꺼내 올 것이 없다는 점은 이 방법으로는 재현이 안 됩니다. 그 한계는 아래 「걸리는 것」에 다시 적습니다.

n8n 데이터 폴더에 무엇이 있나

백업 대상이 무엇인지부터 봤습니다. 윈도우에서 n8n 은 C:\Users\사용자\.n8n\ 에 모든 것을 둡니다. 이 PC 의 폴더는 이랬습니다.

파일 크기 무엇
config 56바이트 암호화 키(encryptionKey) 하나. 자격증명을 잠근 열쇠입니다
database.sqlite 1.4MB 워크플로 · 자격증명(암호화됨) · 계정 · 실행 기록 · 설정 전부
database.sqlite-wal 4.1MB 위 파일에 아직 합쳐지지 않은 최근 변경분
database.sqlite-shm 32KB 위 wal 의 색인
n8nEventLog*.log 총 9MB 이벤트 로그 4개
nodes\ · storage\ 거의 빔 커뮤니티 노드 · 바이너리 저장소

두 가지가 눈에 띄었습니다.

config 가 56바이트입니다. 열어 보면 키 하나뿐입니다(값은 32자, 여기에 적지 않습니다). n8n 이 처음 뜰 때 만들어 두고, 자격증명을 저장할 때 이 키로 잠급니다. 이 파일이 이 글의 두 번째 결론입니다.

database.sqlite 의 수정 시각이 9월 12일인데 -wal 은 9월 16일입니다. SQLite 의 WAL 모드는 변경분을 본 파일에 바로 쓰지 않고 -wal 에 모아 두었다가 나중에 합칩니다. 이 PC 에서는 나흘치 변경이 -wal 에만 있었습니다. database.sqlite 한 파일만 복사하면 그 나흘이 빠집니다. n8n 을 끄면 합쳐지는지는 이 글에서 확인하지 못했고, 대신 세 파일을 같이 복사했습니다.

내보내기 — 세 가지를 다 해 봤습니다

n8n 을 끈 상태에서 먼저 했습니다. n8n 을 npx 로 깐 PC라 CLI 는 node.exe 로 n8n 을 직접 불렀습니다(⑧ 글과 같은 경로).

방법 걸린 시간 결과
1 화면 오른쪽 위 「···」 → Download 바로 워크플로 하나 = JSON 파일 하나 (2.5KB)
2 n8n export:workflow --all --output=… 12초 워크플로 3개 = JSON 파일 하나 (5.8KB)
3 n8n export:credentials --all --output=… 8초 자격증명 1개 = JSON 파일 하나
n8n 워크플로 화면 오른쪽 위 「···」 메뉴 — Download · Import from URL · Import from file · Archive 항목

1과 2는 같은 워크플로인데 내용이 다릅니다. CLI 쪽에만 있는 것이 staticData 였습니다. ④ 글에서 「10분에 한 번만」 알리려고 Code 노드가 적어 두던 「마지막 발송 시각」이 여기 들어 있습니다. 화면 Download 에는 없습니다. 반대로 화면 쪽에만 meta.instanceId 가 있습니다. 둘 다 노드·연결·설정은 같았고, 자격증명은 둘 다 id 와 이름만 실려 있습니다. 비밀번호는 없습니다. 그래서 워크플로 JSON 은 어디에 올려 두어도 비밀이 새지는 않지만, 그것만으로는 다른 PC 에서 메일이 안 나갑니다.

3의 자격증명 파일은 data 칸이 U2FsdG… 로 시작하는 152자 문자열이었습니다. 기본이 암호화입니다. --decrypted 를 붙이면 user·password·host·port 가 그대로 보이는 평문 파일이 나옵니다(6초). 이 평문 파일은 그 자체가 비밀번호 파일이라, 아래에서 쓴 뒤 지웠습니다.

켜진 상태에서도 해 봤습니다. 「CLI 가 n8n 이 켜진 상태에서 데이터베이스를 잠글 것」이라고 예상했는데, 빗나갔습니다. export:workflow 는 켜진 채로 7초에 끝났고 n8n 은 그동안 200 을 줬습니다. 나중에 import:workflow 도 켜진 채로 됐습니다(14초). 잠금은 없었습니다. 다만 들여온 직후 화면 목록에는 바로 나왔는데, 그것을 도는 워크플로로 살리는 것은 별개였습니다(아래).

막힌 지점 1 — 「Successfully imported」 인데 열리지 않습니다

빈 폴더로 띄울 n8n 에 워크플로 3개를 들여왔습니다. 빈 폴더라 데이터베이스 마이그레이션이 먼저 돌고, 그 뒤 이렇게 끝났습니다(8초).

Importing 3 workflows...
Deactivating workflow "A. 실패 알림 (Error Trigger)". Remember to activate later.
Successfully imported 3 workflows.

「Deactivating … Remember to activate later.」 — Publish 상태는 안 따라온다는 뜻입니다. 이건 뒤에 다시 나옵니다.

이어서 암호화된 자격증명 파일을 들여왔습니다.

Successfully imported 1 credential.

성공입니다. 그런데 이 폴더의 n8n 이 정말 그 자격증명을 읽을 수 있는지 보려고, 같은 폴더에서 --decrypted 로 다시 내보내 봤습니다.

Error exporting credentials. See log messages for details.
Credentials could not be decrypted. The likely reason is that a different "encryptionKey" was used to encrypt the data.

빈 폴더로 뜬 n8n 은 자기 config 를 새로 만들었고, 그 안의 키가 원래 PC 의 키와 다릅니다. 들여올 때는 암호문을 그대로 넣기만 하니 「성공」이고, 풀 때 비로소 안 풀립니다. 성공 응답이 성공이 아니었습니다.

화면에서는 이렇게 보입니다. 자격증명 목록에 「Needs first setup」이 붙어 있고, 열면 User·Password·Host 칸이 전부 비어 있고 위에 「Couldn’t connect with these settings」 가 떠 있습니다. 키가 다르다는 말은 화면 어디에도 없고, n8n 로그에만 bad decrypt 가 남았습니다. 이걸 모르고 보면 「자격증명이 비어서 왔네」 하고 다시 입력할 텐데, 그 비밀번호를 아는 사람이 회사에 없으면 거기서 멈춥니다.

암호화 키가 다른 n8n 에서 연 SMTP 자격증명 — User·Password·Host 칸이 비어 있고 「Couldn’t connect with these settings」 가 떠 있는 화면

푸는 방법은 둘이었습니다.

방법 한 것 결과
원래 config 파일을 새 폴더에 복사 56바이트 파일 하나 덮어쓰기 --decrypted 내보내기가 되고 칸이 채워짐
--decrypted 로 내보낸 평문 파일을 들여오기 새 키로 다시 잠김 됨 — 대신 평문 파일이 디스크에 남음

백업에서 제일 작은 파일이 제일 중요했습니다. config 를 다른 PC 에 복사하거나, 같은 값을 환경 변수 N8N_ENCRYPTION_KEY 로 주면 됩니다. 이 글에서는 파일 복사만 했습니다.

한 가지 더 있었습니다. 새 폴더 n8n 의 키를 바꿔 다시 켰더니 브라우저 로그인이 풀려 있었습니다. 한 번 본 것이라 이유는 단정하지 않습니다.

막힌 지점 2 — 화면에서 들여오면 다른 워크플로가 됩니다

이번엔 원래 n8n 에서 A 를 지우고 되살렸습니다. 이 버전(2.8)은 「···」 메뉴에 Delete 가 없고 Archive 가 있습니다. 누르면 「Archive Workflow?」 하나만 묻고 넘어갑니다. B 와 C 가 A 를 Error Workflow 로 쓰고 있는데, 그 말은 없습니다. 아카이브된 A 는 목록에서 사라지지만 지워진 것은 아니어서, 완전히 없애는 것은 한 번 더 해야 합니다(이 글에서는 화면이 부르는 것과 같은 요청으로 없앴습니다).

없앤 뒤 B 의 설정을 열어 봤습니다.

워크플로 B 의 설정 창 — Error Workflow 칸에 이름 대신 삭제된 워크플로의 ID 문자열이 남아 있고, 드롭다운의 A 는 회색에 경고 아이콘 (ID 가림)

Error Workflow 칸에 「A. 실패 알림」 대신 열여섯 자 ID 가 그대로 앉아 있습니다. 경고도 없습니다. 이 상태로 B 가 실패하면 알림이 어디로 가는지는 시험하지 않았습니다.

A 를 되살렸습니다. 새 워크플로를 열고 「···」 → Import from file → 아까 Download 한 JSON. 캔버스에 노드 셋이 그대로 올라오고, Send Email 노드를 열면 자격증명 「시험용 SMTP」가 골라져 있습니다. 같은 PC 에 같은 ID 의 자격증명이 있으니 연결은 살았습니다. 그런데,

「Import from file」 로 들여온 워크플로 A — 노드 셋은 그대로인데 오른쪽 위 버튼이 회색 「Publish」 인 화면
  • ID 가 바뀌었습니다. 주소창의 ID 가 원래 것이 아닙니다. 새 워크플로를 열었을 때 받은 ID 에 내용만 얹힌 것입니다.
  • Publish 가 안 돼 있습니다. 오른쪽 위가 회색 「Publish」 입니다. 원래 A 는 초록 「Published」 였습니다.
  • staticData 가 없습니다. 화면 Download 에 없던 것이니 당연합니다.
  • B 와 C 는 여전히 옛 ID 를 봅니다. 드롭다운을 열면 새 A 가 있긴 한데, ④ 글에서 본 그대로 회색에 경고 아이콘 — Publish 가 안 됐기 때문입니다. A 를 Publish 하고, B 와 C 의 설정에서 A 를 다시 고르고 저장해야 합니다. 워크플로가 3개라 3분이지만, 30개면 어느 것이 어느 것을 가리켰는지부터 찾아야 합니다.

CLI 로 들여오면 ID 는 지키고 Publish 는 풀립니다

화면으로 들여온 A 를 지우고, 이번엔 CLI 내보내기 파일(원래 ID 가 들어 있는 것)로 n8n import:workflow 를 했습니다. n8n 은 켜진 채였습니다.

Importing 1 workflows...
Deactivating workflow "A. 실패 알림 (Error Trigger)". Remember to activate later.
Successfully imported 1 workflow.
화면 Import from file CLI import:workflow
ID 바뀜 원래대로
B·C 의 Error Workflow 옛 ID 를 가리킨 채 그대로 살아남(같은 ID 이므로)
자격증명 연결 살아 있음 살아 있음
staticData 없음 있음
Publish 안 됨 안 됨
CLI import:workflow 로 원래 ID 그대로 되살린 뒤 워크플로 B 의 설정 창 — Error Workflow 칸에 「A. 실패 알림 (Error Trigger)」 이름이 돌아온 화면 (ID 가림)

B 의 설정을 다시 열면 이름이 돌아와 있습니다. 대신 A 를 다시 Publish 하는 것은 사람이 해야 합니다. 화면에서 「Publish」 → 버전 이름 창 → 「Publish」. 그러고 나서 원래 n8n 은 지우기 전과 같은 목록(A 만 Published)으로 돌아왔습니다.

그리고 어느 쪽으로 되살려도 돌아오지 않은 것이 있습니다. A 의 실행 기록입니다. 지우기 전 A 에는 ④ 글 이후의 실행이 쌓여 있었는데, 되살린 A 는 0건입니다. 워크플로 JSON 에는 실행 기록이 없고, 워크플로를 지우면 그 실행 기록도 같이 지워집니다. 버전 기록도 새로 시작합니다.

빈 폴더로 띄우면 「Set up owner account」 부터입니다

빈 폴더 n8n(5680 포트)에 워크플로·자격증명·config 를 다 넣고 브라우저로 열었습니다.

빈 데이터 폴더로 띄운 n8n 의 첫 화면 — 「Set up owner account」 (계정을 새로 만들라는 화면)

계정은 내보내기에 없습니다. 처음 깐 것처럼 관리자 계정을 새로 만들라고 합니다. 만들고 들어가면 워크플로 3개가 있는데 셋 다 Publish 가 안 돼 있고, 실행 기록은 0, 자격증명은 이름만 같은 것이 하나 있습니다(원래 config 를 넣었으니 이건 열립니다). 켜지기까지 23초였습니다. 이게 「JSON 백업」으로 다른 PC 에 옮겼을 때의 첫 화면입니다.

폴더를 통째로 복사하면 그대로입니다

마지막으로, 처음에 n8n 을 끈 상태에서 복사해 둔 .n8n 폴더(config · sqlite 세 파일 · 로그 전부, 14MB)를 다른 자리에 놓고 그 폴더로 n8n 을 띄웠습니다.

JSON 으로 들여온 빈 폴더 폴더 통째 복사
첫 화면 Set up owner account 로그인 (원래 계정·비밀번호로 들어감)
A 의 Publish 풀림 Published 그대로 — 로그에 「Activated workflow “A…”」
A 의 실행 기록 0건 58건
자격증명 config 를 같이 옮겨야 열림 열림
B·C 의 Error Workflow 되살린 방법에 따라 그대로

30초 안에 떴고, 로그인부터 실행 기록까지 지우기 전과 같았습니다. 이 PC 에서 「그대로」였다는 것이지, 다른 PC 에서 같다고 본 것은 아닙니다.

이 방법으로 쓸 때 걸리는 것

다른 PC 에서 한 것이 아닙니다. 같은 PC 에 같은 node · 같은 n8n 2.8.4 · 같은 경로였습니다. n8n 버전이 다른 PC 로 폴더를 옮기면 처음 켤 때 마이그레이션이 돌 텐데, 그건 이 글에서 보지 않았습니다.

config 를 잃으면 자격증명은 끝입니다. 폴더째 백업하면 그 안에 있으니 잊기 어렵지만, 워크플로 JSON 만 챙긴 백업이라면 이 파일이 없습니다. 반대로 이 파일이 있으면 그 사람은 백업 안의 모든 비밀번호를 풀 수 있습니다. 워크플로 JSON 과 같은 자리에 두지 말라는 뜻입니다.

--decrypted 파일은 비밀번호 파일입니다. 만들었으면 쓰고 지우십시오. 이 글에서도 지웠습니다.

켜진 채 복사한 폴더는 시험하지 않았습니다. 이 글의 폴더 복사는 n8n 을 끈 뒤였습니다. 켜진 채 복사하면 -wal 과 본 파일이 어긋난 순간을 잡을 수 있습니다.

자동으로 백업해 주는 것은 없습니다. 위의 어느 것도 사람이 손으로 한 것입니다. export:workflow 를 작업 스케줄러에 거는 것이 다음 순서인데, ⑧ 글의 「끝」 버튼과 PATH 문제가 그대로 따라올 것이라 이 글에서는 하지 않았습니다.

되살린 워크플로는 다시 Publish 해야 합니다. 화면이든 CLI 든 같습니다. 워크플로가 많으면 어느 것이 Publish 돼 있었는지 목록을 따로 적어 두는 편이 낫습니다. CLI 내보내기 JSON 의 active 칸이 그 목록이긴 한데, 들여올 때 읽어 주지는 않았습니다.

요약

.n8n\config (56바이트) 자격증명의 열쇠. 이것 없이 자격증명을 옮기면 「성공」 뒤에 빈 칸
database.sqlite + -wal + -shm 세 파일을 같이. -wal 에만 나흘치가 있었음
화면 Download 노드·연결·설정. staticData 없음. 자격증명은 ID·이름만
export:workflow --all 위에 staticData 포함. 켜진 채로도 됨(7초)
export:credentials 기본 암호화. --decrypted 는 평문 — 쓰고 지울 것
Archive B·C 가 A 를 쓰고 있어도 경고 없음. 설정 칸에 ID 문자열이 남음
화면 Import from file ID 바뀜 · Publish 풀림 · 참조하던 쪽은 옛 ID
CLI import:workflow ID 유지 · Publish 풀림 (Deactivating … Remember to activate later.)
실행 기록 JSON 에 없음. 워크플로를 지우면 같이 사라짐
빈 폴더 + JSON 「Set up owner account」 부터. 계정은 내보내기에 없음
폴더 통째 복사 (끈 상태) 로그인 · Published · 실행 58건 · 자격증명 전부 그대로
못 한 것 진짜 다른 PC · 버전 다른 PC · 켜진 채 폴더 복사 · 자동 백업

지운 것은 워크플로 하나였고, 시간이 간 곳은 이번에도 n8n 안이 아니었습니다. 56바이트 파일 하나와, 「같은 워크플로」가 무엇인가였습니다.


참고
– n8n 공식 문서 — CLI commands (export:workflow · export:credentials · import:workflow · import:credentials)
– n8n 공식 문서 — Environment variables: N8N_USER_FOLDER · N8N_ENCRYPTION_KEY
– SQLite 공식 문서 — Write-Ahead Logging

Leave a Comment