| #!/bin/bash |
| set -eo pipefail |
|
|
| |
| |
|
|
| |
| handle_error() { |
| echo "Error Line $1" |
| exit 1 |
| } |
| trap 'handle_error $LINENO' ERR |
|
|
| |
| timeout_handler() { |
| echo "Timeout" |
| exit 1 |
| } |
|
|
| |
| wait_for_service() { |
| local service=$1 |
| local host=$2 |
| local port=$3 |
| local timeout=${4:-$WAIT_TIMEOUT} |
| |
| echo "Waiting for $service to be ready..." |
| local end=$((SECONDS + timeout)) |
| |
| while [ $SECONDS -lt $end ]; do |
| if nc -z "$host" "$port" >/dev/null 2>&1; then |
| echo "$service is ready" |
| return 0 |
| fi |
| echo "Trying to connect to $service at $host:$port..." |
| sleep 1 |
| done |
| |
| echo "$service startup timed out" |
| exit 1 |
| } |
|
|
| |
| start_qdrant() { |
| echo "Starting Qdrant server..." |
| |
| |
| echo "Create Qdrant folder" |
| 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 |
| |
| |
| echo "Create Qdrant config" |
| cat > /home/pn/.n8n/qdrant/config/config.yaml <<EOF |
| service: |
| host: 0.0.0.0 |
| http_port: 6333 |
| grpc_port: 6334 |
| enable_cors: true |
| enable_tls: false |
| max_request_size_mb: 64 |
| max_workers: 0 |
| storage: |
| storage_path: /home/pn/.n8n/qdrant/storage |
| snapshots_path: /home/pn/.n8n/qdrant/snapshots |
| on_disk_payload: true |
| |
| performance: |
| max_search_threads: 0 |
| max_optimization_threads: 0 |
| |
| optimizers: |
| deleted_threshold: 0.2 |
| vacuum_min_vector_number: 1000 |
| default_segment_number: 0 |
| max_segment_size_kb: null |
| indexing_threshold_kb: 20000 |
| flush_interval_sec: 5 |
| |
| hnsw_index: |
| m: 16 |
| ef_construct: 100 |
| full_scan_threshold_kb: 10000 |
| max_indexing_threads: 0 |
| on_disk: false |
| logger: |
| on_disk: |
| enabled: true |
| log_file: /home/pn/.n8n/qdrant/logs/qdrant.log |
| log_level: INFO |
| telemetry_disabled: true |
| EOF |
|
|
| |
| chmod 644 /home/pn/.n8n/qdrant/config/config.yaml |
| |
| |
| echo "Start Qdrant..." |
| qdrant --config-path /home/pn/.n8n/qdrant/config/config.yaml > /home/pn/.n8n/qdrant/logs/startup.log 2>&1 & |
| |
| |
| 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 "Creating default collections..." |
| |
| |
| curl -X PUT 'http://localhost:6333/collections/text_vectors' \ |
| -H 'Content-Type: application/json' \ |
| -d '{ |
| "vectors": { |
| "size": 1024, |
| "distance": "Cosine", |
| "on_disk": true |
| }, |
| "optimizers_config": { |
| "default_segment_number": 2, |
| "indexing_threshold": 20000, |
| "memmap_threshold": 10000 |
| }, |
| "hnsw_config": { |
| "m": 16, |
| "ef_construct": 100, |
| "full_scan_threshold": 10000, |
| "max_indexing_threads": 0, |
| "on_disk": true |
| } |
| }' |
| |
| |
| 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 |
| } |
| }' |
| |
| |
| 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' | jq '.' |
| |
| |
| echo -e "\nTesting Qdrant connection:" |
| curl -v http://localhost:6333/health |
| |
| 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 "Checking service status..." |
| |
| |
| echo "Qdrant status:" |
| if curl -s http://localhost:6333/metrics >/dev/null; then |
| echo "Qdrant is running normally" |
| curl -s http://localhost:6333/metrics |
| |
| |
| echo "Qdrant collection list:" |
| curl -s http://localhost:6333/collections |
| else |
| echo "Qdrant service is abnormal" |
| 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" |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| start_qdrant |
| echo "" |
| check_services |
| |
| |
| source /home/pn/n8n/config/n8n_env.sh |
| |
| echo "" |
| echo "Starting n8n..." |
| exec n8n start |
| } |
|
|
| |
| main "$@" |
|
|