HelixDB is an open-source graph-vector database built from scratch in Rust.
docker pull ghcr.io/chrislusf/seaweedfs
docker run -d --name helix-db -p 18120:18120 --restart always ghcr.io/chrislusf/seaweedfs:4.47@sha256:ce9e796f1fe6f06968f4c04bdaf8f678dad9c8acdfef3d244133d71bfa6bf882
podman run -d --name helix-db -p 18120:18120 --restart always ghcr.io/chrislusf/seaweedfs:4.47@sha256:ce9e796f1fe6f06968f4c04bdaf8f678dad9c8acdfef3d244133d71bfa6bf882
skopeo inspect docker://ghcr.io/chrislusf/seaweedfs:4.47@sha256:ce9e796f1fe6f06968f4c04bdaf8f678dad9c8acdfef3d244133d71bfa6bf882
oras pull ghcr.io/chrislusf/seaweedfs:4.47@sha256:ce9e796f1fe6f06968f4c04bdaf8f678dad9c8acdfef3d244133d71bfa6bf882
docker compose up -d
services:
seaweedfs:
image: ghcr.io/chrislusf/seaweedfs:4.47@sha256:ce9e796f1fe6f06968f4c04bdaf8f678dad9c8acdfef3d244133d71bfa6bf882
platform: ${HELIX_IMAGE_PLATFORM:?HELIX_IMAGE_PLATFORM must be set}
command:
- mini
- -dir=/data
- -bucket=helix-db
- -s3.config=/etc/seaweedfs/s3.json
- -master.telemetry=false
- -admin.ui=false
- -webdav=false
- -s3.port.iceberg=0
- -s3.port.lance=0
restart: unless-stopped
configs:
- source: seaweedfs-s3
target: /etc/seaweedfs/s3.json
volumes:
- seaweedfs-data:/data
healthcheck:
# A signed HEAD proves the S3 gateway, the static identity, and the
# startup-created bucket are all ready before Helix opens its store.
test:
- CMD
- curl
- -fsS
- -o
- /dev/null
- --max-time
- "2"
- -I
- --aws-sigv4
- aws:amz:us-east-1:s3
- --user
- helix:helix-local-secret
- http://127.0.0.1:8333/helix-db
interval: 1s
timeout: 5s
retries: 120
# Test-only request logger. Helix reaches SeaweedFS through it so the idle
# refresh regression can observe every object GET and its Range header.
s3-trace:
image: ghcr.io/nginx/nginx-unprivileged:1.30.5-alpine@sha256:4714e0b1b2577eaa1a6131d07c958b67f0eb68e6d0521e90c6e5287db8cf0bc5
platform: ${HELIX_IMAGE_PLATFORM:?HELIX_IMAGE_PLATFORM must be set}
restart: unless-stopped
depends_on:
seaweedfs:
condition: service_healthy
volumes:
- ./s3-trace.conf:/etc/nginx/conf.d/default.conf:ro
helix:
image: ${HELIX_IMAGE_REF:?HELIX_IMAGE_REF must be set}
platform: ${HELIX_IMAGE_PLATFORM:?HELIX_IMAGE_PLATFORM must be set}
pull_policy: never
restart: unless-stopped
depends_on:
seaweedfs:
condition: service_healthy
s3-trace:
condition: service_started
ports:
- "${HELIX_IMAGE_TEST_PORT:-18120}:8080"
# S3 storage always caches on local disk, in /var/cache/helix unless
# HELIX_DISK_CACHE_DIR moves it. On tmpfs every container start begins
# cold, so reopened reads must come from SeaweedFS and reach the trace.
# Reads repeated after that are served from the cache and never traced,
# so the idle refresh check proves only that idle refreshes fetch no
# uncached SST ranges. A tmpfs root is root-owned 0755 unless its mode
# lets the 65532 runtime user write, and the explicit budget stays within
# its size, where the 8 GiB default would not fit and fail startup.
tmpfs:
- /var/cache/helix:mode=1777,size=2g
environment:
HELIX_DISK_CACHE_BYTES: "1073741824"
S3_BUCKET: helix-db
S3_REGION: us-east-1
DB_PATH: db/
AWS_ACCESS_KEY_ID: helix
AWS_SECRET_ACCESS_KEY: helix-local-secret
AWS_ENDPOINT: http://s3-trace:8333
AWS_ALLOW_HTTP: "true"
configs:
seaweedfs-s3:
content: |
{
"identities": [
{
"name": "helix",
"credentials": [
{"accessKey": "helix", "secretKey": "helix-local-secret"}
],
"actions": ["Read:helix-db", "Write:helix-db", "List:helix-db"]
}
]
}
volumes:
seaweedfs-data: