# ============================================
# Paperlib MCP - Self-contained Docker Compose
# ============================================
# 一键启动完整环境(PostgreSQL + MinIO + MCP Server)
services:
# ==========================================
# PostgreSQL with pgvector
# ==========================================
postgres:
image: pgvector/pgvector:pg16
container_name: paperlib-postgres
environment:
POSTGRES_USER: ${POSTGRES_USER:-paper}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-paper}
POSTGRES_DB: ${POSTGRES_DB:-paperlib}
volumes:
- ${DATA_DIR:-./data}/postgres:/var/lib/postgresql/data
- ./initdb:/docker-entrypoint-initdb.d:ro
ports:
- "${POSTGRES_PORT:-5432}:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-paper} -d ${POSTGRES_DB:-paperlib}"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
# ==========================================
# MinIO Object Storage (S3 Compatible)
# ==========================================
minio:
image: minio/minio:latest
container_name: paperlib-minio
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minio}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minio123}
command: server /data --console-address ":9001"
volumes:
- ${DATA_DIR:-./data}/minio:/data
ports:
- "${MINIO_API_PORT:-9000}:9000"
- "${MINIO_CONSOLE_PORT:-9001}:9001"
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
# ==========================================
# MinIO Bucket Initialization
# ==========================================
minio-init:
image: minio/mc:latest
container_name: paperlib-minio-init
depends_on:
minio:
condition: service_healthy
entrypoint: >
/bin/sh -c "
mc alias set local http://minio:9000 ${MINIO_ROOT_USER:-minio} ${MINIO_ROOT_PASSWORD:-minio123};
mc mb local/${MINIO_BUCKET:-papers} --ignore-existing;
exit 0;
"
# ==========================================
# Paperlib MCP Server
# ==========================================
paperlib-mcp:
build:
context: .
dockerfile: Dockerfile
container_name: paperlib-mcp
environment:
# PostgreSQL
POSTGRES_USER: ${POSTGRES_USER:-paper}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-paper}
POSTGRES_DB: ${POSTGRES_DB:-paperlib}
POSTGRES_HOST: postgres
POSTGRES_PORT: 5432
# MinIO
MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minio}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minio123}
MINIO_BUCKET: ${MINIO_BUCKET:-papers}
S3_ENDPOINT: http://minio:9000
# OpenRouter
OPENROUTER_API_KEY: ${OPENROUTER_API_KEY}
EMBEDDING_MODEL: ${EMBEDDING_MODEL:-openai/text-embedding-3-small}
LLM_MODEL: ${LLM_MODEL:-openai/gpt-4o-mini}
depends_on:
postgres:
condition: service_healthy
minio:
condition: service_healthy
minio-init:
condition: service_completed_successfully
# MCP Server runs in STDIO mode, typically invoked by client
# For standalone testing, you can exec into the container
stdin_open: true
tty: true
restart: unless-stopped
# ==========================================
# Database Admin (Optional)
# ==========================================
adminer:
image: adminer:latest
container_name: paperlib-adminer
ports:
- "${ADMINER_PORT:-8080}:8080"
depends_on:
- postgres
restart: unless-stopped
profiles:
- admin # 只在需要时启动: docker-compose --profile admin up