Pulse/deploy/provider-msp/.env.example

166 lines
7.2 KiB
Text

# Domain
# Client runtimes are routed as https://<client-id>.${DOMAIN}/.
# Provider-hosted MSP: use the MSP's own domain, for example pulse.example-msp.com.
# Pulse-hosted MSP: use a Pulse-operated provider namespace, for example example-msp.msp.pulserelay.pro, and set CP_CONTROL_PLANE_MODE=pulse_hosted_msp.
DOMAIN=msp.example.com
ACME_EMAIL=admin@example.com
# Cloudflare DNS-01 wildcard TLS
CF_DNS_API_TOKEN=
# DNS-01 provider for the wildcard certificate. cloudflare is the default and
# uses CF_DNS_API_TOKEN above. Any Traefik dnsChallenge provider name works;
# for a non-Cloudflare provider, set it here and put that provider's
# credential variables in dns-credentials.env, which reaches only the traefik
# container.
ACME_DNS_PROVIDER=cloudflare
# Image pins. Leave blank and setup.sh resolves each one to an immutable
# digest from its published tag, then writes the digest back here. All four
# images are public, so this needs no registry credentials.
#
# Pin them by hand instead if you want to hold a specific build; setup.sh
# leaves any value you set alone.
TRAEFIK_IMAGE=
DOCKER_SOCKET_PROXY_IMAGE=
CONTROL_PLANE_IMAGE=
CP_PULSE_IMAGE=
# Control plane
CP_ENV=production
CP_CONTROL_PLANE_MODE=provider_hosted_msp
CP_ADMIN_KEY=
PULSE_PROVIDER_MSP_DATA_DIR=/data
PULSE_PROVIDER_MSP_DOCKER_NETWORK=pulse-provider-msp
PULSE_PROVIDER_MSP_DOCKER_SUBNET=172.30.0.0/24
PULSE_PROVIDER_MSP_DOCKER_SOCKET=/var/run/docker.sock
PULSE_PROVIDER_MSP_ROOT_SPACECHECK_DIR=/var/lib/pulse-provider-msp/spacecheck/root
PULSE_PROVIDER_MSP_DOCKER_SPACECHECK_DIR=/var/lib/docker/.pulse-provider-msp-spacecheck
CP_TRUSTED_PROXY_CIDRS=172.30.0.0/24
# Licence file. Leave BLANK and setup.sh self-issues a 2-client evaluation
# licence for you, bound to the signing key it generates on this host. The
# private key never leaves the host and you do not have to ask anyone.
#
# Set it to your licence path once you buy. Paid client caps come from the
# licence, never from this file.
#
# PULSE_PROVIDER_MSP_SKIP_EVAL_LICENSE=1 skips the request on an air-gapped
# host. The portal and client isolation still work, but client workspaces will
# not carry MSP capabilities until a licence is installed.
#
# To let Pulse match this activation to your setup request, pass
# PULSE_PROVIDER_MSP_EVAL_EMAIL when running setup.sh. The setup sends that
# address, the public signing key, and a fixed signup-source label; it never
# sends client inventory or credentials. Leave it unset for an anonymous eval.
CP_PROVIDER_MSP_LICENSE_FILE=
# Entitlement lease signing key. setup.sh generates this; the private key
# never leaves this host. Your provider MSP license must bind the derived
# PUBLIC key (entitlement_signing_public_key); print it with
# `./setup.sh --print-lease-signing-public-key` and include it in your
# license request. The control plane refuses to start if license and key
# do not match.
CP_ENTITLEMENT_SIGNING_PRIVATE_KEY=
CP_TENANT_MEMORY_LIMIT=536870912
CP_ALLOW_DOCKERLESS_PROVISIONING=false
CP_STORAGE_GUARDRAILS_ENABLED=true
CP_STORAGE_MIN_ROOT_AVAILABLE=10GiB
CP_STORAGE_MIN_DATA_AVAILABLE=5GiB
CP_STORAGE_MIN_DOCKER_AVAILABLE=10GiB
CP_STORAGE_MAX_DOCKER_BUILD_CACHE=2GiB
CP_PROOF_TENANT_MAX_AGE=24h
CP_PROOF_TENANT_MATCHERS=proof,canary,rehearsal,msp_prod,ownerseed,owner_seed
# Email is optional. Without RESEND_API_KEY the portal cannot send sign-in
# links or invitation emails; instead, print one-time links on this host:
# docker compose run --rm control-plane provider-msp bootstrap \
# --account-name "Example MSP" --owner-email owner@example.com # owner link
# docker compose run --rm control-plane provider-msp portal-link \
# --email teammate@example.com # teammate link
# The portal sign-in page shows the same instructions in this state.
# Portal sessions last 7 days (CP_SESSION_TTL to change).
# Set CP_REQUIRE_EMAIL_PROVIDER=true once transactional email is configured.
CP_REQUIRE_EMAIL_PROVIDER=false
RESEND_API_KEY=
PULSE_EMAIL_FROM=noreply@example.com
PULSE_EMAIL_REPLY_TO=support@example.com
# Fresh host setup:
# sudo -E ./setup.sh
#
# Optional one-command setup proof after .env is filled:
# sudo -E PULSE_PROVIDER_MSP_ACCOUNT_NAME="Example MSP" \
# PULSE_PROVIDER_MSP_OWNER_EMAIL=owner@example.com \
# PULSE_PROVIDER_MSP_EVAL_EMAIL=owner@example.com \
# ./setup.sh
#
# First owner bootstrap:
# docker compose run --rm control-plane provider-msp bootstrap \
# --account-name "Example MSP" \
# --owner-email owner@example.com
#
# Install readiness check:
# docker compose run --rm control-plane provider-msp preflight
#
# Non-mutating operational status:
# docker compose run --rm control-plane provider-msp status
#
# Pre-upgrade / pre-maintenance status gate. This fails unless a verified
# provider MSP backup archive is available:
# docker compose run --rm control-plane provider-msp status --require-backup
#
# Pre-upgrade / pre-maintenance plan. This is non-mutating and does not pull
# images:
# ./upgrade.sh --dry-run
#
# Apply a provider control-plane upgrade after updating the image pins in this
# file. The runner creates and verifies a fresh backup, dry-runs restore into a
# separate target data dir, pulls provider images, starts Traefik/control-plane,
# and prints the tenant runtime rollout plan for CP_PULSE_IMAGE:
# ./upgrade.sh
#
# Also roll all client runtimes to the configured CP_PULSE_IMAGE line after the
# provider services are updated:
# ./upgrade.sh --rollout-tenants
#
# Fresh-install provider proof. This bootstraps the owner account, checks install
# readiness, creates two proof client workspaces, verifies tenant-local agent
# ingest and portal handoff, creates and verifies a backup, dry-runs restore and
# recovery, then removes the proof workspaces.
# ./run-install-proof.sh \
# --account-name "Example MSP" \
# --owner-email owner@example.com
#
# Equivalent one-off command:
# docker compose run --rm control-plane provider-msp install-proof \
# --account-name "Example MSP" \
# --owner-email owner@example.com
#
# Plan recovery for failed, stuck provisioning, or unhealthy client workspaces:
# docker compose run --rm control-plane provider-msp recover --all-degraded --dry-run
#
# Execute recovery after reviewing the dry-run:
# docker compose run --rm control-plane provider-msp recover --all-degraded
#
# Recovery backup before upgrades or recovery drills:
# docker compose run --rm control-plane provider-msp backup create
#
# Verify a recovery archive before relying on it:
# docker compose run --rm control-plane provider-msp backup verify \
# /data/backups/provider-msp/provider-msp-backup-YYYYMMDDTHHMMSSZ.tar.gz
#
# Recovery dry-run on a fresh target data directory:
# docker compose run --rm control-plane provider-msp backup restore \
# /data/backups/provider-msp/provider-msp-backup-YYYYMMDDTHHMMSSZ.tar.gz \
# --target-data-dir /data-restore-drill \
# --dry-run
#
# Workspace/runtime proof. This creates two proof client workspaces, generates
# client-bound agent install tokens, verifies tenant-local agent report ingest,
# and exercises the portal handoff path. The broader install-proof command above
# wraps this with preflight, backup, restore dry-run, recovery dry-run, cleanup,
# and status checks.
# docker compose run --rm control-plane provider-msp proof \
# --account-name "Example MSP" \
# --owner-email owner@example.com \
# --cleanup