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

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +107 -272
Dockerfile CHANGED
@@ -1,285 +1,120 @@
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 "$@"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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"]