Server Configuration
LocalVectorDB Server supports comprehensive configuration management for production deployments, including security, performance tuning, and operational considerations.
Configuration Files
Supported Formats
LocalVectorDB supports multiple configuration formats:
TOML (recommended): Human-readable, supports comments
JSON: Machine-readable, no comments
Configuration File Locations
Configuration files are loaded in order of precedence:
Explicit path:
--config /path/to/.lvdb-config.tomlEnvironment variable:
LVDB_SERVER_CONFIGCurrent directory:
./.lvdb-config.tomlInstance directory:
./instance/.lvdb-config.tomlHome directory:
~/localvectordb_server/.lvdb-config.toml
Creating Configuration
# Create default configuration
lvdb config init --format toml
# Create with predefined schema
lvdb config init --schema research_papers --output research.toml
Configuration Sections
For a complete overview of the configuration settings, see the Configuration Parameters Documentation.
Database Configuration
[database]
root_dir = "./.lvdb"
timeout = 300
connection_pool_size = 10
enable_gpu = false
enable_fts = true
chunk_size = 500
chunk_overlap = 1
chunking_method = "lines"
# Faiss index parameters (optional, for advanced users only)
faiss_index_type = "IndexFlatL2"
# faiss_index_hnsw_flat_neighbors = 16
# faiss_index_lsh_bits = 1536
Embedding Configuration
[embedding]
# Primary embedding provider
provider = "ollama" # ollama, openai
model = "nomic-embed-text" # Model name
base_url = "http://localhost:11434" # Provider-specific URL
api_key = "api-key-here" # API key for cloud providers
batch_size = 64 # Batch size for embedding generation
timeout = 30 # Request timeout in seconds
max_retries = 3 # Number of retry attempts
# Provider-specific configuration
[embedding.config]
# Custom provider settings go here
Server Configuration
[server]
# Basic server settings
host = "127.0.0.1" # Interface to bind to
port = 8000 # Port to listen on
log_level = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL
log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
# Performance settings
max_request_size = 104857600 # 100MB max request size
Security Configuration
[server.security]
# API-key authentication
require_api_key = false
key_database_path = "path/to/key/store.db" # Provide a path for the key store database, otherwise it will be in the database `root_dir`
api_key_header = "Authorization" # Optionally use a different header for the api key
auto_prune_expired_keys = false
key_audit_logging = true
auth_log_level = "INFO"
warn_expiring_days = 7
# CORS settings for web applications
cors_enabled = true
cors_allowed_origins = [
"https://myapp.example.com",
"https://admin.example.com"
]
cors_allowed_methods = ["GET", "POST", "PUT", "DELETE", "OPTIONS"]
cors_allowed_headers = ["Content-Type", "Authorization"]
cors_max_age = 86400
Extraction Configuration
Controls how uploaded files are converted to text (via all2md). Defaults are hardened for untrusted uploads; relax them only for trusted content. See File Extraction System for the full security model.
[extraction]
allow_remote_fetch = false # Fetch remote assets referenced by a document (SSRF risk)
allowed_hosts = [] # Host allowlist applied when allow_remote_fetch = true
strip_dangerous_elements = true # HTML: strip scripts and event handlers
attachment_mode = "skip" # How embedded attachments/assets are handled
Environment Variables
All configuration options can be overridden with environment variables using the LVDB_ prefix:
# Database settings
export LVDB_DATABASE_ROOT_DIR="/data/vector_databases"
export LVDB_DATABASE_TIMEOUT=600
export LVDB_DATABASE_ENABLE_GPU=true
# Embedding settings
export LVDB_EMBEDDING_PROVIDER="openai"
export LVDB_EMBEDDING_MODEL="text-embedding-3-small"
export LVDB_EMBEDDING_API_KEY="your_openai_key"
# Server settings
export LVDB_SERVER_HOST="0.0.0.0"
export LVDB_SERVER_PORT=8080
export LVDB_SERVER_LOG_LEVEL="DEBUG"
# Security settings
export LVDB_SERVER_REQUIRE_API_KEY=true
# Extraction settings
export LVDB_EXTRACTION_ALLOW_REMOTE_FETCH=false
export LVDB_EXTRACTION_STRIP_DANGEROUS_ELEMENTS=true
export LVDB_EXTRACTION_ATTACHMENT_MODE="skip"
# Start server with environment overrides
lvdb serve
Production Configuration Examples
High-Performance Setup
# production-high-perf.toml
[database]
root_dir = "/data/vector_databases"
connection_pool_size = 50
enable_gpu = true
enable_fts = true
# Optimized chunking
chunk_size = 400
chunk_overlap = 2
chunking_method = "sentences"
[embedding]
provider = "ollama"
model = "nomic-embed-text"
base_url = "http://ollama-cluster:11434"
batch_size = 128
timeout = 60
max_retries = 5
[server]
host = "0.0.0.0"
port = 8080
log_level = "INFO"
max_request_size = 209715200 # 200MB
enable_performance_logging = true
[server.security]
# Security for production
require_api_key = true
api_key_header = "Authorization"
auto_prune_expired_keys = false
key_audit_logging = true
auth_log_level = "INFO"
warn_expiring_days = 7
# CORS for web applications
cors_enabled = true
cors_allowed_origins = [
"https://app.yourdomain.com",
"https://admin.yourdomain.com"
]
Development Setup
# development.toml
[database]
root_dir = "./dev_databases"
connection_pool_size = 5
enable_gpu = false
enable_fts = true
[embedding]
provider = "ollama"
model = "all-minilm" # Faster model for development
base_url = "http://localhost:11434"
batch_size = 32
[server]
host = "127.0.0.1"
port = 8000
log_level = "DEBUG"
log_format = "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
[server.security]
# Relaxed security for development
require_api_key = false
cors_enabled = true
cors_allowed_origins = "*"
Security Considerations
API Key Management
LocalVectorDB Server includes a comprehensive key management system with SQLite-based storage, bcrypt hashing, full audit trails, and permission-based access control.
Permission Levels
API keys now support two permission levels:
read_only - Can query databases, search documents, and retrieve data. Cannot create, update, or delete any resources.
read_write - Full access to all operations including creating databases, adding documents, and deleting resources.
Creating API Keys
# Create a read-write API key (default)
lvdb auth create-key --description "Production API access"
# Create a read-only key for monitoring/analytics
lvdb auth create-key --description "Monitoring dashboard" --permission-level read_only
# Create a read-write key with expiration
lvdb auth create-key --description "Admin access" --permission-level read_write --expires-days 30
# Create a read-only key for CI/CD testing
lvdb auth create-key --description "CI/CD Pipeline" --permission-level read_only --created-by "admin" --expires-days 90
# Output just the key for scripting
lvdb auth create-key --description "Script access" --permission-level read_only --format key-only
# Output as JSON for automation
lvdb auth create-key --description "API integration" --format json
Managing API Keys
# List all API keys
lvdb auth list-keys
# List only active keys
lvdb auth list-keys --active-only
# Show detailed statistics
lvdb auth list-keys --show-stats
# Get detailed information about a specific key
lvdb auth key-info key_20241201_abc123
# Check overall authentication status
lvdb auth status
Key Rotation and Security
# Rotate a key (creates new key, deactivates old one)
lvdb auth rotate-key key_20241201_abc123
# Revoke a key immediately
lvdb auth revoke-key key_20241201_abc123
# Remove expired keys (soft delete - deactivates)
lvdb auth prune-expired
# Permanently delete expired keys
lvdb auth prune-expired --hard-delete
# Preview what would be pruned
lvdb auth prune-expired --dry-run
Configuration
Configure key management in your server configuration:
[server.security]
# Enable API key authentication
require_api_key = true
# Key database location (optional, defaults to <root_dir>/api_keys.db)
key_database_path = "/secure/path/api_keys.db"
# API key header name
api_key_header = "Authorization"
# Automatically remove expired keys
auto_prune_expired_keys = false
# Enable audit logging
key_audit_logging = true
auth_log_level = "INFO"
# Warn about keys expiring soon
warn_expiring_days = 7
Using API Keys
API keys must be sent in the Authorization header as Bearer tokens:
# Using curl
curl -H "Authorization: Bearer lvdb_your_api_key_here" \
http://localhost:8080/api/v1/databases
# Using Python requests
import requests
headers = {"Authorization": "Bearer lvdb_your_api_key_here"}
response = requests.get("http://localhost:8080/api/v1/health", headers=headers)
Permission Best Practices
Follow the principle of least privilege when assigning API key permissions:
Use read-only keys for:
Monitoring and analytics dashboards
Public-facing search interfaces
CI/CD test runners that only validate functionality
Backup verification scripts
Report generation tools
Use read-write keys for:
Administrative interfaces
Data ingestion pipelines
Content management systems
Database maintenance scripts
Development environments (with short expiration)
Security recommendations:
Always set expiration dates for read-write keys
Rotate keys regularly, especially after personnel changes
Use descriptive names to track key usage
Monitor key usage through audit logs
Revoke unused keys promptly
Security Features
The key management system provides enterprise-grade security:
Secure Storage: Keys are hashed with bcrypt before storage
Expiration Support: Keys can have automatic expiration dates
Audit Logging: All key usage is logged for security monitoring
Key Rotation: Seamlessly rotate keys without service interruption
Usage Tracking: Monitor when keys were last used
Soft Deletion: Revoked keys are deactivated, not deleted (for audit trails)
Automation and CI/CD
For automated deployments and CI/CD pipelines:
# Create a key for automation (outputs only the key)
API_KEY=$(lvdb auth create-key --description "CI/CD Pipeline" --expires-days 365 --format key-only)
# Use in scripts
export LVDB_API_KEY="$API_KEY"
# Rotate keys programmatically
NEW_KEY=$(lvdb auth rotate-key $OLD_KEY_ID --format key-only)
Monitoring and Maintenance
# Monitor key usage and expiration
lvdb auth list-keys --show-stats
# Check for keys expiring soon
lvdb auth list-keys | grep -E "(EXPIRING|EXPIRED)"
# Set up automated cleanup (add to cron)
0 2 * * * /usr/local/bin/lvdb auth prune-expired --confirm
HTTPS Configuration
LocalVectorDB server runs on HTTP by default. For HTTPS, use a reverse proxy:
Nginx Configuration:
server {
listen 443 ssl;
server_name vectordb.yourdomain.com;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forward_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Handle large requests
client_max_body_size 200M;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
}
Network Security
# Restrict access to specific networks
[server]
host = "127.0.0.1" # Local access only
# Or bind to specific interface
host = "10.0.1.100" # Internal network only
# Use firewall rules
iptables -A INPUT -p tcp --dport 8080 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP
Performance Tuning
Hardware Recommendations
CPU: - Minimum: 4 cores - Recommended: 8+ cores for high-throughput - Consider ARM64 for efficiency (M1/M2 Macs, AWS Graviton)
Memory: - Minimum: 8GB RAM - Recommended: 16GB+ for large databases - Rule of thumb: 2–4 GB per million documents
Storage: - SSD strongly recommended for database files - NVMe SSD for high-performance setups - Separate storage for databases and logs
GPU (Optional): - NVIDIA GPU with CUDA support for FAISS acceleration - Minimum 8GB VRAM for large embeddings - Multi-GPU setups supported
Performance Configuration
[database]
# Optimize connection pooling
connection_pool_size = 20 # Increase for high concurrency
# Longer timeout for large operations
timeout = 600
# GPU acceleration
enable_gpu = true # If NVIDIA GPU available
[embedding]
# Optimize batch sizes
batch_size = 128 # Larger batches for throughput
timeout = 120 # Longer timeout for large batches
[server]
# Optimize request handling
max_request_size = 209715200 # 200MB for large document uploads
Deployment Strategies
Docker Deployment
FROM python:3.11-slim
# Install system dependencies
RUN apt-get update && apt-get install -y \
build-essential \
curl \
&& rm -rf /var/lib/apt/lists/*
# Install Ollama
RUN curl -fsSL https://ollama.ai/install.sh | sh
# Install LocalVectorDB
RUN pip install "localvectordb[server]"
# Create app directory
WORKDIR /app
# Copy configuration
COPY production.toml /app/.lvdb-config.toml
# Create data directory
RUN mkdir -p /data/vector_databases
VOLUME /data/vector_databases
# Expose port
EXPOSE 8080
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/api/v1/health || exit 1
# Start server
CMD ["lvdb", "--config", "/app/.lvdb-config.toml", "serve", "--host", "0.0.0.0", "--port", "8080"]
version: "3.12"
services:
localvectordb:
build: .
ports:
- "8080:8080"
volumes:
- vector_data:/data/vector_databases
- ./production.toml:/app/.lvdb-config.toml:ro
environment:
- LVDB_EMBEDDING_PROVIDER=ollama
- LVDB_EMBEDDING_BASE_URL=http://ollama:11434
depends_on:
- ollama
restart: unless-stopped
ollama:
image: ollama/ollama:latest
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "443:443"
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/ssl:ro
depends_on:
- localvectordb
restart: unless-stopped
volumes:
vector_data:
ollama_data:
Kubernetes Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: localvectordb
spec:
replicas: 3
selector:
matchLabels:
app: localvectordb
template:
metadata:
labels:
app: localvectordb
spec:
containers:
- name: localvectordb
image: localvectordb:latest
ports:
- containerPort: 8080
env:
- name: LVDB_DATABASE_ROOT_DIR
value: "/data/vector_databases"
- name: LVDB_EMBEDDING_PROVIDER
value: "ollama"
- name: LVDB_EMBEDDING_BASE_URL
value: "http://ollama-service:11434"
volumeMounts:
- name: vector-data
mountPath: /data/vector_databases
- name: config
mountPath: /app/.lvdb-config.toml
subPath: .lvdb-config.toml
livenessProbe:
httpGet:
path: /api/v1/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /api/v1/health
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
volumes:
- name: vector-data
persistentVolumeClaim:
claimName: vector-data-pvc
- name: config
configMap:
name: localvectordb-config
---
apiVersion: v1
kind: Service
metadata:
name: localvectordb-service
spec:
selector:
app: localvectordb
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
Systemd Service
# /etc/systemd/system/localvectordb.service
[Unit]
Description=LocalVectorDB Server
After=network.target
[Service]
Type=simple
User=vectordb
Group=vectordb
WorkingDirectory=/opt/localvectordb
Environment=LVDB_SERVER_CONFIG=/etc/localvectordb/production.toml
ExecStart=/opt/localvectordb/venv/bin/lvdb --config /etc/localvectordb/production.toml serve
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
# Security settings
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/data/vector_databases /var/log/localvectordb
[Install]
WantedBy=multi-user.target
# Create user
sudo useradd -r -s /bin/false vectordb
# Create directories
sudo mkdir -p /opt/localvectordb /etc/localvectordb /data/vector_databases
sudo chown vectordb:vectordb /data/vector_databases
# Install service
sudo systemctl daemon-reload
sudo systemctl enable localvectordb
sudo systemctl start localvectordb
# Check status
sudo systemctl status localvectordb
Backup and Recovery
Database Backup
# Backup database files
cp -r /data/vector_databases /backup/vector_databases_$(date +%Y%m%d)
# Backup with compression
tar -czf /backup/vectordb_backup_$(date +%Y%m%d).tar.gz /data/vector_databases
# Automated backup script
#!/bin/bash
BACKUP_DIR="/backup/vectordb"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
# Stop server gracefully
systemctl stop localvectordb
# Create backup
tar -czf "$BACKUP_DIR/vectordb_backup_$DATE.tar.gz" /data/vector_databases
# Keep only last 7 days of backups
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete
# Restart server
systemctl start localvectordb
Configuration Backup
# Backup configuration
cp /etc/localvectordb/production.toml /backup/config_$(date +%Y%m%d).toml
# Export database metadata
lvdb db my_database list --format json > /backup/my_database_docs_$(date +%Y%m%d).json
Troubleshooting
Common Issues
High Memory Usage:
# Reduce memory usage
[database]
connection_pool_size = 5 # Reduce connections
[embedding]
batch_size = 32 # Smaller batches
Slow Performance:
# Performance tuning
[database]
enable_gpu = true # Use GPU if available
connection_pool_size = 20 # More connections
[server]
enable_performance_logging = true # Surface slow operations in logs
Connection Errors:
# Verify configuration
lvdb config show
# Check logs
journalctl -u localvectordb -f
Monitoring Tools
# Server monitoring
htop # Monitor CPU/memory usage
iotop # Monitor disk I/O
netstat -tlnp | grep 8080 # Check port binding
# Application monitoring
curl http://localhost:8080/api/v1/health
lvdb list --details
# Log analysis
tail -f /var/log/localvectordb/server.log | jq .