n8n使用教程
环境变量
待补全中,目前进度0.5%…
基础设置
- N8N_PORT
- 描述:前端端口
- 值:5678
- WEBHOOK_URL
- 描述:网钩地址
- 值:
https://n8n.example.com
语言和时区
- GENERIC_TIMEZONE
- 描述:时区
- 值:America/New_York
- N8N_DEFAULT_LOCALE
- 描述:语言
- 值:en
安全
- N8N_ENCRYPTION_KEY
- 描述:加密密钥
- 值:abcdefg1234567
- N8N_SECURE_COOKIE
- 描述:仅在https允许cookie
- 值:true
- N8N_BLOCK_ENV_ACCESS_IN_NODE
- 描述:是否禁止用户访问环境变量
- 值:false
数据库
默认使用 sqlite
- DB_TYPE
- 描述:数据库类型,支持 sqlite 和 postgresdb
- 值:sqlite
- DB_POSTGRESDB_SCHEMA
- 描述:数据库集合名
- 值:public
- DB_POSTGRESDB_DATABASE
-
描述:postgresdb 数据库名称
-
值:n8n
-
- DB_POSTGRESDB_HOST
-
描述:postgresdb 数据库连接地址
-
值:localhost
-
- DB_POSTGRESDB_PORT
-
描述:postgresdb 数据库连接端口
-
值:5432
-
- DB_POSTGRESDB_USER
-
描述:postgresdb 数据库连接用户名
-
值:postgres
-
- DB_POSTGRESDB_PASSWORD
-
描述:postgresdb 数据库连接密码
-
值:empty
-
- DB_POSTGRESDB_POOL_SIZE
-
描述:postgresdb 数据库连接数
-
值:2
-
- DB_POSTGRESDB_CONNECTION_TIMEOUT
-
描述:postgresdb 数据库延迟
-
值:2000
-
- DB_POSTGRESDB_SCHEMA
-
描述:postgresdb 数据库表名
-
值:public
-
- DB_POSTGRESDB_SSL_CA
- 描述:postgresdb 数据库证书路径
- 值:默认未定义
- DB_POSTGRESDB_SSL_CERT
- 描述:客户端证书路径
- 值:默认未定义
- DB_POSTGRESDB_SSL_KEY
- 描述:客户端私钥路径
- 值:默认未定义
- DB_POSTGRESDB_SSL_ENABLED
-
描述:是否启用SSL
-
值:false
-
- DB_POSTGRESDB_SSL_REJECT_UNAUTHORIZED
- 描述:postgresdb 数据库启用SSL验证,仅建议在测试时关闭
- 值:false
邮件
默认开启了smtp
- N8N_SMTP_HOST
-
描述:smtp 登录地址
-
值:mail.xxx.com
-
- N8N_SMTP_PORT
-
描述:smtp 登录端口
-
值:456
-
- N8N_SMTP_USER
-
描述:smtp 登录用户名
-
值:user
-
- N8N_SMTP_PASS
-
描述:smtp 登录密码
-
值:password
-
- N8N_MFA_ENABLED
- 描述:是否开启二次验证
- 值:true
本地部署
需要提前安装 git 和 Node.js (版本 ≥ 18)
- 克隆仓库到本地
git clone https://github.com/n8n-io/n8n && cd n8n
- 本地构建
pnpm build
- 运行服务
pnpm start
抱脸部署
需注意Huggingface无法发送邮件
感谢 @blowsnow 的汉化
注意设置以下环境变量
变量名 | 示例值 | 描述 |
---|---|---|
HF_TOKEN | hf_**** | 必填,HuggingFace令牌,点击获取 |
SYNC_INTERVAL | 36000 | 可选,同步间隔 |
-
Dockerfile
FROM n8nio/n8n:latest ENV VENV_PATH=/opt/venv ENV PATH="$VENV_PATH/bin:$PATH" ENV N8N_PORT=7860 ENV N8N_DEFAULT_LOCALE=zh-CN ENV GENERIC_TIMEZONE=Asia/Shanghai ENV N8N_RUNNERS_ENABLED=true ENV N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true USER root RUN apk add --no-cache \ bash \ python3 \ py3-pip \ curl && \ python3 -m venv $VENV_PATH && \ pip install --no-cache-dir --upgrade pip && \ pip install --no-cache-dir huggingface-hub && \ \ # --- 开始安装中文语言包 --- echo "Downloading n8n Chinese UI from ${I18N_URL}" && \ curl -L -o /tmp/editor-ui.tar.gz "${I18N_URL:-https://github.com/other-blowsnow/n8n-i18n-chinese/releases/latest/download/editor-ui.tar.gz}" && \ mkdir -p /tmp/check && \ tar -xzf /tmp/editor-ui.tar.gz -C /tmp/check && \ rm -rf /usr/local/lib/node_modules/n8n/node_modules/n8n-editor-ui/dist/* && \ cp -r /tmp/check/dist/* /usr/local/lib/node_modules/n8n/node_modules/n8n-editor-ui/dist/ && \ rm -rf /tmp/check /tmp/editor-ui.tar.gz && \ # --- 中文语言包安装结束 --- \ apk del curl && \ rm -rf /var/cache/apk/* && \ \ chown -R node:node /usr/local/lib/node_modules/n8n/node_modules/n8n-editor-ui/dist/ && \ chown -R node:node $VENV_PATH COPY sync_data.sh . RUN chmod +x sync_data.sh && chown node:node sync_data.sh USER node EXPOSE 7860 ENTRYPOINT [ "sh", "-c", "$HOME/sync_data.sh" ]
-
sync_data.sh
#!/usr/bin/env bash set -euo pipefail IFS=$'\n\t' set -a log() { echo "[$(date +'%F %T')] $*" } init_backup(){ if [[ -n "${DATASET_ID:-}" ]]; then log "📁 使用外部定义的 DATASET_ID=$DATASET_ID" return 0 fi if [[ -z "${HF_TOKEN:-}" ]]; then log "⚠️ HF_TOKEN 未设置,跳过备份" return 1 fi USER_ID=$(python3 - <<'PY' import os,sys from huggingface_hub import HfApi try: name = HfApi(token=os.getenv("HF_TOKEN")).whoami().get("name","") print(name) if name else sys.exit(1) except: sys.exit(1) PY ) if [[ -z "$USER_ID" ]]; then log "⚠️ 获取 USER_ID 失败,跳过备份" return 1 fi DATASET_ID="${USER_ID}/data" # ← 这里修正了变量名 log "✅ 设置默认 DATASET_ID=$DATASET_ID" return 0 } prep_repo(){ python3 <<'PY' import os from huggingface_hub import HfApi api = HfApi(token=os.getenv("HF_TOKEN")) repo = os.environ["DATASET_ID"] author = repo.split("/")[0] if not any(d.id == repo for d in api.list_datasets(author=author)): api.create_repo(repo_id=repo, repo_type="dataset", private=True) branch = "main" refs = api.list_repo_refs(repo_id=repo, repo_type="dataset").branches if branch not in [b.name for b in refs]: api.create_branch(repo_id=repo, repo_type="dataset", branch=branch) PY log "✅ 数据集 & 分支就绪" } restore_latest(){ python3 <<'PY' import os,sys,tarfile,tempfile from huggingface_hub import HfApi api = HfApi(token=os.getenv("HF_TOKEN")) repo, branch = os.getenv("DATASET_ID"), "main" files = api.list_repo_files(repo_id=repo, repo_type="dataset", revision=branch) backs = sorted(f for f in files if f.endswith(".tar.gz")) if not backs: sys.exit(0) td = tempfile.mkdtemp() path = api.hf_hub_download(repo_id=repo, repo_type="dataset", revision=branch, filename=backs[-1], local_dir=td) with tarfile.open(path) as t: t.extractall(os.getenv("BACKUP_DIR")) PY log "✅ 恢复最新备份(如果有)" } do_backup(){ ts=$(date +%Y%m%d_%H%M%S) fname="Backup_${ts}.tar.gz" tmp=$(mktemp -d) tar -czf "$tmp/$fname" -C "$BACKUP_DIR" . python3 <<PY import os from huggingface_hub import HfApi api = HfApi(token=os.getenv("HF_TOKEN")) repo, branch = os.getenv("DATASET_ID"), "main" api.upload_file(path_or_fileobj="$tmp/$fname", path_in_repo="$fname", repo_id=repo, repo_type="dataset", revision=branch) keep = int(os.getenv("DATASET_NUM", "10")) files = api.list_repo_files(repo_id=repo, repo_type="dataset", revision=branch) backs = sorted(f for f in files if f.endswith(".tar.gz")) for old in backs[:-keep]: api.delete_file(path_in_repo=old, repo_id=repo, repo_type="dataset", revision=branch) api.super_squash_history(repo_id=repo, repo_type="dataset", branch=branch) PY rm -rf "$tmp" log "✅ 上传备份并清理临时文件" } sync_loop(){ while true; do do_backup log "⏳ 下次同步在 ${SYNC_INTERVAL}s 后" sleep "${SYNC_INTERVAL}" done } main(){ BACKUP_DIR="${BACKUP_DIR:-$HOME/.n8n}" DATASET_NUM="${DATASET_NUM:-10}" SYNC_INTERVAL="${SYNC_INTERVAL:-36000}" if init_backup; then log "🚀 启动备份/同步流程,使用数据集:$DATASET_ID" prep_repo restore_latest sync_loop & # 后台 else log "🚀 直接启动主应用,无备份/同步" fi exec tini -- /docker-entrypoint.sh } main
-
README.md
--- title: N8N emoji: 📚 colorFrom: green colorTo: pink sdk: docker pinned: false ---
快捷键
按住 Ctrl
后滑动鼠标滚轮放大缩小
按住鼠标中键拖动
工作流
Flux 绘图
原作 yuyu0.0,博主根据 fal 进行了修改
点击这里 打开复制工作流,密码 linux.do
,注意替换所有的 example.com
为 R2 存储桶的自定义域
打开 n8n 并登录后,点击左上角 + → Workflow,将复制内容粘贴到页面中央稍待
-
修改 Google 节点
找到 Google 节点双击打开设置点击 Select Credential → Create new credential
无法连接到 Google 时 Host 需要修改为为代理地址,否则无需修改,API Key 填写从 AIStudio 获取的密钥
-
修改绘图节点
找到 发起 Fal 绘图请求 节点,双击打开设置点击 Select Credential → Create new credential
Name 填写
Authorization
,Value 填写Key $FAL_KEY
后点击 Save 并关闭窗口根据需要修改或下拉到底点击 Add Parameter 添加,修改后点击 Back to Canvas
- prompt
- 描述:提示词
- 值:
,style:
- seed
- 描述:原点值
- 值:1189
- aspect_ratio
- 描述:图片比例
- 值:21:9, 16:9, 4:3, 3:2, 1:1, 2:3, 3:4, 9:16, 9:21
- raw
- 描述:原生质感
- 值:false
- sync_mode
- 描述:返回base64,本文工作流暂不支持,不要打开
- 值:true
- num_images
- 描述:输出数目
- 值:1
- output_format
- 描述:输出格式,支持 jpeg、png
- 值:jpeg
- enable_safety_checker
- 描述:是否开启安全审查,实测关闭后还是有审查的
- 值:false
- safety_tolerance
- 描述:安全系数
- 值:1, 2, 3, 4, 5, 6
-
修改 R2 节点
找到 将图片上传到R2 双击后点击 Select Credential → Create new credential
S3 填写
https://CloudflareID.r2.cloudflarestorage.com
,Region 留空,填写Access Key ID
和Secret Access Key
后点击 Save并关闭窗口修改 Bucket Name 后点击 Back to Canvas
-
测试执行
点击 Execute workflow ,在弹出的表单中填写提示词选择图片大小和风格后执行,注意不要关闭表单保持表单置顶
-
图片渲染
稍等片刻后,图片生成后会刷新渲染,并可展示最近生成的10张图片,也可点击 更多提示词 获取或贡献你的提示词
- prompt
RSS 新闻
原作 Bubble7766
点击这里 打开复制工作流,密码 ff2a.com
打开 n8n 并登录后,点击左上角 + → Workflow,将复制内容粘贴到页面中央稍待
-
修改定时
找到始节点 🕒双击打开修改触发时间
-
修改邮箱
找到末节点 ✉ 双击打开修改邮箱设置,下面以QQ邮箱为例
From Email 填写QQ邮箱地址,To Email 也填写QQ邮箱或其他收件箱地址然后点击 Select Credential → Create new credential
User 填写QQ邮箱地址,Password 填写授权码,Host 填写
smtp.qq.com
Port 填写465
,勾选 SSL/TLS 后点击 Save,验证通过后关闭窗口 → Back to Canvas授权码获取方式: 登录QQ邮箱,旧版邮箱需要先点击右上角 新版邮箱 切换,点击右上角 ⚙️ ,接着点击左侧边栏 账号与安全,跳转的页面点击 安全设置 → 生成授权码,使用微信扫码二维码发送短信,注意选择正确的手机号,发送短信后点击 我已发送
-
修改 API 节点
找到所有如图所示的 new-api ai-work 节点双击打开修改设置,下面以 xai 为例
Model 填写
grok-3
,Base URL 填写https://api.x.ai/v1
后点击 Select Credential → Create new credential填写 xai 的 API Key ,Base URL 填写
https://api.x.ai/v1
后点击 Save,验证通过后关闭窗口 → Back to Canvas -
测试执行
点击 Execute workflow 执行
-
激活流
导航栏打开 Inactive 旁边的开关使其 Active 激活工作流
番外一:HuggingFace 部署汉化版
-
editor.tar.gz 点击下载 汉化包,下载后将压缩包上传到抱脸空间
-
Dockerfile
FROM n8nio/n8n:latest
USER root
COPY editor-ui.tar.gz /tmp/
RUN mkdir -p /tmp/check && \
tar -xzf /tmp/editor-ui.tar.gz -C /tmp/check && \
rm -rf /usr/local/lib/node_modules/n8n/node_modules/n8n-editor-ui/dist/* && \
cp -r /tmp/check/dist/* /usr/local/lib/node_modules/n8n/node_modules/n8n-editor-ui/dist/ && \
rm -rf /tmp/check /tmp/editor-ui.tar.gz && \
chown -R node:node /usr/local/lib/node_modules/n8n/node_modules/n8n-editor-ui/dist/
USER node
EXPOSE 7860