[{"data":1,"prerenderedAt":507},["ShallowReactive",2],{"navigation_docs":3,"-docs-backups-harblet-backups":130,"-docs-backups-harblet-backups-surround":502},[4,25,70,90,115],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting started",false,"\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation","i-lucide-terminal",{"title":21,"path":22,"stem":23,"icon":24},"Quickstart","\u002Fdocs\u002Fgetting-started\u002Fquickstart","docs\u002F1.getting-started\u002F3.quickstart","i-lucide-rocket",{"title":26,"icon":6,"path":27,"stem":28,"children":29,"page":6},"Deploy","\u002Fdocs\u002Fdeploy","docs\u002F2.deploy",[30,35,40,45,50,55,60,65],{"title":31,"path":32,"stem":33,"icon":34},"Projects and services","\u002Fdocs\u002Fdeploy\u002Fprojects-and-services","docs\u002F2.deploy\u002F1.projects-and-services","i-lucide-folder-kanban",{"title":36,"path":37,"stem":38,"icon":39},"Docker images","\u002Fdocs\u002Fdeploy\u002Fdocker-images","docs\u002F2.deploy\u002F2.docker-images","i-lucide-container",{"title":41,"path":42,"stem":43,"icon":44},"Git repositories","\u002Fdocs\u002Fdeploy\u002Fgit-repositories","docs\u002F2.deploy\u002F3.git-repositories","i-lucide-git-branch",{"title":46,"path":47,"stem":48,"icon":49},"Databases","\u002Fdocs\u002Fdeploy\u002Fdatabases","docs\u002F2.deploy\u002F4.databases","i-lucide-database",{"title":51,"path":52,"stem":53,"icon":54},"Environment variables","\u002Fdocs\u002Fdeploy\u002Fenvironment-variables","docs\u002F2.deploy\u002F5.environment-variables","i-lucide-key-round",{"title":56,"path":57,"stem":58,"icon":59},"Deployments and logs","\u002Fdocs\u002Fdeploy\u002Fdeployments","docs\u002F2.deploy\u002F6.deployments","i-lucide-scroll-text",{"title":61,"path":62,"stem":63,"icon":64},"Deploy hooks","\u002Fdocs\u002Fdeploy\u002Fdeploy-hooks","docs\u002F2.deploy\u002F7.deploy-hooks","i-lucide-webhook",{"title":66,"path":67,"stem":68,"icon":69},"Domains and HTTPS","\u002Fdocs\u002Fdeploy\u002Fdomains","docs\u002F2.deploy\u002F8.domains","i-lucide-lock",{"title":71,"icon":6,"path":72,"stem":73,"children":74,"page":6},"Backups","\u002Fdocs\u002Fbackups","docs\u002F3.backups",[75,80,85],{"title":76,"path":77,"stem":78,"icon":79},"Backup destinations","\u002Fdocs\u002Fbackups\u002Fbackup-destinations","docs\u002F3.backups\u002F1.backup-destinations","i-lucide-hard-drive-upload",{"title":81,"path":82,"stem":83,"icon":84},"Database backups","\u002Fdocs\u002Fbackups\u002Fdatabase-backups","docs\u002F3.backups\u002F2.database-backups","i-lucide-archive-restore",{"title":86,"path":87,"stem":88,"icon":89},"Backing up Harblet","\u002Fdocs\u002Fbackups\u002Fharblet-backups","docs\u002F3.backups\u002F3.harblet-backups","i-lucide-shield-check",{"title":91,"icon":6,"path":92,"stem":93,"children":94,"page":6},"Administration","\u002Fdocs\u002Fadministration","docs\u002F4.administration",[95,100,105,110],{"title":96,"path":97,"stem":98,"icon":99},"Harblet's domain","\u002Fdocs\u002Fadministration\u002Fharblet-domain","docs\u002F4.administration\u002F1.harblet-domain","i-lucide-globe",{"title":101,"path":102,"stem":103,"icon":104},"Servers","\u002Fdocs\u002Fadministration\u002Fservers","docs\u002F4.administration\u002F2.servers","i-lucide-server",{"title":106,"path":107,"stem":108,"icon":109},"Team and account","\u002Fdocs\u002Fadministration\u002Fteam","docs\u002F4.administration\u002F3.team","i-lucide-users",{"title":111,"path":112,"stem":113,"icon":114},"Updates","\u002Fdocs\u002Fadministration\u002Fupdates","docs\u002F4.administration\u002F4.updates","i-lucide-refresh-cw",{"title":116,"icon":6,"path":117,"stem":118,"children":119,"page":6},"Reference","\u002Fdocs\u002Freference","docs\u002F5.reference",[120,125],{"title":121,"path":122,"stem":123,"icon":124},"Troubleshooting","\u002Fdocs\u002Freference\u002Ftroubleshooting","docs\u002F5.reference\u002F1.troubleshooting","i-lucide-life-buoy",{"title":126,"path":127,"stem":128,"icon":129},"License","\u002Fdocs\u002Freference\u002Flicense","docs\u002F5.reference\u002F2.license","i-lucide-scale",{"id":131,"title":86,"body":132,"description":495,"extension":496,"links":497,"meta":498,"navigation":499,"path":87,"seo":500,"stem":88,"__hash__":501},"docs\u002Fdocs\u002F3.backups\u002F3.harblet-backups.md",{"type":133,"value":134,"toc":480},"minimark",[135,139,143,148,192,199,212,216,219,352,356,359,414,418,422,476],[136,137,138],"p",{},"Harblet's own database holds your accounts, projects, services and their settings, environment variables, domains, certificates and the list of backups. Harblet backs it up like any other database, and you can restore it onto a fresh server.",[140,141,142],"note",{},"Settings → Backups is for admins.",[144,145,147],"h2",{"id":146},"set-up-the-backup","Set up the backup",[149,150,152,157,181,185],"steps",{"level":151},"3",[153,154,156],"h3",{"id":155},"choose-a-destination","Choose a destination",[136,158,159,160,164,165,167,168,172,173,176,177,180],{},"Go to ",[161,162,163],"strong",{},"Settings"," → ",[161,166,71],{},". Choose a ",[169,170,171],"a",{"href":77},"backup destination",", a schedule and how many scheduled backups to keep, then click ",[161,174,175],{},"Save",". Click ",[161,178,179],{},"Back up now"," to take the first backup right away.",[153,182,184],{"id":183},"keep-the-app-secret","Keep the app secret",[136,186,187,188,191],{},"On the same page, the ",[161,189,190],{},"App secret"," card shows the secret of this install, hidden. Click the eye button to show it, or the copy button to copy it, and keep it somewhere safe, for example in your password manager.",[193,194,195,198],"caution",{},[161,196,197],{},"Without the app secret, a backup can't be fully restored."," Harblet encrypts environment variables, database passwords, the private keys of certificates and GitHub Apps, GitLab access tokens, and the access keys of destinations with it. The secret isn't in the backup. A backup restored without it can't read these values.",[136,200,201,202,206,207,164,209,211],{},"Harblet's backups are stored at ",[203,204,205],"code",{},"\u003Cfolder>\u002Fharblet-system\u002Fpostgres\u002F\u003Ctime>.dump"," in the bucket. You can download and delete them under ",[161,208,163],{},[161,210,71],{},". They can't be restored from there, because Harblet restores itself while it's installed on a new server.",[144,213,215],{"id":214},"restore-harblet-onto-a-new-server","Restore Harblet onto a new server",[136,217,218],{},"Restore Harblet when its first server is lost, or to move it to another server.",[149,220,221,225,233,237,252,256,262,311,323,334,337,345,349],{"level":151},[153,222,224],{"id":223},"prepare-a-fresh-server","Prepare a fresh server",[136,226,227,228,232],{},"Set up a server that meets the ",[169,229,231],{"href":230},"\u002Fdocs\u002Fgetting-started\u002Finstallation#requirements","requirements",".",[153,234,236],{"id":235},"copy-the-backup-to-the-server","Copy the backup to the server",[136,238,239,240,243,244,164,246,248,249,232],{},"Take the newest file from the folder ",[203,241,242],{},"harblet-system\u002Fpostgres"," at your destination, or download it under ",[161,245,163],{},[161,247,71],{}," while the old install still runs. Copy it to the new server as ",[203,250,251],{},"backup.dump",[153,253,255],{"id":254},"run-the-install-script-with-the-backup","Run the install script with the backup",[136,257,258,259,261],{},"On the new server, in the folder that holds ",[203,260,251],{},", download the install script and run it with your app secret:",[263,264,270],"pre",{"className":265,"code":266,"filename":267,"language":268,"meta":269,"style":269},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fharblet\u002Fharblet\u002Fmain\u002Finstall.sh -o install.sh\nsudo HARBLET_APP_SECRET=your-app-secret HARBLET_BACKUP=backup.dump sh install.sh\n","New server","bash","",[203,271,272,294],{"__ignoreMap":269},[273,274,277,281,285,288,291],"span",{"class":275,"line":276},"line",1,[273,278,280],{"class":279},"sBMFI","curl",[273,282,284],{"class":283},"sfazB"," -fsSL",[273,286,287],{"class":283}," https:\u002F\u002Fraw.githubusercontent.com\u002Fharblet\u002Fharblet\u002Fmain\u002Finstall.sh",[273,289,290],{"class":283}," -o",[273,292,293],{"class":283}," install.sh\n",[273,295,297,300,303,306,309],{"class":275,"line":296},2,[273,298,299],{"class":279},"sudo",[273,301,302],{"class":283}," HARBLET_APP_SECRET=your-app-secret",[273,304,305],{"class":283}," HARBLET_BACKUP=backup.dump",[273,307,308],{"class":283}," sh",[273,310,293],{"class":283},[136,312,313,314,317,318,164,320,322],{},"The ",[161,315,316],{},"Restore"," card under ",[161,319,163],{},[161,321,71],{}," has the second command ready to copy.",[136,324,325,326,329,330,232],{},"If the server is behind NAT, add ",[203,327,328],{},"HARBLET_URL"," as for a ",[169,331,333],{"href":332},"\u002Fdocs\u002Fgetting-started\u002Finstallation#servers-behind-nat","normal install",[136,335,336],{},"When it's done, the script prints:",[263,338,343],{"className":339,"code":341,"language":342,"meta":269},[340],"language-text","Harblet is ready with the restored backup. Open http:\u002F\u002F203.0.113.20:3000 and log in.\n","text",[203,344,341],{"__ignoreMap":269},[153,346,348],{"id":347},"log-in","Log in",[136,350,351],{},"Open the address and log in with your existing account.",[144,353,355],{"id":354},"after-the-restore","After the restore",[136,357,358],{},"The restore brings back Harblet's data, but nothing runs yet. Bring your services back in this order:",[360,361,362,369,387,396,402],"ol",{},[363,364,365,368],"li",{},[161,366,367],{},"Point your domains at the new server."," Change the DNS A records of Harblet's domain and of your services' domains to the new server's IP address.",[363,370,371,374,375,164,377,380,381,384,385,232],{},[161,372,373],{},"Give Harblet its domain again"," under ",[161,376,163],{},[161,378,379],{},"General",". Harblet starts at ",[203,382,383],{},"http:\u002F\u002F\u003Cip>:3000"," after a restore. See ",[169,386,96],{"href":97},[363,388,389,392,393,395],{},[161,390,391],{},"Deploy each database,"," then restore its newest backup from its ",[161,394,71],{}," tab. Databases start empty on the new server.",[363,397,398,401],{},[161,399,400],{},"Deploy your other services."," Git services build again.",[363,403,404,407,408,410,411,232],{},[161,405,406],{},"Add your other servers again,"," if you had any. See ",[169,409,101],{"href":102},". Uninstall k3s on them first with ",[203,412,413],{},"sudo \u002Fusr\u002Flocal\u002Fbin\u002Fk3s-agent-uninstall.sh",[415,416,417],"tip",{},"Practice a restore on a spare server once, so you know it works before you need it.",[144,419,421],{"id":420},"errors","Errors",[423,424,425,438],"table",{},[426,427,428],"thead",{},[429,430,431,435],"tr",{},[432,433,434],"th",{},"Message",[432,436,437],{},"What to do",[439,440,441,456,468],"tbody",{},[429,442,443,447],{},[444,445,446],"td",{},"backup.dump isn't a backup of Harblet's database. Set HARBLET_BACKUP to the .dump file from the backup destination.",[444,448,449,450,452,453,455],{},"Check that ",[203,451,251],{}," is in the current folder and was copied completely, and that it comes from the ",[203,454,242],{}," folder.",[429,457,458,461],{},[444,459,460],{},"Restoring a backup needs the app secret of the install it comes from. Set HARBLET_APP_SECRET to it.",[444,462,463,464,467],{},"Add ",[203,465,466],{},"HARBLET_APP_SECRET"," to the command.",[429,469,470,473],{},[444,471,472],{},"HARBLET_APP_SECRET isn't an app secret. An app secret has 64 characters, the digits 0 to 9 and the letters a to f.",[444,474,475],{},"Copy the app secret again, without spaces or line breaks.",[477,478,479],"style",{},"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 .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":269,"searchDepth":296,"depth":296,"links":481},[482,487,493,494],{"id":146,"depth":296,"text":147,"children":483},[484,486],{"id":155,"depth":485,"text":156},3,{"id":183,"depth":485,"text":184},{"id":214,"depth":296,"text":215,"children":488},[489,490,491,492],{"id":223,"depth":485,"text":224},{"id":235,"depth":485,"text":236},{"id":254,"depth":485,"text":255},{"id":347,"depth":485,"text":348},{"id":354,"depth":296,"text":355},{"id":420,"depth":296,"text":421},"Back up Harblet's own database and restore it onto a fresh server.","md",null,{},{"icon":89},{"title":86,"description":495},"95uPrS6nml-AC6VlS2TUix-Tk4I6wQME-iD7frCYslE",[503,505],{"title":81,"path":82,"stem":83,"description":504,"icon":84,"children":-1},"Back up databases to S3 on a schedule, and download or restore any backup.",{"title":96,"path":97,"stem":98,"description":506,"icon":99,"children":-1},"Reach Harblet at your own domain over HTTPS instead of the server's IP address.",1794744116397]