Skip to main content

Configuration reference

The whole configuration lives in the file .env in the bundle folder. setup.sh creates it from .env.example, which documents every setting with comments. This page lists the settings in the same groups.

  • Set by setup.sh means that setup.sh fills the value: secrets are generated once when empty, and derived values are rewritten from the public URL and the TLS mode on every run. Do not edit derived values by hand; run setup.sh instead.
  • A setting shown as (commented out) is present in .env.example but inactive until you remove the #.

Apply changes with docker compose up -d.

Release​

SettingDefaultMeaning
GOAT_VERSIONthe bundle's releaseThe GOAT version all images use. See Upgrades.
GOAT_REGISTRYghcr.io/plan4better/goatWhere the GOAT images are pulled from, e.g. an internal mirror

Public address and TLS​

SettingDefaultMeaning
GOAT_PUBLIC_URLasked by setup.shThe URL users type into the browser, without a trailing slash
GOAT_TLSautoauto, custom, internal or off; see HTTPS and addresses
GOAT_ACME_EMAILemptyOptional contact for Let's Encrypt expiry notices (auto only)
GOAT_TRUSTED_PROXIESprivate_rangesAddresses allowed to set X-Forwarded-* headers (your load balancer), as CIDRs separated by spaces
GOAT_ADMIN_ALLOW_CIDRS0.0.0.0/0 ::/0Networks allowed to open the Keycloak admin console under /keycloak/admin
GOAT_CA_BUNDLEemptyPath inside the containers of extra CA certificates (PEM) in ./certs, e.g. your company CA for your load balancer, Keycloak, SMTP relay or the model server of the AI assistant; set by setup.sh in internal mode. See Company CA.
GOAT_HTTP_PORT80Port for HTTP; set by setup.sh from the URL or --http-port
GOAT_HTTPS_PORT443Port for HTTPS; set by setup.sh from the URL
GOAT_HOSTNAME, GOAT_NETWORK_ALIAS, GOAT_SITE_ADDRESS, GOAT_HTTPS_PUBLISH, GOAT_KEYCLOAK_SSL_REQUIREDDerived; set by setup.sh

Profiles​

SettingDefaultMeaning
COMPOSE_PROFILESgarage,keycloakThe bundled components to run: garage (object storage), keycloak (login server), backup (nightly backups)

Authentication​

SettingDefaultMeaning
AUTHTrueTrue: users log in through Keycloak. False: no login, everybody acts as one built-in administrator (local and demo installs only).
GOAT_ADMIN_EMAILasked by setup.shThe first GOAT user, created in the bundled Keycloak on the first start
GOAT_ADMIN_PASSWORDset by setup.shPassword of the first user
REALM_NAMEgoatKeycloak realm GOAT uses
KEYCLOAK_CLIENT_IDgoatKeycloak client GOAT uses
KEYCLOAK_CLIENT_SECRETset by setup.shSecret of that client
KEYCLOAK_ADMIN_PASSWORDset by setup.shPassword of the user admin in the Keycloak admin console
KEYCLOAK_PROVISION_INVITED_USERStrueCreate the login account in Keycloak when someone is invited whose email has none yet
ALLOW_ORGANIZATION_CREATIONtruetrue: anyone who signs in without an organization can set one up. false: only accounts with the Keycloak realm role superuser can; everyone else waits for an invitation. See Who sets up organizations.
KEYCLOAK_DB_PASSWORDset by setup.shDatabase password of the bundled Keycloak
KEYCLOAK_PUBLIC_URL, KEYCLOAK_INTERNAL_URL(commented out)Your own Keycloak; see Your own Keycloak
AUTH_ALLOWED_CLIENTS(commented out)Keycloak clients whose tokens GOAT's APIs accept, comma-separated; empty accepts every client of the realm. A list must include KEYCLOAK_CLIENT_ID. See A realm shared with other applications

Object storage (S3)​

SettingDefaultMeaning
S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEYset by setup.shAccess key for the bundled Garage, or your own S3 key
GARAGE_RPC_SECRET, GARAGE_ADMIN_TOKENset by setup.shInternal secrets of the bundled Garage
S3_ENDPOINT_URL, S3_PUBLIC_ENDPOINT_URL, S3_REGION, S3_BUCKET_NAME, S3_FORCE_PATH_STYLE(commented out)Your own S3; see Your own S3 storage
ASSETS_S3_ENDPOINT_URL, ASSETS_BUCKET_NAME, ASSETS_URL(commented out)The publicly readable bucket for avatars and images on your own S3
ASSETS_SERVED_BY_COREfalsetrue: images in the uploads bucket, served by GOAT, for S3 without a public bucket

Database​

The memory defaults suit a 16 GB machine. As a rule of thumb, set POSTGRES_SHARED_BUFFERS to about 1/4 and POSTGRES_EFFECTIVE_CACHE_SIZE to about 3/4 of the RAM you give PostgreSQL.

