在 Google Cloud 免费层级部署生产级 n8n 自动化平台

本指南详细介绍了如何在 Google Cloud Virtual Machine 的“始终免费”层级上部署 n8n,一个功能强大的开源自动化工具。文章涵盖了从基础架构设置到企业级安全、性能优化、数据备份和监控的完整部署流程,帮助您搭建一个无需月度托管费用的生产级自动化平台,并实现对数据和工作流的完全控制。

阅读时长: 15 分钟
共 7414字
作者: eimoon.com

n8n 是一个强大的开源流程自动化工具,完全可以在 Google Cloud 的“始终免费”层级上运行,为您提供一个无需月度托管费用的生产级自动化平台。本指南将重点介绍 Google Cloud 免费层级的限制、全面的安全性、企业级监控以及备份系统,并将其整合到一个完整的部署流程中。

整个过程大约需要 30-45 分钟,需要一个已启用计费的 Google Cloud 账户、域名 DNS 访问权限以及基本的命令行知识。

部署架构

您将采用基于 Docker 的架构,部署在 Google Compute Engine (GCE) 上,并集成 SSL 终止和反向代理功能。这种方法简单可靠,同时仍在 Google Cloud 的“始终免费”层级范围内。

主要组件包括:

  • Compute Engine VM: 运行 Debian 12 的 e2-micro 实例。
  • Docker 容器: 官方 n8nio/n8n 镜像,支持自动重启。
  • Nginx: 处理 SSL 终止、安全头和请求代理。
  • Let’s Encrypt: 自动 SSL 证书管理和自动续订。
  • SQLite: 内置数据库,无需额外设置或维护(可选择升级到 PostgreSQL)。
  • 本地存储: 使用 Docker 卷 (Docker Volumes) 进行持久化数据存储。

n8n 与其他自动化工具的部署选项对比

选择最适合您需求和技术要求的部署方法:

特性 n8n (自托管) Zapier Microsoft Power Automate IFTTT
成本 免费 (仅托管成本) $19.99+/月 $15+/月 $3.99+/月
工作流限制 无限 20-100+ 取决于计划 取决于许可证 20+
数据控制 完全所有权 第三方服务器 Microsoft 服务器 第三方服务器
自定义代码 完整的 JavaScript 支持 有限的代码步骤 Power Fx 表达式
API 访问 无限 受计划限制 受速率限制 有限
条件逻辑 高级分支 基本条件 高级 基本
错误处理 内置重试/错误流 基本重试 高级 有限
本地集成 直接数据库/文件访问 仅 API 混合选项 仅 API
工作流复杂性 无限节点 取决于计划 取决于计划 单一触发-动作
自定义连接器 自行构建 请求/付费开发 部分自定义
执行时间 无限制 最长 1-30 分钟 可变 最长 15 分钟

使用 Docker 在 Google Cloud 上部署 n8n

此部署使用四个集成组件创建一个安全的、可从 Web 访问的 n8n 实例。

先决条件

在开始部署之前,请确保您具备以下条件:

  • 已启用计费的 Google Cloud 账户 (免费层级访问所需)。
  • 具有 DNS 管理能力的域名(例如 example.com)。
  • 熟悉基本的终端命令。
  • 大约 30 分钟的设置时间。

步骤 1: Google Cloud 基础设施设置

  1. 创建 Google Cloud 项目:

    • 在 Google Cloud Console 中,点击项目下拉菜单,选择“新建项目”。
    • 项目名称:n8n-automation (或您喜欢的名称)。
    • 点击“创建”。
  2. 配置虚拟机 (VM):

    • 前往 Compute Engine > VM 实例 (VM Instances)
    • 点击“创建实例”。
    • 名称:n8n-server
    • 区域:选择符合免费层级条件的区域,例如 us-central1, us-west1us-east1
    • 机器配置:
      • 系列:E2
      • 机器类型:e2-micro (免费层级建议,提供 1GB RAM,适用于轻量级负载) 或 e2-medium (如果您不需要严格保持免费层级)。
    • 启动磁盘:
      • 操作系统:选择 Ubuntu 22.04 LTSDebian 12 (本指南以 Debian 为例)。
      • 启动磁盘类型:标准持久磁盘。
      • 大小:30 GB (免费层级上限)。
    • 防火墙:
      • 允许 HTTP 流量: ✓
      • 允许 HTTPS 流量: ✓
  3. 保留静态 IP 地址:

    • 在 Google Cloud Console 中,导航到 VPC 网络 (VPC network) > IP 地址 (IP addresses)
    • 点击“保留外部静态地址 (Reserve external static address)”。
    • 名称:n8n-static-ip
    • 类型:区域
    • 区域:与您的 VM 区域匹配。
    • 附加到:选择您的 n8n-server 实例。
    • 点击“保留”。请立即记录此 IP 地址,因为它将用于 DNS 配置。

