--- application_id: "web-app-zammad" entity_name: "{{ application_id | get_entity_name }}" ZAMMAD_PRECHECK_SERVICE: "precheck" ZAMMAD_INIT_SERVICE: "init" ZAMMAD_RAILS_SERVICE: "railsserver" ZAMMAD_WEBSOCKET_SERVICE: "websocket" ZAMMAD_SCHEDULER_SERVICE: "scheduler" ZAMMAD_NGINX_SERVICE: "nginx" ZAMMAD_SEARCH_SERVICE: "elasticsearch" ZAMMAD_MEMCACHED_SERVICE: "memcached" ZAMMAD_PRECHECK_CONTAINER: "{{ lookup('config', application_id, 'services.' ~ ZAMMAD_PRECHECK_SERVICE ~ '.name') }}" ZAMMAD_INIT_CONTAINER: "{{ lookup('config', application_id, 'services.' ~ ZAMMAD_INIT_SERVICE ~ '.name') }}" ZAMMAD_RAILS_CONTAINER: "{{ lookup('config', application_id, 'services.' ~ ZAMMAD_RAILS_SERVICE ~ '.name') }}" ZAMMAD_RAILS_CONTAINER_ADDRESS: "{{ lookup('container_address', application_id, ZAMMAD_RAILS_SERVICE) }}" ZAMMAD_WEBSOCKET_CONTAINER: "{{ lookup('config', application_id, 'services.' ~ ZAMMAD_WEBSOCKET_SERVICE ~ '.name') }}" ZAMMAD_SCHEDULER_CONTAINER: "{{ lookup('config', application_id, 'services.' ~ ZAMMAD_SCHEDULER_SERVICE ~ '.name') }}" ZAMMAD_NGINX_CONTAINER: "{{ lookup('config', application_id, 'services.' ~ ZAMMAD_NGINX_SERVICE ~ '.name') }}" ZAMMAD_SEARCH_CONTAINER: "{{ lookup('config', application_id, 'services.' ~ ZAMMAD_SEARCH_SERVICE ~ '.name') }}" ZAMMAD_MEMCACHED_CONTAINER: "{{ lookup('engine', 'memcached', application_id, 'container') }}" ZAMMAD_RAILS_PORT: "{{ lookup('config', application_id, 'services.' ~ ZAMMAD_RAILS_SERVICE ~ '.ports.internal.http') }}" ZAMMAD_WEBSOCKET_PORT: "{{ lookup('config', application_id, 'services.' ~ ZAMMAD_WEBSOCKET_SERVICE ~ '.ports.internal.http') }}" ZAMMAD_SEARCH_PORT: "{{ lookup('config', application_id, 'services.' ~ ZAMMAD_SEARCH_SERVICE ~ '.ports.internal.http') }}" ZAMMAD_SEARCH_HEAP_MB: "{{ lookup('service_memory_mb', application_id, ZAMMAD_SEARCH_SERVICE, 0.25) }}" ZAMMAD_SEARCH_WATERMARK: "{{ lookup('config', application_id, 'services.search.watermark') }}" ZAMMAD_SEARCH_MAJOR: "{{ (lookup('config', application_id, 'services.search.version') | string).split('.') | first }}" ZAMMAD_SEARCH_DATA_DIR: "{{ [lookup('volume', application_id, 'zammad_search').target, ZAMMAD_SEARCH_MAJOR] | path_join }}" ZAMMAD_SEARCH_PRECHECK_ABS: "{{ [lookup('container', application_id, 'directories.config'), 'search_allocation_precheck.sh'] | path_join }}" ZAMMAD_SEARCH_PRECHECK_TARGET: "{{ (lookup('volume', application_id, 'search_allocation_precheck').mounts | first).target }}" ZAMMAD_SEARCH_READY_SECONDS: 600 ZAMMAD_SEARCH_POLL_SECONDS: 5 ZAMMAD_SEARCH_ALLOCATION_TIMEOUT_SECONDS: 60 # Exception: env.j2 must never set DATABASE_URL. The image's config/pre_initializers/database_url.rb # builds it from POSTGRESQL_* only while DATABASE_URL is blank, so presetting it drops # POSTGRESQL_OPTIONS and Rails falls back to its default pool of 5, below the thread count # BackgroundServices starts in the scheduler. ZAMMAD_DB_POOL: 50 ZAMMAD_API_BOT_USER: "{{ lookup('users', 'zammad-api-bot') }}" ZAMMAD_WIZARD_BYPASS_USER: "{{ lookup('users', 'zammad-wizard-bypass-admin') }}" ZAMMAD_API_BOT_PASSWORD: "{{ ZAMMAD_API_BOT_USER.password }}" ZAMMAD_WIZARD_BYPASS_PASSWORD: "{{ ZAMMAD_WIZARD_BYPASS_USER.password }}" ZAMMAD_INITIAL_ADMIN_PASSWORD: "{{ lookup('config', application_id, 'secrets.credentials.initial_admin_password') }}" ZAMMAD_SECRET_KEY_BASE: "{{ lookup('config', application_id, 'secrets.credentials.secret_key_base') }}" ZAMMAD_HOSTNAME: "{{ lookup('domain', application_id) }}" ZAMMAD_WEB_PROTOCOL: "{{ lookup('tls', application_id, 'protocols.web') }}" ZAMMAD_HTTP_ONLY_ENABLED: "{{ not (lookup('tls', application_id, 'enabled') | bool) }}" ZAMMAD_VOLUMES_DIR: "{{ lookup('container', application_id, 'directories.volumes') }}" ZAMMAD_AUTO_WIZARD_HOST_PATH: "{{ ZAMMAD_VOLUMES_DIR }}auto_wizard.json" ZAMMAD_OMNIAUTH_INIT_HOST_PATH: "{{ ZAMMAD_VOLUMES_DIR }}zz_omniauth_allow_get.rb" ZAMMAD_TELEGRAM_HELPER_HOST_PATH: "{{ ZAMMAD_VOLUMES_DIR }}telegram_helper.rb" ZAMMAD_OIDC_GROUP_ROLE_MAP_HOST_PATH: "{{ ZAMMAD_VOLUMES_DIR }}zz_oidc_group_role_mapping.rb" ZAMMAD_OIDC_HTTP_DISCOVERY_HOST_PATH: "{{ ZAMMAD_VOLUMES_DIR }}zz_oidc_http_discovery.rb" ZAMMAD_OIDC_GROUP_ROLE_MAP: "/{{ RBAC.GROUP.NAME | trim('/') }}/{{ application_id }}/administrator": "Admin" "/{{ RBAC.GROUP.NAME | trim('/') }}/{{ application_id }}/agent": "Agent" "/{{ RBAC.GROUP.NAME | trim('/') }}/{{ application_id }}/customer": "Customer" ZAMMAD_OIDC_ENABLED: "{{ lookup('config', application_id, 'services.sso.enabled') | bool }}" ZAMMAD_EMAIL_ENABLED: "{{ lookup('config', application_id, 'services.email.enabled') | bool }}" ZAMMAD_LDAP_ENABLED: "{{ lookup('config', application_id, 'services.ldap.enabled') | bool }}" ZAMMAD_MAIL: "{{ lookup('email', application_id) if ZAMMAD_EMAIL_ENABLED else {} }}" ZAMMAD_HELPDESK_USER: "{{ lookup('users', 'helpdesk') if ZAMMAD_EMAIL_ENABLED else {} }}" ZAMMAD_HELPDESK_EMAIL: "{{ ZAMMAD_HELPDESK_USER.email | default('') }}" ZAMMAD_HELPDESK_PASS: "{{ (ZAMMAD_HELPDESK_USER.tokens | default({})).get(MAIL_PROVIDER, '') }}" ZAMMAD_MCP_ENABLED: "{{ lookup('config', application_id, 'services.zammadmcp.enabled') | bool }}" ZAMMAD_MCP_SERVICE_KEY: "zammadmcp" ZAMMAD_MCP_CONTAINER: "{{ lookup('config', application_id, 'services.zammadmcp.name') }}" ZAMMAD_MCP_PORT: "{{ lookup('config', application_id, 'services.zammadmcp.ports.internal.http') }}" ZAMMAD_MCP_BEARER: "{{ lookup('config', application_id, 'secrets.credentials.mcp_bearer') }}" ZAMMAD_MCP_INSTANCE_DIR: "{{ [lookup('container', application_id, 'directories.instance'), 'mcp'] | path_join }}" ZAMMAD_MCP_UPSTREAM_HOST: "{{ ZAMMAD_NGINX_SERVICE }}" ZAMMAD_MCP_UPSTREAM_PORT: "{{ lookup('config', application_id, 'services.zammad.ports.internal.http') }}" ZAMMAD_MCP_UPSTREAM_URL: "http://{{ ZAMMAD_MCP_UPSTREAM_HOST }}:{{ ZAMMAD_MCP_UPSTREAM_PORT }}" ZAMMAD_MCP_CONTRACT: provider: "{{ application_id }}" upstream_url: "{{ ZAMMAD_MCP_UPSTREAM_URL }}" auth_subject: "{{ lookup('config', application_id, 'mcp.auth_subject') }}" mutating_tools_enabled: "{{ lookup('config', application_id, 'mcp.tools.mutating_tools_enabled') | bool }}" tools: "{{ lookup('file', 'mcp/tools.json') | from_json }}" limits: "{{ lookup('config', application_id, 'mcp.limits') }}" schema_sha256: "{{ lookup('config', application_id, 'mcp.tools.schema_sha256') }}" ZAMMAD_MCP_UPSTREAM_KEY: "{{ lookup('config', application_id, 'secrets.credentials.api_token') }}" ZAMMAD_MCP_ACCOUNT: "{{ lookup('users', 'mcp-web-app-zammad') }}" ZAMMAD_MCP_UPSTREAM_USER: "{{ ZAMMAD_MCP_ACCOUNT.username }}" ZAMMAD_MCP_UPSTREAM_EMAIL: "{{ ZAMMAD_MCP_ACCOUNT.email }}" ZAMMAD_MCP_UPSTREAM_PASSWORD: "{{ ZAMMAD_MCP_ACCOUNT.password }}" ZAMMAD_MCP_UPSTREAM_TOKEN_LABEL: "infinito-mcp" ZAMMAD_MCP_UPSTREAM_AUTH_HEADER: "Authorization" ZAMMAD_MCP_UPSTREAM_AUTH_FORMAT: "Token token={key}" ZAMMAD_LITELLM_ENABLED: "{{ lookup('config', application_id, 'services.litellm.enabled') | bool }}" ZAMMAD_LITELLM_BASE_URL: "{{ LITELLM_OPENAI_BASE_LOCAL_URL }}" ZAMMAD_LITELLM_MODEL: "{{ LITELLM_CHAT_MODEL }}" ZAMMAD_LITELLM_API_KEY: "{{ lookup('config', application_id, 'secrets.credentials.litellm_api_key') }}"