[{"data":1,"prerenderedAt":657},["ShallowReactive",2],{"navigation":3,"\u002Fconfiguration\u002Ftargets":94,"\u002Fconfiguration\u002Ftargets-surround":652},[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":49,"body":96,"description":646,"extension":647,"links":648,"meta":649,"navigation":202,"path":50,"seo":650,"stem":51,"__hash__":651},"docs\u002F3.configuration\u002F2.targets.md",{"type":97,"value":98,"toc":632},"minimark",[99,108,121,126,321,325,331,334,349,354,357,370,375,378,383,390,397,400,444,467,470,475,521,524,540,547,551,558,586,589,593,617,628],[100,101,102,103,107],"p",{},"Backup targets are defined in ",[104,105,106],"code",{},"\u002Fetc\u002Ffsbackup\u002Ftargets.yml",". Targets are grouped by class.",[109,110,112],"u-callout",{"icon":111},"i-lucide-info",[100,113,114,116,117,120],{},[104,115,49],{}," is gitignored in the fsbackup repo. Never commit it — it contains host names and paths specific to your environment. Use ",[104,118,119],{},"conf\u002Ftargets.yml.example"," as a reference.",[122,123,125],"h2",{"id":124},"structure","Structure",[127,128,133],"pre",{"className":129,"code":130,"language":131,"meta":132,"style":132},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","class1:\n  - id: myapp.data\n    host: myhost\n    source: \u002Fdocker\u002Fvolumes\u002Fmyapp_data\n    type: dir\n\n  - id: myapp.db\n    host: myhost\n    source: \u002Fvar\u002Flib\u002Fmyapp\u002Fdb\n    type: dir\n    rsync_opts:\n      - \"--exclude=*.tmp\"\n\nclass2:\n  - id: rp.nginx.config\n    host: rp\n    source: \u002Fetc\u002Fnginx\n    type: dir\n","yaml","",[104,134,135,148,164,175,186,197,204,216,225,235,244,252,267,272,280,292,302,312],{"__ignoreMap":132},[136,137,140,144],"span",{"class":138,"line":139},"line",1,[136,141,143],{"class":142},"swJcz","class1",[136,145,147],{"class":146},"sMK4o",":\n",[136,149,151,154,157,160],{"class":138,"line":150},2,[136,152,153],{"class":146},"  -",[136,155,156],{"class":142}," id",[136,158,159],{"class":146},":",[136,161,163],{"class":162},"sfazB"," myapp.data\n",[136,165,167,170,172],{"class":138,"line":166},3,[136,168,169],{"class":142},"    host",[136,171,159],{"class":146},[136,173,174],{"class":162}," myhost\n",[136,176,178,181,183],{"class":138,"line":177},4,[136,179,180],{"class":142},"    source",[136,182,159],{"class":146},[136,184,185],{"class":162}," \u002Fdocker\u002Fvolumes\u002Fmyapp_data\n",[136,187,189,192,194],{"class":138,"line":188},5,[136,190,191],{"class":142},"    type",[136,193,159],{"class":146},[136,195,196],{"class":162}," dir\n",[136,198,200],{"class":138,"line":199},6,[136,201,203],{"emptyLinePlaceholder":202},true,"\n",[136,205,207,209,211,213],{"class":138,"line":206},7,[136,208,153],{"class":146},[136,210,156],{"class":142},[136,212,159],{"class":146},[136,214,215],{"class":162}," myapp.db\n",[136,217,219,221,223],{"class":138,"line":218},8,[136,220,169],{"class":142},[136,222,159],{"class":146},[136,224,174],{"class":162},[136,226,228,230,232],{"class":138,"line":227},9,[136,229,180],{"class":142},[136,231,159],{"class":146},[136,233,234],{"class":162}," \u002Fvar\u002Flib\u002Fmyapp\u002Fdb\n",[136,236,238,240,242],{"class":138,"line":237},10,[136,239,191],{"class":142},[136,241,159],{"class":146},[136,243,196],{"class":162},[136,245,247,250],{"class":138,"line":246},11,[136,248,249],{"class":142},"    rsync_opts",[136,251,147],{"class":146},[136,253,255,258,261,264],{"class":138,"line":254},12,[136,256,257],{"class":146},"      -",[136,259,260],{"class":146}," \"",[136,262,263],{"class":162},"--exclude=*.tmp",[136,265,266],{"class":146},"\"\n",[136,268,270],{"class":138,"line":269},13,[136,271,203],{"emptyLinePlaceholder":202},[136,273,275,278],{"class":138,"line":274},14,[136,276,277],{"class":142},"class2",[136,279,147],{"class":146},[136,281,283,285,287,289],{"class":138,"line":282},15,[136,284,153],{"class":146},[136,286,156],{"class":142},[136,288,159],{"class":146},[136,290,291],{"class":162}," rp.nginx.config\n",[136,293,295,297,299],{"class":138,"line":294},16,[136,296,169],{"class":142},[136,298,159],{"class":146},[136,300,301],{"class":162}," rp\n",[136,303,305,307,309],{"class":138,"line":304},17,[136,306,180],{"class":142},[136,308,159],{"class":146},[136,310,311],{"class":162}," \u002Fetc\u002Fnginx\n",[136,313,315,317,319],{"class":138,"line":314},18,[136,316,191],{"class":142},[136,318,159],{"class":146},[136,320,196],{"class":162},[122,322,324],{"id":323},"fields","Fields",[326,327,329],"h3",{"id":328},"id",[104,330,328],{},[100,332,333],{},"Unique identifier for the target. Used as the ZFS dataset name and snapshot directory. Must be unique across all classes.",[100,335,336,337,340,341,344,345,348],{},"Use a descriptive naming convention like ",[104,338,339],{},"\u003Chost>.\u003Cservice>.\u003Ctype>"," — e.g. ",[104,342,343],{},"rp.nginx.config",", ",[104,346,347],{},"db1.postgres.data",".",[326,350,352],{"id":351},"host",[104,353,351],{},[100,355,356],{},"The hostname to connect to via SSH. Must match a known_hosts entry on the backup server.",[100,358,359,360,363,364,369],{},"For local paths on the backup server itself, use ",[104,361,362],{},"host: localhost"," — see ",[365,366,368],"a",{"href":367},"#local-targets","Local targets"," below.",[326,371,373],{"id":372},"source",[104,374,372],{},[100,376,377],{},"The absolute path on the remote host to back up.",[326,379,381],{"id":380},"type",[104,382,380],{},[100,384,385,386,389],{},"Currently only ",[104,387,388],{},"dir"," is supported (directory backup via rsync).",[326,391,393,396],{"id":392},"rsync_opts-optional",[104,394,395],{},"rsync_opts"," (optional)",[100,398,399],{},"List of additional rsync options to pass for this target. Common uses:",[127,401,403],{"className":129,"code":402,"language":131,"meta":132,"style":132},"rsync_opts:\n  - \"--exclude=*.log\"\n  - \"--exclude=cache\u002F\"\n  - \"--exclude=tmp\u002F\"\n",[104,404,405,411,422,433],{"__ignoreMap":132},[136,406,407,409],{"class":138,"line":139},[136,408,395],{"class":142},[136,410,147],{"class":146},[136,412,413,415,417,420],{"class":138,"line":150},[136,414,153],{"class":146},[136,416,260],{"class":146},[136,418,419],{"class":162},"--exclude=*.log",[136,421,266],{"class":146},[136,423,424,426,428,431],{"class":138,"line":166},[136,425,153],{"class":146},[136,427,260],{"class":146},[136,429,430],{"class":162},"--exclude=cache\u002F",[136,432,266],{"class":146},[136,434,435,437,439,442],{"class":138,"line":177},[136,436,153],{"class":146},[136,438,260],{"class":146},[136,440,441],{"class":162},"--exclude=tmp\u002F",[136,443,266],{"class":146},[109,445,448],{"icon":446,"color":447},"i-lucide-alert-triangle","orange",[100,449,450,451,455,456,459,460,463,464,348],{},"Exclude paths are ",[452,453,454],"strong",{},"relative to the source path",", not the remote filesystem root. If ",[104,457,458],{},"source: \u002Fdocker\u002Fvolumes\u002Fmyapp"," and you want to exclude ",[104,461,462],{},"_data\u002Fcache",", use ",[104,465,466],{},"--exclude=_data\u002Fcache",[122,468,368],{"id":469},"local-targets",[100,471,472,473,159],{},"For paths on the backup server itself (e.g. Docker volumes), use ",[104,474,362],{},[127,476,478],{"className":129,"code":477,"language":131,"meta":132,"style":132},"class1:\n  - id: myapp.data\n    host: localhost\n    source: \u002Fdocker\u002Fvolumes\u002Fmyapp_data\n    type: dir\n",[104,479,480,486,496,505,513],{"__ignoreMap":132},[136,481,482,484],{"class":138,"line":139},[136,483,143],{"class":142},[136,485,147],{"class":146},[136,487,488,490,492,494],{"class":138,"line":150},[136,489,153],{"class":146},[136,491,156],{"class":142},[136,493,159],{"class":146},[136,495,163],{"class":162},[136,497,498,500,502],{"class":138,"line":166},[136,499,169],{"class":142},[136,501,159],{"class":146},[136,503,504],{"class":162}," localhost\n",[136,506,507,509,511],{"class":138,"line":177},[136,508,180],{"class":142},[136,510,159],{"class":146},[136,512,185],{"class":162},[136,514,515,517,519],{"class":138,"line":188},[136,516,191],{"class":142},[136,518,159],{"class":146},[136,520,196],{"class":162},[100,522,523],{},"Then grant the fsbackup user read access to the path:",[127,525,529],{"className":526,"code":527,"language":528,"meta":132,"style":132},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo \u002Fopt\u002Ffsbackup\u002Fbin\u002Ffs-fix-permissions.sh\n","bash",[104,530,531],{"__ignoreMap":132},[136,532,533,537],{"class":138,"line":139},[136,534,536],{"class":535},"sBMFI","sudo",[136,538,539],{"class":162}," \u002Fopt\u002Ffsbackup\u002Fbin\u002Ffs-fix-permissions.sh\n",[100,541,542,543,546],{},"This runs ",[104,544,545],{},"setfacl -R -m u:fsbackup:rX"," on each local source path. Review each path before applying — it grants read access to all files in that directory tree, including any secrets your containers store there.",[122,548,550],{"id":549},"after-editing-targetsyml","After editing targets.yml",[100,552,553,554,557],{},"Run ",[104,555,556],{},"fs-provision.sh"," to create ZFS datasets for any new targets:",[127,559,561],{"className":526,"code":560,"language":528,"meta":132,"style":132},"sudo \u002Fopt\u002Ffsbackup\u002Fbin\u002Ffs-provision.sh --dry-run   # preview\nsudo \u002Fopt\u002Ffsbackup\u002Fbin\u002Ffs-provision.sh              # create\n",[104,562,563,577],{"__ignoreMap":132},[136,564,565,567,570,573],{"class":138,"line":139},[136,566,536],{"class":535},[136,568,569],{"class":162}," \u002Fopt\u002Ffsbackup\u002Fbin\u002Ffs-provision.sh",[136,571,572],{"class":162}," --dry-run",[136,574,576],{"class":575},"sHwdD","   # preview\n",[136,578,579,581,583],{"class":138,"line":150},[136,580,536],{"class":535},[136,582,569],{"class":162},[136,584,585],{"class":575},"              # create\n",[100,587,588],{},"This is idempotent — it skips targets that already have datasets.",[122,590,592],{"id":591},"verifying-targets","Verifying targets",[127,594,596],{"className":526,"code":595,"language":528,"meta":132,"style":132},"sudo -u fsbackup \u002Fopt\u002Ffsbackup\u002Fbin\u002Ffs-doctor.sh --class class1\n",[104,597,598],{"__ignoreMap":132},[136,599,600,602,605,608,611,614],{"class":138,"line":139},[136,601,536],{"class":535},[136,603,604],{"class":162}," -u",[136,606,607],{"class":162}," fsbackup",[136,609,610],{"class":162}," \u002Fopt\u002Ffsbackup\u002Fbin\u002Ffs-doctor.sh",[136,612,613],{"class":162}," --class",[136,615,616],{"class":162}," class1\n",[100,618,619,620,623,624,627],{},"Targets should show ",[104,621,622],{},"OK",". A ",[104,625,626],{},"FAIL"," means SSH is not reachable or the source path doesn't exist.",[629,630,631],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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}",{"title":132,"searchDepth":139,"depth":150,"links":633},[634,635,643,644,645],{"id":124,"depth":150,"text":125},{"id":323,"depth":150,"text":324,"children":636},[637,638,639,640,641],{"id":328,"depth":166,"text":328},{"id":351,"depth":166,"text":351},{"id":372,"depth":166,"text":372},{"id":380,"depth":166,"text":380},{"id":392,"depth":166,"text":642},"rsync_opts (optional)",{"id":469,"depth":150,"text":368},{"id":549,"depth":150,"text":550},{"id":591,"depth":150,"text":592},"How to define backup targets in targets.yml — hosts, sources, classes, and rsync options.","md",null,{},{"title":49,"description":646},"fIw1f9jcDOilCG33gPxEGtXKmoJGF-VGm4cTCblpTzo",[653,655],{"title":45,"path":46,"stem":47,"description":654,"children":-1},"Configuration reference for \u002Fetc\u002Ffsbackup\u002Ffsbackup.conf — ZFS snapshot root, schedules, retention, and S3 export.",{"title":53,"path":54,"stem":55,"description":656,"children":-1},"How to configure the backup schedule using systemd timers and OnCalendar= values in fsbackup.conf.",1775923865773]