Saltearse al contenido

Self-host con Docker Compose

Un stack de NamiDB self-hosted para copiar y pegar que corre en cualquier lugar donde corra Docker Compose. MinIO sostiene el bucket, namidb-server sirve el namespace sobre una API REST autenticada.

docker-compose.yml

services:
minio:
image: minio/minio
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
volumes:
- minio-data:/data
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 3s
retries: 30
bucket-init:
image: minio/mc
depends_on:
minio:
condition: service_healthy
entrypoint: >
sh -c "
mc alias set local http://minio:9000 minioadmin minioadmin &&
mc mb --ignore-existing local/namidb
"
namidb-server:
image: namidb-server:0.3 # built from crates/namidb-server/Dockerfile
depends_on:
bucket-init:
condition: service_completed_successfully
environment:
NAMIDB_STORE: "s3://namidb?ns=prod&endpoint=http://minio:9000&region=us-east-1&allow_http=true"
NAMIDB_LISTEN: "0.0.0.0:8080"
NAMIDB_AUTH_TOKEN: "${NAMIDB_AUTH_TOKEN:?set NAMIDB_AUTH_TOKEN in your env}"
NAMIDB_FLUSH_INTERVAL: "30s"
AWS_ACCESS_KEY_ID: "minioadmin"
AWS_SECRET_ACCESS_KEY: "minioadmin"
ports:
- "8080:8080"
volumes:
minio-data: {}

Levantarlo

  1. Buildear la imagen del servidor (una sola vez, desde la raíz del repo del motor):

    Ventana de terminal
    docker build -t namidb-server:0.3 \
    -f crates/namidb-server/Dockerfile .
  2. Generar un auth token:

    Ventana de terminal
    export NAMIDB_AUTH_TOKEN=$(openssl rand -hex 32)
  3. Arrancar el stack:

    Ventana de terminal
    docker compose up -d
  4. Smoke-test:

    Ventana de terminal
    curl -s http://localhost:8080/v0/health | jq .
    curl -s -X POST http://localhost:8080/v0/cypher \
    -H "Authorization: Bearer $NAMIDB_AUTH_TOKEN" \
    -H 'Content-Type: application/json' \
    -d '{"query": "CREATE (a:Person {name: \"Alice\"}) RETURN a.name AS name"}' \
    | jq .

Eso es todo. Una base de datos en grafo, tus datos en disco en MinIO, una API REST autenticada en :8080.

Llevarlo a un cloud real

Cambiar una sola env var. Todo lo demás queda igual:

environment:
NAMIDB_STORE: "s3://my-bucket?ns=prod&region=us-east-1"
# NAMIDB_STORE: "s3://my-bucket?ns=prod&endpoint=https://<ACCOUNT_ID>.r2.cloudflarestorage.com&region=auto"
# NAMIDB_STORE: "gs://my-bucket?ns=prod"
# NAMIDB_STORE: "az://acct/container?ns=prod"

Mismo motor, misma imagen de Docker. El object storage es la fuente de verdad.

Ver también