步骤 2: 域名 DNS 配置

  1. 添加 DNS 记录:
    • 在您的域名提供商(如 GoDaddy, Cloudflare, DNSPod 等)的 DNS 管理界面中,创建一个 A 记录,将您的子域名指向 Google Cloud 服务器的静态 IP 地址。
    Record Type: A
    Name/Host: n8n (例如,将创建 n8n.yourdomain.com) 或 @ (用于根域名,例如 yourdomain.com)
    Value: [您在步骤 1.3 中获得的静态 IP 地址]
    TTL: 300 (或提供商默认值)
    
  2. 验证 DNS 传播:
    • 使用 nslookup n8n.yourdomain.com 命令或在线 DNS 传播检查工具(如 dnschecker.org)来确认 DNS 记录已正确传播。

步骤 3: 服务器准备

  1. 连接到服务器:
    • 在 Compute Engine 控制台中,找到您的 n8n-server 实例,然后点击“SSH”按钮,通过浏览器内终端连接到 VM。
  2. 更新系统包:
    sudo apt update
    sudo apt upgrade -y
    

步骤 4: Docker 和 Docker Compose 安装

  1. 安装 Docker:
    sudo apt install docker.io -y
    
  2. 安装 Docker Compose:
    sudo apt install docker-compose -y
    
  3. 配置 Docker 服务:
    sudo systemctl start docker
    sudo systemctl enable docker
    sudo systemctl status docker
    

步骤 5: 创建 Docker Compose 配置

  1. 创建项目目录:
    mkdir ~/n8n-docker && cd ~/n8n-docker
    
  2. 创建 Docker Compose 文件:
    nano docker-compose.yml
    
    添加以下配置,将 n8n.example.com 替换为您的实际域名:
    services:
      n8n:
        image: n8nio/n8n:latest
        container_name: n8n
        restart: unless-stopped
        ports:
          - "5678:5678"
        environment:
          - N8N_HOST=n8n.example.com
          - WEBHOOK_TUNNEL_URL=https://n8n.example.com/
          - WEBHOOK_URL=https://n8n.example.com/
          - GENERIC_TIMEZONE=UTC
        volumes:
          - n8n_data:/home/node/.n8n
        networks:
          - n8n_network
    
    volumes:
      n8n_data:
        driver: local
    
    networks:
      n8n_network:
        driver: bridge
    
  3. 使用 Docker Compose 部署 n8n:
    sudo docker-compose up -d
    
  4. 验证 n8n 部署:
    sudo docker-compose ps
    sudo docker-compose logs n8n
    curl -I http://localhost:5678
    

步骤 6: Nginx 安装和配置

  1. 安装 Nginx:
    sudo apt install nginx -y
    
  2. 创建 Nginx 配置:
    sudo nano /etc/nginx/sites-available/n8n.conf
    
    添加以下配置,将 n8n.example.com 替换为您的域名:
    server {
        listen 80;
        server_name n8n.example.com;
    
        location / {
            proxy_pass http://localhost:5678;
            proxy_http_version 1.1;
    
            chunked_transfer_encoding off;
            proxy_buffering off;
            proxy_cache off;
    
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
    
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
    
            proxy_read_timeout 86400;
            proxy_connect_timeout 60;
            proxy_send_timeout 60;
        }
    }
    
  3. 启用 Nginx 配置:
    sudo ln -s /etc/nginx/sites-available/n8n.conf /etc/nginx/sites-enabled/
    sudo nginx -t
    sudo systemctl restart nginx
    sudo systemctl status nginx
    

步骤 7: SSL 证书设置

  1. 安装 Certbot:
    sudo apt install certbot python3-certbot-nginx -y
    
  2. 获取 SSL 证书:
    sudo certbot --nginx -d n8n.example.com
    
    按照提示操作(输入电子邮件、同意服务条款、选择重定向选项)。Certbot 将自动修改 Nginx 配置以启用 HTTPS。
  3. 验证 SSL 配置:
    • 在浏览器中访问您的域名 https://n8n.example.com,确认地址栏出现锁定图标,表示 SSL 已成功启用。

