[{"data":1,"prerenderedAt":1524},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-getting-started-introduction":442,"-hu-getting-started-introduction-surround":1521},[4,45,60,81,112,129,146,173,197,213,242,280,357,373,385,404,430],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"queue","i-lucide-layers","\u002Fhu\u002Fqueue","hu\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Áttekintés","\u002Fhu\u002Fqueue\u002Foverview","hu\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F11.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F12.auth\u002F5.social-standalone","i-lucide-log-in",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"A kit","i-lucide-box","\u002Fhu\u002Fkit","hu\u002F3.kit",[248,252,257,262,267,271,276],{"title":249,"path":250,"stem":251,"icon":244},"A kit áttekintése","\u002Fhu\u002Fkit\u002Foverview","hu\u002F3.kit\u002F1.overview",{"title":253,"path":254,"stem":255,"icon":256},"Alkalmazás-életciklus","\u002Fhu\u002Fkit\u002Fapp","hu\u002F3.kit\u002F2.app","i-lucide-power",{"title":258,"path":259,"stem":260,"icon":261},"Szerver","\u002Fhu\u002Fkit\u002Fserver","hu\u002F3.kit\u002F3.server","i-lucide-server",{"title":263,"path":264,"stem":265,"icon":266},"Worker","\u002Fhu\u002Fkit\u002Fworker","hu\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":268,"path":269,"stem":270,"icon":70},"Realtime","\u002Fhu\u002Fkit\u002Frealtime","hu\u002F3.kit\u002F5.realtime",{"title":272,"path":273,"stem":274,"icon":275},"Migrációk","\u002Fhu\u002Fkit\u002Fmigrations","hu\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":277,"path":278,"stem":279,"icon":111},"Social login","\u002Fhu\u002Fkit\u002Fsocial-login","hu\u002F3.kit\u002F7.social-login",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F4.cli",[286,289,294,299,304,309,314,319,324,329,334,338,343,348,352],{"title":52,"path":287,"stem":288,"icon":282},"\u002Fhu\u002Fcli\u002Foverview","hu\u002F4.cli\u002F1.overview",{"title":290,"path":291,"stem":292,"icon":293},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":295,"path":296,"stem":297,"icon":298},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":300,"path":301,"stem":302,"icon":303},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":305,"path":306,"stem":307,"icon":308},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":310,"path":311,"stem":312,"icon":313},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":315,"path":316,"stem":317,"icon":318},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":320,"path":321,"stem":322,"icon":323},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":325,"path":326,"stem":327,"icon":328},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":330,"path":331,"stem":332,"icon":333},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":335,"path":336,"stem":337,"icon":244},"add core","\u002Fhu\u002Fcli\u002Fadd-core","hu\u002F4.cli\u002F5.add-core",{"title":339,"path":340,"stem":341,"icon":342},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":344,"path":345,"stem":346,"icon":347},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":349,"path":350,"stem":351,"icon":266},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F4.cli\u002F8.worker-generators",{"title":353,"path":354,"stem":355,"icon":356},"upgrade templates","\u002Fhu\u002Fcli\u002Fupgrade-templates","hu\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":358,"icon":227,"path":359,"stem":360,"children":361,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F5.errs",[362,365,369],{"title":52,"path":363,"stem":364,"icon":227},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F5.errs\u002F1.overview",{"title":366,"path":367,"stem":368},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F5.errs\u002F2.api",{"title":370,"path":371,"stem":372,"icon":227},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F5.errs\u002F3.integration",{"title":374,"icon":231,"path":375,"stem":376,"children":377,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F6.envconf",[378,381],{"title":52,"path":379,"stem":380,"icon":231},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F6.envconf\u002F1.overview",{"title":382,"path":383,"stem":384},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F6.envconf\u002F2.recipes",{"title":386,"icon":387,"path":388,"stem":389,"children":390,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F7.httperr",[391,394,399],{"title":52,"path":392,"stem":393,"icon":387},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F7.httperr\u002F1.overview",{"title":395,"path":396,"stem":397,"icon":398},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":400,"path":401,"stem":402,"icon":403},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":405,"icon":406,"path":407,"stem":408,"children":409,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F8.dbx",[410,413,417,421,426],{"title":52,"path":411,"stem":412,"icon":406},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F8.dbx\u002F1.overview",{"title":414,"path":415,"stem":416,"icon":106},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F8.dbx\u002F2.pg",{"title":418,"path":419,"stem":420,"icon":47},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F8.dbx\u002F3.bunx",{"title":422,"path":423,"stem":424,"icon":425},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":427,"path":428,"stem":429,"icon":318},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F8.dbx\u002F5.seed",{"title":431,"icon":55,"path":432,"stem":433,"children":434,"page":44},"paginate","\u002Fhu\u002Fpaginate","hu\u002F9.paginate",[435,438],{"title":52,"path":436,"stem":437,"icon":55},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F9.paginate\u002F1.overview",{"title":439,"path":440,"stem":441,"icon":19},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F9.paginate\u002F2.cursor",{"id":443,"title":11,"body":444,"description":1514,"extension":1515,"links":1516,"meta":1517,"navigation":1518,"path":12,"seo":1519,"stem":13,"__hash__":1520},"docs_hu\u002Fhu\u002F1.getting-started\u002F1.introduction.md",{"type":445,"value":446,"toc":1505},"minimark",[447,451,611,616,619,628,631,745,752,756,801,805,812,862,865,903,919,923,926,1389,1399,1403,1457,1461,1476,1480,1501],[448,449,450],"p",{},"A gpsystem 12 önálló Go-modul plusz egy vékony generátor\u002Fkit, ami ezeket összeköti:",[452,453,454,573],"ul",{},[455,456,457,461,462,466,467,472,473,477,478,482,483,486,487,482,491,494,495,494,498,486,501,494,505,494,509,482,513,494,516,486,519,482,523,494,526,486,529,482,533,494,536,486,539,482,543,494,546,486,549,482,553,494,556,486,559,482,563,494,566,494,569,572],"li",{},[458,459,460],"strong",{},"12 önálló modul",", mindegyik saját Go-modul, külön verziózva és publikusan tagelve (",[463,464,465],"code",{},"v0.1.0","), önmagában is használható bármely Go-programban: ",[468,469,470],"a",{"href":363},[463,471,358],{}," (stackelhető hibák), ",[468,474,475],{"href":379},[463,476,374],{}," (típusos konfiguráció), ",[468,479,480],{"href":392},[463,481,386],{}," (+ ",[463,484,485],{},"httperr\u002Fvalidate","), ",[468,488,489],{"href":411},[463,490,405],{},[463,492,493],{},"dbx\u002Fpg",", ",[463,496,497],{},"dbx\u002Fbunx",[463,499,500],{},"dbx\u002Fseed",[468,502,503],{"href":436},[463,504,431],{},[468,506,507],{"href":53},[463,508,46],{},[468,510,511],{"href":68},[463,512,61],{},[463,514,515],{},"events\u002Foutbox",[463,517,518],{},"events\u002Fscheduler",[468,520,521],{"href":89},[463,522,82],{},[463,524,525],{},"auth\u002Frbac",[463,527,528],{},"auth\u002Fpolicy",[468,530,531],{"href":119},[463,532,113],{},[463,534,535],{},"mail\u002Fsmtp",[463,537,538],{},"mail\u002Fmjml",[468,540,541],{"href":136},[463,542,130],{},[463,544,545],{},"notify\u002Fdatabase",[463,547,548],{},"notify\u002Fbroadcast",[468,550,551],{"href":153},[463,552,147],{},[463,554,555],{},"storage\u002Flocal",[463,557,558],{},"storage\u002Fdriver\u002Fs3",[468,560,561],{"href":180},[463,562,174],{},[463,564,565],{},"telemetry\u002Flogx",[463,567,568],{},"telemetry\u002Fotelx",[463,570,571],{},"telemetry\u002Fsentryx",").",[455,574,575,578,579,582,583,588,589,594,595,600,601,606,607,610],{},[458,576,577],{},"Egy vékony kit"," (",[463,580,581],{},"github.com\u002Fgp-system\u002Fgpsystem","): négy chassis-csomag, ami futó service-szé komponálja a modulokat (",[468,584,585],{"href":254},[463,586,587],{},"app"," életciklus, ",[468,590,591],{"href":259},[463,592,593],{},"server"," chi\u002Fnet-http-n, ",[468,596,597],{"href":264},[463,598,599],{},"worker"," asynq-on, ",[468,602,603],{"href":269},[463,604,605],{},"realtime"," centrifuge-on), plusz egy CLI (",[463,608,609],{},"go tool gpsystem","), ami projektet, modult, surface-t, handlert, eventet, listenert és jobot vázol fel, a hozzájuk tartozó TypeSpec kontraktusfájlokkal együtt.",[612,613,615],"h2",{"id":614},"miért-létezik","Miért létezik",[448,617,618],{},"A Go-ökoszisztéma ereje a kis, egymástól független, jól tesztelt library-kben van. Cserébe minden projekt elölről végigcsinálja ugyanazt a tíz döntést: melyik logger, hogyan néz ki a graceful shutdown, hogyan modellezed a hibákat, hogyan lépi át egy tranzakció a repository-határokat. A gpsystem ezt a munkát végzi el egyszer, mindenki helyett: a bevált Go-library-ket húzza össze egyetlen, karbantartott kompozícióba, szétosztva a fenti 12 modul közt, ahelyett hogy sajátot írna helyettük.",[448,620,621,622,624,625,627],{},"PHP-s háttérrel érkezel? A ",[468,623,16],{"href":17}," és a ",[468,626,21],{"href":22}," oldal fogalomról fogalomra megfelelteti a két világot.",[448,629,630],{},"A modulok lefedik az összes alapfunkcionalitást, amivel a legtöbb oldalon találkozol, a kit pedig futó service-szé köti össze őket:",[452,632,633,638,644,650,655,661,668,673,679,685,691,699,704,710,720,730,739],{},[455,634,635,637],{},[468,636,93],{"href":94},": szerep- és permission-alapú hozzáférés-vezérlés",[455,639,640,643],{},[468,641,642],{"href":99},"Policy réteg",", amikor az RBAC nem elegendő: kérésenkénti tulajdonos- és állapotellenőrzés",[455,645,646,649],{},[468,647,648],{"href":254},"Graceful shutdown",": in-flight kéréseket kiváró, rendezett leállás",[455,651,652,654],{},[468,653,77],{"href":78},": cron és intervallum, replikabiztosan",[455,656,657,660],{},[468,658,659],{"href":264},"Háttér-workerek",": asynq-alapú feldolgozó bináris",[455,662,663,664,667],{},"Skálázhatóság: a ",[468,665,666],{"href":73},"tranzakciós outbox"," és a scheduler leader electionje több replikán is helyesen viselkedik",[455,669,670,672],{},[468,671,422],{"href":423},": contextben utazó, kereszt-repository tranzakciókezelés",[455,674,675,678],{},[468,676,677],{"href":153},"Hálózati fájltárolás",": S3-kompatibilis object storage (AWS, MinIO, RustFS)",[455,680,681,684],{},[468,682,683],{"href":189},"Részletes metrikák",": HTTP-, adatbázis- és queue-instrumentáció OTLP-n",[455,686,687,690],{},[468,688,689],{"href":184},"Monolog-szerű dev logolás",": PHP-ról ismerős, olvasható konzollog fejlesztés közben",[455,692,693,695,696,698],{},[468,694,193],{"href":194},": hibakövetés, ",[463,697,358],{},"-kód szerinti issue-csoportosítással",[455,700,701,703],{},[468,702,188],{"href":189},": trace-ek, metrikák, logok egy hívással",[455,705,706,709],{},[468,707,708],{"href":401},"Validátor",": struct-tag-alapú kérésvalidáció, RFC 9457 hibaválaszokkal",[455,711,712,715,716,719],{},[468,713,714],{"href":229},"Típusos konfiguráció",": env-változók struct-okba töltve, ",[463,717,718],{},".env","-támogatással",[455,721,722,725,726,729],{},[468,723,724],{"href":225},"Stackelhető hibakezelés",": ",[463,727,728],{},"fmt.Errorf","-ként komponáló hibák stackkel, hibakóddal és kliensbiztos üzenettel",[455,731,732,734,735,738],{},[468,733,272],{"href":273},": beágyazott SQL, saját ",[463,736,737],{},"cmd\u002Fmigrate"," binárissal",[455,740,741,744],{},[468,742,743],{"href":234},"Kódgenerálás",": TypeSpec-kontraktusból típusos szerverkód",[448,746,747,748,751],{},"Mindegyik egyszer van megírva és tesztelve a kitben; a projektjeid egyetlen ",[463,749,750],{},"go.mod","-verzió emelésével frissülnek.",[612,753,755],{"id":754},"mi-nem-a-gpsystem","Mi NEM a gpsystem",[452,757,758,775,785,791],{},[455,759,760,763,764,767,768,771,772,774],{},[458,761,762],{},"Nem framework."," Nincs IoC-konténer, nincs kötelező Module-interfész, nincs kit-tulajdonú lifecycle-hook, amit egy bootstrap felfedez és meghív. A ",[463,765,766],{},"main()","-t te írod; minden függőség kézzel, explicit kóddal kerül be. A kit egyetlen inverziója a folyamat-életciklus (",[463,769,770],{},"Run(ctx, cfg, register)","): jelez, leállít, flush-öl, a business-wiringhez nem nyúl. Lásd az ",[468,773,220],{"href":221}," oldalt, hol húzódik ez a határ.",[455,776,777,780,781,784],{},[458,778,779],{},"Nem platform."," A gpsystem nem birtokolja az infrastruktúrádat: nincs saját deploy-modell, saját felhő, saját runtime; a ",[463,782,783],{},"chi.Router",", a pgx pool a tiéd marad.",[455,786,787,790],{},[458,788,789],{},"Nem ORM."," Nincs Eloquent- vagy Doctrine-szimuláció; a repository-réteg SQL-t (pgx) vagy egy query buildert (bun) ír, explicit lekérdezésekkel.",[455,792,793,796,797,800],{},[458,794,795],{},"A generált kód a tiéd."," Amit a CLI felvázol, azt úgy szerkeszted, mint bármely más kódot, kivéve a szűk, kimondottan újragenerált zónát (a TypeSpec→OpenAPI→oapi-codegen transport-stubok a ",[463,798,799],{},"gen\u002F"," alatt), amit nem kézzel írsz, hanem a specifikációt módosítod.",[612,802,804],{"id":803},"nem-rejti-el-a-függőségeket","Nem rejti el a függőségeket",[448,806,807,808,811],{},"A gpsystem elve: ",[458,809,810],{},"centralizál, nem absztrahál."," A külső függőségekhez való hozzáférés egy-egy modulban összpontosul, de a típusaik szabadon átfolynak a publikus API-n:",[452,813,814,828,847],{},[455,815,816,817,820,821,823,824,827],{},"a ",[463,818,819],{},"server.Run"," register-függvénye ",[463,822,783],{},"-t ad: a handlereid a natív ",[463,825,826],{},"net\u002Fhttp"," API-t használják;",[455,829,816,830,832,833,836,837,840,841,832,843,846],{},[463,831,493],{}," ",[463,834,835],{},"pgx.Rows","-t és ",[463,838,839],{},"pgxpool.Pool","-t ad vissza, a ",[463,842,497],{},[463,844,845],{},"bun.DB","-t;",[455,848,816,849,832,851,854,855,494,858,861],{},[463,850,46],{},[463,852,853],{},"*asynq.Task","-kal dolgozik, a worker escape hatch-ei (",[463,856,857],{},"WithAsynqConfig",[463,859,860],{},"WithMux",") nyers asynq-ot adnak.",[448,863,864],{},"Az upstream dokumentáció és a Stack Overflow-válaszok emiatt nálad is érvényesek maradnak, és nem egy kit-specifikus wrapper-API-t kell megtanulnod. Három helyen tér el ettől a gpsystem, mindháromszor kimondott okkal:",[452,866,867,882,893],{},[455,868,816,869,873,874,877,878,881],{},[468,870,871],{"href":153},[463,872,147],{}," modul ",[463,875,876],{},"Driver","\u002F",[463,879,880],{},"Disk"," felosztása elrejti az AWS SDK-t egy kis backend-kontraktus mögé: az app-kódodnak így nem kell az AWS SDK-t importálnia egy fájlfeltöltéshez;",[455,883,816,884,888,889,892],{},[468,885,886],{"href":194},[463,887,571],{}," becsomagolja a sentry-go-t: a Sentry env-ből kapcsolható (",[463,890,891],{},"SENTRY_DSN"," üresen = teljesen kikapcsolva), és aki nem használja, annak a binárisába be sem linkelődik;",[455,894,816,895,832,899,902],{},[468,896,897],{"href":119},[463,898,113],{},[463,900,901],{},"Mailer"," interfésze mögött él a go-mail és az mjml-go, így tesztben memória-mailerre cserélhető.",[448,904,905,906,909,910,912,913,915,916,918],{},"A részek ",[458,907,908],{},"cserélhetőek és elhagyhatóak",": a ",[463,911,493],{}," használható a ",[463,914,593],{}," nélkül (pl. egy CLI-eszközben), a Sentry és az OTel env-vel kikapcsolható, a pgx\u002Fbun importtal választható, minden modul a többi nélkül is használható. Az ",[468,917,220],{"href":221}," oldal modulonként mutatja, mi mitől függ.",[612,920,922],{"id":921},"a-15-soros-maingo","A ~15 soros main.go",[448,924,925],{},"Egy modul belépési pontja ennyi (a graceful shutdown, a telemetria, a hibarenderelés és a validáció már be van kötve):",[927,928,934],"pre",{"className":929,"code":930,"filename":931,"language":932,"meta":933,"style":933},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","func main() {\n    cfg := envconf.MustLoad[config.Config]()\n    ctx := context.Background()\n    pool := pg.MustNewPool(ctx, cfg.DB)\n\n    err := server.Run(ctx, cfg.Server, func(r chi.Router) error {\n        api := chi.NewRouter()\n        deps := shop.Dependencies{\n            DB:         pg.NewDB(pool),\n            Transactor: pg.NewTransactor(pool),\n        }\n        shop.RegisterApi(api, deps)\n        shop.RegisterAdmin(api, deps)\n        r.Mount(\"\u002Fapi\u002Fv1\", api)\n        return nil\n    }, server.WithCloser(\"pgxpool\", func(context.Context) error {\n        pool.Close()\n        return nil\n    }))\n    if err != nil {\n        log.Fatal(err)\n    }\n}\n","cmd\u002Fshop\u002Fmain.go","go","",[463,935,936,955,989,1008,1044,1051,1106,1123,1142,1167,1188,1194,1217,1237,1266,1276,1316,1329,1336,1342,1359,1377,1383],{"__ignoreMap":933},[937,938,941,945,949,952],"span",{"class":939,"line":940},"line",1,[937,942,944],{"class":943},"sMK4o","func",[937,946,948],{"class":947},"s2Zo4"," main",[937,950,951],{"class":943},"()",[937,953,954],{"class":943}," {\n",[937,956,958,962,965,968,971,974,977,981,983,986],{"class":939,"line":957},2,[937,959,961],{"class":960},"sTEyZ","    cfg ",[937,963,964],{"class":943},":=",[937,966,967],{"class":960}," envconf",[937,969,970],{"class":943},".",[937,972,973],{"class":947},"MustLoad",[937,975,976],{"class":943},"[",[937,978,980],{"class":979},"sBMFI","config",[937,982,970],{"class":943},[937,984,985],{"class":979},"Config",[937,987,988],{"class":943},"]()\n",[937,990,992,995,997,1000,1002,1005],{"class":939,"line":991},3,[937,993,994],{"class":960},"    ctx ",[937,996,964],{"class":943},[937,998,999],{"class":960}," context",[937,1001,970],{"class":943},[937,1003,1004],{"class":947},"Background",[937,1006,1007],{"class":943},"()\n",[937,1009,1011,1014,1016,1019,1021,1024,1027,1030,1033,1036,1038,1041],{"class":939,"line":1010},4,[937,1012,1013],{"class":960},"    pool ",[937,1015,964],{"class":943},[937,1017,1018],{"class":960}," pg",[937,1020,970],{"class":943},[937,1022,1023],{"class":947},"MustNewPool",[937,1025,1026],{"class":943},"(",[937,1028,1029],{"class":960},"ctx",[937,1031,1032],{"class":943},",",[937,1034,1035],{"class":960}," cfg",[937,1037,970],{"class":943},[937,1039,1040],{"class":960},"DB",[937,1042,1043],{"class":943},")\n",[937,1045,1047],{"class":939,"line":1046},5,[937,1048,1050],{"emptyLinePlaceholder":1049},true,"\n",[937,1052,1054,1057,1059,1062,1064,1067,1069,1071,1073,1075,1077,1080,1082,1085,1089,1092,1094,1097,1100,1104],{"class":939,"line":1053},6,[937,1055,1056],{"class":960},"    err ",[937,1058,964],{"class":943},[937,1060,1061],{"class":960}," server",[937,1063,970],{"class":943},[937,1065,1066],{"class":947},"Run",[937,1068,1026],{"class":943},[937,1070,1029],{"class":960},[937,1072,1032],{"class":943},[937,1074,1035],{"class":960},[937,1076,970],{"class":943},[937,1078,1079],{"class":960},"Server",[937,1081,1032],{"class":943},[937,1083,1084],{"class":943}," func(",[937,1086,1088],{"class":1087},"sHdIc","r",[937,1090,1091],{"class":979}," chi",[937,1093,970],{"class":943},[937,1095,1096],{"class":979},"Router",[937,1098,1099],{"class":943},")",[937,1101,1103],{"class":1102},"spNyl"," error",[937,1105,954],{"class":943},[937,1107,1109,1112,1114,1116,1118,1121],{"class":939,"line":1108},7,[937,1110,1111],{"class":960},"        api ",[937,1113,964],{"class":943},[937,1115,1091],{"class":960},[937,1117,970],{"class":943},[937,1119,1120],{"class":947},"NewRouter",[937,1122,1007],{"class":943},[937,1124,1126,1129,1131,1134,1136,1139],{"class":939,"line":1125},8,[937,1127,1128],{"class":960},"        deps ",[937,1130,964],{"class":943},[937,1132,1133],{"class":979}," shop",[937,1135,970],{"class":943},[937,1137,1138],{"class":979},"Dependencies",[937,1140,1141],{"class":943},"{\n",[937,1143,1145,1148,1151,1154,1156,1159,1161,1164],{"class":939,"line":1144},9,[937,1146,1147],{"class":960},"            DB",[937,1149,1150],{"class":943},":",[937,1152,1153],{"class":960},"         pg",[937,1155,970],{"class":943},[937,1157,1158],{"class":947},"NewDB",[937,1160,1026],{"class":943},[937,1162,1163],{"class":960},"pool",[937,1165,1166],{"class":943},"),\n",[937,1168,1170,1173,1175,1177,1179,1182,1184,1186],{"class":939,"line":1169},10,[937,1171,1172],{"class":960},"            Transactor",[937,1174,1150],{"class":943},[937,1176,1018],{"class":960},[937,1178,970],{"class":943},[937,1180,1181],{"class":947},"NewTransactor",[937,1183,1026],{"class":943},[937,1185,1163],{"class":960},[937,1187,1166],{"class":943},[937,1189,1191],{"class":939,"line":1190},11,[937,1192,1193],{"class":943},"        }\n",[937,1195,1197,1200,1202,1205,1207,1210,1212,1215],{"class":939,"line":1196},12,[937,1198,1199],{"class":960},"        shop",[937,1201,970],{"class":943},[937,1203,1204],{"class":947},"RegisterApi",[937,1206,1026],{"class":943},[937,1208,1209],{"class":960},"api",[937,1211,1032],{"class":943},[937,1213,1214],{"class":960}," deps",[937,1216,1043],{"class":943},[937,1218,1220,1222,1224,1227,1229,1231,1233,1235],{"class":939,"line":1219},13,[937,1221,1199],{"class":960},[937,1223,970],{"class":943},[937,1225,1226],{"class":947},"RegisterAdmin",[937,1228,1026],{"class":943},[937,1230,1209],{"class":960},[937,1232,1032],{"class":943},[937,1234,1214],{"class":960},[937,1236,1043],{"class":943},[937,1238,1240,1243,1245,1248,1250,1253,1257,1259,1261,1264],{"class":939,"line":1239},14,[937,1241,1242],{"class":960},"        r",[937,1244,970],{"class":943},[937,1246,1247],{"class":947},"Mount",[937,1249,1026],{"class":943},[937,1251,1252],{"class":943},"\"",[937,1254,1256],{"class":1255},"sfazB","\u002Fapi\u002Fv1",[937,1258,1252],{"class":943},[937,1260,1032],{"class":943},[937,1262,1263],{"class":960}," api",[937,1265,1043],{"class":943},[937,1267,1269,1273],{"class":939,"line":1268},15,[937,1270,1272],{"class":1271},"s7zQu","        return",[937,1274,1275],{"class":943}," nil\n",[937,1277,1279,1282,1284,1286,1289,1291,1293,1296,1298,1300,1302,1305,1307,1310,1312,1314],{"class":939,"line":1278},16,[937,1280,1281],{"class":943},"    },",[937,1283,1061],{"class":960},[937,1285,970],{"class":943},[937,1287,1288],{"class":947},"WithCloser",[937,1290,1026],{"class":943},[937,1292,1252],{"class":943},[937,1294,1295],{"class":1255},"pgxpool",[937,1297,1252],{"class":943},[937,1299,1032],{"class":943},[937,1301,1084],{"class":943},[937,1303,1304],{"class":979},"context",[937,1306,970],{"class":943},[937,1308,1309],{"class":979},"Context",[937,1311,1099],{"class":943},[937,1313,1103],{"class":1102},[937,1315,954],{"class":943},[937,1317,1319,1322,1324,1327],{"class":939,"line":1318},17,[937,1320,1321],{"class":960},"        pool",[937,1323,970],{"class":943},[937,1325,1326],{"class":947},"Close",[937,1328,1007],{"class":943},[937,1330,1332,1334],{"class":939,"line":1331},18,[937,1333,1272],{"class":1271},[937,1335,1275],{"class":943},[937,1337,1339],{"class":939,"line":1338},19,[937,1340,1341],{"class":943},"    }))\n",[937,1343,1345,1348,1351,1354,1357],{"class":939,"line":1344},20,[937,1346,1347],{"class":1271},"    if",[937,1349,1350],{"class":960}," err ",[937,1352,1353],{"class":943},"!=",[937,1355,1356],{"class":943}," nil",[937,1358,954],{"class":943},[937,1360,1362,1365,1367,1370,1372,1375],{"class":939,"line":1361},21,[937,1363,1364],{"class":960},"        log",[937,1366,970],{"class":943},[937,1368,1369],{"class":947},"Fatal",[937,1371,1026],{"class":943},[937,1373,1374],{"class":960},"err",[937,1376,1043],{"class":943},[937,1378,1380],{"class":939,"line":1379},22,[937,1381,1382],{"class":943},"    }\n",[937,1384,1386],{"class":939,"line":1385},23,[937,1387,1388],{"class":943},"}\n",[448,1390,1391,1392,832,1395,1398],{},"Ez a ",[463,1393,1394],{},"shop",[468,1396,1397],{"href":41},"mintaalkalmazás"," belépési pontja. A dokumentáció példái végig erre a projektre épülnek.",[612,1400,1402],{"id":1401},"mi-marad-a-te-kezedben","Mi marad a te kezedben",[452,1404,1405,1429,1438],{},[455,1406,1407,1410,1411,832,1413,877,1416,1419,1420,1422,1423,624,1426,1428],{},[458,1408,1409],{},"A router API-ja natív marad."," A handlereid a ",[463,1412,826],{},[463,1414,1415],{},"http.ResponseWriter",[463,1417,1418],{},"*http.Request","-jét kapják (vagy egy generált handlerben a codegen típusos request\u002Fresponse-át); a ",[463,1421,819],{}," middleware-t és életciklust köt be, de nem csomagolja be a routingot vagy a kéréskezelést. Amit a ",[463,1424,1425],{},"chi",[463,1427,826],{}," tud, azt az appod is tudja.",[455,1430,1431,1433,1434,1437],{},[458,1432,795],{}," A váz a te repódban landol, és úgy szerkeszted, mint bármely más kódot. A generátorok soha nem írnak felül meglévő fájlt, és csak megjelölt anchor-pontokhoz (",[463,1435,1436],{},"\u002F\u002F gpsystem:*",") nyúlnak. Nincs runtime, ami a projektedet értelmezné.",[455,1439,1440,1443,1444,1446,1447,1450,1451,1456],{},[458,1441,1442],{},"Szándékosan vékony."," A ",[463,1445,819],{}," a ",[463,1448,1449],{},"signal.NotifyContext",", a listen, a drain és egy rendezett cleanup-lista kompozíciója (az engine-agnosztikus ",[468,1452,1453,1455],{"href":254},[463,1454,587],{}," életciklus","), pont az a kód, amit egyébként service-enként megírnál, csak egy helyen karbantartva.",[612,1458,1460],{"id":1459},"egy-fogyasztó-projekt-alakja","Egy fogyasztó projekt alakja",[448,1462,1463,1464,1467,1468,1471,1472,1475],{},"Minden modul ",[458,1465,1466],{},"saját belépési pontot"," kap (",[463,1469,1470],{},"cmd\u002F\u003Cmodul>\u002Fmain.go",") és saját processzként fut. Külön vagy együtt deployolod, ahogy akarod. Az API kontraktus ",[458,1473,1474],{},"spec-first",": a TypeSpec OpenAPI 3.0-ra fordul, abból szigorú, típusos szerver-interfész generálódik chi felett. A handlered egy generált interfészt implementál, így a spec-eltérés fordítási hiba.",[612,1477,1479],{"id":1478},"merre-tovább","Merre tovább",[452,1481,1482,1488,1495],{},[455,1483,621,1484,624,1486,627],{},[468,1485,16],{"href":17},[468,1487,21],{"href":22},[455,1489,1490,1491,1494],{},"A ",[468,1492,1493],{"href":41},"shop mintaalkalmazás"," megmutatja, hogyan áll össze mindez egy projektté.",[455,1496,1497,1498,970],{},"Vagy vágj bele rögtön a ",[468,1499,1500],{"href":26},"Telepítéssel",[1502,1503,1504],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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":933,"searchDepth":957,"depth":957,"links":1506},[1507,1508,1509,1510,1511,1512,1513],{"id":614,"depth":957,"text":615},{"id":754,"depth":957,"text":755},{"id":803,"depth":957,"text":804},{"id":921,"depth":957,"text":922},{"id":1401,"depth":957,"text":1402},{"id":1459,"depth":957,"text":1460},{"id":1478,"depth":957,"text":1479},"Mi a gpsystem, kinek szól, és mi marad a te kezedben.","md",null,{},{"icon":14},{"title":11,"description":1514},"_6VGDHR2AMZhFwltFXOEPezMqTnnZjICWygeDGW4OgQ",[1516,1522],{"title":16,"path":17,"stem":18,"description":1523,"icon":19,"children":-1},"Fogalomról fogalomra megfeleltetés a Laravel és a gpsystem között.",1785445877220]