seekwe commited on
Commit
96cfbc5
·
1 Parent(s): a926f59

添加Docker容器化配置及Qdrant向量数据库支持

Browse files
Files changed (5) hide show
  1. .cnb.yml +15 -0
  2. Dockerfile +110 -0
  3. README.md +3 -3
  4. config/n8n_env.sh +9 -0
  5. run.sh +280 -0
.cnb.yml ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ include:
2
+ - https://cnb.cool/zls-tools/vm/-/blob/main/go-1.24/ide.yml
3
+ - https://cnb.cool/zls-tools/vm/-/blob/main/tools/sync-github-73zls.yml
4
+ - https://cnb.cool/zls-tools/vm/-/blob/main/tools/sync-hf.yml
5
+ # ssh 操作
6
+ # - https://cnb.cool/zls-tools/vm/-/blob/main/tools/ssh-stages.yml
7
+
8
+
9
+ $:
10
+ push:
11
+ sync_hf:
12
+ runner:
13
+ cpus: 2
14
+ env:
15
+ GIT_REPO: 888
Dockerfile ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 使用 PostgreSQL 作为基础镜像
2
+ FROM nikolaik/python-nodejs:python3.12-nodejs20
3
+
4
+ # 添加维护者信息
5
+ LABEL maintainer="ai来事 <https://www.youtube.com/@all.ai.>"
6
+
7
+ ARG CACHEBUST=236
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
+ # 安装系统依赖
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
+ && ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
55
+ && dpkg-reconfigure --frontend noninteractive tzdata \
56
+ # 下载并安装预编译的 Qdrant
57
+ && cd /tmp \
58
+ && curl -L https://github.com/qdrant/qdrant/releases/download/v${QDRANT_VERSION}/qdrant-x86_64-unknown-linux-gnu.tar.gz -o qdrant.tar.gz \
59
+ && tar xvf qdrant.tar.gz \
60
+ && mv qdrant /usr/local/bin/ \
61
+ && rm qdrant.tar.gz \
62
+ # 创建 Qdrant 配置目录和数据目录
63
+ && mkdir -p /home/pn/.n8n/qdrant/storage \
64
+ && mkdir -p /home/pn/.n8n/qdrant/config \
65
+ && mkdir -p /home/pn/.n8n/qdrant/snapshots \
66
+ && chown -R pn:pn /home/pn/.n8n/qdrant \
67
+ && chmod -R 755 /home/pn/.n8n/qdrant \
68
+ # 清理
69
+ && apt-get clean \
70
+ && rm -rf /var/lib/apt/lists/* \
71
+ # 创建虚拟环境并安装 Python 依赖
72
+ && python3 -m venv $VIRTUAL_ENV \
73
+ && $VIRTUAL_ENV/bin/pip install --no-cache-dir --upgrade pip requests yt-dlp \
74
+ # 安装 n8n
75
+ && npm install -g n8n@latest pnpm \
76
+ && npm cache clean --force
77
+
78
+ # 创建环境变量文件
79
+ RUN --mount=type=secret,id=POSTGRES_USER,mode=0444,required=true \
80
+ --mount=type=secret,id=POSTGRES_PASSWORD,mode=0444,required=true \
81
+ --mount=type=secret,id=POSTGRES_DB,mode=0444,required=true \
82
+ --mount=type=secret,id=POSTGRESDB_HOST,mode=0444,required=true \
83
+ echo "export DB_POSTGRESDB_HOST=$(cat /run/secrets/POSTGRESDB_HOST)" >> /home/pn/.env && \
84
+ echo "export DB_POSTGRESDB_USER=$(cat /run/secrets/POSTGRES_USER)" >> /home/pn/.env && \
85
+ echo "export DB_POSTGRESDB_PASSWORD=$(cat /run/secrets/POSTGRES_PASSWORD)" >> /home/pn/.env && \
86
+ echo "export DB_POSTGRESDB_DATABASE=$(cat /run/secrets/POSTGRES_DB)" >> /home/pn/.env && \
87
+ chown pn:pn /home/pn/.env
88
+
89
+ # 创建工作目录
90
+ WORKDIR /home/pn/n8n
91
+
92
+ # 复制启动脚本并创建数据目录
93
+ COPY --chown=pn:pn run.sh ./run.sh
94
+ COPY --chown=pn:pn config/n8n_env.sh ./config/n8n_env.sh
95
+ RUN chmod +x ./run.sh \
96
+ && mkdir -p /home/pn/.n8n \
97
+ && chown -R pn:pn /home/pn/.n8n \
98
+ && chown -R pn:pn /home/pn/n8n
99
+
100
+ # 暴露端口
101
+ EXPOSE 7860
102
+
103
+ # 切换到非 root 用户
104
+ USER pn
105
+
106
+ # 设置数据卷
107
+ VOLUME ["/home/pn/.n8n"]
108
+
109
+ # 启动命令
110
+ CMD ["./run.sh"]
README.md CHANGED
@@ -1,10 +1,10 @@
1
  ---
2
- title: Ain8n
3
- emoji: ⚡
4
  colorFrom: green
5
  colorTo: pink
6
  sdk: docker
7
  pinned: false
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: Test
3
+ emoji: ⚡⚡⚡
4
  colorFrom: green
5
  colorTo: pink
6
  sdk: docker
7
  pinned: false
8
  ---
9
 
10
+
config/n8n_env.sh ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # N8N 基础配置
4
+ export N8N_ENCRYPTION_KEY="${N8N_ENCRYPTION_KEY:-n8n8n8n}"
5
+
6
+ # N8N 功能配置
7
+ export N8N_RUNNERS_ENABLED=false
8
+ export N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
9
+ export N8N_RUNNERS_ENABLED=true
run.sh ADDED
@@ -0,0 +1,280 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 服务
44
+ start_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
+ echo ""
57
+ echo "Redis server started successfully"
58
+ echo ""
59
+ }
60
+
61
+ # 启动 Qdrant 服务
62
+ start_qdrant() {
63
+ echo "Starting Qdrant server..."
64
+
65
+ # 确保目录存在并有正确的权限
66
+ mkdir -p /home/pn/.n8n/qdrant/storage
67
+ mkdir -p /home/pn/.n8n/qdrant/config
68
+ mkdir -p /home/pn/.n8n/qdrant/snapshots
69
+ mkdir -p /home/pn/.n8n/qdrant/logs
70
+
71
+ # 设置正确的权限
72
+ chmod -R 755 /home/pn/.n8n/qdrant
73
+ chown -R pn:pn /home/pn/.n8n/qdrant
74
+
75
+ # 创建 Qdrant 配置文件
76
+ cat > /home/pn/.n8n/qdrant/config/config.yaml <<EOF
77
+ service:
78
+ host: 0.0.0.0
79
+ http_port: 6333
80
+ grpc_port: 6334
81
+ enable_cors: true
82
+ enable_tls: false
83
+ max_request_size_mb: 64
84
+ max_workers: 0
85
+
86
+ storage:
87
+ storage_path: /home/pn/.n8n/qdrant/storage
88
+ snapshots_path: /home/pn/.n8n/qdrant/snapshots
89
+ on_disk_payload: true
90
+
91
+ performance:
92
+ max_search_threads: 0
93
+ max_optimization_threads: 0
94
+
95
+ optimizers:
96
+ deleted_threshold: 0.2
97
+ vacuum_min_vector_number: 1000
98
+ default_segment_number: 0
99
+ max_segment_size_kb: null
100
+ indexing_threshold_kb: 20000
101
+ flush_interval_sec: 5
102
+
103
+ hnsw_index:
104
+ m: 16
105
+ ef_construct: 100
106
+ full_scan_threshold_kb: 10000
107
+ max_indexing_threads: 0
108
+ on_disk: false
109
+
110
+ logger:
111
+ on_disk:
112
+ enabled: true
113
+ log_file: /home/pn/.n8n/qdrant/logs/qdrant.log
114
+ log_level: INFO
115
+
116
+ telemetry_disabled: true
117
+ EOF
118
+
119
+ # 确保配置文件有正确的权限
120
+ chmod 644 /home/pn/.n8n/qdrant/config/config.yaml
121
+
122
+ # 使用配置文件启动 Qdrant
123
+ qdrant --config-path /home/pn/.n8n/qdrant/config/config.yaml > /home/pn/.n8n/qdrant/logs/startup.log 2>&1 &
124
+
125
+ # 等待 Qdrant 启动
126
+ local timeout=30
127
+ local end=$((SECONDS + timeout))
128
+
129
+ while [ $SECONDS -lt $end ]; do
130
+ if curl -s http://localhost:6333/health >/dev/null; then
131
+ echo "Qdrant server started successfully"
132
+
133
+ # 预创建常用集合
134
+ echo "Creating default collections..."
135
+
136
+ # 创建文本向量集合 (768维,适用于多数文本嵌入模型)
137
+ curl -X PUT 'http://localhost:6333/collections/text_vectors' \
138
+ -H 'Content-Type: application/json' \
139
+ -d '{
140
+ "vectors": {
141
+ "size": 768,
142
+ "distance": "Cosine",
143
+ "on_disk": true
144
+ },
145
+ "optimizers_config": {
146
+ "default_segment_number": 2,
147
+ "indexing_threshold": 20000,
148
+ "memmap_threshold": 10000
149
+ },
150
+ "hnsw_config": {
151
+ "m": 16,
152
+ "ef_construct": 100,
153
+ "full_scan_threshold": 10000,
154
+ "max_indexing_threads": 0,
155
+ "on_disk": true
156
+ },
157
+ "init_from": {
158
+ "collection_name": "text_vectors"
159
+ }
160
+ }'
161
+
162
+ # 创建图像向量集合 (512维,适用于多数图像嵌入模型)
163
+ curl -X PUT 'http://localhost:6333/collections/image_vectors' \
164
+ -H 'Content-Type: application/json' \
165
+ -d '{
166
+ "vectors": {
167
+ "size": 512,
168
+ "distance": "Cosine"
169
+ },
170
+ "optimizers_config": {
171
+ "default_segment_number": 2,
172
+ "indexing_threshold": 20000
173
+ },
174
+ "hnsw_config": {
175
+ "m": 16,
176
+ "ef_construct": 100,
177
+ "full_scan_threshold": 10000
178
+ }
179
+ }'
180
+
181
+ # 创建通用向量集合 (1536维,适用于 OpenAI 的嵌入模型)
182
+ curl -X PUT 'http://localhost:6333/collections/openai_vectors' \
183
+ -H 'Content-Type: application/json' \
184
+ -d '{
185
+ "vectors": {
186
+ "size": 1536,
187
+ "distance": "Cosine"
188
+ },
189
+ "optimizers_config": {
190
+ "default_segment_number": 2,
191
+ "indexing_threshold": 20000
192
+ },
193
+ "hnsw_config": {
194
+ "m": 16,
195
+ "ef_construct": 100,
196
+ "full_scan_threshold": 10000
197
+ }
198
+ }'
199
+
200
+ # 验证集合创建状态并输出详细信息
201
+ echo -e "\nVerifying collections:"
202
+ curl -s 'http://localhost:6333/collections' | jq '.'
203
+
204
+ # 测试连接
205
+ echo -e "\nTesting Qdrant connection:"
206
+ curl -v http://localhost:6333/health
207
+
208
+ return 0
209
+ fi
210
+ echo "Waiting for Qdrant to start..."
211
+ sleep 1
212
+
213
+ # 检查是否有错误日志
214
+ if grep -i "error" /home/pn/.n8n/qdrant/logs/startup.log >/dev/null 2>&1; then
215
+ echo "Error found in Qdrant logs:"
216
+ tail -n 10 /home/pn/.n8n/qdrant/logs/startup.log
217
+ fi
218
+ done
219
+
220
+ echo "Failed to start Qdrant server"
221
+ echo "Last 10 lines of Qdrant log:"
222
+ tail -n 10 /home/pn/.n8n/qdrant/logs/startup.log
223
+ exit 1
224
+ }
225
+
226
+ # 检查服务状态
227
+ check_services() {
228
+ echo "检查服务状态..."
229
+
230
+ # 检查 Redis
231
+ echo "Redis 状态:"
232
+ redis-cli info | grep 'used_memory\|connected_clients\|total_connections_received'
233
+
234
+ # 检查 Qdrant
235
+ echo "Qdrant 状态:"
236
+ if curl -s http://localhost:6333/metrics >/dev/null; then
237
+ echo "Qdrant 运行正常"
238
+ curl -s http://localhost:6333/metrics
239
+
240
+ # 显示集合信息
241
+ echo "Qdrant 集合列表:"
242
+ curl -s http://localhost:6333/collections
243
+ else
244
+ echo "Qdrant 服务异常"
245
+ tail -n 10 /home/pn/.n8n/qdrant/qdrant.log
246
+ fi
247
+ }
248
+
249
+ # 主流程
250
+ main() {
251
+ current_time=$(date +"%Y-%m-%d %H:%M:%S")
252
+ echo "Starting services at $current_time"
253
+
254
+ # 输出配置信息
255
+ echo "Database Configuration:"
256
+ echo "Host: ${DB_POSTGRESDB_HOST}"
257
+ echo "Port: ${DB_POSTGRESDB_PORT}"
258
+ echo "User: ${DB_POSTGRESDB_USER}"
259
+ echo "Database: ${DB_POSTGRESDB_DATABASE}"
260
+ echo "Type: ${DB_TYPE}"
261
+
262
+ # 启动服务
263
+ wait_for_service "PostgreSQL" "${DB_POSTGRESDB_HOST}" "${DB_POSTGRESDB_PORT}"
264
+ echo ""
265
+ start_redis
266
+ echo ""
267
+ start_qdrant
268
+ echo ""
269
+ check_services
270
+
271
+ # 设置 N8N 环境变量
272
+ source /home/pn/n8n/config/n8n_env.sh
273
+
274
+ echo ""
275
+ echo "Starting n8n..."
276
+ exec n8n start
277
+ }
278
+
279
+ # 执行主流程
280
+ main "$@"