步骤 8: 访问和初始配置

  1. 访问您的 n8n 实例:
    • 在 Web 浏览器中访问 https://n8n.example.com
    • 完成初始设置向导并创建您的第一个用户账户。
  2. 初始安全配置:
    • 设置一个强密码。
    • 根据需要配置其他用户。
    • 测试 Webhook 功能。
    • 创建并保存一个工作流 (workflow),然后重启容器以确保数据持久化。

步骤 9: 维护和更新

  1. 更新 n8n:
    cd ~/n8n-docker
    sudo docker-compose pull       # 拉取最新镜像
    sudo docker-compose up -d      # 使用新镜像重启容器
    sudo docker-compose logs n8n   # 查看更新日志
    
  2. 管理部署:
    sudo docker-compose down       # 停止所有服务
    sudo docker-compose up -d      # 启动所有服务
    sudo docker-compose logs       # 查看所有服务日志
    sudo docker-compose logs n8n   # 仅查看 n8n 日志
    sudo docker-compose restart n8n # 重启特定服务
    
  3. 备份数据:
    mkdir -p ~/n8n-backups
    # 备份 n8n 的数据卷(包含 SQLite 数据库和工作流文件)
    sudo docker run --rm \
      -v n8n-docker_n8n_data:/data \
      -v ~/n8n-backups:/backup \
      ubuntu:latest \
      tar czf /backup/n8n-backup-$(date +%Y%m%d_%H%M%S).tar.gz -C /data .
    
    # 清理旧的备份,只保留最新的 10 个
    cd ~/n8n-backups && ls -t n8n-backup-*.tar.gz | tail -n +11 | xargs rm -f
    
  4. 监控系统健康:
    sudo docker-compose ps         # 查看容器状态
    sudo docker-compose logs --tail=50 n8n # 查看 n8n 最近 50 行日志
    free -h                        # 检查内存使用情况
    df -h                          # 检查磁盘空间使用情况
    uptime                         # 检查系统负载和运行时间
    
  5. SSL 证书续订:
    sudo certbot renew --dry-run   # 试运行续订,检查是否成功
    sudo systemctl status certbot.timer # 检查 Certbot 自动续订定时任务状态
    sudo certbot renew             # 强制续订(如果需要)
    

故障排除常见问题

  • 容器无法启动:
    • 检查 docker-compose psdocker-compose logs n8n
    • 检查端口是否被占用:netstat -tlnp | grep 5678
    • 尝试 sudo docker-compose restart
  • SSL 证书问题:
    • 检查证书状态:certbot certificates
    • 验证 DNS 解析:nslookup n8n.example.com
    • 尝试强制续订:sudo certbot --nginx -d n8n.example.com --force-renewal
  • Nginx 配置问题:
    • 运行 sudo nginx -t 检查语法错误。
    • 查看 Nginx 错误日志:sudo tail -f /var/log/nginx/error.log
    • 重启 Nginx 服务:sudo systemctl restart nginx
  • Docker Compose 问题:
    • 运行 sudo docker-compose config 验证 YAML 文件语法。
    • 如果问题持续,尝试 sudo docker-compose down && sudo docker-compose up -d --force-recreate
    • 警告:sudo docker-compose down -v 会删除数据卷,请在备份数据后谨慎使用。

步骤 10: 企业和生产用高级配置

本节将您的 n8n 安装从简单的自动化工具转变为健壮的企业级平台。

10.1 数据库迁移:从 SQLite 到 PostgreSQL

docker-compose.yml 更新为包含 PostgreSQL 服务。PostgreSQL 提供了更好的性能、扩展性和数据完整性,适用于生产环境。

services:
  postgres:
    image: postgres:15-alpine
    container_name: n8n_postgres
    restart: unless-stopped
    environment:
      - POSTGRES_DB=n8n
      - POSTGRES_USER=n8n_user
      - POSTGRES_PASSWORD=your_secure_password_here # 请替换为强密码
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - n8n_network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n_user -d n8n"]
      interval: 30s
      timeout: 10s
      retries: 3

  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy # 确保 PostgreSQL 启动并健康后才启动 n8n
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=n8n.example.com
      - WEBHOOK_TUNNEL_URL=https://n8n.example.com/
      - WEBHOOK_URL=https://n8n.example.com/
      - GENERIC_TIMEZONE=UTC
      # 数据库配置
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n_user
      - DB_POSTGRESDB_PASSWORD=your_secure_password_here # 与 postgres 服务的密码一致
      - DB_POSTGRESDB_POOL_SIZE=10 # 数据库连接池大小
    volumes:
      - n8n_data:/home/node/.n8n
    networks:
      - n8n_network

