# your domain, e.g https://example.com APP_URL=http://localhost:3000 PORT=3000 # minimum of 32 characters. Generate one with: openssl rand -hex 32 APP_SECRET=REPLACE_WITH_LONG_SECRET JWT_TOKEN_EXPIRES_IN=30d DATABASE_URL="postgresql://postgres:password@localhost:5432/docmost?schema=public" REDIS_URL=redis://127.0.0.1:6379 # options: local | s3 | azure STORAGE_DRIVER=local # S3 driver config AWS_S3_ACCESS_KEY_ID= AWS_S3_SECRET_ACCESS_KEY= AWS_S3_REGION= AWS_S3_BUCKET= AWS_S3_ENDPOINT= AWS_S3_FORCE_PATH_STYLE= # Azure Blob Storage driver config AZURE_STORAGE_ACCOUNT_NAME= AZURE_STORAGE_ACCOUNT_KEY= AZURE_STORAGE_CONTAINER= # default: 50mb FILE_UPLOAD_SIZE_LIMIT= # options: smtp | postmark MAIL_DRIVER=smtp MAIL_FROM_ADDRESS=hello@example.com MAIL_FROM_NAME=Docmost # SMTP driver config SMTP_HOST=127.0.0.1 SMTP_PORT=587 SMTP_USERNAME= SMTP_PASSWORD= SMTP_SECURE=false SMTP_IGNORETLS=false # Postmark driver config POSTMARK_TOKEN= # for custom drawio server DRAWIO_URL= # Gotenberg URL for server-side PDF export GOTENBERG_URL= DISABLE_TELEMETRY=false # Allow other sites to embed Docmost in an iframe. IFRAME_EMBED_ALLOWED=false # Only used when IFRAME_EMBED_ALLOWED=true. When empty, any origin is allowed. # Example: https://intranet.example.com,https://portal.example.com IFRAME_ALLOWED_ORIGINS= # Enable debug logging in production (default: false) DEBUG_MODE=false # Log database queries DEBUG_DB=false # Log http requests LOG_HTTP=false # MCP server (community): service account the embedded MCP uses to talk to this Docmost instance MCP_DOCMOST_EMAIL= MCP_DOCMOST_PASSWORD= # MCP_DOCMOST_API_URL=http://127.0.0.1:3000/api # Optional bearer token to protect the /mcp endpoint. If unset, /mcp relies on # the workspace MCP toggle and network isolation (do not expose the port publicly). # MCP_TOKEN= # MCP_SESSION_IDLE_MS=1800000 # Per-embedding-call timeout in milliseconds for the RAG indexer. # A slow/hung embeddings endpoint fails after this and the batch continues. # AI_EMBEDDING_TIMEOUT_MS=120000 # --- Anonymous public-share AI assistant --- # Opt-in per workspace (AI settings -> "public share assistant"; off by default). # When enabled, anonymous visitors of a published share can ask an AI about that # share at POST /api/shares/ai/stream. The assistant is read-only and hard-scoped # to the single share tree, but every call spends real tokens on the workspace # owner's configured AI provider. # # DEPLOYMENT REQUIREMENT: the per-IP rate limit on this endpoint is only # effective behind a trusted reverse proxy that OVERWRITES (not appends) # X-Forwarded-For with the real client IP. The app runs with trustProxy, so # without such a proxy an attacker can rotate X-Forwarded-For to evade the # per-IP limit. Put this endpoint (and the app) behind a proxy you control that # sets X-Forwarded-For to the real client IP. # # Backstop: a cluster-wide, sliding-window cap per workspace (IP-independent, # keyed by the server-resolved workspace id) bounds the owner's bill even if the # per-IP limit is fully evaded. It is a COST backstop, not an access control, # and FAILS OPEN if Redis is unavailable. Override the hourly cap below # (default: 300 calls per workspace per rolling hour). # SHARE_AI_WORKSPACE_MAX_PER_HOUR=300