Analytics cookies only (Google Analytics, PostHog). No ad networks, no cross-site tracking. See our privacy policy.
A distributed search and analytics engine with a REST API, a query DSL, aggregations, k-NN vector search and the OpenSearch Dashboards UI for exploring and visualising what you index: the community fork of Elasticsearch and Kibana. Apache-2.0 licensed, Java on Lucene with a Node.js Dashboards server; it runs as a JVM node (or cluster) plus a separate Dashboards container, and the bundled demo security config gives you TLS and an admin login out of the box.
Runs on a VPS from $23/mo (Kamatera 8GB, 8 GB RAM) · prices checked Sep 2026
Pick OpenSearch when you need full-text search and analytics with a cluster-grade engine behind it: a REST API and query DSL, aggregations, k-NN vector search, index lifecycle policies and OpenSearch Dashboards for visualising what you index, all in the Apache-2.0 fork of Elasticsearch and Kibana. It is Java on Lucene with a Node.js Dashboards server. Our snippet is the sample compose file from the Docker install docs cut from two nodes to one (`discovery.type=single-node`), with both images pinned to the same version, the heap set to 1 GB and the demo-config admin password generated into `.env`; the `vm.max_map_count` sysctl the docs require is an explicit line. Upstream publishes no RAM minimum, so our 4 GB floor is an estimate covering the 1 GB heap, the JVM's native memory and Dashboards. The catalog's Meilisearch and Typesense are lighter single-binary engines built for typo-tolerant site search, and SearXNG is a metasearch frontend rather than an index. OpenSearch is the one for log analytics, aggregations and anything that will eventually need more than one node.
Paid link — we earn a commission if you shop through it.
Run these commands on your server:
# OpenSearch — search and analytics engine with OpenSearch Dashboards — based on the sample docker-compose.yml in the OpenSearch Docker install docs, reduced to one node, pinned to 3.9.0
# the demo security config rejects admin passwords without upper, lower, digit and special characters or a weak zxcvbn score: the Aa1- prefix covers the classes, the random hex the strength
echo "OPENSEARCH_INITIAL_ADMIN_PASSWORD=Aa1-$(openssl rand -hex 16)" > .env
# OpenSearch refuses to start on the kernel default vm.max_map_count; upstream requires at least 262144 (persist it in /etc/sysctl.conf to survive a reboot)
sudo sysctl -w vm.max_map_count=262144
cat > docker-compose.yml <<'EOF'
services:
opensearch:
image: opensearchproject/opensearch:3.9.0
restart: unless-stopped
environment:
- cluster.name=opensearch-cluster
- node.name=opensearch
- discovery.type=single-node
- bootstrap.memory_lock=true
- "OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g"
- OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_INITIAL_ADMIN_PASSWORD}
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
volumes:
- opensearch_data:/usr/share/opensearch/data
ports:
- 9200:9200
- 9600:9600
opensearch-dashboards:
image: opensearchproject/opensearch-dashboards:3.9.0
restart: unless-stopped
environment:
OPENSEARCH_HOSTS: '["https://opensearch:9200"]'
ports:
- 5601:5601
depends_on:
- opensearch
volumes:
opensearch_data:
EOF
docker compose up -d
# Dashboards answers 503 until the node is up and the demo security config has been installed
timeout 300 bash -c 'until curl -s -o /dev/null -w "%{http_code}" http://localhost:5601/ | grep -q "^[23]"; do sleep 5; done'
# → http://SERVER_IP:5601 — sign in as admin with the password in .env; the OpenSearch API itself is HTTPS on 9200 behind a self-signed demo certificate (curl -k)OpenSearch's Docker install docs and the security plugin's demo-configuration and password pages are explicit about the defaults: