完全指南:單進程架構(gòu)、SQLite 選型與 Caddy 自動 HTTPS 部署)
n8n 單機模式Single / Regular Mode完全指南單進程架構(gòu)、SQLite 選型與 Caddy 自動 HTTPS 部署【免費下載鏈接】n8n-mcpA MCP for Claude Desktop / Claude Code / Windsurf / Cursor to build n8n workflows for you項目地址: https://gitcode.com/GitHub_Trending/n8/n8n-mcp導(dǎo)讀單機模式Single / Regular Mode是自托管 n8n 最簡潔的部署形態(tài)一個 n8n 進程同時承載編輯器 UI、REST API、觸發(fā)器/定時器并在進程內(nèi)執(zhí)行工作流配合 Caddy 反向代理自動簽發(fā) HTTPS 證書用最少的組件把 n8n 跑起來。本文以倉庫中 n8n-self-hosting 技能包的 SINGLE_MODE.md 為主線結(jié)合同目錄下的 SKILL.md、SECURITY.md、DAY2.md 以及 assets 目錄 中的真實模板文件為你講透單機模式的適用邊界、SQLite 與 Postgres 的取舍、SQLite→Postgres 遷移路徑、資源規(guī)劃與上線驗證方法。讀完你可以直接用倉庫模板在自己的 Linux 服務(wù)器上部署一個 TLS 加密的單實例 n8n并知道何時該升級到隊列模式。單機模式的架構(gòu)與你得到什么SINGLE_MODE.md 明確指出單機模式下只有一個 n8n 進程處理一切編輯器 UI、REST API、觸發(fā)器/定時器并且工作流在進程內(nèi)執(zhí)行executes workflows in-process。這是最容易運行、也最容易推理reason about的形態(tài)對應(yīng)的模板是assets/docker-compose.single.yml。該模式下的服務(wù)組成非常簡單只有兩個容器caddy—— 公共反向代理負責(zé) 80/443 端口的自動 HTTPSLets Encrypt/ZeroSSLn8n—— 單進程本體數(shù)據(jù)存放在n8n_data卷中對應(yīng)容器內(nèi)/home/node/.n8n。默認數(shù)據(jù)庫是SQLite數(shù)據(jù)庫文件就住在n8n_data卷里不需要單獨的數(shù)據(jù)庫容器。這一點與隊列模式形成鮮明對比——隊列模式必須引入 Redis消息隊列和 Postgres共享數(shù)據(jù)庫服務(wù)數(shù)量從 2 個變成 5 個。從模板文件 docker-compose.single.yml 可以看到兩個值得注意的細節(jié)n8n 服務(wù)故意不映射任何ports:注釋里明確寫著NOTE: intentionally NO ports mapping——n8n 只在私有網(wǎng)絡(luò)n8n_net上運行只能通過 Caddy 訪問宿主機的 5678 端口不會被暴露。這是本技能包的安全底線之一只有 Caddy80/443面向公網(wǎng)n8n5678、Postgres5432、Redis6379一律留在 Docker 私有網(wǎng)絡(luò)中。卷名被固定name:顯式指定n8n_data、caddy_data、caddy_config三個卷的名字與項目目錄無關(guān)這樣 DAY2.md 中的備份/恢復(fù)命令可以穩(wěn)定引用這些確切的名字不會因為 compose 項目目錄變化而找不到卷。Caddy 的配置 Caddyfile 同樣貫徹域名無關(guān)原則站點地址由{$N8N_SUBDOMAIN}.{$N8N_DOMAIN}從 Caddy 服務(wù)環(huán)境變量填充而這些環(huán)境變量由 compose 從.env注入因此 Caddyfile 本身不包含任何域名或客戶端特定信息可以安全提交到版本庫。Caddyfile 中還包含兩個對 n8n 至關(guān)重要的配置reverse_proxy n8n:5678塊內(nèi)的flush_interval -1立即流式輸出響應(yīng)保證編輯器實時推送通道SSE / websockets不被緩沖基礎(chǔ)安全響應(yīng)頭Strict-Transport-SecurityHSTS一年 includeSubDomains、X-Content-Type-Options: nosniff、X-Frame-Options: SAMEORIGIN、Referrer-Policy: strict-origin-when-cross-origin。單機模式是不是正確的選擇SINGLE_MODE.md 給出了非常明確的適用判定標(biāo)準(zhǔn)適合的場景單一用戶或小團隊、執(zhí)行量輕到中等、重視運維與備份的簡單性——整個實例只有一個卷需要備份the whole instance is one volume to back up。需要升級換隊列模式的信號執(zhí)行executions開始排隊互相阻塞長耗時/重負載的執(zhí)行把 UI 卡住需要跨 CPU 核心或跨機器水平擴展。一旦出現(xiàn)這些跡象就應(yīng)該轉(zhuǎn)向 QUEUE_MODE.md 描述的隊列模式。SKILL.md 中的Rule 0給出了更務(wù)實的決策建議不確定時先從單機模式開始——它是最簡單的正確方案覆蓋大多數(shù)需求但如果用戶已經(jīng)預(yù)見到真實的大流量直接上隊列模式可以避免日后換 compose 文件加 SQLite→Postgres 遷移的麻煩。單機模式下的 SQLite 與 Postgres 選型SINGLE_MODE.md 強調(diào)了一個容易踩坑的事實SQLite 和 Postgres 是僅有的兩個受支持?jǐn)?shù)據(jù)庫——MySQL/MariaDB 支持已經(jīng)不存在且 Postgres 只支持actively maintained versions活躍維護版本。兩者的定位對比SQLite默認模板采用零額外組件備份 快照n8n_data卷即可。適合絕大多數(shù)單實例安裝。Postgres可選升級在寫入壓力下更穩(wěn)健是預(yù)期要擴容時的標(biāo)準(zhǔn)選擇。如果你知道很快會轉(zhuǎn)隊列模式現(xiàn)在就上 Postgres 可以避免日后一次 SQLite→Postgres 遷移。使用 Postgres 的方式在 compose 中追加一個postgres:16服務(wù)可參考隊列模板中的 service init-data.sh healthcheck 寫法然后在 n8n 服務(wù)上設(shè)置以下環(huán)境變量DB_TYPEpostgresdb DB_POSTGRESDB_HOSTpostgres DB_POSTGRESDB_DATABASE數(shù)據(jù)庫名 DB_POSTGRESDB_USER用戶名 DB_POSTGRESDB_PASSWORD密碼其余配置保持不變。注意隊列模式的 init-data.sh 負責(zé)創(chuàng)建 n8n 連接時使用的非 root 數(shù)據(jù)庫用戶與 Postgres 超級用戶分離——如果單機模式要接 Postgres同樣應(yīng)該遵循這一安全實踐而不是直接讓 n8n 用超級用戶連接。SQLite → Postgres 遷移官方支持的正確路徑SINGLE_MODE.md 明確提醒沒有就地切換in-place switch的機制。受支持的路徑是導(dǎo)出工作流與憑據(jù) → 起 Postgres → 讓 n8n 指向全新數(shù)據(jù)庫 → 重新導(dǎo)入。關(guān)鍵點在于CLI 命令要在容器內(nèi)以node用戶身份執(zhí)行docker compose exec -u node n8n n8n export:workflow --backup --output/home/node/.n8n/backup/ docker compose exec -u node n8n n8n export:credentials --all --output/home/node/.n8n/creds.json # 在讓 n8n 指向 Postgres 之后 docker compose exec -u node n8n n8n import:workflow --separate --input/home/node/.n8n/backup/ docker compose exec -u node n8n n8n import:credentials --input/home/node/.n8n/creds.json遷移中最容易翻車的是憑據(jù)解密憑據(jù)導(dǎo)出默認是加密的它們只有在相同的N8N_ENCRYPTION_KEY下才能重新導(dǎo)入因此遷移全程必須保持該 key 不變--decrypted參數(shù)雖然存在但會把明文密鑰寫入磁盤——除非確實需要否則避免使用萬一用了事后要徹底銷毀該文件遷移需要規(guī)劃一個短暫維護窗口maintenance window。這一點與 SECURITY.md 的核心警告完全呼應(yīng)丟失或更改密鑰所有已保存的憑據(jù)都將變得不可解密Lose it or change it and all saved credentials become undecryptable。SECURITY.md 還補充了一個極易被忽視的陷阱如果你在沒設(shè) key 的情況下啟動過一次 n8nn8n 會自動生成一個密鑰寫入n8n_data卷~/.n8n/config之后再補上一個不同的 key 反而會破壞解密。因此正確順序是首次啟動前就在.env里顯式設(shè)置N8N_ENCRYPTION_KEY。資源規(guī)劃一個小盒子就夠SINGLE_MODE.md 的資源建議非常接地氣輕量使用下約 1–2 GB RAM 即可流暢運行單個實例重度 Code 節(jié)點或二進制數(shù)據(jù)處理需要更多內(nèi)存余量設(shè)置N8N_DEFAULT_BINARY_DATA_MODEfilesystem模板默認值讓大文件落到磁盤而不是駐留內(nèi)存/數(shù)據(jù)庫。模板 docker-compose.single.yml 正是這么做的它把二進制數(shù)據(jù)模式顯式設(shè)為filesystem避免大 payload 撐爆 SQLite 或內(nèi)存。DAY2.md 在例行檢查中也再次強調(diào)單機模式下確認N8N_DEFAULT_BINARY_DATA_MODEfilesystem這樣運行數(shù)據(jù)不會讓 SQLite 無限膨脹而在隊列模式下二進制數(shù)據(jù)刻意放在 Postgres 中靠執(zhí)行數(shù)據(jù)清理來約束體積。上線后的驗證清單SINGLE_MODE.md 提供了一組從內(nèi)到外、層層遞進的驗證命令docker compose ps # caddy n8n 均為 Up docker compose exec n8n wget -qO- http://localhost:5678/healthz # 內(nèi)部驗證 n8n 進程本身存活 docker compose logs caddy | grep -i certificate obtained # 證書已簽發(fā)首次啟動約 1–2 分鐘 curl -fsS --retry 5 --retry-delay 10 https://fqdn/healthz # 公網(wǎng)驗證重試以覆蓋 ACME 延遲這里有一個非常實用的排障心智模型首次啟動時 TLS 失敗通常意味著證書還沒簽發(fā)完而不是 n8n 掛了。ACME 挑戰(zhàn)需要先解析 DNS、打通 80/443 端口整個過程可能耗時 1–2 分鐘在此期間公網(wǎng)https://請求會報 TLS 錯誤——這是證書仍在簽發(fā)中的信號不是服務(wù)故障。所以先用docker compose exec n8n wget -qO- http://localhost:5678/healthz從內(nèi)部把n8n 是否存活和TLS 是否就緒兩個問題分開驗證。SKILL.md 第 7 步在此基礎(chǔ)上補充了兩個細節(jié)/healthz只能證明進程可達/healthz/readiness還能確認數(shù)據(jù)庫已連接并完成遷移——排查啟動循環(huán)boot loop時用它打開https://fqdn后應(yīng)立即創(chuàng)建 owner 賬號誰先完成注冊表單誰就擁有這個實例Whoever completes that signup form first claims the instance。一個暴露的、未被認領(lǐng)的實例是一場競速因此在分享 URL 之前就要注冊并開啟 2FA。結(jié)合模板深入理解單機模式的完整配置為了讓上面散落的要點形成一個可落地的整體下面把 docker-compose.single.yml 中的關(guān)鍵環(huán)境變量分組解讀這些就是單機模式的生產(chǎn)級默認值公網(wǎng) URL / 反向代理組N8N_HOST${SUBDOMAIN}.${DOMAIN_NAME}、N8N_PROTOCOLhttps、N8N_EDITOR_BASE_URLhttps://${SUBDOMAIN}.${DOMAIN_NAME}/、WEBHOOK_URLhttps://${SUBDOMAIN}.${DOMAIN_NAME}/這一組變量保證 n8n 對外生成的 webhook 與 OAuth 回調(diào) URL 都是公網(wǎng) HTTPS 地址。SECURITY.md 警告這些沒配好的話n8n 會發(fā)出去http://localhost:5678/...這種無法訪問的鏈接。N8N_PROXY_HOPS1告訴 n8n 信任一層反向代理Caddy注入的X-Forwarded-*頭配合 Caddyfile 中的header_up指令完成鏈路。加密與安全默認值N8N_ENCRYPTION_KEY${N8N_ENCRYPTION_KEY}顯式從.env注入絕不依賴自動生成。N8N_SECURE_COOKIEtrue登錄 cookie 僅走 HTTPS。N8N_DIAGNOSTICS_ENABLEDfalse、N8N_PERSONALIZATION_ENABLEDfalse、N8N_HIRING_BANNER_ENABLEDfalse關(guān)閉遙測與個性化。N8N_BLOCK_ENV_ACCESS_IN_NODEtrueCode 節(jié)點/表達式無法讀取process.env容器內(nèi)的敏感環(huán)境變量。N8N_RUNNERS_ENABLEDtrue把 Code 節(jié)點執(zhí)行移入任務(wù)運行器n8n ≥ 2.0 中恒為開啟此項為空操作若需真正隔離用N8N_RUNNERS_MODEexternal外置 sidecar 運行器。數(shù)據(jù)保留與磁盤控制EXECUTIONS_DATA_PRUNEtrue、EXECUTIONS_DATA_MAX_AGE336小時、EXECUTIONS_DATA_PRUNE_MAX_COUNT50000裁剪執(zhí)行數(shù)據(jù)限制磁盤/DB 增長以及含 PII 的運行數(shù)據(jù)保留時長。DAY2.md 說明官方默認值分別為 336 小時 / 10000 條模板顯式寫出來是為了不依賴隱式默認。N8N_DEFAULT_BINARY_DATA_MODEfilesystem二進制數(shù)據(jù)落盤。可選開關(guān)模板中已注釋N8N_PUBLIC_API_DISABLEDtrue不需要公共 REST API 時可打開SECURITY.md 建議配對N8N_PUBLIC_API_SWAGGERUI_DISABLEDtrue一并關(guān)閉 API 沙盒頁面。對應(yīng)地.env.single.example 給出了需要在服務(wù)器上填寫的全部變量DATA_FOLDER絕對路徑必須與運行docker compose的目錄一致、DOMAIN_NAME/SUBDOMAIN、SSL_EMAIL、GENERIC_TIMEZONEIANA 時區(qū)供 Schedule/Cron 節(jié)點使用、N8N_IMAGE_TAG建議固定版本而非盲目跟隨:latest、以及必須用openssl rand -base64 32現(xiàn)場生成的N8N_ENCRYPTION_KEY占位符REPLACE_WITH_openssl_rand_base64_32。與部署流程的銜接單機模式在技能包中的位置SINGLE_MODE.md 是 n8n-self-hosting 技能包的模式深度文件之一。整體部署編排在 SKILL.md 中順序為先選模式Rule 0必須問用戶而不是猜測→ 密鑰衛(wèi)生Rule 1→ 收集輸入 → 預(yù)檢 → 裝 Docker → 放置項目文件 → 填 .env 并生成密鑰 → 防火墻 → 啟動 → 驗證 → 交接。單機模式對應(yīng)其中的具體動作模板文件是 docker-compose.single.yml部署時改名為docker-compose.yml配套 .env.single.example 復(fù)制為.env預(yù)檢環(huán)節(jié)SKILL.md 第 1 步特別強調(diào)DNS 的 A 記錄必須已指向服務(wù)器且 80/443 端口從公網(wǎng)可達——這是 Caddy 拿不到證書的頭號原因也是單機模式看起來壞了最常見的根因檢查時不能只看宿主機防火墻還要看云廠商安全組啟動前必須執(zhí)行g(shù)rep REPLACE_WITH_ .env確認沒有遺漏占位符——殘留的占位符會變成字面密碼導(dǎo)致 Postgres/n8n 連接失敗.env權(quán)限收緊為chmod 600并把加密密鑰抄送到盒子之外的安全位置。上線后的日常運維更新鏡像、備份、恢復(fù)不在本文展開由 DAY2.md 專門覆蓋其備份金律與本文高度相關(guān)密鑰與數(shù)據(jù)要一起備份才有效——沒有密鑰的數(shù)據(jù)庫備份是不可解密的單機模式下備份 快照n8n_data卷 離線保存.env。總結(jié)單機模式是自托管 n8n 的起點與默認答案一個進程、SQLite、一個可備份的卷、Caddy 自動 TLS構(gòu)成了一套運維負擔(dān)極低的完整實例。它的核心決策點有三模式選擇看負載與擴展預(yù)期數(shù)據(jù)庫選型看增長預(yù)期遷移走導(dǎo)出-重指向-導(dǎo)入的官方路徑并全程鎖定加密密鑰。當(dāng)你發(fā)現(xiàn)執(zhí)行開始排隊、長任務(wù)阻塞 UI、或需要跨機擴展時再按 QUEUE_MODE.md 升級到隊列模式也不遲——而那時你已經(jīng)擁有了一套可靠的單機基線。【免費下載鏈接】n8n-mcpA MCP for Claude Desktop / Claude Code / Windsurf / Cursor to build n8n workflows for you項目地址: https://gitcode.com/GitHub_Trending/n8/n8n-mcp創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考