volumes:
  n8n_data:
    driver: local
  postgres_data:
    driver: local

networks:
  n8n_network:
    driver: bridge

实现数据库迁移:

在更新 docker-compose.yml 文件后,执行以下命令:

# 首先停止所有服务
sudo docker-compose down

# 备份您的 SQLite 数据 (此步骤非常重要,以便回滚)
sudo docker run --rm \
  -v n8n-docker_n8n_data:/data \
  -v ~/n8n-backups:/backup \
  ubuntu:latest \
  tar czf /backup/sqlite-backup-$(date +%Y%m%d_%H%M%S).tar.gz -C /data .

# 启动新配置,n8n 将自动连接 PostgreSQL 并进行数据迁移
sudo docker-compose up -d
# 查看 n8n 启动日志,确认数据库连接和迁移状态
sudo docker-compose logs -f n8n

10.2 企业级安全配置

为了增强安全性,我们将敏感数据(如数据库密码和 n8n 加密密钥)存储在 .env.secure 文件中,并通过 Docker secrets 进行管理。

首先,创建用于存储敏感数据的 .env.secure 文件:

sudo nano ~/n8n-docker/.env.secure

添加敏感配置。N8N_ENCRYPTION_KEY 用于加密凭据和敏感信息,务必使用强随机字符串:

# Database credentials
DB_POSTGRESDB_PASSWORD=your_very_secure_database_password # 替换为您的 PostgreSQL 密码
N8N_ENCRYPTION_KEY=your_32_character_encryption_key_here # 使用 openssl rand -hex 32 生成

更新 Docker Compose 文件以使用 Docker secrets 并强化安全设置:

services:
  postgres:
    # ... (原有配置) ...
    environment:
      # ... (原有配置) ...
      - POSTGRES_PASSWORD_FILE=/run/secrets/db_password # 从 secret 文件读取密码
    secrets:
      - db_password # 引用下面的 db_password secret

  n8n:
    # ... (原有配置) ...
    # 为了增强安全性,将 n8n 服务的端口绑定到 localhost (127.0.0.1),
    # 确保它只能通过 Nginx 反向代理访问,不能直接从互联网访问。
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      # ... (原有配置,如 N8N_HOST 等) ...
      # 安全强化配置
      - N8N_BLOCK_ENV_ACCESS_IN_NODE=true # 阻止工作流创建者通过表达式或代码节点访问环境变量
      - N8N_SECURE_COOKIE=true # 确保会话 cookie 仅通过 HTTPS 连接发送
      - N8N_BLOCK_FILE_ACCESS_TO_N8N_FILES=true # 阻止工作流访问 n8n 内部文件
      - N8N_RESTRICT_FILE_ACCESS_TO=/tmp # 将文件系统访问限制为仅临时目录
      # 数据库配置,通过 secret 文件读取密码
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PASSWORD_FILE=/run/secrets/db_password

    env_file: # 引入 .env.secure 文件中的环境变量
      - ./.env.secure
    secrets:
      - db_password # 引用下面的 db_password secret

secrets:
  db_password: # 定义一个名为 db_password 的 secret
    file: ./secrets/db_password.txt # 这个文件需要手动创建并放入密码

# ... (volumes 和 networks 配置) ...

注意: db_password.txt 文件需要手动创建,并将其内容设为您的 PostgreSQL 密码,例如:

mkdir -p ~/n8n-docker/secrets
echo "your_very_secure_database_password" > ~/n8n-docker/secrets/db_password.txt
# 确保文件权限安全
chmod 600 ~/n8n-docker/secrets/db_password.txt

10.3 性能优化

为 PostgreSQL 创建一个 postgres.conf 文件以优化性能。这些设置针对 1GB RAM 的服务器进行优化。

sudo nano ~/n8n-docker/postgres.conf

添加以下优化设置:

# Memory settings optimized for 1GB RAM server
shared_buffers = 256MB        # PostgreSQL 用于缓存数据和索引的内存量
effective_cache_size = 512MB  # 操作系统和数据库缓存的总量估计
work_mem = 4MB                # 内部排序操作和哈希表使用的内存量

# Connection settings
max_connections = 50          # 最大并发连接数
shared_preload_libraries = 'pg_stat_statements' # 用于统计语句的扩展

# Logging for monitoring
log_statement = 'all'         # 记录所有 SQL 语句
log_duration = on             # 记录每条 SQL 语句的执行时间
log_min_duration_statement = 1000 # 记录执行时间超过 1000ms 的语句

