Files
kevinveenbirkenbachandClaude Opus 5 cc50e92b2d feat(baserow): serve MCP and address containers by node in swarm
Provision the native MCP server surface: create the endpoint, its owner
and its workspace, probe it on the internal origin, and refuse an
endpoint that never serves the stream. Baserow addresses a session
through the URL path, so meta/services.yml declares the endpoint key and
suffix the discovery layer composes the client URL from.

Split the role into a run-once guarded core. Registering the MCP surface
makes baserow a shared provider, and the variant-aware loader checks the
run-once flag before loading; without the flag as the first task a second
load request can include the role again.

Address the container by its hosting node. Migration and bootstrap ran
`container exec` on the manager while the replica sits on a worker, so
the resolved id existed nowhere the command could reach it. Re-resolve
after the post-migration restart as well: `service update --force`
replaces the container, and the bootstrap was still holding the id of the
one it replaced.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 22:06:11 +02:00

52 lines
2.0 KiB
Django/Jinja

{% include 'roles/sys-svc-container/templates/env.j2' %}
BASEROW_PUBLIC_URL={{ BASEROW_PUBLIC_URL }}
{% if BASEROW_MCP_ENABLED | bool %}
BASEROW_EXTRA_PUBLIC_URLS={{ BASEROW_INTERNAL_URL }}
{% endif %}
SECRET_KEY={{ BASEROW_SECRET_KEY | dotenv_quote }}
BASEROW_SECRET_KEY={{ BASEROW_SECRET_KEY | dotenv_quote }}
PROXY_HEADER_SSO={{ BASEROW_SSO_PROXY_GATED | string | lower }}
PROXY_HEADER_SSO_ADMIN_GROUP={{ BASEROW_SSO_ADMIN_GROUP | dotenv_quote }}
PROXY_HEADER_SSO_FALLBACK_EMAIL_DOMAIN={{ BASEROW_SSO_FALLBACK_EMAIL_DOMAIN | dotenv_quote }}
{% set email = lookup('email', application_id) %}
{% if email.enabled | bool %}
EMAIL_SMTP={{ email.smtp | upper }}
EMAIL_SMTP_HOST={{ email.host }}
EMAIL_SMTP_PORT={{ email.port }}
EMAIL_SMTP_USER={{ email.username }}
EMAIL_SMTP_PASSWORD={{ email.password | dotenv_quote }}
EMAIL_SMTP_USE_TLS={{ email.tls | upper }}
{% endif %}
DATABASE_USER={{ BASEROW_DATABASE_USER }}
DATABASE_NAME={{ BASEROW_DATABASE_NAME }}
DATABASE_HOST={{ BASEROW_DATABASE_HOST }}
DATABASE_PORT={{ BASEROW_DATABASE_PORT }}
DATABASE_PASSWORD={{ BASEROW_DATABASE_PASSWORD | dotenv_quote }}
DATABASE_URL={{ BASEROW_DATABASE_URL }}
REDIS_HOST={{ BASEROW_REDIS_HOST }}
REDIS_PORT={{ BASEROW_REDIS_PORT }}
REDIS_URL={{ BASEROW_REDIS_URL }}
{% if lookup('objstore', application_id, 'enabled') | bool %}
AWS_ACCESS_KEY_ID={{ lookup('objstore', application_id, 'access_key') }}
AWS_SECRET_ACCESS_KEY={{ lookup('objstore', application_id, 'secret_key') | dotenv_quote }}
AWS_STORAGE_BUCKET_NAME={{ lookup('objstore', application_id, 'bucket') }}
AWS_S3_ENDPOINT_URL={{ lookup('objstore', application_id, 'url') }}
AWS_S3_REGION_NAME={{ lookup('objstore', application_id, 'region') }}
AWS_S3_CUSTOM_DOMAIN={{ lookup('objstore', application_id, 'public_bucket') }}
{% endif %}
DISABLE_EMBEDDED_PSQL=yes
DISABLE_EMBEDDED_REDIS=yes
SYNC_TEMPLATES_ON_STARTUP=false
BASEROW_TRIGGER_SYNC_TEMPLATES_AFTER_MIGRATION=false
BASEROW_DISABLE_PLUGIN_INSTALL_ON_STARTUP=yes
MIGRATE_ON_STARTUP=false
BASEROW_POSTGRES_STARTUP_CHECK_ATTEMPTS=30