Skip to content
getgeolens.com

Configuration Reference

The operator-facing environment variables for GeoLens, their defaults, and descriptions. Unless noted otherwise, set these in the .env file at the project root. A few quota and policy settings (flagged below) are managed only from the admin UI and are not read from .env.

VariableDefaultRequiredDescription
POSTGRES_DBgeolensYesPostgreSQL database name
POSTGRES_USERgeolensYesPostgreSQL superuser username
POSTGRES_PASSWORDNone (required)YesPostgreSQL superuser password. Generate with openssl rand -base64 24.
POSTGRES_HOSTlocalhostNoDatabase hostname (application default localhost). Docker Compose sets this to db, the database service name.
POSTGRES_PORT5432NoDatabase port (internal). The host-mapped port is configured separately.
VariableDefaultRequiredDescription
JWT_SECRET_KEYNone (required)YesSecret key for signing JWT tokens. Generate with openssl rand -hex 32. Must be at least 32 chars; the boot validator also rejects six well-known public placeholders (change-me, secret, etc.).
JWT_ALGORITHMHS256NoJWT signing algorithm
ACCESS_TOKEN_EXPIRE_MINUTES15NoJWT access-token lifetime in minutes
REFRESH_TOKEN_EXPIRE_DAYS7NoJWT refresh-token lifetime in days
GEOLENS_ADMIN_USERNAMENone (required)YesUsername for the automatically created admin account
GEOLENS_ADMIN_PASSWORDNone (required)YesPassword for the initial admin account
REGISTRATION_ENABLEDfalseNoWhether self-registration is enabled. When false, only admins can create users.
EMAIL_VERIFICATION_REQUIREDtrueAdmin UI onlyManaged on the admin Auth tab — not read from .env. The value shown is the built-in default. Require new self-registered accounts to verify their email address before first login. Only relevant when REGISTRATION_ENABLED=true; requires a configured SMTP channel to deliver the verification email.
LANDING_FIRSTfalseNoRedirect unauthenticated visits to / to the login page instead of the catalog (admin-overridable, “Login-as-Landing Page”). Useful for demo or lead-capture front doors.
PASSWORD_MIN_LENGTH12NoMinimum password length, enforced at every password entry point (register, change-password, admin create, SAML->local conversion).
PASSWORD_REQUIRE_CLASSES3NoNumber of character classes required out of 4 (lowercase, uppercase, digit, symbol). Accepts 1 to 4.
VariableDefaultRequiredDescription
UPLOAD_MAX_SIZE_MB500NoMaximum upload file size in megabytes
UPLOAD_STAGING_DIR/app/stagingNoDirectory for temporary file storage during ingestion/export. Must be writable by the API runtime user (uid:gid 1001:1001). Mapped to upload_staging Docker volume.
UPLOAD_ALLOWED_EXTENSIONS.zip,.gpkg,.geojson,.json,.csv,.tif,.tiff,.xlsx,.xls,.parquetNoComma-separated list of allowed file extensions for upload. Note: an admin-saved override in Admin → Storage takes precedence over this default — existing deployments that customized the list must add new extensions (such as .parquet) there
PRESIGNED_MULTIPART_THRESHOLD_MB100NoFiles larger than this (MB) use multipart presigned S3 URLs. Only applies when STORAGE_PROVIDER=s3.
INGEST_HTTP_TIMEOUT_SECONDS300NoGDAL_HTTP_TIMEOUT passed to ogr2ogr during remote-fetched ingest. Raise for very large datasets; lower for fail-fast ingest debugging.
MAX_STORAGE_BYTES_PER_USER0Admin UI onlyManaged on the admin Storage tab — not read from .env. Per-user storage quota in bytes; 0 = unlimited. The value shown is the built-in default.
MAX_DATASETS_PER_USER0Admin UI onlyManaged on the admin Storage tab — not read from .env. Per-user dataset-count quota; 0 = unlimited. The value shown is the built-in default.

UPLOAD_STAGING_DIR writability requirement

Section titled “UPLOAD_STAGING_DIR writability requirement”

GeoLens validates staging writability at startup and before export execution. Both UPLOAD_STAGING_DIR and ${UPLOAD_STAGING_DIR}/exports must allow write access for the API runtime user.

Quick validation command:

Terminal window
docker compose exec api sh -lc '\
dir=${UPLOAD_STAGING_DIR:-/app/staging}; \
mkdir -p "$dir/exports" && \
touch "$dir/.geolens-write-test" "$dir/exports/.geolens-write-test" && \
rm -f "$dir/.geolens-write-test" "$dir/exports/.geolens-write-test"'

If this command fails, fix ownership/permissions on the mounted path or set UPLOAD_STAGING_DIR to a writable directory, then restart the API container.