# Checkpoint settings for better performance
checkpoint_completion_target = 0.9 # 控制检查点写入完成的目标百分比
wal_buffers = 16MB            # 预写日志 (WAL) 缓冲区大小

注意: 在 docker-compose.ymlpostgres 服务中,你需要挂载这个配置文件:

  postgres:
    # ...
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./postgres.conf:/etc/postgresql/postgresql.conf # 挂载配置文件
    command: ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"] # 指定配置文件
    # ...

docker-compose.yml 中配置 n8n 性能和 Redis 队列(用于优化任务执行):

  n8n:
    environment:
      # ... (原有配置) ...
      # 执行配置
      - EXECUTIONS_MODE=queue # 启用队列模式,将任务放入 Redis 队列
      - QUEUE_BULL_REDIS_HOST=redis # 指定 Redis 主机名
      - EXECUTIONS_DATA_SAVE_ON_ERROR=all # 错误时保存所有执行数据
      - EXECUTIONS_DATA_SAVE_ON_SUCCESS=all # 成功时保存所有执行数据
      - EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=true # 手动执行时也保存数据

      # 性能调优
      - N8N_PAYLOAD_SIZE_MAX=104857600 # 最大 payload 大小 100MB
      - NODE_OPTIONS=--max-old-space-size=2048 # Node.js 进程的最大旧生代内存限制为 2GB

      # 数据保留策略,用于性能优化和磁盘空间管理
      - EXECUTIONS_DATA_PRUNE=true # 启用执行数据清理
      - EXECUTIONS_DATA_MAX_AGE=336 # 执行数据保留 14 天(336 小时)

  redis: # 新增 Redis 服务
    image: redis:7-alpine
    container_name: n8n_redis
    restart: unless-stopped
    networks:
      - n8n_network
    volumes:
      - redis_data:/data # Redis 数据卷

volumes:
  # ... (n8n_data, postgres_data) ...
  redis_data: # 新增 Redis 数据卷
    driver: local

10.4 认证与用户管理

n8n 服务的 environment 部分添加用户管理和邮件配置,以便进行用户邀请和通知:

  n8n:
    environment:
      # ... (原有配置) ...
      # 用户管理配置
      - N8N_USER_MANAGEMENT_DISABLED=false # 启用用户管理界面
      - N8N_PUBLIC_API_DISABLED=false # 启用公共 API 访问
      - N8N_PERSONALIZATION_ENABLED=true # 启用用户个性化设置

      # 邮件配置,用于用户邀请、密码重置等功能
      - N8N_EMAIL_MODE=smtp # 邮件模式为 SMTP
      - N8N_SMTP_HOST=smtp.gmail.com # SMTP 服务器地址(示例为 Gmail)
      - N8N_SMTP_PORT=587 # SMTP 端口
      - N8N_SMTP_USER=your-email@gmail.com # SMTP 用户名(您的邮箱)
      - N8N_SMTP_PASS=your-app-password # SMTP 密码或应用专用密码
      - N8N_SMTP_SENDER=your-email@gmail.com # 发件人邮箱

注意: 对于 Gmail 等服务,可能需要生成“应用专用密码”而不是直接使用账户密码。

外部认证集成 (企业功能):

如果您拥有 n8n 的企业版许可证,可以配置 SAML 或 LDAP 认证:

  n8n:
    environment:
      # ... (原有配置) ...
      # SAML 认证 (企业版功能)
      - N8N_SAML_ENABLED=true
      - N8N_SAML_ATTRIBUTES_EMAIL=email
      - N8N_SAML_ATTRIBUTES_FIRSTNAME=firstName
      - N8N_SAML_ATTRIBUTES_LASTNAME=lastName

      # LDAP 认证 (企业版功能)
      - N8N_LDAP_ENABLED=true
      - N8N_LDAP_SERVER=ldap://your-ldap-server.com
      - N8N_LDAP_PORT=389

10.5 Webhook 和 API 定制

