openGemini
This image ships openGemini 1.4.1 on Ubuntu 24.04 LTS, configured and ready to accept authenticated writes and queries from the first boot of every deployed virtual machine.
openGemini is an open source distributed time series database purpose built for metrics, observability and IoT workloads. It ingests and queries high volumes of time stamped measurements over a simple HTTP API, stores them efficiently with columnar compression, and speaks a familiar InfluxQL style query language. It runs perfectly well as a single node, which is how this image ships, and scales out to a distributed cluster when you need one.
What makes this image different
openGemini is an open-source distributed time series database. This SecureAnyCloud image runs the single-node server on Ubuntu 24.04 LTS with authentication enforced from the first boot. Three design choices set it apart from a stock install.
Authentication is enforced, not optional. Out of the box, openGemini ships with HTTP authentication disabled, so every write and query is permitted without credentials. This image never runs that way. The server is configured with auth-enabled = true, and a random administrator password unique to your virtual machine is generated on first boot. An unauthenticated query is refused with 401.
No credential is baked into the image. The entire openGemini data, metadata and write-ahead-log tree is destroyed before the image is captured, so no user, database or build-time password can ride into your virtual machine. A first-boot service creates a pristine store and generates the per-VM administrator credential. It also creates the default SecureAnyCloud database and writes the credential to a root-only file. There is no default login anywhere in the image.
Internal ports stay private. Only the HTTP query and write API on port 8086 is reachable off the machine. The meta, store, RPC and internal service ports are all bound to 127.0.0.1, and the Marketplace plan opens port 22 only. Section 7 shows how to reach the API safely and how to open it to your own virtual network when you need to.
1. Deploy the virtual machine
Deploy from the Azure Marketplace listing, or use the Marketplace image URN with the Azure CLI. The recommended size is Standard_B2s or larger.
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:opengemini-ubuntu-24-04:default:latest
az vm create \
--resource-group my-resource-group \
--name my-opengemini-vm \
--image sac1647283583153:opengemini-ubuntu-24-04:default:latest on Ubuntu 24.04 LTS by sac" \
--size Standard_B2s \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku Standard2. Connect to the virtual machine
Connect over SSH, using the public IP address of the VM:
ssh azureuser@<vm-ip>3. Confirm openGemini is running
Check the service status:
systemctl status opengemini.service --no-pagerThe service is a native systemd unit and starts automatically on boot. A companion first-boot unit, opengemini-firstboot.service, generates the per-VM administrator credential described above.
Confirm the version:
ts-server version 2>&1 | grep -a singlesingle: 1.4.1The HTTP API also answers an unauthenticated liveness probe, which suits a load balancer or health check:
curl -sS -o /dev/null -w 'ping returns HTTP %{http_code}\n' http://localhost:8086/pingping returns HTTP 2044. Retrieve your credential
First boot generates a random administrator password and writes it to a file that only root can read. Print the file:
sudo cat /root/opengemini-credentials.txtThe output looks like this, with a password value unique to your virtual machine:
# openGemini — Per-VM Credentials (generated on first boot; unique to this VM).
# Stored in plain text ONLY here (0600 root:root). Keep it safe. OPENGEMINI_USER=admin OPENGEMINI_PASSWORD=<OPENGEMINI_PASSWORD> OPENGEMINI_HTTP_ENDPOINT=http://<vm-ip>:8086 OPENGEMINI_DEFAULT_DATABASE=sac5. Run your first query
openGemini exposes an HTTP query API that speaks an InfluxQL-style language and returns JSON. Every query must authenticate. List the databases:
curl -sS -u 'admin:<OPENGEMINI_PASSWORD>' -G 'http://localhost:8086/query' \
--data-urlencode 'q=SHOW DATABASES' | jq .{ "results": [ { "statement_id": 0, "series": [ { "name": "databases", "columns": ["name"], "values": [["sac"]] } ] } ] }Then confirm that an unauthenticated request is refused:
curl -sS -o /dev/null -w 'anonymous query returns HTTP %{http_code}\n' \
-G 'http://localhost:8086/query' --data-urlencode 'q=SHOW DATABASES'anonymous query returns HTTP 4016. Write and read time series data
Writes use the line protocol and go to the /write endpoint. A point is a measurement, optional tags, one or more fields and an optional timestamp in nanoseconds. This example writes a weather reading into the default SecureAnyCloud database:
NOW=$(date +%s000000000)
curl -sS -o /dev/null -w 'write returns HTTP %{http_code}\n' \
-u 'admin:<OPENGEMINI_PASSWORD>' \
-XPOST 'http://localhost:8086/write?db=sac' \
--data-binary "weather,location=london temperature=17.4,humidity=71 ${NOW}"write returns HTTP 204Read the point back. Written points become queryable within a few seconds:
curl -sS -u 'admin:<OPENGEMINI_PASSWORD>' -G 'http://localhost:8086/query' \
--data-urlencode 'db=sac' \
--data-urlencode 'q=SELECT * FROM weather' | jq .{ "results": [ { "statement_id": 0, "series": [ { "name": "weather", "columns": ["time", "humidity", "location", "temperature"], "values": [["2026-07-19T05:31:56Z", 71, "london", 17.4]] } ] } ] }openGemini supports aggregation, grouping and time bucketing. Write a small series, then run an aggregate over it:
NOW=$(date +%s000000000)
curl -sS -o /dev/null -w 'batch write HTTP %{http_code}\n' \
-u 'admin:<OPENGEMINI_PASSWORD>' \
-XPOST 'http://localhost:8086/write?db=sac' \
--data-binary "weather,location=paris temperature=19.1,humidity=64 ${NOW} weather,location=berlin temperature=15.8,humidity=80 ${NOW}"curl -sS -u 'admin:<OPENGEMINI_PASSWORD>' -G 'http://localhost:8086/query' \
--data-urlencode 'db=sac' \
--data-urlencode 'q=SELECT MEAN(temperature) AS mean_temp, MAX(humidity) AS max_humidity FROM weather' | jq '.results[0].series'7. Network posture, and opening openGemini to your virtual network
The HTTP API listens on all interfaces on port 8086. Every internal port is bound to loopback only. Check the listeners:
ss -tln | grep -E ':(8086|8087|8088|8091|8092|8400|8401) 'LISTEN 0 4096 0.0.0.0:8086 0.0.0.0:* LISTEN 0 4096 127.0.0.1:8087 0.0.0.0:* LISTEN 0 4096 127.0.0.1:8088 0.0.0.0:* LISTEN 0 4096 127.0.0.1:8091 0.0.0.0:* LISTEN 0 4096 127.0.0.1:8092 0.0.0.0:* LISTEN 0 4096 127.0.0.1:8400 0.0.0.0:* LISTEN 0 4096 127.0.0.1:8401 0.0.0.0:*Port 8086 is the authenticated query and write API. The meta port 8091, the RPC port 8092, the store ports 8400 and 8401 and the flight port 8087 are all on 127.0.0.1. They are not reachable from outside the machine. The Marketplace plan opens port 22 only.
Reach openGemini from your workstation without opening any port
The simplest safe approach is an SSH tunnel. Nothing is exposed to the network:
ssh -L 8086:localhost:8086 azureuser@<vm-ip>Then point any client on your own machine at http://localhost:8086.
Open the API to your own virtual network
The HTTP API already listens on all interfaces. To let another host in your virtual network reach it, open the port in the network security group to your virtual network's address range only. Never open a database port to 0.0.0.0/0.
az network nsg rule create --resource-group my-resource-group --nsg-name my-nsg \
--name allow-opengemini-vnet --priority 1001 --access Allow --protocol Tcp \
--destination-port-ranges 8086 --source-address-prefixes 10.0.0.0/16Authentication is already enforced, so the API requires credentials from the moment you expose it. For traffic that crosses a network, enable HTTPS. Set https-enabled = true with a certificate and key in the [http] section of /etc/opengemini/openGemini.conf, then restart the service.
8. Managing users and databases
Create an additional database:
curl -sS -u 'admin:<OPENGEMINI_PASSWORD>' -G 'http://localhost:8086/query' \
--data-urlencode 'q=CREATE DATABASE metrics' | jq .Create a non-administrator user and grant it read and write access on a single database:
curl -sS -u 'admin:<OPENGEMINI_PASSWORD>' -G 'http://localhost:8086/query' \
--data-urlencode "q=CREATE USER app WITH PASSWORD 'Str0ng!AppPass2026'" | jq .curl -sS -u 'admin:<OPENGEMINI_PASSWORD>' -G 'http://localhost:8086/query' \
--data-urlencode 'q=GRANT ALL ON metrics TO app' | jq .openGemini enforces password complexity and rejects weak passwords, so choose a strong value. List the users to confirm:
curl -sS -u 'admin:<OPENGEMINI_PASSWORD>' -G 'http://localhost:8086/query' \
--data-urlencode 'q=SHOW USERS' | jq .9. Configuration and data locations
The single-node configuration lives at /etc/opengemini/openGemini.conf. The data, metadata and write-ahead log live under /var/lib/opengemini, and logs are written to /var/log/opengemini. Confirm the unit file location and the data directory contents:
sudo systemctl show -p FragmentPath opengemini.service ls -1 /var/lib/opengeminiAfter editing the configuration, restart the service:
sudo systemctl restart opengemini10. Keeping openGemini patched
The operating system and every apt-managed component on this image patch normally with apt-get update && apt-get upgrade. Unattended upgrades run exactly as they do on stock Ubuntu.
openGemini itself is not an apt package. This image installs the official upstream release binary, pinned to version 1.4.1 and verified against its published checksum before installation.
To move to a newer openGemini release, download the official tarball for that version from the openGemini releases page and verify its checksum. Install the ts-server binary over /usr/local/bin/ts-server, then restart the service. Alternatively, use the republished SecureAnyCloud image, which is rebuilt on a freshly patched base.
11. Licence
openGemini is licensed under the Apache License 2.0. Read the full licence text on the image:
cat /usr/share/doc/sac/opengemini-LICENSESupport
SecureAnyCloud supports this image. If you hit a problem with the image, contact sales@secureanycloud.com. For questions about openGemini itself, see the upstream project documentation at docs.opengemini.org.
Deploy on Azure
Launch openGemini on Ubuntu 24.04 LTS by SecureAnyCloud with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
openGemini is a high-performance, open-source distributed time series database built for metrics, observability and Internet of Things telemetry. This image runs it as a single-node server on Amazon EC2, with authentication enforced and the data on a dedicated EBS volume.
openGemini speaks the InfluxDB HTTP API. You write points in the Influx line protocol and query them back in InfluxQL, so existing metric writers, Telegraf outputs and Grafana InfluxQL data sources connect with minimal change. It is licensed under Apache 2.0, so there is no vendor lock-in or licence ambiguity for commercial and SaaS deployments.
The single-node server (ts-server) is installed under /usr/local/bin. It runs as a dedicated unprivileged opengemini system account under a systemd service that starts it on boot and restarts it on failure. The time series store lives at /var/lib/opengemini, a dedicated, independently resizable EBS data volume, so the database stays off the operating system disk.
openGemini ships with HTTP authentication disabled by default. This image turns it on. The config sets auth-enabled = true, and a unique admin password is generated on the first boot of every deployed instance, so two instances launched from the same Amazon Machine Image never share a password. The password is written to /root/opengemini-credentials.txt with mode 0600, so only the root user can read it.
The HTTP query and write API binds on port 8086, while the internal meta, store and RPC ports bind to the loopback interface only. The recommended security group opens SSH alone, so the database is not reachable from the internet until you add a scoped ingress rule or connect over an SSH tunnel.
Prerequisites
Before you deploy this image, make sure you have:
- 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
- The AWS CLI (version 2) installed locally, if you plan to deploy from the command line
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 openGemini. Select the SecureAnyCloud listing and choose Select, then Continue on the subscription summary.
Pick an instance type of m5.large or larger. Choose your EC2 key pair under Key pair (login). Under Network settings, select your VPC and subnet, and create or select a security group that opens port 22 from your management network. Leave the root volume at the default size or larger. The time series store is on a separate data volume.
Select Launch instance. First-boot initialisation takes a few seconds 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 openGemini Marketplace AMI into an existing subnet and security group. Replace <ami-id> with the AMI ID shown on the Marketplace listing and <key-name> with your EC2 key pair name. Replace <subnet-id> with your subnet ID and <security-group-id> with a security group that opens port 22 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> \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=opengemini}]'When the instance reaches the Running state and its status checks pass, note its public IP address or DNS name. You can find it in the EC2 console or with aws ec2 describe-instances.
Connect to your instance
Connect over SSH using your key pair. On the Ubuntu 24.04 variant, the SSH login user is ubuntu.
ssh -i <key-name>.pem ubuntu@<public-ip>Retrieve the admin password
The openGemini admin password is unique to your instance and is generated on first boot. Read it as root:
sudo cat /root/opengemini-credentials.txtThe file lists the HTTP endpoint, the admin user (admin), the generated password and the default database (SecureAnyCloud). Keep the password somewhere safe.
Confirm openGemini is running
Over SSH, confirm that the service is active. Also confirm that the HTTP API port is listening while the internal ports stay on loopback:
systemctl is-active opengemini ss -tlnp | grep -E ':(8086|8088|8091|8092) 'The service reports active. The HTTP query and write API listens on 0.0.0.0:8086, and the meta and RPC ports (8088, 8091, 8092) are bound to 127.0.0.1 only.
Verify authentication is enforced
openGemini answers the /ping liveness probe without credentials, but every query and write requires HTTP Basic authentication. Confirm that an unauthenticated query is rejected:
curl -s -o /dev/null -w 'unauthenticated query returned HTTP %{http_code}\n' \
-G 'http://127.0.0.1:8086/query' --data-urlencode 'q=SHOW DATABASES'A correctly hardened instance returns HTTP 401. A wrong password is refused in the same way.
Query openGemini with InfluxQL
Read the generated password into a shell variable and list the databases. The default SecureAnyCloud database is created on first boot.
PW=$(sudo grep '^OPENGEMINI_PASSWORD=' /root/opengemini-credentials.txt | cut -d= -f2-)
curl -s -u "admin:$PW" -G 'http://127.0.0.1:8086/query' \
--data-urlencode 'q=SHOW DATABASES'The response is JSON listing the databases, including SecureAnyCloud.
Write and read points over the line protocol
Write a point in the InfluxDB line protocol to the SecureAnyCloud database, then read it back with an InfluxQL SELECT. This proves the full ingest and query round trip.
PW=$(sudo grep '^OPENGEMINI_PASSWORD=' /root/opengemini-credentials.txt | cut -d= -f2-)
TS=$(date +%s000000000)
curl -s -o /dev/null -w 'write returned HTTP %{http_code}\n' \
-u "admin:$PW" -XPOST 'http://127.0.0.1:8086/write?db=sac' \
--data-binary "cpu,host=example value=0.64 ${TS}"
curl -s -u "admin:$PW" -G 'http://127.0.0.1:8086/query' \
--data-urlencode 'db=sac' \
--data-urlencode 'q=SELECT * FROM cpu'The write returns HTTP 204. The query returns the cpu measurement with the value you wrote, which confirms that ingest and query work end to end.
Remote access
The recommended security group opens SSH only, so the database is not exposed to the internet by default. To reach the HTTP API from your workstation, open an SSH tunnel and point your client at the tunnelled port:
ssh -L 8086:127.0.0.1:8086 ubuntu@<public-ip>With the tunnel open, http://127.0.0.1:8086 on your workstation reaches openGemini on the instance. Sign in with the admin credentials.
If you need direct network access instead, add a security group ingress rule for TCP 8086, scoped tightly to the source networks that write and query metrics. Keep authentication enforced. Do not open 8086 to the whole internet without TLS termination in front.
Connect Grafana
Add openGemini to Grafana as an InfluxDB data source that uses the InfluxQL query language. Set the URL to the instance endpoint, which is http://127.0.0.1:8086 over the tunnel or your scoped address. Set the database to SecureAnyCloud, enable basic authentication, and enter user admin with the generated password.
openGemini answers the InfluxDB HTTP query API, so existing InfluxQL dashboards and Telegraf InfluxDB outputs work against it.
Check the data volume
The time series store lives on a dedicated EBS volume mounted at /var/lib/opengemini. This keeps the database off the operating system disk and lets you resize or snapshot it independently. Confirm the mount:
df -h /var/lib/opengeminiTo grow the store, expand the EBS volume in the AWS console. Then grow the filesystem on the instance with sudo resize2fs on the underlying device. The data, meta and wal subdirectories all live on this volume.
Back up and maintain
Back up the database by snapshotting the /var/lib/opengemini EBS volume, which captures the entire time series store.
Apply operating system security updates with sudo apt-get update && sudo apt-get upgrade. Reboot when a new kernel is installed. openGemini starts automatically on boot.
To change server settings, edit /etc/opengemini/openGemini.conf and run sudo systemctl restart opengemini.
Support
SecureAnyCloud publishes and supports this image. Support covers deployment, ingestion and retention tuning, InfluxDB line protocol and Grafana integration, credential management, TLS and storage. Contact SecureAnyCloud through the support channel listed on the AWS Marketplace listing.
All product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
Deploy on AWS
Launch openGemini on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com