#!/bin/bash set -eo pipefail # 导入环境变量 source /home/pn/.env # 错误处理函数 handle_error() { echo "错误发生在第 $1 行" exit 1 } trap 'handle_error $LINENO' ERR # 超时处理函数 timeout_handler() { echo "操作超时" exit 1 } # 等待服务就绪的通用函数 wait_for_service() { local service=$1 local host=$2 local port=$3 local timeout=${4:-$WAIT_TIMEOUT} echo "等待 $service 就绪..." local end=$((SECONDS + timeout)) while [ $SECONDS -lt $end ]; do if nc -z "$host" "$port" >/dev/null 2>&1; then echo "$service 已就绪" return 0 fi echo "尝试连接 $service at $host:$port..." sleep 1 done echo "$service 启动超时" exit 1 } # 启动 Redis 服务 start_redis() { echo "Starting Redis server..." redis-server --daemonize yes sleep 1 if ! redis-cli ping > /dev/null 2>&1; then echo "Failed to start Redis server" exit 1 fi # 设置 Redis 配置 redis-cli config set maxmemory 512mb redis-cli config set maxmemory-policy allkeys-lru echo "" echo "Redis server started successfully" echo "" } # 启动 Qdrant 服务 start_qdrant() { echo "Starting Qdrant server..." # 确保目录存在并有正确的权限 mkdir -p /home/pn/.n8n/qdrant/storage mkdir -p /home/pn/.n8n/qdrant/config mkdir -p /home/pn/.n8n/qdrant/snapshots mkdir -p /home/pn/.n8n/qdrant/logs # 设置正确的权限 chmod -R 755 /home/pn/.n8n/qdrant chown -R pn:pn /home/pn/.n8n/qdrant # 创建 Qdrant 配置文件 cat > /home/pn/.n8n/qdrant/config/config.yaml < /home/pn/.n8n/qdrant/logs/startup.log 2>&1 & # 等待 Qdrant 启动 local timeout=30 local end=$((SECONDS + timeout)) while [ $SECONDS -lt $end ]; do if curl -s http://localhost:6333/health >/dev/null; then echo "Qdrant server started successfully" # 输出版本和状态信息 echo "Qdrant version:" curl -s http://localhost:6333/version # 预创建常用集合 echo "Creating default collections..." # 创建文本向量集合 (768维,适用于多数文本嵌入模型) curl -X PUT 'http://localhost:6333/collections/text_vectors' \ -H 'Content-Type: application/json' \ -d '{ "vectors": { "size": 768, "distance": "Cosine" }, "optimizers_config": { "default_segment_number": 2, "indexing_threshold": 20000 }, "hnsw_config": { "m": 16, "ef_construct": 100, "full_scan_threshold": 10000 } }' # 创建图像向量集合 (512维,适用于多数图像嵌入模型) curl -X PUT 'http://localhost:6333/collections/image_vectors' \ -H 'Content-Type: application/json' \ -d '{ "vectors": { "size": 512, "distance": "Cosine" }, "optimizers_config": { "default_segment_number": 2, "indexing_threshold": 20000 }, "hnsw_config": { "m": 16, "ef_construct": 100, "full_scan_threshold": 10000 } }' # 创建通用向量集合 (1536维,适用于 OpenAI 的嵌入模型) curl -X PUT 'http://localhost:6333/collections/openai_vectors' \ -H 'Content-Type: application/json' \ -d '{ "vectors": { "size": 1536, "distance": "Cosine" }, "optimizers_config": { "default_segment_number": 2, "indexing_threshold": 20000 }, "hnsw_config": { "m": 16, "ef_construct": 100, "full_scan_threshold": 10000 } }' # 验证集合创建状态 echo -e "\nVerifying collections:" curl -s http://localhost:6333/collections return 0 fi echo "Waiting for Qdrant to start..." sleep 1 # 检查是否有错误日志 if grep -i "error" /home/pn/.n8n/qdrant/logs/startup.log >/dev/null 2>&1; then echo "Error found in Qdrant logs:" tail -n 10 /home/pn/.n8n/qdrant/logs/startup.log fi done echo "Failed to start Qdrant server" echo "Last 10 lines of Qdrant log:" tail -n 10 /home/pn/.n8n/qdrant/logs/startup.log exit 1 } # 检查服务状态 check_services() { echo "检查服务状态..." # 检查 Redis echo "Redis 状态:" redis-cli info | grep 'used_memory\|connected_clients\|total_connections_received' # 检查 Qdrant echo "Qdrant 状态:" if curl -s http://localhost:6333/metrics >/dev/null; then echo "Qdrant 运行正常" curl -s http://localhost:6333/metrics # 显示集合信息 echo "Qdrant 集合列表:" curl -s http://localhost:6333/collections else echo "Qdrant 服务异常" tail -n 10 /home/pn/.n8n/qdrant/qdrant.log fi } # 主流程 main() { current_time=$(date +"%Y-%m-%d %H:%M:%S") echo "Starting services at $current_time" # 输出配置信息 echo "Database Configuration:" echo "Host: ${DB_POSTGRESDB_HOST}" echo "Port: ${DB_POSTGRESDB_PORT}" echo "User: ${DB_POSTGRESDB_USER}" echo "Database: ${DB_POSTGRESDB_DATABASE}" echo "Type: ${DB_TYPE}" # 启动服务 wait_for_service "PostgreSQL" "${DB_POSTGRESDB_HOST}" "${DB_POSTGRESDB_PORT}" echo "" start_redis echo "" start_qdrant echo "" check_services # 设置 N8N 环境变量 source /home/pn/n8n/config/n8n_env.sh echo "" echo "Starting n8n..." exec n8n start } # 执行主流程 main "$@"