[{"data":1,"prerenderedAt":1075},["ShallowReactive",2],{"docs-nav":3,"content-query-ens8O5EuPr":249},[4,8,11,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86,90,94,98,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246],{"_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/views/grid","Grid View",{"_path":15,"title":16,"order":17},"/docs/core-concepts","Core Concepts",10,{"_path":19,"title":20,"order":21},"/docs/crdt","What is a CRDT?",11,{"_path":23,"title":24,"order":25},"/docs/self-hosting/separate-containers","Separate Containers Setup",2,{"_path":27,"title":28,"order":29},"/docs/interface-overview","Interface Overview",20,{"_path":31,"title":32,"order":33},"/docs/global-search","Global Search",22,{"_path":35,"title":36,"order":37},"/docs/filters","Filters",24,{"_path":39,"title":40,"order":41},"/docs/sorting","Sorting",25,{"_path":43,"title":44,"order":45},"/docs/tagging-and-selection","Tagging & Selection",26,{"_path":47,"title":48,"order":49},"/docs/quick-view","Quick View",28,{"_path":51,"title":52,"order":53},"/docs/self-hosting/remote-access-tailscale","Remote Access with Tailscale",3,{"_path":55,"title":56,"order":57},"/docs/block-actions","Block Actions",30,{"_path":59,"title":60,"order":61},"/docs/deleting-blocks","Deleting Blocks & Trash",32,{"_path":63,"title":64,"order":65},"/docs/self-hosting","Self-Hosting",4,{"_path":67,"title":68,"order":69},"/docs/managing-heaps","Managing Heaps",40,{"_path":71,"title":72,"order":73},"/docs/file-scanning","File Scanning & Importing",42,{"_path":75,"title":76,"order":77},"/docs/storage-management","Storage Management",44,{"_path":79,"title":80,"order":81},"/docs/daily-notes","Daily Notes & Calendar",46,{"_path":83,"title":84,"order":85},"/docs/views","Views",60,{"_path":87,"title":88,"order":89},"/docs/authentication","Authentication & User Management",70,{"_path":91,"title":92,"order":93},"/docs/licenses-privacy","Licenses & Privacy",72,{"_path":95,"title":96,"order":97},"/docs/faq","FAQ",80,{"_path":99,"title":100,"order":101},"/docs/changelog","Changelog",99,{"_path":103,"title":104},"/docs/changelog/v16.16.15","v16.16.15",{"_path":106,"title":107},"/docs/changelog/v16.16.34","v16.16.34",{"_path":109,"title":110},"/docs/changelog/v16.16.28","v16.16.28",{"_path":112,"title":113},"/docs/changelog/v16.16.35","v16.16.35",{"_path":115,"title":116},"/docs/changelog/v16.16.32","v16.16.32",{"_path":118,"title":119},"/docs/changelog/v16.8.0","v16.8.0",{"_path":121,"title":122},"/docs/changelog/v16.16.8","v16.16.8",{"_path":124,"title":125},"/docs/changelog/v16.16.27","v16.16.27",{"_path":127,"title":128},"/docs/changelog/v16.16.41","v16.16.41",{"_path":130,"title":131},"/docs/changelog/v16.16.11","v16.16.11",{"_path":133,"title":134},"/docs/changelog/v16.16.14","v16.16.14",{"_path":136,"title":137},"/docs/changelog/v16.16.17","v16.16.17",{"_path":139,"title":140},"/docs/changelog/v16.16.10","v16.16.10",{"_path":142,"title":143},"/docs/changelog/v16.16.20","v16.16.20",{"_path":145,"title":146},"/docs/changelog/v16.6.0","v16.6.0",{"_path":148,"title":149},"/docs/changelog/v16.16.22","v16.16.22",{"_path":151,"title":152},"/docs/changelog/v16.16.6","v16.16.6",{"_path":154,"title":155},"/docs/changelog/v16.16.36","v16.16.36",{"_path":157,"title":158},"/docs/changelog/v16.16.18","v16.16.18",{"_path":160,"title":161},"/docs/changelog/v16.16.38","v16.16.38",{"_path":163,"title":164},"/docs/changelog/v16.16.1","v16.16.1",{"_path":166,"title":167},"/docs/changelog/v16.16.12","v16.16.12",{"_path":169,"title":170},"/docs/changelog/v16.16.31","v16.16.31",{"_path":172,"title":173},"/docs/changelog/v16.16.40","v16.16.40",{"_path":175,"title":176},"/docs/changelog/v16.7.0","v16.7.0",{"_path":178,"title":179},"/docs/changelog/v16.9.0","v16.9.0",{"_path":181,"title":182},"/docs/changelog/v16.16.4","v16.16.4",{"_path":184,"title":185},"/docs/changelog/v16.16.13","v16.16.13",{"_path":187,"title":188},"/docs/changelog/v16.16.37","v16.16.37",{"_path":190,"title":191},"/docs/changelog/v16.16.9","v16.16.9",{"_path":193,"title":194},"/docs/changelog/v16.16.25","v16.16.25",{"_path":196,"title":197},"/docs/changelog/v16.16.24","v16.16.24",{"_path":199,"title":200},"/docs/changelog/v16.16.3","v16.16.3",{"_path":202,"title":203},"/docs/changelog/v16.10.0","v16.10.0",{"_path":205,"title":206},"/docs/changelog/v16.16.16","v16.16.16",{"_path":208,"title":209},"/docs/changelog/v16.16.33","v16.16.33",{"_path":211,"title":212},"/docs/changelog/v16.16.26","v16.16.26",{"_path":214,"title":215},"/docs/changelog/v16.16.43","v16.16.43",{"_path":217,"title":218},"/docs/changelog/v16.11.0","v16.11.0",{"_path":220,"title":221},"/docs/changelog/v16.16.29","v16.16.29",{"_path":223,"title":224},"/docs/changelog/v16.16.5","v16.16.5",{"_path":226,"title":227},"/docs/changelog/v16.16.39","v16.16.39",{"_path":229,"title":230},"/docs/changelog/v16.16.2","v16.16.2",{"_path":232,"title":233},"/docs/changelog/v16.16.7","v16.16.7",{"_path":235,"title":236},"/docs/changelog/v16.16.23","v16.16.23",{"_path":238,"title":239},"/docs/changelog/v16.16.0","v16.16.0",{"_path":241,"title":242},"/docs/changelog/v16.16.30","v16.16.30",{"_path":244,"title":245},"/docs/changelog/v16.16.21","v16.16.21",{"_path":247,"title":248},"/docs/changelog/v16.16.19","v16.16.19",{"_path":63,"_dir":250,"_draft":251,"_partial":251,"_locale":252,"title":64,"description":253,"order":65,"body":254,"_type":1069,"_id":1070,"_source":1071,"_file":1072,"_stem":1073,"_extension":1074},"docs",false,"","Host your own heaper instance",{"type":255,"children":256,"toc":1048},"root",[257,265,271,278,293,299,319,327,340,346,359,370,400,413,422,440,452,463,469,478,496,503,523,535,541,547,560,659,677,686,694,703,711,720,725,750,756,782,791,799,808,814,822,831,838,847,853,866,886,892,897,953,959,965,974,980,989,995,1008,1017,1023,1035],{"type":258,"tag":259,"props":260,"children":262},"element","h1",{"id":261},"self-hosting",[263],{"type":264,"value":64},"text",{"type":258,"tag":266,"props":267,"children":268},"p",{},[269],{"type":264,"value":270},"heaper can be self-hosted, giving you complete control over your data and infrastructure.",{"type":258,"tag":272,"props":273,"children":275},"h2",{"id":274},"prerequisites",[276],{"type":264,"value":277},"Prerequisites",{"type":258,"tag":279,"props":280,"children":281},"ul",{},[282,288],{"type":258,"tag":283,"props":284,"children":285},"li",{},[286],{"type":264,"value":287},"Docker",{"type":258,"tag":283,"props":289,"children":290},{},[291],{"type":264,"value":292},"Domain (recommended for TLS via a reverse proxy like Caddy or nginx)",{"type":258,"tag":272,"props":294,"children":296},{"id":295},"platform-architecture",[297],{"type":264,"value":298},"Platform Architecture",{"type":258,"tag":266,"props":300,"children":301},{},[302,304,310,312,317],{"type":264,"value":303},"The heaper image is built for ",{"type":258,"tag":305,"props":306,"children":307},"strong",{},[308],{"type":264,"value":309},"x64 (amd64)",{"type":264,"value":311}," and ",{"type":258,"tag":305,"props":313,"children":314},{},[315],{"type":264,"value":316},"ARM64 (aarch64)",{"type":264,"value":318}," devices.",{"type":258,"tag":266,"props":320,"children":321},{},[322],{"type":258,"tag":305,"props":323,"children":324},{},[325],{"type":264,"value":326},"Docker run",{"type":258,"tag":328,"props":329,"children":334},"pre",{"className":330,"code":332,"language":333,"meta":252},[331],"language-bash","docker run -d --name heaper-selfhost \\\n  -p 3010:80 \\\n  # ... other options\n  ghcr.io/janlunge/heaper:latest\n","bash",[335],{"type":258,"tag":336,"props":337,"children":338},"code",{"__ignoreMap":252},[339],{"type":264,"value":332},{"type":258,"tag":272,"props":341,"children":343},{"id":342},"quick-start",[344],{"type":264,"value":345},"Quick Start",{"type":258,"tag":266,"props":347,"children":348},{},[349,351,357],{"type":264,"value":350},"Create a ",{"type":258,"tag":336,"props":352,"children":354},{"className":353},[],[355],{"type":264,"value":356},"docker-compose.yml",{"type":264,"value":358},":",{"type":258,"tag":328,"props":360,"children":365},{"className":361,"code":363,"language":364,"meta":252},[362],"language-yaml","services:\n  heaper:\n    image: ghcr.io/janlunge/heaper:latest\n    platform: linux/amd64   # Required on ARM (Raspberry Pi, Apple Silicon)\n    container_name: heaper\n    restart: unless-stopped\n    mem_limit: 4g\n    memswap_limit: 4g\n    ports:\n      - \"3010:80\"\n      # - \"5432:5432\"  # Uncomment to expose PostgreSQL externally\n    environment:\n      - HOSTNAME=localhost\n      - POSTGRES_USER=heaper\n      - POSTGRES_PASSWORD=change-me-please\n      - POSTGRES_DB=heaper\n      - ENABLE_INTERNAL_POSTGRES=true\n    volumes:\n      - ./heaper-data/postgres:/var/lib/postgresql/data\n      - ./heaper-data/data:/usr/src/app/data\n      - ./heaper-data/config:/usr/src/app/config\n      - ./heaper-data/thumbnails:/mnt/thumbnails\n      - ./heaper-data/storage:/mnt/storage\n      - ./heaper-data/backups:/mnt/backups\n","yaml",[366],{"type":258,"tag":336,"props":367,"children":368},{"__ignoreMap":252},[369],{"type":264,"value":363},{"type":258,"tag":371,"props":372,"children":373},"blockquote",{},[374],{"type":258,"tag":266,"props":375,"children":376},{},[377,382,384,390,392,398],{"type":258,"tag":305,"props":378,"children":379},{},[380],{"type":264,"value":381},"Info:",{"type":264,"value":383}," When using Podman instead of Docker, the Postgres volume (",{"type":258,"tag":336,"props":385,"children":387},{"className":386},[],[388],{"type":264,"value":389},"/var/lib/postgresql/data",{"type":264,"value":391},") cannot be bind-mounted to a host path — Postgres requires specific permissions that Podman does not allow for bind mounts. Use a named volume (e.g. ",{"type":258,"tag":336,"props":393,"children":395},{"className":394},[],[396],{"type":264,"value":397},"postgres_data:/var/lib/postgresql/data",{"type":264,"value":399},") instead.",{"type":258,"tag":266,"props":401,"children":402},{},[403,405,411],{"type":264,"value":404},"Change ",{"type":258,"tag":336,"props":406,"children":408},{"className":407},[],[409],{"type":264,"value":410},"POSTGRES_PASSWORD",{"type":264,"value":412}," to a secure password, then:",{"type":258,"tag":328,"props":414,"children":417},{"className":415,"code":416,"language":333,"meta":252},[331],"docker-compose up -d\n",[418],{"type":258,"tag":336,"props":419,"children":420},{"__ignoreMap":252},[421],{"type":264,"value":416},{"type":258,"tag":266,"props":423,"children":424},{},[425,430,432],{"type":258,"tag":305,"props":426,"children":427},{},[428],{"type":264,"value":429},"Access:",{"type":264,"value":431}," ",{"type":258,"tag":433,"props":434,"children":438},"a",{"href":435,"rel":436},"http://localhost:3010",[437],"nofollow",[439],{"type":264,"value":435},{"type":258,"tag":266,"props":441,"children":442},{},[443,445,450],{"type":264,"value":444},"For more details (docker run, environment variables, volumes) see the ",{"type":258,"tag":433,"props":446,"children":447},{"href":9},[448],{"type":264,"value":449},"All-in-one setup guide",{"type":264,"value":451},".",{"type":258,"tag":266,"props":453,"children":454},{},[455,457,462],{"type":264,"value":456},"Looking for a setup with a separate PostgreSQL container? See the ",{"type":258,"tag":433,"props":458,"children":459},{"href":23},[460],{"type":264,"value":461},"Separate containers guide",{"type":264,"value":451},{"type":258,"tag":272,"props":464,"children":466},{"id":465},"updating",[467],{"type":264,"value":468},"Updating",{"type":258,"tag":328,"props":470,"children":473},{"className":471,"code":472,"language":333,"meta":252},[331],"docker-compose pull\ndocker-compose up -d\n",[474],{"type":258,"tag":336,"props":475,"children":476},{"__ignoreMap":252},[477],{"type":264,"value":472},{"type":258,"tag":266,"props":479,"children":480},{},[481,486,488,494],{"type":258,"tag":305,"props":482,"children":483},{},[484],{"type":264,"value":485},"Docker run:",{"type":264,"value":487}," Pull the new image, remove the old container, then run your original ",{"type":258,"tag":336,"props":489,"children":491},{"className":490},[],[492],{"type":264,"value":493},"docker run",{"type":264,"value":495}," command again.",{"type":258,"tag":497,"props":498,"children":500},"h3",{"id":499},"nightly-test-builds",[501],{"type":264,"value":502},"Nightly Test Builds",{"type":258,"tag":266,"props":504,"children":505},{},[506,508,514,516,522],{"type":264,"value":507},"If you want to test a pre-release build before it goes live, replace ",{"type":258,"tag":336,"props":509,"children":511},{"className":510},[],[512],{"type":264,"value":513},"ghcr.io/janlunge/heaper:latest",{"type":264,"value":515}," with ",{"type":258,"tag":336,"props":517,"children":519},{"className":518},[],[520],{"type":264,"value":521},"ghcr.io/janlunge/heaper:nightly",{"type":264,"value":451},{"type":258,"tag":266,"props":524,"children":525},{},[526,528,534],{"type":264,"value":527},"Nightly is an opt-in testing channel for the combined self-hosted image. It may include unfinished changes and is less stable than ",{"type":258,"tag":336,"props":529,"children":531},{"className":530},[],[532],{"type":264,"value":533},"latest",{"type":264,"value":451},{"type":258,"tag":272,"props":536,"children":538},{"id":537},"backup-restore",[539],{"type":264,"value":540},"Backup & Restore",{"type":258,"tag":497,"props":542,"children":544},{"id":543},"automated-backups",[545],{"type":264,"value":546},"Automated Backups",{"type":258,"tag":266,"props":548,"children":549},{},[550,552,558],{"type":264,"value":551},"Heaper supports automated daily database backups. Backups run automatically when the ",{"type":258,"tag":336,"props":553,"children":555},{"className":554},[],[556],{"type":264,"value":557},"/mnt/backups",{"type":264,"value":559}," volume is mounted.",{"type":258,"tag":561,"props":562,"children":563},"table",{},[564,588],{"type":258,"tag":565,"props":566,"children":567},"thead",{},[568],{"type":258,"tag":569,"props":570,"children":571},"tr",{},[572,578,583],{"type":258,"tag":573,"props":574,"children":575},"th",{},[576],{"type":264,"value":577},"Variable",{"type":258,"tag":573,"props":579,"children":580},{},[581],{"type":264,"value":582},"Default",{"type":258,"tag":573,"props":584,"children":585},{},[586],{"type":264,"value":587},"Description",{"type":258,"tag":589,"props":590,"children":591},"tbody",{},[592,615,637],{"type":258,"tag":569,"props":593,"children":594},{},[595,605,610],{"type":258,"tag":596,"props":597,"children":598},"td",{},[599],{"type":258,"tag":336,"props":600,"children":602},{"className":601},[],[603],{"type":264,"value":604},"BACKUP_ENCRYPTION_KEY",{"type":258,"tag":596,"props":606,"children":607},{},[608],{"type":264,"value":609},"(optional)",{"type":258,"tag":596,"props":611,"children":612},{},[613],{"type":264,"value":614},"Passphrase for AES-256-GCM encryption",{"type":258,"tag":569,"props":616,"children":617},{},[618,627,632],{"type":258,"tag":596,"props":619,"children":620},{},[621],{"type":258,"tag":336,"props":622,"children":624},{"className":623},[],[625],{"type":264,"value":626},"BACKUP_RETENTION_DAYS",{"type":258,"tag":596,"props":628,"children":629},{},[630],{"type":264,"value":631},"7",{"type":258,"tag":596,"props":633,"children":634},{},[635],{"type":264,"value":636},"Number of days to keep backups",{"type":258,"tag":569,"props":638,"children":639},{},[640,649,654],{"type":258,"tag":596,"props":641,"children":642},{},[643],{"type":258,"tag":336,"props":644,"children":646},{"className":645},[],[647],{"type":264,"value":648},"BACKUP_HOUR",{"type":258,"tag":596,"props":650,"children":651},{},[652],{"type":264,"value":653},"3",{"type":258,"tag":596,"props":655,"children":656},{},[657],{"type":264,"value":658},"Hour (UTC) to run daily backup (0-23)",{"type":258,"tag":266,"props":660,"children":661},{},[662,667,669,675],{"type":258,"tag":305,"props":663,"children":664},{},[665],{"type":264,"value":666},"Docker Compose:",{"type":264,"value":668}," The compose file already mounts ",{"type":258,"tag":336,"props":670,"children":672},{"className":671},[],[673],{"type":264,"value":674},"./heaper-data/backups:/mnt/backups",{"type":264,"value":676},". Add to the service environment to enable encrypted backups:",{"type":258,"tag":328,"props":678,"children":681},{"className":679,"code":680,"language":364,"meta":252},[362],"- BACKUP_ENCRYPTION_KEY=your-secure-passphrase\n",[682],{"type":258,"tag":336,"props":683,"children":684},{"__ignoreMap":252},[685],{"type":264,"value":680},{"type":258,"tag":266,"props":687,"children":688},{},[689],{"type":258,"tag":305,"props":690,"children":691},{},[692],{"type":264,"value":693},"Docker run — enable automated backups:",{"type":258,"tag":328,"props":695,"children":698},{"className":696,"code":697,"language":333,"meta":252},[331],"docker run -d --name heaper-selfhost \\\n  --volume /path/to/heaper/backups:/mnt/backups \\\n  # ... other options\n  ghcr.io/janlunge/heaper:latest\n",[699],{"type":258,"tag":336,"props":700,"children":701},{"__ignoreMap":252},[702],{"type":264,"value":697},{"type":258,"tag":266,"props":704,"children":705},{},[706],{"type":258,"tag":305,"props":707,"children":708},{},[709],{"type":264,"value":710},"Docker run — encrypted backups (recommended):",{"type":258,"tag":328,"props":712,"children":715},{"className":713,"code":714,"language":333,"meta":252},[331],"docker run -d --name heaper-selfhost \\\n  -e BACKUP_ENCRYPTION_KEY=your-secure-passphrase \\\n  --volume /path/to/heaper/backups:/mnt/backups \\\n  # ... other options\n  ghcr.io/janlunge/heaper:latest\n",[716],{"type":258,"tag":336,"props":717,"children":718},{"__ignoreMap":252},[719],{"type":264,"value":714},{"type":258,"tag":266,"props":721,"children":722},{},[723],{"type":264,"value":724},"Backup filenames:",{"type":258,"tag":279,"props":726,"children":727},{},[728,739],{"type":258,"tag":283,"props":729,"children":730},{},[731,733],{"type":264,"value":732},"Unencrypted: ",{"type":258,"tag":336,"props":734,"children":736},{"className":735},[],[737],{"type":264,"value":738},"heaper_backup_20240115_030000.sql",{"type":258,"tag":283,"props":740,"children":741},{},[742,744],{"type":264,"value":743},"Encrypted: ",{"type":258,"tag":336,"props":745,"children":747},{"className":746},[],[748],{"type":264,"value":749},"heaper_backup_20240115_030000.sql.enc",{"type":258,"tag":497,"props":751,"children":753},{"id":752},"manual-database-backup",[754],{"type":264,"value":755},"Manual Database Backup",{"type":258,"tag":266,"props":757,"children":758},{},[759,764,766,772,774,780],{"type":258,"tag":305,"props":760,"children":761},{},[762],{"type":264,"value":763},"All-in-one setup",{"type":264,"value":765}," (container name ",{"type":258,"tag":336,"props":767,"children":769},{"className":768},[],[770],{"type":264,"value":771},"heaper",{"type":264,"value":773}," with compose, ",{"type":258,"tag":336,"props":775,"children":777},{"className":776},[],[778],{"type":264,"value":779},"heaper-selfhost",{"type":264,"value":781}," with docker run):",{"type":258,"tag":328,"props":783,"children":786},{"className":784,"code":785,"language":333,"meta":252},[331],"docker exec heaper pg_dump -U heaper heaper > backup.sql\n",[787],{"type":258,"tag":336,"props":788,"children":789},{"__ignoreMap":252},[790],{"type":264,"value":785},{"type":258,"tag":266,"props":792,"children":793},{},[794],{"type":258,"tag":305,"props":795,"children":796},{},[797],{"type":264,"value":798},"Separate containers setup:",{"type":258,"tag":328,"props":800,"children":803},{"className":801,"code":802,"language":333,"meta":252},[331],"docker exec heaper-selfhost-postgres pg_dump -U heaper heaper > backup.sql\n",[804],{"type":258,"tag":336,"props":805,"children":806},{"__ignoreMap":252},[807],{"type":264,"value":802},{"type":258,"tag":497,"props":809,"children":811},{"id":810},"restore-database",[812],{"type":264,"value":813},"Restore Database",{"type":258,"tag":266,"props":815,"children":816},{},[817],{"type":258,"tag":305,"props":818,"children":819},{},[820],{"type":264,"value":821},"All-in-one setup:",{"type":258,"tag":328,"props":823,"children":826},{"className":824,"code":825,"language":333,"meta":252},[331],"docker exec -i heaper psql -U heaper heaper \u003C backup.sql\n",[827],{"type":258,"tag":336,"props":828,"children":829},{"__ignoreMap":252},[830],{"type":264,"value":825},{"type":258,"tag":266,"props":832,"children":833},{},[834],{"type":258,"tag":305,"props":835,"children":836},{},[837],{"type":264,"value":798},{"type":258,"tag":328,"props":839,"children":842},{"className":840,"code":841,"language":333,"meta":252},[331],"docker exec -i heaper-selfhost-postgres psql -U heaper heaper \u003C backup.sql\n",[843],{"type":258,"tag":336,"props":844,"children":845},{"__ignoreMap":252},[846],{"type":264,"value":841},{"type":258,"tag":497,"props":848,"children":850},{"id":849},"decrypt-backup-for-encrypted-backups",[851],{"type":264,"value":852},"Decrypt Backup (for encrypted backups)",{"type":258,"tag":266,"props":854,"children":855},{},[856,858,864],{"type":264,"value":857},"Encrypted backups (",{"type":258,"tag":336,"props":859,"children":861},{"className":860},[],[862],{"type":264,"value":863},".sql.enc",{"type":264,"value":865},") use AES-256-GCM with the nonce prepended. To restore:",{"type":258,"tag":867,"props":868,"children":869},"ol",{},[870,881],{"type":258,"tag":283,"props":871,"children":872},{},[873,875],{"type":264,"value":874},"Unencrypted backups can be restored directly with ",{"type":258,"tag":336,"props":876,"children":878},{"className":877},[],[879],{"type":264,"value":880},"psql",{"type":258,"tag":283,"props":882,"children":883},{},[884],{"type":264,"value":885},"Encrypted backups must be decrypted first (key derived via SHA-256 from passphrase)",{"type":258,"tag":497,"props":887,"children":889},{"id":888},"file-backup",[890],{"type":264,"value":891},"File Backup",{"type":258,"tag":266,"props":893,"children":894},{},[895],{"type":264,"value":896},"Back up your mounted volumes regularly:",{"type":258,"tag":279,"props":898,"children":899},{},[900,910,921,932,943],{"type":258,"tag":283,"props":901,"children":902},{},[903,908],{"type":258,"tag":336,"props":904,"children":906},{"className":905},[],[907],{"type":264,"value":389},{"type":264,"value":909}," — Database files",{"type":258,"tag":283,"props":911,"children":912},{},[913,919],{"type":258,"tag":336,"props":914,"children":916},{"className":915},[],[917],{"type":264,"value":918},"/usr/src/app/config",{"type":264,"value":920}," — Configuration",{"type":258,"tag":283,"props":922,"children":923},{},[924,930],{"type":258,"tag":336,"props":925,"children":927},{"className":926},[],[928],{"type":264,"value":929},"/mnt/thumbnails",{"type":264,"value":931}," — Thumbnails",{"type":258,"tag":283,"props":933,"children":934},{},[935,941],{"type":258,"tag":336,"props":936,"children":938},{"className":937},[],[939],{"type":264,"value":940},"/mnt/storage",{"type":264,"value":942}," — User files",{"type":258,"tag":283,"props":944,"children":945},{},[946,951],{"type":258,"tag":336,"props":947,"children":949},{"className":948},[],[950],{"type":264,"value":557},{"type":264,"value":952}," — Encrypted database backups",{"type":258,"tag":272,"props":954,"children":956},{"id":955},"troubleshooting",[957],{"type":264,"value":958},"Troubleshooting",{"type":258,"tag":497,"props":960,"children":962},{"id":961},"check-service-health",[963],{"type":264,"value":964},"Check Service Health",{"type":258,"tag":328,"props":966,"children":969},{"className":967,"code":968,"language":333,"meta":252},[331],"# Check container health (use heaper for compose, heaper-selfhost for docker run)\ndocker inspect --format='{{.State.Health.Status}}' heaper\n\n# Backend API health (use 3010 for compose default)\ncurl http://localhost:3010/api\n\n# Sync server health\ncurl http://localhost:3010/sync/health\n\n# PostgreSQL health (single container / compose)\ndocker exec heaper pg_isready -h localhost -U heaper\n",[970],{"type":258,"tag":336,"props":971,"children":972},{"__ignoreMap":252},[973],{"type":264,"value":968},{"type":258,"tag":497,"props":975,"children":977},{"id":976},"view-logs",[978],{"type":264,"value":979},"View Logs",{"type":258,"tag":328,"props":981,"children":984},{"className":982,"code":983,"language":333,"meta":252},[331],"# All logs (container name: heaper with compose, heaper-selfhost with docker run)\ndocker logs -f heaper\n\n# Follow specific service logs (via supervisor)\ndocker exec heaper tail -f /var/log/supervisor/*.log\n",[985],{"type":258,"tag":336,"props":986,"children":987},{"__ignoreMap":252},[988],{"type":264,"value":983},{"type":258,"tag":497,"props":990,"children":992},{"id":991},"connect-to-postgresql",[993],{"type":264,"value":994},"Connect to PostgreSQL",{"type":258,"tag":266,"props":996,"children":997},{},[998,1000,1006],{"type":264,"value":999},"With Docker Compose, PostgreSQL is not exposed by default. Uncomment ",{"type":258,"tag":336,"props":1001,"children":1003},{"className":1002},[],[1004],{"type":264,"value":1005},"- \"5432:5432\"",{"type":264,"value":1007}," in the compose file to expose it. Then:",{"type":258,"tag":328,"props":1009,"children":1012},{"className":1010,"code":1011,"language":333,"meta":252},[331],"# Using psql\npsql -h localhost -p 5432 -U heaper -d heaper\n\n# Using a GUI tool (TablePlus, pgAdmin, etc.)\n# Host: localhost (or your server IP)\n# Port: 5432\n# User: heaper\n# Password: your-secure-password\n# Database: heaper\n",[1013],{"type":258,"tag":336,"props":1014,"children":1015},{"__ignoreMap":252},[1016],{"type":264,"value":1011},{"type":258,"tag":272,"props":1018,"children":1020},{"id":1019},"connecting-to-your-server",[1021],{"type":264,"value":1022},"Connecting to Your Server",{"type":258,"tag":266,"props":1024,"children":1025},{},[1026,1028,1033],{"type":264,"value":1027},"To use your self-hosted instance in the heaper app, first login to your cloud account then add a new server via ",{"type":258,"tag":305,"props":1029,"children":1030},{},[1031],{"type":264,"value":1032},"Settings → Heaps → Pull Heap",{"type":264,"value":1034}," and enter the IP or hostname of your server.",{"type":258,"tag":371,"props":1036,"children":1037},{},[1038],{"type":258,"tag":266,"props":1039,"children":1040},{},[1041,1046],{"type":258,"tag":305,"props":1042,"children":1043},{},[1044],{"type":264,"value":1045},"Note:",{"type":264,"value":1047}," For TLS encryption, use a reverse proxy (e.g. Caddy, nginx) in front of heaper with a valid domain and certificate.",{"title":252,"searchDepth":25,"depth":25,"links":1049},[1050,1051,1052,1053,1056,1063,1068],{"id":274,"depth":25,"text":277},{"id":295,"depth":25,"text":298},{"id":342,"depth":25,"text":345},{"id":465,"depth":25,"text":468,"children":1054},[1055],{"id":499,"depth":53,"text":502},{"id":537,"depth":25,"text":540,"children":1057},[1058,1059,1060,1061,1062],{"id":543,"depth":53,"text":546},{"id":752,"depth":53,"text":755},{"id":810,"depth":53,"text":813},{"id":849,"depth":53,"text":852},{"id":888,"depth":53,"text":891},{"id":955,"depth":25,"text":958,"children":1064},[1065,1066,1067],{"id":961,"depth":53,"text":964},{"id":976,"depth":53,"text":979},{"id":991,"depth":53,"text":994},{"id":1019,"depth":25,"text":1022},"markdown","content:docs:self-hosting:index.md","content","docs/self-hosting/index.md","docs/self-hosting/index","md",1774954238269]