Docker Compose
Remem’s Community Edition core is a single Rust service, remem-server: the REST
API, embedded storage engine, embedding service, and MCP server (Streamable HTTP at
/mcp), all in one container. Docker Compose is the supported way to run it.
Services
Section titled “Services”- remem-server — REST API (Axum), embedded storage engine, embedding service, MCP (Streamable HTTP at
/mcp). Listens on4545.
Prerequisites
Section titled “Prerequisites”- Docker and Docker Compose
- 2GB+ RAM free
Pull the image
Section titled “Pull the image”docker pull rememorg/remem-community:server-latestdocker-compose.yml
Section titled “docker-compose.yml”This is the whole stack — no config file required to get started:
services: remem-server: image: rememorg/remem-community:server-latest container_name: remem-server ports: - "4545:4545" volumes: - ./data/remem:/var/lib/remem environment: - RUST_LOG=info - REMEM_ALLOW_AUTH_DISABLED=true # dev only — see "Enabling authentication" below networks: - remem-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:4545/api/v1/ready"] interval: 30s timeout: 10s retries: 3 start_period: 60s restart: unless-stopped
networks: remem-network: driver: bridge name: remem-networkNo config.toml is mounted here — remem-server runs on built-in defaults (port
4545, 384-dim embeddings, standard HNSW/task settings). If you want to tune any of
that (storage paths, HNSW parameters, auto-discovery threshold, task schedules), see
Configuration for the full file and mount it at
/etc/remem/config.toml:ro — remem-server picks it up automatically when present.
The start_period: 60s on remem-server’s healthcheck exists because the embedding
model loads on first boot; give it a minute before expecting healthy.
Starting
Section titled “Starting”docker compose up -ddocker compose psVerifying
Section titled “Verifying”curl http://localhost:4545/api/v1/health
# MCP server (Streamable HTTP, in-process)curl -sf -X POST http://localhost:4545/mcp \ -H 'content-type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'Both work with no Authorization header because REMEM_ALLOW_AUTH_DISABLED=true is
set above — every other endpoint (/api/v1/memories, /mcp, etc.) is unauthenticated
in this dev configuration. See “Enabling authentication” below before exposing this
beyond your local machine.
Enabling authentication
Section titled “Enabling authentication”Auth is fail-closed: leaving both REMEM_API_KEY unset and
REMEM_ALLOW_AUTH_DISABLED unset makes remem-server return HTTP 500 on every
non-health request rather than silently allowing access. To turn on real auth, set a
key and drop the disable flag:
environment: - REMEM_API_KEY=${REMEM_API_KEY} # REMEM_ALLOW_AUTH_DISABLED removedREMEM_API_KEY=$(openssl rand -hex 32) docker compose up -dThen every request (except /api/v1/health, /api/v1/ready, /api/v1/openapi.json)
needs the key:
curl http://localhost:4545/api/v1/memories \ -H "Authorization: Bearer $REMEM_API_KEY"# or: -H "X-API-Key: $REMEM_API_KEY"Accessing
Section titled “Accessing”- REST API:
http://localhost:4545 - MCP (Streamable HTTP):
http://localhost:4545/mcp— or run theremem-mcpbinary as a stdio bridge, see Connecting an LLM client via MCP
Updating
Section titled “Updating”docker compose pulldocker compose up -dRemem uses WAL-backed storage — updates are safe without stopping writes first.
Observability (Business — Coming soon)
Section titled “Observability (Business — Coming soon)”Prometheus metrics scraping and pre-built Grafana dashboards are not part of the Community Edition Compose stack. They ship as part of the Business Edition’s observability tooling and are not available today.
