Files
fm_be/.env.local.example
2026-07-16 22:16:45 +07:00

249 lines
7.2 KiB
Plaintext

# Copy this to .env.local and fill in your values.
# Never commit .env.local.
# App
APP_ENV=local
# HTTP
HTTP_PORT=8080
HTTP_BODY_LIMIT=4194304
HTTP_READ_TIMEOUT=10s
HTTP_WRITE_TIMEOUT=15s
HTTP_IDLE_TIMEOUT=60s
HTTP_CORS_ALLOW_ORIGINS=http://localhost:3000,http://127.0.0.1:3000,http://localhost:5173,http://127.0.0.1:5173
HTTP_CORS_ALLOW_METHODS=GET,POST,PUT,PATCH,DELETE,OPTIONS,HEAD
HTTP_CORS_ALLOW_HEADERS=Origin,Content-Type,Accept,Authorization,X-Requested-With,X-Pin-Verification-Token,X-Device-Type
HTTP_CORS_EXPOSE_HEADERS=X-Request-ID
HTTP_CORS_ALLOW_CREDENTIALS=true
HTTP_CORS_MAX_AGE=300
HTTP_REQUEST_TIMEOUT=30s
HTTP_REQUEST_TIMEOUT_OVERRIDES=
HTTP_SHUTDOWN_TIMEOUT=30s
HTTP_RATE_LIMIT_MAX=120
HTTP_RATE_LIMIT_WINDOW=1m
HTTP_SECURITY_HSTS_MAX_AGE=0
# MySQL
MYSQL_DSN="root:password@tcp(localhost:3306)/fm_dev?parseTime=true"
MYSQL_MAX_OPEN_CONNS=25
MYSQL_MAX_IDLE_CONNS=10
MYSQL_CONN_MAX_LIFETIME=5m
MYSQL_CONN_MAX_IDLE_TIME=2m
# Logging
LOG_LEVEL=debug
LOG_FORMAT=json
# Audit
AUDIT_LOG_QUEUE_SIZE=1024
AUDIT_LOG_WORKERS=2
# Email
EMAIL_PROVIDER=mock
EMAIL_MOCK_DIR=.local/emails
# Circuit Breaker (default policy)
CB_DEFAULT_ENABLED=true
CB_DEFAULT_MAX_REQUESTS=1
CB_DEFAULT_INTERVAL=1m
CB_DEFAULT_BUCKET_PERIOD=10s
CB_DEFAULT_TIMEOUT=30s
CB_DEFAULT_MIN_REQUESTS=5
CB_DEFAULT_FAILURE_RATIO=0.6
CB_DEFAULT_CONSECUTIVE_FAILURES=5
CB_MICROSOFT_SSO_ENABLED=true
CB_MICROSOFT_SSO_MAX_REQUESTS=1
CB_MICROSOFT_SSO_INTERVAL=1m
CB_MICROSOFT_SSO_BUCKET_PERIOD=10s
CB_MICROSOFT_SSO_TIMEOUT=30s
CB_MICROSOFT_SSO_MIN_REQUESTS=5
CB_MICROSOFT_SSO_FAILURE_RATIO=0.6
CB_MICROSOFT_SSO_CONSECUTIVE_FAILURES=5
CB_SES_ENABLED=true
CB_SES_MAX_REQUESTS=1
CB_SES_INTERVAL=1m
CB_SES_BUCKET_PERIOD=10s
CB_SES_TIMEOUT=30s
CB_SES_MIN_REQUESTS=5
CB_SES_FAILURE_RATIO=0.6
CB_SES_CONSECUTIVE_FAILURES=5
CB_SQS_ENABLED=true
CB_SQS_MAX_REQUESTS=1
CB_SQS_INTERVAL=1m
CB_SQS_BUCKET_PERIOD=10s
CB_SQS_TIMEOUT=30s
CB_SQS_MIN_REQUESTS=5
CB_SQS_FAILURE_RATIO=0.6
CB_SQS_CONSECUTIVE_FAILURES=5
# Auth
AUTH_PASSWORD_PEPPER=change-me-local-pepper
AUTH_IP_ENCRYPTION_KEY=change-me-local-ip-key
AUTH_DEFAULT_ROLE=user
AUTH_DISABLE_REGISTER=false
AUTH_HASH_TIME=1
AUTH_HASH_MEMORY_KB=65536
AUTH_HASH_THREADS=4
AUTH_HASH_KEY_LEN=32
AUTH_EMAIL_VERIFY_TTL=24h
AUTH_EMAIL_VERIFY_URL=http://localhost:3000/verify-email
AUTH_INVITE_TTL=24h
AUTH_SET_PASSWORD_URL=http://localhost:3000/set-password
AUTH_PASSWORD_RESET_TTL=20m
AUTH_PASSWORD_RESET_URL=http://localhost:3000/reset-password
AUTH_FORGOT_PASSWORD_EMAIL_COOLDOWN=2m
AUTH_FORGOT_PASSWORD_MIN_DURATION=150ms
AUTH_FORGOT_PASSWORD_IP_RATE_MAX=10
AUTH_FORGOT_PASSWORD_IP_RATE_WINDOW=15m
AUTH_SECURITY_PIN_RESET_TTL=20m
AUTH_SECURITY_PIN_RESET_URL=http://localhost:3000/reset-pin
AUTH_FORGOT_SECURITY_PIN_EMAIL_COOLDOWN=2m
AUTH_FORGOT_SECURITY_PIN_MIN_DURATION=150ms
AUTH_SECURITY_PIN_MAX_ATTEMPTS=5
AUTH_SECURITY_PIN_LOCK_DURATION=0s
AUTH_SECURITY_PIN_ACTION_TOKEN_TTL=5m
AUTH_JWT_COOKIE_DOMAIN=.mybit.co.id
# JWT
AUTH_JWT_ACCESS_SECRET=change-me-local-access-secret
AUTH_JWT_REFRESH_SECRET=change-me-local-refresh-secret
AUTH_JWT_ACCESS_TTL=10m
AUTH_JWT_REFRESH_TTL=1h
AUTH_JWT_REFRESH_TOTP_TTL=1h
AUTH_JWT_COOKIE_SECURE=false
AUTH_JWT_COOKIE_SAMESITE=Lax
AUTH_JWT_ACCESS_COOKIE=wucher_at
AUTH_JWT_REFRESH_COOKIE=wucher_rt
# TOTP
AUTH_TOTP_CHALLENGE_TTL=5m
TOTP_ISSUER=Wucher
TOTP_SECRET_KEY=change-me-local-totp-secret
# SSO
AUTH_SSO_STATE_TTL=10m
AUTH_SSO_SUCCESS_REDIRECT=http://localhost:3000/sso/callback
# WebAuthn
AUTH_WEBAUTHN_RP_ID=localhost
AUTH_WEBAUTHN_RP_DISPLAY_NAME=Wucher
AUTH_WEBAUTHN_RP_ORIGINS=http://localhost:3000
AUTH_WEBAUTHN_CHALLENGE_TTL=5m
# Microsoft SSO
MS_ENTRA_TENANT_ID=
MS_ENTRA_CLIENT_ID=
MS_ENTRA_CLIENT_SECRET=
MS_ENTRA_REDIRECT_URL=http://localhost:8080/v1/auth/sso/microsoft/callback
MS_ENTRA_AUTHORITY=https://login.microsoftonline.com/
MS_ENTRA_SCOPES=openid,profile,email,offline_access,User.Read
# Queue
QUEUE_MESSAGE_SCHEMA_VERSION=v2
QUEUE_ENABLE_LEGACY_PAYLOAD_FALLBACK=true
QUEUE_IDEMPOTENCY_KEY_PREFIX=queue:idempotency:email:
QUEUE_IDEMPOTENCY_TTL=24h
QUEUE_PROCESSING_TTL=15m
QUEUE_WORKER_CONCURRENCY=4
QUEUE_WORKER_MAX_BATCH_SIZE=10
QUEUE_WORKER_PROCESS_TIMEOUT=30s
QUEUE_WORKER_SHUTDOWN_TIMEOUT=30s
QUEUE_WORKER_BACKOFF_MIN=1s
QUEUE_WORKER_BACKOFF_MAX=5m
QUEUE_WORKER_PERMANENT_FAILURE_DELAY=30s
QUEUE_WORKER_MONITOR_ADDR=127.0.0.1:9090
QUEUE_WORKER_HEALTH_ERROR_THRESHOLD=3
QUEUE_WORKER_DEPTH_POLL_INTERVAL=30s
QUEUE_OUTBOX_ENABLED=true
QUEUE_OUTBOX_POLL_INTERVAL=1s
QUEUE_OUTBOX_BATCH_SIZE=10
QUEUE_OUTBOX_DISPATCH_TIMEOUT=10s
QUEUE_OUTBOX_LOCK_TTL=1m
QUEUE_OUTBOX_MAX_ATTEMPTS=20
# File Queue
FILE_QUEUE_MESSAGE_SCHEMA_VERSION=v1
FILE_QUEUE_IDEMPOTENCY_KEY_PREFIX=queue:idempotency:file:
FILE_QUEUE_IDEMPOTENCY_TTL=24h
FILE_QUEUE_PROCESSING_TTL=15m
FILE_QUEUE_WORKER_CONCURRENCY=4
FILE_QUEUE_WORKER_MAX_BATCH_SIZE=10
FILE_QUEUE_WORKER_PROCESS_TIMEOUT=30s
FILE_QUEUE_WORKER_SHUTDOWN_TIMEOUT=30s
FILE_QUEUE_WORKER_BACKOFF_MIN=1s
FILE_QUEUE_WORKER_BACKOFF_MAX=5m
FILE_QUEUE_WORKER_PERMANENT_FAILURE_DELAY=30s
FILE_QUEUE_WORKER_MONITOR_ADDR=127.0.0.1:9091
FILE_QUEUE_WORKER_HEALTH_ERROR_THRESHOLD=3
FILE_QUEUE_WORKER_DEPTH_POLL_INTERVAL=30s
FILE_QUEUE_OUTBOX_ENABLED=true
FILE_QUEUE_OUTBOX_POLL_INTERVAL=1s
FILE_QUEUE_OUTBOX_BATCH_SIZE=10
FILE_QUEUE_OUTBOX_DISPATCH_TIMEOUT=10s
FILE_QUEUE_OUTBOX_LOCK_TTL=1m
FILE_QUEUE_OUTBOX_MAX_ATTEMPTS=20
# AWS
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=test
AWS_SECRET_ACCESS_KEY=test
# SQS (local uses localstack or similar)
SQS_ENDPOINT=http://localhost:4566
SQS_ALLOW_INSECURE_ENDPOINT=true
SQS_QUEUE_URL=http://localhost:4566/000000000000/fm-email-queue
SQS_QUEUE_TYPE=standard
SQS_MESSAGE_GROUP_ID=email
SQS_MAX_MESSAGES=10
SQS_WAIT_TIME_SECONDS=20
SQS_VISIBILITY_TIMEOUT=60s
# SQS (file queue, local uses localstack or similar)
FILE_SQS_REGION=us-east-1
FILE_SQS_ENDPOINT=http://localhost:4566
FILE_SQS_ALLOW_INSECURE_ENDPOINT=true
FILE_SQS_QUEUE_URL=http://localhost:4566/000000000000/fm-file-queue
FILE_SQS_QUEUE_TYPE=standard
FILE_SQS_MESSAGE_GROUP_ID=file-processing
FILE_SQS_MAX_MESSAGES=10
FILE_SQS_WAIT_TIME_SECONDS=20
FILE_SQS_VISIBILITY_TIMEOUT=60s
# SES (local uses localstack or similar)
SES_REGION=us-east-1
SES_FROM=noreply@localhost
SES_CONFIGURATION_SET=
SES_SEND_TIMEOUT=10s
SES_ENDPOINT=http://localhost:4566
SES_ALLOW_INSECURE_ENDPOINT=true
# File Storage (local uses localstack or similar)
FILE_STORAGE_PROVIDER=s3
FILE_S3_BUCKET=fm-local
FILE_S3_REGION=us-east-1
FILE_S3_ENDPOINT=http://localhost:4566
FILE_S3_FORCE_PATH_STYLE=true
FILE_S3_ALLOW_INSECURE_ENDPOINT=true
FILE_S3_AUTO_CREATE_BUCKET=true
FILE_OBJECT_KEY_PREFIX=fm/objects
FILE_S3_PRESIGN_PUT_TTL=15m
FILE_S3_PRESIGN_GET_TTL=15m
FILE_MANAGER_UPLOAD_MAX_FILE_SIZE_BYTES=4194304
FILE_MANAGER_UPLOAD_ALLOWED_MIME_TYPES=image/png,image/jpeg,application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel
FILE_MANAGER_UPLOAD_ALLOWED_EXTENSIONS=png,jpg,jpeg,pdf,xlsx,xls
FILE_MANAGER_UPLOAD_ALLOW_EMPTY_FILE=false
FILE_MANAGER_UPLOAD_MAX_FILENAME_LENGTH=255
FILE_MANAGER_TRASH_AUTO_PURGE_ENABLED=true
FILE_MANAGER_TRASH_RETENTION=720h
FILE_MANAGER_TRASH_AUTO_PURGE_INTERVAL=1h
FILE_MANAGER_TRASH_AUTO_PURGE_BATCH_SIZE=200
ENABLE_S3_TAGGING=true
ENABLE_FILE_CLEANUP_JOB=false
TEMP_FILE_TTL_DAYS=7
ORPHAN_GRACE_PERIOD_DAYS=30
FILE_CLEANUP_BATCH_SIZE=100
FILE_CLEANUP_DRY_RUN=true