| | #!/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 |
| | } |
| |
|
| | |
| | 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-cli config set maxmemory 512mb |
| | redis-cli config set maxmemory-policy allkeys-lru |
| | echo "" |
| | echo "Redis server started successfully" |
| | echo "" |
| | } |
| |
|
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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": 768, |
| | "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 |
| | }, |
| | "init_from": { |
| | "collection_name": "text_vectors" |
| | } |
| | }' |
| | |
| | |
| | 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 "检查服务状态..." |
| | |
| | |
| | echo "Redis 状态:" |
| | redis-cli info | grep 'used_memory\|connected_clients\|total_connections_received' |
| | |
| | |
| | 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 |
| | |
| | |
| | source /home/pn/n8n/config/n8n_env.sh |
| | |
| | echo "" |
| | echo "Starting n8n..." |
| | exec n8n start |
| | } |
| |
|
| | |
| | main "$@" |
| |
|