[{"data":1,"prerenderedAt":1432},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-envconf-recipes":449,"-hu-envconf-recipes-surround":1427},[4,45,120,158,174,204,234,260,272,288,308,327,340,357,374,387,399,426],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F01.getting-started",[10,15,20,25,30,35,40],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F01.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F01.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F01.getting-started\u002F3.first-module","i-lucide-package-plus",{"title":26,"path":27,"stem":28,"icon":29},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F01.getting-started\u002F4.project-structure","i-lucide-folder-tree",{"title":31,"path":32,"stem":33,"icon":34},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F01.getting-started\u002F5.sample-app","i-lucide-shopping-cart",{"title":36,"path":37,"stem":38,"icon":39},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F01.getting-started\u002F6.coming-from-laravel","i-lucide-arrow-right-left",{"title":41,"path":42,"stem":43,"icon":39},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F01.getting-started\u002F7.coming-from-symfony",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F02.cli",[51,55,60,65,70,75,80,85,90,95,100,105,110,115],{"title":52,"path":53,"stem":54,"icon":47},"Áttekintés","\u002Fhu\u002Fcli\u002Foverview","hu\u002F02.cli\u002F1.overview",{"title":56,"path":57,"stem":58,"icon":59},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F02.cli\u002F10.add-compose","i-lucide-container",{"title":61,"path":62,"stem":63,"icon":64},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F02.cli\u002F11.add-mail","i-lucide-mail-plus",{"title":66,"path":67,"stem":68,"icon":69},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F02.cli\u002F12.add-notification","i-lucide-bell-plus",{"title":71,"path":72,"stem":73,"icon":74},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F02.cli\u002F13.add-realtime","i-lucide-radio-tower",{"title":76,"path":77,"stem":78,"icon":79},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F02.cli\u002F14.add-seeder","i-lucide-sprout",{"title":81,"path":82,"stem":83,"icon":84},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F02.cli\u002F2.new-project","i-lucide-folder-plus",{"title":86,"path":87,"stem":88,"icon":89},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F02.cli\u002F3.new-module","i-lucide-blocks",{"title":91,"path":92,"stem":93,"icon":94},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F02.cli\u002F4.add-surface","i-lucide-layers-2",{"title":96,"path":97,"stem":98,"icon":99},"add domain","\u002Fhu\u002Fcli\u002Fadd-domain","hu\u002F02.cli\u002F5.add-domain","i-lucide-box",{"title":101,"path":102,"stem":103,"icon":104},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F02.cli\u002F6.add-handler","i-lucide-webhook",{"title":106,"path":107,"stem":108,"icon":109},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F02.cli\u002F7.new-migration","i-lucide-file-plus",{"title":111,"path":112,"stem":113,"icon":114},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F02.cli\u002F8.worker-generators","i-lucide-cog",{"title":116,"path":117,"stem":118,"icon":119},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F02.cli\u002F9.add-db","i-lucide-database-zap",{"title":121,"icon":99,"path":122,"stem":123,"children":124,"page":44},"A framework","\u002Fhu\u002Fframework","hu\u002F03.framework",[125,129,134,139,143,148,153],{"title":126,"path":127,"stem":128,"icon":99},"A framework áttekintése","\u002Fhu\u002Fframework\u002Foverview","hu\u002F03.framework\u002F1.overview",{"title":130,"path":131,"stem":132,"icon":133},"Alkalmazás-életciklus","\u002Fhu\u002Fframework\u002Fapp","hu\u002F03.framework\u002F2.app","i-lucide-power",{"title":135,"path":136,"stem":137,"icon":138},"Szerver","\u002Fhu\u002Fframework\u002Fserver","hu\u002F03.framework\u002F3.server","i-lucide-server",{"title":140,"path":141,"stem":142,"icon":114},"Worker","\u002Fhu\u002Fframework\u002Fworker","hu\u002F03.framework\u002F4.worker",{"title":144,"path":145,"stem":146,"icon":147},"Realtime","\u002Fhu\u002Fframework\u002Frealtime","hu\u002F03.framework\u002F5.realtime","i-lucide-radio",{"title":149,"path":150,"stem":151,"icon":152},"Migrációk","\u002Fhu\u002Fframework\u002Fmigrations","hu\u002F03.framework\u002F6.migrations","i-lucide-file-stack",{"title":154,"path":155,"stem":156,"icon":157},"Social login","\u002Fhu\u002Fframework\u002Fsocial-login","hu\u002F03.framework\u002F7.social-login","i-lucide-log-in",{"title":159,"icon":160,"path":161,"stem":162,"children":163,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F04.reference",[164,169],{"title":165,"path":166,"stem":167,"icon":168},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F04.reference\u002F1.configuration","i-lucide-settings",{"title":170,"path":171,"stem":172,"icon":173},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F04.reference\u002F2.dependencies","i-lucide-package",{"title":175,"icon":176,"path":177,"stem":178,"children":179,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F05.concepts",[180,185,190,194,199],{"title":181,"path":182,"stem":183,"icon":184},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F05.concepts\u002F1.architecture","i-lucide-layers",{"title":186,"path":187,"stem":188,"icon":189},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F05.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":165,"path":191,"stem":192,"icon":193},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F05.concepts\u002F3.configuration","i-lucide-settings-2",{"title":195,"path":196,"stem":197,"icon":198},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F05.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":200,"path":201,"stem":202,"icon":203},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F05.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":205,"icon":206,"path":207,"stem":208,"children":209,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F06.auth",[210,215,220,225,230],{"title":211,"path":212,"stem":213,"icon":214},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F06.auth\u002F1.overview","i-lucide-key-round",{"title":216,"path":217,"stem":218,"icon":219},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F06.auth\u002F2.rbac","i-lucide-users",{"title":221,"path":222,"stem":223,"icon":224},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F06.auth\u002F3.policy","i-lucide-gavel",{"title":226,"path":227,"stem":228,"icon":229},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F06.auth\u002F4.standalone","i-lucide-plug",{"title":231,"path":232,"stem":233,"icon":157},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F06.auth\u002F5.social-standalone",{"title":235,"icon":236,"path":237,"stem":238,"children":239,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F07.dbx",[240,243,247,251,256],{"title":52,"path":241,"stem":242,"icon":236},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F07.dbx\u002F1.overview",{"title":244,"path":245,"stem":246,"icon":229},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F07.dbx\u002F2.pg",{"title":248,"path":249,"stem":250,"icon":184},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F07.dbx\u002F3.bunx",{"title":252,"path":253,"stem":254,"icon":255},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F07.dbx\u002F4.transactions","i-lucide-git-merge",{"title":257,"path":258,"stem":259,"icon":79},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F07.dbx\u002F5.seed",{"title":261,"icon":193,"path":262,"stem":263,"children":264,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F08.envconf",[265,268],{"title":52,"path":266,"stem":267,"icon":193},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F08.envconf\u002F1.overview",{"title":269,"path":270,"stem":271,"icon":193},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F08.envconf\u002F2.recipes",{"title":273,"icon":189,"path":274,"stem":275,"children":276,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F09.errs",[277,280,284],{"title":52,"path":278,"stem":279,"icon":189},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F09.errs\u002F1.overview",{"title":281,"path":282,"stem":283,"icon":189},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F09.errs\u002F2.api",{"title":285,"path":286,"stem":287,"icon":189},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F09.errs\u002F3.integration",{"title":289,"icon":290,"path":291,"stem":292,"children":293,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F10.events",[294,298,303],{"title":295,"path":296,"stem":297,"icon":147},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F10.events\u002F1.overview",{"title":299,"path":300,"stem":301,"icon":302},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F10.events\u002F2.outbox","i-lucide-inbox",{"title":304,"path":305,"stem":306,"icon":307},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F10.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":309,"icon":310,"path":311,"stem":312,"children":313,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F11.httperr",[314,317,322],{"title":52,"path":315,"stem":316,"icon":310},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F11.httperr\u002F1.overview",{"title":318,"path":319,"stem":320,"icon":321},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F11.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":323,"path":324,"stem":325,"icon":326},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F11.httperr\u002F3.validation","i-lucide-badge-check",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"logx","i-lucide-scroll-text","\u002Fhu\u002Flogx","hu\u002F12.logx",[333,336],{"title":52,"path":334,"stem":335,"icon":329},"\u002Fhu\u002Flogx\u002Foverview","hu\u002F12.logx\u002F1.overview",{"title":337,"path":338,"stem":339,"icon":47},"Monolog-formázó","\u002Fhu\u002Flogx\u002Fmonolog","hu\u002F12.logx\u002F2.monolog",{"title":341,"icon":342,"path":343,"stem":344,"children":345,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[346,349,353],{"title":52,"path":347,"stem":348,"icon":342},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":350,"path":351,"stem":352,"icon":342},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":354,"path":355,"stem":356,"icon":342},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":358,"icon":359,"path":360,"stem":361,"children":362,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[363,366,370],{"title":52,"path":364,"stem":365,"icon":359},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":367,"path":368,"stem":369,"icon":359},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":371,"path":372,"stem":373,"icon":359},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":375,"icon":376,"path":377,"stem":378,"children":379,"page":44},"paginate","i-lucide-list-ordered","\u002Fhu\u002Fpaginate","hu\u002F15.paginate",[380,383],{"title":52,"path":381,"stem":382,"icon":376},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F15.paginate\u002F1.overview",{"title":384,"path":385,"stem":386,"icon":39},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F15.paginate\u002F2.cursor",{"title":388,"icon":184,"path":389,"stem":390,"children":391,"page":44},"queue","\u002Fhu\u002Fqueue","hu\u002F16.queue",[392,395],{"title":52,"path":393,"stem":394,"icon":376},"\u002Fhu\u002Fqueue\u002Foverview","hu\u002F16.queue\u002F1.overview",{"title":396,"path":397,"stem":398,"icon":184},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F16.queue\u002F2.tasks",{"title":400,"icon":401,"path":402,"stem":403,"children":404,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F17.storage",[405,408,412,416,421],{"title":52,"path":406,"stem":407,"icon":401},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F17.storage\u002F1.overview",{"title":409,"path":410,"stem":411,"icon":401},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F17.storage\u002F2.disk-api",{"title":413,"path":414,"stem":415,"icon":401},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F17.storage\u002F3.local",{"title":417,"path":418,"stem":419,"icon":420},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F17.storage\u002F4.s3","i-lucide-cloud",{"title":422,"path":423,"stem":424,"icon":425},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F17.storage\u002F5.testing","i-lucide-flask-conical",{"title":427,"icon":428,"path":429,"stem":430,"children":431,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F18.telemetry",[432,435,439,444],{"title":52,"path":433,"stem":434,"icon":428},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F18.telemetry\u002F1.overview",{"title":436,"path":437,"stem":438,"icon":329},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F18.telemetry\u002F2.logging",{"title":440,"path":441,"stem":442,"icon":443},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F18.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":445,"path":446,"stem":447,"icon":448},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F18.telemetry\u002F4.sentry","i-lucide-bug",{"id":450,"title":269,"body":451,"description":1420,"extension":1421,"links":1422,"meta":1423,"navigation":1424,"path":270,"seo":1425,"stem":271,"__hash__":1426},"docs_hu\u002Fhu\u002F08.envconf\u002F2.recipes.md",{"type":452,"value":453,"toc":1413},"minimark",[454,471,476,490,676,711,783,787,801,946,985,998,1002,1014,1330,1348,1352,1374,1378,1409],[455,456,457,458,461,462,466,467,470],"p",{},"Három minta lefedi majdnem mindazt, amire egy éles projektnek szüksége van az ",[459,460,52],"a",{"href":266}," oldal alap ",[463,464,465],"code",{},"Load","\u002F",[463,468,469],{},"MustLoad"," hívásán túl: egy root config összeállítása több modul configjából, ugyanannak a formának a többszöri betöltése különböző prefixekkel, és a konfigurációt olvasó kód tesztelése.",[472,473,475],"h2",{"id":474},"root-config-összeállítása-modul-configokból","Root Config összeállítása modul-configokból",[455,477,478,479,482,483,485,486,489],{},"Minden gp-system modul, amelynek konfigurációra van szüksége, exportálja a saját ",[463,480,481],{},"Config"," structját, a saját mezőnevein tagelve, anélkül, hogy véleménye lenne arról, mi (ha egyáltalán bármi) prefixeli őket. Egy generált gpsystem projekt ezeket a structokat egyetlen, alkalmazás-szintű ",[463,484,481],{},"-ba komponálja, mezőkként beágyazva és ",[463,487,488],{},"envPrefix","-szel prefixet választva mezőnként:",[491,492,498],"pre",{"className":493,"code":494,"filename":495,"language":496,"meta":497,"style":497},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package config\n\nimport (\n    \"github.com\u002Fgp-system\u002Fdbx\"\n    \"github.com\u002Fgp-system\u002Fevents\u002Foutbox\"\n    \"github.com\u002Fgp-system\u002Fframework\u002Fserver\"\n    \"github.com\u002Fgp-system\u002Fframework\u002Fworker\"\n)\n\ntype Config struct {\n    Server server.Config\n    DB     dbx.Config    `envPrefix:\"DB_\"`\n    Worker worker.Config\n    Outbox outbox.Config `envPrefix:\"OUTBOX_\"`\n}\n","internal\u002Fplatform\u002Fconfig\u002Fconfig.go","go","",[463,499,500,513,520,530,542,552,562,572,578,583,598,614,636,649,670],{"__ignoreMap":497},[501,502,505,509],"span",{"class":503,"line":504},"line",1,[501,506,508],{"class":507},"sMK4o","package",[501,510,512],{"class":511},"sBMFI"," config\n",[501,514,516],{"class":503,"line":515},2,[501,517,519],{"emptyLinePlaceholder":518},true,"\n",[501,521,523,527],{"class":503,"line":522},3,[501,524,526],{"class":525},"s7zQu","import",[501,528,529],{"class":507}," (\n",[501,531,533,536,539],{"class":503,"line":532},4,[501,534,535],{"class":507},"    \"",[501,537,538],{"class":511},"github.com\u002Fgp-system\u002Fdbx",[501,540,541],{"class":507},"\"\n",[501,543,545,547,550],{"class":503,"line":544},5,[501,546,535],{"class":507},[501,548,549],{"class":511},"github.com\u002Fgp-system\u002Fevents\u002Foutbox",[501,551,541],{"class":507},[501,553,555,557,560],{"class":503,"line":554},6,[501,556,535],{"class":507},[501,558,559],{"class":511},"github.com\u002Fgp-system\u002Fframework\u002Fserver",[501,561,541],{"class":507},[501,563,565,567,570],{"class":503,"line":564},7,[501,566,535],{"class":507},[501,568,569],{"class":511},"github.com\u002Fgp-system\u002Fframework\u002Fworker",[501,571,541],{"class":507},[501,573,575],{"class":503,"line":574},8,[501,576,577],{"class":507},")\n",[501,579,581],{"class":503,"line":580},9,[501,582,519],{"emptyLinePlaceholder":518},[501,584,586,589,592,595],{"class":503,"line":585},10,[501,587,588],{"class":507},"type",[501,590,591],{"class":511}," Config",[501,593,594],{"class":507}," struct",[501,596,597],{"class":507}," {\n",[501,599,601,605,608,611],{"class":503,"line":600},11,[501,602,604],{"class":603},"sTEyZ","    Server ",[501,606,607],{"class":511},"server",[501,609,610],{"class":507},".",[501,612,613],{"class":511},"Config\n",[501,615,617,620,622,624,626,629,633],{"class":503,"line":616},12,[501,618,619],{"class":603},"    DB     ",[501,621,235],{"class":511},[501,623,610],{"class":507},[501,625,481],{"class":511},[501,627,628],{"class":507},"    `",[501,630,632],{"class":631},"sfazB","envPrefix:\"DB_\"",[501,634,635],{"class":507},"`\n",[501,637,639,642,645,647],{"class":503,"line":638},13,[501,640,641],{"class":603},"    Worker ",[501,643,644],{"class":511},"worker",[501,646,610],{"class":507},[501,648,613],{"class":511},[501,650,652,655,658,660,662,665,668],{"class":503,"line":651},14,[501,653,654],{"class":603},"    Outbox ",[501,656,657],{"class":511},"outbox",[501,659,610],{"class":507},[501,661,481],{"class":511},[501,663,664],{"class":507}," `",[501,666,667],{"class":631},"envPrefix:\"OUTBOX_\"",[501,669,635],{"class":507},[501,671,673],{"class":503,"line":672},15,[501,674,675],{"class":507},"}\n",[491,677,680],{"className":493,"code":678,"filename":679,"language":496,"meta":497,"style":497},"cfg := envconf.MustLoad[config.Config]()\n","cmd\u002Fshop\u002Fmain.go",[463,681,682],{"__ignoreMap":497},[501,683,684,687,690,693,695,698,701,704,706,708],{"class":503,"line":504},[501,685,686],{"class":603},"cfg ",[501,688,689],{"class":507},":=",[501,691,692],{"class":603}," envconf",[501,694,610],{"class":507},[501,696,469],{"class":697},"s2Zo4",[501,699,700],{"class":507},"[",[501,702,703],{"class":511},"config",[501,705,610],{"class":507},[501,707,481],{"class":511},[501,709,710],{"class":507},"]()\n",[455,712,713,714,717,718,720,721,724,725,729,730,733,734,737,738,737,741,744,745,747,748,737,751,737,754,757,758,761,762,764,765,768,769,737,772,737,775,778,779,782],{},"Egyetlen ",[463,715,716],{},"envconf.Load[AppConfig]()"," (vagy ",[463,719,469],{},") hívás a ",[463,722,723],{},"main()"," elején mindaz, amire egy folyamatnak szüksége van: minden modul beállítása egyetlen structban érkezik, teljesen típusosan, és a kódbázis semelyik más pontján nem parseol semmit tovább. A szabály egyszerű: ",[726,727,728],"strong",{},"egy modul a saját mezőit nevezi el, a beágyazó dönti el a prefixet."," A ",[463,731,732],{},"dbx.Config"," saját tagjei ",[463,735,736],{},"HOST",", ",[463,739,740],{},"PORT",[463,742,743],{},"USER",", ...; a ",[463,746,632],{}," alatt beágyazva ",[463,749,750],{},"DB_HOST",[463,752,753],{},"DB_PORT",[463,755,756],{},"DB_USER"," lesz belőlük. Egy prefix nélkül beágyazott struct (mint a fenti ",[463,759,760],{},"server.Config",") a saját, prefix nélküli neveik alatt olvassa a változóit. A beágyazás tetszőlegesen mélyre mehet: a ",[463,763,760],{}," maga is beágyaz egy ",[463,766,767],{},"telemetry.Config","-ot, prefix nélkül, mert a változói (",[463,770,771],{},"OTEL_SERVICE_NAME",[463,773,774],{},"SENTRY_DSN",[463,776,777],{},"LOG_LEVEL",") már iparági szabvány nevek, amiket minden OTel\u002FSentry-tudatos eszköz úgy vár, ahogy vannak. Lásd a ",[459,780,165],{"href":781},"\u002Fhu\u002Fconcepts\u002Fconfiguration#az-env-prefix-konvenci%C3%B3k"," oldalt a teljes prefix-táblázatért, amibe a gpsystem saját moduljai rendeződnek.",[472,784,786],{"id":785},"prefixelt-multi-instance-betöltések","Prefixelt multi-instance betöltések",[455,788,789,790,792,793,796,797,800],{},"Az ",[463,791,488],{}," egy beágyazott mezőn csak akkor segít, ha a struct egyszer van beágyazva. Amikor egy folyamatnak valóban ",[726,794,795],{},"két független példányra"," van szüksége ugyanabból a konfig-formából (két Valkey-kapcsolat: egy a cache-hez, egy a queue-hoz), a ",[463,798,799],{},"LoadPrefixed"," ugyanazt a típust kétszer tölti be, két különböző felső szintű prefix alatt, struct-beágyazás nélkül:",[491,802,804],{"className":493,"code":803,"language":496,"meta":497,"style":497},"type ValkeyConfig struct {\n    Addr     string `env:\"ADDR,required\"`\n    Password string `env:\"PASSWORD\"`\n    DB       int    `env:\"DB\" envDefault:\"0\"`\n}\n\ncache, err := envconf.LoadPrefixed[ValkeyConfig](\"CACHE_VALKEY_\")  \u002F\u002F CACHE_VALKEY_ADDR, CACHE_VALKEY_PASSWORD, CACHE_VALKEY_DB\nqueue, err := envconf.LoadPrefixed[ValkeyConfig](\"QUEUE_VALKEY_\")  \u002F\u002F QUEUE_VALKEY_ADDR, QUEUE_VALKEY_PASSWORD, QUEUE_VALKEY_DB\n",[463,805,806,817,833,847,862,866,870,912],{"__ignoreMap":497},[501,807,808,810,813,815],{"class":503,"line":504},[501,809,588],{"class":507},[501,811,812],{"class":511}," ValkeyConfig",[501,814,594],{"class":507},[501,816,597],{"class":507},[501,818,819,822,826,828,831],{"class":503,"line":515},[501,820,821],{"class":603},"    Addr     ",[501,823,825],{"class":824},"spNyl","string",[501,827,664],{"class":507},[501,829,830],{"class":631},"env:\"ADDR,required\"",[501,832,635],{"class":507},[501,834,835,838,840,842,845],{"class":503,"line":522},[501,836,837],{"class":603},"    Password ",[501,839,825],{"class":824},[501,841,664],{"class":507},[501,843,844],{"class":631},"env:\"PASSWORD\"",[501,846,635],{"class":507},[501,848,849,852,855,857,860],{"class":503,"line":532},[501,850,851],{"class":603},"    DB       ",[501,853,854],{"class":824},"int",[501,856,628],{"class":507},[501,858,859],{"class":631},"env:\"DB\" envDefault:\"0\"",[501,861,635],{"class":507},[501,863,864],{"class":503,"line":544},[501,865,675],{"class":507},[501,867,868],{"class":503,"line":554},[501,869,519],{"emptyLinePlaceholder":518},[501,871,872,875,878,881,883,885,887,889,891,894,897,900,903,905,908],{"class":503,"line":564},[501,873,874],{"class":603},"cache",[501,876,877],{"class":507},",",[501,879,880],{"class":603}," err ",[501,882,689],{"class":507},[501,884,692],{"class":603},[501,886,610],{"class":507},[501,888,799],{"class":697},[501,890,700],{"class":507},[501,892,893],{"class":511},"ValkeyConfig",[501,895,896],{"class":507},"](",[501,898,899],{"class":507},"\"",[501,901,902],{"class":631},"CACHE_VALKEY_",[501,904,899],{"class":507},[501,906,907],{"class":507},")",[501,909,911],{"class":910},"sHwdD","  \u002F\u002F CACHE_VALKEY_ADDR, CACHE_VALKEY_PASSWORD, CACHE_VALKEY_DB\n",[501,913,914,916,918,920,922,924,926,928,930,932,934,936,939,941,943],{"class":503,"line":574},[501,915,388],{"class":603},[501,917,877],{"class":507},[501,919,880],{"class":603},[501,921,689],{"class":507},[501,923,692],{"class":603},[501,925,610],{"class":507},[501,927,799],{"class":697},[501,929,700],{"class":507},[501,931,893],{"class":511},[501,933,896],{"class":507},[501,935,899],{"class":507},[501,937,938],{"class":631},"QUEUE_VALKEY_",[501,940,899],{"class":507},[501,942,907],{"class":507},[501,944,945],{"class":910},"  \u002F\u002F QUEUE_VALKEY_ADDR, QUEUE_VALKEY_PASSWORD, QUEUE_VALKEY_DB\n",[491,947,952],{"className":948,"code":949,"filename":950,"language":951,"meta":497,"style":497},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","CACHE_VALKEY_ADDR=localhost:6379\nQUEUE_VALKEY_ADDR=localhost:6380\nQUEUE_VALKEY_DB=1\n",".env","sh",[463,953,954,965,975],{"__ignoreMap":497},[501,955,956,959,962],{"class":503,"line":504},[501,957,958],{"class":603},"CACHE_VALKEY_ADDR",[501,960,961],{"class":507},"=",[501,963,964],{"class":631},"localhost:6379\n",[501,966,967,970,972],{"class":503,"line":515},[501,968,969],{"class":603},"QUEUE_VALKEY_ADDR",[501,971,961],{"class":507},[501,973,974],{"class":631},"localhost:6380\n",[501,976,977,980,982],{"class":503,"line":522},[501,978,979],{"class":603},"QUEUE_VALKEY_DB",[501,981,961],{"class":507},[501,983,984],{"class":631},"1\n",[455,986,987,988,991,992,994,995,997],{},"Minden hívás független: egy hiányzó ",[463,989,990],{},"required"," mező az egyik prefix alatt csak azt a hívást buktatja el, a másikat nem. A ",[463,993,799],{},"-hez akkor nyúlj, ha a két példány valóban külön kapcsolat, egymástól függetlenül változó beállításokkal; ha mindig ugyanazt az értéket osztanák meg, egy egyszerű, prefix nélküli ",[463,996,481],{}," mező egyszerűbb.",[472,999,1001],{"id":1000},"tesztelés-tsetenv-vel","Tesztelés t.Setenv-vel",[455,1003,1004,1005,466,1007,1009,1010,1013],{},"Mivel a ",[463,1006,465],{},[463,1008,469],{}," a valódi folyamat-környezetet olvassa, a konfigurációtól függő kódot gyakorló tesztek közvetlenül a ",[463,1011,1012],{},"t.Setenv","-vel állítják be, amit a Go automatikusan visszaállít a teszt után (és elbukik, ha a teszt párhuzamos, ami a helyes bukás: a környezeti változók folyamat-globális állapot):",[491,1015,1017],{"className":493,"code":1016,"language":496,"meta":497,"style":497},"func TestLoad_defaults(t *testing.T) {\n    t.Setenv(\"DB_HOST\", \"localhost\")\n    t.Setenv(\"DB_USER\", \"test\")\n\n    cfg := envconf.MustLoad[config.Config]()\n\n    if cfg.DB.Host != \"localhost\" {\n        t.Errorf(\"DB.Host = %q, want %q\", cfg.DB.Host, \"localhost\")\n    }\n}\n\nfunc TestLoad_missingRequired(t *testing.T) {\n    \u002F\u002F a DB_HOST szándékosan nincs beállítva\n    _, err := envconf.Load[config.Config]()\n    if err == nil {\n        t.Fatal(\"expected an error for missing required DB_HOST\")\n    }\n}\n",[463,1018,1019,1049,1079,1106,1110,1133,1137,1166,1217,1222,1226,1230,1253,1258,1285,1299,1320,1325],{"__ignoreMap":497},[501,1020,1021,1024,1027,1030,1034,1037,1040,1042,1045,1047],{"class":503,"line":504},[501,1022,1023],{"class":507},"func",[501,1025,1026],{"class":697}," TestLoad_defaults",[501,1028,1029],{"class":507},"(",[501,1031,1033],{"class":1032},"sHdIc","t",[501,1035,1036],{"class":507}," *",[501,1038,1039],{"class":511},"testing",[501,1041,610],{"class":507},[501,1043,1044],{"class":511},"T",[501,1046,907],{"class":507},[501,1048,597],{"class":507},[501,1050,1051,1054,1056,1059,1061,1063,1065,1067,1069,1072,1075,1077],{"class":503,"line":515},[501,1052,1053],{"class":603},"    t",[501,1055,610],{"class":507},[501,1057,1058],{"class":697},"Setenv",[501,1060,1029],{"class":507},[501,1062,899],{"class":507},[501,1064,750],{"class":631},[501,1066,899],{"class":507},[501,1068,877],{"class":507},[501,1070,1071],{"class":507}," \"",[501,1073,1074],{"class":631},"localhost",[501,1076,899],{"class":507},[501,1078,577],{"class":507},[501,1080,1081,1083,1085,1087,1089,1091,1093,1095,1097,1099,1102,1104],{"class":503,"line":522},[501,1082,1053],{"class":603},[501,1084,610],{"class":507},[501,1086,1058],{"class":697},[501,1088,1029],{"class":507},[501,1090,899],{"class":507},[501,1092,756],{"class":631},[501,1094,899],{"class":507},[501,1096,877],{"class":507},[501,1098,1071],{"class":507},[501,1100,1101],{"class":631},"test",[501,1103,899],{"class":507},[501,1105,577],{"class":507},[501,1107,1108],{"class":503,"line":532},[501,1109,519],{"emptyLinePlaceholder":518},[501,1111,1112,1115,1117,1119,1121,1123,1125,1127,1129,1131],{"class":503,"line":544},[501,1113,1114],{"class":603},"    cfg ",[501,1116,689],{"class":507},[501,1118,692],{"class":603},[501,1120,610],{"class":507},[501,1122,469],{"class":697},[501,1124,700],{"class":507},[501,1126,703],{"class":511},[501,1128,610],{"class":507},[501,1130,481],{"class":511},[501,1132,710],{"class":507},[501,1134,1135],{"class":503,"line":554},[501,1136,519],{"emptyLinePlaceholder":518},[501,1138,1139,1142,1145,1147,1150,1152,1155,1158,1160,1162,1164],{"class":503,"line":564},[501,1140,1141],{"class":525},"    if",[501,1143,1144],{"class":603}," cfg",[501,1146,610],{"class":507},[501,1148,1149],{"class":603},"DB",[501,1151,610],{"class":507},[501,1153,1154],{"class":603},"Host ",[501,1156,1157],{"class":507},"!=",[501,1159,1071],{"class":507},[501,1161,1074],{"class":631},[501,1163,899],{"class":507},[501,1165,597],{"class":507},[501,1167,1168,1171,1173,1176,1178,1180,1183,1187,1190,1192,1194,1196,1198,1200,1202,1204,1207,1209,1211,1213,1215],{"class":503,"line":574},[501,1169,1170],{"class":603},"        t",[501,1172,610],{"class":507},[501,1174,1175],{"class":697},"Errorf",[501,1177,1029],{"class":507},[501,1179,899],{"class":507},[501,1181,1182],{"class":631},"DB.Host = ",[501,1184,1186],{"class":1185},"swJcz","%q",[501,1188,1189],{"class":631},", want ",[501,1191,1186],{"class":1185},[501,1193,899],{"class":507},[501,1195,877],{"class":507},[501,1197,1144],{"class":603},[501,1199,610],{"class":507},[501,1201,1149],{"class":603},[501,1203,610],{"class":507},[501,1205,1206],{"class":603},"Host",[501,1208,877],{"class":507},[501,1210,1071],{"class":507},[501,1212,1074],{"class":631},[501,1214,899],{"class":507},[501,1216,577],{"class":507},[501,1218,1219],{"class":503,"line":580},[501,1220,1221],{"class":507},"    }\n",[501,1223,1224],{"class":503,"line":585},[501,1225,675],{"class":507},[501,1227,1228],{"class":503,"line":600},[501,1229,519],{"emptyLinePlaceholder":518},[501,1231,1232,1234,1237,1239,1241,1243,1245,1247,1249,1251],{"class":503,"line":616},[501,1233,1023],{"class":507},[501,1235,1236],{"class":697}," TestLoad_missingRequired",[501,1238,1029],{"class":507},[501,1240,1033],{"class":1032},[501,1242,1036],{"class":507},[501,1244,1039],{"class":511},[501,1246,610],{"class":507},[501,1248,1044],{"class":511},[501,1250,907],{"class":507},[501,1252,597],{"class":507},[501,1254,1255],{"class":503,"line":638},[501,1256,1257],{"class":910},"    \u002F\u002F a DB_HOST szándékosan nincs beállítva\n",[501,1259,1260,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283],{"class":503,"line":651},[501,1261,1262],{"class":603},"    _",[501,1264,877],{"class":507},[501,1266,880],{"class":603},[501,1268,689],{"class":507},[501,1270,692],{"class":603},[501,1272,610],{"class":507},[501,1274,465],{"class":697},[501,1276,700],{"class":507},[501,1278,703],{"class":511},[501,1280,610],{"class":507},[501,1282,481],{"class":511},[501,1284,710],{"class":507},[501,1286,1287,1289,1291,1294,1297],{"class":503,"line":672},[501,1288,1141],{"class":525},[501,1290,880],{"class":603},[501,1292,1293],{"class":507},"==",[501,1295,1296],{"class":507}," nil",[501,1298,597],{"class":507},[501,1300,1302,1304,1306,1309,1311,1313,1316,1318],{"class":503,"line":1301},16,[501,1303,1170],{"class":603},[501,1305,610],{"class":507},[501,1307,1308],{"class":697},"Fatal",[501,1310,1029],{"class":507},[501,1312,899],{"class":507},[501,1314,1315],{"class":631},"expected an error for missing required DB_HOST",[501,1317,899],{"class":507},[501,1319,577],{"class":507},[501,1321,1323],{"class":503,"line":1322},17,[501,1324,1221],{"class":507},[501,1326,1328],{"class":503,"line":1327},18,[501,1329,675],{"class":507},[455,1331,1332,1333,1335,1336,1338,1339,1341,1342,1344,1345,1347],{},"Itt nincs szó ",[463,1334,950],{}," fájlról: a ",[463,1337,1012],{}," valódi folyamat-környezeti változókat állít be a teszt idejére, pontosan azt, amit a ",[463,1340,465],{}," először olvas (mielőtt bármilyen ",[463,1343,950],{},"-értékre visszaesne), így a teszt determinisztikus, függetlenül attól, hogy létezik-e épp ",[463,1346,950],{}," fájl a munkakönyvtárban.",[472,1349,1351],{"id":1350},"a-frameworkkel","A frameworkkel",[455,1353,1354,1355,1358,1359,466,1361,466,1363,1366,1367,1369,1370,1373],{},"Egy generált gpsystem projekt ",[463,1356,1357],{},"internal\u002Fplatform\u002Fconfig"," csomagja pontosan a fenti kompozíciós minta, egyszer generálva és az ",[463,1360,91],{},[463,1362,116],{},[463,1364,1365],{},"add worker"," által bővítve, ahogy modulok kerülnek a projektbe. Lásd a ",[459,1368,165],{"href":191}," oldalt a koncepció-szintű nézetért (miért explicit, csak boot-időben létező függőség a konfiguráció gpsystemben), és a ",[459,1371,1372],{"href":166},"Konfigurációs referenciát"," a teljes, generált-projektenkénti változótáblázatért.",[472,1375,1377],{"id":1376},"kapcsolódó-oldalak","Kapcsolódó oldalak",[1379,1380,1381,1398,1403],"ul",{},[1382,1383,1384,1387,1388,466,1390,466,1392,1394,1395,1397],"li",{},[459,1385,1386],{"href":266},"envconf: Áttekintés",": ",[463,1389,465],{},[463,1391,469],{},[463,1393,799],{},", tagek, ",[463,1396,950],{},"-betöltés.",[1382,1399,1400,1402],{},[459,1401,165],{"href":191},": a kompozíciós elv és a gp-system modulok közti prefix-konvenciók.",[1382,1404,1405,1408],{},[459,1406,1407],{"href":166},"Konfigurációs referencia",": minden env-változó, modulonként.",[1410,1411,1412],"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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":497,"searchDepth":515,"depth":515,"links":1414},[1415,1416,1417,1418,1419],{"id":474,"depth":515,"text":475},{"id":785,"depth":515,"text":786},{"id":1000,"depth":515,"text":1001},{"id":1350,"depth":515,"text":1351},{"id":1376,"depth":515,"text":1377},"Gyakori envconf minták: kompozíció, prefixek, tesztelés.","md",null,{},{"icon":193},{"title":269,"description":1420},"_zlHVZHAI_J9kl3yL0G6f_RA5f31YcnghxRx2nGcftE",[1428,1430],{"title":52,"path":266,"stem":267,"description":1429,"icon":193,"children":-1},"Típusos környezetikonfiguráció-betöltés struct tagekkel.",{"title":52,"path":278,"stem":279,"description":1431,"icon":189,"children":-1},"Strukturált Go hibák stackkel, kóddal és kliensbiztos üzenettel.",1787346806244]