[{"data":1,"prerenderedAt":889},["ShallowReactive",2],{"docs-nav":3,"content-query-UL049rF4Wd":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":9,"_dir":250,"_draft":251,"_partial":251,"_locale":252,"title":10,"description":253,"order":7,"body":254,"_type":883,"_id":884,"_source":885,"_file":886,"_stem":887,"_extension":888},"self-hosting",false,"","Self-host heaper with a single Docker container (recommended)",{"type":255,"children":256,"toc":875},"root",[257,266,272,279,291,303,334,352,357,368,386,392,397,406,419,425,454,475,481,637,643,656,837,843],{"type":258,"tag":259,"props":260,"children":262},"element","h1",{"id":261},"all-in-one-setup-recommended",[263],{"type":264,"value":265},"text","All-in-One Setup (Recommended)",{"type":258,"tag":267,"props":268,"children":269},"p",{},[270],{"type":264,"value":271},"The easiest way to self-host heaper. A single Docker image bundles the Go backend, embedded Rust YDoc engine, and PostgreSQL in one container.",{"type":258,"tag":273,"props":274,"children":276},"h2",{"id":275},"docker-compose",[277],{"type":264,"value":278},"Docker Compose",{"type":258,"tag":267,"props":280,"children":281},{},[282,284],{"type":264,"value":283},"Create a ",{"type":258,"tag":285,"props":286,"children":288},"code",{"className":287},[],[289],{"type":264,"value":290},"docker-compose.yml",{"type":258,"tag":292,"props":293,"children":298},"pre",{"className":294,"code":296,"language":297,"meta":252},[295],"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",[299],{"type":258,"tag":285,"props":300,"children":301},{"__ignoreMap":252},[302],{"type":264,"value":296},{"type":258,"tag":304,"props":305,"children":306},"blockquote",{},[307],{"type":258,"tag":267,"props":308,"children":309},{},[310,316,318,324,326,332],{"type":258,"tag":311,"props":312,"children":313},"strong",{},[314],{"type":264,"value":315},"Info:",{"type":264,"value":317}," When using Podman instead of Docker, the Postgres volume (",{"type":258,"tag":285,"props":319,"children":321},{"className":320},[],[322],{"type":264,"value":323},"/var/lib/postgresql/data",{"type":264,"value":325},") 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":285,"props":327,"children":329},{"className":328},[],[330],{"type":264,"value":331},"postgres_data:/var/lib/postgresql/data",{"type":264,"value":333},") instead.",{"type":258,"tag":267,"props":335,"children":336},{},[337,342,344,350],{"type":258,"tag":311,"props":338,"children":339},{},[340],{"type":264,"value":341},"Before first run:",{"type":264,"value":343}," Change ",{"type":258,"tag":285,"props":345,"children":347},{"className":346},[],[348],{"type":264,"value":349},"POSTGRES_PASSWORD",{"type":264,"value":351}," to a secure password.",{"type":258,"tag":267,"props":353,"children":354},{},[355],{"type":264,"value":356},"Start it:",{"type":258,"tag":292,"props":358,"children":363},{"className":359,"code":361,"language":362,"meta":252},[360],"language-bash","docker-compose up -d\n","bash",[364],{"type":258,"tag":285,"props":365,"children":366},{"__ignoreMap":252},[367],{"type":264,"value":361},{"type":258,"tag":267,"props":369,"children":370},{},[371,376,378],{"type":258,"tag":311,"props":372,"children":373},{},[374],{"type":264,"value":375},"Access:",{"type":264,"value":377}," ",{"type":258,"tag":379,"props":380,"children":384},"a",{"href":381,"rel":382},"http://localhost:3010",[383],"nofollow",[385],{"type":264,"value":381},{"type":258,"tag":273,"props":387,"children":389},{"id":388},"docker-run",[390],{"type":264,"value":391},"Docker Run",{"type":258,"tag":267,"props":393,"children":394},{},[395],{"type":264,"value":396},"Same image, without compose:",{"type":258,"tag":292,"props":398,"children":401},{"className":399,"code":400,"language":362,"meta":252},[360],"docker run -d --name heaper-selfhost --platform linux/amd64 \\\n  -p 3010:80 \\\n  -e HOSTNAME=your-domain.com \\\n  -e POSTGRES_PASSWORD=your-secure-password \\\n  --volume /path/to/heaper/postgres:/var/lib/postgresql/data \\\n  --volume /path/to/heaper/config:/usr/src/app/config \\\n  --volume /path/to/heaper/data:/usr/src/app/data \\\n  --volume /path/to/heaper/thumbnails:/mnt/thumbnails \\\n  --volume /path/to/heaper/storage:/mnt/storage \\\n  --volume /path/to/heaper/backups:/mnt/backups \\\n  ghcr.io/janlunge/heaper:latest\n",[402],{"type":258,"tag":285,"props":403,"children":404},{"__ignoreMap":252},[405],{"type":264,"value":400},{"type":258,"tag":267,"props":407,"children":408},{},[409,411,417],{"type":264,"value":410},"Add ",{"type":258,"tag":285,"props":412,"children":414},{"className":413},[],[415],{"type":264,"value":416},"-p 5432:5432",{"type":264,"value":418}," for external PostgreSQL access.",{"type":258,"tag":273,"props":420,"children":422},{"id":421},"nightly-test-builds",[423],{"type":264,"value":424},"Nightly Test Builds",{"type":258,"tag":267,"props":426,"children":427},{},[428,430,436,438,444,446,452],{"type":264,"value":429},"To test the latest pre-release combined image, replace ",{"type":258,"tag":285,"props":431,"children":433},{"className":432},[],[434],{"type":264,"value":435},"ghcr.io/janlunge/heaper:latest",{"type":264,"value":437}," with ",{"type":258,"tag":285,"props":439,"children":441},{"className":440},[],[442],{"type":264,"value":443},"ghcr.io/janlunge/heaper:nightly",{"type":264,"value":445}," in your compose file or ",{"type":258,"tag":285,"props":447,"children":449},{"className":448},[],[450],{"type":264,"value":451},"docker run",{"type":264,"value":453}," command.",{"type":258,"tag":267,"props":455,"children":456},{},[457,459,465,467,473],{"type":264,"value":458},"Keep ",{"type":258,"tag":285,"props":460,"children":462},{"className":461},[],[463],{"type":264,"value":464},":latest",{"type":264,"value":466}," for stable installs. ",{"type":258,"tag":285,"props":468,"children":470},{"className":469},[],[471],{"type":264,"value":472},":nightly",{"type":264,"value":474}," is intended for testing and may contain unfinished changes.",{"type":258,"tag":273,"props":476,"children":478},{"id":477},"environment-variables",[479],{"type":264,"value":480},"Environment Variables",{"type":258,"tag":482,"props":483,"children":484},"table",{},[485,509],{"type":258,"tag":486,"props":487,"children":488},"thead",{},[489],{"type":258,"tag":490,"props":491,"children":492},"tr",{},[493,499,504],{"type":258,"tag":494,"props":495,"children":496},"th",{},[497],{"type":264,"value":498},"Variable",{"type":258,"tag":494,"props":500,"children":501},{},[502],{"type":264,"value":503},"Default",{"type":258,"tag":494,"props":505,"children":506},{},[507],{"type":264,"value":508},"Description",{"type":258,"tag":510,"props":511,"children":512},"tbody",{},[513,536,558,586,607],{"type":258,"tag":490,"props":514,"children":515},{},[516,526,531],{"type":258,"tag":517,"props":518,"children":519},"td",{},[520],{"type":258,"tag":285,"props":521,"children":523},{"className":522},[],[524],{"type":264,"value":525},"HOSTNAME",{"type":258,"tag":517,"props":527,"children":528},{},[529],{"type":264,"value":530},"localhost",{"type":258,"tag":517,"props":532,"children":533},{},[534],{"type":264,"value":535},"Your domain name",{"type":258,"tag":490,"props":537,"children":538},{},[539,548,553],{"type":258,"tag":517,"props":540,"children":541},{},[542],{"type":258,"tag":285,"props":543,"children":545},{"className":544},[],[546],{"type":264,"value":547},"POSTGRES_USER",{"type":258,"tag":517,"props":549,"children":550},{},[551],{"type":264,"value":552},"heaper",{"type":258,"tag":517,"props":554,"children":555},{},[556],{"type":264,"value":557},"PostgreSQL username",{"type":258,"tag":490,"props":559,"children":560},{},[561,569,574],{"type":258,"tag":517,"props":562,"children":563},{},[564],{"type":258,"tag":285,"props":565,"children":567},{"className":566},[],[568],{"type":264,"value":349},{"type":258,"tag":517,"props":570,"children":571},{},[572],{"type":264,"value":573},"change-me-please",{"type":258,"tag":517,"props":575,"children":576},{},[577,579,584],{"type":264,"value":578},"PostgreSQL password (",{"type":258,"tag":311,"props":580,"children":581},{},[582],{"type":264,"value":583},"change this!",{"type":264,"value":585},")",{"type":258,"tag":490,"props":587,"children":588},{},[589,598,602],{"type":258,"tag":517,"props":590,"children":591},{},[592],{"type":258,"tag":285,"props":593,"children":595},{"className":594},[],[596],{"type":264,"value":597},"POSTGRES_DB",{"type":258,"tag":517,"props":599,"children":600},{},[601],{"type":264,"value":552},{"type":258,"tag":517,"props":603,"children":604},{},[605],{"type":264,"value":606},"PostgreSQL database name",{"type":258,"tag":490,"props":608,"children":609},{},[610,619,624],{"type":258,"tag":517,"props":611,"children":612},{},[613],{"type":258,"tag":285,"props":614,"children":616},{"className":615},[],[617],{"type":264,"value":618},"ENABLE_INTERNAL_POSTGRES",{"type":258,"tag":517,"props":620,"children":621},{},[622],{"type":264,"value":623},"true",{"type":258,"tag":517,"props":625,"children":626},{},[627,629,635],{"type":264,"value":628},"Set to ",{"type":258,"tag":285,"props":630,"children":632},{"className":631},[],[633],{"type":264,"value":634},"false",{"type":264,"value":636}," to use external PostgreSQL",{"type":258,"tag":273,"props":638,"children":640},{"id":639},"volumes",[641],{"type":264,"value":642},"Volumes",{"type":258,"tag":267,"props":644,"children":645},{},[646,648,654],{"type":264,"value":647},"All data is stored under ",{"type":258,"tag":285,"props":649,"children":651},{"className":650},[],[652],{"type":264,"value":653},"./heaper-data/",{"type":264,"value":655}," when using Docker Compose:",{"type":258,"tag":482,"props":657,"children":658},{},[659,679],{"type":258,"tag":486,"props":660,"children":661},{},[662],{"type":258,"tag":490,"props":663,"children":664},{},[665,670,675],{"type":258,"tag":494,"props":666,"children":667},{},[668],{"type":264,"value":669},"Volume",{"type":258,"tag":494,"props":671,"children":672},{},[673],{"type":264,"value":674},"Path in container",{"type":258,"tag":494,"props":676,"children":677},{},[678],{"type":264,"value":508},{"type":258,"tag":510,"props":680,"children":681},{},[682,707,733,759,785,811],{"type":258,"tag":490,"props":683,"children":684},{},[685,694,702],{"type":258,"tag":517,"props":686,"children":687},{},[688],{"type":258,"tag":285,"props":689,"children":691},{"className":690},[],[692],{"type":264,"value":693},"postgres",{"type":258,"tag":517,"props":695,"children":696},{},[697],{"type":258,"tag":285,"props":698,"children":700},{"className":699},[],[701],{"type":264,"value":323},{"type":258,"tag":517,"props":703,"children":704},{},[705],{"type":264,"value":706},"PostgreSQL database",{"type":258,"tag":490,"props":708,"children":709},{},[710,719,728],{"type":258,"tag":517,"props":711,"children":712},{},[713],{"type":258,"tag":285,"props":714,"children":716},{"className":715},[],[717],{"type":264,"value":718},"data",{"type":258,"tag":517,"props":720,"children":721},{},[722],{"type":258,"tag":285,"props":723,"children":725},{"className":724},[],[726],{"type":264,"value":727},"/usr/src/app/data",{"type":258,"tag":517,"props":729,"children":730},{},[731],{"type":264,"value":732},"Application data",{"type":258,"tag":490,"props":734,"children":735},{},[736,745,754],{"type":258,"tag":517,"props":737,"children":738},{},[739],{"type":258,"tag":285,"props":740,"children":742},{"className":741},[],[743],{"type":264,"value":744},"config",{"type":258,"tag":517,"props":746,"children":747},{},[748],{"type":258,"tag":285,"props":749,"children":751},{"className":750},[],[752],{"type":264,"value":753},"/usr/src/app/config",{"type":258,"tag":517,"props":755,"children":756},{},[757],{"type":264,"value":758},"Configuration files",{"type":258,"tag":490,"props":760,"children":761},{},[762,771,780],{"type":258,"tag":517,"props":763,"children":764},{},[765],{"type":258,"tag":285,"props":766,"children":768},{"className":767},[],[769],{"type":264,"value":770},"thumbnails",{"type":258,"tag":517,"props":772,"children":773},{},[774],{"type":258,"tag":285,"props":775,"children":777},{"className":776},[],[778],{"type":264,"value":779},"/mnt/thumbnails",{"type":258,"tag":517,"props":781,"children":782},{},[783],{"type":264,"value":784},"Generated thumbnails",{"type":258,"tag":490,"props":786,"children":787},{},[788,797,806],{"type":258,"tag":517,"props":789,"children":790},{},[791],{"type":258,"tag":285,"props":792,"children":794},{"className":793},[],[795],{"type":264,"value":796},"storage",{"type":258,"tag":517,"props":798,"children":799},{},[800],{"type":258,"tag":285,"props":801,"children":803},{"className":802},[],[804],{"type":264,"value":805},"/mnt/storage",{"type":258,"tag":517,"props":807,"children":808},{},[809],{"type":264,"value":810},"File storage",{"type":258,"tag":490,"props":812,"children":813},{},[814,823,832],{"type":258,"tag":517,"props":815,"children":816},{},[817],{"type":258,"tag":285,"props":818,"children":820},{"className":819},[],[821],{"type":264,"value":822},"backups",{"type":258,"tag":517,"props":824,"children":825},{},[826],{"type":258,"tag":285,"props":827,"children":829},{"className":828},[],[830],{"type":264,"value":831},"/mnt/backups",{"type":258,"tag":517,"props":833,"children":834},{},[835],{"type":264,"value":836},"Automated daily backups",{"type":258,"tag":273,"props":838,"children":840},{"id":839},"next-steps",[841],{"type":264,"value":842},"Next Steps",{"type":258,"tag":844,"props":845,"children":846},"ul",{},[847,857,866],{"type":258,"tag":848,"props":849,"children":850},"li",{},[851],{"type":258,"tag":379,"props":852,"children":854},{"href":853},"/docs/self-hosting#backup--restore",[855],{"type":264,"value":856},"Backup & Restore",{"type":258,"tag":848,"props":858,"children":859},{},[860],{"type":258,"tag":379,"props":861,"children":863},{"href":862},"/docs/self-hosting#troubleshooting",[864],{"type":264,"value":865},"Troubleshooting",{"type":258,"tag":848,"props":867,"children":868},{},[869],{"type":258,"tag":379,"props":870,"children":872},{"href":871},"/docs/self-hosting#connecting-to-your-server",[873],{"type":264,"value":874},"Connecting to your server",{"title":252,"searchDepth":25,"depth":25,"links":876},[877,878,879,880,881,882],{"id":275,"depth":25,"text":278},{"id":388,"depth":25,"text":391},{"id":421,"depth":25,"text":424},{"id":477,"depth":25,"text":480},{"id":639,"depth":25,"text":642},{"id":839,"depth":25,"text":842},"markdown","content:docs:self-hosting:all-in-one.md","content","docs/self-hosting/all-in-one.md","docs/self-hosting/all-in-one","md",1774954237979]