[{"data":1,"prerenderedAt":555},["ShallowReactive",2],{"navigation":3,"\u002Finstallation\u002Fadding-hosts":94,"\u002Finstallation\u002Fadding-hosts-surround":550},[4,16,38,56,70,80],{"title":5,"path":6,"stem":7,"children":8,"icon":15},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,11],{"title":10,"path":6,"stem":7},"What is fsbackup?",{"title":12,"path":13,"stem":14},"Requirements & hardware","\u002Fgetting-started\u002Frequirements","1.getting-started\u002F2.requirements","i-lucide-rocket",{"title":17,"icon":18,"path":19,"stem":20,"children":21,"page":37},"Installation","i-lucide-package","\u002Finstallation","2.installation",[22,26,30,33],{"title":23,"path":24,"stem":25},"Quick start","\u002Finstallation\u002Fquickstart","2.installation\u002F1.quickstart",{"title":27,"path":28,"stem":29},"ZFS pool setup","\u002Finstallation\u002Fzfs-pool","2.installation\u002F2.zfs-pool",{"title":17,"path":31,"stem":32},"\u002Finstallation\u002Fbare-metal","2.installation\u002F3.bare-metal",{"title":34,"path":35,"stem":36},"Adding remote hosts","\u002Finstallation\u002Fadding-hosts","2.installation\u002F4.adding-hosts",false,{"title":39,"icon":40,"path":41,"stem":42,"children":43,"page":37},"Configuration","i-lucide-sliders","\u002Fconfiguration","3.configuration",[44,48,52],{"title":45,"path":46,"stem":47},"fsbackup.conf","\u002Fconfiguration\u002Ffsbackup-conf","3.configuration\u002F1.fsbackup-conf",{"title":49,"path":50,"stem":51},"targets.yml","\u002Fconfiguration\u002Ftargets","3.configuration\u002F2.targets",{"title":53,"path":54,"stem":55},"Scheduling","\u002Fconfiguration\u002Fscheduling","3.configuration\u002F3.scheduling",{"title":57,"icon":58,"path":59,"stem":60,"children":61,"page":37},"Usage","i-lucide-play","\u002Fusage","4.usage",[62,66],{"title":63,"path":64,"stem":65},"Web UI","\u002Fusage\u002Fweb-ui","4.usage\u002F1.web-ui",{"title":67,"path":68,"stem":69},"Running jobs manually","\u002Fusage\u002Frunning-jobs","4.usage\u002F2.running-jobs",{"title":71,"icon":72,"path":73,"stem":74,"children":75,"page":37},"Restore","i-lucide-history","\u002Frestore","5.restore",[76],{"title":77,"path":78,"stem":79},"Restoring data","\u002Frestore\u002Frestore","5.restore\u002F1.restore",{"title":81,"icon":82,"path":83,"stem":84,"children":85,"page":37},"Reference","i-lucide-book-open","\u002Freference","6.reference",[86,90],{"title":87,"path":88,"stem":89},"Script reference","\u002Freference\u002Fscripts","6.reference\u002F1.scripts",{"title":91,"path":92,"stem":93},"Prometheus metrics","\u002Freference\u002Fmetrics","6.reference\u002F2.metrics",{"id":95,"title":34,"body":96,"description":543,"extension":544,"links":545,"meta":546,"navigation":547,"path":35,"seo":548,"stem":36,"__hash__":549},"docs\u002F2.installation\u002F4.adding-hosts.md",{"type":97,"value":98,"toc":535},"minimark",[99,108,113,120,205,208,237,241,244,267,271,283,294,355,359,365,377,380,384,408,419,444,448,455,504,507,519,531],[100,101,102,103,107],"p",{},"Each machine fsbackup backs up needs a ",[104,105,106],"code",{},"backup"," user with the fsbackup SSH public key and rsync installed.",[109,110,112],"h2",{"id":111},"initialize-the-remote-host","Initialize the remote host",[100,114,115,116,119],{},"Copy ",[104,117,118],{},"remote\u002Ffsbackup_remote_init.sh"," to the target machine and run it as root:",[121,122,127],"pre",{"className":123,"code":124,"language":125,"meta":126,"style":126},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","scp \u002Fopt\u002Ffsbackup\u002Fremote\u002Ffsbackup_remote_init.sh root@\u003Chostname>:\u002Ftmp\u002F\nssh root@\u003Chostname> bash \u002Ftmp\u002Ffsbackup_remote_init.sh \\\n  --pubkey \"$(cat \u002Fvar\u002Flib\u002Ffsbackup\u002F.ssh\u002Fid_ed25519_backup.pub)\"\n","bash","",[104,128,129,162,187],{"__ignoreMap":126},[130,131,134,138,142,145,149,152,156,159],"span",{"class":132,"line":133},"line",1,[130,135,137],{"class":136},"sBMFI","scp",[130,139,141],{"class":140},"sfazB"," \u002Fopt\u002Ffsbackup\u002Fremote\u002Ffsbackup_remote_init.sh",[130,143,144],{"class":140}," root@",[130,146,148],{"class":147},"sMK4o","\u003C",[130,150,151],{"class":140},"hostnam",[130,153,155],{"class":154},"sTEyZ","e",[130,157,158],{"class":147},">",[130,160,161],{"class":140},":\u002Ftmp\u002F\n",[130,163,165,168,170,172,174,176,178,181,184],{"class":132,"line":164},2,[130,166,167],{"class":136},"ssh",[130,169,144],{"class":140},[130,171,148],{"class":147},[130,173,151],{"class":140},[130,175,155],{"class":154},[130,177,158],{"class":147},[130,179,180],{"class":140}," bash",[130,182,183],{"class":140}," \u002Ftmp\u002Ffsbackup_remote_init.sh",[130,185,186],{"class":154}," \\\n",[130,188,190,193,196,199,202],{"class":132,"line":189},3,[130,191,192],{"class":140},"  --pubkey",[130,194,195],{"class":147}," \"$(",[130,197,198],{"class":136},"cat",[130,200,201],{"class":140}," \u002Fvar\u002Flib\u002Ffsbackup\u002F.ssh\u002Fid_ed25519_backup.pub",[130,203,204],{"class":147},")\"\n",[100,206,207],{},"This script:",[209,210,211,218,224,234],"ul",{},[212,213,214,215,217],"li",{},"Creates the ",[104,216,106],{}," user (system user, no login shell)",[212,219,220,221],{},"Installs the SSH public key in ",[104,222,223],{},"~backup\u002F.ssh\u002Fauthorized_keys",[212,225,226,227,230,231],{},"Restricts SSH to rsync-only via ",[104,228,229],{},"command="," in ",[104,232,233],{},"authorized_keys",[212,235,236],{},"Installs rsync if not present",[109,238,240],{"id":239},"trust-the-host-key","Trust the host key",[100,242,243],{},"Back on the backup server:",[121,245,247],{"className":123,"code":246,"language":125,"meta":126,"style":126},"sudo \u002Fopt\u002Ffsbackup\u002Futils\u002Ffs-trust-host.sh \u003Chostname>\n",[104,248,249],{"__ignoreMap":126},[130,250,251,254,257,260,262,264],{"class":132,"line":133},[130,252,253],{"class":136},"sudo",[130,255,256],{"class":140}," \u002Fopt\u002Ffsbackup\u002Futils\u002Ffs-trust-host.sh",[130,258,259],{"class":147}," \u003C",[130,261,151],{"class":140},[130,263,155],{"class":154},[130,265,266],{"class":147},">\n",[109,268,270],{"id":269},"add-targets-to-targetsyml","Add targets to targets.yml",[100,272,273,274,277,278,282],{},"Edit ",[104,275,276],{},"\u002Fetc\u002Ffsbackup\u002Ftargets.yml"," to add targets for the new host. See ",[279,280,281],"a",{"href":50},"Targets configuration"," for the full format.",[100,284,285,286,289,290,293],{},"Example — backing up ",[104,287,288],{},"\u002Fetc\u002Fnginx"," from a host called ",[104,291,292],{},"rp",":",[121,295,299],{"className":296,"code":297,"language":298,"meta":126,"style":126},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","class2:\n  - id: rp.nginx.config\n    host: rp\n    source: \u002Fetc\u002Fnginx\n    type: dir\n","yaml",[104,300,301,310,323,333,344],{"__ignoreMap":126},[130,302,303,307],{"class":132,"line":133},[130,304,306],{"class":305},"swJcz","class2",[130,308,309],{"class":147},":\n",[130,311,312,315,318,320],{"class":132,"line":164},[130,313,314],{"class":147},"  -",[130,316,317],{"class":305}," id",[130,319,293],{"class":147},[130,321,322],{"class":140}," rp.nginx.config\n",[130,324,325,328,330],{"class":132,"line":189},[130,326,327],{"class":305},"    host",[130,329,293],{"class":147},[130,331,332],{"class":140}," rp\n",[130,334,336,339,341],{"class":132,"line":335},4,[130,337,338],{"class":305},"    source",[130,340,293],{"class":147},[130,342,343],{"class":140}," \u002Fetc\u002Fnginx\n",[130,345,347,350,352],{"class":132,"line":346},5,[130,348,349],{"class":305},"    type",[130,351,293],{"class":147},[130,353,354],{"class":140}," dir\n",[109,356,358],{"id":357},"create-zfs-datasets-for-new-targets","Create ZFS datasets for new targets",[100,360,361,362,364],{},"After editing ",[104,363,49],{},", provision ZFS datasets for any new targets:",[121,366,368],{"className":123,"code":367,"language":125,"meta":126,"style":126},"sudo \u002Fopt\u002Ffsbackup\u002Fbin\u002Ffs-provision.sh\n",[104,369,370],{"__ignoreMap":126},[130,371,372,374],{"class":132,"line":133},[130,373,253],{"class":136},[130,375,376],{"class":140}," \u002Fopt\u002Ffsbackup\u002Fbin\u002Ffs-provision.sh\n",[100,378,379],{},"This is idempotent — it skips targets that already have datasets.",[109,381,383],{"id":382},"verify","Verify",[121,385,387],{"className":123,"code":386,"language":125,"meta":126,"style":126},"sudo -u fsbackup \u002Fopt\u002Ffsbackup\u002Fbin\u002Ffs-doctor.sh --class class2\n",[104,388,389],{"__ignoreMap":126},[130,390,391,393,396,399,402,405],{"class":132,"line":133},[130,392,253],{"class":136},[130,394,395],{"class":140}," -u",[130,397,398],{"class":140}," fsbackup",[130,400,401],{"class":140}," \u002Fopt\u002Ffsbackup\u002Fbin\u002Ffs-doctor.sh",[130,403,404],{"class":140}," --class",[130,406,407],{"class":140}," class2\n",[100,409,410,411,414,415,418],{},"The new target should show ",[104,412,413],{},"OK",". If it shows ",[104,416,417],{},"FAIL",", check SSH connectivity:",[121,420,422],{"className":123,"code":421,"language":125,"meta":126,"style":126},"sudo -u fsbackup ssh backup@rp echo ok\n",[104,423,424],{"__ignoreMap":126},[130,425,426,428,430,432,435,438,441],{"class":132,"line":133},[130,427,253],{"class":136},[130,429,395],{"class":140},[130,431,398],{"class":140},[130,433,434],{"class":140}," ssh",[130,436,437],{"class":140}," backup@rp",[130,439,440],{"class":140}," echo",[130,442,443],{"class":140}," ok\n",[109,445,447],{"id":446},"local-paths-same-machine","Local paths (same machine)",[100,449,450,451,454],{},"For paths on the backup server itself, use ",[104,452,453],{},"host: localhost"," in the target definition:",[121,456,458],{"className":296,"code":457,"language":298,"meta":126,"style":126},"class1:\n  - id: myapp.data\n    host: localhost\n    source: \u002Fdocker\u002Fvolumes\u002Fmyapp_data\n    type: dir\n",[104,459,460,467,478,487,496],{"__ignoreMap":126},[130,461,462,465],{"class":132,"line":133},[130,463,464],{"class":305},"class1",[130,466,309],{"class":147},[130,468,469,471,473,475],{"class":132,"line":164},[130,470,314],{"class":147},[130,472,317],{"class":305},[130,474,293],{"class":147},[130,476,477],{"class":140}," myapp.data\n",[130,479,480,482,484],{"class":132,"line":189},[130,481,327],{"class":305},[130,483,293],{"class":147},[130,485,486],{"class":140}," localhost\n",[130,488,489,491,493],{"class":132,"line":335},[130,490,338],{"class":305},[130,492,293],{"class":147},[130,494,495],{"class":140}," \u002Fdocker\u002Fvolumes\u002Fmyapp_data\n",[130,497,498,500,502],{"class":132,"line":346},[130,499,349],{"class":305},[130,501,293],{"class":147},[130,503,354],{"class":140},[100,505,506],{},"Then grant the fsbackup user read access:",[121,508,510],{"className":123,"code":509,"language":125,"meta":126,"style":126},"sudo \u002Fopt\u002Ffsbackup\u002Fbin\u002Ffs-fix-permissions.sh\n",[104,511,512],{"__ignoreMap":126},[130,513,514,516],{"class":132,"line":133},[130,515,253],{"class":136},[130,517,518],{"class":140}," \u002Fopt\u002Ffsbackup\u002Fbin\u002Ffs-fix-permissions.sh\n",[520,521,524],"u-callout",{"color":522,"icon":523},"orange","i-lucide-alert-triangle",[100,525,526,527,530],{},"Running ",[104,528,529],{},"fs-fix-permissions.sh"," on Docker volume paths grants the fsbackup user read access to all files in those directories, including application secrets. Review each path carefully before applying.",[532,533,534],"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 pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":126,"searchDepth":133,"depth":164,"links":536},[537,538,539,540,541,542],{"id":111,"depth":164,"text":112},{"id":239,"depth":164,"text":240},{"id":269,"depth":164,"text":270},{"id":357,"depth":164,"text":358},{"id":382,"depth":164,"text":383},{"id":446,"depth":164,"text":447},"How to initialize a new remote host for fsbackup and add it to targets.yml.","md",null,{},true,{"title":34,"description":543},"a15j69pByTwWIuUDr-o9q_i-DrJYIIkVXfo5ffoSDTY",[551,553],{"title":17,"path":31,"stem":32,"description":552,"children":-1},"Full bare-metal installation of fsbackup using fs-install.sh — user, ZFS permissions, systemd units, and web UI.",{"title":45,"path":46,"stem":47,"description":554,"children":-1},"Configuration reference for \u002Fetc\u002Ffsbackup\u002Ffsbackup.conf — ZFS snapshot root, schedules, retention, and S3 export.",1775923865773]