[{"data":1,"prerenderedAt":752},["ShallowReactive",2],{"navigation_docs_en":3,"-en-self-hosting-backups":123,"-en-self-hosting-backups-surround":747},[4,36,107],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":35},"Getting started","i-lucide-rocket","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"What is Chronicler","\u002Fen\u002Fgetting-started\u002Fwhat-is-chronicler","en\u002F1.getting-started\u002F1.what-is-chronicler","i-lucide-help-circle",{"title":16,"path":17,"stem":18,"icon":19},"Install the app","\u002Fen\u002Fgetting-started\u002Finstall-the-app","en\u002F1.getting-started\u002F2.install-the-app","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Cloud quick start","\u002Fen\u002Fgetting-started\u002Fcloud-quickstart","en\u002F1.getting-started\u002F3.cloud-quickstart","i-lucide-cloud",{"title":26,"path":27,"stem":28,"icon":29},"Your first chat","\u002Fen\u002Fgetting-started\u002Fyour-first-chat","en\u002F1.getting-started\u002F4.your-first-chat","i-lucide-messages-square",{"title":31,"path":32,"stem":33,"icon":34},"Managing users","\u002Fen\u002Fgetting-started\u002Fmanaging-users","en\u002F1.getting-started\u002F5.managing-users","i-lucide-users",false,{"title":37,"icon":38,"path":39,"stem":40,"children":41,"page":35},"Self-hosting","i-lucide-server","\u002Fen\u002Fself-hosting","en\u002F2.self-hosting",[42,47,52,57,62,67,72,77,82,87,92,97,102],{"title":43,"path":44,"stem":45,"icon":46},"Overview","\u002Fen\u002Fself-hosting\u002Foverview","en\u002F2.self-hosting\u002F1.overview","i-lucide-layout-dashboard",{"title":48,"path":49,"stem":50,"icon":51},"Backups and restore","\u002Fen\u002Fself-hosting\u002Fbackups","en\u002F2.self-hosting\u002F10.backups","i-lucide-database-backup",{"title":53,"path":54,"stem":55,"icon":56},"Updating","\u002Fen\u002Fself-hosting\u002Fupdating","en\u002F2.self-hosting\u002F11.updating","i-lucide-refresh-cw",{"title":58,"path":59,"stem":60,"icon":61},"Security and networking","\u002Fen\u002Fself-hosting\u002Fsecurity-and-networking","en\u002F2.self-hosting\u002F12.security-and-networking","i-lucide-shield",{"title":63,"path":64,"stem":65,"icon":66},"Troubleshooting","\u002Fen\u002Fself-hosting\u002Ftroubleshooting","en\u002F2.self-hosting\u002F13.troubleshooting","i-lucide-life-buoy",{"title":68,"path":69,"stem":70,"icon":71},"Requirements","\u002Fen\u002Fself-hosting\u002Frequirements","en\u002F2.self-hosting\u002F2.requirements","i-lucide-cpu",{"title":73,"path":74,"stem":75,"icon":76},"Quick start (guided)","\u002Fen\u002Fself-hosting\u002Fquick-start","en\u002F2.self-hosting\u002F3.quick-start","i-lucide-wand-2",{"title":78,"path":79,"stem":80,"icon":81},"Manual install","\u002Fen\u002Fself-hosting\u002Fmanual-install","en\u002F2.self-hosting\u002F4.manual-install","i-lucide-terminal",{"title":83,"path":84,"stem":85,"icon":86},"GPU acceleration","\u002Fen\u002Fself-hosting\u002Fgpu-acceleration","en\u002F2.self-hosting\u002F5.gpu-acceleration","i-lucide-zap",{"title":88,"path":89,"stem":90,"icon":91},"Performance and memory","\u002Fen\u002Fself-hosting\u002Fperformance-and-memory","en\u002F2.self-hosting\u002F6.performance-and-memory","i-lucide-gauge",{"title":93,"path":94,"stem":95,"icon":96},"Configuration reference","\u002Fen\u002Fself-hosting\u002Fconfiguration-reference","en\u002F2.self-hosting\u002F7.configuration-reference","i-lucide-sliders-horizontal",{"title":98,"path":99,"stem":100,"icon":101},"Models","\u002Fen\u002Fself-hosting\u002Fmodels","en\u002F2.self-hosting\u002F8.models","i-lucide-brain",{"title":103,"path":104,"stem":105,"icon":106},"Licensing and activation","\u002Fen\u002Fself-hosting\u002Flicensing","en\u002F2.self-hosting\u002F9.licensing","i-lucide-key-round",{"title":108,"icon":109,"path":110,"stem":111,"children":112,"page":35},"Reference","i-lucide-book-open","\u002Fen\u002Freference","en\u002F3.reference",[113,118],{"title":114,"path":115,"stem":116,"icon":117},"How it works","\u002Fen\u002Freference\u002Fhow-it-works","en\u002F3.reference\u002F1.how-it-works","i-lucide-workflow",{"title":119,"path":120,"stem":121,"icon":122},"Data and privacy","\u002Fen\u002Freference\u002Fdata-and-privacy","en\u002F3.reference\u002F2.data-and-privacy","i-lucide-lock",{"id":124,"title":48,"body":125,"description":738,"extension":739,"links":740,"meta":741,"navigation":742,"path":49,"seo":743,"stem":50,"__hash__":746},"docs_en\u002Fen\u002F2.self-hosting\u002F10.backups.md",{"type":126,"value":127,"toc":715},"minimark",[128,132,137,157,172,176,182,244,247,251,254,358,362,366,372,378,381,417,421,429,471,473,521,525,704,708,711],[129,130,131],"p",{},"You are the only one holding this data. Set up backups on day one.",[133,134,136],"h2",{"id":135},"what-gets-backed-up","What gets backed up",[129,138,139,143,144,147,148,152,153,156],{},[140,141,142],"strong",{},"Admin → Backups"," backs up the ",[140,145,146],{},"database",": accounts, collections,\nconversations, document metadata and the search index. Backups are standard\nPostgreSQL dumps named ",[149,150,151],"code",{},"chronicler-YYYYMMDD-HHMMSS.dump",", stored inside the\n",[149,154,155],{},"backend_uploads"," volume.",[158,159,160,161,164,165,167,168,171],"warning",{},"The original uploaded files live in the same volume but are ",[140,162,163],{},"not"," inside the\ndump. A complete disaster-recovery plan is: these database backups, plus a copy\nof the ",[149,166,155],{}," volume, plus your ",[149,169,170],{},".env",".",[133,173,175],{"id":174},"scheduled-backups","Scheduled backups",[129,177,178,181],{},[140,179,180],{},"Admin → Backups → Automatic backups",":",[183,184,185,201],"table",{},[186,187,188],"thead",{},[189,190,191,195,198],"tr",{},[192,193,194],"th",{},"Setting",[192,196,197],{},"Options",[192,199,200],{},"Notes",[202,203,204,218,231],"tbody",{},[189,205,206,212,215],{},[207,208,209],"td",{},[140,210,211],{},"Frequency",[207,213,214],{},"Off, Daily, Weekly",[207,216,217],{},"Daily is right for most people.",[189,219,220,225,228],{},[207,221,222],{},[140,223,224],{},"Keep",[207,226,227],{},"1–365",[207,229,230],{},"Older backups are deleted automatically once you're over the count.",[189,232,233,238,241],{},[207,234,235],{},[140,236,237],{},"Offsite folder",[207,239,240],{},"A path inside the container",[207,242,243],{},"Optional, and the most valuable part. See below.",[129,245,246],{},"Save the schedule and the panel shows the last run, the next one, and the error\nfrom the last failure if there was one. Changes take effect without a restart.",[133,248,250],{"id":249},"the-offsite-copy","The offsite copy",[129,252,253],{},"A backup in the same Docker volume as the data doesn't survive the failure you're\nactually worried about. To keep a copy elsewhere, mount a host folder — a NAS\nshare, an external disk — into the backend container.",[255,256,257,262,269,310,316,320,343,347],"steps",{},[258,259,261],"h3",{"id":260},"add-the-mount-to-your-compose-file","Add the mount to your compose file",[129,263,264,265,268],{},"Under the ",[149,266,267],{},"backend"," service:",[270,271,277],"pre",{"className":272,"code":273,"filename":274,"language":275,"meta":276,"style":276},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","    volumes:\n      - backend_uploads:\u002Fapp\u002Fuploads\n      - \u002Fmnt\u002Fnas\u002Fchronicler-backups:\u002Fmnt\u002Fbackups\n","docker-compose.yml","yaml","",[149,278,279,292,302],{"__ignoreMap":276},[280,281,284,288],"span",{"class":282,"line":283},"line",1,[280,285,287],{"class":286},"swJcz","    volumes",[280,289,291],{"class":290},"sMK4o",":\n",[280,293,295,298],{"class":282,"line":294},2,[280,296,297],{"class":290},"      -",[280,299,301],{"class":300},"sfazB"," backend_uploads:\u002Fapp\u002Fuploads\n",[280,303,305,307],{"class":282,"line":304},3,[280,306,297],{"class":290},[280,308,309],{"class":300}," \u002Fmnt\u002Fnas\u002Fchronicler-backups:\u002Fmnt\u002Fbackups\n",[129,311,312,313,171],{},"On Windows, the left side is a host path like ",[149,314,315],{},"D:\\backups",[258,317,319],{"id":318},"recreate-the-container","Recreate the container",[270,321,326],{"className":322,"code":323,"filename":324,"language":325,"meta":276,"style":276},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","docker compose up -d\n","Terminal","bash",[149,327,328],{"__ignoreMap":276},[280,329,330,334,337,340],{"class":282,"line":283},[280,331,333],{"class":332},"sBMFI","docker",[280,335,336],{"class":300}," compose",[280,338,339],{"class":300}," up",[280,341,342],{"class":300}," -d\n",[258,344,346],{"id":345},"set-the-folder-in-the-console","Set the folder in the console",[129,348,349,350,353,354,357],{},"Enter ",[149,351,352],{},"\u002Fmnt\u002Fbackups"," — the path ",[140,355,356],{},"inside"," the container — as the offsite folder\nand save. Chronicler write-tests the folder as you save and refuses a path it\ncan't write to, so a typo fails immediately rather than silently for months.",[359,360,361],"note",{},"The compose file that the desktop app's guided setup writes doesn't include this\nmount. You have to add it by hand, and re-add it after a guided update replaces\nthe file. Keeping your own copy of the compose file avoids that.",[133,363,365],{"id":364},"manual-backups","Manual backups",[129,367,368,371],{},[140,369,370],{},"Back up now"," in the console creates one immediately — do this before an update\nor any risky change.",[129,373,374,377],{},[140,375,376],{},"Download"," saves a dump to the machine you're using the app on. That is the\nsimplest offsite copy there is: download one occasionally and put it somewhere\nsafe.",[129,379,380],{},"From the command line:",[270,382,384],{"className":322,"code":383,"filename":324,"language":325,"meta":276,"style":276},"docker exec chronicler-postgres pg_dump -U chronicler -Fc chronicler_app > chronicler-backup.dump\n",[149,385,386],{"__ignoreMap":276},[280,387,388,390,393,396,399,402,405,408,411,414],{"class":282,"line":283},[280,389,333],{"class":332},[280,391,392],{"class":300}," exec",[280,394,395],{"class":300}," chronicler-postgres",[280,397,398],{"class":300}," pg_dump",[280,400,401],{"class":300}," -U",[280,403,404],{"class":300}," chronicler",[280,406,407],{"class":300}," -Fc",[280,409,410],{"class":300}," chronicler_app",[280,412,413],{"class":290}," >",[280,415,416],{"class":300}," chronicler-backup.dump\n",[133,418,420],{"id":419},"restoring","Restoring",[422,423,424,425,428],"caution",{},"Restoring ",[140,426,427],{},"replaces the entire database",". Everything created since that backup\nis gone — accounts, conversations, documents. It cannot be undone.",[255,430,431,435,441,445,448,452,460,464],{},[258,432,434],{"id":433},"take-a-backup-of-the-current-state-first","Take a backup of the current state first",[129,436,437,438],{},"Even a broken database is better than no fallback. ",[140,439,440],{},"Back up now.",[258,442,444],{"id":443},"tell-people-to-stop","Tell people to stop",[129,446,447],{},"There's no maintenance mode. Anyone using the app during a restore will see\nerrors, and their work may be lost.",[258,449,451],{"id":450},"restore","Restore",[129,453,454,456,457,459],{},[140,455,142],{},", find the archive, choose ",[140,458,451],{},", and confirm. The\naction is recorded in the audit log with who did it.",[258,461,463],{"id":462},"check-then-re-index","Check, then re-index",[129,465,466,467,470],{},"Sign in, open some documents, run a search. If results look wrong, run\n",[140,468,469],{},"Admin → Model → Reindex all"," — the index in an old dump can lag the documents.",[129,472,380],{},[270,474,476],{"className":322,"code":475,"filename":324,"language":325,"meta":276,"style":276},"docker exec -i chronicler-postgres pg_restore -U chronicler -d chronicler_app \\\n  --clean --if-exists --no-owner \u003C chronicler-backup.dump\n",[149,477,478,505],{"__ignoreMap":276},[280,479,480,482,484,487,489,492,494,496,499,501],{"class":282,"line":283},[280,481,333],{"class":332},[280,483,392],{"class":300},[280,485,486],{"class":300}," -i",[280,488,395],{"class":300},[280,490,491],{"class":300}," pg_restore",[280,493,401],{"class":300},[280,495,404],{"class":300},[280,497,498],{"class":300}," -d",[280,500,410],{"class":300},[280,502,504],{"class":503},"sTEyZ"," \\\n",[280,506,507,510,513,516,519],{"class":282,"line":294},[280,508,509],{"class":300},"  --clean",[280,511,512],{"class":300}," --if-exists",[280,514,515],{"class":300}," --no-owner",[280,517,518],{"class":290}," \u003C",[280,520,416],{"class":300},[133,522,524],{"id":523},"moving-to-another-machine","Moving to another machine",[255,526,527,531,543,547,560,564,571,575,581],{},[258,528,530],{"id":529},"back-up-and-copy","Back up and copy",[129,532,533,534,536,537,539,540,542],{},"Take a fresh backup and download it. Copy your ",[149,535,274],{}," and ",[149,538,170],{},"\ntoo — without that ",[149,541,170],{}," the old database volume is unreadable.",[258,544,546],{"id":545},"install-on-the-new-machine","Install on the new machine",[129,548,549,550,553,554,557,559],{},"Follow ",[551,552,78],"a",{"href":79},", but use the ",[140,555,556],{},"existing",[149,558,170],{}," rather than generating a new password.",[258,561,563],{"id":562},"restore-then-move-the-licence","Restore, then move the licence",[129,565,566,567,570],{},"Restore the dump, then release the licence on the old install and activate on the\nnew one (",[551,568,569],{"href":104},"Licensing",").",[258,572,574],{"id":573},"copy-the-uploaded-files","Copy the uploaded files",[129,576,577,578,580],{},"The dump has no file contents. Copy the ",[149,579,155],{}," volume across:",[270,582,584],{"className":322,"code":583,"filename":324,"language":325,"meta":276,"style":276},"# on the old machine\ndocker run --rm -v chronicler_backend_uploads:\u002Fdata -v \"$PWD\":\u002Fout alpine \\\n  tar czf \u002Fout\u002Fuploads.tgz -C \u002Fdata .\n\n# on the new one\ndocker run --rm -v chronicler_backend_uploads:\u002Fdata -v \"$PWD\":\u002Fin alpine \\\n  tar xzf \u002Fin\u002Fuploads.tgz -C \u002Fdata\n",[149,585,586,592,627,647,654,660,688],{"__ignoreMap":276},[280,587,588],{"class":282,"line":283},[280,589,591],{"class":590},"sHwdD","# on the old machine\n",[280,593,594,596,599,602,605,608,610,613,616,619,622,625],{"class":282,"line":294},[280,595,333],{"class":332},[280,597,598],{"class":300}," run",[280,600,601],{"class":300}," --rm",[280,603,604],{"class":300}," -v",[280,606,607],{"class":300}," chronicler_backend_uploads:\u002Fdata",[280,609,604],{"class":300},[280,611,612],{"class":290}," \"",[280,614,615],{"class":503},"$PWD",[280,617,618],{"class":290},"\"",[280,620,621],{"class":300},":\u002Fout",[280,623,624],{"class":300}," alpine",[280,626,504],{"class":503},[280,628,629,632,635,638,641,644],{"class":282,"line":304},[280,630,631],{"class":300},"  tar",[280,633,634],{"class":300}," czf",[280,636,637],{"class":300}," \u002Fout\u002Fuploads.tgz",[280,639,640],{"class":300}," -C",[280,642,643],{"class":300}," \u002Fdata",[280,645,646],{"class":300}," .\n",[280,648,650],{"class":282,"line":649},4,[280,651,653],{"emptyLinePlaceholder":652},true,"\n",[280,655,657],{"class":282,"line":656},5,[280,658,659],{"class":590},"# on the new one\n",[280,661,663,665,667,669,671,673,675,677,679,681,684,686],{"class":282,"line":662},6,[280,664,333],{"class":332},[280,666,598],{"class":300},[280,668,601],{"class":300},[280,670,604],{"class":300},[280,672,607],{"class":300},[280,674,604],{"class":300},[280,676,612],{"class":290},[280,678,615],{"class":503},[280,680,618],{"class":290},[280,682,683],{"class":300},":\u002Fin",[280,685,624],{"class":300},[280,687,504],{"class":503},[280,689,691,693,696,699,701],{"class":282,"line":690},7,[280,692,631],{"class":300},[280,694,695],{"class":300}," xzf",[280,697,698],{"class":300}," \u002Fin\u002Fuploads.tgz",[280,700,640],{"class":300},[280,702,703],{"class":300}," \u002Fdata\n",[133,705,707],{"id":706},"test-it","Test it",[129,709,710],{},"An untested backup isn't a backup. Once, on a spare machine, restore one and\nsign in. Ten minutes now, or an unpleasant discovery later.",[712,713,714],"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);}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 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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":276,"searchDepth":294,"depth":294,"links":716},[717,718,719,724,725,731,737],{"id":135,"depth":294,"text":136},{"id":174,"depth":294,"text":175},{"id":249,"depth":294,"text":250,"children":720},[721,722,723],{"id":260,"depth":304,"text":261},{"id":318,"depth":304,"text":319},{"id":345,"depth":304,"text":346},{"id":364,"depth":294,"text":365},{"id":419,"depth":294,"text":420,"children":726},[727,728,729,730],{"id":433,"depth":304,"text":434},{"id":443,"depth":304,"text":444},{"id":450,"depth":304,"text":451},{"id":462,"depth":304,"text":463},{"id":523,"depth":294,"text":524,"children":732},[733,734,735,736],{"id":529,"depth":304,"text":530},{"id":545,"depth":304,"text":546},{"id":562,"depth":304,"text":563},{"id":573,"depth":304,"text":574},{"id":706,"depth":294,"text":707},"Scheduled backups, an offsite copy, and how to get your data back.","md",null,{},{"icon":51},{"title":744,"description":745},"Chronicler backups and restore","Configure scheduled database backups, keep an offsite copy, and restore a Chronicler self-hosted server.","BqTvWvpSXVbVh0W3Eu2U03CIcVZCwobs4RxddMBj3EY",[748,750],{"title":43,"path":44,"stem":45,"description":749,"icon":46,"children":-1},"What the self-hosted stack is made of, what runs where, and what leaves the machine.",{"title":53,"path":54,"stem":55,"description":751,"icon":56,"children":-1},"The app and the server update separately. Here's how each one works.",1785092109398]