[{"data":1,"prerenderedAt":622},["ShallowReactive",2],{"navigation_docs":3,"-deployment-updating":218,"-deployment-updating-surround":617},[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":41,"body":220,"description":608,"extension":609,"links":610,"meta":611,"navigation":612,"path":166,"seo":613,"stem":167,"__hash__":616},"docs\u002F7.deployment\u002F5.updating.md",{"type":221,"value":222,"toc":594},"minimark",[223,227,231,234,239,242,298,300,304,309,312,328,345,349,352,531,533,537,544,548,562,571,575,578,590],[224,225,41],"h1",{"id":226},"updating",[228,229,230],"p",{},"In production environments, GO Shortener upgrades follow a deterministic zero-compile workflow. The VPS never compiles source code; it merely downloads and swaps out the precompiled release binary while leaving configuration and databases untouched.",[232,233],"hr",{},[235,236,238],"h2",{"id":237},"pre-upgrade-best-practice-database-snapshot","Pre-Upgrade Best Practice: Database Snapshot",[228,240,241],{},"Although the upgrade process does not modify your data files, creating a quick snapshot of the SQLite database prior to upgrading is recommended:",[243,244,250],"pre",{"className":245,"code":246,"filename":247,"language":248,"meta":249,"style":249},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Create a timestamped backup of the database\ncp \u002Froot\u002FGo-shortner\u002Fdata\u002Fgo.sqlite \"\u002Froot\u002FGo-shortner\u002Fdata\u002Fgo-backup-$(date +%Y%m%d%H%M%S).sqlite\"\n","Terminal","bash","",[251,252,253,262],"code",{"__ignoreMap":249},[254,255,258],"span",{"class":256,"line":257},"line",1,[254,259,261],{"class":260},"sHwdD","# Create a timestamped backup of the database\n",[254,263,265,269,273,277,280,283,286,289,292,295],{"class":256,"line":264},2,[254,266,268],{"class":267},"sBMFI","cp",[254,270,272],{"class":271},"sfazB"," \u002Froot\u002FGo-shortner\u002Fdata\u002Fgo.sqlite",[254,274,276],{"class":275},"sMK4o"," \"",[254,278,279],{"class":271},"\u002Froot\u002FGo-shortner\u002Fdata\u002Fgo-backup-",[254,281,282],{"class":275},"$(",[254,284,285],{"class":267},"date",[254,287,288],{"class":271}," +%Y%m%d%H%M%S",[254,290,291],{"class":275},")",[254,293,294],{"class":271},".sqlite",[254,296,297],{"class":275},"\"\n",[232,299],{},[235,301,303],{"id":302},"production-update-workflow","Production Update Workflow",[305,306,308],"h3",{"id":307},"option-1-automated-script-upgrade","Option 1: Automated Script Upgrade",[228,310,311],{},"Run the existing installation script on your server:",[243,313,315],{"className":245,"code":314,"filename":247,"language":248,"meta":249,"style":249},"sudo bash \u002Froot\u002FGo-shortner\u002Finstall.sh\n",[251,316,317],{"__ignoreMap":249},[254,318,319,322,325],{"class":256,"line":257},[254,320,321],{"class":267},"sudo",[254,323,324],{"class":271}," bash",[254,326,327],{"class":271}," \u002Froot\u002FGo-shortner\u002Finstall.sh\n",[329,330,331,332,335,336,339,340,344],"important",{},"The installer checks for the presence of ",[251,333,334],{},"\u002Froot\u002FGo-shortner\u002F.env"," and ",[251,337,338],{},"\u002Froot\u002FGo-shortner\u002Fdata\u002Fgo.sqlite",". It strictly ",[341,342,343],"strong",{},"skips re-creating them",", guaranteeing that all existing links, users, sessions, and configuration remain intact.",[305,346,348],{"id":347},"option-2-zero-compile-binary-swap","Option 2: Zero-Compile Binary Swap",[228,350,351],{},"To perform the upgrade manually with minimum downtime (typically under 1 second):",[353,354,355,359,362,447,451,454,500,504,507],"steps",{},[305,356,358],{"id":357},"_1-download-the-target-release","1. Download the Target Release",[228,360,361],{},"Fetch the new binary directly into a staging file:",[243,363,365],{"className":245,"code":364,"filename":247,"language":248,"meta":249,"style":249},"ARCH=$(uname -m | sed 's\u002Fx86_64\u002Famd64\u002F' | sed 's\u002Faarch64\u002Farm64\u002F')\ncurl -L -o \u002Froot\u002FGo-shortner\u002Fgo-shortener.new \"https:\u002F\u002Fgithub.com\u002FItsARCn\u002FGo-shortner\u002Freleases\u002Flatest\u002Fdownload\u002Fgo-shortener-linux-$ARCH\"\nchmod +x \u002Froot\u002FGo-shortner\u002Fgo-shortener.new\n",[251,366,367,411,435],{"__ignoreMap":249},[254,368,369,373,376,379,382,385,388,391,394,397,399,401,403,406,408],{"class":256,"line":257},[254,370,372],{"class":371},"sTEyZ","ARCH",[254,374,375],{"class":275},"=$(",[254,377,378],{"class":267},"uname",[254,380,381],{"class":271}," -m",[254,383,384],{"class":275}," |",[254,386,387],{"class":267}," sed",[254,389,390],{"class":275}," '",[254,392,393],{"class":271},"s\u002Fx86_64\u002Famd64\u002F",[254,395,396],{"class":275},"'",[254,398,384],{"class":275},[254,400,387],{"class":267},[254,402,390],{"class":275},[254,404,405],{"class":271},"s\u002Faarch64\u002Farm64\u002F",[254,407,396],{"class":275},[254,409,410],{"class":275},")\n",[254,412,413,416,419,422,425,427,430,433],{"class":256,"line":264},[254,414,415],{"class":267},"curl",[254,417,418],{"class":271}," -L",[254,420,421],{"class":271}," -o",[254,423,424],{"class":271}," \u002Froot\u002FGo-shortner\u002Fgo-shortener.new",[254,426,276],{"class":275},[254,428,429],{"class":271},"https:\u002F\u002Fgithub.com\u002FItsARCn\u002FGo-shortner\u002Freleases\u002Flatest\u002Fdownload\u002Fgo-shortener-linux-",[254,431,432],{"class":371},"$ARCH",[254,434,297],{"class":275},[254,436,438,441,444],{"class":256,"line":437},3,[254,439,440],{"class":267},"chmod",[254,442,443],{"class":271}," +x",[254,445,446],{"class":271}," \u002Froot\u002FGo-shortner\u002Fgo-shortener.new\n",[305,448,450],{"id":449},"_2-stop-the-service-swap-executables","2. Stop the Service & Swap Executables",[228,452,453],{},"Quickly stop the service, move the new binary into place, and start the service:",[243,455,457],{"className":245,"code":456,"filename":247,"language":248,"meta":249,"style":249},"systemctl stop go-shortener && \\\nmv \u002Froot\u002FGo-shortner\u002Fgo-shortener.new \u002Froot\u002FGo-shortner\u002Fgo-shortener && \\\nsystemctl start go-shortener\n",[251,458,459,476,490],{"__ignoreMap":249},[254,460,461,464,467,470,473],{"class":256,"line":257},[254,462,463],{"class":267},"systemctl",[254,465,466],{"class":271}," stop",[254,468,469],{"class":271}," go-shortener",[254,471,472],{"class":275}," &&",[254,474,475],{"class":371}," \\\n",[254,477,478,481,483,486,488],{"class":256,"line":264},[254,479,480],{"class":267},"mv",[254,482,424],{"class":271},[254,484,485],{"class":271}," \u002Froot\u002FGo-shortner\u002Fgo-shortener",[254,487,472],{"class":275},[254,489,475],{"class":371},[254,491,492,494,497],{"class":256,"line":437},[254,493,463],{"class":267},[254,495,496],{"class":271}," start",[254,498,499],{"class":271}," go-shortener\n",[305,501,503],{"id":502},"_3-verify-health","3. Verify Health",[228,505,506],{},"Confirm the new version is actively serving traffic:",[243,508,510],{"className":245,"code":509,"filename":247,"language":248,"meta":249,"style":249},"curl -s http:\u002F\u002F127.0.0.1:3000\u002Fapi\u002Fhealth\nsystemctl status go-shortener\n",[251,511,512,522],{"__ignoreMap":249},[254,513,514,516,519],{"class":256,"line":257},[254,515,415],{"class":267},[254,517,518],{"class":271}," -s",[254,520,521],{"class":271}," http:\u002F\u002F127.0.0.1:3000\u002Fapi\u002Fhealth\n",[254,523,524,526,529],{"class":256,"line":264},[254,525,463],{"class":267},[254,527,528],{"class":271}," status",[254,530,499],{"class":271},[232,532],{},[235,534,536],{"id":535},"uninstallation-options","Uninstallation Options",[228,538,539,540,543],{},"If you ever need to decommission the installation, GO includes a safe uninstaller script (",[251,541,542],{},"\u002Froot\u002FGo-shortner\u002Funinstall.sh","):",[305,545,547],{"id":546},"safe-uninstall-preserves-data","Safe Uninstall (Preserves Data)",[228,549,550,551,554,555,335,558,561],{},"Removes the ",[251,552,553],{},"systemd"," service and executable, keeping ",[251,556,557],{},".env",[251,559,560],{},"\u002Froot\u002FGo-shortner\u002Fdata\u002F"," for future reference:",[243,563,565],{"className":245,"code":564,"filename":247,"language":248,"meta":249,"style":249},"\u002Froot\u002FGo-shortner\u002Funinstall.sh\n",[251,566,567],{"__ignoreMap":249},[254,568,569],{"class":256,"line":257},[254,570,564],{"class":267},[305,572,574],{"id":573},"complete-purge-erases-everything","Complete Purge (Erases Everything)",[228,576,577],{},"Permanently deletes the service, configuration, and all stored links and database files:",[243,579,581],{"className":245,"code":580,"filename":247,"language":248,"meta":249,"style":249},"\u002Froot\u002FGo-shortner\u002Funinstall.sh --purge\n",[251,582,583],{"__ignoreMap":249},[254,584,585,587],{"class":256,"line":257},[254,586,542],{"class":267},[254,588,589],{"class":271}," --purge\n",[591,592,593],"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 .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);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":249,"searchDepth":264,"depth":264,"links":595},[596,597,604],{"id":237,"depth":264,"text":238},{"id":302,"depth":264,"text":303,"children":598},[599,600,601,602,603],{"id":307,"depth":437,"text":308},{"id":347,"depth":437,"text":348},{"id":357,"depth":437,"text":358},{"id":449,"depth":437,"text":450},{"id":502,"depth":437,"text":503},{"id":535,"depth":264,"text":536,"children":605},[606,607],{"id":546,"depth":437,"text":547},{"id":573,"depth":437,"text":574},"Production release upgrade procedures, database backup safeguards, and rollbacks.","md",null,{},{"icon":44},{"title":614,"description":615},"Production Upgrades & Backups - GO Shortener","Best practices for performing zero-compile upgrades and safely backing up the SQLite database on a production VPS.","bYDFVIrmRIhJBvb5ddrdEyAWLJs7exFv6vrTYjN-W5c",[618,620],{"title":161,"path":162,"stem":163,"description":619,"icon":164,"children":-1},"Manage the GO Shortener background service, auto-restarts, and logs using systemd.",{"title":174,"path":175,"stem":176,"description":621,"icon":177,"children":-1},"Internal engineering, directory organization, and high-performance design patterns.",1788462428338]