SettingDefaultMeaning
POSTGRES_PASSWORDset by setup.shPassword of the GOAT database
WINDMILL_DB_PASSWORDset by setup.shPassword of the Windmill database
POSTGRES_SHARED_BUFFERS1GBPostgreSQL shared_buffers
POSTGRES_EFFECTIVE_CACHE_SIZE3GBPostgreSQL effective_cache_size
POSTGRES_MAX_CONNECTIONS200PostgreSQL max_connections
POSTGRES_POOL_SIZE5Connection pool size of the Core API
POSTGRES_MAX_OVERFLOW10Extra connections the Core API may open beyond the pool

GOAT's services name their database sessions after themselves (goat-core, goat-geoapi, goat-processes, goat-tools, …), so pg_stat_activity shows which one holds a connection. On the Windmill database, sessions without a goat- name are Windmill's own. Windmill holds at most 10 connections to its database for the server and 3 for every worker (DATABASE_CONNECTIONS in compose.yaml).

Jobs (Windmill)​

SettingDefaultMeaning
WINDMILL_ADMIN_PASSWORDset by setup.shPassword of admin@windmill.dev in the Windmill interface
GOAT_TOOLS_WORKERS2Number of analysis jobs that run in parallel; each tools worker may use up to 4 GB of RAM
WINDMILL_LOCAL_PORT8110Port of the Windmill interface, bound to 127.0.0.1 only; see Windmill
GOAT_BASE_DATA_URLhttps://goat-base-data.plan4better.de/Source of the routing and public transport base data; see Routing base data

Web app secrets​

SettingDefaultMeaning
NEXTAUTH_SECRETset by setup.shSigning key for the web app's login sessions

Optional integrations​

SettingDefaultMeaning
NEXT_PUBLIC_MAPTILER_KEYemptyMapTiler key for the satellite/hybrid basemap (hidden when empty)
NEXT_PUBLIC_MAPBOX_TOKENemptyMapbox token for the place search
CATALOG_S3_BUCKET, CATALOG_S3_ENDPOINT_URL, CATALOG_S3_ACCESS_KEY_ID, CATALOG_S3_SECRET_ACCESS_KEY, CATALOG_S3_REGIONemptyThe GOAT data catalog (read-only bucket with the harmonised datasets). The OpenStreetMap and Overture Maps panes under Add layer β€Ί Fetch / Connect data read their mirror from the same bucket; see OpenStreetMap and Overture Maps.
GEOCODING_URL, GEOCODING_AUTHORIZATIONemptyGeocoding service used by analysis tools
NEXT_PUBLIC_WEBSITE_URLemptyA website that publishes GOAT's blog and changelog feeds. It fills the news on the Home page and provides the welcome video and the privacy link in the menu and in the AI assistant's notice; while empty, none of these are shown.
NEXT_PUBLIC_STATUS_FEED_URLemptyStatus feed shown in the app
NEXT_PUBLIC_SUPPORT_EMAILemptyEmail address behind Report a problem and the AI assistant's Feedback link while support tickets are off, and in the message shown when support is temporarily unavailable. Defaults to support@plan4better.de; set your own address for a white-label installation. An invalid address is ignored and the default is used.
NEXT_PUBLIC_DOCS_URLhttps://goat.plan4better.de/docsDocumentation link in the app
STATIC_ASSETS_URL(commented out)A mirror or CDN for the product artwork (icons, default thumbnails, email images). While unset, GOAT serves the artwork itself under /assets.
ODOO_URL, ODOO_DB(commented out)Plan4Better's Odoo, shared by GOAT's Odoo integrations. Only with access issued by Plan4Better.
ODOO_SUPPORT_API_KEY, ODOO_SUPPORT_TEAM_ID(commented out)Optional support tickets in an Odoo Helpdesk; on only when these and ODOO_URL, ODOO_DB are set. The key is a secret issued by Plan4Better. See Support tickets.
ODOO_SUPPORT_POST_ACTIONGOAT: post message as ticket participantOdoo server action that posts a message as the ticket participant
OTEL_ENABLEDfalseExport traces, metrics and logs through OpenTelemetry
OTEL_EXPORTER_OTLP_ENDPOINTemptyYour OpenTelemetry (OTLP) endpoint

If you add OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST to a service, never include Authorization: the login tokens of users and external agents would land in your traces.

Email​

See Email for how these work together.

SettingDefaultMeaning
SMTP_HOSTemptyMail server; email is off while empty
SMTP_PORT587Port of the mail server
SMTP_SECURITYstarttlsstarttls, ssl or none
SMTP_USER, SMTP_PASSWORDemptyLogin; leave both empty for a relay without login
SMTP_FROMemptySender address; SMTP_USER when empty
EMAILS_FROM_NAMEGOATSender name
SMTP_STARTTLS, SMTP_SSLtrue, falseDerived from SMTP_SECURITY; set by setup.sh
EMAIL_BRAND_NAME, EMAIL_LOGO_URL, EMAIL_CONTACT_URL, EMAIL_PRIVACY_URL, EMAIL_COMPANY_NAME, EMAIL_COMPANY_URL(commented out)Optional branding of GOAT's and Keycloak's emails: name, logo instead of the name, footer links, who runs your GOAT. See Email branding.