n8n 服务的 environment 部分添加 Webhook 和 API 定制选项,以满足特定集成需求:

  n8n:
    environment:
      # ... (原有配置) ...
      # Webhook 定制
      - WEBHOOK_URL=https://n8n.example.com/ # Webhook 的基本 URL
      - N8N_PAYLOAD_SIZE_MAX=104857600 # 最大 Webhook Payload 大小 100MB
      - N8N_METRICS=true # 启用 Prometheus 兼容指标暴露
      - N8N_METRICS_PREFIX=n8n_ # 指标前缀

      # API 端点定制
      - N8N_PUBLIC_API_ENDPOINT=api/v1 # 公共 API 根路径
      - N8N_PUBLIC_API_SWAGGERUI_DISABLED=false # 启用 Swagger UI 交互式 API 文档

      # 自定义端点路径
      - N8N_ENDPOINT_WEBHOOK=webhook # Webhook 的相对路径
      - N8N_ENDPOINT_WEBHOOK_TEST=webhook-test # 测试 Webhook 的相对路径

10.6 数据备份与灾难恢复

自动化数据库备份:

docker-compose.yml 中添加一个 backup 服务,用于定期备份 PostgreSQL 数据库:

  backup:
    image: postgres:15-alpine # 使用 PostgreSQL 客户端镜像
    container_name: n8n_backup
    restart: "no" # 容器执行完备份任务后退出
    depends_on:
      - postgres # 依赖于 PostgreSQL 服务
    environment:
      - PGPASSWORD=your_secure_password_here # 替换为您的 PostgreSQL 密码
    volumes:
      - ./backups:/backups # 将备份保存到宿主机 ./backups 目录
      - ./backup-script.sh:/backup-script.sh # 挂载备份脚本
    networks:
      - n8n_network
    command: ["/backup-script.sh"] # 容器启动时执行备份脚本

创建 backup-script.sh 脚本:

sudo nano ~/n8n-docker/backup-script.sh

添加以下内容:

#!/bin/bash
set -e

BACKUP_DIR="/backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/n8n_backup_$TIMESTAMP.sql"

mkdir -p $BACKUP_DIR
# 使用 pg_dump 备份 PostgreSQL 数据库
pg_dump -h postgres -U n8n_user -d n8n > $BACKUP_FILE
gzip $BACKUP_FILE # 压缩备份文件
# 删除超过 7 天的旧备份文件
find $BACKUP_DIR -name "n8n_backup_*.sql.gz" -mtime +7 -delete

echo "Backup completed: $BACKUP_FILE.gz"

使脚本可执行:

sudo chmod +x ~/n8n-docker/backup-script.sh

注意: 此 backup 服务只会执行一次然后退出。要实现自动化,您可以使用 cron 任务来定期运行 docker-compose run --rm backup

完整系统备份策略:

创建 full-backup.sh 脚本,用于完整备份 n8n 的所有数据和配置:

sudo nano ~/n8n-docker/full-backup.sh

添加以下内容:

#!/bin/bash
set -e

# 定义备份存储基础目录,通常是当前用户主目录下的一个子目录
BACKUP_BASE_DIR="/home/$(whoami)/n8n-backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="$BACKUP_BASE_DIR/full_backup_$TIMESTAMP"

mkdir -p $BACKUP_DIR
echo "Creating comprehensive n8n backup..."

# 1. 优雅地停止 n8n Docker 服务
cd ~/n8n-docker
sudo docker-compose down

# 2. 备份 Docker 数据卷
# 备份 n8n_data 卷 (包含工作流、凭据等)
sudo docker run --rm \
  -v n8n-docker_n8n_data:/source:ro \
  -v $BACKUP_DIR:/backup \
  ubuntu:latest \
  tar czf /backup/n8n_data.tar.gz -C /source .

# 备份 postgres_data 卷 (包含 PostgreSQL 数据库数据)
sudo docker run --rm \
  -v n8n-docker_postgres_data:/source:ro \
  -v $BACKUP_DIR:/backup \
  ubuntu:latest \
  tar czf /backup/postgres_data.tar.gz -C /source .

# 3. 备份配置文件
cp docker-compose.yml $BACKUP_DIR/
cp .env.secure $BACKUP_DIR/
cp -r secrets/ $BACKUP_DIR/ 2>/dev/null || true # 复制 secrets 目录,如果不存在则忽略错误

# 4. 创建恢复说明文件
cat > $BACKUP_DIR/RESTORE_INSTRUCTIONS.md << EOF
# 恢复说明 (Restore Instructions)

