Manticore Search
Overview
Manticore Search is an open-source database for search. Its single searchd daemon delivers fast full-text search, filtering and real-time analytics over your own data. It speaks three interfaces at once: a MySQL-compatible SQL protocol, a JSON HTTP API and a binary protocol. It runs in real-time mode, so you create tables and index documents on the fly without restarts. That makes it a lean, self-contained alternative to heavier search stacks.
The SecureAnyCloud image installs the latest stable Manticore from the official repository and runs it under the unprivileged manticore system account. Manticore's own interfaces have no built-in authentication, so the image keeps every listener bound to loopback. An nginx reverse proxy with HTTP Basic Auth is the only externally reachable door. A unique credential is generated on the first boot of every VM.
What you get:
- The latest stable Manticore Search
searchddaemon, installed from the official apt repository and run by an unprivilegedmanticoreaccount - All three
searchdinterfaces bound to loopback only: SQL127.0.0.1:9306(MySQL protocol), HTTP127.0.0.1:9308(JSON API) and binary127.0.0.1:9312 - An nginx reverse proxy on
:80in front of the HTTP interface, protected by HTTP Basic Auth - Secure by default: a strong per-VM password (
MANTICORE_PASSWORD) generated at first boot in a root-only file, with no default login to change manticore.serviceandnginx.serviceas systemd units, enabled and active- An open
/healthendpoint so load balancers can probe the VM. Every other endpoint requires the credential. - 24/7 SecureAnyCloud support
Prerequisites
You need an active Azure subscription, an SSH key pair, and a VNet with a subnet in the target region.
Standard_B2s (2 vCPU / 4 GiB RAM) is a good starting point. Scale up for larger indexes or higher query volume.
Configure the network security group (NSG) to allow inbound 22/tcp from your management network and 80/tcp from the clients that query Manticore. For public exposure, front port 80 with TLS (see Step 9, Enabling HTTPS).
Step 1 - Deploy from the Azure Marketplace
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Manticore Search by SecureAnyCloud, and select Create.
On the Basics tab, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) and HTTP (80). Then select Review + create and Create.
Step 2 - Deploy from the Azure CLI
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:manticoresearch-ubuntu-24-04:default:latest
az vm create \
--resource-group <your-rg> \
--name manticore \
--image sac1647283583153:manticoresearch-ubuntu-24-04:default:latest \
--size Standard_B2s \
--admin-username azureuser \
--ssh-key-values ~/.ssh/id_ed25519.pub \
--vnet-name <your-vnet> --subnet <your-subnet> \
--public-ip-sku Standard
az vm open-port --resource-group <your-rg> --name manticore --port 80 --priority 1010Step 3 - Connect to your VM
ssh azureuser@<vm-public-ip>Step 4 - Confirm the services are running
Manticore's searchd daemon and nginx are enabled and active on first boot. Confirm the services. Every searchd listener is bound to loopback (127.0.0.1), so the only externally reachable port is nginx on :80.
systemctl is-active manticore.service nginx.service ss -tln | grep -E ':80 |9306|9308|9312' searchd --version | head -1 curl -s -o /dev/null -w 'health: HTTP %{http_code}\n' http://127.0.0.1/healthExpected output:
active active LISTEN 0 5 127.0.0.1:9306 0.0.0.0:* LISTEN 0 5 127.0.0.1:9308 0.0.0.0:* LISTEN 0 5 127.0.0.1:9312 0.0.0.0:* LISTEN 0 511 0.0.0.0:80 0.0.0.0:* Manticore 28.4.4 f63d06ecb@26071006 (columnar 13.8.1 ...) (secondary 13.8.1 ...) (knn 13.8.1 ...) health: HTTP 200Step 5 - Retrieve the per-VM credential
Manticore's SQL and HTTP interfaces have no built-in authentication, so the SecureAnyCloud image never exposes them directly. nginx on :80 fronts the HTTP interface behind HTTP Basic Auth. The password is generated uniquely for this VM on first boot and written to a root-only file. There is no default login to change.
sudo cat /root/manticoresearch-credentials.txtThe file contains three values:
MANTICORE_USER, which is alwaysmanticoreMANTICORE_PASSWORD, unique to this VM (the<MANTICORE_PASSWORD>referenced throughout this guide)MANTICORE_URL, built from this VM's address
Load the password into a shell variable for the commands below:
PASS=$(sudo grep '^MANTICORE_PASSWORD=' /root/manticoresearch-credentials.txt | cut -d= -f2-)A request without the credential is rejected with HTTP 401. The same request with -u manticore:$PASS returns HTTP 200.
PASS=$(sudo grep '^MANTICORE_PASSWORD=' /root/manticoresearch-credentials.txt | cut -d= -f2-)
curl -s -o /dev/null -w 'no credential: HTTP %{http_code}\n' http://127.0.0.1/sql -d 'mode=raw&query=SHOW STATUS'
curl -s -o /dev/null -w 'with credential: HTTP %{http_code}\n' -u "manticore:$PASS" http://127.0.0.1/sql -d 'mode=raw&query=SHOW STATUS'Expected output:
no credential: HTTP 401 with credential: HTTP 200Step 6 - Create a real-time table and index documents
Manticore runs in real-time mode, so you create a table and start indexing immediately, with no config edits or restarts. Create a products table over the SQL-over-HTTP endpoint, then index two documents through the JSON /insert endpoint.
PASS=$(sudo grep '^MANTICORE_PASSWORD=' /root/manticoresearch-credentials.txt | cut -d= -f2-)
curl -s -u "manticore:$PASS" http://127.0.0.1/sql \
-d 'mode=raw&query=CREATE TABLE IF NOT EXISTS products(title text, brand string, price float)' echo
curl -s -u "manticore:$PASS" http://127.0.0.1/insert \
-d '{"index":"products","id":1,"doc":{"title":"Wireless noise cancelling headphones","brand":"Acme","price":199.0}}' echo
curl -s -u "manticore:$PASS" http://127.0.0.1/insert \
-d '{"index":"products","id":2,"doc":{"title":"Wired studio headphones","brand":"Acme","price":89.5}}' echoEach insert returns a JSON acknowledgement:
[{"total":0,"error":"","warning":""}] {"table":"products","id":1,"created":true,"result":"created","status":201} {"table":"products","id":2,"created":true,"result":"created","status":201}Step 7 - Run a full-text search
Query the products table through the JSON /search endpoint. Manticore returns the matching documents with a relevance _score.
PASS=$(sudo grep '^MANTICORE_PASSWORD=' /root/manticoresearch-credentials.txt | cut -d= -f2-)
curl -s -u "manticore:$PASS" http://127.0.0.1/search \
-d '{"index":"products","query":{"match":{"title":"headphones"}},"limit":2}' echoExpected output (abridged):
{"took":0,"timed_out":false,"hits":{"total":2,"total_relation":"eq","hits":[ {"_id":2,"_score":1356,"_source":{"title":"Wired studio headphones","brand":"Acme","price":89.5}}, {"_id":1,"_score":1356,"_source":{"title":"Wireless noise cancelling headphones","brand":"Acme","price":199.0}}]}}Step 8 - Query over SQL and the MySQL wire protocol
The same data is reachable through SQL over HTTP and, for tools and drivers that speak the MySQL protocol, over the SQL port. Over HTTP, you send SQL to /sql. Over the wire protocol, you connect the standard mysql client to the loopback port 9306. Tunnel that port over SSH from your workstation, as described below.
PASS=$(sudo grep '^MANTICORE_PASSWORD=' /root/manticoresearch-credentials.txt | cut -d= -f2-)
curl -s -u "manticore:$PASS" http://127.0.0.1/sql \
-d "mode=raw&query=SELECT id, title, price FROM products WHERE MATCH('wireless')" echo mysql -h127.0.0.1 -P9306 -e 'SHOW TABLES; SELECT COUNT(*) AS n FROM products;'Expected output:
[{"columns":[...],"data":[{"id":1,"title":"Wireless noise cancelling headphones","price":199}],"total":1,"error":"","warning":""}] Table Type products rt n 2Reaching the SQL wire protocol from your workstation
The SQL port 9306 is bound to loopback and is not exposed through nginx. Tunnel it over SSH, then point any MySQL client at your local end of the tunnel:
ssh -L 9306:127.0.0.1:9306 azureuser@<vm-public-ip>
# in another terminal on your workstation:
mysql -h127.0.0.1 -P9306Step 9 - Enabling HTTPS
For any public exposure, terminate TLS in front of nginx. Point a DNS record at the VM's public IP, then use certbot to obtain and install a certificate:
sudo apt-get update
sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d search.example.comcertbot rewrites the nginx site to listen on 443 with your certificate and sets up automatic renewal. Keep the HTTP Basic Auth in place so the credential is still required over TLS. Restrict 80/tcp and 443/tcp in the NSG to the networks that need them.
Step 10 - Maintenance
- Service management:
sudo systemctl restart manticoreandsudo systemctl restart nginx. Read logs withsudo journalctl -u manticore -eand in/var/log/manticore/. - Data: real-time tables, the binlog and on-disk data live under
data_dirat/var/lib/manticore. Back it up with Manticore's own tooling (manticore-backup) or snapshot the OS disk. - Configuration:
searchdsettings live in/etc/manticoresearch/manticore.conf. The listeners are intentionally bound to127.0.0.1. Keep them loopback-only and reach the engine through the authenticated nginx proxy or an SSH tunnel. - Credential: rotate the basic auth password by regenerating the htpasswd entry in
/etc/nginx/.manticore_htpasswd(sudo htpasswd /etc/nginx/.manticore_htpasswd manticore) and reloading nginx. - Updates: run
sudo apt-get update && sudo apt-get install --only-upgrade manticore, thensudo systemctl restart manticore. OS security updates are applied automatically by unattended-upgrades.
Conclusion
You now have Manticore Search running on Ubuntu 24.04 on Azure. A real-time table is indexed and searchable over the JSON HTTP API, SQL over HTTP and the MySQL wire protocol, all behind a per-VM credential with the engine bound to loopback.
Extend it by indexing your own documents, adding full-text and attribute filters, and fronting it with TLS for production. Every SecureAnyCloud image includes 24/7 support.
Deploy on Azure
Launch Manticore Search on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
Manticore Search is an open-source search database that began life as a fork of Sphinx. It indexes documents in real time and answers full-text, vector and hybrid queries with relevance ranking, faceting and a SQL interface. It is built for the work a general-purpose database does badly: relevance-ranked text retrieval over a product catalogue or a document corpus, log and event search, and semantic retrieval over embeddings.
The SecureAnyCloud image installs Manticore Search from the project's own signed package repository, pinned to an exact version whose published checksum is verified before installation.
The important difference from a stock installation is what is exposed. Manticore performs no authentication of its own, because upstream expects it to sit on a trusted network. This image never puts it on a network that is not trusted. The SQL port, the HTTP port and the binary API port are all bound to 127.0.0.1, and nginx on port 80 is the only network-facing surface.
nginx enforces HTTP basic authentication with a 24-character password generated uniquely on each instance's first boot. No credential is baked into the image, and no two instances share one. A separate unauthenticated health endpoint is provided for load balancer probes.
What you get:
- Manticore Search 28.4.4, installed from the official signed upstream apt repository with the package checksum verified at build time and the version held so it cannot drift
- The complete bundle: the
searchddaemon, the Manticore Columnar Library, secondary indexes, KNN vector indexing, the embeddings component, Manticore Buddy and the command-line tools manticore.servicerunning as the dedicated non-rootmanticoreuser with every listener bound to127.0.0.1nginx.servicepublishing the HTTP search API on port 80 behind HTTP basic authenticationmanticoresearch-firstboot.service, which generates a unique 24-character basic authentication password on first boot and stores it bcrypt-hashed- A demo table (
demo_articles) indexed in the image, so a relevance-ranked query works on the first boot - A dedicated EBS volume mounted at
/var/lib/manticoreby filesystem identifier, holding every table, index and the binary transaction log - An unauthenticated
/healthzendpoint for load balancer and liveness probes - An Ubuntu 24.04 LTS base with the latest patches and unattended security upgrades enabled
- 24/7 SecureAnyCloud support
Prerequisites
Before you deploy this image, you need:
- An Amazon Web Services account where you can launch EC2 instances
- IAM permissions to launch instances, create security groups and subscribe to AWS Marketplace products
- An EC2 key pair in the target Region for SSH access to the instance
- A VPC and subnet in the target Region, with a security group that allows inbound port 22 from your management network and inbound port 80 from the networks that query the search API
- The AWS CLI (version 2) installed locally, if you plan to deploy from the command line
Connecting to your instance
Connect over SSH on port 22 as the default login user for the operating system variant you launched. This listing currently ships one variant, Ubuntu 24.04 LTS, and its SSH login user is ubuntu.
The search API is served on port 80 through nginx. Manticore itself listens only on 127.0.0.1 ports 9306 (SQL), 9308 (HTTP) and 9312 (binary API).
Launch the instance from the AWS Marketplace
Sign in to the AWS Management Console, open the EC2 service, and select Launch instance. Under Application and OS Images, choose AWS Marketplace AMIs and search for Manticore Search. Select the SecureAnyCloud listing, choose Select, then choose Continue on the subscription summary.
Pick an instance type of m5.large or larger. Search is memory-sensitive: the more of your working set that fits in RAM, the fewer disk reads each query needs. Size up as your corpus grows. Choose your EC2 key pair under Key pair (login).
Under Network settings, select your VPC and subnet. Create or select a security group that allows inbound port 22 from your management network and inbound port 80 from the networks that query the search API. Leave the root volume at the default size or larger. The search index lives on its own separate volume, which you can size independently at launch.
Select Launch instance. First-boot initialisation takes under a minute after the instance state becomes Running and the status checks pass.
Launch the instance from the AWS CLI
Run the command below to launch an instance from the SecureAnyCloud Manticore Search Marketplace AMI into an existing subnet and security group. Replace the values in angle brackets:
- <ami-id>: the AMI ID shown on the Marketplace listing
- <key-name>: your EC2 key pair name
- <subnet-id>: your subnet ID
- <security-group-id>: a security group that opens ports 22 and 80 as described above
aws ec2 run-instances \
--image-id <ami-id> \
--instance-type m5.large \
--key-name <key-name> \
--subnet-id <subnet-id> \
--security-group-ids <security-group-id> \
--metadata-options "HttpTokens=required,HttpEndpoint=enabled" \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=manticore-search}]'On first boot, the image resolves this instance's public address using the EC2 Instance Metadata Service (IMDSv2), so it works with HttpTokens=required enabled. That address is written into the credentials note as the endpoint you query.
Connect via SSH
Connect as the ubuntu user. The Connecting to your instance section above covers the SSH login user.
ssh ubuntu@<public-ip>The message of the day prints the endpoint and the key operational commands as soon as you log in.
Retrieve the per-instance credentials
First boot generates a unique basic authentication password for this instance and writes it, with the resolved endpoint URL, to a root-only file. Nothing secret ships inside the image, so this file is the only place the credential exists.
sudo cat /root/manticore-credentials.txtReal output from a running instance, with the password redacted:
# Manticore Search - generated on first boot by manticoresearch-firstboot.service.
# These credentials are unique to this instance. Store them somewhere safe. MANTICORE_URL=http://<public-ip>/ MANTICORE_USERNAME=admin MANTICORE_PASSWORD=<MANTICORE_PASSWORD>The file is readable by root only:
sudo stat -c '%a %U:%G %n' /root/manticore-credentials.txtReal output from a running instance:
600 root:root /root/manticore-credentials.txtConfirm the services are running
Manticore and nginx start automatically after the first-boot service has generated the per-instance password. Confirm that both are active:
systemctl is-active manticore nginxReal output from a running instance:
active activeConfirm the search database is bound to loopback only
This is the security property that matters most on this image. Manticore has no authentication of its own, so it must never be reachable from the network directly. Confirm that every Manticore port is on 127.0.0.1 and that only nginx is listening on the public interface:
ss -ltn | grep -E '9306|9308|9312|:80 'Real output from a running instance:
LISTEN 0 5 127.0.0.1:9312 0.0.0.0:* LISTEN 0 5 127.0.0.1:9306 0.0.0.0:* LISTEN 0 5 127.0.0.1:9308 0.0.0.0:* LISTEN 0 511 0.0.0.0:80 0.0.0.0:* LISTEN 0 511 [::]:80 [::]:*Port 9306 is the SQL interface over the MySQL wire protocol, 9308 is the HTTP and JSON search API and 9312 is the binary API. All three are loopback only. Port 80 is nginx.
Confirm the search API refuses unauthenticated requests
An unauthenticated request to the search API must be rejected. This check succeeds when the request is correctly refused:
if curl -s --fail -o /dev/null -m 10 -X POST 'http://127.0.0.1/sql?mode=raw' --data-urlencode 'query=SHOW TABLES'; then echo "UNEXPECTED: the search API answered without a credential" exit 1 else echo "refused - correct, the search API requires the per instance credential" fiA request carrying the wrong password is refused the same way:
if curl -s --fail -o /dev/null -m 10 -u 'admin:definitely-wrong-pw' -X POST 'http://127.0.0.1/sql?mode=raw' --data-urlencode 'query=SHOW TABLES'; then echo "UNEXPECTED: a wrong password was accepted" exit 1 else echo "refused - correct, only this instance's generated password is accepted" fiThe unauthenticated health endpoint, which exists for load balancers, is served without credentials:
curl -s -o /dev/null -w 'GET /healthz -> HTTP %{http_code}\n' http://127.0.0.1/healthzReal output from a running instance:
GET /healthz -> HTTP 200Run your first query
Manticore exposes SQL over HTTP at two endpoints. /cli returns the familiar table formatting, which is ideal from a terminal. /sql?mode=raw returns JSON, which is what an application uses. Both sit behind the same basic authentication gate.
The examples below read the password straight from the root-only file into a shell variable, so it is never typed or echoed.
P=$(sudo grep '^MANTICORE_PASSWORD=' /root/manticore-credentials.txt | cut -d= -f2-)
OUT=$(curl -s -u "admin:$P" -d 'SHOW TABLES' http://127.0.0.1/cli)
echo "$OUT"
echo "$OUT" | grep -q 'demo_articles' || {
echo "the search API did not return the demo table"; exit 1; }Real output from a running instance:
+---------------+------+ | Table | Type | +---------------+------+ | demo_articles | rt | +---------------+------+ 1 row in set (0.003 sec)demo_articles is a demo table indexed into the image so that search works before you load any data of your own. Inspect its schema:
P=$(sudo grep '^MANTICORE_PASSWORD=' /root/manticore-credentials.txt | cut -d= -f2-)
curl -s -u "admin:$P" -d 'DESC demo_articles' http://127.0.0.1/cliReal output from a running instance:
+-----------+-----------+----------------+ | Field | Type | Properties | +-----------+-----------+----------------+ | id | bigint | | | title | text | indexed stored | | content | text | indexed stored | | category | string | | | author | string | | | published | timestamp | | +-----------+-----------+----------------+ 6 rows in set (0.001 sec)title and content are full text fields, so they are tokenised and indexed for MATCH(). category, author and published are attributes, so they are available for filtering, grouping and sorting.
Relevance-ranked full-text search
MATCH() runs the full-text query and WEIGHT() exposes the relevance score, so you can order by it:
P=$(sudo grep '^MANTICORE_PASSWORD=' /root/manticore-credentials.txt | cut -d= -f2-)
HITS=$(curl -s -u "admin:$P" -d "SELECT id, title, WEIGHT() AS relevance FROM demo_articles WHERE MATCH('vector search') ORDER BY WEIGHT() DESC LIMIT 4" http://127.0.0.1/cli)
echo "$HITS"
echo "$HITS" | grep -qi 'vector' || {
echo "the full text query returned no matching document"; exit 1; }Real output from a running instance:
+---------------------+-------------------------------------------------+-----------+ | id | title | relevance | +---------------------+-------------------------------------------------+-----------+ | 7930166842906116098 | Vector search and KNN in a search database | 4500 | | 7930166842906116103 | Migrating from Sphinx to Manticore Search | 3473 | | 7930166842906116099 | Hybrid search combining keywords and embeddings | 2482 | +---------------------+-------------------------------------------------+-----------+ 3 rows in set (0.001 sec)The documents come back ranked, not merely matched. The full-text query language supports phrases ("vector search"), proximity ("vector search"~5), field limits (@title vector), boolean operators and wildcards.
Faceted counts are computed in the same round trip as the search. This is how a storefront renders its filter sidebar without extra queries:
P=$(sudo grep '^MANTICORE_PASSWORD=' /root/manticore-credentials.txt | cut -d= -f2-)
curl -s -u "admin:$P" -d 'SELECT category, COUNT(*) AS docs FROM demo_articles GROUP BY category ORDER BY docs DESC' http://127.0.0.1/cliReal output from a running instance:
+------------+------+ | category | docs | +------------+------+ | search | 5 | | operations | 2 | | indexing | 1 | | sql | 1 | | migration | 1 | +------------+------+ 5 rows in set (0.001 sec)Create your own table and index in real time
A real-time table accepts writes and makes them searchable immediately. There is no offline build step and no rebuild window. The commands below create a table, index a document into it and search it back:
P=$(sudo grep '^MANTICORE_PASSWORD=' /root/manticore-credentials.txt | cut -d= -f2-)
curl -s -u "admin:$P" -d 'DROP TABLE IF EXISTS quickstart' http://127.0.0.1/cli curl -s -u "admin:$P" -d 'CREATE TABLE quickstart (title text, body text, tag string)' http://127.0.0.1/cli curl -s -u "admin:$P" -d "INSERT INTO quickstart (title, body, tag) VALUES ('Manticore on AWS','real time indexing makes this document searchable immediately','guide')" http://127.0.0.1/cli
FOUND=$(curl -s -u "admin:$P" -d "SELECT id, title FROM quickstart WHERE MATCH('real time indexing')" http://127.0.0.1/cli)
echo "$FOUND"
echo "$FOUND" | grep -q 'Manticore on AWS' || {
echo "the document was not searchable after the insert"; exit 1; }Real output from a running instance:
Query OK, 0 rows affected (0.001 sec) Query OK, 0 rows affected (0.003 sec) Query OK, 1 row affected (0.003 sec) +---------------------+------------------+ | id | title | +---------------------+------------------+ | 7930166845154263041 | Manticore on AWS | +---------------------+------------------+ 1 row in set (0.001 sec)The document was searchable on the query immediately after the insert. Remove the scratch table when you have finished experimenting:
P=$(sudo grep '^MANTICORE_PASSWORD=' /root/manticore-credentials.txt | cut -d= -f2-)
curl -s -u "admin:$P" -d 'DROP TABLE IF EXISTS quickstart' http://127.0.0.1/cli
curl -s -u "admin:$P" -d 'SHOW TABLES' http://127.0.0.1/cliReal output from a running instance:
Query OK, 0 rows affected (0.005 sec) +---------------+------+ | Table | Type | +---------------+------+ | demo_articles | rt | +---------------+------+ 1 row in set (0.001 sec)Query the search API from your application
From outside the instance, point your application at port 80 with the generated credential. The JSON endpoint is /sql?mode=raw, which returns the result set as JSON rather than a formatted table. Replace <password> with the value from step 4.
curl -u 'admin:<password>' \
--data-urlencode "query=SELECT id, title FROM demo_articles WHERE MATCH('hybrid search')" \
'http://<public-ip>/sql?mode=raw'Manticore also exposes a JSON search API for applications that prefer a document-oriented request body, at /search, /insert, /replace, /update, /delete and /bulk. It also exposes an Elasticsearch-compatible surface at the root path. All of them are behind the same basic authentication gate on port 80.
Manticore itself performs no authentication, so treat the basic authentication credential as the only thing between the internet and your index. Restrict port 80 to the networks that need it in your security group, and put TLS in front of the endpoint before serving real traffic.
Reach the MySQL protocol port over an SSH tunnel
Port 9306 speaks the MySQL wire protocol, so any MySQL client or driver can query the search database directly. It is deliberately bound to loopback and is not exposed to the network. Instead, forward it over your SSH session from your workstation:
ssh -N -L 9306:127.0.0.1:9306 ubuntu@<public-ip>With the tunnel open, connect from a second terminal on your workstation with any MySQL client. Manticore does not use MySQL user accounts, so no username or password is required on this port. The SSH tunnel is the access control.
mysql -h 127.0.0.1 -P 9306Then issue ordinary SQL, for example SHOW TABLES; or SELECT id, title FROM demo_articles WHERE MATCH('faceted search');. The same interface is what MySQL compatible drivers, ORMs and BI tools use to talk to Manticore.
Where your data lives
Every table, its index files, the document store and the binary transaction log live in /var/lib/manticore, which is a dedicated EBS volume mounted by filesystem identifier. Keeping the index off the operating system disk means you can resize it on its own as the corpus grows.
df -h /var/lib/manticore /Real output from a running instance:
Filesystem Size Used Avail Use% Mounted on /dev/nvme1n1 59G 100K 56G 1% /var/lib/manticore /dev/root 38G 3.5G 35G 10% /To grow the index volume, modify the EBS volume in the EC2 console or with aws ec2 modify-volume. Then extend the filesystem on the instance with sudo resize2fs against the device shown in the Filesystem column above. No downtime is required, and the fstab entry needs no change, because it references the filesystem identifier rather than a device name.
Putting TLS in front of the search API
The image publishes the search API over plain HTTP on port 80, so it works the moment the instance boots with no certificate to obtain first. For production, terminate TLS in front of it. Two common approaches:
- Put the instance behind an Application Load Balancer with an AWS Certificate Manager certificate. Restrict the instance security group so that port 80 accepts traffic only from the load balancer's security group.
- Obtain a certificate for a DNS name you control and terminate TLS on the instance itself in the nginx server block at
/etc/nginx/sites-available/sac-manticore. Add alisten 443 ssl;server and redirect port 80 to it.
Validate any nginx change before applying it:
sudo nginx -tReal output from a running instance:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successfulIf the configuration test passes, apply it with sudo systemctl reload nginx.
Changing the search API password
The per-instance credential lives in an nginx htpasswd file as a bcrypt hash. To rotate it, generate a new entry and reload nginx. Replace <new-password> with your own value.
sudo htpasswd -B -c /etc/nginx/.manticore.htpasswd admin
sudo chown root:www-data /etc/nginx/.manticore.htpasswd
sudo chmod 0640 /etc/nginx/.manticore.htpasswd
sudo systemctl reload nginxhtpasswd prompts for the new password rather than taking it on the command line, so it is never written to your shell history. Remember to update /root/manticore-credentials.txt afterwards so the note stays accurate.
Maintenance
Check the installed version:
searchd --versionReal output from a running instance:
Manticore 28.4.4 f63d06ecb@26071006 (columnar 13.8.1 dd160f1@26070613) (secondary 13.8.1 dd160f1@26070613) (knn 13.8.1 dd160f1@26070613) (embeddings 1.1.1 dd160f1@26070613)Check the daemon's own view of its state:
P=$(sudo grep '^MANTICORE_PASSWORD=' /root/manticore-credentials.txt | cut -d= -f2-)
curl -s -u "admin:$P" -d "SHOW STATUS LIKE 'uptime'" http://127.0.0.1/cliRead the daemon log if a query behaves unexpectedly:
sudo tail -5 /var/log/manticore/searchd.logThe Manticore package is held at the shipped version, so an unattended upgrade cannot move you off it unexpectedly. To upgrade deliberately, release the hold, upgrade and re-apply it:
sudo apt-mark unhold manticore
sudo apt-get update && sudo apt-get install --only-upgrade manticore
sudo apt-mark hold manticore
sudo systemctl restart manticoreOperating system security updates are applied automatically by unattended upgrades.
Manticore ships a backup tool that takes a consistent copy of your tables while the daemon is running:
sudo manticore-backup --backup-dir=/var/backups --allSupport
SecureAnyCloud provides 24/7 technical support for this image by email and live chat.
- Email: sales@secureanycloud.com
- Live chat: available 24/7 on secureanycloud.com
We help with deployment, schema and index design, relevance tuning, vector and hybrid search setup, bulk loading, replication, backup, TLS termination, storage planning and upgrades.
Deploy on AWS
Launch Manticore Search on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com