VariableDefaultRequiredDescription
PROCRASTINATE_SCHEMAcatalogNoPostgreSQL schema for the Procrastinate job queue tables
INGEST_JOBS_RETENTION_DAYS30NoDays to retain finished ingest job records before pruning; 0 disables pruning.
VariableDefaultRequiredDescription
PUBLIC_APP_URLhttp://localhost:8080NoBrowser-facing app URL. Used for share links and OAuth redirect URIs.
PUBLIC_API_URLhttp://localhost:8080/apiNoExternally-reachable API base URL. Used in OGC self/collection/next link hrefs.
PUBLIC_BASE_URLNoneNoDeprecated. Will be removed in a future release. Legacy alias for PUBLIC_API_URL. Use PUBLIC_API_URL instead. The application logs a deprecation warning at startup when this is set.
VariableDefaultRequiredDescription
CORS_ALLOWED_ORIGINS"" (same-origin only)NoComma-separated list of allowed origins for cross-origin API requests. Required when the frontend is served from a different domain than the API.
VariableDefaultRequiredDescription
TILE_CACHE_TTL300NoTile cache TTL in seconds
TILE_SIGNING_SECRETNone (falls back to JWT_SECRET_KEY)NoSecret for signing tile request URLs. Set separately when you want to rotate tile secrets without invalidating JWT tokens.
CDN_BASE_URLNoneNoCDN origin URL for tile delivery. When set, the frontend requests tiles from this URL instead of the API.
VariableDefaultRequiredDescription
LOG_JSONfalseNoOutput logs in structured JSON format. Recommended for production. Controls log output only; Swagger/ReDoc exposure is governed by ENVIRONMENT (see Deployment / Security posture).
LOG_LEVELINFONoLog level. Options: DEBUG, INFO, WARNING, ERROR, CRITICAL.
VariableDefaultRequiredDescription
STORAGE_PROVIDERlocalNoStorage backend for uploaded files. Options: local, s3, azure.
S3_ENDPOINTNoneWhen s3S3-compatible endpoint URL. Leave unset for AWS S3. For MinIO: http://minio:9000.
S3_BUCKETNoneWhen s3S3 bucket name.
S3_ACCESS_KEY_IDNoneWhen s3S3 access key ID.
S3_SECRET_ACCESS_KEYNoneWhen s3S3 secret access key.
S3_REGIONus-east-1NoS3 region.
S3_ALLOW_HTTPfalseNoAllow HTTP (non-TLS) connections to S3 endpoint. Enable for local MinIO.
S3_ADDRESSING_STYLEautoNoS3 addressing style. Options: auto, path, virtual. Use path for MinIO.

Set STORAGE_PROVIDER=azure and configure a container plus one authentication path: either a connection string, or an account URL with an access key (leave the key unset to use managed identity / Entra ID).

VariableDefaultRequiredDescription
AZURE_STORAGE_CONTAINERNoneWhen azureBlob container name (e.g. geolens-prod).
AZURE_STORAGE_CONNECTION_STRINGNoneOne auth pathFull connection string (also used for Azurite). Provide this or AZURE_STORAGE_ACCOUNT_URL.
AZURE_STORAGE_ACCOUNT_URLNoneOne auth pathAccount blob endpoint, https://<account>.blob.core.windows.net.
AZURE_STORAGE_ACCOUNT_KEYNoneWith account URL + key authStorage account access key. Leave unset (with AZURE_STORAGE_ACCOUNT_URL set) to authenticate via managed identity / Entra ID.
VariableDefaultRequiredDescription
DATABASE_URL_OVERRIDENoneNoFull PostgreSQL connection URL for managed databases (RDS, Cloud SQL). Overrides individual POSTGRES_* variables.
DATABASE_SSL_MODEpreferNoDatabase SSL mode. Options: disable, prefer, require, verify-full.
DATABASE_SSL_CA_CERTNoneWhen verify-fullPath to CA certificate file for database SSL verification.
DATABASE_POOL_PRE_PINGtrueNoEnable connection pool pre-ping to detect broken connections before use. Adds slight latency per checkout. Set to false only if you need to disable this for a specific environment.
DB_USE_EXTERNAL_POOLERfalseNoEnable external connection pooler mode (PgBouncer, RDS Proxy). Disables prepared statements.

These variables control the SQLAlchemy connection pool. Ignored when DB_USE_EXTERNAL_POOLER is true.

