# 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