gcodec/ain8n
0
1#!/bin/bash2set -eo pipefail3 4# 导入环境变量5source /home/pn/.env6 7# 错误处理函数8handle_error() {9 echo "错误发生在第 $1 行"10 exit 111}12trap 'handle_error $LINENO' ERR13 14# 超时处理函数15timeout_handler() {16 echo "操作超时"17 exit 118}19 20# 等待服务就绪的通用函数21wait_for_service() {22 local service=$123 local host=$224 local port=$325 local timeout=${4:-$WAIT_TIMEOUT}26 27 echo "等待 $service 就绪..."28 local end=$((SECONDS + timeout))29 30 while [ $SECONDS -lt $end ]; do31 if nc -z "$host" "$port" >/dev/null 2>&1; then32 echo "$service 已就绪"33 return 034 fi35 echo "尝试连接 $service at $host:$port..."36 sleep 137 done38 39 echo "$service 启动超时"40 exit 141}42 43# 启动 Redis 服务44start_redis() {45 echo "Starting Redis server..."46 redis-server --daemonize yes47 sleep 148 if ! redis-cli ping > /dev/null 2>&1; then49 echo "Failed to start Redis server"50 exit 151 fi52 53 # 设置 Redis 配置54 redis-cli config set maxmemory 512mb55 redis-cli config set maxmemory-policy allkeys-lru56 echo ""57 echo "Redis server started successfully"58 echo ""59}60 61# 启动 Qdrant 服务62start_qdrant() {63 echo "Starting Qdrant server..."64 65 # 确保目录存在并有正确的权限66 mkdir -p /home/pn/.n8n/qdrant/storage67 mkdir -p /home/pn/.n8n/qdrant/config68 mkdir -p /home/pn/.n8n/qdrant/snapshots69 mkdir -p /home/pn/.n8n/qdrant/logs70 71 # 设置正确的权限72 chmod -R 755 /home/pn/.n8n/qdrant73 chown -R pn:pn /home/pn/.n8n/qdrant74 75 # 创建 Qdrant 配置文件76 cat > /home/pn/.n8n/qdrant/config/config.yaml <<EOF77service:78 host: 0.0.0.079 http_port: 633380 grpc_port: 633481 enable_cors: true82 enable_tls: false83 max_request_size_mb: 6484 max_workers: 085 86storage:87 storage_path: /home/pn/.n8n/qdrant/storage88 snapshots_path: /home/pn/.n8n/qdrant/snapshots89 on_disk_payload: true90 91 performance:92 max_search_threads: 093 max_optimization_threads: 094 95 optimizers:96 deleted_threshold: 0.297 vacuum_min_vector_number: 100098 default_segment_number: 099 max_segment_size_kb: null100 indexing_threshold_kb: 20000101 flush_interval_sec: 5102 103 hnsw_index:104 m: 16105 ef_construct: 100106 full_scan_threshold_kb: 10000107 max_indexing_threads: 0108 on_disk: false109 110logger:111 on_disk:112 enabled: true113 log_file: /home/pn/.n8n/qdrant/logs/qdrant.log114 log_level: INFO115 116telemetry_disabled: true117EOF118 119 # 确保配置文件有正确的权限120 chmod 644 /home/pn/.n8n/qdrant/config/config.yaml121 122 # 使用配置文件启动 Qdrant123 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=30127 local end=$((SECONDS + timeout))128 129 while [ $SECONDS -lt $end ]; do130 if curl -s http://localhost:6333/health >/dev/null; then131 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": true144 },145 "optimizers_config": {146 "default_segment_number": 2,147 "indexing_threshold": 20000,148 "memmap_threshold": 10000149 },150 "hnsw_config": {151 "m": 16,152 "ef_construct": 100,153 "full_scan_threshold": 10000,154 "max_indexing_threads": 0,155 "on_disk": true156 },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": 20000173 },174 "hnsw_config": {175 "m": 16,176 "ef_construct": 100,177 "full_scan_threshold": 10000178 }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": 20000192 },193 "hnsw_config": {194 "m": 16,195 "ef_construct": 100,196 "full_scan_threshold": 10000197 }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/health207 208 return 0209 fi210 echo "Waiting for Qdrant to start..."211 sleep 1212 213 # 检查是否有错误日志214 if grep -i "error" /home/pn/.n8n/qdrant/logs/startup.log >/dev/null 2>&1; then215 echo "Error found in Qdrant logs:"216 tail -n 10 /home/pn/.n8n/qdrant/logs/startup.log217 fi218 done219 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.log223 exit 1224}225 226# 检查服务状态227check_services() {228 echo "检查服务状态..."229 230 # 检查 Redis231 echo "Redis 状态:"232 redis-cli info | grep 'used_memory\|connected_clients\|total_connections_received'233 234 # 检查 Qdrant235 echo "Qdrant 状态:"236 if curl -s http://localhost:6333/metrics >/dev/null; then237 echo "Qdrant 运行正常"238 curl -s http://localhost:6333/metrics239 240 # 显示集合信息241 echo "Qdrant 集合列表:"242 curl -s http://localhost:6333/collections243 else244 echo "Qdrant 服务异常"245 tail -n 10 /home/pn/.n8n/qdrant/qdrant.log246 fi247}248 249# 主流程250main() {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_redis266 echo ""267 start_qdrant268 echo ""269 check_services270 271 # 设置 N8N 环境变量272 source /home/pn/n8n/config/n8n_env.sh273 274 echo ""275 echo "Starting n8n..."276 exec n8n start277}278 279# 执行主流程280main "$@"281 