VariableDefaultRequiredDescription
DB_POOL_SIZE10NoMaximum number of persistent connections in the pool.
DB_MAX_OVERFLOW3NoMaximum number of additional connections beyond DB_POOL_SIZE. Tuned down from SQLAlchemy’s default to fit the connection budget below.
DB_POOL_TIMEOUT30NoSeconds to wait for a connection from the pool before raising an error.
DB_POOL_RECYCLE1800NoSeconds after which a connection is recycled (replaced). Prevents stale connections with managed databases.
TILE_POOL_MIN_SIZE2NoMinimum connections in the dedicated asyncpg tile query pool.
TILE_POOL_MAX_SIZE10NoMaximum connections in the dedicated asyncpg tile query pool.
VariableDefaultRequiredDescription
REDIS_URLNoneNoRedis/Valkey connection URL for cross-instance caching. Leave unset for in-memory caching (single-instance default). Example: redis://valkey:6379/0.

These variables configure the default-on backup service. Off-site upload stays disabled until BACKUP_S3_ENABLED=true.

VariableDefaultRequiredDescription
BACKUP_SCHEDULE0 2 * * *NoCron expression for automated database backups. Default: daily at 2:00 AM UTC.
BACKUP_RETENTION_DAILY7NoNumber of daily backups to retain locally.
BACKUP_RETENTION_WEEKLY4NoNumber of weekly (Sunday) backups to retain locally.
BACKUP_S3_ENABLEDfalseNoEnable off-site backup upload to S3-compatible storage. Uses S3_* credentials.
BACKUP_MEM_LIMIT512mNoMemory cap for the backup container (the nightly pg_dump + tar peaks around 300 MB).

Optional email (SMTP) and webhook alerts for signup, ingest, and health events. Everything defaults to off, so existing deployments are unaffected until NOTIFICATIONS_ENABLED=true and at least one channel is configured. See Backups & Restore and Infrastructure & Monitoring for the operational context.

VariableDefaultRequiredDescription
NOTIFICATIONS_ENABLEDfalseNoMaster toggle. When false, all notification sends are a no-op regardless of channel config.
SMTP_HOSTNoneNoSMTP server hostname. Configure together with SMTP_USERNAME, SMTP_PASSWORD, and SMTP_FROM_ADDRESS to enable the email channel.
SMTP_PORT587NoSMTP server port.
SMTP_USERNAME / SMTP_PASSWORDNoneNoSMTP credentials (secret; never rendered in logs).
SMTP_FROM_ADDRESSNoneNoFrom address for outbound email.
SMTP_USE_TLStrueNoUse STARTTLS for the SMTP connection.
NOTIFICATION_WEBHOOK_URLNoneNoIncoming-webhook endpoint (Slack, Teams, or custom) that receives JSON notifications.
NOTIFICATION_WEBHOOK_SECRETNoneNoOptional HMAC signing secret for webhook payloads.
NOTIFICATION_ADMIN_EMAILNoneNoRecipient for event alerts. Falls back to SMTP_FROM_ADDRESS when unset.
NOTIFY_ON_SIGNUPfalseNoSend an alert when a new account registers.
NOTIFY_ON_INGEST_COMPLETEfalseNoSend an alert when an ingest finishes successfully.
NOTIFY_ON_INGEST_FAILEDfalseNoSend an alert when an ingest fails.
NOTIFY_ON_HEALTH_ALERTfalseNoSend an alert when the health check reports a degraded status (cooldown-deduplicated).

These are environment-only settings (not stored in the admin settings database) because the channel credentials are secrets.

VariableDefaultRequiredDescription
WORKER_CONCURRENCY1NoNumber of jobs the background worker processes concurrently.
WORKER_QUEUESpriority,ingest,rasterNoComma-separated list of job queues the worker consumes, in priority order.
WORKER_SHUTDOWN_TIMEOUT30NoGraceful shutdown timeout for the background worker in seconds
VariableDefaultRequiredDescription
ENV_ONLY_CONFIGfalseNoWhen true, all admin-overridable settings are locked to their environment values. The PersistentConfig DB layer is bypassed for reads and returns 403 on writes. Use for hardened production deployments where operators want to prevent runtime configuration changes via the admin UI.
VariableDefaultRequiredDescription
ENVIRONMENT(unset)NoDeployment environment: development or production. When production, the API hides its docs (/api/docs and /api/redoc return 404) and sets the Secure flag on the OAuth session cookie. When unset, the posture falls back to LOG_JSON for backward compatibility. Set ENVIRONMENT=production on any public, TLS-terminated deployment.

Deployment knobs (running outside Docker Compose)

Section titled “Deployment knobs (running outside Docker Compose)”

These knobs matter when the frontend image fronts the API outside the bundled Compose stack (bare containers, Kubernetes, the community Helm chart). Under stock Docker Compose the defaults are correct and you can leave them unset.

