Environment variables
Generated from api/docs/enviromental-variables.md and env() calls in api/
The first part is api/docs/enviromental-variables.md; the second is built from the code. Front-end and service variables (ULAMS_* for front/web, REACT_APP_* for admin, VITE_APP_* for the legacy front, H5P and PDF service settings) are described in Self-hosting and the app READMEs under Reference.
Application is designed to be stateless - it is controlled by environmental variables
LARAVEL_ prefix
Section titled “LARAVEL_ prefix”Each Variable that that has LARAVEL_ is converted nto variable set for .env file for Laravel Environment Configuration. Note that .env is ephemeral and created each time service restarts.
Example
LARAVEL_APP_NAME=UlamsLARAVEL_APP_ENV=localwill be saved into .env as
APP_NAME=UlamsAPP_ENV=localMULTI_DOMAINS List of domains and specic domain variable
Section titled “MULTI_DOMAINS List of domains and specic domain variable”MULTI_DOMAINS has comma separated list of domains that will be used for init_multidomains.sh script
Each domain can have a specific Laravel Environment Configuration. Note that each domain .env is ephemeral and created each time service restarts.
Example
MULTI_DOMAINS=api17005.localhost,api16576.localhost,api22800.localhostAPI17005_LOCALHOST_APP_NAME="App one"API16576_LOCALHOST_APP_NAME="App two"API22800_LOCALHOST_APP_NAME="App three"API22800_LOCALHOST_INITIAL_USER_PASSWORD="password one"API16576_LOCALHOST_INITIAL_USER_PASSWORD="password one"API17005_LOCALHOST_INITIAL_USER_PASSWORD="password two"Wil create three .env for each domain prefixed
#.env.api17005.localhost fileAPP_NAME="App one"INITIAL_USER_PASSWORD="password one"#.env.api16576.localhost fileAPP_NAME="App two"INITIAL_USER_PASSWORD="password one"#.env.api22800.localhost fileAPP_NAME="App three"INITIAL_USER_PASSWORD="password two"List of domains
Section titled “List of domains”Each
| Variable name | Description | Default |
|---|---|---|
LARAVEL_ prefix |
main Laravel Environment Configuration | |
${DOMAIN_KEY}_ prefix |
domain specific Laravel Environment Configuration | |
MULTI_DOMAINS |
Comma separated list of multidomains | |
DISABLE_PHP_FPM |
Disable PHP FPM Supervisor process | false |
DISABLE_HORIZON |
Disable Laravel Horizon Supervisor process | false |
ENABLE_HORIZON |
Start Horizon in lean workers mode (off there by default) | false |
ULAMS_WORKERS_MODE |
lean (one loop per kind, ulams:tenant:work-once) or per-tenant (long-lived process per tenant and queue); compose sets lean |
per-tenant |
DISABLE_SCHEDULER |
Disable Laravel Scheduler Supervisor process | false |
JWT_PUBLIC_KEY_BASE64 |
Base64 encoded storage/oauth-public.key |
|
JWT_PRIVATE_KEY_BASE64 |
Base64 encoded storage/oauth-private.key |
|
${DOMAIN_KEY}_JWT_PUBLIC_KEY_BASE64 |
Base64 encoded storage/oauth-public.key for domain |
|
${DOMAIN_KEY}_JWT_PRIVATE_KEY_BASE64 |
Base64 encoded storage/oauth-private.key for domain |
|
DISABLE_DB_MIGRATE |
Disable Laravel Database migration on startup | false |
DISABLE_DB_SEED |
Disable Laravel Permissions Database Seed migration on startup | false |
DISABLE_QUEUE |
Disable the tenant/multidomain queue workers (queue.sh) |
false |
DISABLE_TENANT_SYNC |
Skip ulams:tenant:sync-env on startup |
false |
INITIAL_USER_PASSWORD |
Initial admin password | |
INITIAL_USER_FIRST_NAME |
Initial admin first name | Root |
INITIAL_USER_LAST_NAME |
Initial admin last name | Admin |
INITIAL_USER_EMAIL |
Initial admin email | admin@ulams.app |
${DOMAIN_KEY}_INITIAL_USER_PASSWORD |
Initial admin password for domain | |
${DOMAIN_KEY}_INITIAL_USER_FIRST_NAME |
Initial admin first name for domain | Root |
${DOMAIN_KEY}_INITIAL_USER_LAST_NAME |
Initial admin last name for domain | Admin |
${DOMAIN_KEY}_INITIAL_USER_EMAIL |
Initial admin email for domain | admin@ulams.app |
Redis prefixes
Section titled “Redis prefixes”Every domain shares one Redis. Set by ulams:tenant:create for each tenant
(ulams_<slug>_…); the platform uses the defaults.
| Variable name | Description | Default |
|---|---|---|
REDIS_PREFIX |
Prefix of every Redis key (queues, cache, locks) | <slug of APP_NAME>_database_ |
CACHE_PREFIX |
Cache store prefix (inside REDIS_PREFIX) |
<slug of APP_NAME>_cache |
HORIZON_PREFIX |
Horizon metadata prefix | <slug of APP_NAME>_horizon: |
Cookies and origin checks
Section titled “Cookies and origin checks”Third-party package code runs on the content origin; where that origin is a subdomain of the app’s
site the browser treats it as same-site, so the API hardens its cookies and checks the Origin of
every state-changing request (see content-origin.md). No cookie ever carries a
Domain attribute.
| Variable name | Description | Default |
|---|---|---|
SESSION_COOKIE_PREFIX |
Prefix of the session and XSRF-TOKEN cookie names. __Host- makes them Secure, Path=/ and host-only. Empty over plain http |
__Host- when APP_ENV=production, else empty |
SESSION_COOKIE |
Full name of the session cookie (overrides the prefix and APP_NAME) |
<prefix><slug of APP_NAME>_session |
SESSION_SECURE_COOKIE |
Secure attribute; must stay true while the prefix is __Host- |
true with a prefix, else false |
ORIGIN_CHECK |
Refuse POST/PUT/PATCH/DELETE whose Origin is not one of the tenant’s own apps (403). Turn off only to debug |
true |
TRUSTED_ORIGINS |
Comma separated extra origins allowed to call the API from a browser, besides FRONTEND_URL, ADMIN_URL and APP_URL; never content origins |
empty |
ADMIN_URL |
Origin of the tenant’s admin panel (also trusted by the origin check); written by ulams:tenant:create |
empty |
Outside production localhost and *.localhost (any port) are trusted too, so the development
stack and the old front on :3000/:8000 keep working.
Tenancy (packages/tenancy)
Section titled “Tenancy (packages/tenancy)”Read on the platform by ulams:tenant:*, see multidomain.md.
{slug} is replaced with the tenant slug.
| Variable name | Description | Default |
|---|---|---|
TENANT_DEMO_PASSWORD |
Password of all demo users of new tenants. Development only | secret |
TENANCY_ENFORCE_HOSTS |
Answer 404 to hosts that are neither platform hosts nor provisioned tenants | true |
TENANCY_PLATFORM_HOSTS |
Comma separated hosts served by the platform .env (add k8s service/ingress hosts here) |
api.localhost,localhost,127.0.0.1,caddy,api |
TENANCY_SCHEME |
Scheme of tenant URLs | http |
TENANCY_API_HOST |
Tenant API host | {slug}.localhost |
TENANCY_FRONT_HOST |
Tenant front host (global.frontURL, FRONTEND_URL) |
{slug}.app.localhost |
TENANCY_ADMIN_HOST |
Tenant admin panel host | {slug}.admin.localhost |
TENANCY_CONTENT_HOST |
Tenant content origin host, written as CONTENT_ORIGIN (see content-origin.md) |
{slug}.content.localhost |
TENANCY_EMAIL_DOMAIN |
Domain of demo user e-mails and MAIL_FROM_ADDRESS |
{slug}.ulams.app |
TENANCY_DATABASE |
Tenant database and role name | ulams_{slug} |
TENANCY_BUCKET |
Tenant bucket | ulams-{slug} |
TENANCY_REDIS_PREFIX |
Tenant REDIS_PREFIX |
ulams_{slug}_ |
TENANCY_STORAGE_PUBLIC_URL |
Public object store URL; the tenant AWS_URL is this plus /<bucket> |
http://storage.localhost |
TENANCY_S3_ENDPOINT |
Object store endpoint used to create buckets | AWS_ENDPOINT |
TENANCY_S3_KEY |
Object store access key used to create buckets | AWS_ACCESS_KEY_ID |
TENANCY_S3_SECRET |
Object store secret used to create buckets | AWS_SECRET_ACCESS_KEY |
TENANCY_S3_REGION |
Object store region | AWS_DEFAULT_REGION |
DB_ADMIN_HOST |
Host of the pgsql_admin connection (creates tenant roles and databases) |
DB_HOST |
DB_ADMIN_PORT |
Port of the pgsql_admin connection |
DB_PORT |
DB_ADMIN_DATABASE |
Database the pgsql_admin connection logs in to |
DB_DATABASE |
DB_ADMIN_USERNAME |
Role with CREATEROLE and CREATEDB |
DB_USERNAME |
DB_ADMIN_PASSWORD |
Its password | DB_PASSWORD |
TENANCY_PHP_BINARY |
PHP binary for tenant subprocesses | current PHP binary |
TENANCY_PROCESS_TIMEOUT |
Timeout of one tenant subprocess, seconds | 900 |
TENANCY_SCHEDULER_LOCK |
Several scheduler replicas: only the one that takes the per-minute cache lock runs the tick (ADR 0068) | true |
TENANCY_DATABASE_PROVISIONER |
manual: the operator creates tenant databases (shared hosting, ADR 0091); ulams:tenant:create --db-password= |
admin |
TENANCY_S3_PUBLIC_READ_POLICY |
false for stores without bucket policies (Cloudflare R2) |
true |
ANTHROPIC_API_KEY, AI_DRIVER, AI_MODEL_*, ANTHROPIC_BASE_URL |
Platform AI settings inherited by every tenant env file on create and sync-env; override per tenant with ulams:tenant:set-env (ADR 0063) |
unset |
WORKERS_CHECK_INTERVAL |
Seconds between workers.sh checks of the domain list and of exited processes |
10 |
WORKERS_MAX_TIME |
Seconds a per-domain worker or scheduler loop runs before it is restarted (fresh code/config) | 3600 |
WORKERS_LEAN_INTERVAL |
Lean mode: seconds between passes over the domains (default queues) | 10 |
WORKERS_LEAN_HEAVY_INTERVAL |
Lean mode: the same for the builder and long-job queues | 20 |
WORKERS_LEAN_MAX_TIME |
Lean mode: seconds a pass keeps taking jobs of one domain and queue | 30 |
Set per tenant in .env.<host> (do not set them on the platform): TENANT_SLUG,
REDIS_PREFIX, CACHE_PREFIX, HORIZON_PREFIX, CONTENT_ORIGIN, INITIAL_USER_EMAIL,
INITIAL_USER_PASSWORD, FRONTEND_URL, ADMIN_URL, DEMO_MODE.
Demo mode (packages/demo)
Section titled “Demo mode (packages/demo)”Read inside a tenant. DEMO_MODE is written by ulams:tenant:create <slug> --demo=on|off;
the others are optional overrides. See packages/demo/README.md.
| Variable name | Description | Default |
|---|---|---|
DEMO_MODE |
Login without password (/api/demo/*) and an hourly reset. Never on production data |
false |
DEMO_ADMIN_EMAIL |
Account of the automatic admin login | INITIAL_USER_EMAIL |
DEMO_STUDENT_EMAIL |
Account of the automatic student login | student1@<admin e-mail domain> |
DEMO_TUTOR_EMAIL |
Account of the tutor login (role: tutor) |
tutor@<admin e-mail domain> |
DEMO_ADMIN_URL |
Admin panel link on the front’s demo badge | ADMIN_URL |
DEMO_RESET_SCHEDULE |
Schedule ulams:demo:reset |
true |
DEMO_RESET_CRON |
When | 0 * * * * |
DEMO_RESET_WIPE_FILES |
Also delete every file in the tenant bucket on reset | false |
DEMO_RESET_STUDENTS |
Demo students when no baseline was captured | 5 |
DEMO_CONTENT_SEEDER |
Seeder of the demo courses | Database\Seeders\DemoCoursesSeeder |
ULAMS_DEMO_EXPERIENCE |
Demo course(s) to seed | TENANT_SLUG |
Uploads (packages/uploads)
Section titled “Uploads (packages/uploads)”Upload guard for packages and imports (zip-slip, symlinks, zip bombs, sniffed MIME type, size, virus-scan hook), see packages/uploads/README.md.
| Variable name | Description | Default |
|---|---|---|
UPLOADS_SCORM_MAX_MB |
Largest SCORM package upload | 512 |
UPLOADS_CMI5_MAX_MB |
Largest cmi5 package upload | 512 |
UPLOADS_COURSE_IMPORT_MAX_MB |
Largest course export zip accepted by the import | 1024 |
UPLOADS_ZIP_MAX_ENTRIES |
Most entries in a SCORM/cmi5 package | 5000 |
UPLOADS_ZIP_MAX_UNCOMPRESSED_MB |
Largest total uncompressed size of a package | 2048 |
UPLOADS_ZIP_MAX_ENTRY_MB |
Largest single file inside an archive | 1024 |
UPLOADS_ZIP_MAX_RATIO |
Largest compression ratio of an entry over 1 MB (zip bombs) | 200 |
UPLOADS_COURSE_IMPORT_MAX_ENTRIES |
Most entries in a course import | 10000 |
UPLOADS_COURSE_IMPORT_MAX_UNCOMPRESSED_MB |
Largest total uncompressed size of a course import | 4096 |
UPLOADS_SCANNER |
null (no scan) or clamd (compose profile av) |
null |
UPLOADS_CLAMD_HOST / UPLOADS_CLAMD_PORT |
clamd address | clamav / 3310 |
UPLOADS_CLAMD_TIMEOUT |
Seconds to wait for clamd | 60 |
UPLOADS_CLAMD_FAIL_CLOSED |
Reject uploads when clamd cannot be reached | true |
FILES_MAX_SIZE_MB |
Largest single file in the admin file manager (packages/files) |
512 |
UPLOADS_LIASCRIPT_MAX_MB |
Largest LiaScript .md or .zip upload |
128 |
LIASCRIPT_MAX_MARKDOWN_KB |
Largest LiaScript Markdown source (packages/liascript) |
2048 |
LIASCRIPT_DISK |
Disk for LiaScript assets | FILESYSTEM_DRIVER |
LIASCRIPT_PROGRESS_TOKEN_TTL |
Lifetime of the LiaScript player’s progress token, seconds | 14400 |
LIASCRIPT_PLAYER_BUILD_PATH |
Folder of the fetched LiaScript build | packages/liascript/resources/player/build |
LTI 1.3 (packages/lti)
Section titled “LTI 1.3 (packages/lti)”| Variable name | Description | Default |
|---|---|---|
LTI_ISSUER |
Our issuer and base URL of the LTI endpoints | APP_URL |
LTI_RETIRED_KEY_GRACE_DAYS |
Days a retired key stays in the JWKS | 30 |
LTI_KEY_BITS |
RSA key size (php-jwt requires at least 2048) | 2048 |
LTI_LOGIN_HINT_TTL |
Seconds a launch’s login hint is valid | 120 |
LTI_ID_TOKEN_TTL |
Lifetime of the id_token we sign, seconds | 300 |
LTI_ACCESS_TOKEN_TTL |
Lifetime of AGS access tokens we issue, seconds | 3600 |
LTI_STATE_TTL |
Lifetime of the tool-side OIDC state and nonce, seconds | 600 |
LTI_CODE_TTL |
Lifetime of the tool-side one-time sign-in code, seconds | 60 |
LTI_ALLOW_INSECURE_URLS |
Allow http and private addresses for tool/platform URLs. Development only | false |
LTI_HTTP_TIMEOUT |
Timeout of outgoing LTI requests, seconds | 10 |
LTI_JWKS_CACHE_TTL |
Cache lifetime of fetched key sets, seconds | 600 |
LTI_TOOL_LANDING_URL |
Where a tool-side launch lands ({front}, {code}, {course}) |
{front}/lti/launch?code={code}&course={course} |
Adapt Path B (packages/adapt, ADR 0013)
Section titled “Adapt Path B (packages/adapt, ADR 0013)”| Variable name | Description | Default |
|---|---|---|
ADAPT_SOURCE_ENABLED |
Adapt JSON sources and builds (off: the API answers 404) | false |
ADAPT_BUILDER_URL |
Build worker (GPL-3.0 service, compose profile adapt) |
http://adapt-builder:8080 |
ADAPT_BUILDER_TOKEN |
X-Internal-Token for the worker |
(empty) |
ADAPT_BUILDER_TIMEOUT |
Seconds to wait for a build | 300 |
ADAPT_MAX_SOURCE_KB |
Largest JSON source | 4096 |
Performance and runtime profile
Section titled “Performance and runtime profile”| Variable name | Description | Default |
|---|---|---|
DEMO_PERF |
Demo profile of the api container (make demo-up): production PHP settings, cached config/routes/events, vendor in a named volume. See php-profile.sh |
0 |
ULAMS_OPTIMIZE |
Build config/route/event/view caches per domain at start (set in the production image) | false (true in Dockerfile) |
LOG_LEVEL |
Minimum log level of the file/stderr channels (production template: warning) |
APP_LOG_LEVEL, then debug |
REDIS_CLIENT |
phpredis (C extension) or predis |
phpredis |
RESPONSE_CACHE_DRIVER |
Cache store of the response cache; must support tags (Redis) for targeted invalidation | the default cache store |
HTTP_CACHE_PUBLIC |
Cache-Control: public, s-maxage on anonymous catalogue GETs (config/http_cache.php) |
true |
HTTP_CACHE_S_MAXAGE |
Shared-cache lifetime of those responses, seconds | 60 |
HTTP_CACHE_STALE_WHILE_REVALIDATE |
Seconds a shared cache may serve them stale while it revalidates | 300 |
Every env() read in the code
Section titled “Every env() read in the code”Variables read with env() in api/config, api/app and the packages. Laravel’s LARAVEL_* prefixed variables (see the guide above) are mapped onto config keys at runtime and are not listed here.
| Variable | Default(s) in code | Read by |
|---|---|---|
ADAPT_BUILDER_TIMEOUT |
300 |
adapt |
ADAPT_BUILDER_TOKEN |
adapt | |
ADAPT_BUILDER_URL |
'http://adapt-builder:8080' |
adapt |
ADAPT_MAX_SOURCE_KB |
4096 |
adapt |
ADAPT_QUEUE |
in_array(env('QUEUE_CONNECTION' |
adapt |
ADAPT_QUEUE_CONNECTION |
in_array(env('QUEUE_CONNECTION' |
adapt |
ADAPT_SOURCE_ENABLED |
false |
adapt |
ADMIN_URL |
core, demo | |
AI_ALLOW_NETWORK_IN_TESTS |
false |
ai |
AI_CACHE_TTL |
'1h' |
ai |
AI_CASSETTES_PATH |
ai | |
AI_DEFAULT_FALLBACKS |
'default' |
ai |
AI_DRIVER |
'anthropic' |
ai, tenancy |
AI_FAKE_MODE |
'synthetic' |
ai |
AI_FALLBACKS_BETA |
'server-side-fallback-2026-07-01' |
ai |
AI_LIMIT_SUBJECT_COST_USD |
5 |
ai |
AI_LIMIT_SUBJECT_TOKENS |
3000000 |
ai |
AI_LIMIT_TENANT_MONTHLY_USD |
50 |
ai |
AI_MAX_RETRIES |
2 |
ai |
AI_MODEL_DEFAULT |
'claude-sonnet-5-5' |
ai, tenancy |
AI_MODEL_DEFAULT_LABEL |
'Sonnet' |
ai, tenancy |
AI_MODEL_LIGHT |
'claude-haiku-5-5' |
ai, tenancy |
AI_MODEL_LIGHT_LABEL |
'Haiku' |
ai, tenancy |
AI_MODEL_PREMIUM |
'claude-opus-5-5' |
ai, tenancy |
AI_MODEL_PREMIUM_LABEL |
'Opus' |
ai, tenancy |
AI_PREMIUM_FALLBACKS |
'default' |
ai |
AI_RECORD |
false |
ai |
AI_RECORD_PATH |
ai | |
AI_TASK_GROUNDING_PROFILE |
'light' |
ai |
AI_TASK_INTERACTION_H5P_PROFILE |
'default' |
ai |
AI_TASK_INTERACTION_INTERACTIVE_PROFILE |
'light' |
ai |
AI_TASK_INTERVIEW_PROFILE |
'light' |
ai |
AI_TASK_LESSON_PROFILE |
'default' |
ai |
AI_TASK_METADATA_PROFILE |
'light' |
ai |
AI_TASK_OUTLINE_PROFILE |
'default' |
ai |
AI_TASK_PATCH_PROFILE |
'default' |
ai |
AI_TASK_PRICE_PROFILE |
'light' |
ai |
AI_TASK_QUIZ_PROFILE |
'default' |
ai |
AI_TASK_SELFCHECK_PROFILE |
'default' |
ai |
AI_TASK_UPDATE_PROFILE |
'default' |
ai |
AI_TIMEOUT |
600 |
ai |
ANTHROPIC_API_KEY |
env('ANTROPHIC_API_KEY' |
ai, tenancy |
ANTHROPIC_BASE_URL |
ai, tenancy | |
APP_DEBUG |
false |
app, courses |
APP_ENV |
'production' |
app |
APP_KEY |
app | |
APP_NAME |
'Laravel' |
app |
APP_PUBLIC_STORAGE |
app | |
APP_URL |
'http://localhost:1000' |
app, files |
APP_VERSION |
'dev' |
auth |
ASSET_URL |
null |
app |
AUTH_AGENT_AUDIT_DAYS |
365 |
auth |
AUTH_DEVICE_APPROVE_PER_MINUTE |
5 |
auth |
AUTH_MAX_TOKENS_PER_USER |
50 |
auth |
AUTH_SUPERADMIN_EMAIL |
app, auth | |
AWS_ACCESS_KEY_ID |
app, courses, laravel-scorm, webinar | |
AWS_BUCKET |
app | |
AWS_DEFAULT_REGION |
'us-east-1' |
app, laravel-scorm |
AWS_ENDPOINT |
app | |
AWS_SCORM_BUCKET |
laravel-scorm | |
AWS_SECRET_ACCESS_KEY |
app, laravel-scorm | |
AWS_URL |
app, consultations | |
AWS_USE_PATH_STYLE_ENDPOINT |
false true |
app, tenancy |
BCRYPT_ROUNDS |
10 |
app |
BROADCAST_DRIVER |
'null' |
app |
BUILDER_QUEUE_RETRY_AFTER |
2400 |
app |
CACHE_BYPASS_HEADER_NAME |
app, courses | |
CACHE_BYPASS_HEADER_VALUE |
app, courses | |
CACHE_DRIVER |
'file' |
app |
CACHE_PREFIX |
Str::slug(env('APP_NAME', 'laravel' |
app |
CALLBACK_URL_FACEBOOK |
'http://localhost:1000/api/auth/social/facebook/callback' |
app |
CALLBACK_URL_GOOGLE |
'http://localhost:1000/api/auth/social/google/callback' |
app |
CART_OWNER_MODEL |
class_exists(App\Models\User::class |
app |
CMI5_DISK |
env('SCORM_DISK', 'local' |
cmi5 |
CMI5_SESSION_MINUTES |
120 |
lrs |
COMMERCE_FRONT_URL |
env('FRONTEND_URL' |
commerce |
COMMERCE_PROVIDER |
'wellms' |
commerce |
CONFIG_USE_DATABASE |
false |
settings |
CONTENT_ORIGIN |
app, uploads | |
COURSE_BUILDER_ADMIN_URL |
env('ADMIN_URL' |
course-builder |
COURSE_BUILDER_AUTO_FORMATS |
false |
course-builder |
COURSE_BUILDER_CONCURRENT_RUNS |
2 |
course-builder |
COURSE_BUILDER_DISK |
'course_builder_private' |
course-builder |
COURSE_BUILDER_DOCX_UNCOMPRESSED_MB |
100 |
course-builder |
COURSE_BUILDER_EVAL_MONTHLY_USD |
20 |
course-builder |
COURSE_BUILDER_EVENTS_RETENTION_DAYS |
30 |
course-builder |
COURSE_BUILDER_FRONT_URL |
env('FRONTEND_URL' |
course-builder |
COURSE_BUILDER_H5P |
true |
course-builder |
COURSE_BUILDER_INTERACTIVE |
true |
course-builder |
COURSE_BUILDER_LESSON_CONCURRENCY |
4 |
course-builder |
COURSE_BUILDER_LIASCRIPT |
true |
course-builder |
COURSE_BUILDER_PDF_PAGES |
300 |
course-builder |
COURSE_BUILDER_PRIVATE_ROOT |
storage_path('app/private' |
course-builder |
COURSE_BUILDER_QUEUE |
in_array(env('QUEUE_CONNECTION' |
course-builder |
COURSE_BUILDER_QUEUE_CONNECTION |
in_array(env('QUEUE_CONNECTION' |
course-builder |
COURSE_BUILDER_SESSION_COST_USD |
5 |
course-builder |
COURSE_BUILDER_SESSION_TOKENS |
3000000 |
course-builder |
COURSE_BUILDER_SESSIONS_PER_DAY |
10 |
course-builder |
COURSE_BUILDER_SOURCE_MB |
20 |
course-builder |
COURSE_BUILDER_SOURCE_TOKENS |
400000 |
course-builder |
COURSE_BUILDER_SSE_POLL_MS |
500 |
course-builder |
COURSE_BUILDER_SSE_SECONDS |
25 |
course-builder |
CSP_REPORT_RETENTION_DAYS |
30 |
core |
DB_ADMIN_DATABASE |
env('DB_DATABASE', 'postgres' |
app |
DB_ADMIN_HOST |
env('DB_HOST', '127.0.0.1' |
app |
DB_ADMIN_PASSWORD |
env('DB_PASSWORD', 'secret' |
app |
DB_ADMIN_PORT |
env('DB_PORT', '5432' |
app |
DB_ADMIN_USERNAME |
env('DB_USERNAME', 'default' |
app |
DB_CONNECTION |
'mysql' 'sqlite' |
app |
DB_DATABASE |
'forge' |
app |
DB_FOREIGN_KEYS |
true |
app |
DB_HOST |
'127.0.0.1' 'localhost' |
app |
DB_PASSWORD |
'' |
app |
DB_PORT |
'3306' '5432' '1433' |
app |
DB_SOCKET |
'' |
app |
DB_SQLITE_DATABASE |
__DIR__ . '/../database/database.sqlite' |
app |
DB_SSL_MODE |
'prefer' |
app |
DB_USERNAME |
'forge' |
app |
DEMO_ADMIN_EMAIL |
demo | |
DEMO_ADMIN_URL |
demo | |
DEMO_CONTENT_SEEDER |
'Database\\Seeders\\DemoCoursesSeeder' |
demo |
DEMO_MODE |
false |
demo |
DEMO_RESET_CRON |
'0 * * * *' |
demo |
DEMO_RESET_SCHEDULE |
true |
demo |
DEMO_RESET_STUDENTS |
5 |
demo |
DEMO_RESET_WIPE_FILES |
false |
demo |
DEMO_STUDENT_EMAIL |
demo | |
DEMO_TUTOR_EMAIL |
demo | |
DYNAMODB_CACHE_TABLE |
'cache' |
app |
EXAMPLE_PLUGIN_GREETING |
'Hello from the example plugin' |
example-plugin |
FACEBOOK_CLIENT_ID |
app | |
FACEBOOK_CLIENT_SECRET |
app | |
FILES_MAX_SIZE_MB |
512 |
files |
FILES_MIMES |
'avi,mov,mp3,mp4,wmv,pdf,doc,docx,ppt,png,jpg,jpeg,gif,webp, |
files |
FILESYSTEM_CLOUD |
's3' |
app |
FILESYSTEM_DRIVER |
'local' |
app |
FRONTEND_URL |
'http://localhost:1000/email' |
app, demo |
GOOGLE_CLIENT_ID |
app | |
GOOGLE_CLIENT_SECRET |
app | |
H5P_INTERNAL_TOKEN |
h5p | |
H5P_SERVICE_CONFIG_DIR |
tenancy | |
H5P_SERVICE_TIMEOUT |
300 |
h5p |
H5P_SERVICE_URL |
'http://h5p:8080' |
h5p |
HEALTH_DB_CONNECTION |
env('DB_CONNECTION' |
app |
HEALTH_SLACK_WEBHOOK_URL |
'' |
app |
HORIZON_DOMAIN |
null |
app |
HORIZON_PATH |
'horizon' |
app |
HORIZON_PREFIX |
Str::slug(env('APP_NAME', 'laravel' |
app |
HTTP_CACHE_PUBLIC |
true |
app |
HTTP_CACHE_S_MAXAGE |
60 |
app |
HTTP_CACHE_STALE_WHILE_REVALIDATE |
300 |
app |
INITIAL_USER_EMAIL |
'admin@' . $domain |
demo, tenancy |
INITIAL_USER_PASSWORD |
config('ulams_tenancy.demo_password' |
tenancy |
INTERACTIVE_ALLOW_NETWORK |
false |
interactive |
INTERACTIVE_DISK |
interactive | |
INTERACTIVE_ENABLED |
true |
interactive |
INVOICES_CURRENCY_FRACTION |
'ct.' |
invoices |
INVOICES_CURRENCY_SYMBOL |
'$' |
invoices |
INVOICES_LOGO |
invoices | |
JAAS_AUD |
'jitsi' |
jitsi |
JAAS_HOST |
'https://8x8.vc/' |
jitsi |
JAAS_ISS |
'chat' |
jitsi |
JAAS_KEY_ID |
'' |
jitsi |
JAAS_PRIVATE_KEY |
'' |
jitsi |
JAAS_RECORDING |
false |
jitsi |
JAAS_SUB |
'' |
jitsi |
JITSI_APP_ID |
'meet-id' |
jitsi |
JITSI_APP_SECRET |
'Test' |
jitsi |
JITSI_HOST |
'meet-stage.ulams.app' |
jitsi |
JITSI_RECORDING_DOWNLOAD_TIMEOUT |
600 |
jitsi |
JITSI_RECORDING_HOSTS |
'' |
jitsi |
JITSI_RECORDING_MAX_BYTES |
2 * 1024 * 1024 * 1024 |
jitsi |
JITSI_WEBHOOK_SECRET |
jitsi | |
JITSI_WEBHOOK_TOKEN |
jitsi | |
JITSI_WEBHOOK_TOLERANCE |
300 |
jitsi |
L5_FORMAT_TO_USE_FOR_DOCS |
'json' |
app |
L5_SWAGGER_BASE_PATH |
null |
app |
L5_SWAGGER_CONST_HOST |
'http://my-default-host.com' |
app |
L5_SWAGGER_GENERATE_ALWAYS |
true |
app |
L5_SWAGGER_GENERATE_YAML_COPY |
false |
app |
L5_SWAGGER_OPERATIONS_SORT |
null |
app |
L5_SWAGGER_UI_ASSETS_PATH |
'vendor/swagger-api/swagger-ui/dist/' |
app |
LIASCRIPT_DISK |
liascript | |
LIASCRIPT_MAX_MARKDOWN_KB |
2048 |
liascript |
LIASCRIPT_PLAYER_BUILD_PATH |
liascript | |
LIASCRIPT_PREVIEW_KEEP |
4 |
liascript |
LIASCRIPT_PREVIEW_TTL |
3600 |
liascript |
LIASCRIPT_PROGRESS_TOKEN_TTL |
14400 |
liascript |
LIVING_COURSE_ALLOWED_HOSTS |
'' |
living-course |
LIVING_COURSE_AUTO_ANALYSE_USD |
0.50 |
living-course |
LIVING_COURSE_CONNECTORS |
'upload,git,url' |
living-course |
LIVING_COURSE_INSECURE_HOSTS |
'' |
living-course |
LIVING_COURSE_LEARNER_NOTICE_AFTER_DAYS |
3 |
living-course |
LIVING_COURSE_MAX_FRAGMENTS |
4000 |
living-course |
LIVING_COURSE_MAX_GROUPS |
40 |
living-course |
LIVING_COURSE_MIN_POLL_MINUTES |
60 |
living-course |
LIVING_COURSE_PROPOSAL_COST_USD |
2 |
living-course |
LIVING_COURSE_QUEUE |
env('COURSE_BUILDER_QUEUE', in_array(env('QUEUE_CONNECTION' |
living-course |
LIVING_COURSE_QUEUE_CONNECTION |
env('COURSE_BUILDER_QUEUE_CONNECTION', in_array(env('QUEUE_C |
living-course |
LIVING_COURSE_SOURCE_MONTHLY_USD |
10 |
living-course |
LIVING_COURSE_WEBHOOK_DEBOUNCE_SECONDS |
600 |
living-course |
LOG_CHANNEL |
'stack' |
app |
LOG_LEVEL |
env('APP_LOG_LEVEL', 'debug' |
app |
LOG_SLACK_WEBHOOK_URL |
app | |
LOG_STDERR_FORMATTER |
app | |
LONG_JOB_QUEUE |
in_array(env('QUEUE_CONNECTION' |
app |
LONG_JOB_QUEUE_CONNECTION |
env('LONG_JOB_CONNECTION', in_array(env('QUEUE_CONNECTION' |
app |
LTI_ACCESS_TOKEN_TTL |
3600 |
lti |
LTI_ALLOW_INSECURE_URLS |
false |
lti |
LTI_CODE_TTL |
60 |
lti |
LTI_HTTP_TIMEOUT |
10 |
lti |
LTI_ID_TOKEN_TTL |
300 |
lti |
LTI_ISSUER |
lti | |
LTI_JWKS_CACHE_TTL |
600 |
lti |
LTI_KEY_BITS |
2048 |
lti |
LTI_LOGIN_HINT_TTL |
120 |
lti |
LTI_RETIRED_KEY_GRACE_DAYS |
30 |
lti |
LTI_STATE_TTL |
600 |
lti |
LTI_TOOL_LANDING_URL |
'{front}/lti/launch?code={code}&course={course}' |
lti |
MAIL_DRIVER |
'smtp' |
app |
MAIL_ENCRYPTION |
'tls' |
app |
MAIL_FROM_ADDRESS |
'hello@example.com' |
app |
MAIL_FROM_NAME |
'Example' |
app |
MAIL_HOST |
'smtp.mailgun.org' |
app |
MAIL_LOG_CHANNEL |
app | |
MAIL_PASSWORD |
app | |
MAIL_PORT |
587 |
app |
MAIL_USERNAME |
app | |
MAILGUN_DOMAIN |
app | |
MAILGUN_ENDPOINT |
'api.mailgun.net' |
app |
MAILGUN_SECRET |
app | |
MATTERMOST_AUTH |
'default' 'bearer' |
mattermost |
MATTERMOST_HOST |
'localhost' |
mattermost |
MATTERMOST_LOGIN |
'admin' |
mattermost |
MATTERMOST_PASSWORD |
'secret' |
mattermost |
MATTERMOST_SERVER |
'default' |
mattermost |
MATTERMOST_TOKEN |
'bearertoken' |
mattermost |
MEMCACHED_HOST |
'127.0.0.1' |
app |
MEMCACHED_PASSWORD |
app | |
MEMCACHED_PERSISTENT_ID |
app | |
MEMCACHED_PORT |
11211 |
app |
MEMCACHED_USERNAME |
app | |
MJML_API_ID |
app, templates-email | |
MJML_API_SECRET |
app, templates-email | |
MJML_API_URL |
false |
app, templates-email |
MJML_BINARY_PATH |
app, templates-email | |
MJML_USE_API |
false |
templates-email |
MYSQL_ATTR_SSL_CA |
app | |
OH_DEAR_HEALTH_CHECK_SECRET |
app | |
ORIGIN_CHECK |
true |
core |
PAGINATE_COUNT |
10 |
app |
PAPERTRAIL_PORT |
app | |
PAPERTRAIL_URL |
app | |
PASSPORT_CONNECTION |
app | |
PASSPORT_PRIVATE_KEY |
app | |
PASSPORT_PUBLIC_KEY |
app | |
PAYMENTS_DEFAULT_CURRENCY |
'USD' Ulams\Payments\Enums\Currency::USD |
app, invoices, payments |
PAYMENTS_DEFAULT_GATEWAY |
'Stripe' |
app, payments |
PAYMENTS_PRZELEWY24_API_KEY |
app, payments | |
PAYMENTS_PRZELEWY24_CRC |
app, payments | |
PAYMENTS_PRZELEWY24_LIVE |
false true |
app, payments |
PAYMENTS_PRZELEWY24_MERCHANT_ID |
app, payments | |
PAYMENTS_PRZELEWY24_POS_ID |
app, payments | |
PAYMENTS_REVENUECAT_ENABLED |
false |
payments |
PAYMENTS_REVENUECAT_RECEIPT_VERIFIER |
payments | |
PAYMENTS_STRIPE_API_BASE |
'https://api.stripe.com' |
payments |
PAYMENTS_STRIPE_PUBLISHABLE_KEY |
app, payments | |
PAYMENTS_STRIPE_SECRET_KEY |
app, payments | |
PAYMENTS_STRIPE_WEBHOOK_SECRET |
payments | |
PAYMENTS_STRIPE_WEBHOOK_TOLERANCE |
300 |
payments |
PDF_CERTIFICATE_VERIFY_URL |
'{APP_URL}/certificates/verify/{id}' |
templates-pdf |
PDF_INTERNAL_TOKEN |
templates-pdf | |
PDF_RENDER_ON_CREATE |
true |
templates-pdf |
PDF_SERVICE_TIMEOUT |
30 |
templates-pdf |
PDF_SERVICE_URL |
'http://pdf:3000' |
templates-pdf |
PDF_STORAGE_DIRECTORY |
'pdfs' |
templates-pdf |
PDF_STORAGE_DISK |
templates-pdf | |
PENCIL_SPACES_API_KEY |
pencil-spaces | |
PENCIL_SPACES_API_URL |
pencil-spaces | |
POSTMARK_TOKEN |
app | |
PUSHER_APP_CLUSTER |
'mt1' |
app |
PUSHER_APP_ENCRYPTED |
true |
app |
PUSHER_APP_HOST |
'127.0.0.1' |
app |
PUSHER_APP_ID |
app | |
PUSHER_APP_KEY |
app | |
PUSHER_APP_PORT |
6001 |
app |
PUSHER_APP_SCHEME |
'http' |
app |
PUSHER_APP_SECRET |
app | |
QUEUE_CONNECTION |
'sync' |
adapt, app, course-builder, living-course |
QUEUE_FAILED_DRIVER |
'database-uuids' |
app |
REDIS_CACHE_DB |
1 |
app |
REDIS_CLIENT |
'phpredis' |
app |
REDIS_CLUSTER |
'redis' |
app |
REDIS_DB |
0 |
app |
REDIS_HOST |
'127.0.0.1' |
app |
REDIS_PASSWORD |
null |
app |
REDIS_PORT |
6379 |
app |
REDIS_PREFIX |
Str::slug(env('APP_NAME', 'laravel' |
app |
REDIS_QUEUE |
'default' |
app |
RESPONSE_CACHE_DRIVER |
app, courses | |
RESPONSE_CACHE_ENABLED |
true |
app, courses |
RESPONSE_CACHE_LIFETIME |
60 * 60 * 24 * 7 |
app, courses |
RESPONSE_CACHE_TAG |
'' |
app, courses |
SCORM_DISK |
'local' |
app |
SCORM_ROOT_DIR |
laravel-scorm | |
SCORM_TRACKING_TOKEN_TTL |
14400 |
app |
SENTRY_ENVIRONMENT |
app | |
SENTRY_LARAVEL_DSN |
env('SENTRY_DSN' |
app |
SENTRY_PROFILES_SAMPLE_RATE |
app | |
SENTRY_RELEASE |
app | |
SENTRY_SEND_DEFAULT_PII |
false |
app |
SENTRY_TRACE_QUEUE_ENABLED |
false |
app |
SENTRY_TRACE_REDIS_COMMANDS |
false |
app |
SENTRY_TRACES_SAMPLE_RATE |
app | |
SESSION_CONNECTION |
null |
app |
SESSION_COOKIE |
$hostPrefix.Str::slug(env('APP_NAME', 'laravel' |
app |
SESSION_COOKIE_PREFIX |
env('APP_ENV' |
app |
SESSION_DRIVER |
'file' |
app |
SESSION_LIFETIME |
120 |
app |
SESSION_SECURE_COOKIE |
$hostPrefix !== '' |
app |
SESSION_STORE |
null |
app |
SHOPPING_CART_TAX_MODE |
'flat' |
shopping-cart |
SHOPPING_CART_TAX_RATE |
0 |
shopping-cart |
SPARKPOST_SECRET |
app | |
SQS_PREFIX |
'https://sqs.us-east-1.amazonaws.com/your-account-id' |
app |
SQS_QUEUE |
'your-queue-name' |
app |
STRIPE_KEY |
app | |
STRIPE_SECRET |
app | |
TELESCOPE_BATCH_WATCHER |
true |
app |
TELESCOPE_CACHE_WATCHER |
true |
app |
TELESCOPE_CLIENT_REQUEST_WATCHER |
true |
app |
TELESCOPE_COMMAND_WATCHER |
true |
app |
TELESCOPE_DOMAIN |
null |
app |
TELESCOPE_DRIVER |
'database' |
app |
TELESCOPE_DUMP_WATCHER |
true |
app |
TELESCOPE_ENABLED |
true |
app |
TELESCOPE_EVENT_WATCHER |
true |
app |
TELESCOPE_EXCEPTION_WATCHER |
true |
app |
TELESCOPE_GATE_WATCHER |
true |
app |
TELESCOPE_JOB_WATCHER |
true |
app |
TELESCOPE_LOG_WATCHER |
true |
app |
TELESCOPE_MAIL_WATCHER |
true |
app |
TELESCOPE_MODEL_WATCHER |
true |
app |
TELESCOPE_NOTIFICATION_WATCHER |
true |
app |
TELESCOPE_PATH |
'telescope' |
app |
TELESCOPE_QUERY_WATCHER |
true |
app |
TELESCOPE_REDIS_WATCHER |
true |
app |
TELESCOPE_REQUEST_WATCHER |
true |
app |
TELESCOPE_RESPONSE_SIZE_LIMIT |
64 |
app |
TELESCOPE_SCHEDULE_WATCHER |
true |
app |
TELESCOPE_VIEW_WATCHER |
true |
app |
TENANCY_ADMIN_CONNECTION |
'pgsql_admin' |
tenancy |
TENANCY_ADMIN_HOST |
'{slug}.admin.localhost' |
tenancy |
TENANCY_API_HOST |
'{slug}.localhost' |
tenancy |
TENANCY_BUCKET |
'ulams-{slug}' |
tenancy |
TENANCY_BUCKET_PUBLIC_URL |
tenancy | |
TENANCY_CONTENT_HOST |
'{slug}.content.localhost' |
tenancy |
TENANCY_DATABASE |
'ulams_{slug}' |
tenancy |
TENANCY_DATABASE_PROVISIONER |
'admin' |
tenancy |
TENANCY_EMAIL_DOMAIN |
'{slug}.ulams.app' |
tenancy |
TENANCY_ENFORCE_HOSTS |
true |
tenancy |
TENANCY_FRONT_HOST |
'{slug}.app.localhost' |
tenancy |
TENANCY_NEW_SITES |
false |
tenancy |
TENANCY_PHP_BINARY |
PHP_BINARY ?: 'php' |
tenancy |
TENANCY_PLATFORM_API |
false |
tenancy |
TENANCY_PLATFORM_HOST |
'api.localhost' |
tenancy |
TENANCY_PLATFORM_HOSTS |
'api.localhost,localhost,127.0.0.1,caddy,api' |
tenancy |
TENANCY_PROCESS_TIMEOUT |
900 |
tenancy |
TENANCY_REDIS_PREFIX |
'ulams_{slug}_' |
tenancy |
TENANCY_S3_ENDPOINT |
env('AWS_ENDPOINT' |
tenancy |
TENANCY_S3_KEY |
env('AWS_ACCESS_KEY_ID' |
tenancy |
TENANCY_S3_PUBLIC_READ_POLICY |
true |
tenancy |
TENANCY_S3_REGION |
env('AWS_DEFAULT_REGION', 'us-east-1' |
tenancy |
TENANCY_S3_SECRET |
env('AWS_SECRET_ACCESS_KEY' |
tenancy |
TENANCY_SCHEDULER_LOCK |
true |
tenancy |
TENANCY_SCHEME |
'http' |
tenancy |
TENANCY_STORAGE_PUBLIC_URL |
'http://storage.localhost' |
tenancy |
TENANT_DEMO_PASSWORD |
'secret' |
tenancy |
TENANT_SLUG |
demo, tenancy | |
TOPIC_RESOURCE_FILES_MIMES |
'avi,mov,mp3,mp4,wmv,pdf,doc,docx,ppt,png,jpg,jpeg,gif,zip' |
courses |
TRUSTED_ORIGINS |
core | |
ULAMS_DEMO_EXPERIENCE |
demo | |
UPLOADS_CLAMD_FAIL_CLOSED |
true |
uploads |
UPLOADS_CLAMD_HOST |
'clamav' |
uploads |
UPLOADS_CLAMD_PORT |
3310 |
uploads |
UPLOADS_CLAMD_TIMEOUT |
60 |
uploads |
UPLOADS_COURSE_IMPORT_MAX_ENTRIES |
10000 |
uploads |
UPLOADS_SCANNER |
'null' |
uploads |
UPLOADS_ZIP_MAX_ENTRIES |
5000 |
uploads |
UPLOADS_ZIP_MAX_RATIO |
200 |
uploads |
VIDEO_DISK |
config('filesystems.default' |
video |
VIDEO_NON_STRICT_VALUE |
false |
video |
VIDEO_PROCESSING_ENABLE |
true |
video |
VIDEO_QUEUE |
'queue-long-job' |
video |
VIDEO_QUEUE_CONNECTION |
env('QUEUE_CONNECTION' |
video |
VIEW_COMPILED_PATH |
realpath(storage_path('framework/views' |
app |