Files
zooqueenandHanzo Dev ecee5e40aa Sign in through Hanzo IAM only, and make accounts for invited people only
The IAM callback at /auth/callback reads IAM's userinfo answer and refuses
an address IAM has not verified. An account is found by its linked IAM
identity alone (provider hanzo, the IAM subject); an existing account that
only shares the address is refused, never merged. A first sign-in makes an
account only for an admin of the org the application serves or for someone
an organisation invited at that verified address. Every refusal returns to
/signin with a sentence saying what to do.

Accepting an organisation invitation joins the signed-in person, and only
when their verified address is the invited one; opening the link no longer
adds whoever holds the address.

The local email/password sign-up, sign-in, reset, verify-email and update
routes, pages, jobs and mail are gone, as are passkey sign-in, the Google,
Microsoft and generic OIDC providers, the per-organisation SSO portal and
its account-link flow. Passkeys and two-factor stay for confirming a
signature. The e2e suite starts sessions the way a finished IAM sign-in
leaves them.

Co-authored-by: Hanzo Dev <[email protected]>
2026-10-16 01:52:24 -07:00

156 lines
4.6 KiB
YAML

services:
- type: web
runtime: node
name: hanzo-sign-app
plan: free
buildCommand: npm i && npm run build
startCommand: npx prisma migrate deploy --schema packages/prisma/schema.prisma && npx turbo run start --filter=@hanzo/esign-remix
healthCheckPath: /v1/health
# The embedded Base SQLite database lives on a persistent disk; `sign.db`
# is created on demand under BASE_PATH on first start.
disk:
name: hanzo-sign-base
mountPath: /opt/hanzo-sign/base/data
sizeGB: 10
envVars:
# Node Version
- key: NODE_VERSION
value: 22.22.0
- key: PORT
value: 10000
# Auth
- key: NEXT_PUBLIC_WEBAPP_URL
fromService:
name: hanzo-sign-app
type: web
envVarKey: RENDER_EXTERNAL_URL
- key: NEXT_PRIVATE_AUTH_SECRET
generateValue: true
# Database — embedded Base SQLite under the persistent disk's BASE_PATH.
- key: BASE_PATH
value: /opt/hanzo-sign/base/data
- key: DATABASE_URL
value: file:/opt/hanzo-sign/base/data/sign.db
# URLs
- key: NEXT_PUBLIC_WEBAPP_URL
fromService:
name: hanzo-sign-app
type: web
envVarKey: RENDER_EXTERNAL_URL
- key: NEXT_PRIVATE_INTERNAL_WEBAPP_URL
value: 'http://localhost:10000'
# SMTP
- key: NEXT_PRIVATE_SMTP_TRANSPORT
value: 'smtp-auth'
- key: NEXT_PRIVATE_SMTP_HOST
sync: false
- key: NEXT_PRIVATE_SMTP_PORT
sync: false
- key: NEXT_PRIVATE_SMTP_USERNAME
sync: false
- key: NEXT_PRIVATE_SMTP_PASSWORD
sync: false
- key: NEXT_PRIVATE_SMTP_FROM_NAME
sync: false
- key: NEXT_PRIVATE_SMTP_FROM_ADDRESS
sync: false
# Stripe
- key: NEXT_PRIVATE_STRIPE_API_KEY
sync: false
- key: NEXT_PRIVATE_STRIPE_WEBHOOK_SECRET
sync: false
# Features
- key: NEXT_PUBLIC_INSIGHTS_KEY
sync: false
- key: NEXT_PUBLIC_FEATURE_BILLING_ENABLED
sync: false
# Storage
- key: NEXT_PUBLIC_UPLOAD_TRANSPORT
value: 'database'
- key: NEXT_PRIVATE_UPLOAD_ENDPOINT
sync: false
- key: NEXT_PRIVATE_UPLOAD_FORCE_PATH_STYLE
sync: false
- key: NEXT_PRIVATE_UPLOAD_REGION
sync: false
- key: NEXT_PRIVATE_UPLOAD_BUCKET
sync: false
- key: NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID
sync: false
- key: NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY
sync: false
# Crypto
- key: NEXT_PRIVATE_ENCRYPTION_KEY
generateValue: true
- key: NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY
generateValue: true
# Signing
- key: NEXT_PRIVATE_SIGNING_TRANSPORT
sync: false
- key: NEXT_PRIVATE_SIGNING_PASSPHRASE
sync: false
- key: NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH
sync: false
- key: NEXT_PRIVATE_SIGNING_LOCAL_FILE_CONTENTS
sync: false
- key: NEXT_PRIVATE_SIGNING_GCLOUD_HSM_KEY_PATH
sync: false
- key: NEXT_PRIVATE_SIGNING_GCLOUD_HSM_PUBLIC_CRT_FILE_PATH
sync: false
- key: NEXT_PRIVATE_SIGNING_GCLOUD_HSM_PUBLIC_CRT_FILE_CONTENTS
sync: false
- key: NEXT_PRIVATE_SIGNING_GCLOUD_APPLICATION_CREDENTIALS_CONTENTS
sync: false
- key: NEXT_PRIVATE_SIGNING_GCLOUD_HSM_CERT_CHAIN_FILE_PATH
sync: false
- key: NEXT_PRIVATE_SIGNING_GCLOUD_HSM_CERT_CHAIN_CONTENTS
sync: false
- key: NEXT_PRIVATE_SIGNING_GCLOUD_HSM_SECRET_MANAGER_CERT_PATH
sync: false
- key: NEXT_PRIVATE_SIGNING_TIMESTAMP_AUTHORITY
sync: false
- key: NEXT_PUBLIC_SIGNING_CONTACT_INFO
sync: false
- key: NEXT_PRIVATE_USE_LEGACY_SIGNING_SUBFILTER
sync: false
# SMTP Optional
- key: NEXT_PRIVATE_SMTP_APIKEY_USER
sync: false
- key: NEXT_PRIVATE_SMTP_APIKEY
sync: false
- key: NEXT_PRIVATE_SMTP_SECURE
sync: false
- key: NEXT_PRIVATE_RESEND_API_KEY
sync: false
- key: NEXT_PRIVATE_MAILCHANNELS_API_KEY
sync: false
- key: NEXT_PRIVATE_MAILCHANNELS_ENDPOINT
sync: false
- key: NEXT_PRIVATE_MAILCHANNELS_DKIM_DOMAIN
sync: false
- key: NEXT_PRIVATE_MAILCHANNELS_DKIM_SELECTOR
sync: false
- key: NEXT_PRIVATE_MAILCHANNELS_DKIM_PRIVATE_KEY
sync: false
- key: NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT
sync: false
# Features Optional
- key: NEXT_PUBLIC_DISABLE_SIGNUP
sync: false
- key: NEXT_PUBLIC_USE_INTERNAL_URL_BROWSERLESS
sync: false