Files
fm_be/config/prod/config.json
2026-07-16 22:16:45 +07:00

308 lines
12 KiB
JSON

{
"env": "${APP_ENV}",
"http": {
"port": ${HTTP_PORT},
"bodyLimit": ${HTTP_BODY_LIMIT},
"timeouts": {
"read": "${HTTP_READ_TIMEOUT}",
"write": "${HTTP_WRITE_TIMEOUT}",
"idle": "${HTTP_IDLE_TIMEOUT}",
"request": "${HTTP_REQUEST_TIMEOUT}",
"requestOverrides": "${HTTP_REQUEST_TIMEOUT_OVERRIDES}",
"shutdown": "${HTTP_SHUTDOWN_TIMEOUT}"
},
"cors": {
"allowOrigins": "${HTTP_CORS_ALLOW_ORIGINS}",
"allowMethods": "${HTTP_CORS_ALLOW_METHODS}",
"allowHeaders": "${HTTP_CORS_ALLOW_HEADERS}",
"exposeHeaders": "${HTTP_CORS_EXPOSE_HEADERS}",
"allowCredentials": ${HTTP_CORS_ALLOW_CREDENTIALS},
"maxAge": ${HTTP_CORS_MAX_AGE}
},
"rateLimit": {
"max": ${HTTP_RATE_LIMIT_MAX},
"window": "${HTTP_RATE_LIMIT_WINDOW}",
"endpoints": "${HTTP_RATE_LIMIT_ENDPOINTS}"
},
"security": {
"hstsMaxAge": ${HTTP_SECURITY_HSTS_MAX_AGE}
}
},
"database": {
"mysql": {
"dsn": "${MYSQL_DSN}",
"maxOpenConns": ${MYSQL_MAX_OPEN_CONNS},
"maxIdleConns": ${MYSQL_MAX_IDLE_CONNS},
"connMaxLifetime": "${MYSQL_CONN_MAX_LIFETIME}",
"connMaxIdleTime": "${MYSQL_CONN_MAX_IDLE_TIME}"
}
},
"logging": {
"level": "${LOG_LEVEL}",
"format": "${LOG_FORMAT}"
},
"audit": {
"queueSize": ${AUDIT_LOG_QUEUE_SIZE},
"workers": ${AUDIT_LOG_WORKERS}
},
"email": {
"provider": "${EMAIL_PROVIDER}",
"mockDir": "${EMAIL_MOCK_DIR}"
},
"circuitBreaker": {
"default": {
"enabled": ${CB_DEFAULT_ENABLED},
"maxRequests": ${CB_DEFAULT_MAX_REQUESTS},
"interval": "${CB_DEFAULT_INTERVAL}",
"bucketPeriod": "${CB_DEFAULT_BUCKET_PERIOD}",
"timeout": "${CB_DEFAULT_TIMEOUT}",
"minRequests": ${CB_DEFAULT_MIN_REQUESTS},
"failureRatio": ${CB_DEFAULT_FAILURE_RATIO},
"consecutiveFailures": ${CB_DEFAULT_CONSECUTIVE_FAILURES}
},
"microsoftSSO": {
"enabled": ${CB_MICROSOFT_SSO_ENABLED},
"maxRequests": ${CB_MICROSOFT_SSO_MAX_REQUESTS},
"interval": "${CB_MICROSOFT_SSO_INTERVAL}",
"bucketPeriod": "${CB_MICROSOFT_SSO_BUCKET_PERIOD}",
"timeout": "${CB_MICROSOFT_SSO_TIMEOUT}",
"minRequests": ${CB_MICROSOFT_SSO_MIN_REQUESTS},
"failureRatio": ${CB_MICROSOFT_SSO_FAILURE_RATIO},
"consecutiveFailures": ${CB_MICROSOFT_SSO_CONSECUTIVE_FAILURES}
},
"ses": {
"enabled": ${CB_SES_ENABLED},
"maxRequests": ${CB_SES_MAX_REQUESTS},
"interval": "${CB_SES_INTERVAL}",
"bucketPeriod": "${CB_SES_BUCKET_PERIOD}",
"timeout": "${CB_SES_TIMEOUT}",
"minRequests": ${CB_SES_MIN_REQUESTS},
"failureRatio": ${CB_SES_FAILURE_RATIO},
"consecutiveFailures": ${CB_SES_CONSECUTIVE_FAILURES}
},
"sqs": {
"enabled": ${CB_SQS_ENABLED},
"maxRequests": ${CB_SQS_MAX_REQUESTS},
"interval": "${CB_SQS_INTERVAL}",
"bucketPeriod": "${CB_SQS_BUCKET_PERIOD}",
"timeout": "${CB_SQS_TIMEOUT}",
"minRequests": ${CB_SQS_MIN_REQUESTS},
"failureRatio": ${CB_SQS_FAILURE_RATIO},
"consecutiveFailures": ${CB_SQS_CONSECUTIVE_FAILURES}
}
},
"auth": {
"publicBaseURL": "${APP_PUBLIC_BASE_URL}",
"passwordPepper": "${AUTH_PASSWORD_PEPPER}",
"ipEncryptionKey": "${AUTH_IP_ENCRYPTION_KEY}",
"defaultRole": "${AUTH_DEFAULT_ROLE}",
"disableRegister": ${AUTH_DISABLE_REGISTER},
"hash": {
"time": ${AUTH_HASH_TIME},
"memoryKB": ${AUTH_HASH_MEMORY_KB},
"threads": ${AUTH_HASH_THREADS},
"keyLen": ${AUTH_HASH_KEY_LEN}
},
"email": {
"verifyTTL": "${AUTH_EMAIL_VERIFY_TTL}",
"verifyURL": "${AUTH_EMAIL_VERIFY_URL}",
"inviteTTL": "${AUTH_INVITE_TTL}"
},
"password": {
"setURL": "${AUTH_SET_PASSWORD_URL}",
"resetTTL": "${AUTH_PASSWORD_RESET_TTL}",
"resetURL": "${AUTH_PASSWORD_RESET_URL}",
"forgotEmailCooldown": "${AUTH_FORGOT_PASSWORD_EMAIL_COOLDOWN}",
"forgotMinDuration": "${AUTH_FORGOT_PASSWORD_MIN_DURATION}",
"forgotIPRateMax": ${AUTH_FORGOT_PASSWORD_IP_RATE_MAX},
"forgotIPRateWindow": "${AUTH_FORGOT_PASSWORD_IP_RATE_WINDOW}",
"loginIPRateMax": ${AUTH_LOGIN_IP_RATE_MAX},
"loginIPRateWindow": "${AUTH_LOGIN_IP_RATE_WINDOW}"
},
"securityPin": {
"resetTTL": "${AUTH_SECURITY_PIN_RESET_TTL}",
"resetURL": "${AUTH_SECURITY_PIN_RESET_URL}",
"forgotEmailCooldown": "${AUTH_FORGOT_SECURITY_PIN_EMAIL_COOLDOWN}",
"forgotMinDuration": "${AUTH_FORGOT_SECURITY_PIN_MIN_DURATION}",
"maxAttempts": ${AUTH_SECURITY_PIN_MAX_ATTEMPTS},
"lockDuration": "${AUTH_SECURITY_PIN_LOCK_DURATION}",
"actionTokenTTL": "${AUTH_SECURITY_PIN_ACTION_TOKEN_TTL}"
},
"jwt": {
"accessSecret": "${AUTH_JWT_ACCESS_SECRET}",
"refreshSecret": "${AUTH_JWT_REFRESH_SECRET}",
"accessTTL": "${AUTH_JWT_ACCESS_TTL}",
"refreshTTL": "${AUTH_JWT_REFRESH_TTL}",
"refreshTotpTTL": "${AUTH_JWT_REFRESH_TOTP_TTL}",
"cookie": {
"domain": "${AUTH_JWT_COOKIE_DOMAIN}",
"secure": ${AUTH_JWT_COOKIE_SECURE},
"sameSite": "${AUTH_JWT_COOKIE_SAMESITE}",
"accessName": "${AUTH_JWT_ACCESS_COOKIE}",
"refreshName": "${AUTH_JWT_REFRESH_COOKIE}"
}
},
"totp": {
"challengeTTL": "${AUTH_TOTP_CHALLENGE_TTL}"
},
"sso": {
"stateTTL": "${AUTH_SSO_STATE_TTL}",
"successRedirect": "${AUTH_SSO_SUCCESS_REDIRECT}"
},
"webauthn": {
"rpId": "${AUTH_WEBAUTHN_RP_ID}",
"rpDisplayName": "${AUTH_WEBAUTHN_RP_DISPLAY_NAME}",
"rpOrigins": "${AUTH_WEBAUTHN_RP_ORIGINS}",
"challengeTTL": "${AUTH_WEBAUTHN_CHALLENGE_TTL}"
}
},
"totp": {
"issuer": "${TOTP_ISSUER}",
"secretKey": "${TOTP_SECRET_KEY}"
},
"microsoftSSO": {
"tenantId": "${MS_ENTRA_TENANT_ID}",
"clientId": "${MS_ENTRA_CLIENT_ID}",
"clientSecret": "${MS_ENTRA_CLIENT_SECRET}",
"redirectUrl": "${MS_ENTRA_REDIRECT_URL}",
"authority": "${MS_ENTRA_AUTHORITY}",
"scopes": "${MS_ENTRA_SCOPES}"
},
"saml": {
"certFile": "${SAML_CERT_FILE}",
"keyFile": "${SAML_KEY_FILE}",
"metadataFile": "${SAML_METADATA_FILE}",
"rootUrl": "${SAML_ROOT_URL}",
"frontendUrl": "${FRONTEND_URL}",
"cookieDomain": "${COOKIE_DOMAIN}",
"cookieSecure": ${COOKIE_SECURE},
"sessionTTLHour": ${SESSION_TTL_HOUR}
},
"queue": {
"messageSchemaVersion": "${QUEUE_MESSAGE_SCHEMA_VERSION}",
"enableLegacyPayloadFallback": ${QUEUE_ENABLE_LEGACY_PAYLOAD_FALLBACK},
"idempotencyKeyPrefix": "${QUEUE_IDEMPOTENCY_KEY_PREFIX}",
"idempotencyTTL": "${QUEUE_IDEMPOTENCY_TTL}",
"processingTTL": "${QUEUE_PROCESSING_TTL}",
"worker": {
"concurrency": ${QUEUE_WORKER_CONCURRENCY},
"maxBatchSize": ${QUEUE_WORKER_MAX_BATCH_SIZE},
"processTimeout": "${QUEUE_WORKER_PROCESS_TIMEOUT}",
"shutdownTimeout": "${QUEUE_WORKER_SHUTDOWN_TIMEOUT}",
"backoffMin": "${QUEUE_WORKER_BACKOFF_MIN}",
"backoffMax": "${QUEUE_WORKER_BACKOFF_MAX}",
"permanentFailureDelay": "${QUEUE_WORKER_PERMANENT_FAILURE_DELAY}",
"monitorAddr": "${QUEUE_WORKER_MONITOR_ADDR}",
"healthErrorThreshold": ${QUEUE_WORKER_HEALTH_ERROR_THRESHOLD},
"depthPollInterval": "${QUEUE_WORKER_DEPTH_POLL_INTERVAL}"
},
"outbox": {
"enabled": ${QUEUE_OUTBOX_ENABLED},
"pollInterval": "${QUEUE_OUTBOX_POLL_INTERVAL}",
"batchSize": ${QUEUE_OUTBOX_BATCH_SIZE},
"dispatchTimeout": "${QUEUE_OUTBOX_DISPATCH_TIMEOUT}",
"lockTTL": "${QUEUE_OUTBOX_LOCK_TTL}",
"maxAttempts": ${QUEUE_OUTBOX_MAX_ATTEMPTS}
}
},
"fileQueue": {
"messageSchemaVersion": "${FILE_QUEUE_MESSAGE_SCHEMA_VERSION}",
"idempotencyKeyPrefix": "${FILE_QUEUE_IDEMPOTENCY_KEY_PREFIX}",
"idempotencyTTL": "${FILE_QUEUE_IDEMPOTENCY_TTL}",
"processingTTL": "${FILE_QUEUE_PROCESSING_TTL}",
"worker": {
"concurrency": ${FILE_QUEUE_WORKER_CONCURRENCY},
"maxBatchSize": ${FILE_QUEUE_WORKER_MAX_BATCH_SIZE},
"processTimeout": "${FILE_QUEUE_WORKER_PROCESS_TIMEOUT}",
"shutdownTimeout": "${FILE_QUEUE_WORKER_SHUTDOWN_TIMEOUT}",
"backoffMin": "${FILE_QUEUE_WORKER_BACKOFF_MIN}",
"backoffMax": "${FILE_QUEUE_WORKER_BACKOFF_MAX}",
"permanentFailureDelay": "${FILE_QUEUE_WORKER_PERMANENT_FAILURE_DELAY}",
"monitorAddr": "${FILE_QUEUE_WORKER_MONITOR_ADDR}",
"healthErrorThreshold": ${FILE_QUEUE_WORKER_HEALTH_ERROR_THRESHOLD},
"depthPollInterval": "${FILE_QUEUE_WORKER_DEPTH_POLL_INTERVAL}"
},
"outbox": {
"enabled": ${FILE_QUEUE_OUTBOX_ENABLED},
"pollInterval": "${FILE_QUEUE_OUTBOX_POLL_INTERVAL}",
"batchSize": ${FILE_QUEUE_OUTBOX_BATCH_SIZE},
"dispatchTimeout": "${FILE_QUEUE_OUTBOX_DISPATCH_TIMEOUT}",
"lockTTL": "${FILE_QUEUE_OUTBOX_LOCK_TTL}",
"maxAttempts": ${FILE_QUEUE_OUTBOX_MAX_ATTEMPTS}
}
},
"aws": {
"region": "${AWS_REGION}",
"accessKeyId": "${AWS_ACCESS_KEY_ID}",
"secretAccessKey": "${AWS_SECRET_ACCESS_KEY}",
"sqs": {
"endpoint": "${SQS_ENDPOINT}",
"allowInsecureEndpoint": ${SQS_ALLOW_INSECURE_ENDPOINT},
"queueUrl": "${SQS_QUEUE_URL}",
"queueType": "${SQS_QUEUE_TYPE}",
"messageGroupId": "${SQS_MESSAGE_GROUP_ID}",
"maxMessages": ${SQS_MAX_MESSAGES},
"waitTimeSeconds": ${SQS_WAIT_TIME_SECONDS},
"visibilityTimeout": "${SQS_VISIBILITY_TIMEOUT}"
},
"fileSqs": {
"region": "${FILE_SQS_REGION}",
"endpoint": "${FILE_SQS_ENDPOINT}",
"allowInsecureEndpoint": ${FILE_SQS_ALLOW_INSECURE_ENDPOINT},
"queueUrl": "${FILE_SQS_QUEUE_URL}",
"queueType": "${FILE_SQS_QUEUE_TYPE}",
"messageGroupId": "${FILE_SQS_MESSAGE_GROUP_ID}",
"maxMessages": ${FILE_SQS_MAX_MESSAGES},
"waitTimeSeconds": ${FILE_SQS_WAIT_TIME_SECONDS},
"visibilityTimeout": "${FILE_SQS_VISIBILITY_TIMEOUT}"
},
"ses": {
"region": "${SES_REGION}",
"from": "${SES_FROM}",
"configurationSet": "${SES_CONFIGURATION_SET}",
"sendTimeout": "${SES_SEND_TIMEOUT}",
"endpoint": "${SES_ENDPOINT}",
"allowInsecureEndpoint": ${SES_ALLOW_INSECURE_ENDPOINT}
}
},
"file": {
"provider": "${FILE_STORAGE_PROVIDER}",
"s3": {
"bucket": "${FILE_S3_BUCKET}",
"region": "${FILE_S3_REGION}",
"endpoint": "${FILE_S3_ENDPOINT}",
"forcePathStyle": ${FILE_S3_FORCE_PATH_STYLE},
"allowInsecureEndpoint": ${FILE_S3_ALLOW_INSECURE_ENDPOINT},
"autoCreateBucket": ${FILE_S3_AUTO_CREATE_BUCKET},
"objectKeyPrefix": "${FILE_OBJECT_KEY_PREFIX}",
"presignPutTTL": "${FILE_S3_PRESIGN_PUT_TTL}",
"presignGetTTL": "${FILE_S3_PRESIGN_GET_TTL}"
},
"upload": {
"maxSize": ${FILE_MANAGER_UPLOAD_MAX_FILE_SIZE_BYTES},
"allowedMimeTypes": "${FILE_MANAGER_UPLOAD_ALLOWED_MIME_TYPES}",
"allowedExtensions": "${FILE_MANAGER_UPLOAD_ALLOWED_EXTENSIONS}",
"allowEmptyFile": ${FILE_MANAGER_UPLOAD_ALLOW_EMPTY_FILE},
"maxFilenameLength": ${FILE_MANAGER_UPLOAD_MAX_FILENAME_LENGTH}
},
"cleanup": {
"enableS3Tagging": ${ENABLE_S3_TAGGING},
"enableCleanupJob": ${ENABLE_FILE_CLEANUP_JOB},
"tempFileTTLDays": ${TEMP_FILE_TTL_DAYS},
"orphanGracePeriodDays": ${ORPHAN_GRACE_PERIOD_DAYS},
"batchSize": ${FILE_CLEANUP_BATCH_SIZE},
"dryRun": ${FILE_CLEANUP_DRY_RUN}
}
},
"wopi": {
"tokenSecret": "${WOPI_TOKEN_SECRET}",
"proofSecret": "${WOPI_PROOF_SECRET}",
"discoveryUrl": "${WOPI_DISCOVERY_URL}",
"publicBaseUrl": "${WOPI_PUBLIC_BASE_URL}",
"editActionUrl": "${WOPI_EDIT_ACTION_URL}",
"tokenTTL": "${WOPI_TOKEN_TTL}",
"maxBodyBytes": ${WOPI_MAX_BODY_BYTES},
"requireProof": ${WOPI_REQUIRE_PROOF}
}
}