1. 安装 Docker 和 Docker Compose。
2. 创建项目目录:`mkdir ~/n8n-docker && cd ~/n8n-docker`。
3. 拷贝配置文件:`cp backup/docker-compose.yml .`
4. 拷贝环境变量文件:`cp backup/.env.secure .`
5. 拷贝 secrets 文件:`cp -r backup/secrets/ .`
6. 恢复数据卷:
   - 创建 n8n 数据卷:`docker volume create n8n-docker_n8n_data`
   - 创建 PostgreSQL 数据卷:`docker volume create n8n-docker_postgres_data`
   - 恢复 n8n 数据:`docker run --rm -v n8n-docker_n8n_data:/target -v \$(pwd)/backup:/backup ubuntu tar xzf /backup/n8n_data.tar.gz -C /target`
   - 恢复 PostgreSQL 数据:`docker run --rm -v n8n-docker_postgres_data:/target -v \$(pwd)/backup:/backup ubuntu tar xzf /backup/postgres_data.tar.gz -C /target`
7. 启动服务:`docker-compose up -d`

备份创建时间: $TIMESTAMP
EOF

# 5. 重启 n8n Docker 服务
sudo docker-compose up -d

# 6. 清理旧的完整备份 (只保留最新的 10 个完整备份)
ls -t $BACKUP_BASE_DIR | tail -n +11 | xargs -r rm -rf

echo "Complete backup created in: $BACKUP_DIR"
echo "Services restarted successfully"

使脚本可执行:

sudo chmod +x ~/n8n-docker/full-backup.sh

提示: 您可以将此脚本添加到 cron 中,以便定期执行完整备份。

10.7 监控与可观测性

n8n 服务的 healthchecklogging 部分添加监控和日志配置:

  n8n:
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:5678/healthz || exit 1"] # 健康检查命令
      interval: 30s # 每 30 秒检查一次
      timeout: 10s # 超时时间 10 秒
      retries: 3 # 失败重试 3 次
      start_period: 60s # 启动后 60 秒内不检查健康状态

    environment:
      # ... (原有配置) ...
      # 监控和日志
      - N8N_METRICS=true # 启用 Prometheus 指标
      - N8N_LOG_LEVEL=info # 设置日志级别为 info
      - N8N_LOG_OUTPUT=console # 将日志输出到控制台

      # 诊断信息 (出于隐私考虑可禁用)
      - N8N_DIAGNOSTICS_ENABLED=false

    logging: # Docker 日志配置
      driver: "json-file" # 使用 JSON 文件驱动
      options:
        max-size: "100m" # 每个日志文件最大 100MB
        max-file: "5" # 最多保留 5 个日志文件
        labels: "service=n8n,environment=production" # 添加自定义标签

10.8 特定环境配置

创建特定环境的配置文件,方便在不同环境中部署和管理 n8n。例如:

生产环境 (.env.production):

sudo nano ~/n8n-docker/.env.production
N8N_LOG_LEVEL=warn # 生产环境日志级别设置为警告
EXECUTIONS_DATA_PRUNE=true # 启用执行数据清理
EXECUTIONS_DATA_MAX_AGE=168 # 生产环境执行数据保留 7 天 (168 小时)
N8N_METRICS=true # 生产环境启用指标
N8N_SECURE_COOKIE=true # 生产环境启用安全 Cookie
N8N_BLOCK_ENV_ACCESS_IN_NODE=true # 生产环境阻止工作流访问环境变量

开发环境 (.env.development):

sudo nano ~/n8n-docker/.env.development
N8N_LOG_LEVEL=debug # 开发环境日志级别设置为调试
EXECUTIONS_DATA_PRUNE=false # 开发环境不清理执行数据
N8N_METRICS=false # 开发环境禁用指标
N8N_SECURE_COOKIE=false # 开发环境禁用安全 Cookie
N8N_BLOCK_ENV_ACCESS_IN_NODE=false # 开发环境不阻止工作流访问环境变量

使用时指定环境文件:

sudo docker-compose --env-file .env.production up -d  # 生产环境部署
sudo docker-compose --env-file .env.development up -d # 开发环境部署

如何更新 n8n 版本?

为了获取最新功能和关键修复,请定期更新 n8n 版本。建议至少每月更新一次,以避免一次跳过多个版本带来的风险。在更新前,请务必查看 n8n Release notes,了解是否存在重大变更。在生产环境更新前,最好先在测试环境中进行验证。

1. 标准 Docker 容器更新

拉取最新的 n8n 镜像:

docker pull n8nio/n8n:latest

停止当前容器,然后使用新镜像重启:

# 首先找到当前 n8n 容器的 ID 或名称
docker ps -a
# 停止并移除旧容器 (请根据您的实际容器 ID 或名称替换 <container_id>)
docker stop <container_id>
docker rm <container_id>
# 重新运行 n8n 容器,确保数据卷正确挂载
docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n n8nio/n8n

2. Docker Compose 更新

