Replace the immediate per-document approval email and the manual "send signing notifications" action with a single debounced worker that batches pending requests per recipient and organization. The worker (go.gearno.de/kit/worker) polls on an interval (default 5m) and claims one (organization, recipient) group at a time, sending one consolidated signing email and/or one approval email per recipient/org that lists every document awaiting their signature or approval. The claim is a conditional UPDATE that doubles as concurrency-safe dedup, so several workers never email the same group twice. Each request is notified once it has been pending past the debounce delay (default 15m), then reminded at 1x, 2x and 3x the reminder interval (default 1 day) after the previous email, after which it stops. New last_notified_at and notification_count columns on signatures and approval decisions drive the debounce, the widening reminder cadence and the four-email cap. Email copy lists each document with its title, type and a deep link to the employee page. Removed the inline approval-on-publish email, the SendSigningNotifications service method/mutation/MCP tool, its IAM action, and the related console UI and n8n operation. Signed-off-by: Sacha Al Himdani <sacha@probo.com>
144 lines
6.3 KiB
Plaintext
144 lines
6.3 KiB
Plaintext
# Dev overrides for `make dev-config`.
|
|
#
|
|
# Copy this file to .env and uncomment any variable you want to
|
|
# override. .env is gitignored; this .env.example is the canonical
|
|
# list of overridable knobs.
|
|
#
|
|
# This is NOT a Docker-compose `.env` file. The Makefile sources it as
|
|
# a POSIX shell snippet (`. ./.env`), so:
|
|
# - `KEY=value` works and is auto-exported.
|
|
# - Quote values containing spaces: `KEY="foo bar"`.
|
|
# - `#` starts a comment, `export KEY=value` is accepted.
|
|
# - Malformed assignments (e.g. unquoted spaces) abort `make dev-config`.
|
|
#
|
|
# See pkg/bootstrap/builder.go for the full env-var surface; the values
|
|
# set below in the Makefile's `cfg/dev.yaml` recipe are the dev defaults
|
|
# that this file can override.
|
|
|
|
# ── Base URL & ports ──────────────────────────────────────────────────
|
|
# PROBOD_BASE_URL=http://localhost:8080
|
|
# API_ADDR=:8080
|
|
# API_CORS_ALLOWED_ORIGINS=http://localhost:8080,http://localhost:5173,http://localhost:5174
|
|
# TRUST_CENTER_HTTP_ADDR=:80
|
|
# TRUST_CENTER_HTTPS_ADDR=:443
|
|
|
|
# ── Observability ─────────────────────────────────────────────────────
|
|
# METRICS_ADDR=localhost:8081
|
|
# TRACING_ADDR=localhost:4317
|
|
|
|
# ── Secrets (rotate before prod) ──────────────────────────────────────
|
|
# PROBOD_ENCRYPTION_KEY=thisisnotasecretAAAAAAAAAAAAAAAAAAAAAAAAAAA=
|
|
# AUTH_COOKIE_SECRET=this-is-a-secure-secret-for-cookie-signing-at-least-32-bytes
|
|
# AUTH_PASSWORD_PEPPER=this-is-a-secure-pepper-for-password-hashing-at-least-32-bytes
|
|
|
|
# ── Cookie ────────────────────────────────────────────────────────────
|
|
# AUTH_COOKIE_DOMAIN=localhost
|
|
# AUTH_COOKIE_SECURE=false
|
|
# AUTH_COOKIE_DURATION=24
|
|
|
|
# ── Postgres ──────────────────────────────────────────────────────────
|
|
# PG_ADDR=localhost:5432
|
|
# PG_USERNAME=postgres
|
|
# PG_PASSWORD=postgres
|
|
# PG_DATABASE=probod
|
|
# PG_POOL_SIZE=100
|
|
# PG_MIN_POOL_SIZE=10
|
|
# PG_MAX_CONN_IDLE_TIME_SECONDS=1800
|
|
# PG_MAX_CONN_LIFETIME_SECONDS=3600
|
|
# PG_DEBUG=false
|
|
|
|
# ── Object storage (SeaweedFS via compose) ────────────────────────────
|
|
# AWS_REGION=us-east-1
|
|
# AWS_BUCKET=probod
|
|
# AWS_ACCESS_KEY_ID=probod
|
|
# AWS_SECRET_ACCESS_KEY=thisisnotasecret
|
|
# AWS_ENDPOINT=http://127.0.0.1:8333
|
|
|
|
# ── Mailer (Mailpit via compose) ──────────────────────────────────────
|
|
# SMTP_ADDR=localhost:1025
|
|
# SMTP_USER=
|
|
# SMTP_PASSWORD=
|
|
# SMTP_TLS_REQUIRED=false
|
|
# MAILER_SENDER_EMAIL=no-reply@notification.getprobo.com
|
|
# MAILER_SENDER_NAME=Probo
|
|
|
|
# ── LLM providers ─────────────────────────────────────────────────────
|
|
# OPENAI_API_KEY=sk-...
|
|
# ANTHROPIC_API_KEY=sk-ant-...
|
|
# LLM_DEFAULT_PROVIDER=openai
|
|
# LLM_DEFAULT_MODEL_NAME=gpt-4o
|
|
|
|
# ── LLM-backed workers (inherit from LLM defaults when unset) ─────────
|
|
# PROBO_AGENT_PROVIDER=anthropic
|
|
# PROBO_AGENT_MODEL_NAME=claude-sonnet-4-6
|
|
# EVIDENCE_DESCRIBER_PROVIDER=openai
|
|
# EVIDENCE_DESCRIBER_MODEL_NAME=gpt-4o-mini
|
|
# AGENT_THIRD_PARTY_VETTER_PROVIDER=openai # inherits AGENT_DEFAULT_PROVIDER when unset
|
|
# AGENT_THIRD_PARTY_VETTER_MODEL_NAME=gpt-4o # inherits AGENT_DEFAULT_MODEL_NAME when unset
|
|
# THIRD_PARTY_VETTING_INTERVAL=10
|
|
# THIRD_PARTY_VETTING_STALE_AFTER=1500
|
|
# THIRD_PARTY_VETTING_MAX_CONCURRENCY=1
|
|
|
|
# ── Document signature/approval notifications (seconds) ───────────────
|
|
# DOCUMENT_NOTIFICATION_INTERVAL=300
|
|
# DOCUMENT_NOTIFICATION_DEBOUNCE_DELAY=900
|
|
# DOCUMENT_NOTIFICATION_REMINDER_INTERVAL=86400
|
|
|
|
# ── OIDC sign-in providers ────────────────────────────────────────────
|
|
# AUTH_GOOGLE_CLIENT_ID=
|
|
# AUTH_GOOGLE_CLIENT_SECRET=
|
|
# AUTH_MICROSOFT_CLIENT_ID=
|
|
# AUTH_MICROSOFT_CLIENT_SECRET=
|
|
|
|
# ── Connectors (set _CLIENT_ID to enable; _CLIENT_SECRET is required) ─
|
|
# CONNECTOR_SLACK_CLIENT_ID=
|
|
# CONNECTOR_SLACK_CLIENT_SECRET=
|
|
# CONNECTOR_SLACK_SIGNING_SECRET=
|
|
# CONNECTOR_HUBSPOT_CLIENT_ID=
|
|
# CONNECTOR_HUBSPOT_CLIENT_SECRET=
|
|
# CONNECTOR_GITHUB_CLIENT_ID=
|
|
# CONNECTOR_GITHUB_CLIENT_SECRET=
|
|
# CONNECTOR_NOTION_CLIENT_ID=
|
|
# CONNECTOR_NOTION_CLIENT_SECRET=
|
|
# CONNECTOR_SENTRY_CLIENT_ID=
|
|
# CONNECTOR_SENTRY_CLIENT_SECRET=
|
|
# CONNECTOR_INTERCOM_CLIENT_ID=
|
|
# CONNECTOR_INTERCOM_CLIENT_SECRET=
|
|
# CONNECTOR_DOCUSIGN_CLIENT_ID=
|
|
# CONNECTOR_DOCUSIGN_CLIENT_SECRET=
|
|
# CONNECTOR_BREX_CLIENT_ID=
|
|
# CONNECTOR_BREX_CLIENT_SECRET=
|
|
# CONNECTOR_GITLAB_CLIENT_ID=
|
|
# CONNECTOR_GITLAB_CLIENT_SECRET=
|
|
# CONNECTOR_BITBUCKET_CLIENT_ID=
|
|
# CONNECTOR_BITBUCKET_CLIENT_SECRET=
|
|
# CONNECTOR_HEROKU_CLIENT_ID=
|
|
# CONNECTOR_HEROKU_CLIENT_SECRET=
|
|
# CONNECTOR_PAGERDUTY_CLIENT_ID=
|
|
# CONNECTOR_PAGERDUTY_CLIENT_SECRET=
|
|
# CONNECTOR_ASANA_CLIENT_ID=
|
|
# CONNECTOR_ASANA_CLIENT_SECRET=
|
|
# CONNECTOR_NETLIFY_CLIENT_ID=
|
|
# CONNECTOR_NETLIFY_CLIENT_SECRET=
|
|
# CONNECTOR_CLICKUP_CLIENT_ID=
|
|
# CONNECTOR_CLICKUP_CLIENT_SECRET=
|
|
# CONNECTOR_VERCEL_CLIENT_ID=
|
|
# CONNECTOR_VERCEL_CLIENT_SECRET=
|
|
# CONNECTOR_VERCEL_INTEGRATION_SLUG=
|
|
# CONNECTOR_MONDAY_CLIENT_ID=
|
|
# CONNECTOR_MONDAY_CLIENT_SECRET=
|
|
# CONNECTOR_DATADOG_CLIENT_ID=
|
|
# CONNECTOR_DATADOG_CLIENT_SECRET=
|
|
# Zendesk OAuth requires a Zendesk-approved global OAuth client (Marketplace).
|
|
# CONNECTOR_ZENDESK_CLIENT_ID=
|
|
# CONNECTOR_ZENDESK_CLIENT_SECRET=
|
|
# PostHog Cloud (US + EU) OAuth needs NO config: it uses the CIMD public-client
|
|
# flow (no app registration, no client_secret), auto-enabled when this
|
|
# deployment is publicly reachable at PROBOD_BASE_URL. Self-hosted PostHog uses
|
|
# the API-key path with an instance URL. No CONNECTOR_POSTHOG_* vars required.
|
|
|
|
# ── Custom domains (Pebble ACME via compose) ──────────────────────────
|
|
# CUSTOM_DOMAINS_CNAME_TARGET=custom.getprobo.com
|
|
# ACME_DIRECTORY=https://localhost:14000/dir
|
|
# ACME_EMAIL=admin@probo.com
|