AI assistant​

See AI assistant for how these work together.

SettingDefaultMeaning
ASSISTANT_DEFAULT_PROVIDERnoneProvider of "GOAT AI", the built-in model every organization may use: anthropic, bedrock, vertex, azure_openai, openai, mistral, openai_compatible, or none (no built-in model)
ASSISTANT_DEFAULT_MODELemptyThe provider's model ID, which answers and also writes the conversation titles; required unless the provider is none
ASSISTANT_DEFAULT_BASE_URLemptyRequired for openai_compatible and azure_openai (the Azure v1 endpoint, ending in /openai/v1); an optional gateway for anthropic, openai and mistral
ASSISTANT_DEFAULT_API_KEYemptyRequired for anthropic, openai, mistral and azure_openai; optional for openai_compatible; for bedrock an optional Bedrock API key
ASSISTANT_DEFAULT_REGIONemptyAWS region (bedrock) or Google Cloud location (vertex)
ASSISTANT_DEFAULT_HOSTED_INemptyWhere GOAT AI's model is hosted, a region such as EU. The details of GOAT AI's answers name it, and organization admins see it on the AI settings page. Saved with each answer, so a later change leaves earlier answers as they were; empty names no place.
ASSISTANT_ALLOW_ORG_CONNECTIONStrueOrganizations may add connections of their own
ASSISTANT_ALLOWED_PROVIDERSall seven typesProvider types organizations may use, comma-separated
ASSISTANT_ALLOW_PRIVATE_ENDPOINTSfalseLets organizations' connections reach private and internal addresses and plain http
ASSISTANT_SECRETS_KEYset by setup.shEncrypts the credentials organizations store. Keep it with your backups; see The assistant's key.
ASSISTANT_RUN_MAX_TOOL_CALLS, ASSISTANT_RUN_MAX_TOKENS, ASSISTANT_RUN_MAX_SECONDS(commented out): 40, 200000, 900Limits per answer. Tokens read from the model provider's cache count at a tenth toward ASSISTANT_RUN_MAX_TOKENS. Reading a finished workflow run's result may take up to 7 tool calls beyond ASSISTANT_RUN_MAX_TOOL_CALLS.
ASSISTANT_RUN_WAIT_MAX_SECONDS(commented out): 1800How long in all an answer may take that waits for a workflow run; the run itself goes on after it. Takes effect only above ASSISTANT_RUN_MAX_SECONDS
ASSISTANT_USER_MAX_CONCURRENT_RUNS(commented out): 3Answers one user may have running at once
ASSISTANT_TOOL_TIMEOUT_SECONDS(commented out): 30Seconds per request the assistant makes to the other services
ASSISTANT_DISABLED_SURFACES(commented out)Pages where the assistant is off, comma-separated: catalog, project.map, project.workflows, project.layouts, project.dashboard, none (all other pages)
ASSISTANT_ENABLE_MCP(commented out): trueThe MCP endpoint for external agents at <GOAT_PUBLIC_URL>/assistant/mcp
ASSISTANT_MCP_AUDIT_RETENTION_DAYS(commented out): 30Days the records of tool calls made over MCP are kept (at least 1)
ASSISTANT_TOKEN_EXCHANGE_ENABLED, ASSISTANT_KEYCLOAK_CLIENT_ID, ASSISTANT_KEYCLOAK_CLIENT_SECRET(commented out): falseKeycloak token exchange for long answers instead of refreshing the login with the web client. Needs Keycloak 26.2 or later; the bundled Keycloak is version 22.
AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN, AWS_PROFILE, AWS_BEARER_TOKEN_BEDROCK, GOOGLE_APPLICATION_CREDENTIALS, ANTHROPIC_VERTEX_PROJECT_ID, OPENAI_ORG_ID, OPENAI_PROJECT_ID, OPENAI_ADMIN_KEY, OPENAI_CUSTOM_HEADERS, ANTHROPIC_CUSTOM_HEADERSnot set; in assistant.envThe model SDKs' own settings. They apply to GOAT AI only, never to organizations' own connections.
KEYCLOAK_CLIENT_ID, KEYCLOAK_CLIENT_SECRETsee AuthenticationThe assistant renews the login of long answers with this client of the web app. Its own names, ASSISTANT_WEB_CLIENT_ID and ASSISTANT_WEB_CLIENT_SECRET, override them; the bundle needs neither.

Backups​

These apply when the backup profile is on; see Backups.

SettingDefaultMeaning
BACKUP_TIME02:30Time of the nightly backup (UTC)
BACKUP_RETENTION_DAYS7Backups older than this many days are removed