[{"data":1,"prerenderedAt":635},["ShallowReactive",2],{"docs-sidebar-source":3,"content-query-eJnBJPw2i1":301},[4,8,11,14,17,21,25,29,32,35,39,43,47,51,55,59,63,67,70,73,77,81,85,88,91,94,98,102,106,110,114,117,120,124,128,132,136,140,144,148,151,154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,280,283,286,289,292,295,298],{"_path":5,"title":6,"order":7},"/docs/getting-started","Getting Started",1,{"_path":9,"title":10,"order":7},"/docs/self-hosting/all-in-one","All-in-One Setup",{"_path":12,"title":13,"order":7},"/docs/api/server","Server API",{"_path":15,"title":16,"order":7},"/docs/views/grid","Grid View",{"_path":18,"title":19,"order":20},"/docs/core-concepts","Core Concepts",10,{"_path":22,"title":23,"order":24},"/docs/crdt","What is a CRDT?",11,{"_path":26,"title":27,"order":28},"/docs/self-hosting/separate-containers","Separate Containers Setup",2,{"_path":30,"title":31,"order":28},"/docs/api/client-http","Client HTTP API",{"_path":33,"title":34,"order":28},"/docs/views/table","Table View",{"_path":36,"title":37,"order":38},"/docs/interface-overview","Interface Overview",20,{"_path":40,"title":41,"order":42},"/docs/global-search","Global Search",22,{"_path":44,"title":45,"order":46},"/docs/filters","Filters",24,{"_path":48,"title":49,"order":50},"/docs/sorting","Sorting",25,{"_path":52,"title":53,"order":54},"/docs/tagging-and-selection","Tagging & Selection",26,{"_path":56,"title":57,"order":58},"/docs/properties","Properties",27,{"_path":60,"title":61,"order":62},"/docs/quick-view","Quick View",28,{"_path":64,"title":65,"order":66},"/docs/self-hosting/updating","Updating Heaper",3,{"_path":68,"title":69,"order":66},"/docs/api/cli","CLI",{"_path":71,"title":72,"order":66},"/docs/views/list","List View",{"_path":74,"title":75,"order":76},"/docs/block-actions","Block Actions",30,{"_path":78,"title":79,"order":80},"/docs/deleting-blocks","Deleting Blocks & Trash",32,{"_path":82,"title":83,"order":84},"/docs/self-hosting/remote-access-tailscale","Remote Access with Tailscale",4,{"_path":86,"title":87,"order":84},"/docs/self-hosting","Self-Hosting",{"_path":89,"title":90,"order":84},"/docs/api/agents-mcp","Agent and MCP Access",{"_path":92,"title":93,"order":84},"/docs/views/tasks","Tasks View",{"_path":95,"title":96,"order":97},"/docs/managing-heaps","Managing Heaps",40,{"_path":99,"title":100,"order":101},"/docs/file-scanning","File Scanning & Importing",42,{"_path":103,"title":104,"order":105},"/docs/storage-management","Storage Management",44,{"_path":107,"title":108,"order":109},"/docs/daily-notes","Daily Notes & Calendar",46,{"_path":111,"title":112,"order":113},"/docs/api/cli-reference","CLI Reference",5,{"_path":115,"title":116,"order":113},"/docs/api","API",{"_path":118,"title":119,"order":113},"/docs/views/kanban-board","Board View",{"_path":121,"title":122,"order":123},"/docs/views/calendar","Calendar View",6,{"_path":125,"title":126,"order":127},"/docs/views","Views",60,{"_path":129,"title":130,"order":131},"/docs/views/graph","Graph View",7,{"_path":133,"title":134,"order":135},"/docs/authentication","Authentication & User Management",70,{"_path":137,"title":138,"order":139},"/docs/licenses-privacy","Licenses & Privacy",72,{"_path":141,"title":142,"order":143},"/docs/faq","FAQ",80,{"_path":145,"title":146,"order":147},"/docs/changelog","Changelog",99,{"_path":149,"title":150},"/docs/changelog/v16.16.25","v16.16.25",{"_path":152,"title":153},"/docs/changelog/v16.16.39","v16.16.39",{"_path":155,"title":156},"/docs/changelog/v16.10.0","v16.10.0",{"_path":158,"title":159},"/docs/changelog/v16.17.8","v16.17.8",{"_path":161,"title":162},"/docs/changelog/v16.11.0","v16.11.0",{"_path":164,"title":165},"/docs/changelog/v16.16.2","v16.16.2",{"_path":167,"title":168},"/docs/changelog/v16.16.11","v16.16.11",{"_path":170,"title":171},"/docs/changelog/v16.16.27","v16.16.27",{"_path":173,"title":174},"/docs/changelog/v16.16.22","v16.16.22",{"_path":176,"title":177},"/docs/changelog/v16.16.14","v16.16.14",{"_path":179,"title":180},"/docs/changelog/v16.16.6","v16.16.6",{"_path":182,"title":183},"/docs/changelog/v16.16.36","v16.16.36",{"_path":185,"title":186},"/docs/changelog/v16.16.33","v16.16.33",{"_path":188,"title":189},"/docs/changelog/v16.19","v16.19",{"_path":191,"title":192},"/docs/changelog/v16.16.16","v16.16.16",{"_path":194,"title":195},"/docs/changelog/v16.16.8","v16.16.8",{"_path":197,"title":198},"/docs/changelog/v16.16.40","v16.16.40",{"_path":200,"title":201},"/docs/changelog/v16.16.0","v16.16.0",{"_path":203,"title":204},"/docs/changelog/v16.16.32","v16.16.32",{"_path":206,"title":207},"/docs/changelog/v16.16.28","v16.16.28",{"_path":209,"title":210},"/docs/changelog/v16.16.15","v16.16.15",{"_path":212,"title":213},"/docs/changelog/v16.16.9","v16.16.9",{"_path":215,"title":216},"/docs/changelog/v16.16.38","v16.16.38",{"_path":218,"title":219},"/docs/changelog/v16.6.0","v16.6.0",{"_path":221,"title":222},"/docs/changelog/v16.16.7","v16.16.7",{"_path":224,"title":225},"/docs/changelog/v16.9.0","v16.9.0",{"_path":227,"title":228},"/docs/changelog/v16.8.0","v16.8.0",{"_path":230,"title":231},"/docs/changelog/v16.16.17","v16.16.17",{"_path":233,"title":234},"/docs/changelog/v16.16.12","v16.16.12",{"_path":236,"title":237},"/docs/changelog/v16.7.0","v16.7.0",{"_path":239,"title":240},"/docs/changelog/v16.16.20","v16.16.20",{"_path":242,"title":243},"/docs/changelog/v16.16.23","v16.16.23",{"_path":245,"title":246},"/docs/changelog/v16.16.41","v16.16.41",{"_path":248,"title":249},"/docs/changelog/v16.16.30","v16.16.30",{"_path":251,"title":252},"/docs/changelog/v16.16.34","v16.16.34",{"_path":254,"title":255},"/docs/changelog/v16.16.4","v16.16.4",{"_path":257,"title":258},"/docs/changelog/v16.16.19","v16.16.19",{"_path":260,"title":261},"/docs/changelog/v16.16.43","v16.16.43",{"_path":263,"title":264},"/docs/changelog/v16.16.13","v16.16.13",{"_path":266,"title":267},"/docs/changelog/v16.16.26","v16.16.26",{"_path":269,"title":270},"/docs/changelog/v16.16.18","v16.16.18",{"_path":272,"title":273},"/docs/changelog/v16.16.10","v16.16.10",{"_path":275,"title":276},"/docs/changelog/v16.16.35","v16.16.35",{"_path":278,"title":279},"/docs/changelog/v16.16.21","v16.16.21",{"_path":281,"title":282},"/docs/changelog/v16.16.37","v16.16.37",{"_path":284,"title":285},"/docs/changelog/v16.16.31","v16.16.31",{"_path":287,"title":288},"/docs/changelog/v16.16.3","v16.16.3",{"_path":290,"title":291},"/docs/changelog/v16.16.29","v16.16.29",{"_path":293,"title":294},"/docs/changelog/v16.16.24","v16.16.24",{"_path":296,"title":297},"/docs/changelog/v16.16.1","v16.16.1",{"_path":299,"title":300},"/docs/changelog/v16.16.5","v16.16.5",{"_path":64,"_dir":302,"_draft":303,"_partial":303,"_locale":304,"title":65,"description":305,"order":66,"body":306,"_type":629,"_id":630,"_source":631,"_file":632,"_stem":633,"_extension":634},"self-hosting",false,"","Update a self-hosted Heaper server and roll back safely",{"type":307,"children":308,"toc":620},"root",[309,317,331,345,357,362,368,381,401,412,417,425,438,456,462,490,499,511,517,522,531,536,544,557,562,571,583,589,594,600,609],{"type":310,"tag":311,"props":312,"children":314},"element","h1",{"id":313},"updating-heaper",[315],{"type":316,"value":65},"text",{"type":310,"tag":318,"props":319,"children":321},"h2",{"id":320},"quick-update-with-latest",[322,324],{"type":316,"value":323},"Quick update with ",{"type":310,"tag":325,"props":326,"children":328},"code",{"className":327},[],[329],{"type":316,"value":330},"latest",{"type":310,"tag":332,"props":333,"children":334},"p",{},[335,337,343],{"type":316,"value":336},"If your Compose file uses ",{"type":310,"tag":325,"props":338,"children":340},{"className":339},[],[341],{"type":316,"value":342},"ghcr.io/janlunge/heaper:latest",{"type":316,"value":344}," and you just want the newest stable version:",{"type":310,"tag":346,"props":347,"children":352},"pre",{"className":348,"code":350,"language":351,"meta":304},[349],"language-bash","docker compose pull heaper\ndocker compose up -d heaper\n","bash",[353],{"type":310,"tag":325,"props":354,"children":355},{"__ignoreMap":304},[356],{"type":316,"value":350},{"type":310,"tag":332,"props":358,"children":359},{},[360],{"type":316,"value":361},"That is all you need. For a rollback-ready update, follow the steps below.",{"type":310,"tag":318,"props":363,"children":365},{"id":364},"_1-prepare-the-rollback",[366],{"type":316,"value":367},"1. Prepare the rollback",{"type":310,"tag":332,"props":369,"children":370},{},[371,373,379],{"type":316,"value":372},"In Heaper, open ",{"type":310,"tag":374,"props":375,"children":376},"strong",{},[377],{"type":316,"value":378},"Settings → Servers",{"type":316,"value":380}," and note the installed and available versions.",{"type":310,"tag":332,"props":382,"children":383},{},[384,386,391,393,399],{"type":316,"value":385},"Replace the floating ",{"type":310,"tag":325,"props":387,"children":389},{"className":388},[],[390],{"type":316,"value":330},{"type":316,"value":392}," or ",{"type":310,"tag":325,"props":394,"children":396},{"className":395},[],[397],{"type":316,"value":398},"nightly",{"type":316,"value":400}," tag in your Compose file with the installed version first:",{"type":310,"tag":346,"props":402,"children":407},{"className":403,"code":405,"language":406,"meta":304},[404],"language-yaml","image: ghcr.io/janlunge/heaper:16.17.19\n","yaml",[408],{"type":310,"tag":325,"props":409,"children":410},{"__ignoreMap":304},[411],{"type":316,"value":405},{"type":310,"tag":332,"props":413,"children":414},{},[415],{"type":316,"value":416},"To roll back, restore this version and recreate the Heaper container:",{"type":310,"tag":346,"props":418,"children":420},{"className":419,"code":350,"language":351,"meta":304},[349],[421],{"type":310,"tag":325,"props":422,"children":423},{"__ignoreMap":304},[424],{"type":316,"value":350},{"type":310,"tag":332,"props":426,"children":427},{},[428,430,436],{"type":316,"value":429},"For Docker Run, repeat your original ",{"type":310,"tag":325,"props":431,"children":433},{"className":432},[],[434],{"type":316,"value":435},"docker run",{"type":316,"value":437}," command with the previous version tag.",{"type":310,"tag":439,"props":440,"children":441},"blockquote",{},[442],{"type":310,"tag":332,"props":443,"children":444},{},[445,447,454],{"type":316,"value":446},"Returning to an older image does not undo database migrations. If the old version cannot start, ",{"type":310,"tag":448,"props":449,"children":451},"a",{"href":450},"/docs/self-hosting#restore-database",[452],{"type":316,"value":453},"restore the latest pre-update backup",{"type":316,"value":455},".",{"type":310,"tag":318,"props":457,"children":459},{"id":458},"_2-check-the-nightly-backup",[460],{"type":316,"value":461},"2. Check the nightly backup",{"type":310,"tag":332,"props":463,"children":464},{},[465,467,473,475,481,482,488],{"type":316,"value":466},"Heaper creates automatic nightly database backups when ",{"type":310,"tag":325,"props":468,"children":470},{"className":469},[],[471],{"type":316,"value":472},"/mnt/backups",{"type":316,"value":474}," is mounted. Check that the newest ",{"type":310,"tag":325,"props":476,"children":478},{"className":477},[],[479],{"type":316,"value":480},".sql",{"type":316,"value":392},{"type":310,"tag":325,"props":483,"children":485},{"className":484},[],[486],{"type":316,"value":487},".sql.enc",{"type":316,"value":489}," file is recent and not empty:",{"type":310,"tag":346,"props":491,"children":494},{"className":492,"code":493,"language":351,"meta":304},[349],"ls -lh ./heaper-data/backups\n",[495],{"type":310,"tag":325,"props":496,"children":497},{"__ignoreMap":304},[498],{"type":316,"value":493},{"type":310,"tag":332,"props":500,"children":501},{},[502,504,509],{"type":316,"value":503},"For Docker Run, check the host directory mounted to ",{"type":310,"tag":325,"props":505,"children":507},{"className":506},[],[508],{"type":316,"value":472},{"type":316,"value":510},". Do not update if the expected backup is missing.",{"type":310,"tag":318,"props":512,"children":514},{"id":513},"_3-update-heaper",[515],{"type":316,"value":516},"3. Update Heaper",{"type":310,"tag":332,"props":518,"children":519},{},[520],{"type":316,"value":521},"Replace the installed version with the exact available version shown by Heaper:",{"type":310,"tag":346,"props":523,"children":526},{"className":524,"code":525,"language":406,"meta":304},[404],"image: ghcr.io/janlunge/heaper:16.18.0\n",[527],{"type":310,"tag":325,"props":528,"children":529},{"__ignoreMap":304},[530],{"type":316,"value":525},{"type":310,"tag":332,"props":532,"children":533},{},[534],{"type":316,"value":535},"Then update the Heaper service:",{"type":310,"tag":346,"props":537,"children":539},{"className":538,"code":350,"language":351,"meta":304},[349],[540],{"type":310,"tag":325,"props":541,"children":542},{"__ignoreMap":304},[543],{"type":316,"value":350},{"type":310,"tag":332,"props":545,"children":546},{},[547,549,555],{"type":316,"value":548},"For separate-container installations, update only the ",{"type":310,"tag":325,"props":550,"children":552},{"className":551},[],[553],{"type":316,"value":554},"heaper",{"type":316,"value":556}," service. Do not change the PostgreSQL image unless the release notes require it.",{"type":310,"tag":332,"props":558,"children":559},{},[560],{"type":316,"value":561},"For Docker Run:",{"type":310,"tag":346,"props":563,"children":566},{"className":564,"code":565,"language":351,"meta":304},[349],"docker pull ghcr.io/janlunge/heaper:16.18.0\ndocker stop heaper-selfhost\ndocker rm heaper-selfhost\n",[567],{"type":310,"tag":325,"props":568,"children":569},{"__ignoreMap":304},[570],{"type":316,"value":565},{"type":310,"tag":332,"props":572,"children":573},{},[574,576,581],{"type":316,"value":575},"Then repeat your original ",{"type":310,"tag":325,"props":577,"children":579},{"className":578},[],[580],{"type":316,"value":435},{"type":316,"value":582}," command with the new version tag.",{"type":310,"tag":318,"props":584,"children":586},{"id":585},"_4-wait-for-migrations",[587],{"type":316,"value":588},"4. Wait for migrations",{"type":310,"tag":332,"props":590,"children":591},{},[592],{"type":316,"value":593},"Heaper runs database migrations automatically during startup. Do not stop the container during the first startup after an update.",{"type":310,"tag":318,"props":595,"children":597},{"id":596},"_5-verify-the-update",[598],{"type":316,"value":599},"5. Verify the update",{"type":310,"tag":346,"props":601,"children":604},{"className":602,"code":603,"language":351,"meta":304},[349],"docker compose ps\ndocker compose logs --tail=100 heaper\n",[605],{"type":310,"tag":325,"props":606,"children":607},{"__ignoreMap":304},[608],{"type":316,"value":603},{"type":310,"tag":332,"props":610,"children":611},{},[612,614,618],{"type":316,"value":613},"Confirm that the service is healthy, ",{"type":310,"tag":374,"props":615,"children":616},{},[617],{"type":316,"value":378},{"type":316,"value":619}," shows the target version, and a workspace and file open normally.",{"title":304,"searchDepth":28,"depth":28,"links":621},[622,624,625,626,627,628],{"id":320,"depth":28,"text":623},"Quick update with latest",{"id":364,"depth":28,"text":367},{"id":458,"depth":28,"text":461},{"id":513,"depth":28,"text":516},{"id":585,"depth":28,"text":588},{"id":596,"depth":28,"text":599},"markdown","content:docs:self-hosting:updating.md","content","docs/self-hosting/updating.md","docs/self-hosting/updating","md",1785777127669]