[{"data":1,"prerenderedAt":276},["ShallowReactive",2],{"seo-verification":3,"blog-hosting-weaviate-on-a-vps-ma-en":6,"promo-bar-likely":275},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-hosting-weaviate-on-a-vps-ma-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":211,"ctaBody":212,"ctaButton":213,"ctaUrl":214,"relatedPosts":215},66,"hosting-weaviate-on-a-vps",{"fr":12,"en":10,"ar":13,"es":14},"heberger-weaviate-vps","استضافة-weaviate-على-خادم-vps","alojar-weaviate-en-un-vps","Hosting Weaviate on a VPS","Weaviate on a VPS: annotated Docker Compose, API key auth, vectorizer choice, HNSW and quantization, backups, Python client v4 and troubleshooting.",12,0,false,"2026-04-15T00:00:00+00:00","2026-11-04T16:30:25+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},6,"Databases","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-weaviate-vps-poster.svg",{"categorySlug":34,"appSlug":35},"artificial-intelligence","weaviate","Weaviate is an open-source vector database written in Go, built for semantic search and RAG. What sets it apart: modules that vectorize your objects at import time and can generate an answer from the results, with no external pipeline. This guide deploys Weaviate on a VPS with Docker Compose, secures the API with keys, explains how to choose a vectorizer, how to size memory for the HNSW index, how to back up, and how to fix the most common errors. A comparison with Qdrant, pgvector and Milvus helps you decide.",[38,42,53,56,84,115,118,127,130,133,136,139,148,204,207],{"type":39,"title":40,"body":41},"h2","Why self-host Weaviate on a VPS","Weaviate does more than store vectors. Each object carries its properties (text, numbers, dates, references) and one or more vectors, so a single query returns the relevant documents together with all their metadata. The `text2vec-*` modules compute embeddings at import time, the `generative-*` modules pass results to an LLM, and reranker modules reorder the candidates. Everything can be queried over REST, GraphQL or gRPC. Self-hosting on a VPS lets you pick which modules are enabled, plug in your own embedding models (for example through Ollama on the same machine) and keep documents and vectors on a server you administer. For an internal documentation assistant, a catalogue search engine or an agent memory, you control latency, retention, the collection schema and how often backups run. And you scale the VPS resources at the pace of your corpus, rather than at the pace of a usage-based billing grid.",{"type":43,"title":44,"items":45},"ul","What Weaviate brings in practice",[46,47,48,49,50,51,52],"**Built-in vectorization** — with a `text2vec-*` module, you insert raw text and Weaviate computes the vector itself.","**Native hybrid search** — a `hybrid` query combines the vector score and BM25, weighted by the `alpha` parameter.","**RAG inside the database** — `generative-*` modules send the retrieved objects to an LLM and return the answer along with the sources.","**Multi-tenancy** — one isolated shard per customer within the same collection, ideal for a SaaS that separates each account's data.","**Named vectors** — several vectors per object (title, content, image), each with its own vectorizer and its own index.","**Index compression** — PQ, BQ or SQ quantization to cut the memory used by vectors.","**BSD-3-Clause licence** — auditable code you can deploy without depending on a managed service.",{"type":39,"title":54,"body":55},"Sized requirements for a Weaviate VPS","To test with a few thousand objects, 2 GB of RAM is enough. For real use with vectorization delegated to an API or to Ollama, 4 GB and 2 vCPUs are a comfortable starting point. If you run `text2vec-transformers` on the same machine, plan for 8 GB or more: CPU inference is slow during bulk imports. On the disk side, count 30 to 60 GB of SSD depending on volume, and keep headroom because Weaviate switches to read-only when disk usage crosses a threshold (`DISK_USE_READONLY_PERCENTAGE`, 90% by default). Three ports matter: `8080` for REST and GraphQL, `50051` for gRPC (used by the Python client v4 for queries and imports), and `2112` for Prometheus metrics if you enable them. None of them should be exposed raw to the Internet: only an HTTPS reverse proxy, on a subdomain such as `vectors.example.com`, should face the public. Finally, you need Docker and Docker Compose, already present on VPSs created from the Marketplace.",{"type":57,"title":58,"headers":59,"rows":63},"comparison","Which vectorizer to choose",[60,61,62],"Option","Where the model runs","When to choose it",[64,68,72,76,80],[65,66,67],"none + your own vectors","In your application, before import","You already compute embeddings or want full control over the model",[69,70,71],"text2vec-openai","External API, key sent in the X-OpenAI-Api-Key header","Quick start, light VPS, data allowed to leave the server",[73,74,75],"text2vec-ollama","Ollama server on the VPS or the private network","Local embeddings without a dedicated GPU, with a model such as nomic-embed-text",[77,78,79],"text2vec-transformers","Inference container next to Weaviate","Model baked into the image, ideally with a GPU for large imports",[81,82,83],"Several via named vectors","A mix of the options above","Compare two models or vectorize title and content separately",{"type":85,"title":86,"steps":87},"steps","Deploying Weaviate step by step",[88,91,94,97,100,103,106,109,112],{"title":89,"body":90},"Prepare the VPS and DNS","Check Docker with `docker compose version`. Create a DNS A record for `vectors.example.com` pointing to the VPS IP, then a `\u002Fopt\u002Fweaviate` directory that will hold the `docker-compose.yml`.",{"title":92,"body":93},"Write the weaviate service","Declare the `semitechnologies\u002Fweaviate:1.27.2` image (also published on `cr.weaviate.io`). Publish the ports locally only: `127.0.0.1:8080:8080` and `127.0.0.1:50051:50051`. Docker bypasses `ufw` rules for published ports, so an `8080:8080` mapping would remain reachable from the Internet even with the firewall on. Mount a named volume on `\u002Fvar\u002Flib\u002Fweaviate` and add `restart: unless-stopped`.",{"title":95,"body":96},"Set the base variables","`PERSISTENCE_DATA_PATH=\u002Fvar\u002Flib\u002Fweaviate` for persistence, `QUERY_DEFAULTS_LIMIT=25` for the default number of results, `CLUSTER_HOSTNAME=node1` for a stable node name: if it changes between restarts, the node no longer finds its state. Add `DEFAULT_VECTORIZER_MODULE=none` or the module of your choice, and `ENABLE_API_BASED_MODULES=true` to enable the modules that call an API (`text2vec-openai`, `text2vec-ollama`, `generative-openai`…).",{"title":98,"body":99},"Enable API key authentication","Set `AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=false`, then `AUTHENTICATION_APIKEY_ENABLED=true`, `AUTHENTICATION_APIKEY_ALLOWED_KEYS=admin-key,read-key` and `AUTHENTICATION_APIKEY_USERS=admin,app-reader`: keys and users are matched in order. Generate the keys with `openssl rand -hex 32`. To restrict the second key to reads, add `AUTHORIZATION_ADMINLIST_ENABLED=true`, `AUTHORIZATION_ADMINLIST_USERS=admin` and `AUTHORIZATION_ADMINLIST_READONLY_USERS=app-reader`.",{"title":101,"body":102},"Start and check","Run `docker compose up -d`, then `curl -s localhost:8080\u002Fv1\u002F.well-known\u002Fready`, which answers 200 once the node is ready. `curl -s -H \"Authorization: Bearer $KEY\" localhost:8080\u002Fv1\u002Fmeta` returns the version and the list of loaded modules: it is the first check to run when a vectorizer seems to be missing.",{"title":104,"body":105},"Put Nginx and TLS in front of port 8080","Configure an Nginx `server` for `vectors.example.com` with `proxy_pass http:\u002F\u002F127.0.0.1:8080;`, issue the certificate with `certbot --nginx -d vectors.example.com` and raise `client_max_body_size` if you import batches over REST. The `Authorization` header is passed through to Weaviate unchanged.",{"title":107,"body":108},"Connect with the Python client v4","Install `pip install -U weaviate-client`. On the VPS: `client = weaviate.connect_to_local(port=8080, grpc_port=50051, auth_credentials=Auth.api_key(KEY))`, with `from weaviate.classes.init import Auth`. From another server, use `weaviate.connect_to_custom(...)` and specify host, port and TLS for both HTTP and gRPC. Check with `client.is_ready()` and finish with `client.close()`.",{"title":110,"body":111},"Create a collection and import","`client.collections.create(\"Article\", ...)` with its properties and vectorizer, then `articles = client.collections.get(\"Article\")`. Import in batches inside a `with articles.batch.dynamic() as batch:` block by calling `batch.add_object(properties={...})`, and add `vector=[...]` if the vectorizer is `none`. Then check `articles.batch.failed_objects` to spot rejected objects.",{"title":113,"body":114},"Connect the rest of the AI stack","For fully local embeddings and generation, install Ollama on the same VPS and point `text2vec-ollama` and `generative-ollama` at its API. Open WebUI or your RAG application then query Weaviate as their document memory.",{"type":39,"title":116,"body":117},"Data modelling: collections, multi-tenancy and named vectors","In Weaviate, data lives in **collections** (called classes in the older API). A collection defines its typed properties (`text`, `int`, `number`, `date`, `boolean`, references to other collections), its vectorizer and its index configuration. Declare properties explicitly instead of letting auto-schema guess them on the first insert: a date field guessed as text can no longer be filtered properly. For a SaaS, enable **multi-tenancy** at creation time with `multi_tenancy_config=Configure.multi_tenancy(enabled=True)`: each tenant gets its own shard, is queried through `collection.with_tenant(\"customer-a\")`, and an idle tenant can be deactivated to free memory. Finally, **named vectors** let you attach several vectors to the same object, for example one for the title and one for the content, each with its own model and index. Be careful: a collection's vectorizer and index type cannot be changed afterwards; a change means a new collection and a re-import.",{"type":43,"title":119,"items":120},"Querying Weaviate: the useful queries",[121,122,123,124,125,126],"**Semantic search** — `articles.query.near_text(query=\"contract termination\", limit=5)` requires a vectorizer; otherwise use `near_vector` with your own embedding.","**Hybrid search** — `articles.query.hybrid(query=\"duplicate invoice\", alpha=0.5)`: `alpha=1` gives a purely vector search, `alpha=0` a purely BM25 search.","**Keywords only** — `articles.query.bm25(query=\"GDPR\")` uses the inverted index, useful for references, product codes and proper names.","**Filters** — `filters=Filter.by_property(\"language\").equal(\"en\")`, imported from `weaviate.classes.query`, combines with all of the queries above.","**Built-in RAG** — `articles.generate.near_text(query=..., limit=3, grouped_task=\"Answer using these excerpts\")` returns the objects and the answer from the configured LLM.","**GraphQL** — the `\u002Fv1\u002Fgraphql` endpoint remains available for tools that use it, with the `nearText`, `hybrid` and `bm25` operators.",{"type":39,"title":128,"body":129},"HNSW, flat or dynamic index and memory sizing","By default, each collection uses an **HNSW** index, fast but held in memory. Weaviate's documentation gives a rule of thumb: plan for about twice the raw size of the vectors. One million 768-dimension vectors in `float32` weigh about 3 GB, so around 6 GB of RAM for the index. The **flat** index keeps nothing in memory and suits small collections, notably the tenants of a SaaS. The **dynamic** index starts as flat and switches to HNSW above an object threshold; it requires `ASYNC_INDEXING=true`. To shrink the footprint, enable **quantization**: PQ (product quantization) compresses heavily after a training phase on your data, BQ (binary quantization) reduces each dimension to one bit and mainly suits high-dimension vectors, SQ (scalar quantization) stores each dimension in one byte. Also set `GOMEMLIMIT` to about 80% of the RAM allotted to the container so that Go's garbage collector steps in before the kernel kills the process.",{"type":39,"title":131,"body":132},"Backups and upgrades","Add `ENABLE_MODULES=backup-filesystem` and `BACKUP_FILESYSTEM_PATH=\u002Fvar\u002Flib\u002Fweaviate\u002Fbackups`, then trigger a backup with `curl -X POST -H \"Authorization: Bearer $KEY\" -H \"Content-Type: application\u002Fjson\" -d '{\"id\":\"nightly-20261001\"}' localhost:8080\u002Fv1\u002Fbackups\u002Ffilesystem`. The status is read from `GET \u002Fv1\u002Fbackups\u002Ffilesystem\u002Fnightly-20261001` and restoring goes through `POST \u002Fv1\u002Fbackups\u002Ffilesystem\u002Fnightly-20261001\u002Frestore`. A backup on the same disk does not protect you from losing the VPS: copy the directory elsewhere, or use `backup-s3` with `BACKUP_S3_BUCKET` towards S3-compatible object storage. To upgrade, read the migration notes for the target version, back up, change the image tag, then run `docker compose pull && docker compose up -d`. Move through minor versions one at a time and never downgrade on the same data without restoring a backup.",{"type":134,"body":135},"tip","Do not leave gRPC port `50051` open to the Internet: applications on the same VPS use it locally, and a remote workstation goes through an `ssh -L 50051:localhost:50051 user@vps` tunnel. The Marketplace deployment binds this port to `127.0.0.1` and starts with anonymous access open to ease onboarding: enable API key authentication before importing any data. Give your application a read-only key and keep the admin key for imports and backups.",{"type":39,"title":137,"body":138},"Monitoring Weaviate","Enable `PROMETHEUS_MONITORING_ENABLED=true`: Weaviate then exposes its metrics on port `2112` (`\u002Fmetrics`), to be scraped by Prometheus and displayed in Grafana. Watch process memory, batch import duration and the number of objects per collection first. The `\u002Fv1\u002F.well-known\u002Flive` and `\u002Fv1\u002F.well-known\u002Fready` endpoints serve as probes for a Docker healthcheck or a tool such as Uptime Kuma. At system level, `docker stats` gives the container's live consumption and `df -h` the volume usage, which deserves close attention since read-only mode is triggered by the disk, not by RAM. Finally, keep an eye on the logs with `docker compose logs -f weaviate`: module errors and vectorization failures show up there with the name of the object concerned.",{"type":43,"title":140,"items":141},"Troubleshooting: the most common errors",[142,143,144,145,146,147],"**401 response on every request** — anonymous access is disabled and the request does not send `Authorization: Bearer \u003Ckey>`, or the key is not listed in `AUTHENTICATION_APIKEY_ALLOWED_KEYS`.","**The Python client v4 refuses to connect** — it also checks gRPC: port `50051` must be reachable from the client, locally or through an SSH tunnel, and `grpc_port` must match.","**Module not found when creating a collection** — the module is not loaded: check `ENABLE_MODULES`, `ENABLE_API_BASED_MODULES` and the list returned by `\u002Fv1\u002Fmeta`.","**Container restarting with exit code 137** — the kernel killed it for lack of memory: set `GOMEMLIMIT`, enable quantization or add RAM to the VPS.","**Imports rejected in read-only mode** — the disk crossed `DISK_USE_READONLY_PERCENTAGE`: free some space or grow the volume, then set the shards back to writable.","**Vectorization errors at import** — the provider API key is missing (`X-OpenAI-Api-Key` passed in the client `headers`) or the Ollama server cannot be reached from the Weaviate container.",{"type":57,"title":149,"headers":150,"rows":156},"Weaviate, Qdrant, pgvector or Milvus",[151,152,153,154,155],"Criterion","Weaviate","Qdrant","pgvector","Milvus",[157,163,169,175,181,187,193,198],[158,159,160,161,162],"Nature","Vector database in Go","Vector database in Rust","PostgreSQL extension","Distributed vector database",[164,165,166,167,168],"Built-in vectorization","Yes, text2vec-* modules","No, embeddings supplied by the client","No, embeddings supplied by the application","Mostly client-side",[170,171,172,173,174],"API","REST, GraphQL, gRPC","REST, gRPC","SQL","gRPC, REST, SDKs",[176,177,178,179,180],"Hybrid and filters","Native BM25 + vector, filters","Payload filters, sparse vectors","SQL WHERE, PostgreSQL full-text to combine","Scalar filters, BM25 in recent versions",[182,183,184,185,186],"Footprint on a VPS","Medium, single container","Low, single container","That of your PostgreSQL","Heavier, etcd and MinIO in standalone mode",[188,189,190,191,192],"Compression","PQ, BQ, SQ","Scalar, binary, product","halfvec, bit","Several quantized indexes (IVF_PQ, IVF_SQ8…)",[194,195,196,197,196],"Licence","BSD-3-Clause","Apache 2.0","PostgreSQL Licence",[199,200,201,202,203],"Typical use case","All-in-one RAG with built-in vectorization","Lean vector search","Vectors alongside relational data","Very large volumes, cluster deployment",{"type":39,"title":205,"body":206},"When Weaviate is the right choice","Weaviate makes sense when you want the database to handle vectorization, hybrid search and generation, rather than assembling them yourself in application code. It fits a documentation assistant, a multilingual catalogue search or a SaaS that isolates each customer in its own tenant. If you already compute your embeddings and want the smallest footprint, Qdrant is leaner. If your data already lives in PostgreSQL and the volume stays modest, pgvector saves you an extra component. Milvus targets very large distributed volumes, at the cost of heavier infrastructure. On a VPS, start with a single node, an HNSW index, an API key and daily backups, then add quantization and multi-tenancy when measurements call for it. To go further, read our guides on Qdrant, Ollama and Open WebUI, which complement Weaviate in a self-hosted RAG stack.",{"type":208,"title":209,"body":210},"callout","Deploy Weaviate on your VPS","Order a ServOrbit VPS and deploy Weaviate in a few clicks from the Marketplace — Ubuntu 24.04, Docker pre-installed, `semitechnologies\u002Fweaviate:1.27.2` image ready to run.","Deploy your Weaviate RAG platform","The ServOrbit Cloud VPS gives you the resources and the Docker environment to host Weaviate and its modules, and to build a complete, secure and sovereign semantic search pipeline.","Deploy on Cloud VPS","\u002Fapplications\u002Fartificial-intelligence\u002Fweaviate",[216,236,257],{"id":217,"slug":218,"slugs":219,"title":223,"excerpt":224,"readTime":225,"views":226,"isPinned":19,"noindex":19,"publishedAt":227,"updatedAt":228,"category":229,"categories":230,"featuredImage":30,"bgImage":31,"posterImage":232,"relatedSolution":233},65,"hosting-qdrant-on-a-vps",{"fr":220,"en":218,"ar":221,"es":222},"heberger-qdrant-vps","استضافة-qdrant-على-خادم-vps","alojar-qdrant-en-un-vps","Hosting Qdrant on a VPS","Host Qdrant on your VPS: Docker Compose, API key, TLS, HNSW tuning, quantization, Python v1 client, snapshots and Prometheus monitoring.",8,1,"2026-04-16T00:00:00+00:00","2026-10-20T23:18:05+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[231],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-qdrant-vps-poster.svg",{"categorySlug":234,"appSlug":235},"databases","qdrant",{"id":226,"slug":237,"slugs":238,"title":242,"excerpt":243,"readTime":244,"views":226,"isPinned":19,"noindex":19,"publishedAt":245,"updatedAt":246,"category":247,"categories":252,"featuredImage":30,"bgImage":31,"posterImage":254,"relatedSolution":255},"how-to-host-open-webui-on-a-vps",{"fr":239,"en":237,"ar":240,"es":241},"heberger-open-webui","كيفية-استضافة-open-webui-على-خادم-vps","como-alojar-open-webui-en-un-vps","How to Host Open WebUI on a VPS","A complete guide to deploying Open WebUI on your own VPS. Keep control of your data, avoid cloud API costs, and access your LLMs from a clean web interface.",9,"2026-06-01T00:00:00+00:00","2026-11-09T20:55:18+00:00",{"id":226,"name":248,"slug":249,"color":250,"icon":251},"Artificial Intelligence","intelligence-artificielle","bg-purple-500\u002F10 text-purple-400","ia",[253],{"id":226,"name":248,"slug":249,"color":250,"icon":251},"\u002Fblog\u002Fcovers\u002Fheberger-open-webui-poster.svg",{"categorySlug":34,"appSlug":256},"open-webui",{"id":258,"slug":259,"slugs":260,"title":264,"excerpt":265,"readTime":244,"views":266,"isPinned":19,"noindex":19,"publishedAt":267,"updatedAt":268,"category":269,"categories":270,"featuredImage":30,"bgImage":31,"posterImage":272,"relatedSolution":273},11,"how-to-host-ollama-on-a-vps",{"fr":261,"en":259,"ar":262,"es":263},"heberger-ollama-vps","كيفية-استضافة-ollama-على-خادم-vps","como-alojar-ollama-en-un-vps","Hosting Ollama on a VPS: advanced operational guide","Advanced Ollama VPS setup: model management, nginx reverse proxy, API security, Q4_K_M\u002FQ8 quantization, CVE-2026-45672 Open WebUI and secure coupling.",3,"2026-06-09T00:00:00+00:00","2026-11-04T16:30:24+00:00",{"id":226,"name":248,"slug":249,"color":250,"icon":251},[271],{"id":226,"name":248,"slug":249,"color":250,"icon":251},"\u002Fblog\u002Fcovers\u002Fheberger-ollama-vps-poster.svg",{"categorySlug":34,"appSlug":274},"ollama",true,1794270421825]