Why self-host Weaviate on a VPS
Weaviate does not merely store vectors: thanks to its modules (text2vec, reranker, generative), it can vectorize your data automatically on insertion and even orchestrate generative queries, all exposed via GraphQL and REST. It is an end-to-end semantic search platform. Self-hosting it on a VPS gives you the freedom to enable only the modules you need, to connect your own embedding models and to keep your AI data in-house. For teams building a document assistant or a recommendation engine, this avoids dependence on a managed vector service and its volume-based costs. You control latency, retention and the schema of your classes, and you can scale the VPS at the pace of your corpus.
The concrete benefits of self-hosting Weaviate
- Built-in vectorization via the
text2vecmodules: your texts are turned into vectors without an external pipeline. - An expressive GraphQL API for hybrid queries (vector + filters + BM25) in a single query.
- Generative and reranking modules to build a complete RAG pipeline directly in the database.
- A high-performance HNSW index with product quantization (PQ) to keep memory in check.
- A class- and property-oriented schema, close to a graph, handy for structured data.
- Sovereignty: your embeddings and your source documents stay hosted on your VPS.
Hardware and software prerequisites
Weaviate is more demanding than Qdrant, especially if you enable local vectorization modules. For an instance with vectorization delegated to an external API, 4 GB of RAM is a comfortable minimum. If you run a text2vec-transformers module locally, plan instead for 8 GB and ideally a GPU, otherwise vectorization will be slow on CPU. Count on 2 to 4 vCPUs and 30 to 60 GB of SSD depending on the volume of vectors and snapshots. You will need Docker Compose to orchestrate Weaviate and its module containers, a domain for HTTPS exposure, and the activation of API key authentication: as with any vector database, never leave an instance open on the Internet.
Weaviate or Qdrant: which to choose for your VPS
| Criterion | Weaviate | Qdrant |
|---|---|---|
| Language and footprint | Go, heavier on RAM | Rust, very light and efficient |
| Built-in vectorization | Yes, via text2vec and generative modules | No, embeddings provided by the client |
| Main API | GraphQL and REST | REST and gRPC |
| Hybrid search | Native (vector + BM25) | Native (vector + payload filters) |
| Memory compression | Product Quantization (PQ) | Scalar and binary quantization |
| Deployment ease | Multi-container Compose (modules) | Single container, instant startup |
| Ideal for | A complete all-in-one RAG pipeline | Fast and frugal vector search |
Deploy Weaviate step by step
Prepare the VPS and Docker Compose
Install Docker and Docker Compose. Create a DNS A record for search.mydomain.com. Reserve enough RAM if you plan a local vectorization module.
Write the docker-compose.yml with the modules
Declare the weaviate service (cr.weaviate.io/semitechnologies/weaviate) and, if needed, a module container such as text2vec-transformers. Link them via ENABLE_MODULES and TRANSFORMERS_INFERENCE_API. Mount a volume on /var/lib/weaviate for persistence.
Configure authentication and modules
Enable API key auth with AUTHENTICATION_APIKEY_ENABLED=true, set AUTHENTICATION_APIKEY_ALLOWED_KEYS and AUTHENTICATION_APIKEY_USERS. Disable anonymous access (AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=false) and choose the DEFAULT_VECTORIZER_MODULE.
Start the stack
Run docker compose up -d and check the status via curl http://localhost:8080/v1/.well-known/ready. Follow the container logs to confirm that the modules are properly loaded.
Place the reverse proxy and TLS
Put Caddy or Nginx in front of port 8080 to handle Let's Encrypt and do not expose the port directly. Forward the Authorization header containing the API key through to Weaviate.
Create a class and query in GraphQL
Define a class with its properties and its vectorizer, import your objects (automatically vectorized if a module is active), then test a nearText or hybrid query in GraphQL. Schedule backups via the backup module to S3 storage.
If you enable local vectorization with text2vec-transformers without a GPU, CPU inference will quickly become a bottleneck during bulk imports. In that case, prefer to delegate vectorization to an external API (text2vec-openai, text2vec-cohere or a compatible endpoint you host), or enable Product Quantization to reduce the memory of the HNSW index. Monitor RAM consumption via the Prometheus metrics exposed by Weaviate on port 2112.