jolbbb commited on
Commit
4c4bf52
·
verified ·
1 Parent(s): 5239426

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +272 -107
Dockerfile CHANGED
@@ -1,120 +1,285 @@
1
- # 使用 Python 和 Node.js 作为基础镜像
2
- FROM nikolaik/python-nodejs:python3.12-nodejs20
3
 
4
- # 添加维护者信息
5
- LABEL maintainer="ai来事 <https://www.youtube.com/@all.ai.>"
 
 
 
 
6
 
7
- ARG CACHEBUST=99
 
 
 
 
 
8
 
9
- # 设置构建参数,提供默认值
10
- ARG WEBHOOK_URL=https://你的hf账户名-空间名.hf.space/
11
- ARG POSTGRESDB_PORT=5432
 
 
12
 
13
- # 设置基本环境变量
14
- ENV WEBHOOK_URL=${WEBHOOK_URL} \
15
- N8N_HOST=0.0.0.0 \
16
- N8N_PORT=7860 \
17
- N8N_PROTOCOL=https \
18
- GENERIC_TIMEZONE=Asia/Shanghai \
19
- N8N_METRICS=true \
20
- QUEUE_HEALTH_CHECK_ACTIVE=true \
21
- N8N_PAYLOAD_SIZE_MAX=256 \
22
- DB_TYPE=postgresdb \
23
- DB_POSTGRESDB_PORT=${POSTGRESDB_PORT} \
24
- VIRTUAL_ENV=/home/pn/venv \
25
- PATH="/home/pn/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH" \
26
- # 添加 Qdrant 配置
27
- QDRANT_HOST=http://localhost \
28
- QDRANT_PORT=6333 \
29
- QDRANT_VERSION=1.12.4 \
30
- # 添加超时配置
31
- WAIT_TIMEOUT=30 \
32
- # 添加日志级别
33
- N8N_LOG_LEVEL=info
 
34
 
