dukemike commited on
Commit
fd31874
·
verified ·
1 Parent(s): 92cd2dc

Upload 4 files

Browse files
Files changed (4) hide show
  1. .gitattributes +35 -35
  2. Dockerfile +110 -2
  3. README.md +11 -10
  4. run.sh +280 -0
.gitattributes CHANGED
@@ -1,35 +1,35 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
Dockerfile CHANGED
@@ -1,2 +1,110 @@
1
- FROM docker.n8n.io/n8nio/n8n:latest
2
- EXPOSE 5678
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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=12
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,11 @@
1
- ---
2
- title: N8n
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: ai + n8n
3
+ emoji: ⚡⚡⚡
4
+ colorFrom: green
5
+ colorTo: pink
6
+ sdk: docker
7
+ pinned: false
8
+ ---
9
+
10
+
11
+
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 "$@"