orztv commited on
Commit
2d97948
·
1 Parent(s): ca1b28f
Files changed (3) hide show
  1. Dockerfile +26 -3
  2. config/n8n_env.sh +28 -0
  3. run.sh +101 -67
Dockerfile CHANGED
@@ -28,7 +28,14 @@ ENV WEBHOOK_URL=${WEBHOOK_URL} \
28
  QUEUE_BULL_REDIS_PORT=6379 \
29
  QUEUE_BULL_REDIS_DB=0 \
30
  N8N_QUEUE_BULL_REDIS_PREFIX=n8n:queue \
31
- EXECUTIONS_MODE=queue
 
 
 
 
 
 
 
32
 
33
  # 安装系统依赖
34
  RUN apt-get update && apt-get install -y --no-install-recommends \
@@ -48,12 +55,27 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
48
  htop \
49
  jq \
50
  netcat-openbsd \
51
- # 添加 Redis 安装
52
  redis-server \
 
 
 
53
  && ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
54
  && dpkg-reconfigure --frontend noninteractive tzdata \
 
 
 
 
 
 
 
 
 
 
 
 
55
  && apt-get clean \
56
  && rm -rf /var/lib/apt/lists/* \
 
57
  # 创建虚拟环境并安装 Python 依赖
58
  && python3 -m venv $VIRTUAL_ENV \
59
  && $VIRTUAL_ENV/bin/pip install --no-cache-dir --upgrade pip requests yt-dlp \
@@ -77,6 +99,7 @@ WORKDIR /home/pn/n8n
77
 
78
  # 复制启动脚本并创建数据目录
79
  COPY --chown=pn:pn run.sh ./run.sh
 
80
  RUN chmod +x ./run.sh \
81
  && mkdir -p /home/pn/.n8n \
82
  && chown -R pn:pn /home/pn/.n8n
@@ -91,4 +114,4 @@ USER pn
91
  VOLUME ["/home/pn/.n8n"]
92
 
93
  # 启动命令
94
- CMD ["./run.sh"]
 
28
  QUEUE_BULL_REDIS_PORT=6379 \
29
  QUEUE_BULL_REDIS_DB=0 \
30
  N8N_QUEUE_BULL_REDIS_PREFIX=n8n:queue \
31
+ EXECUTIONS_MODE=queue \
32
+ # 添加 Qdrant 配置
33
+ QDRANT_HOST=localhost \
34
+ QDRANT_PORT=6333 \
35
+ # 添加超时配置
36
+ WAIT_TIMEOUT=30 \
37
+ # 添加日志级别
38
+ N8N_LOG_LEVEL=info
39
 
40
  # 安装系统依赖
41
  RUN apt-get update && apt-get install -y --no-install-recommends \
 
55
  htop \
56
  jq \
57
  netcat-openbsd \
 
58
  redis-server \
59
+ # 添加 Qdrant 依赖
60
+ pkg-config \
61
+ libssl-dev \
62
  && ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
63
  && dpkg-reconfigure --frontend noninteractive tzdata \
64
+ # 安装 Rust
65
+ && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \
66
+ && . $HOME/.cargo/env \
67
+ # 克隆并编译 Qdrant
68
+ && cd /tmp \
69
+ && git clone --depth 1 https://github.com/qdrant/qdrant.git \
70
+ && cd qdrant \
71
+ && cargo build --release --bin qdrant \
72
+ && mv target/release/qdrant /usr/local/bin/ \
73
+ && cd / \
74
+ && rm -rf /tmp/qdrant \
75
+ # 清理
76
  && apt-get clean \
77
  && rm -rf /var/lib/apt/lists/* \
78
+ && rm -rf $HOME/.cargo/registry \
79
  # 创建虚拟环境并安装 Python 依赖
80
  && python3 -m venv $VIRTUAL_ENV \
81
  && $VIRTUAL_ENV/bin/pip install --no-cache-dir --upgrade pip requests yt-dlp \
 
99
 
100
  # 复制启动脚本并创建数据目录
101
  COPY --chown=pn:pn run.sh ./run.sh
102
+ COPY --chown=pn:pn config/n8n_env.sh ./config/n8n_env.sh
103
  RUN chmod +x ./run.sh \
104
  && mkdir -p /home/pn/.n8n \
105
  && chown -R pn:pn /home/pn/.n8n
 
114
  VOLUME ["/home/pn/.n8n"]
115
 
116
  # 启动命令
117
+ CMD ["./run.sh"]
config/n8n_env.sh ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # N8N 基础配置
4
+ export N8N_ENCRYPTION_KEY="${N8N_ENCRYPTION_KEY:-n8n8n8n}"
5
+ export NODE_FUNCTION_ALLOW_BUILTIN=*
6
+ export NODE_FUNCTION_ALLOW_EXTERNAL=*
7
+
8
+ # 数据清理配置
9
+ export EXECUTIONS_DATA_PRUNE=true
10
+ export EXECUTIONS_DATA_MAX_AGE=36
11
+ export EXECUTIONS_DATA_PRUNE_MAX_COUNT=1000
12
+ export EXECUTIONS_DATA_SAVE_ON_ERROR=all
13
+ export EXECUTIONS_DATA_SAVE_ON_SUCCESS=all
14
+ export EXECUTIONS_DATA_SAVE_ON_PROGRESS=false
15
+ export EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=false
16
+
17
+ # N8N 功能配置
18
+ export N8N_DIAGNOSTICS_ENABLED=false
19
+ export N8N_VERSION_NOTIFICATIONS_ENABLED=true
20
+ export N8N_TEMPLATES_ENABLED=false
21
+ export N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
22
+
23
+ # 性能优化配置
24
+ export N8N_PROCESS_THREADED=true
25
+ export N8N_METRICS_ENABLED=true
26
+ export N8N_HIRING_BANNER_ENABLED=false
27
+ export N8N_USER_MANAGEMENT_DISABLED=false
28
+ export N8N_PERSONALIZATION_ENABLED=false
run.sh CHANGED
@@ -1,28 +1,43 @@
1
  #!/bin/bash
2
- set -e
3
 
4
  # 导入环境变量
5
  source /home/pn/.env
6
 
7
- current_time=$(date +"%Y-%m-%d %H:%M:%S")
8
- echo "Starting n8n at $current_time"
 
 
 
 
9
 
10
- # 输出数据库配置信息
11
- echo "Database Configuration:"
12
- echo "Host: ${DB_POSTGRESDB_HOST}"
13
- echo "Port: ${DB_POSTGRESDB_PORT}"
14
- echo "User: ${DB_POSTGRESDB_USER}"
15
- echo "Database: ${DB_POSTGRESDB_DATABASE}"
16
- echo "Type: ${DB_TYPE}"
17
 
18
- # 等待 PostgreSQL 就绪, 并输出连接信息,超时10秒
19
- wait_for_postgres() {
20
- echo "Waiting for PostgreSQL to start..."
21
- while ! nc -z ${DB_POSTGRESDB_HOST} ${DB_POSTGRESDB_PORT}; do
22
- echo "Trying to connect to PostgreSQL at ${DB_POSTGRESDB_HOST}:${DB_POSTGRESDB_PORT}..."
 
 
 
 
 
 
 
 
 
 
 
23
  sleep 1
24
  done
25
- echo "PostgreSQL started"
 
 
26
  }
27
 
28
  # 启动 Redis 服务
@@ -30,63 +45,82 @@ start_redis() {
30
  echo "Starting Redis server..."
31
  redis-server --daemonize yes
32
  sleep 1
33
- if redis-cli ping > /dev/null 2>&1; then
34
- echo "Redis server started successfully"
35
- else
36
  echo "Failed to start Redis server"
37
  exit 1
38
  fi
 
 
 
 
 
 
39
  }
40
 
41
- # start_redis() 函数后添加检查函数
42
- check_redis_queue() {
43
- echo "检查 Redis 队列状态..."
44
- redis-cli info | grep connected_clients
45
- redis-cli keys "${N8N_QUEUE_BULL_REDIS_PREFIX}*"
46
- echo "Redis 队列键值列表:"
47
- redis-cli keys "*" | grep "bull"
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  }
49
 
50
- wait_for_postgres
51
- start_redis
52
- check_redis_queue
53
-
54
- # 设置 N8N 环境变量
55
- export N8N_ENCRYPTION_KEY="${N8N_ENCRYPTION_KEY:-n8n8n8n}"
56
- # 允许使用所有内建模块
57
- export NODE_FUNCTION_ALLOW_BUILTIN=*
58
- # 允许使用外部 npm 模块
59
- export NODE_FUNCTION_ALLOW_EXTERNAL=*
60
- # Activate automatic data pruning
61
- export EXECUTIONS_DATA_PRUNE=true
62
- # Number of hours after execution that n8n deletes data
63
- export EXECUTIONS_DATA_MAX_AGE=36
64
- # Number of executions to store
65
- export EXECUTIONS_DATA_PRUNE_MAX_COUNT=1000
66
- # Save executions ending in errors
67
- export EXECUTIONS_DATA_SAVE_ON_ERROR=all
68
- # Save successful executions
69
- export EXECUTIONS_DATA_SAVE_ON_SUCCESS=all
70
- # Don't save node progress for each execution
71
- export EXECUTIONS_DATA_SAVE_ON_PROGRESS=false
72
- # Don't save manually launched executions
73
- export EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=false
74
- # 将以下环境变量设置为 false,以阻止 n8n 连接到其服务器
75
- export N8N_DIAGNOSTICS_ENABLED=false
76
- export N8N_VERSION_NOTIFICATIONS_ENABLED=true
77
- export N8N_TEMPLATES_ENABLED=false
78
-
79
- # 设置文件权限
80
- export N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
81
 
82
- echo "Starting n8n with the following configuration:"
83
- echo "N8N_HOST: ${N8N_HOST}"
84
- echo "N8N_PORT: ${N8N_PORT}"
85
- echo "N8N_PROTOCOL: ${N8N_PROTOCOL}"
86
- echo "WEBHOOK_URL: ${WEBHOOK_URL}"
87
- echo "QUEUE_BULL_REDIS_HOST: ${QUEUE_BULL_REDIS_HOST}"
88
- echo "QUEUE_BULL_REDIS_PORT: ${QUEUE_BULL_REDIS_PORT}"
89
- echo "EXECUTIONS_MODE: ${EXECUTIONS_MODE}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
 
91
- # 将输出重定向到日志文件
92
- exec n8n start 2>&1 | tee /home/pn/.n8n/n8n.log
 
1
  #!/bin/bash
2
+ set -eo pipefail
3
 
4
  # 导入环境变量
5
  source /home/pn/.env
6
 
7
+ # 错误处理函数
8
+ handle_error() {
9
+ echo "错误发生在第 $1 行"
10
+ exit 1
11
+ }
12
+ trap 'handle_error $LINENO' ERR
13
 
14
+ # 超时处理函数
15
+ timeout_handler() {
16
+ echo "操作超时"
17
+ exit 1
18
+ }
 
 
19
 
20
+ # 等待服务就绪的通用函数
21
+ wait_for_service() {
22
+ local service=$1
23
+ local host=$2
24
+ local port=$3
25
+ local timeout=${4:-$WAIT_TIMEOUT}
26
+
27
+ echo "等待 $service 就绪..."
28
+ local end=$((SECONDS + timeout))
29
+
30
+ while [ $SECONDS -lt $end ]; do
31
+ if nc -z "$host" "$port" >/dev/null 2>&1; then
32
+ echo "$service 已就绪"
33
+ return 0
34
+ fi
35
+ echo "尝试连接 $service at $host:$port..."
36
  sleep 1
37
  done
38
+
39
+ echo "$service 启动超时"
40
+ exit 1
41
  }
42
 
43
  # 启动 Redis 服务
 
45
  echo "Starting Redis server..."
46
  redis-server --daemonize yes
47
  sleep 1
48
+ if ! redis-cli ping > /dev/null 2>&1; then
 
 
49
  echo "Failed to start Redis server"
50
  exit 1
51
  fi
52
+
53
+ # 设置 Redis 配置
54
+ redis-cli config set maxmemory 512mb
55
+ redis-cli config set maxmemory-policy allkeys-lru
56
+
57
+ echo "Redis server started successfully"
58
  }
59
 
60
+ # 启动 Qdrant 服务
61
+ start_qdrant() {
62
+ echo "Starting Qdrant server..."
63
+ mkdir -p /home/pn/.n8n/qdrant
64
+ qdrant > /home/pn/.n8n/qdrant/qdrant.log 2>&1 &
65
+
66
+ # 等待 Qdrant 启动
67
+ local timeout=30
68
+ local end=$((SECONDS + timeout))
69
+
70
+ while [ $SECONDS -lt $end ]; do
71
+ if curl -s http://localhost:6333/health >/dev/null; then
72
+ echo "Qdrant server started successfully"
73
+ return 0
74
+ fi
75
+ sleep 1
76
+ done
77
+
78
+ echo "Failed to start Qdrant server"
79
+ exit 1
80
  }
81
 
82
+ # 检查服务状态
83
+ check_services() {
84
+ echo "检查服务状态..."
85
+
86
+ # 检查 Redis
87
+ echo "Redis 状态:"
88
+ redis-cli info | grep 'used_memory\|connected_clients\|total_connections_received'
89
+
90
+ # 检查 Redis 队列
91
+ echo "Redis 队列状态:"
92
+ redis-cli keys "${N8N_QUEUE_BULL_REDIS_PREFIX}*"
93
+
94
+ # 检查 Qdrant
95
+ echo "Qdrant 状态:"
96
+ curl -s http://localhost:6333/metrics
97
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
 
99
+ # 主流程
100
+ main() {
101
+ current_time=$(date +"%Y-%m-%d %H:%M:%S")
102
+ echo "Starting services at $current_time"
103
+
104
+ # 输出配置信息
105
+ echo "Database Configuration:"
106
+ echo "Host: ${DB_POSTGRESDB_HOST}"
107
+ echo "Port: ${DB_POSTGRESDB_PORT}"
108
+ echo "User: ${DB_POSTGRESDB_USER}"
109
+ echo "Database: ${DB_POSTGRESDB_DATABASE}"
110
+ echo "Type: ${DB_TYPE}"
111
+
112
+ # 启动服务
113
+ wait_for_service "PostgreSQL" "${DB_POSTGRESDB_HOST}" "${DB_POSTGRESDB_PORT}"
114
+ start_redis
115
+ start_qdrant
116
+ check_services
117
+
118
+ # 设置 N8N 环境变量
119
+ source /home/pn/n8n/config/n8n_env.sh
120
+
121
+ echo "Starting n8n..."
122
+ exec n8n start
123
+ }
124
 
125
+ # 执行主流程
126
+ main "$@"