Docker Deployment

Containerized deployment with bind mounts for persistence.

Dockerfile

FROM python:3.12-slim

WORKDIR /app

# Install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Install SQLite with FTS5
RUN apt-get update && apt-get install -y sqlite3 && rm -rf /var/lib/apt/lists/*

# Copy application
COPY . .

# Create data directory
RUN mkdir -p /data

EXPOSE 8090

ENV MNEMOSYNE_DATA_DIR=/data

CMD ["python", "-m", "mnemosyne"]

docker-compose.yml

version: "3.8"

services:
mnemosyne:
  build: .
  ports:
    - "8090:8090"
  volumes:
    - mnemosyne-data:/data
  environment:
    - MNEMOSYNE_DATA_DIR=/data
    - OPENAI_API_KEY=***
  restart: unless-stopped
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:8090/health"]
    interval: 30s
    timeout: 10s
    retries: 3

volumes:
mnemosyne-data:

Run

docker-compose up -d

Health Check

curl http://localhost:8090/health

Backup Volume

# Create backup
docker run --rm -v mnemosyne-data:/data -v $(pwd):/backup alpine tar czf /backup/mnemosyne-backup.tar.gz -C /data .

# Restore
docker run --rm -v mnemosyne-data:/data -v $(pwd):/backup alpine tar xzf /backup/mnemosyne-backup.tar.gz -C /data
Bind Mount vs Named Volume

Use named volumes (as shown above) for production. Bind mounts to host directories work for development but can cause permission issues.