[{"data":1,"prerenderedAt":2350},["ShallowReactive",2],{"navigation_docs_en":3,"-en-reference-configuration":342,"-en-reference-configuration-surround":2345},[4,45,61,96,132,166,196,217,241,265],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Coming from Laravel","\u002Fen\u002Fgetting-started\u002Fcoming-from-laravel","en\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Coming from Symfony","\u002Fen\u002Fgetting-started\u002Fcoming-from-symfony","en\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Installation","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Your first module","\u002Fen\u002Fgetting-started\u002Ffirst-module","en\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Project structure","\u002Fen\u002Fgetting-started\u002Fproject-structure","en\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"The shop sample application","\u002Fen\u002Fgetting-started\u002Fsample-app","en\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Reference","i-lucide-book-open","\u002Fen\u002Freference","en\u002F10.reference",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Configuration","\u002Fen\u002Freference\u002Fconfiguration","en\u002F10.reference\u002F1.configuration","i-lucide-settings",{"title":57,"path":58,"stem":59,"icon":60},"External dependencies","\u002Fen\u002Freference\u002Fdependencies","en\u002F10.reference\u002F2.dependencies","i-lucide-package",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":44},"Concepts","i-lucide-lightbulb","\u002Fen\u002Fconcepts","en\u002F2.concepts",[67,72,77,82,86,91],{"title":68,"path":69,"stem":70,"icon":71},"Architecture","\u002Fen\u002Fconcepts\u002Farchitecture","en\u002F2.concepts\u002F1.architecture","i-lucide-layers",{"title":73,"path":74,"stem":75,"icon":76},"Application lifecycle","\u002Fen\u002Fconcepts\u002Fapplication-lifecycle","en\u002F2.concepts\u002F2.application-lifecycle","i-lucide-power",{"title":78,"path":79,"stem":80,"icon":81},"Error model","\u002Fen\u002Fconcepts\u002Ferror-model","en\u002F2.concepts\u002F3.error-model","i-lucide-shield-alert",{"title":52,"path":83,"stem":84,"icon":85},"\u002Fen\u002Fconcepts\u002Fconfiguration","en\u002F2.concepts\u002F4.configuration","i-lucide-settings-2",{"title":87,"path":88,"stem":89,"icon":90},"Codegen pipeline","\u002Fen\u002Fconcepts\u002Fcodegen-pipeline","en\u002F2.concepts\u002F5.codegen-pipeline","i-lucide-file-json",{"title":92,"path":93,"stem":94,"icon":95},"Design patterns","\u002Fen\u002Fconcepts\u002Fdesign-patterns","en\u002F2.concepts\u002F6.design-patterns","i-lucide-puzzle",{"title":97,"icon":98,"path":99,"stem":100,"children":101,"page":44},"HTTP & Routing","i-lucide-globe","\u002Fen\u002Fhttp","en\u002F3.http",[102,107,112,117,122,127],{"title":103,"path":104,"stem":105,"icon":106},"The server core","\u002Fen\u002Fhttp\u002Fserver","en\u002F3.http\u002F1.server","i-lucide-server",{"title":108,"path":109,"stem":110,"icon":111},"The Fiber engine","\u002Fen\u002Fhttp\u002Ffiber","en\u002F3.http\u002F2.fiber","i-lucide-zap",{"title":113,"path":114,"stem":115,"icon":116},"The chi engine","\u002Fen\u002Fhttp\u002Fchi","en\u002F3.http\u002F3.chi","i-lucide-route",{"title":118,"path":119,"stem":120,"icon":121},"Error responses","\u002Fen\u002Fhttp\u002Ferror-responses","en\u002F3.http\u002F4.error-responses","i-lucide-octagon-alert",{"title":123,"path":124,"stem":125,"icon":126},"Validation","\u002Fen\u002Fhttp\u002Fvalidation","en\u002F3.http\u002F5.validation","i-lucide-badge-check",{"title":128,"path":129,"stem":130,"icon":131},"Pagination","\u002Fen\u002Fhttp\u002Fpagination","en\u002F3.http\u002F6.pagination","i-lucide-list-ordered",{"title":133,"icon":134,"path":135,"stem":136,"children":137,"page":44},"Database","i-lucide-database","\u002Fen\u002Fdatabase","en\u002F4.database",[138,142,147,151,156,161],{"title":139,"path":140,"stem":141,"icon":134},"Overview","\u002Fen\u002Fdatabase\u002Foverview","en\u002F4.database\u002F1.overview",{"title":143,"path":144,"stem":145,"icon":146},"pgx","\u002Fen\u002Fdatabase\u002Fpgx","en\u002F4.database\u002F2.pgx","i-lucide-plug",{"title":148,"path":149,"stem":150,"icon":71},"bun","\u002Fen\u002Fdatabase\u002Fbun","en\u002F4.database\u002F3.bun",{"title":152,"path":153,"stem":154,"icon":155},"Transactions","\u002Fen\u002Fdatabase\u002Ftransactions","en\u002F4.database\u002F4.transactions","i-lucide-git-merge",{"title":157,"path":158,"stem":159,"icon":160},"Migrations","\u002Fen\u002Fdatabase\u002Fmigrations","en\u002F4.database\u002F5.migrations","i-lucide-file-stack",{"title":162,"path":163,"stem":164,"icon":165},"Seeders","\u002Fen\u002Fdatabase\u002Fseeding","en\u002F4.database\u002F6.seeding","i-lucide-sprout",{"title":167,"icon":168,"path":169,"stem":170,"children":171,"page":44},"Async & Background","i-lucide-workflow","\u002Fen\u002Fasync","en\u002F5.async",[172,176,181,186,191],{"title":173,"path":174,"stem":175,"icon":131},"Queue","\u002Fen\u002Fasync\u002Fqueue","en\u002F5.async\u002F1.queue",{"title":177,"path":178,"stem":179,"icon":180},"Events","\u002Fen\u002Fasync\u002Fevents","en\u002F5.async\u002F2.events","i-lucide-radio",{"title":182,"path":183,"stem":184,"icon":185},"Outbox","\u002Fen\u002Fasync\u002Foutbox","en\u002F5.async\u002F3.outbox","i-lucide-inbox",{"title":187,"path":188,"stem":189,"icon":190},"Scheduling","\u002Fen\u002Fasync\u002Fscheduler","en\u002F5.async\u002F4.scheduler","i-lucide-calendar-clock",{"title":192,"path":193,"stem":194,"icon":195},"Worker","\u002Fen\u002Fasync\u002Fworker","en\u002F5.async\u002F5.worker","i-lucide-cog",{"title":197,"icon":198,"path":199,"stem":200,"children":201,"page":44},"Security","i-lucide-shield-check","\u002Fen\u002Fsecurity","en\u002F6.security",[202,207,212],{"title":203,"path":204,"stem":205,"icon":206},"Authentication","\u002Fen\u002Fsecurity\u002Fauthentication","en\u002F6.security\u002F1.authentication","i-lucide-key-round",{"title":208,"path":209,"stem":210,"icon":211},"RBAC","\u002Fen\u002Fsecurity\u002Frbac","en\u002F6.security\u002F2.rbac","i-lucide-users",{"title":213,"path":214,"stem":215,"icon":216},"Policies","\u002Fen\u002Fsecurity\u002Fpolicies","en\u002F6.security\u002F3.policies","i-lucide-gavel",{"title":218,"icon":219,"path":220,"stem":221,"children":222,"page":44},"Observability","i-lucide-activity","\u002Fen\u002Fobservability","en\u002F7.observability",[223,226,231,236],{"title":139,"path":224,"stem":225,"icon":219},"\u002Fen\u002Fobservability\u002Foverview","en\u002F7.observability\u002F1.overview",{"title":227,"path":228,"stem":229,"icon":230},"Logging","\u002Fen\u002Fobservability\u002Flogging","en\u002F7.observability\u002F2.logging","i-lucide-scroll-text",{"title":232,"path":233,"stem":234,"icon":235},"OpenTelemetry","\u002Fen\u002Fobservability\u002Fopentelemetry","en\u002F7.observability\u002F3.opentelemetry","i-lucide-radar",{"title":237,"path":238,"stem":239,"icon":240},"Sentry","\u002Fen\u002Fobservability\u002Fsentry","en\u002F7.observability\u002F4.sentry","i-lucide-bug",{"title":242,"icon":243,"path":244,"stem":245,"children":246,"page":44},"Storage & Mail","i-lucide-hard-drive","\u002Fen\u002Fstorage-mail","en\u002F8.storage-mail",[247,251,256,261],{"title":248,"path":249,"stem":250,"icon":243},"Storage","\u002Fen\u002Fstorage-mail\u002Fstorage","en\u002F8.storage-mail\u002F1.storage",{"title":252,"path":253,"stem":254,"icon":255},"Email","\u002Fen\u002Fstorage-mail\u002Fmail","en\u002F8.storage-mail\u002F2.mail","i-lucide-mail",{"title":257,"path":258,"stem":259,"icon":260},"Notifications","\u002Fen\u002Fstorage-mail\u002Fnotifications","en\u002F8.storage-mail\u002F3.notifications","i-lucide-bell",{"title":262,"path":263,"stem":264,"icon":180},"Realtime","\u002Fen\u002Fstorage-mail\u002Frealtime","en\u002F8.storage-mail\u002F4.realtime",{"title":266,"icon":267,"path":268,"stem":269,"children":270,"page":44},"CLI Reference","i-lucide-terminal","\u002Fen\u002Fcli","en\u002F9.cli",[271,274,279,284,289,294,299,303,308,313,318,323,328,333,337],{"title":139,"path":272,"stem":273,"icon":267},"\u002Fen\u002Fcli\u002Foverview","en\u002F9.cli\u002F1.overview",{"title":275,"path":276,"stem":277,"icon":278},"add db","\u002Fen\u002Fcli\u002Fadd-db","en\u002F9.cli\u002F10.add-db","i-lucide-database-zap",{"title":280,"path":281,"stem":282,"icon":283},"add compose \u002F add docker","\u002Fen\u002Fcli\u002Fadd-compose","en\u002F9.cli\u002F11.add-compose","i-lucide-container",{"title":285,"path":286,"stem":287,"icon":288},"add mail","\u002Fen\u002Fcli\u002Fadd-mail","en\u002F9.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":290,"path":291,"stem":292,"icon":293},"add notification","\u002Fen\u002Fcli\u002Fadd-notification","en\u002F9.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":295,"path":296,"stem":297,"icon":298},"add realtime","\u002Fen\u002Fcli\u002Fadd-realtime","en\u002F9.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":300,"path":301,"stem":302,"icon":165},"add seeder","\u002Fen\u002Fcli\u002Fadd-seeder","en\u002F9.cli\u002F15.add-seeder",{"title":304,"path":305,"stem":306,"icon":307},"new project","\u002Fen\u002Fcli\u002Fnew-project","en\u002F9.cli\u002F2.new-project","i-lucide-folder-plus",{"title":309,"path":310,"stem":311,"icon":312},"new module","\u002Fen\u002Fcli\u002Fnew-module","en\u002F9.cli\u002F3.new-module","i-lucide-blocks",{"title":314,"path":315,"stem":316,"icon":317},"add surface","\u002Fen\u002Fcli\u002Fadd-surface","en\u002F9.cli\u002F4.add-surface","i-lucide-layers-2",{"title":319,"path":320,"stem":321,"icon":322},"add core","\u002Fen\u002Fcli\u002Fadd-core","en\u002F9.cli\u002F5.add-core","i-lucide-box",{"title":324,"path":325,"stem":326,"icon":327},"add handler","\u002Fen\u002Fcli\u002Fadd-handler","en\u002F9.cli\u002F6.add-handler","i-lucide-webhook",{"title":329,"path":330,"stem":331,"icon":332},"new migration","\u002Fen\u002Fcli\u002Fnew-migration","en\u002F9.cli\u002F7.new-migration","i-lucide-file-plus",{"title":334,"path":335,"stem":336,"icon":195},"worker generators","\u002Fen\u002Fcli\u002Fworker-generators","en\u002F9.cli\u002F8.worker-generators",{"title":338,"path":339,"stem":340,"icon":341},"upgrade templates","\u002Fen\u002Fcli\u002Fupgrade-templates","en\u002F9.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"id":343,"title":52,"body":344,"description":2338,"extension":2339,"links":2340,"meta":2341,"navigation":2342,"path":53,"seo":2343,"stem":54,"__hash__":2344},"docs_en\u002Fen\u002F10.reference\u002F1.configuration.md",{"type":345,"value":346,"toc":2310},"minimark",[347,373,404,407,588,593,599,767,771,793,798,803,871,889,893,897,982,986,990,1071,1077,1083,1194,1235,1239,1261,1367,1373,1378,1472,1481,1487,1492,1597,1603,1608,1763,1770,1775,1829,1835,1840,1931,1938,1944,2005,2013,2049,2142,2149,2171,2274,2306],[348,349,350,351,355,356,359,360,363,364,368,369,372],"p",{},"Kit packages never read env vars on their own: each package exports a ",[352,353,354],"code",{},"Config"," struct, which you compose in your project's ",[352,357,358],{},"internal\u002Fplatform\u002Fconfig\u002Fconfig.go"," and load with ",[352,361,362],{},"envconf.MustLoad[config.Config]()",". See the ",[365,366,367],"a",{"href":83},"configuration concept",". In development a ",[352,370,371],{},".env"," file is read; real environment variables always win.",[374,375,376,384,385,388,389,392,393,392,396,399,400,403],"note",{},[377,378,379,380,383],"strong",{},"There is no ",[352,381,382],{},"GPSYSTEM_*"," namespace."," Variable name prefixes are determined not by the kit but by the composing struct's ",[352,386,387],{},"envPrefix"," tag: the ",[352,390,391],{},"DB_",", ",[352,394,395],{},"S3_",[352,397,398],{},"MAIL_"," etc. prefixes are conventions of the generated project. The same struct mounts under a different prefix too, ",[352,401,402],{},"envconf.LoadPrefixed[dbx.Config](\"ANALYTICS_DB_\")"," maps the same struct onto a different variable set.",[348,405,406],{},"A generated project's config composes like this:",[408,409,414],"pre",{"className":410,"code":411,"filename":358,"language":412,"meta":413,"style":413},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","type Config struct {\n    Server server.Config                 \u002F\u002F no prefix: LISTEN_ADDR, ...\n    DB     dbx.Config    `envPrefix:\"DB_\"`\n    Worker worker.Config                 \u002F\u002F WORKER_* + embedded REDIS_\u002FSCHEDULER_\n    Outbox outbox.Config `envPrefix:\"OUTBOX_\"`\n    \u002F\u002F added by hand when needed:\n    Storage s3.Config     `envPrefix:\"S3_\"`\n    Mail    smtp.Config   `envPrefix:\"MAIL_\"`\n    JWT     auth.Config   `envPrefix:\"JWT_\"`\n}\n","go","",[352,415,416,435,454,477,493,514,520,541,562,582],{"__ignoreMap":413},[417,418,421,425,429,432],"span",{"class":419,"line":420},"line",1,[417,422,424],{"class":423},"sMK4o","type",[417,426,428],{"class":427},"sBMFI"," Config",[417,430,431],{"class":423}," struct",[417,433,434],{"class":423}," {\n",[417,436,438,442,445,448,450],{"class":419,"line":437},2,[417,439,441],{"class":440},"sTEyZ","    Server ",[417,443,444],{"class":427},"server",[417,446,447],{"class":423},".",[417,449,354],{"class":427},[417,451,453],{"class":452},"sHwdD","                 \u002F\u002F no prefix: LISTEN_ADDR, ...\n",[417,455,457,460,463,465,467,470,474],{"class":419,"line":456},3,[417,458,459],{"class":440},"    DB     ",[417,461,462],{"class":427},"dbx",[417,464,447],{"class":423},[417,466,354],{"class":427},[417,468,469],{"class":423},"    `",[417,471,473],{"class":472},"sfazB","envPrefix:\"DB_\"",[417,475,476],{"class":423},"`\n",[417,478,480,483,486,488,490],{"class":419,"line":479},4,[417,481,482],{"class":440},"    Worker ",[417,484,485],{"class":427},"worker",[417,487,447],{"class":423},[417,489,354],{"class":427},[417,491,492],{"class":452},"                 \u002F\u002F WORKER_* + embedded REDIS_\u002FSCHEDULER_\n",[417,494,496,499,502,504,506,509,512],{"class":419,"line":495},5,[417,497,498],{"class":440},"    Outbox ",[417,500,501],{"class":427},"outbox",[417,503,447],{"class":423},[417,505,354],{"class":427},[417,507,508],{"class":423}," `",[417,510,511],{"class":472},"envPrefix:\"OUTBOX_\"",[417,513,476],{"class":423},[417,515,517],{"class":419,"line":516},6,[417,518,519],{"class":452},"    \u002F\u002F added by hand when needed:\n",[417,521,523,526,529,531,533,536,539],{"class":419,"line":522},7,[417,524,525],{"class":440},"    Storage ",[417,527,528],{"class":427},"s3",[417,530,447],{"class":423},[417,532,354],{"class":427},[417,534,535],{"class":423},"     `",[417,537,538],{"class":472},"envPrefix:\"S3_\"",[417,540,476],{"class":423},[417,542,544,547,550,552,554,557,560],{"class":419,"line":543},8,[417,545,546],{"class":440},"    Mail    ",[417,548,549],{"class":427},"smtp",[417,551,447],{"class":423},[417,553,354],{"class":427},[417,555,556],{"class":423},"   `",[417,558,559],{"class":472},"envPrefix:\"MAIL_\"",[417,561,476],{"class":423},[417,563,565,568,571,573,575,577,580],{"class":419,"line":564},9,[417,566,567],{"class":440},"    JWT     ",[417,569,570],{"class":427},"auth",[417,572,447],{"class":423},[417,574,354],{"class":427},[417,576,556],{"class":423},[417,578,579],{"class":472},"envPrefix:\"JWT_\"",[417,581,476],{"class":423},[417,583,585],{"class":419,"line":584},10,[417,586,587],{"class":423},"}\n",[589,590,592],"h2",{"id":591},"serverconfig-no-prefix","server.Config: no prefix",[348,594,595,596,447],{},"Lifecycle and limits of the HTTP server, regardless of engine. See ",[365,597,598],{"href":104},"Server",[600,601,602,618],"table",{},[603,604,605],"thead",{},[606,607,608,612,615],"tr",{},[609,610,611],"th",{},"Variable",[609,613,614],{},"Default",[609,616,617],{},"Meaning",[619,620,621,637,652,671,685,700,715,730,745],"tbody",{},[606,622,623,629,634],{},[624,625,626],"td",{},[352,627,628],{},"LISTEN_ADDR",[624,630,631],{},[352,632,633],{},":3000",[624,635,636],{},"the address the engine (Fiber or chi) listens on",[606,638,639,644,649],{},[624,640,641],{},[352,642,643],{},"SHUTDOWN_TIMEOUT",[624,645,646],{},[352,647,648],{},"10s",[624,650,651],{},"graceful shutdown budget: after SIGINT\u002FSIGTERM, in-flight requests get this long",[606,653,654,659,664],{},[624,655,656],{},[352,657,658],{},"READ_HEADER_TIMEOUT",[624,660,661],{},[352,662,663],{},"5s",[624,665,666,667,670],{},"limit for receiving the request headers (separate only on the net\u002Fhttp-based chi; Fiber folds it into ",[352,668,669],{},"READ_TIMEOUT","), the primary Slowloris defense",[606,672,673,677,682],{},[624,674,675],{},[352,676,669],{},[624,678,679],{},[352,680,681],{},"30s",[624,683,684],{},"limit for reading the whole request (headers + body)",[606,686,687,692,697],{},[624,688,689],{},[352,690,691],{},"WRITE_TIMEOUT",[624,693,694],{},[352,695,696],{},"0s",[624,698,699],{},"limit for writing the response; disabled by default because it would also cut off streaming\u002Flarge downloads. Enable it when all your endpoints are short-lived",[606,701,702,707,712],{},[624,703,704],{},[352,705,706],{},"IDLE_TIMEOUT",[624,708,709],{},[352,710,711],{},"120s",[624,713,714],{},"how long an idle keep-alive connection stays open",[606,716,717,722,727],{},[624,718,719],{},[352,720,721],{},"CORS_ORIGINS",[624,723,724],{},[352,725,726],{},"*",[624,728,729],{},"comma-separated allowed origins",[606,731,732,737,742],{},[624,733,734],{},[352,735,736],{},"BODY_LIMIT",[624,738,739],{},[352,740,741],{},"4194304",[624,743,744],{},"max request body size in bytes (4 MiB); a value ≤ 0 also means the default, the cap can never be disabled by accident",[606,746,747,752,757],{},[624,748,749],{},[352,750,751],{},"HTTP_EXPOSE_INTERNAL_ERRORS",[624,753,754],{},[352,755,756],{},"false",[624,758,759,760,763,764],{},"5xx responses include the underlying error message, stack, and wrap chain (",[377,761,762],{},"development only","); deliberately decoupled from ",[352,765,766],{},"OTEL_DEV_MODE",[589,768,770],{"id":769},"telemetryconfig-nested-no-prefix","telemetry.Config: nested, no prefix",[348,772,773,776,777,780,781,784,785,788,789,792],{},[352,774,775],{},"server.Config.Telemetry"," and ",[352,778,779],{},"worker.Config.Telemetry"," both carry the ",[352,782,783],{},"telemetry.Config{Otel, Log, Sentry}"," trio; ",[352,786,787],{},"telemetry.Setup"," composes the three subsystems in one call. See the ",[365,790,791],{"href":224},"observability overview",". All variables are read under standard names at the top level, regardless of nesting depth.",[794,795,797],"h3",{"id":796},"otelxconfig-otel-bootstrap","otelx.Config: OTel bootstrap",[348,799,800,801,447],{},"See ",[365,802,232],{"href":233},[600,804,805,815],{},[603,806,807],{},[606,808,809,811,813],{},[609,810,611],{},[609,812,614],{},[609,814,617],{},[619,816,817,837,855],{},[606,818,819,824,827],{},[624,820,821],{},[352,822,823],{},"OTEL_SERVICE_NAME",[624,825,826],{},"required",[624,828,829,832,833,836],{},[377,830,831],{},"required unless dev mode",": ",[352,834,835],{},"service.name"," on all telemetry",[606,838,839,844,849],{},[624,840,841],{},[352,842,843],{},"OTEL_SERVICE_VERSION",[624,845,846],{},[352,847,848],{},"dev",[624,850,851,854],{},[352,852,853],{},"service.version"," resource attribute",[606,856,857,861,865],{},[624,858,859],{},[352,860,766],{},[624,862,863],{},[352,864,756],{},[624,866,867,870],{},[352,868,869],{},"true"," → no OTel exporters are created (unless Sentry tracing supplies one)",[374,872,873,874,877,878,392,881,884,885,888],{},"Exporter endpoints deliberately do ",[377,875,876],{},"not"," live in the kit's config: the standard ",[352,879,880],{},"OTEL_EXPORTER_OTLP_ENDPOINT",[352,882,883],{},"OTEL_TRACES_EXPORTER"," etc. variables apply (via OTel's ",[352,886,887],{},"autoexport"," package); deployments configure the kit the same way as any other OTel-instrumented application.",[794,890,892],{"id":891},"logxconfig-the-default-slog-logger","logx.Config: the default slog logger",[348,894,800,895,447],{},[365,896,227],{"href":228},[600,898,899,909],{},[603,900,901],{},[606,902,903,905,907],{},[609,904,611],{},[609,906,614],{},[609,908,617],{},[619,910,911,939,957],{},[606,912,913,918,923],{},[624,914,915],{},[352,916,917],{},"LOG_LEVEL",[624,919,920],{},[352,921,922],{},"INFO",[624,924,925,926,929,930,929,932,929,935,938],{},"minimum slog level (",[352,927,928],{},"DEBUG","\u002F",[352,931,922],{},[352,933,934],{},"WARN",[352,936,937],{},"ERROR",")",[606,940,941,946,950],{},[624,942,943],{},[352,944,945],{},"LOG_STDOUT",[624,947,948],{},[352,949,756],{},[624,951,952,953,956],{},"in prod mode, logs are ",[377,954,955],{},"also"," written to stdout (besides the OTLP bridge); leave it off when a collector scrapes container output too, or logs are ingested twice",[606,958,959,964,967],{},[624,960,961],{},[352,962,963],{},"LOG_FORMAT",[624,965,966],{},"empty",[624,968,969,970,973,974,977,978,981],{},"console format: empty\u002F",[352,971,972],{},"auto"," → text (dev) or JSON (prod); ",[352,975,976],{},"monolog"," → PHP\u002FMonolog-style lines with full-path stack traces (",[352,979,980],{},"logx\u002Fmonolog","); any other value fails at startup",[794,983,985],{"id":984},"sentryxconfig-the-optional-sentry-integration","sentryx.Config: the optional Sentry integration",[348,987,800,988,447],{},[365,989,237],{"href":238},[600,991,992,1002],{},[603,993,994],{},[606,995,996,998,1000],{},[609,997,611],{},[609,999,614],{},[609,1001,617],{},[619,1003,1004,1016,1036,1057],{},[606,1005,1006,1011,1013],{},[624,1007,1008],{},[352,1009,1010],{},"SENTRY_DSN",[624,1012,966],{},[624,1014,1015],{},"empty → the integration is fully disabled, every hook is a no-op",[606,1017,1018,1023,1033],{},[624,1019,1020],{},[352,1021,1022],{},"SENTRY_ENVIRONMENT",[624,1024,1025,1028,1029,1032],{},[352,1026,1027],{},"development"," in dev mode, ",[352,1030,1031],{},"production"," otherwise",[624,1034,1035],{},"environment tag on Sentry events",[606,1037,1038,1043,1047],{},[624,1039,1040],{},[352,1041,1042],{},"SENTRY_TRACES",[624,1044,1045],{},[352,1046,869],{},[624,1048,1049,1050,1052,1053,1056],{},"OTel spans are also shipped to Sentry (as an additional exporter); ",[352,1051,756],{}," when a collector forwards them, sampling is governed by ",[352,1054,1055],{},"OTEL_TRACES_SAMPLER",", not a separate Sentry rate",[606,1058,1059,1064,1068],{},[624,1060,1061],{},[352,1062,1063],{},"SENTRY_DEBUG",[624,1065,1066],{},[352,1067,756],{},[624,1069,1070],{},"the Sentry SDK's own debug logging to stderr",[589,1072,1074,1075],{"id":1073},"dbxconfig-envprefixdb_","dbx.Config: ",[352,1076,473],{},[348,1078,1079,1080,447],{},"PostgreSQL connection, see the ",[365,1081,1082],{"href":140},"database overview",[600,1084,1085,1095],{},[603,1086,1087],{},[606,1088,1089,1091,1093],{},[609,1090,611],{},[609,1092,614],{},[609,1094,617],{},[619,1096,1097,1111,1125,1138,1151,1165,1179],{},[606,1098,1099,1104,1109],{},[624,1100,1101],{},[352,1102,1103],{},"DB_HOST",[624,1105,1106],{},[352,1107,1108],{},"localhost",[624,1110],{},[606,1112,1113,1118,1123],{},[624,1114,1115],{},[352,1116,1117],{},"DB_PORT",[624,1119,1120],{},[352,1121,1122],{},"5432",[624,1124],{},[606,1126,1127,1132,1136],{},[624,1128,1129],{},[352,1130,1131],{},"DB_USER",[624,1133,1134],{},[377,1135,826],{},[624,1137],{},[606,1139,1140,1145,1149],{},[624,1141,1142],{},[352,1143,1144],{},"DB_PASSWORD",[624,1146,1147],{},[377,1148,826],{},[624,1150],{},[606,1152,1153,1158,1162],{},[624,1154,1155],{},[352,1156,1157],{},"DB_NAME",[624,1159,1160],{},[377,1161,826],{},[624,1163,1164],{},"database name",[606,1166,1167,1172,1177],{},[624,1168,1169],{},[352,1170,1171],{},"DB_SSLMODE",[624,1173,1174],{},[352,1175,1176],{},"disable",[624,1178],{},[606,1180,1181,1186,1191],{},[624,1182,1183],{},[352,1184,1185],{},"DB_MAX_CONNS",[624,1187,1188],{},[352,1189,1190],{},"10",[624,1192,1193],{},"maximum connections of the pgx pool",[374,1195,1196,1199,1200,1203,1204,1207,1208,1213,1214,1217,1218,1221,1222,1225,1226,1229,1230,1207,1232,447],{},[352,1197,1198],{},"dbx.Config","'s package-level default is ",[352,1201,1202],{},"DB_HOST=localhost",", but a generated project's ",[352,1205,1206],{},".env.example"," ships ",[377,1209,1210],{},[352,1211,1212],{},"DB_HOST=postgres",": the app runs inside the compose dev stack, and ",[352,1215,1216],{},"postgres"," is the compose service's DNS name. Likewise ",[352,1219,1220],{},"queue.Config","'s ",[352,1223,1224],{},"REDIS_ADDR"," default is ",[352,1227,1228],{},"localhost:6379",", while the generated ",[352,1231,1206],{},[352,1233,1234],{},"redis:6379",[794,1236,1238],{"id":1237},"named-connections","Named connections",[348,1240,1241,1242,1245,1246,1249,1250,1252,1253,1256,1257,1260],{},"Each ",[365,1243,1244],{"href":276},"named connection"," (",[352,1247,1248],{},"add db \u003Cmodule> \u003Cname>",") adds another ",[352,1251,1198],{}," under ",[352,1254,1255],{},"DB_\u003CNAME>_*",", the same variables and defaults as above, with the connection's (uppercased) name spliced into the prefix. ",[352,1258,1259],{},"add db news analytics"," adds:",[600,1262,1263,1273],{},[603,1264,1265],{},[606,1266,1267,1269,1271],{},[609,1268,611],{},[609,1270,614],{},[609,1272,617],{},[619,1274,1275,1288,1301,1314,1327,1340,1353],{},[606,1276,1277,1282,1286],{},[624,1278,1279],{},[352,1280,1281],{},"DB_ANALYTICS_HOST",[624,1283,1284],{},[352,1285,1108],{},[624,1287],{},[606,1289,1290,1295,1299],{},[624,1291,1292],{},[352,1293,1294],{},"DB_ANALYTICS_PORT",[624,1296,1297],{},[352,1298,1122],{},[624,1300],{},[606,1302,1303,1308,1312],{},[624,1304,1305],{},[352,1306,1307],{},"DB_ANALYTICS_USER",[624,1309,1310],{},[377,1311,826],{},[624,1313],{},[606,1315,1316,1321,1325],{},[624,1317,1318],{},[352,1319,1320],{},"DB_ANALYTICS_PASSWORD",[624,1322,1323],{},[377,1324,826],{},[624,1326],{},[606,1328,1329,1334,1338],{},[624,1330,1331],{},[352,1332,1333],{},"DB_ANALYTICS_NAME",[624,1335,1336],{},[377,1337,826],{},[624,1339,1164],{},[606,1341,1342,1347,1351],{},[624,1343,1344],{},[352,1345,1346],{},"DB_ANALYTICS_SSLMODE",[624,1348,1349],{},[352,1350,1176],{},[624,1352],{},[606,1354,1355,1360,1364],{},[624,1356,1357],{},[352,1358,1359],{},"DB_ANALYTICS_MAX_CONNS",[624,1361,1362],{},[352,1363,1190],{},[624,1365,1366],{},"maximum connections of this connection's own pgx pool",[589,1368,1370,1371],{"id":1369},"authconfig-envprefixjwt_","auth.Config: ",[352,1372,579],{},[348,1374,1375,1376,447],{},"JWT issuing and verification, see ",[365,1377,203],{"href":204},[600,1379,1380,1390],{},[603,1381,1382],{},[606,1383,1384,1386,1388],{},[609,1385,611],{},[609,1387,614],{},[609,1389,617],{},[619,1391,1392,1406,1421,1436,1454],{},[606,1393,1394,1399,1403],{},[624,1395,1396],{},[352,1397,1398],{},"JWT_SECRET",[624,1400,1401],{},[377,1402,826],{},[624,1404,1405],{},"signing key, distinct per service\u002Fenvironment",[606,1407,1408,1413,1418],{},[624,1409,1410],{},[352,1411,1412],{},"JWT_ACCESS_TOKEN_TTL",[624,1414,1415],{},[352,1416,1417],{},"15m",[624,1419,1420],{},"access token lifetime",[606,1422,1423,1428,1433],{},[624,1424,1425],{},[352,1426,1427],{},"JWT_REFRESH_TOKEN_TTL",[624,1429,1430],{},[352,1431,1432],{},"168h",[624,1434,1435],{},"refresh token lifetime",[606,1437,1438,1443,1445],{},[624,1439,1440],{},[352,1441,1442],{},"JWT_ISSUER",[624,1444,966],{},[624,1446,1447,1448,1451,1452],{},"empty → the ",[352,1449,1450],{},"iss"," check is disabled; when set, Parse requires a matching ",[352,1453,1450],{},[606,1455,1456,1461,1463],{},[624,1457,1458],{},[352,1459,1460],{},"JWT_AUDIENCE",[624,1462,966],{},[624,1464,1447,1465,1468,1469,1471],{},[352,1466,1467],{},"aud"," check is disabled; when set, Parse requires the token's ",[352,1470,1467],{}," claim to contain it",[1473,1474,1475,1476,776,1478,1480],"tip",{},"Set ",[352,1477,1442],{},[352,1479,1460],{}," (and use a distinct secret per service) so a token minted for another service or environment cannot be replayed.",[589,1482,1484,1485],{"id":1483},"s3config-envprefixs3_","s3.Config: ",[352,1486,538],{},[348,1488,1489,1490,447],{},"S3-compatible object storage, see ",[365,1491,248],{"href":249},[600,1493,1494,1504],{},[603,1495,1496],{},[606,1497,1498,1500,1502],{},[609,1499,611],{},[609,1501,614],{},[609,1503,617],{},[619,1505,1506,1518,1532,1545,1561,1581],{},[606,1507,1508,1513,1515],{},[624,1509,1510],{},[352,1511,1512],{},"S3_ENDPOINT",[624,1514,966],{},[624,1516,1517],{},"empty → AWS S3; for MinIO\u002FRustFS the service address",[606,1519,1520,1525,1530],{},[624,1521,1522],{},[352,1523,1524],{},"S3_REGION",[624,1526,1527],{},[352,1528,1529],{},"us-east-1",[624,1531],{},[606,1533,1534,1539,1543],{},[624,1535,1536],{},[352,1537,1538],{},"S3_BUCKET",[624,1540,1541],{},[377,1542,826],{},[624,1544],{},[606,1546,1547,1556,1558],{},[624,1548,1549,1552,1553],{},[352,1550,1551],{},"S3_ACCESS_KEY"," \u002F ",[352,1554,1555],{},"S3_SECRET_KEY",[624,1557,966],{},[624,1559,1560],{},"both empty → default AWS credential chain (IAM role etc.)",[606,1562,1563,1568,1572],{},[624,1564,1565],{},[352,1566,1567],{},"S3_USE_PATH_STYLE",[624,1569,1570],{},[352,1571,756],{},[624,1573,1574,1577,1578,1580],{},[352,1575,1576],{},"\u002Fbucket\u002Fkey"," addressing instead of virtual hosts, ",[352,1579,869],{}," for most self-hosted S3",[606,1582,1583,1588,1590],{},[624,1584,1585],{},[352,1586,1587],{},"S3_PUBLIC_BASE_URL",[624,1589,966],{},[624,1591,1592,1593,1596],{},"base for ",[352,1594,1595],{},"URL()"," (CDN or public bucket endpoint)",[589,1598,1600,1601],{"id":1599},"smtpconfig-envprefixmail_","smtp.Config: ",[352,1602,559],{},[348,1604,1605,1606,447],{},"SMTP sending and default sender, see ",[365,1607,252],{"href":253},[600,1609,1610,1620],{},[603,1611,1612],{},[606,1613,1614,1616,1618],{},[609,1615,611],{},[609,1617,614],{},[609,1619,617],{},[619,1621,1622,1636,1650,1665,1695,1722,1736,1748],{},[606,1623,1624,1629,1633],{},[624,1625,1626],{},[352,1627,1628],{},"MAIL_HOST",[624,1630,1631],{},[377,1632,826],{},[624,1634,1635],{},"SMTP server address",[606,1637,1638,1643,1648],{},[624,1639,1640],{},[352,1641,1642],{},"MAIL_PORT",[624,1644,1645],{},[352,1646,1647],{},"587",[624,1649],{},[606,1651,1652,1660,1662],{},[624,1653,1654,1552,1657],{},[352,1655,1656],{},"MAIL_USERNAME",[352,1658,1659],{},"MAIL_PASSWORD",[624,1661,966],{},[624,1663,1664],{},"both empty → no auth (Mailpit, internal relays)",[606,1666,1667,1672,1676],{},[624,1668,1669],{},[352,1670,1671],{},"MAIL_AUTH",[624,1673,1674],{},[352,1675,972],{},[624,1677,1678,1679,1681,1682,1685,1686,1685,1689,1685,1692],{},"auth mechanism: ",[352,1680,972],{}," (discover) | ",[352,1683,1684],{},"plain"," | ",[352,1687,1688],{},"login",[352,1690,1691],{},"cram-md5",[352,1693,1694],{},"none",[606,1696,1697,1702,1707],{},[624,1698,1699],{},[352,1700,1701],{},"MAIL_TLS",[624,1703,1704],{},[352,1705,1706],{},"starttls",[624,1708,1709,1711,1712,1715,1716,1719,1720],{},[352,1710,1706],{}," (mandatory STARTTLS) | ",[352,1713,1714],{},"starttls-opportunistic"," (dev, TLS-less server) | ",[352,1717,1718],{},"tls"," (implicit TLS, port 465) | ",[352,1721,1694],{},[606,1723,1724,1729,1733],{},[624,1725,1726],{},[352,1727,1728],{},"MAIL_FROM_ADDRESS",[624,1730,1731],{},[377,1732,826],{},[624,1734,1735],{},"default sender address",[606,1737,1738,1743,1745],{},[624,1739,1740],{},[352,1741,1742],{},"MAIL_FROM_NAME",[624,1744,966],{},[624,1746,1747],{},"default sender display name",[606,1749,1750,1755,1760],{},[624,1751,1752],{},[352,1753,1754],{},"MAIL_TIMEOUT",[624,1756,1757],{},[352,1758,1759],{},"15s",[624,1761,1762],{},"dial\u002Fsend limit per send",[589,1764,1766,1767],{"id":1765},"queueconfig-envprefixredis_","queue.Config: ",[352,1768,1769],{},"envPrefix:\"REDIS_\"",[348,1771,1772,1773,447],{},"The queue's (asynq's) Redis connection, see ",[365,1774,173],{"href":174},[600,1776,1777,1787],{},[603,1778,1779],{},[606,1780,1781,1783,1785],{},[609,1782,611],{},[609,1784,614],{},[609,1786,617],{},[619,1788,1789,1802,1814],{},[606,1790,1791,1795,1799],{},[624,1792,1793],{},[352,1794,1224],{},[624,1796,1797],{},[352,1798,1228],{},[624,1800,1801],{},"Redis host:port",[606,1803,1804,1809,1811],{},[624,1805,1806],{},[352,1807,1808],{},"REDIS_PASSWORD",[624,1810,966],{},[624,1812,1813],{},"empty → no auth",[606,1815,1816,1821,1826],{},[624,1817,1818],{},[352,1819,1820],{},"REDIS_DB",[624,1822,1823],{},[352,1824,1825],{},"0",[624,1827,1828],{},"Redis logical database",[589,1830,1832,1833],{"id":1831},"outboxconfig-envprefixoutbox_","outbox.Config: ",[352,1834,511],{},[348,1836,1837,1838,447],{},"The relay's behavior, see ",[365,1839,182],{"href":183},[600,1841,1842,1852],{},[603,1843,1844],{},[606,1845,1846,1848,1850],{},[609,1847,611],{},[609,1849,614],{},[609,1851,617],{},[619,1853,1854,1869,1887,1901,1916],{},[606,1855,1856,1861,1866],{},[624,1857,1858],{},[352,1859,1860],{},"OUTBOX_POLL_INTERVAL",[624,1862,1863],{},[352,1864,1865],{},"1s",[624,1867,1868],{},"sleep between polls when a batch is not full",[606,1870,1871,1876,1881],{},[624,1872,1873],{},[352,1874,1875],{},"OUTBOX_BATCH_SIZE",[624,1877,1878],{},[352,1879,1880],{},"100",[624,1882,1883,1884,938],{},"rows claimed per poll (",[352,1885,1886],{},"FOR UPDATE SKIP LOCKED",[606,1888,1889,1894,1898],{},[624,1890,1891],{},[352,1892,1893],{},"OUTBOX_RETENTION",[624,1895,1896],{},[352,1897,1432],{},[624,1899,1900],{},"how long published rows are kept before cleanup",[606,1902,1903,1908,1913],{},[624,1904,1905],{},[352,1906,1907],{},"OUTBOX_CLEANUP_INTERVAL",[624,1909,1910],{},[352,1911,1912],{},"1h",[624,1914,1915],{},"how often published rows past retention are purged",[606,1917,1918,1923,1928],{},[624,1919,1920],{},[352,1921,1922],{},"OUTBOX_TASK_RETENTION",[624,1924,1925],{},[352,1926,1927],{},"24h",[624,1929,1930],{},"asynq retention \u002F TaskID dedup window on published tasks",[589,1932,1934,1935],{"id":1933},"schedulerconfig-envprefixscheduler_","scheduler.Config: ",[352,1936,1937],{},"envPrefix:\"SCHEDULER_\"",[348,1939,1940,1941,447],{},"The scheduled-job runner, see ",[365,1942,1943],{"href":188},"Scheduler",[600,1945,1946,1956],{},[603,1947,1948],{},[606,1949,1950,1952,1954],{},[609,1951,611],{},[609,1953,614],{},[609,1955,617],{},[619,1957,1958,1976,1990],{},[606,1959,1960,1965,1970],{},[624,1961,1962],{},[352,1963,1964],{},"SCHEDULER_TIMEZONE",[624,1966,1967],{},[352,1968,1969],{},"UTC",[624,1971,1972,1973,938],{},"IANA timezone cron specs are evaluated in (e.g. ",[352,1974,1975],{},"Europe\u002FBudapest",[606,1977,1978,1983,1987],{},[624,1979,1980],{},[352,1981,1982],{},"SCHEDULER_LEASE_TTL",[624,1984,1985],{},[352,1986,1759],{},[624,1988,1989],{},"leader lease TTL; the leader renews every TTL\u002F3, the longest a lost leader can keep firing before another replica takes over",[606,1991,1992,1997,2002],{},[624,1993,1994],{},[352,1995,1996],{},"SCHEDULER_NAMESPACE",[624,1998,1999],{},[352,2000,2001],{},"gpsystem",[624,2003,2004],{},"namespace of the leader-election key in Redis, set it to a name unique to the app when multiple applications\u002Fenvironments share one Redis",[589,2006,2008,2009,2012],{"id":2007},"workerconfig-the-cmdworker-binary","worker.Config: the ",[352,2010,2011],{},"cmd\u002Fworker"," binary",[348,2014,2015,2016,2019,2020,1245,2022,2025,2026,1245,2029,2032,2033,2036,2037,929,2040,929,2043,2046,2047,447],{},"Its own ",[352,2017,2018],{},"WORKER_","-prefixed fields, plus embedded: ",[352,2021,1220],{},[352,2023,2024],{},"REDIS_","), ",[352,2027,2028],{},"scheduler.Config",[352,2030,2031],{},"SCHEDULER_",") and ",[352,2034,2035],{},"telemetry.Config"," (standard ",[352,2038,2039],{},"OTEL_*",[352,2041,2042],{},"LOG_*",[352,2044,2045],{},"SENTRY_*",", see above). See ",[365,2048,192],{"href":193},[600,2050,2051,2061],{},[603,2052,2053],{},[606,2054,2055,2057,2059],{},[609,2056,611],{},[609,2058,614],{},[609,2060,617],{},[619,2062,2063,2077,2096,2110,2124],{},[606,2064,2065,2070,2074],{},[624,2066,2067],{},[352,2068,2069],{},"WORKER_CONCURRENCY",[624,2071,2072],{},[352,2073,1190],{},[624,2075,2076],{},"tasks processed simultaneously",[606,2078,2079,2084,2089],{},[624,2080,2081],{},[352,2082,2083],{},"WORKER_QUEUES",[624,2085,2086],{},[352,2087,2088],{},"default:1",[624,2090,2091,2092,2095],{},"queue→weight map, e.g. ",[352,2093,2094],{},"critical:6,default:3,low:1"," (higher-weight queues are served more often)",[606,2097,2098,2103,2107],{},[624,2099,2100],{},[352,2101,2102],{},"WORKER_STRICT_PRIORITY",[624,2104,2105],{},[352,2106,756],{},[624,2108,2109],{},"serve higher-weight queues to exhaustion before lower ones",[606,2111,2112,2117,2121],{},[624,2113,2114],{},[352,2115,2116],{},"WORKER_SHUTDOWN_TIMEOUT",[624,2118,2119],{},[352,2120,681],{},[624,2122,2123],{},"graceful drain; unfinished tasks are requeued by asynq and redelivered (at-least-once)",[606,2125,2126,2131,2136],{},[624,2127,2128],{},[352,2129,2130],{},"WORKER_DEFAULT_MAX_RETRY",[624,2132,2133],{},[352,2134,2135],{},"25",[624,2137,2138,2139,938],{},"retry budget for listener\u002Fjob tasks that don't set their own (",[352,2140,2141],{},"queue.MaxRetry",[589,2143,2145,2146,2148],{"id":2144},"the-compose-dev-stacks-env-variables-not-a-kit-config-field","The compose dev stack's env variables (not a kit ",[352,2147,354],{}," field)",[348,2150,2151,2152,2154,2155,2160,2161,2163,2164,929,2167,2170],{},"These are generated into ",[352,2153,1206],{}," by ",[365,2156,2158],{"href":2157},"\u002Fen\u002Fcli\u002Fnew-project#the-compose-dev-stack",[352,2159,304],{},"; they don't belong to any kit package's ",[352,2162,354],{}," struct, they drive ",[352,2165,2166],{},"compose.yml",[352,2168,2169],{},"Dockerfile"," substitution and Traefik routing.",[600,2172,2173,2183],{},[603,2174,2175],{},[606,2176,2177,2179,2181],{},[609,2178,611],{},[609,2180,614],{},[609,2182,617],{},[619,2184,2185,2210,2229,2244,2259],{},[606,2186,2187,2195,2200],{},[624,2188,2189,1552,2192],{},[352,2190,2191],{},"USER_ID",[352,2193,2194],{},"GROUP_ID",[624,2196,2197],{},[352,2198,2199],{},"1000",[624,2201,2202,2203,929,2206,2209],{},"the dev containers run as this host UID\u002FGID (",[352,2204,2205],{},"id -u",[352,2207,2208],{},"id -g","), so files written into the bind-mounted source stay yours, not root's",[606,2211,2212,2217,2222],{},[624,2213,2214],{},[352,2215,2216],{},"APP_HOST",[624,2218,2219],{},[352,2220,2221],{},"\u003Cproject>.localhost",[624,2223,2224,2225,2228],{},"the module services' Traefik ",[352,2226,2227],{},"Host()"," rule",[606,2230,2231,2236,2241],{},[624,2232,2233],{},[352,2234,2235],{},"MAILPIT_HOST",[624,2237,2238],{},[352,2239,2240],{},"mailpit.\u003Cproject>.localhost",[624,2242,2243],{},"the mailpit UI's Traefik host",[606,2245,2246,2251,2256],{},[624,2247,2248],{},[352,2249,2250],{},"RUSTFS_S3_HOST",[624,2252,2253],{},[352,2254,2255],{},"rustfs.\u003Cproject>.localhost",[624,2257,2258],{},"the rustfs S3 API's Traefik host",[606,2260,2261,2266,2271],{},[624,2262,2263],{},[352,2264,2265],{},"RUSTFS_CONSOLE_HOST",[624,2267,2268],{},[352,2269,2270],{},"rustfs-console.\u003Cproject>.localhost",[624,2272,2273],{},"the rustfs web console's Traefik host",[348,2275,2276,2277,929,2280,2283,2284,392,2287,2290,2291,929,2296,2301,2302,2305],{},"The shipped ",[352,2278,2279],{},"MAIL_*",[352,2281,2282],{},"S3_*"," lines (",[352,2285,2286],{},"MAIL_HOST=mailpit",[352,2288,2289],{},"S3_ENDPOINT=http:\u002F\u002Frustfs:9000",", ...) match the ",[365,2292,2293],{"href":253},[352,2294,2295],{},"smtp.Config",[365,2297,2298],{"href":249},[352,2299,2300],{},"s3.Config"," prefixes above: the mailpit\u002Frustfs compose services boot with these, but wiring them (adding the fields to the project's ",[352,2303,2304],{},"config.go",") stays opt-in.",[2307,2308,2309],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":413,"searchDepth":437,"depth":437,"links":2311},[2312,2313,2318,2322,2324,2326,2328,2330,2332,2334,2336],{"id":591,"depth":437,"text":592},{"id":769,"depth":437,"text":770,"children":2314},[2315,2316,2317],{"id":796,"depth":456,"text":797},{"id":891,"depth":456,"text":892},{"id":984,"depth":456,"text":985},{"id":1073,"depth":437,"text":2319,"children":2320},"dbx.Config: envPrefix:\"DB_\"",[2321],{"id":1237,"depth":456,"text":1238},{"id":1369,"depth":437,"text":2323},"auth.Config: envPrefix:\"JWT_\"",{"id":1483,"depth":437,"text":2325},"s3.Config: envPrefix:\"S3_\"",{"id":1599,"depth":437,"text":2327},"smtp.Config: envPrefix:\"MAIL_\"",{"id":1765,"depth":437,"text":2329},"queue.Config: envPrefix:\"REDIS_\"",{"id":1831,"depth":437,"text":2331},"outbox.Config: envPrefix:\"OUTBOX_\"",{"id":1933,"depth":437,"text":2333},"scheduler.Config: envPrefix:\"SCHEDULER_\"",{"id":2007,"depth":437,"text":2335},"worker.Config: the cmd\u002Fworker binary",{"id":2144,"depth":437,"text":2337},"The compose dev stack's env variables (not a kit Config field)","Every environment variable of every kit config struct, grouped.","md",null,{},{"icon":55},{"title":52,"description":2338},"qdSEf70VMR9xFHHh0oz-PJEM4lCsUc7XqhH4xUR5xT8",[2346,2348],{"title":40,"path":41,"stem":42,"description":2347,"icon":43,"children":-1},"A single worked example project, every code sample in the docs builds on it.",{"title":57,"path":58,"stem":59,"description":2349,"icon":60,"children":-1},"Every underlying library, its version, its role, and its official documentation, grouped by category.",1784668705616]