对于 Docker Compose 安装,请按照以下步骤操作(推荐方法):

cd ~/n8n-docker
docker compose pull      # 拉取最新版本的 n8n 镜像
docker compose down      # 停止并移除当前所有服务容器
docker compose up -d     # 启动更新后的容器,并可能执行数据库迁移

如果需要回滚升级,请安装您想要回退的旧版本。如果升级涉及到数据库迁移,请在当前版本上运行 n8n db:revert 以回滚数据库。对于多次数据库迁移回滚,请重复此过程。

为什么选择 n8n 进行自动化?

n8n 在自动化领域脱颖而出,它提供了对工作流的完全控制,没有供应商锁定或基于使用量的定价。与基于云的解决方案(按自动化次数收费或在免费层级限制功能)不同,自托管的 n8n 提供无限的工作流。

主要优势在于所有权。您可以控制自己的数据,根据需要定制平台,并且不受外部价格变化或服务限制的影响。对于开发人员来说,这意味着可以访问源代码,能够创建自定义节点 (custom nodes),并与现有基础设施集成。

在性能方面,自托管的 n8n 消除了内部系统集成对外部 API 调用的延迟。您的工作流在自己的基础设施上运行,使其在处理复杂自动化链时更快、更可靠。

结论

您现在已经在 Google Cloud 的免费层级上,在您的自定义子域名下,拥有一个生产就绪的 n8n 自动化平台。此设置提供无限的工作流、完整的数据所有权和企业级安全性,无需每月订阅费用。

此实现包括 SSL 加密、自动化备份、健康监控和安全强化,与付费自动化平台的功能相媲美。您的实例可以处理复杂的、多步骤工作流,并行处理以及直接数据库集成——这些功能在传统的 SaaS 平台上每月可能需要花费数百美元。

您的当前配置在免费层级限制内高效扩展。当自动化需求增长时,升级到更大的 VM 实例、外部 PostgreSQL 数据库或负载均衡器只需对现有基础进行最小的配置更改。

备份系统保护您的工作流和数据,而监控确保了可靠的操作。日常维护包括检查系统更新、审查日志以及监控 Google Cloud 使用情况以保持在免费层级范围内。

现在,您可以开始构建工作流,整合您现有的系统,自动化重复性任务,并创建复杂的业务逻辑。您的自托管 n8n 实例为您严肃的自动化项目提供了所需的灵活性和控制,而无需受到供应商限制或基于使用量的定价约束。

常见问题

如何监控我的 Google Cloud 使用情况以保持在免费层级限制内?

在 Google Cloud Console > Billing > Reports 中检查使用情况。监控计算小时数 (e2-micro 的限制为 744 小时/月)、存储 (30 GB 限制) 和网络出口 (1 GB/月)。在 50% 和 90% 阈值设置账单提醒。e2-micro 实例在限制内可 24/7 运行,但高网络流量可能会超出免费出口配额。

e2-micro 实例对 n8n 的性能限制是什么?

1 GB RAM 限制并发工作流执行为 3-5 个简单工作流或 1-2 个复杂工作流。处理大型数据集的数据库操作会变慢。CPU 限制会影响需要大量处理的工作流。对于每天超过 10-15 个工作流的生产负载,请考虑升级到 e2-small (~$13/月) 或在非高峰时段安排工作流。

如果 n8n 停止工作或无法访问,我该怎么办?

使用 sudo docker-compose ps 检查容器状态,sudo docker-compose logs n8n 查看日志。如果需要,尝试 sudo docker-compose restart n8n。对于 SSL 问题,运行 sudo certbot certificates 并检查证书是否过期。使用 nslookup n8n.yourdomain.com 验证 DNS 解析。检查 Nginx 错误日志:sudo tail -f /var/log/nginx/error.log。系统中的监控脚本会自动重启失败的服务。

当我超出免费层级时,如何升级到更大的 VM?

停止 VM,转到 Compute Engine > VM 实例,点击您的实例,选择“编辑”,将机器类型更改为 e2-small 或更大,然后重启。相应地更新您的预算提醒。无需更改配置——所有服务将继续运行,性能得到提升。

多个用户可以安全地访问我的 n8n 实例吗?

本指南中的初始设置使用适合个人使用的基本身份验证。对于团队访问,请通过设置 N8N_USER_MANAGEMENT_DISABLED=false 并通过 n8n Web 界面配置单独账户来升级到 n8n 的用户管理功能。考虑实施 OAuth 集成或 VPN 访问以增强多用户环境中的安全性。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计