VariableDefaultRequiredDescription
API_UPSTREAMhttp://api:8000NoWhere the frontend’s nginx proxies /api, raster tiles, and embeds. Set to the API Service’s fully qualified name on Kubernetes. Trailing slashes are stripped.
NGINX_RESOLVERfirst nameserver in /etc/resolv.conf, else 127.0.0.11NoDNS resolver nginx uses to resolve API_UPSTREAM. Bare IPv6 resolvers are bracketed automatically.
CLIENT_MAX_BODY_SIZE500mNoUpload ceiling enforced by the frontend nginx. Invalid values fail fast at boot. Keep this at or above UPLOAD_MAX_SIZE_MB.
TRUSTED_PROXY_CIDRS(empty)NoComma/space-separated CIDRs of proxies trusted to set X-Forwarded-For/-Proto (e.g. Cloudflare’s published ranges). Required for correct client IPs and anonymous raster rate limiting behind a load balancer or CDN. Empty treats the direct peer as the client.

For a non-AWS S3 backend, the API and worker derive AWS_S3_ENDPOINT, AWS_HTTPS, and AWS_VIRTUAL_HOSTING from the S3_* settings above automatically; you do not normally set them by hand.

GeoLens supports two AI subsystems: inference (chat, map generation, metadata drafts) and embeddings (semantic search). They can use different providers.

API keys are set exclusively via environment variables. All other AI settings (provider, model, base URL) can also be overridden at runtime from the admin Settings > AI tab.

VariableDefaultRequiredDescription
ANTHROPIC_API_KEYNoneNoAnthropic API key. When set, Anthropic is the default inference provider.
LLM_MODELclaude-sonnet-5NoDefault Anthropic model name (admin-overridable).
MAX_AI_TOKENS_PER_USER_PER_DAY0Admin UI onlyManaged on the admin AI tab — not read from .env. Per-user daily AI token budget; 0 = unlimited. The value shown is the built-in default.
OPENAI_API_KEYNoneNoOpenAI-compatible API key. Used for inference when Anthropic key is absent, and always used for embeddings.
OPENAI_MODELgpt-4oNoDefault OpenAI-compatible model name (admin-overridable).
OPENAI_BASE_URLNoneNoCustom endpoint for OpenAI-compatible providers (Ollama, Groq, Together). Leave unset for default OpenAI.

Embeddings always use the OpenAI-compatible API. Anthropic does not provide an embedding endpoint.

VariableDefaultRequiredDescription
EMBEDDING_MODELtext-embedding-3-smallNoEmbedding model name (admin-overridable).
EMBEDDING_DIMS1536NoExpected vector dimensions (admin-overridable, auto-detectable from admin UI).
EMBEDDING_BASE_URLNoneNoSeparate endpoint for embeddings. Falls back to OPENAI_BASE_URL if unset.

Anthropic inference + OpenAI embeddings (recommended):

Terminal window
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...

OpenAI for everything:

Terminal window
OPENAI_API_KEY=sk-...

Anthropic inference + Ollama embeddings:

Terminal window
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=ollama # any non-empty value
EMBEDDING_BASE_URL=http://ollama:11434/v1
EMBEDDING_MODEL=nomic-embed-text

Ollama for everything:

Terminal window
OPENAI_API_KEY=ollama # any non-empty value
OPENAI_BASE_URL=http://ollama:11434/v1
OPENAI_MODEL=llama3
EMBEDDING_MODEL=nomic-embed-text

These variables control which ports are exposed on the Docker host. They do not affect internal container communication.

VariableDefaultDescription
DB_PORT5432Host port for PostgreSQL. Set to 5434 in .env.example to avoid conflicts.
API_PORT8000Host port for the FastAPI backend. Set to 8001 in .env.example.
FRONTEND_PORT8080Host port for the frontend.

These are fixed inside Docker containers and are not configurable:

ServicePortProtocol
PostgreSQL (db)5432TCP
FastAPI (api)8000HTTP
Worker (worker)8001HTTP (health only)
Titiler (titiler)8000HTTP
Frontend (frontend)5173HTTP (Vite dev server)
VolumePurposeMount Point
pgdataPostgreSQL data persistence/var/lib/postgresql/data on db
upload_stagingUploaded file staging area/app/staging on api
Terminal window
# Database
POSTGRES_DB=geolens
POSTGRES_USER=geolens
POSTGRES_PASSWORD=secure-db-password
# Auth
JWT_SECRET_KEY=a1b2c3d4e5f6... # Use: openssl rand -hex 32
GEOLENS_ADMIN_USERNAME=admin
GEOLENS_ADMIN_PASSWORD=secure-admin-password
# AI (optional; omit to disable AI features)
ANTHROPIC_API_KEY=sk-ant-... # Inference (chat, map generation)
OPENAI_API_KEY=sk-... # Embeddings (semantic search)
# Ports (non-default to avoid conflicts)
DB_PORT=5434
API_PORT=8001
FRONTEND_PORT=8080