[{"data":1,"prerenderedAt":555},["ShallowReactive",2],{"navigation_docs":3,"-developer-building-releases":218,"-developer-building-releases-surround":550},[4,20,45,75,95,105,140,168,198],{"title":5,"path":6,"stem":7,"children":8,"page":19},"Introduction","\u002Fintroduction","1.introduction",[9,14],{"title":10,"path":11,"stem":12,"icon":13},"What is GO?","\u002Fintroduction\u002Fwhat-is-go","1.introduction\u002F1.what-is-go","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Features","\u002Fintroduction\u002Ffeatures","1.introduction\u002F2.features","i-lucide-sparkles",false,{"title":21,"path":22,"stem":23,"children":24,"page":19},"Getting Started","\u002Fgetting-started","2.getting-started",[25,30,35,40],{"title":26,"path":27,"stem":28,"icon":29},"Installation","\u002Fgetting-started\u002Finstallation","2.getting-started\u002F1.installation","i-lucide-download",{"title":31,"path":32,"stem":33,"icon":34},"Configuration","\u002Fgetting-started\u002Fconfiguration","2.getting-started\u002F2.configuration","i-lucide-settings",{"title":36,"path":37,"stem":38,"icon":39},"First Setup","\u002Fgetting-started\u002Ffirst-setup","2.getting-started\u002F3.first-setup","i-lucide-rocket",{"title":41,"path":42,"stem":43,"icon":44},"Updating","\u002Fgetting-started\u002Fupdating","2.getting-started\u002F4.updating","i-lucide-refresh-cw",{"title":46,"icon":19,"path":47,"stem":48,"children":49,"page":19},"User Guide","\u002Fuser-guide","3.user-guide",[50,55,60,65,70],{"title":51,"path":52,"stem":53,"icon":54},"Creating a Short Link","\u002Fuser-guide\u002Fcreating-a-short-link","3.user-guide\u002F1.creating-a-short-link","i-lucide-link",{"title":56,"path":57,"stem":58,"icon":59},"Expiration","\u002Fuser-guide\u002Fexpiration","3.user-guide\u002F2.expiration","i-lucide-clock",{"title":61,"path":62,"stem":63,"icon":64},"Renewing Links","\u002Fuser-guide\u002Frenewing-links","3.user-guide\u002F3.renewing-links","i-lucide-repeat",{"title":66,"path":67,"stem":68,"icon":69},"Dashboard","\u002Fuser-guide\u002Fdashboard","3.user-guide\u002F4.dashboard","i-lucide-layout-dashboard",{"title":71,"path":72,"stem":73,"icon":74},"Analytics","\u002Fuser-guide\u002Fanalytics","3.user-guide\u002F5.analytics","i-lucide-bar-chart-3",{"title":76,"path":77,"stem":78,"children":79,"page":19},"Authentication","\u002Fauthentication","4.authentication",[80,85,90],{"title":81,"path":82,"stem":83,"icon":84},"Email Login","\u002Fauthentication\u002Femail-login","4.authentication\u002F1.email-login","i-lucide-mail",{"title":86,"path":87,"stem":88,"icon":89},"Google Login","\u002Fauthentication\u002Fgoogle-login","4.authentication\u002F2.google-login","i-lucide-globe",{"title":91,"path":92,"stem":93,"icon":94},"Firebase Setup","\u002Fauthentication\u002Ffirebase-setup","4.authentication\u002F3.firebase-setup","i-simple-icons-firebase",{"title":96,"path":97,"stem":98,"children":99,"page":19},"Captcha","\u002Fcaptcha","5.captcha",[100],{"title":101,"path":102,"stem":103,"icon":104},"Cloudflare Turnstile","\u002Fcaptcha\u002Fcloudflare-turnstile","5.captcha\u002F1.cloudflare-turnstile","i-simple-icons-cloudflare",{"title":106,"path":107,"stem":108,"children":109,"page":19},"Administration","\u002Fadministration","6.administration",[110,115,120,125,130,135],{"title":111,"path":112,"stem":113,"icon":114},"Admin Panel","\u002Fadministration\u002Fadmin-panel","6.administration\u002F1.admin-panel","i-lucide-shield",{"title":116,"path":117,"stem":118,"icon":119},"Users","\u002Fadministration\u002Fusers","6.administration\u002F2.users","i-lucide-users",{"title":121,"path":122,"stem":123,"icon":124},"Links","\u002Fadministration\u002Flinks","6.administration\u002F3.links","i-lucide-link-2",{"title":126,"path":127,"stem":128,"icon":129},"Reports","\u002Fadministration\u002Freports","6.administration\u002F4.reports","i-lucide-flag",{"title":131,"path":132,"stem":133,"icon":134},"Bans & Timeouts","\u002Fadministration\u002Fbans-and-timeouts","6.administration\u002F5.bans-and-timeouts","i-lucide-user-x",{"title":136,"path":137,"stem":138,"icon":139},"Audit Logs","\u002Fadministration\u002Faudit-logs","6.administration\u002F6.audit-logs","i-lucide-scroll",{"title":141,"path":142,"stem":143,"children":144,"page":19},"Deployment","\u002Fdeployment","7.deployment",[145,150,155,160,165],{"title":146,"path":147,"stem":148,"icon":149},"VPS Installation","\u002Fdeployment\u002Fvps-installation","7.deployment\u002F1.vps-installation","i-lucide-server",{"title":151,"path":152,"stem":153,"icon":154},"Environment Variables","\u002Fdeployment\u002Fenvironment-variables","7.deployment\u002F2.environment-variables","i-lucide-sliders",{"title":156,"path":157,"stem":158,"icon":159},"Cloudflare Tunnel","\u002Fdeployment\u002Fcloudflare-tunnel","7.deployment\u002F3.cloudflare-tunnel","i-lucide-network",{"title":161,"path":162,"stem":163,"icon":164},"Systemd","\u002Fdeployment\u002Fsystemd","7.deployment\u002F4.systemd","i-lucide-cpu",{"title":41,"path":166,"stem":167,"icon":44},"\u002Fdeployment\u002Fupdating","7.deployment\u002F5.updating",{"title":169,"path":170,"stem":171,"children":172,"page":19},"Developer","\u002Fdeveloper","8.developer",[173,178,183,188,193],{"title":174,"path":175,"stem":176,"icon":177},"Architecture","\u002Fdeveloper\u002Farchitecture","8.developer\u002F1.architecture","i-lucide-box",{"title":179,"path":180,"stem":181,"icon":182},"API Architecture","\u002Fdeveloper\u002Fapi","8.developer\u002F2.api","i-lucide-code-xml",{"title":184,"path":185,"stem":186,"icon":187},"Database","\u002Fdeveloper\u002Fdatabase","8.developer\u002F3.database","i-lucide-database",{"title":189,"path":190,"stem":191,"icon":192},"Development","\u002Fdeveloper\u002Fdevelopment","8.developer\u002F4.development","i-lucide-terminal",{"title":194,"path":195,"stem":196,"icon":197},"Building Releases","\u002Fdeveloper\u002Fbuilding-releases","8.developer\u002F5.building-releases","i-lucide-package-check",{"title":199,"path":200,"stem":201,"children":202,"page":19},"Reference","\u002Freference","9.reference",[203,208,213],{"title":204,"path":205,"stem":206,"icon":207},"Configuration Reference","\u002Freference\u002Fconfiguration","9.reference\u002F1.configuration","i-lucide-file-cog",{"title":209,"path":210,"stem":211,"icon":212},"API Reference","\u002Freference\u002Fapi-reference","9.reference\u002F2.api-reference","i-lucide-webhook",{"title":214,"path":215,"stem":216,"icon":217},"Changelog","\u002Freference\u002Fchangelog","9.reference\u002F3.changelog","i-lucide-history",{"id":219,"title":194,"body":220,"description":541,"extension":542,"links":543,"meta":544,"navigation":545,"path":195,"seo":546,"stem":196,"__hash__":549},"docs\u002F8.developer\u002F5.building-releases.md",{"type":221,"value":222,"toc":535},"minimark",[223,227,231,234,244,251,288,290,294,297,479,491,493,497,500,528,531],[224,225,194],"h1",{"id":226},"building-releases",[228,229,230],"p",{},"In adherence to GO Shortener's zero-compile deployment model, all production binaries are compiled and verified inside GitHub Actions rather than on destination servers.",[232,233],"hr",{},[235,236,238,239,243],"h2",{"id":237},"the-build-pipeline-githubworkflowsreleaseyml","The Build Pipeline (",[240,241,242],"code",{},".github\u002Fworkflows\u002Frelease.yml",")",[228,245,246,247,250],{},"When a version tag (e.g., ",[240,248,249],{},"v1.0.0",") is pushed to GitHub, the workflow automatically:",[252,253,254,262,269,279,285],"ol",{},[255,256,257,258,261],"li",{},"Runs the test suite (",[240,259,260],{},"go test -v .\u002F...",").",[255,263,264,265,268],{},"Syncs frontend assets into ",[240,266,267],{},"backend\u002Finternal\u002Fembedded\u002Fpublic",".",[255,270,271,272,275,276,268],{},"Cross-compiles standalone binaries for ",[240,273,274],{},"linux\u002Famd64"," and ",[240,277,278],{},"linux\u002Farm64",[255,280,281,282,268],{},"Computes SHA-256 checksums into ",[240,283,284],{},"checksums.txt",[255,286,287],{},"Publishes a GitHub Release containing the binaries and helper scripts.",[232,289],{},[235,291,293],{"id":292},"manual-local-compilation","Manual Local Compilation",[228,295,296],{},"To manually compile release binaries on your development workstation:",[298,299,305],"pre",{"className":300,"code":301,"filename":302,"language":303,"meta":304,"style":304},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 1. Sync embedded frontend assets\nmkdir -p backend\u002Finternal\u002Fembedded\u002Fpublic\ncp -r frontend\u002Fpublic\u002F* backend\u002Finternal\u002Fembedded\u002Fpublic\u002F\n\n# 2. Build for Linux x86_64 (amd64)\ncd backend\nCGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags=\"-s -w\" -o ..\u002Fdist\u002Fgo-shortener-linux-amd64 .\u002Fcmd\u002Fserver\u002Fmain.go\n\n# 3. Build for Linux ARM64 (aarch64)\nCGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags=\"-s -w\" -o ..\u002Fdist\u002Fgo-shortener-linux-arm64 .\u002Fcmd\u002Fserver\u002Fmain.go\n","Terminal","bash","",[240,306,307,316,330,349,356,362,372,427,432,438],{"__ignoreMap":304},[308,309,312],"span",{"class":310,"line":311},"line",1,[308,313,315],{"class":314},"sHwdD","# 1. Sync embedded frontend assets\n",[308,317,319,323,327],{"class":310,"line":318},2,[308,320,322],{"class":321},"sBMFI","mkdir",[308,324,326],{"class":325},"sfazB"," -p",[308,328,329],{"class":325}," backend\u002Finternal\u002Fembedded\u002Fpublic\n",[308,331,333,336,339,342,346],{"class":310,"line":332},3,[308,334,335],{"class":321},"cp",[308,337,338],{"class":325}," -r",[308,340,341],{"class":325}," frontend\u002Fpublic\u002F",[308,343,345],{"class":344},"sTEyZ","*",[308,347,348],{"class":325}," backend\u002Finternal\u002Fembedded\u002Fpublic\u002F\n",[308,350,352],{"class":310,"line":351},4,[308,353,355],{"emptyLinePlaceholder":354},true,"\n",[308,357,359],{"class":310,"line":358},5,[308,360,361],{"class":314},"# 2. Build for Linux x86_64 (amd64)\n",[308,363,365,369],{"class":310,"line":364},6,[308,366,368],{"class":367},"s2Zo4","cd",[308,370,371],{"class":325}," backend\n",[308,373,375,378,382,385,388,390,393,396,398,401,404,407,410,413,416,418,421,424],{"class":310,"line":374},7,[308,376,377],{"class":344},"CGO_ENABLED",[308,379,381],{"class":380},"sMK4o","=",[308,383,384],{"class":325},"0",[308,386,387],{"class":344}," GOOS",[308,389,381],{"class":380},[308,391,392],{"class":325},"linux",[308,394,395],{"class":344}," GOARCH",[308,397,381],{"class":380},[308,399,400],{"class":325},"amd64",[308,402,403],{"class":321}," go",[308,405,406],{"class":325}," build",[308,408,409],{"class":325}," -ldflags=",[308,411,412],{"class":380},"\"",[308,414,415],{"class":325},"-s -w",[308,417,412],{"class":380},[308,419,420],{"class":325}," -o",[308,422,423],{"class":325}," ..\u002Fdist\u002Fgo-shortener-linux-amd64",[308,425,426],{"class":325}," .\u002Fcmd\u002Fserver\u002Fmain.go\n",[308,428,430],{"class":310,"line":429},8,[308,431,355],{"emptyLinePlaceholder":354},[308,433,435],{"class":310,"line":434},9,[308,436,437],{"class":314},"# 3. Build for Linux ARM64 (aarch64)\n",[308,439,441,443,445,447,449,451,453,455,457,460,462,464,466,468,470,472,474,477],{"class":310,"line":440},10,[308,442,377],{"class":344},[308,444,381],{"class":380},[308,446,384],{"class":325},[308,448,387],{"class":344},[308,450,381],{"class":380},[308,452,392],{"class":325},[308,454,395],{"class":344},[308,456,381],{"class":380},[308,458,459],{"class":325},"arm64",[308,461,403],{"class":321},[308,463,406],{"class":325},[308,465,409],{"class":325},[308,467,412],{"class":380},[308,469,415],{"class":325},[308,471,412],{"class":380},[308,473,420],{"class":325},[308,475,476],{"class":325}," ..\u002Fdist\u002Fgo-shortener-linux-arm64",[308,478,426],{"class":325},[480,481,482,483,486,487,268],"tip",{},"The ",[240,484,485],{},"-ldflags=\"-s -w\""," flag strips debugging information and DWARF symbol tables, reducing the final compiled executable size from ~22 MB down to ",[488,489,490],"strong",{},"~13 MB",[232,492],{},[235,494,496],{"id":495},"triggering-a-github-release","Triggering a GitHub Release",[228,498,499],{},"Create and push a Git tag to trigger the cloud release workflow:",[298,501,503],{"className":300,"code":502,"filename":302,"language":303,"meta":304,"style":304},"git tag v1.0.0\ngit push origin v1.0.0\n",[240,504,505,516],{"__ignoreMap":304},[308,506,507,510,513],{"class":310,"line":311},[308,508,509],{"class":321},"git",[308,511,512],{"class":325}," tag",[308,514,515],{"class":325}," v1.0.0\n",[308,517,518,520,523,526],{"class":310,"line":318},[308,519,509],{"class":321},[308,521,522],{"class":325}," push",[308,524,525],{"class":325}," origin",[308,527,515],{"class":325},[228,529,530],{},"Once the workflow finishes (typically under 2 minutes), prebuilt binaries will be available on the GitHub repository releases tab.",[532,533,534],"style",{},"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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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":304,"searchDepth":318,"depth":318,"links":536},[537,539,540],{"id":237,"depth":318,"text":538},"The Build Pipeline (.github\u002Fworkflows\u002Frelease.yml)",{"id":292,"depth":318,"text":293},{"id":495,"depth":318,"text":496},"Multi-architecture cross-compilation and automated GitHub Actions release pipelines.","md",null,{},{"icon":197},{"title":547,"description":548},"Building Releases - GO Shortener Developer Guide","How GitHub Actions builds and publishes multi-architecture standalone binaries for GO Shortener.","0HUEMhMsTdnCyrTpWbN2EaJ8odpstsi70j8S5n_D9EU",[551,553],{"title":189,"path":190,"stem":191,"description":552,"icon":192,"children":-1},"Setting up a local development environment, running tests, and compiling the project.",{"title":204,"path":205,"stem":206,"description":554,"icon":207,"children":-1},"Complete reference table for all GO Shortener environment variables.",1788462428945]