35
- # 第1步:安装所有系统层面的依赖包
36
- RUN apt-get update && apt-get install -y --no-install-recommends \
37
- curl \
38
- unzip \
39
- gnupg \
40
- build-essential \
41
- sudo \
42
- vim \
43
- git \
44
- procps \
45
- lsof \
46
- net-tools \
47
- ca-certificates \
48
- openssl \
49
- tzdata \
50
- htop \
51
- jq \
52
- netcat-openbsd \
53
- redis-server \
54
- bash \
55
- # 清理apt缓存,减小镜像体积
56
- && apt-get clean && rm -rf /var/lib/apt/lists/*
57
 
58
- # 第2步:安装 Node.js
59
- RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
60
- && apt-get install -y --no-install-recommends nodejs
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
 
62
- # 第3步:配置时区
63
- RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
64
- && dpkg-reconfigure --frontend noninteractive tzdata
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
 
66
- # 第4步:下载并安装 Qdrant
67
- RUN cd /tmp \
68
- && curl -L "https://github.com/qdrant/qdrant/releases/download/v${QDRANT_VERSION}/qdrant-x86_64-unknown-linux-gnu.tar.gz" -o qdrant.tar.gz \
69
- && tar xvf qdrant.tar.gz \
70
- && mv qdrant /usr/local/bin/ \
71
- && rm qdrant.tar.gz
72
 
73
- # 第5步:创建并设置 Qdrant 数据目录的权���
74
- RUN mkdir -p /home/pn/.n8n/qdrant/storage \
75
- && mkdir -p /home/pn/.n8n/qdrant/config \
76
- && mkdir -p /home/pn/.n8n/qdrant/snapshots \
77
- && chown -R pn:pn /home/pn/.n8n/qdrant \
78
- && chmod -R 755 /home/pn/.n8n/qdrant
79
 
80
- # 第6步:创建 Python 虚拟环境并安装依赖
81
- RUN python3 -m venv $VIRTUAL_ENV \
82
- && $VIRTUAL_ENV/bin/pip install --no-cache-dir --upgrade pip requests yt-dlp
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
 
84
- # --- 优化点: 将 n8n 主程序和社区节点分开安装 ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
 
86
- # 第7步:全局安装 n8n 主程序和 pnpm
87
- RUN npm install -g n8n@latest pnpm
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
 
89
- # 第8步:在指定的自定义目录中安装社区节点 (使用 pnpm 安装)
90
- ARG N8N_CUSTOM_EXTENSIONS_DIR=/home/pn/.n8n/custom-nodes
91
- RUN mkdir -p ${N8N_CUSTOM_EXTENSIONS_DIR} \
92
- && pnpm add --dir ${N8N_CUSTOM_EXTENSIONS_DIR} n8n-nodes-link-preview n8n-nodes-scrapegraphai \
93
- && chown -R pn:pn ${N8N_CUSTOM_EXTENSIONS_DIR}
94
-
95
- # 第9步 (最终修复):创建名为 "config" 的 n8n 配置文件
96
- RUN echo '{"nodes.allowUnsupported": true, "nodes.custom.path": "/home/pn/.n8n/custom-nodes"}' > /home/pn/.n8n/config \
97
- && chown pn:pn /home/pn/.n8n/config
98
-
99
- # 创建工作目录
100
- WORKDIR /home/pn/n8n
101
-
102
- # 复制启动脚本并创建数据目录
103
- COPY --chown=pn:pn run.sh ./run.sh
104
- COPY --chown=pn:pn config/n8n_env.sh ./config/n8n_env.sh
105
- RUN chmod +x ./run.sh \
106
- && mkdir -p /home/pn/.n8n \
107
- && chown -R pn:pn /home/pn/.n8n \
108
- && chown -R pn:pn /home/pn/n8n
109
-
110
- # 暴露端口
111
- EXPOSE 7860
112
-
113
- # 切换到非 root 用户
114
- USER pn
115
-
116
- # 设置数据卷
117
- VOLUME ["/home/pn/.n8n"]
118
-
119
- # 启动命令
120
- CMD ["./run.sh"]
 
1
+ #!/bin/bash
2
+ set -eo pipefail
3
 
4
+ # --- 关键修复:直接读取平台注入的环境变量 ---
5
+ export DB_POSTGRESDB_HOST="${POSTGRESDB_HOST}"
6
+ export DB_POSTGRESDB_PORT="${POSTGRESDB_PORT:-5432}" # 如果平台未提供端口,则使用默认值
7
+ export DB_POSTGRESDB_USER="${POSTGRES_USER}"
8
+ export DB_POSTGRESDB_PASSWORD="${POSTGRES_PASSWORD}"
9
+ export DB_POSTGRESDB_DATABASE="${POSTGRES_DB}"
10
 
11
+ # 错误处理函数
12
+ handle_error() {
13
+ echo "错误发生在第 $1 行"
14
+ exit 1
15
+ }
16
+ trap 'handle_error $LINENO' ERR
17
 
18
+ # 超时处理函数
19
+ timeout_handler() {
20
+ echo "操作超时"
21
+ exit 1
22
+ }
23
 
24
+ # 等待服务就绪的通用函数
25
+ wait_for_service() {
26
+ local service=$1
27
+ local host=$2
28
+ local port=$3
29
+ local timeout=${4:-$WAIT_TIMEOUT}
30
+
31
+ echo "等待 $service 就绪..."
32
+ local end=$((SECONDS + timeout))
33
+
34
+ while [ $SECONDS -lt $end ]; do
35
+ if nc -z "$host" "$port" >/dev/null 2>&1; then
36
+ echo "$service 已就绪"
37
+ return 0
38
+ fi
39
+ echo "尝试连接 $service at $host:$port..."
40
+ sleep 1
41
+ done
42
+
43
+ echo "$service 启动超时"
44
+ exit 1
45
+ }
46
 
47
+ # 启动 Redis 服务
48
+ start_redis() {
49
+ echo "Starting Redis server..."
50
+ redis-server --daemonize yes
51
+ sleep 1
52
+ if ! redis-cli ping > /dev/null 2>&1; then
53
+ echo "Failed to start Redis server"
54
+ exit 1
55
+ fi
56
+
57
+ # 设置 Redis 配置
58
+ redis-cli config set maxmemory 512mb
59
+ redis-cli config set maxmemory-policy allkeys-lru
60
+ echo ""
61
+ echo "Redis server started successfully"
62
+ echo ""
63
+ }
 
 
 
 
 
64
 
65
+ # 启动 Qdrant 服务
66
+ start_qdrant() {
67
+ echo "Starting Qdrant server..."
68
+
69
+ # 确保目录存在并有正确的权限
70
+ mkdir -p /home/pn/.n8n/qdrant/storage
71
+ mkdir -p /home/pn/.n8n/qdrant/config
72
+ mkdir -p /home/pn/.n8n/qdrant/snapshots
73
+ mkdir -p /home/pn/.n8n/qdrant/logs
74
+
75
+ # 设置正确的权限
76
+ chmod -R 755 /home/pn/.n8n/qdrant
77
+ chown -R pn:pn /home/pn/.n8n/qdrant
78
+
79
+ # 创建 Qdrant 配置文件
80
+ cat > /home/pn/.n8n/qdrant/config/config.yaml <<EOF
81
+ service:
82
+ host: 0.0.0.0
83
+ http_port: 6333
84
+ grpc_port: 6334
85
+ enable_cors: true
86
+ enable_tls: false
87
+ max_request_size_mb: 64
88
+ max_workers: 0
89
 
90
+ storage:
91
+ storage_path: /home/pn/.n8n/qdrant/storage
92
+ snapshots_path: /home/pn/.n8n/qdrant/snapshots
93
+ on_disk_payload: true
94
+
95
+ performance:
96
+ max_search_threads: 0
97
+ max_optimization_threads: 0
98
+
99
+ optimizers:
100
+ deleted_threshold: 0.2
101
+ vacuum_min_vector_number: 1000
102
+ default_segment_number: 0
103
+ max_segment_size_kb: null
104
+ indexing_threshold_kb: 20000
105
+ flush_interval_sec: 5
106
+
107
+ hnsw_index:
108
+ m: 16
109
+ ef_construct: 100
110
+ full_scan_threshold_kb: 10000
111
+ max_indexing_threads: 0
112
+ on_disk: false
113
 
114
+ logger:
115
+ on_disk:
116
+ enabled: true
117
+ log_file: /home/pn/.n8n/qdrant/logs/qdrant.log
118
+ log_level: INFO
 
119
 
120
+ telemetry_disabled: true
121
+ EOF
 
 
 
 
122
 
123
+ # 确保配置文件有正确的权限
124
+ chmod 644 /home/pn/.n8n/qdrant/config/config.yaml
125
+
126
+ # 使用配置文件启动 Qdrant
127
+ qdrant --config-path /home/pn/.n8n/qdrant/config/config.yaml > /home/pn/.n8n/qdrant/logs/startup.log 2>&1 &
128
+
129
+ # 等待 Qdrant 启动
130
+ local timeout=30
131
+ local end=$((SECONDS + timeout))
132
+
133
+ while [ $SECONDS -lt $end ]; do
134
+ if curl -s http://localhost:6333/health >/dev/null; then
135
+ echo "Qdrant server started successfully"
136
+
137
+ # 预创建常用集合
138
+ echo "Creating default collections..."
139
+
140
+ # 创建文本向量集合 (768维,适用于多数文本嵌入模型)
141
+ curl -X PUT 'http://localhost:6333/collections/text_vectors' \
142
+ -H 'Content-Type: application/json' \
143
+ -d '{
144
+ "vectors": {
145
+ "size": 768,
146
+ "distance": "Cosine",
147
+ "on_disk": true
148
+ },
149
+ "optimizers_config": {
150
+ "default_segment_number": 2,
151
+ "indexing_threshold": 20000,
152
+ "memmap_threshold": 10000
153
+ },
154
+ "hnsw_config": {
155
+ "m": 16,
156
+ "ef_construct": 100,
157
+ "full_scan_threshold": 10000,
158
+ "max_indexing_threads": 0,
159
+ "on_disk": true
160
+ },
161
+ "init_from": {
162
+ "collection_name": "text_vectors"
163
+ }
164
+ }'
165
+
166
+ # 创建图像向量集合 (512维,适用于多数图像嵌入模型)
167
+ curl -X PUT 'http://localhost:6333/collections/image_vectors' \
168
+ -H 'Content-Type: application/json' \
169
+ -d '{
170
+ "vectors": {
171
+ "size": 512,
172
+ "distance": "Cosine"
173
+ },
174
+ "optimizers_config": {
175
+ "default_segment_number": 2,
176
+ "indexing_threshold": 20000
177
+ },
178
+ "hnsw_config": {
179
+ "m": 16,
180
+ "ef_construct": 100,
181
+ "full_scan_threshold": 10000
182
+ }
183
+ }'
184
+
185
+ # 创建通用向量集合 (1536维,适用于 OpenAI 的嵌入模型)
186
+ curl -X PUT 'http://localhost:6333/collections/openai_vectors' \
187
+ -H 'Content-Type: application/json' \
188
+ -d '{
189
+ "vectors": {
190
+ "size": 1536,
191
+ "distance": "Cosine"
192
+ },
193
+ "optimizers_config": {
194
+ "default_segment_number": 2,
195
+ "indexing_threshold": 20000
196
+ },
197
+ "hnsw_config": {
198
+ "m": 16,
199
+ "ef_construct": 100,
200
+ "full_scan_threshold": 10000
201
+ }
202
+ }'
203
+
204
+ # 验证集合创建状态并输出详细信息
205
+ echo -e "\nVerifying collections:"
206
+ curl -s 'http://localhost:6333/collections' | jq '.'
207
+
208
+ # 测试连接
209
+ echo -e "\nTesting Qdrant connection:"
210
+ curl -v http://localhost:6333/health
211
+
212
+ return 0
213
+ fi
214
+ echo "Waiting for Qdrant to start..."
215
+ sleep 1
216
+
217
+ # 检查是否有错误日志
218
+ if grep -i "error" /home/pn/.n8n/qdrant/logs/startup.log >/dev/null 2>&1; then
219
+ echo "Error found in Qdrant logs:"
220
+ tail -n 10 /home/pn/.n8n/qdrant/logs/startup.log
221
+ fi
222
+ done
223
+
224
+ echo "Failed to start Qdrant server"
225
+ echo "Last 10 lines of Qdrant log:"
226
+ tail -n 10 /home/pn/.n8n/qdrant/logs/startup.log
227
+ exit 1
228
+ }
229
 
230
+ # 检查服务状态
231
+ check_services() {
232
+ echo "检查服务状态..."
233
+
234
+ # 检查 Redis
235
+ echo "Redis 状态:"
236
+ redis-cli info | grep 'used_memory\|connected_clients\|total_connections_received'
237
+
238
+ # 检查 Qdrant
239
+ echo "Qdrant 状态:"
240
+ if curl -s http://localhost:6333/metrics >/dev/null; then
241
+ echo "Qdrant 运行正常"
242
+ curl -s http://localhost:6333/metrics
243
+
244
+ # 显示���合信息
245
+ echo "Qdrant 集合列表:"
246
+ curl -s http://localhost:6333/collections
247
+ else
248
+ echo "Qdrant 服务异常"
249
+ tail -n 10 /home/pn/.n8n/qdrant/qdrant.log
250
+ fi
251
+ }
252
 
253
+ # 主流程
254
+ main() {
255
+ current_time=$(date +"%Y-%m-%d %H:%M:%S")
256
+ echo "Starting services at $current_time"
257
+
258
+ # 输出配置信息
259
+ echo "Database Configuration:"
260
+ echo "Host: ${DB_POSTGRESDB_HOST}"
261
+ echo "Port: ${DB_POSTGRESDB_PORT}"
262
+ echo "User: ${DB_POSTGRESDB_USER}"
263
+ echo "Database: ${DB_POSTGRESDB_DATABASE}"
264
+ echo "Type: ${DB_TYPE}"
265
+
266
+ # 启动服务
267
+ wait_for_service "PostgreSQL" "${DB_POSTGRESDB_HOST}" "${DB_POSTGRESDB_PORT}"
268
+ echo ""
269
+ start_redis
270
+ echo ""
271
+ start_qdrant
272
+ echo ""
273
+ check_services
274
+
275
+ # 设置 N8N 环境变量
276
+ source /home/pn/n8n/config/n8n_env.sh
277
+
278
+ echo ""
279
+ echo "Starting n8n..."
280
+ # --- 最终修复:使用新的 n8n 启动命令 ---
281
+ exec n8n
282
+ }
283
 
284
+ # 执行主流程
285
+ main "$@"