Skip to main content

Docker Deployment

Deploy rstmdb using Docker and Docker Compose.

Quick Start

# Run with defaults
docker run -p 7401:7401 rstmdb/rstmdb

# With persistent storage
docker run -p 7401:7401 -v rstmdb-data:/data rstmdb/rstmdb

# With authentication
docker run -p 7401:7401 \
-e RSTMDB_AUTH_REQUIRED=true \
-e RSTMDB_AUTH_TOKEN_HASH=<sha256-hash> \
-v rstmdb-data:/data \
rstmdb/rstmdb

Docker Image

Available Tags

TagDescription
latestLatest stable release
x.y.zSpecific version
mainLatest development build

Image Details

  • Base: Debian Bookworm Slim
  • User: rstmdb (non-root)
  • Data directory: /data
  • Config directory: /etc/rstmdb
  • Default port: 7401
  • Metrics port: 9090

Docker Compose

Basic Setup

# docker-compose.yml
version: '3.8'

services:
rstmdb:
image: rstmdb/rstmdb:latest
ports:
- "7401:7401"
- "9090:9090"
volumes:
- rstmdb-data:/data
environment:
- RUST_LOG=info
restart: unless-stopped

volumes:
rstmdb-data:

With Authentication

version: '3.8'

services:
rstmdb:
image: rstmdb/rstmdb:latest
ports:
- "7401:7401"
volumes:
- rstmdb-data:/data
- ./tokens:/etc/rstmdb/tokens:ro
environment:
- RSTMDB_AUTH_REQUIRED=true
- RSTMDB_AUTH_SECRETS_FILE=/etc/rstmdb/tokens
restart: unless-stopped

volumes:
rstmdb-data:

With TLS

version: '3.8'

services:
rstmdb:
image: rstmdb/rstmdb:latest
ports:
- "7401:7401"
volumes:
- rstmdb-data:/data
- ./certs:/etc/rstmdb/certs:ro
environment:
- RSTMDB_TLS_ENABLED=true
- RSTMDB_TLS_CERT=/etc/rstmdb/certs/server.pem
- RSTMDB_TLS_KEY=/etc/rstmdb/certs/server-key.pem
restart: unless-stopped

volumes:
rstmdb-data:

With Custom Config

version: '3.8'

services:
rstmdb:
image: rstmdb/rstmdb:latest
ports:
- "7401:7401"
- "9090:9090"
volumes:
- rstmdb-data:/data
- ./config.yaml:/etc/rstmdb/config.yaml:ro
environment:
- RSTMDB_CONFIG=/etc/rstmdb/config.yaml
restart: unless-stopped

volumes:
rstmdb-data:

Production Setup

version: '3.8'

services:
rstmdb:
image: rstmdb/rstmdb:latest
ports:
- "7401:7401"
expose:
- "9090"
volumes:
- rstmdb-data:/data
- ./config:/etc/rstmdb:ro
environment:
- RSTMDB_CONFIG=/etc/rstmdb/config.yaml
deploy:
resources:
limits:
memory: 2G
reservations:
memory: 512M
healthcheck:
test: ["CMD", "rstmdb-cli", "-s", "localhost:7401", "ping"]
interval: 10s
timeout: 5s
retries: 3
restart: unless-stopped
logging:
driver: json-file
options:
max-size: "100m"
max-file: "3"

volumes:
rstmdb-data:

Building the Image

From Source

# Dockerfile
FROM rust:1.75-bookworm as builder

WORKDIR /build
COPY . .
RUN cargo build --release

FROM debian:bookworm-slim

RUN useradd -r -s /bin/false rstmdb && \
mkdir -p /data /etc/rstmdb && \
chown -R rstmdb:rstmdb /data /etc/rstmdb

COPY --from=builder /build/target/release/rstmdb /usr/local/bin/
COPY --from=builder /build/target/release/rstmdb-cli /usr/local/bin/

USER rstmdb
WORKDIR /data

ENV RSTMDB_BIND=0.0.0.0:7401
ENV RSTMDB_DATA=/data
ENV RUST_LOG=info

EXPOSE 7401 9090

CMD ["rstmdb"]

Build:

docker build -t rstmdb:local .

Volume Management

Named Volumes

# Create volume
docker volume create rstmdb-data

# Run with volume
docker run -v rstmdb-data:/data rstmdb/rstmdb

# Inspect volume
docker volume inspect rstmdb-data

# Backup volume
docker run --rm -v rstmdb-data:/data -v $(pwd):/backup alpine \
tar czf /backup/rstmdb-backup.tar.gz -C /data .

# Restore volume
docker run --rm -v rstmdb-data:/data -v $(pwd):/backup alpine \
sh -c "rm -rf /data/* && tar xzf /backup/rstmdb-backup.tar.gz -C /data"

Bind Mounts

# Create local directory
mkdir -p ./rstmdb-data
chown 1000:1000 ./rstmdb-data # Match container user

# Run with bind mount
docker run -v $(pwd)/rstmdb-data:/data rstmdb/rstmdb

Environment Variables

All configuration options are available as environment variables:

docker run \
-e RSTMDB_BIND=0.0.0.0:7401 \
-e RSTMDB_DATA=/data \
-e RSTMDB_AUTH_REQUIRED=true \
-e RSTMDB_AUTH_TOKEN_HASH=abc123... \
-e RSTMDB_COMPACT_ENABLED=true \
-e RSTMDB_COMPACT_EVENTS=10000 \
-e RUST_LOG=info \
rstmdb/rstmdb

Health Checks

Docker Health Check

healthcheck:
test: ["CMD", "rstmdb-cli", "-s", "localhost:7401", "ping"]
interval: 10s
timeout: 5s
retries: 3
start_period: 5s

External Health Check

# Using docker exec
docker exec rstmdb rstmdb-cli ping

# Using TCP check
docker run --rm --network container:rstmdb alpine nc -zv localhost 7401

Networking

Bridge Network

version: '3.8'

services:
rstmdb:
image: rstmdb/rstmdb:latest
networks:
- backend

app:
image: your-app:latest
networks:
- backend
environment:
- RSTMDB_SERVER=rstmdb:7401

networks:
backend:

Host Network

For maximum performance:

docker run --network host rstmdb/rstmdb

Logging

View Logs

# Follow logs
docker logs -f rstmdb

# Last 100 lines
docker logs --tail 100 rstmdb

Log Drivers

services:
rstmdb:
logging:
driver: json-file
options:
max-size: "100m"
max-file: "5"

Or use external logging:

services:
rstmdb:
logging:
driver: fluentd
options:
fluentd-address: localhost:24224
tag: rstmdb

Kubernetes

See Kubernetes Deployment for Kubernetes-specific configuration.

Quick Kubernetes Example

apiVersion: apps/v1
kind: Deployment
metadata:
name: rstmdb
spec:
replicas: 1
selector:
matchLabels:
app: rstmdb
template:
metadata:
labels:
app: rstmdb
spec:
containers:
- name: rstmdb
image: rstmdb/rstmdb:latest
ports:
- containerPort: 7401
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: rstmdb-data