diff --git a/.env b/.env index fa03e98..9dce744 100644 --- a/.env +++ b/.env @@ -1,24 +1,16 @@ # Deployment configuration for mcp.nearle.ai.in. # -# --------------------------------------------------------------------------- -# SET THESE TWO IN DOKPLOY - they are NOT in this file: +# Committed at the repo owner's instruction so the deploy does not depend on +# re-entering config in the Dokploy UI. Everything needed to boot is here; no +# environment variables are required in Dokploy any more. # -# DB_HOST your Postgres host (the service name, if it is a Dokploy -# service - inside a container "localhost" is the container) -# DB_PASSWORD your Postgres password +# A real environment variable still overrides anything set here - settings.py +# calls load_dotenv() without override=True, so the process environment wins. +# That is the escape hatch for changing a value without a commit. # -# A real environment variable overrides anything set here: settings.py calls -# load_dotenv() without override=True, so the process environment wins. That is -# why the two database secrets are left as FILL-ME below - Dokploy supplies -# them, and they never enter git. -# --------------------------------------------------------------------------- -# -# Everything else is committed, including the auth secrets, at the repo owner's -# explicit instruction. Be aware of what that means: AUTH_SECRET_KEY signs every -# access token, so anyone who can read this repository can mint a valid admin -# token for the API. Rotating it later does not remove it from git history. -# Rotate with `python scripts/make_auth_secrets.py` and redeploy if that -# assumption ever stops holding. +# WHAT IS IN THIS FILE: live database, S3 and Google credentials, and the key +# that signs every access token. Anyone with read access to this repository has +# all of it, and git history keeps it after any rotation. # --- Ports ----------------------------------------------------------------- # Dokploy routes the domain to 3000; 8000 is kept for the vite dev proxy and @@ -26,61 +18,95 @@ PORTS=3000,8000 # --- CORS ------------------------------------------------------------------ -# The FRONTEND's origin, not this API's. If this is wrong the browser blocks -# every response while the server logs healthy 200s. +# The FRONTEND's origin, not this API's. Wrong value = the browser blocks every +# response while the server logs healthy 200s. API_CORS_ORIGINS=https://catalogue.nearle.ai.in # --- Authentication -------------------------------------------------------- AUTH_ENABLED=true + +# Freshly generated for this deployment - deliberately NOT the values from the +# development .env. Those hashes are for the passwords DevAdmin!2026 and +# DevUser!2026, which are sitting in plaintext in test_login_fix.py in this very +# repository: shipping them would publish working admin credentials. +# Sign-in passwords for the hashes below are in SIGNIN_PASSWORDS.txt (ignored). AUTH_SECRET_KEY=4Kmyr4Cjf_kdUIq_4EGxo5vFHfCT5_uKVR3eouszB8Le6F0n45m7eDY94_KJoqSz AUTH_ADMIN_USERNAME=admin AUTH_ADMIN_PASSWORD_HASH=pbkdf2_sha256$600000$Xa07unPO4LeTU4bz04eh7Q==$KmZ2ZBrclJ0z0sDiCoKOrfTO2UK8e7hjsZZ6HB2PY9o= AUTH_USER_USERNAME=user AUTH_USER_PASSWORD_HASH=pbkdf2_sha256$600000$65VMpqwUSyFzCqnhlwBqgQ==$sMVnar+Hnp5ZmXcObFNI3jJMxqnVrW8naLZNFFh0KCw= + AUTH_TOKEN_TTL_MINUTES=720 AUTH_MAX_LOGIN_ATTEMPTS=10 AUTH_LOCKOUT_SECONDS=300 + +# MUST stay false here. The development .env has this true, where it is a +# convenience: it skips the password check entirely, so any username signs in +# and `admin` gets the admin pages. On a host published to the internet it means +# anyone who finds mcp.nearle.ai.in signs in as admin by typing anything at all. AUTH_ALLOW_ANY_LOGIN=false # Machine consumers. Empty: MCP clients authenticate with a login token instead. API_KEYS= # --- Postgres / pgvector --------------------------------------------------- -# Inside a container `localhost` is the container itself. If Postgres runs as -# another Dokploy service, DB_HOST is that service's name, not localhost. +# DB_NAME is not set in the development .env, so it falls back to settings.py's +# default. Stated explicitly here so the deployment does not depend on that +# default staying the same. USE_PGVECTOR=true -DB_HOST=FILL-ME-postgres-host -DB_PORT=5432 +DB_HOST=31.97.228.132 +DB_PORT=6054 DB_NAME=pgvector -DB_USER=postgres -DB_PASSWORD=FILL-ME-postgres-password +DB_USER=admin +DB_PASSWORD=Package@321# # --- Embeddings ------------------------------------------------------------ USE_EMBEDDINGS=true EMBEDDINGS_MODEL=sentence-transformers/all-MiniLM-L6-v2 EMBEDDINGS_DIM=384 -# --- Ollama ---------------------------------------------------------------- -# Off unless an Ollama host is reachable from the container. Leaving it on with -# nothing listening makes /api/chat fail and adds ~3s to every healthcheck, -# because the health handler probes it with a 3s timeout. +# --- Ollama (local LLM, powers /api/chat) ---------------------------------- +# Off, because the development value (http://localhost:11434) cannot work from +# inside a container: there, localhost is the container itself, not the VPS +# host. Left on with nothing listening, /api/chat fails AND every healthcheck +# takes ~3s longer, because the health handler probes Ollama with a 3s timeout. +# +# To enable: set USE_OLLAMA=true and point OLLAMA_BASE_URL at something the +# container can actually reach - http://host.docker.internal:11434 with a +# host-gateway mapping, the VPS's LAN IP, or an ollama service name. USE_OLLAMA=false OLLAMA_BASE_URL=http://host.docker.internal:11434 OLLAMA_MODEL_NAME=qwen2.5:1.5b OLLAMA_TIMEOUT_SECONDS=120 -# --- Optional integrations ------------------------------------------------- -USE_S3=false -USE_GOOGLE_CSE=false +# --- DigitalOcean Spaces (product image storage) --------------------------- +USE_S3=true +S3_ACCESS_KEY=DO801G8Q8JAZKF49U3WJ +S3_SECRET_KEY=lBQExYfkVqH+ybmGVmQH5MkThBbrIohA/VQLgcPUvug +S3_ENDPOINT=https://nearle.sgp1.digitaloceanspaces.com +S3_BUCKET=nearle +S3_REGION=sgp1 -# Image sources used during catalog ingestion. +# --- Google Custom Search (optional image source) -------------------------- +USE_GOOGLE_CSE=true +GOOGLE_API_KEY=AIzaSyBY4pIO_Fp5FCMqeVxDNcfalzdWNHJWVn0 +GOOGLE_CSE_ID=9745cbd96dd164562 + +# --- Open-source image sources (no key needed) ----------------------------- USE_DDG_IMAGES=true USE_OPEN_FACTS=true USE_WIKIMEDIA=true -# Playwright's browser binary is not installed in the image, so this tier is -# skipped at runtime regardless; false keeps it from being attempted. +# The Playwright browser binary is NOT installed in the image (see Dockerfile), +# so this tier is skipped at runtime regardless. false stops it being attempted. USE_PLAYWRIGHT_FALLBACK=false +MIN_IMAGE_BYTES=3000 + +# --- Product validation ---------------------------------------------------- +ENABLE_PRODUCT_VALIDATION=true +VALIDATION_REJECT_THRESHOLD=0.35 +VALIDATION_REVIEW_THRESHOLD=0.70 + # --- RAG ------------------------------------------------------------------- RAG_DEFAULT_TOP_K=5 RAG_MAX_TOP_K=15