【教程】n8n 安装


一键安装脚本

本脚本使用 caddy 进行内网反代,避开了原本 n8n 对 https 的限制。

#!/bin/bash

echo "=== 开始配置 n8n 与 Caddy 内部反向代理 ==="

# 检查本地配置
if [ -d "data" ]; then
    echo "警告:检测到本地已存在配置"
    read -p "是否清除现有配置并重新初始化?(y/N) " answer
    if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
        echo "清理现有配置..."
        rm -rf data caddy_data
        echo "现有配置已清理"
    else
        echo "保留现有配置,退出脚本"
        exit 0
    fi
fi

# 检查 docker-compose.yml
if [ -f "docker-compose.yml" ]; then
    echo "发现现有的 docker-compose.yml"
    read -p "是否覆盖现有的 docker-compose.yml?(y/N) " answer
    if [ "$answer" != "y" ] && [ "$answer" != "Y" ]; then
        echo "保留现有 docker-compose.yml,退出脚本"
        exit 0
    fi
fi

# 设置端口号
read -p "请输入要使用的 HTTPS 端口 (默认: 8443): " HTTPS_PORT
HTTPS_PORT=${HTTPS_PORT:-8443}

# 设置内部域名
INTERNAL_DOMAIN="n8n.local"

echo -e "\n1. 启动临时容器..."
docker run -d --name n8n-temp n8nio/n8n:latest
echo "等待10秒让容器完全初始化..."
sleep 10

echo -e "\n2. 创建本地配置目录..."
mkdir -p data
mkdir -p caddy_data/caddy_config
mkdir -p caddy_data/caddy_data
mkdir -p caddy_data/certs
echo "目录创建完成"

echo -e "\n3. 从运行中的容器复制配置..."
docker cp n8n-temp:/home/node/.n8n/. ./data/
if [ $? -eq 0 ]; then
    echo "数据目录复制成功"
else
    echo "错误:数据目录复制失败"
    docker rm -f n8n-temp
    exit 1
fi

echo -e "\n4. 清理临时容器..."
docker rm -f n8n-temp
echo "临时容器已清理"

echo -e "\n5. 创建 Caddy 配置文件..."
mkdir -p caddy_data/caddy_config/Caddyfile.d

# 创建自签名证书
echo -e "\n5.1 生成自签名证书..."
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
  -keyout caddy_data/certs/n8n.key \
  -out caddy_data/certs/n8n.crt \
  -subj "/CN=${INTERNAL_DOMAIN}" \
  -addext "subjectAltName = DNS:${INTERNAL_DOMAIN},IP:127.0.0.1"

echo "证书生成完成"

# 创建 Caddy 配置文件
cat > caddy_data/caddy_config/Caddyfile <<EOL
{
    # 禁用 ACME 以使用本地证书
    auto_https disable_redirects
}

:${HTTPS_PORT} {
    tls /etc/caddy/certs/n8n.crt /etc/caddy/certs/n8n.key
    
    reverse_proxy n8n-app:5678
    
    log {
        output file /data/access.log
    }
    
    encode gzip
}
EOL
echo "Caddy 配置创建完成"

echo -e "\n6. 创建 docker-compose.yml..."
cat > docker-compose.yml <<EOL
version: "3"

services:
  n8n-app:
    image: n8nio/n8n:latest
    container_name: n8n-app
    restart: unless-stopped
    expose:
      - 5678
    volumes:
      - ./data:/home/node/.n8n
    environment:
      - TZ=Asia/Shanghai
      - GENERIC_TIMEZONE=Asia/Shanghai
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - N8N_HOST=localhost
      - NODE_ENV=production
      - WEBHOOK_URL=https://localhost:${HTTPS_PORT}/
      - N8N_TRUSTED_PROXY_ADDRESSES=caddy-service
    dns:
      - 8.8.8.8
      - 223.5.5.5
    networks:
      - n8n-network
    extra_hosts:
      - "${INTERNAL_DOMAIN}:127.0.0.1"

  caddy-service:
    image: caddy:latest
    container_name: caddy-service
    restart: unless-stopped
    ports:
      - "${HTTPS_PORT}:${HTTPS_PORT}"
    volumes:
      - ./caddy_data/caddy_config:/etc/caddy
      - ./caddy_data/caddy_data:/data
      - ./caddy_data/certs:/etc/caddy/certs:ro
    networks:
      - n8n-network
    extra_hosts:
      - "${INTERNAL_DOMAIN}:127.0.0.1"

networks:
  n8n-network:
    driver: bridge
EOL
echo "配置文件创建完成"

echo -e "\n7. 创建 hosts 文件更新脚本..."
cat > update_hosts.sh <<EOL
#!/bin/bash
# 检查 /etc/hosts 文件中是否已存在条目
if grep -q "${INTERNAL_DOMAIN}" /etc/hosts; then
    echo "${INTERNAL_DOMAIN} 已在 hosts 文件中"
else
    echo "添加 ${INTERNAL_DOMAIN} 到 hosts 文件..."
    echo "127.0.0.1 ${INTERNAL_DOMAIN}" | sudo tee -a /etc/hosts
    echo "hosts 文件已更新"
fi
EOL
chmod +x update_hosts.sh
echo "hosts 更新脚本创建完成"

echo -e "\n=== 配置完成! ==="
echo "你可以:"
echo "1. 运行 './update_hosts.sh' 更新本地 hosts 文件 (需要 sudo 权限)"
echo "2. 编辑 ./data 目录下的配置文件"
echo "3. 编辑 docker-compose.yml 修改设置"
echo "4. 使用 'docker compose up -d' 启动服务"
echo "5. 访问 https://localhost:${HTTPS_PORT} 或 https://${INTERNAL_DOMAIN}:${HTTPS_PORT} 开始使用 n8n"
echo -e "\n注意:"
echo "- 由于使用自签名证书,浏览器会显示安全警告,需要手动确认信任证书"
echo "- 如果访问 webhook 出现问题,可能需要调整 WEBHOOK_URL 环境变量"

# 询问是否立即启动服务
read -p "是否立即启动服务?(y/N) " answer
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
    echo "启动 n8n 和 Caddy..."
    docker compose up -d
    echo "服务已启动,请访问 https://localhost:${HTTPS_PORT}"
fi

如果本文帮助到了你,帮我点个广告可以咩(o′┏▽┓`o)


评论
  目录