[{"data":1,"prerenderedAt":1530},["ShallowReactive",2],{"navigation":3,"\u002Fen\u002Fblog\u002Fself-host-docmost-with-docker-and-traefik":4,"\u002Fen\u002Fblog\u002Fself-host-docmost-with-docker-and-traefik-surround":1519},[],{"id":5,"title":6,"authors":7,"badge":13,"body":14,"date":1508,"description":1509,"extension":1510,"image":1511,"lastUpdated":1513,"meta":1514,"navigation":422,"path":1515,"published":422,"seo":1516,"stem":1517,"tags":13,"__hash__":1518},"posts\u002Fen\u002F3.blog\u002F5.self-host-docmost-with-docker-and-traefik.md","Self-Host Docmost with Docker Compose and Traefik: Complete Guide",[8],{"name":9,"to":10,"avatar":11},"Florian Karbus","\u002Fabout\u002Ffloriankarbus",{"src":12},"\u002Fimages\u002Fblog\u002Fauthors\u002Fflorian.png",null,{"type":15,"value":16,"toc":1489},"minimark",[17,22,31,36,39,73,78,84,90,96,102,106,109,153,156,160,163,192,195,206,209,213,216,248,252,255,274,278,281,301,308,530,536,683,686,719,722,740,744,747,758,761,780,786,1233,1247,1251,1254,1273,1277,1280,1294,1297,1311,1314,1318,1324,1335,1339,1343,1346,1376,1380,1400,1404,1407,1418,1423,1430,1452,1455,1461,1470,1473,1485],[18,19,21],"h1",{"id":20},"self-host-docmost-your-private-documentation-platform","Self-Host Docmost: Your Private Documentation Platform",[23,24,25,26,30],"p",{},"Cloud-based documentation tools like Notion or Confluence store your sensitive data on third-party servers, often outside the EU. The solution? Self-hosting ",[27,28,29],"strong",{},"Docmost"," – an open-source platform that gives you full control. In this guide, we'll set up Docmost with Docker Compose and Traefik.",[32,33,35],"h2",{"id":34},"what-is-docmost","What is Docmost?",[23,37,38],{},"Docmost is a modern, open-source documentation and wiki platform. Think of it as a self-hosted alternative to Notion or Confluence. It offers:",[40,41,42,49,55,61,67],"ul",{},[43,44,45,48],"li",{},[27,46,47],{},"Real-time collaboration",": Multiple users can edit documents simultaneously",[43,50,51,54],{},[27,52,53],{},"Nested pages",": Organize your documentation in a hierarchical structure",[43,56,57,60],{},[27,58,59],{},"Rich text editor",": A powerful WYSIWYG editor with markdown support",[43,62,63,66],{},[27,64,65],{},"Workspaces",": Separate spaces for different teams or projects",[43,68,69,72],{},[27,70,71],{},"Full-text search",": Find any document instantly",[74,75,77],"h3",{"id":76},"why-self-host-docmost","Why Self-Host Docmost?",[23,79,80,83],{},[27,81,82],{},"Data Sovereignty",": Your documentation contains sensitive business information. Self-hosting ensures this data never leaves your infrastructure.",[23,85,86,89],{},[27,87,88],{},"GDPR Compliance",": By hosting in Germany or the EU, you maintain full compliance with data protection regulations.",[23,91,92,95],{},[27,93,94],{},"No Vendor Lock-in",": You own your data and can migrate or back it up whenever you want.",[23,97,98,101],{},[27,99,100],{},"Cost Savings",": No per-user pricing. Host unlimited users on your own server.",[32,103,105],{"id":104},"technical-requirements","Technical Requirements",[23,107,108],{},"Before we start, make sure you have:",[40,110,111,118,143,150],{},[43,112,113,114,117],{},"A server or VPS with at least ",[27,115,116],{},"2 GB RAM"," (4 GB recommended)",[43,119,120,127,128,134,135,142],{},[27,121,122],{},[123,124,126],"a",{"href":125},"\u002Fen\u002Fblog\u002Fhow-docker-works","Docker"," and ",[27,129,130],{},[123,131,133],{"href":132},"\u002Fen\u002Fblog\u002Fdocker-compose-for-beginners","Docker Compose"," installed (",[123,136,141],{"href":137,":target":138,"rel":139},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Finstall\u002F","\\_blank",[140],"nofollow","official installation guide",")",[43,144,145,146,149],{},"A ",[27,147,148],{},"domain name"," pointing to your server",[43,151,152],{},"Basic knowledge of the command line",[23,154,155],{},"For this tutorial, we'll use a Hetzner Cloud server, but any VPS provider works.",[32,157,159],{"id":158},"understanding-the-architecture","Understanding the Architecture",[23,161,162],{},"Our setup consists of four main components:",[164,165,166,171,180,186],"ol",{},[43,167,168,170],{},[27,169,29],{},": The main application",[43,172,173,179],{},[27,174,175],{},[123,176,178],{"href":177},"\u002Fen\u002Fblog\u002Fpostgresql-helm-chart-kubernetes","PostgreSQL",": Database for storing all documentation data",[43,181,182,185],{},[27,183,184],{},"Redis",": Cache and session storage for better performance",[43,187,188,191],{},[27,189,190],{},"Traefik",": Reverse proxy handling SSL certificates and routing",[23,193,194],{},"Here's how they work together:",[196,197,202],"pre",{"className":198,"code":200,"language":201},[199],"language-text","Internet → Traefik (SSL) → Docmost → PostgreSQL\u002FRedis\n","text",[203,204,200],"code",{"__ignoreMap":205},"",[23,207,208],{},"Traefik automatically obtains Let's Encrypt SSL certificates, so your documentation is always served over HTTPS.",[32,210,212],{"id":211},"step-1-prepare-your-server","Step 1: Prepare Your Server",[23,214,215],{},"First, connect to your server via SSH and create a directory for Docmost:",[196,217,221],{"className":218,"code":219,"language":220,"meta":205,"style":205},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","mkdir -p ~\u002Fdocmost\ncd ~\u002Fdocmost\n","bash",[203,222,223,239],{"__ignoreMap":205},[224,225,228,232,236],"span",{"class":226,"line":227},"line",1,[224,229,231],{"class":230},"sBMFI","mkdir",[224,233,235],{"class":234},"sfazB"," -p",[224,237,238],{"class":234}," ~\u002Fdocmost\n",[224,240,242,246],{"class":226,"line":241},2,[224,243,245],{"class":244},"s2Zo4","cd",[224,247,238],{"class":234},[32,249,251],{"id":250},"step-2-create-the-docker-network","Step 2: Create the Docker Network",[23,253,254],{},"Traefik needs a shared network to communicate with Docmost:",[196,256,258],{"className":218,"code":257,"language":220,"meta":205,"style":205},"docker network create web\n",[203,259,260],{"__ignoreMap":205},[224,261,262,265,268,271],{"class":226,"line":227},[224,263,264],{"class":230},"docker",[224,266,267],{"class":234}," network",[224,269,270],{"class":234}," create",[224,272,273],{"class":234}," web\n",[32,275,277],{"id":276},"step-3-set-up-traefik","Step 3: Set Up Traefik",[23,279,280],{},"Create a directory for Traefik and its configuration:",[196,282,284],{"className":218,"code":283,"language":220,"meta":205,"style":205},"mkdir -p ~\u002Ftraefik\ncd ~\u002Ftraefik\n",[203,285,286,295],{"__ignoreMap":205},[224,287,288,290,292],{"class":226,"line":227},[224,289,231],{"class":230},[224,291,235],{"class":234},[224,293,294],{"class":234}," ~\u002Ftraefik\n",[224,296,297,299],{"class":226,"line":241},[224,298,245],{"class":244},[224,300,294],{"class":234},[23,302,303,304,307],{},"Create the Traefik configuration file ",[203,305,306],{},"traefik.yml",":",[196,309,313],{"className":310,"code":311,"language":312,"meta":205,"style":205},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","entryPoints:\n  web:\n    address: ':80'\n    http:\n      redirections:\n        entryPoint:\n          to: websecure\n          scheme: https\n  websecure:\n    address: ':443'\n\ncertificatesResolvers:\n  letsencrypt:\n    acme:\n      email: your-email@example.com\n      storage: \u002Fletsencrypt\u002Facme.json\n      httpChallenge:\n        entryPoint: web\n\nproviders:\n  docker:\n    exposedByDefault: false\n    network: web\n","yaml",[203,314,315,325,332,349,357,365,373,384,395,403,417,424,432,440,448,459,470,478,487,492,500,508,520],{"__ignoreMap":205},[224,316,317,321],{"class":226,"line":227},[224,318,320],{"class":319},"swJcz","entryPoints",[224,322,324],{"class":323},"sMK4o",":\n",[224,326,327,330],{"class":226,"line":241},[224,328,329],{"class":319},"  web",[224,331,324],{"class":323},[224,333,335,338,340,343,346],{"class":226,"line":334},3,[224,336,337],{"class":319},"    address",[224,339,307],{"class":323},[224,341,342],{"class":323}," '",[224,344,345],{"class":234},":80",[224,347,348],{"class":323},"'\n",[224,350,352,355],{"class":226,"line":351},4,[224,353,354],{"class":319},"    http",[224,356,324],{"class":323},[224,358,360,363],{"class":226,"line":359},5,[224,361,362],{"class":319},"      redirections",[224,364,324],{"class":323},[224,366,368,371],{"class":226,"line":367},6,[224,369,370],{"class":319},"        entryPoint",[224,372,324],{"class":323},[224,374,376,379,381],{"class":226,"line":375},7,[224,377,378],{"class":319},"          to",[224,380,307],{"class":323},[224,382,383],{"class":234}," websecure\n",[224,385,387,390,392],{"class":226,"line":386},8,[224,388,389],{"class":319},"          scheme",[224,391,307],{"class":323},[224,393,394],{"class":234}," https\n",[224,396,398,401],{"class":226,"line":397},9,[224,399,400],{"class":319},"  websecure",[224,402,324],{"class":323},[224,404,406,408,410,412,415],{"class":226,"line":405},10,[224,407,337],{"class":319},[224,409,307],{"class":323},[224,411,342],{"class":323},[224,413,414],{"class":234},":443",[224,416,348],{"class":323},[224,418,420],{"class":226,"line":419},11,[224,421,423],{"emptyLinePlaceholder":422},true,"\n",[224,425,427,430],{"class":226,"line":426},12,[224,428,429],{"class":319},"certificatesResolvers",[224,431,324],{"class":323},[224,433,435,438],{"class":226,"line":434},13,[224,436,437],{"class":319},"  letsencrypt",[224,439,324],{"class":323},[224,441,443,446],{"class":226,"line":442},14,[224,444,445],{"class":319},"    acme",[224,447,324],{"class":323},[224,449,451,454,456],{"class":226,"line":450},15,[224,452,453],{"class":319},"      email",[224,455,307],{"class":323},[224,457,458],{"class":234}," your-email@example.com\n",[224,460,462,465,467],{"class":226,"line":461},16,[224,463,464],{"class":319},"      storage",[224,466,307],{"class":323},[224,468,469],{"class":234}," \u002Fletsencrypt\u002Facme.json\n",[224,471,473,476],{"class":226,"line":472},17,[224,474,475],{"class":319},"      httpChallenge",[224,477,324],{"class":323},[224,479,481,483,485],{"class":226,"line":480},18,[224,482,370],{"class":319},[224,484,307],{"class":323},[224,486,273],{"class":234},[224,488,490],{"class":226,"line":489},19,[224,491,423],{"emptyLinePlaceholder":422},[224,493,495,498],{"class":226,"line":494},20,[224,496,497],{"class":319},"providers",[224,499,324],{"class":323},[224,501,503,506],{"class":226,"line":502},21,[224,504,505],{"class":319},"  docker",[224,507,324],{"class":323},[224,509,511,514,516],{"class":226,"line":510},22,[224,512,513],{"class":319},"    exposedByDefault",[224,515,307],{"class":323},[224,517,519],{"class":518},"sfNiH"," false\n",[224,521,523,526,528],{"class":226,"line":522},23,[224,524,525],{"class":319},"    network",[224,527,307],{"class":323},[224,529,273],{"class":234},[23,531,532,533,307],{},"Create the Traefik ",[203,534,535],{},"docker-compose.yml",[196,537,539],{"className":310,"code":538,"language":312,"meta":205,"style":205},"services:\n  traefik:\n    image: traefik:v3.6\n    container_name: traefik\n    restart: always\n    ports:\n      - '80:80'\n      - '443:443'\n    volumes:\n      - .\u002Ftraefik.yml:\u002Fetc\u002Ftraefik\u002Ftraefik.yml:ro\n      - .\u002Fletsencrypt:\u002Fletsencrypt\n      - \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock:ro\n    networks:\n      - web\n\nnetworks:\n  web:\n    external: true\n",[203,540,541,548,555,565,575,585,592,604,615,622,629,636,643,650,656,660,667,673],{"__ignoreMap":205},[224,542,543,546],{"class":226,"line":227},[224,544,545],{"class":319},"services",[224,547,324],{"class":323},[224,549,550,553],{"class":226,"line":241},[224,551,552],{"class":319},"  traefik",[224,554,324],{"class":323},[224,556,557,560,562],{"class":226,"line":334},[224,558,559],{"class":319},"    image",[224,561,307],{"class":323},[224,563,564],{"class":234}," traefik:v3.6\n",[224,566,567,570,572],{"class":226,"line":351},[224,568,569],{"class":319},"    container_name",[224,571,307],{"class":323},[224,573,574],{"class":234}," traefik\n",[224,576,577,580,582],{"class":226,"line":359},[224,578,579],{"class":319},"    restart",[224,581,307],{"class":323},[224,583,584],{"class":234}," always\n",[224,586,587,590],{"class":226,"line":367},[224,588,589],{"class":319},"    ports",[224,591,324],{"class":323},[224,593,594,597,599,602],{"class":226,"line":375},[224,595,596],{"class":323},"      -",[224,598,342],{"class":323},[224,600,601],{"class":234},"80:80",[224,603,348],{"class":323},[224,605,606,608,610,613],{"class":226,"line":386},[224,607,596],{"class":323},[224,609,342],{"class":323},[224,611,612],{"class":234},"443:443",[224,614,348],{"class":323},[224,616,617,620],{"class":226,"line":397},[224,618,619],{"class":319},"    volumes",[224,621,324],{"class":323},[224,623,624,626],{"class":226,"line":405},[224,625,596],{"class":323},[224,627,628],{"class":234}," .\u002Ftraefik.yml:\u002Fetc\u002Ftraefik\u002Ftraefik.yml:ro\n",[224,630,631,633],{"class":226,"line":419},[224,632,596],{"class":323},[224,634,635],{"class":234}," .\u002Fletsencrypt:\u002Fletsencrypt\n",[224,637,638,640],{"class":226,"line":426},[224,639,596],{"class":323},[224,641,642],{"class":234}," \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock:ro\n",[224,644,645,648],{"class":226,"line":434},[224,646,647],{"class":319},"    networks",[224,649,324],{"class":323},[224,651,652,654],{"class":226,"line":442},[224,653,596],{"class":323},[224,655,273],{"class":234},[224,657,658],{"class":226,"line":450},[224,659,423],{"emptyLinePlaceholder":422},[224,661,662,665],{"class":226,"line":461},[224,663,664],{"class":319},"networks",[224,666,324],{"class":323},[224,668,669,671],{"class":226,"line":472},[224,670,329],{"class":319},[224,672,324],{"class":323},[224,674,675,678,680],{"class":226,"line":480},[224,676,677],{"class":319},"    external",[224,679,307],{"class":323},[224,681,682],{"class":518}," true\n",[23,684,685],{},"Create the Let's Encrypt storage file:",[196,687,689],{"className":218,"code":688,"language":220,"meta":205,"style":205},"mkdir -p letsencrypt\ntouch letsencrypt\u002Facme.json\nchmod 600 letsencrypt\u002Facme.json\n",[203,690,691,700,708],{"__ignoreMap":205},[224,692,693,695,697],{"class":226,"line":227},[224,694,231],{"class":230},[224,696,235],{"class":234},[224,698,699],{"class":234}," letsencrypt\n",[224,701,702,705],{"class":226,"line":241},[224,703,704],{"class":230},"touch",[224,706,707],{"class":234}," letsencrypt\u002Facme.json\n",[224,709,710,713,717],{"class":226,"line":334},[224,711,712],{"class":230},"chmod",[224,714,716],{"class":715},"sbssI"," 600",[224,718,707],{"class":234},[23,720,721],{},"Start Traefik:",[196,723,725],{"className":218,"code":724,"language":220,"meta":205,"style":205},"docker compose up -d\n",[203,726,727],{"__ignoreMap":205},[224,728,729,731,734,737],{"class":226,"line":227},[224,730,264],{"class":230},[224,732,733],{"class":234}," compose",[224,735,736],{"class":234}," up",[224,738,739],{"class":234}," -d\n",[32,741,743],{"id":742},"step-4-set-up-docmost","Step 4: Set Up Docmost",[23,745,746],{},"Navigate back to the Docmost directory:",[196,748,750],{"className":218,"code":749,"language":220,"meta":205,"style":205},"cd ~\u002Fdocmost\n",[203,751,752],{"__ignoreMap":205},[224,753,754,756],{"class":226,"line":227},[224,755,245],{"class":244},[224,757,238],{"class":234},[23,759,760],{},"Generate a secure secret key for your application:",[196,762,764],{"className":218,"code":763,"language":220,"meta":205,"style":205},"openssl rand -hex 32\n",[203,765,766],{"__ignoreMap":205},[224,767,768,771,774,777],{"class":226,"line":227},[224,769,770],{"class":230},"openssl",[224,772,773],{"class":234}," rand",[224,775,776],{"class":234}," -hex",[224,778,779],{"class":715}," 32\n",[23,781,782,783,785],{},"Create the ",[203,784,535],{}," for Docmost:",[196,787,789],{"className":310,"code":788,"language":312,"meta":205,"style":205},"services:\n  docmost:\n    image: docmost\u002Fdocmost:latest\n    depends_on:\n      - db\n      - redis\n    environment:\n      APP_URL: 'https:\u002F\u002Fdocs.your-domain.de'\n      APP_SECRET: 'REPLACE_WITH_LONG_SECRET'\n      DATABASE_URL: 'postgresql:\u002F\u002Fdocmost:STRONG_DB_PASSWORD@db:5432\u002Fdocmost?schema=public'\n      REDIS_URL: 'redis:\u002F\u002Fredis:6379'\n    restart: unless-stopped\n    volumes:\n      - docmost:\u002Fapp\u002Fdata\u002Fstorage\n    networks:\n      - web\n      - internal\n    labels:\n      - 'traefik.enable=true'\n      - 'traefik.http.routers.docmost.rule=Host(`docs.your-domain.de`)'\n      - 'traefik.http.routers.docmost.entrypoints=websecure'\n      - 'traefik.http.routers.docmost.tls.certresolver=letsencrypt'\n      - 'traefik.http.services.docmost.loadbalancer.server.port=3000'\n\n  db:\n    image: postgres:16-alpine\n    environment:\n      POSTGRES_DB: docmost\n      POSTGRES_USER: docmost\n      POSTGRES_PASSWORD: STRONG_DB_PASSWORD\n    restart: unless-stopped\n    volumes:\n      - db_data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n    networks:\n      - internal\n\n  redis:\n    image: redis:7.2-alpine\n    restart: unless-stopped\n    volumes:\n      - redis_data:\u002Fdata\n    networks:\n      - internal\n\nvolumes:\n  docmost:\n  db_data:\n  redis_data:\n\nnetworks:\n  web:\n    external: true\n  internal:\n",[203,790,791,797,804,813,820,827,834,841,855,869,883,897,906,912,919,925,931,938,945,956,967,978,989,1000,1005,1013,1023,1030,1041,1051,1062,1071,1078,1086,1093,1100,1105,1113,1123,1132,1139,1147,1154,1161,1166,1174,1181,1189,1197,1202,1209,1216,1225],{"__ignoreMap":205},[224,792,793,795],{"class":226,"line":227},[224,794,545],{"class":319},[224,796,324],{"class":323},[224,798,799,802],{"class":226,"line":241},[224,800,801],{"class":319},"  docmost",[224,803,324],{"class":323},[224,805,806,808,810],{"class":226,"line":334},[224,807,559],{"class":319},[224,809,307],{"class":323},[224,811,812],{"class":234}," docmost\u002Fdocmost:latest\n",[224,814,815,818],{"class":226,"line":351},[224,816,817],{"class":319},"    depends_on",[224,819,324],{"class":323},[224,821,822,824],{"class":226,"line":359},[224,823,596],{"class":323},[224,825,826],{"class":234}," db\n",[224,828,829,831],{"class":226,"line":367},[224,830,596],{"class":323},[224,832,833],{"class":234}," redis\n",[224,835,836,839],{"class":226,"line":375},[224,837,838],{"class":319},"    environment",[224,840,324],{"class":323},[224,842,843,846,848,850,853],{"class":226,"line":386},[224,844,845],{"class":319},"      APP_URL",[224,847,307],{"class":323},[224,849,342],{"class":323},[224,851,852],{"class":234},"https:\u002F\u002Fdocs.your-domain.de",[224,854,348],{"class":323},[224,856,857,860,862,864,867],{"class":226,"line":397},[224,858,859],{"class":319},"      APP_SECRET",[224,861,307],{"class":323},[224,863,342],{"class":323},[224,865,866],{"class":234},"REPLACE_WITH_LONG_SECRET",[224,868,348],{"class":323},[224,870,871,874,876,878,881],{"class":226,"line":405},[224,872,873],{"class":319},"      DATABASE_URL",[224,875,307],{"class":323},[224,877,342],{"class":323},[224,879,880],{"class":234},"postgresql:\u002F\u002Fdocmost:STRONG_DB_PASSWORD@db:5432\u002Fdocmost?schema=public",[224,882,348],{"class":323},[224,884,885,888,890,892,895],{"class":226,"line":419},[224,886,887],{"class":319},"      REDIS_URL",[224,889,307],{"class":323},[224,891,342],{"class":323},[224,893,894],{"class":234},"redis:\u002F\u002Fredis:6379",[224,896,348],{"class":323},[224,898,899,901,903],{"class":226,"line":426},[224,900,579],{"class":319},[224,902,307],{"class":323},[224,904,905],{"class":234}," unless-stopped\n",[224,907,908,910],{"class":226,"line":434},[224,909,619],{"class":319},[224,911,324],{"class":323},[224,913,914,916],{"class":226,"line":442},[224,915,596],{"class":323},[224,917,918],{"class":234}," docmost:\u002Fapp\u002Fdata\u002Fstorage\n",[224,920,921,923],{"class":226,"line":450},[224,922,647],{"class":319},[224,924,324],{"class":323},[224,926,927,929],{"class":226,"line":461},[224,928,596],{"class":323},[224,930,273],{"class":234},[224,932,933,935],{"class":226,"line":472},[224,934,596],{"class":323},[224,936,937],{"class":234}," internal\n",[224,939,940,943],{"class":226,"line":480},[224,941,942],{"class":319},"    labels",[224,944,324],{"class":323},[224,946,947,949,951,954],{"class":226,"line":489},[224,948,596],{"class":323},[224,950,342],{"class":323},[224,952,953],{"class":234},"traefik.enable=true",[224,955,348],{"class":323},[224,957,958,960,962,965],{"class":226,"line":494},[224,959,596],{"class":323},[224,961,342],{"class":323},[224,963,964],{"class":234},"traefik.http.routers.docmost.rule=Host(`docs.your-domain.de`)",[224,966,348],{"class":323},[224,968,969,971,973,976],{"class":226,"line":502},[224,970,596],{"class":323},[224,972,342],{"class":323},[224,974,975],{"class":234},"traefik.http.routers.docmost.entrypoints=websecure",[224,977,348],{"class":323},[224,979,980,982,984,987],{"class":226,"line":510},[224,981,596],{"class":323},[224,983,342],{"class":323},[224,985,986],{"class":234},"traefik.http.routers.docmost.tls.certresolver=letsencrypt",[224,988,348],{"class":323},[224,990,991,993,995,998],{"class":226,"line":522},[224,992,596],{"class":323},[224,994,342],{"class":323},[224,996,997],{"class":234},"traefik.http.services.docmost.loadbalancer.server.port=3000",[224,999,348],{"class":323},[224,1001,1003],{"class":226,"line":1002},24,[224,1004,423],{"emptyLinePlaceholder":422},[224,1006,1008,1011],{"class":226,"line":1007},25,[224,1009,1010],{"class":319},"  db",[224,1012,324],{"class":323},[224,1014,1016,1018,1020],{"class":226,"line":1015},26,[224,1017,559],{"class":319},[224,1019,307],{"class":323},[224,1021,1022],{"class":234}," postgres:16-alpine\n",[224,1024,1026,1028],{"class":226,"line":1025},27,[224,1027,838],{"class":319},[224,1029,324],{"class":323},[224,1031,1033,1036,1038],{"class":226,"line":1032},28,[224,1034,1035],{"class":319},"      POSTGRES_DB",[224,1037,307],{"class":323},[224,1039,1040],{"class":234}," docmost\n",[224,1042,1044,1047,1049],{"class":226,"line":1043},29,[224,1045,1046],{"class":319},"      POSTGRES_USER",[224,1048,307],{"class":323},[224,1050,1040],{"class":234},[224,1052,1054,1057,1059],{"class":226,"line":1053},30,[224,1055,1056],{"class":319},"      POSTGRES_PASSWORD",[224,1058,307],{"class":323},[224,1060,1061],{"class":234}," STRONG_DB_PASSWORD\n",[224,1063,1065,1067,1069],{"class":226,"line":1064},31,[224,1066,579],{"class":319},[224,1068,307],{"class":323},[224,1070,905],{"class":234},[224,1072,1074,1076],{"class":226,"line":1073},32,[224,1075,619],{"class":319},[224,1077,324],{"class":323},[224,1079,1081,1083],{"class":226,"line":1080},33,[224,1082,596],{"class":323},[224,1084,1085],{"class":234}," db_data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n",[224,1087,1089,1091],{"class":226,"line":1088},34,[224,1090,647],{"class":319},[224,1092,324],{"class":323},[224,1094,1096,1098],{"class":226,"line":1095},35,[224,1097,596],{"class":323},[224,1099,937],{"class":234},[224,1101,1103],{"class":226,"line":1102},36,[224,1104,423],{"emptyLinePlaceholder":422},[224,1106,1108,1111],{"class":226,"line":1107},37,[224,1109,1110],{"class":319},"  redis",[224,1112,324],{"class":323},[224,1114,1116,1118,1120],{"class":226,"line":1115},38,[224,1117,559],{"class":319},[224,1119,307],{"class":323},[224,1121,1122],{"class":234}," redis:7.2-alpine\n",[224,1124,1126,1128,1130],{"class":226,"line":1125},39,[224,1127,579],{"class":319},[224,1129,307],{"class":323},[224,1131,905],{"class":234},[224,1133,1135,1137],{"class":226,"line":1134},40,[224,1136,619],{"class":319},[224,1138,324],{"class":323},[224,1140,1142,1144],{"class":226,"line":1141},41,[224,1143,596],{"class":323},[224,1145,1146],{"class":234}," redis_data:\u002Fdata\n",[224,1148,1150,1152],{"class":226,"line":1149},42,[224,1151,647],{"class":319},[224,1153,324],{"class":323},[224,1155,1157,1159],{"class":226,"line":1156},43,[224,1158,596],{"class":323},[224,1160,937],{"class":234},[224,1162,1164],{"class":226,"line":1163},44,[224,1165,423],{"emptyLinePlaceholder":422},[224,1167,1169,1172],{"class":226,"line":1168},45,[224,1170,1171],{"class":319},"volumes",[224,1173,324],{"class":323},[224,1175,1177,1179],{"class":226,"line":1176},46,[224,1178,801],{"class":319},[224,1180,324],{"class":323},[224,1182,1184,1187],{"class":226,"line":1183},47,[224,1185,1186],{"class":319},"  db_data",[224,1188,324],{"class":323},[224,1190,1192,1195],{"class":226,"line":1191},48,[224,1193,1194],{"class":319},"  redis_data",[224,1196,324],{"class":323},[224,1198,1200],{"class":226,"line":1199},49,[224,1201,423],{"emptyLinePlaceholder":422},[224,1203,1205,1207],{"class":226,"line":1204},50,[224,1206,664],{"class":319},[224,1208,324],{"class":323},[224,1210,1212,1214],{"class":226,"line":1211},51,[224,1213,329],{"class":319},[224,1215,324],{"class":323},[224,1217,1219,1221,1223],{"class":226,"line":1218},52,[224,1220,677],{"class":319},[224,1222,307],{"class":323},[224,1224,682],{"class":518},[224,1226,1228,1231],{"class":226,"line":1227},53,[224,1229,1230],{"class":319},"  internal",[224,1232,324],{"class":323},[23,1234,1235,1236,1238,1239,1242,1243,1246],{},"Replace ",[203,1237,866],{}," with the secret key you generated using ",[203,1240,1241],{},"openssl rand -hex 32",", and ",[203,1244,1245],{},"STRONG_DB_PASSWORD"," with a secure database password (you can generate one the same way).",[32,1248,1250],{"id":1249},"step-5-configure-dns","Step 5: Configure DNS",[23,1252,1253],{},"Before starting Docmost, make sure your DNS is configured:",[164,1255,1256,1259,1270],{},[43,1257,1258],{},"Log into your domain registrar",[43,1260,1261,1262,1265,1266,1269],{},"Create an ",[27,1263,1264],{},"A record"," pointing ",[203,1267,1268],{},"docs.your-domain.de"," to your server's IP address",[43,1271,1272],{},"Wait for DNS propagation (usually a few minutes)",[32,1274,1276],{"id":1275},"step-6-launch-docmost","Step 6: Launch Docmost",[23,1278,1279],{},"Start all services:",[196,1281,1282],{"className":218,"code":724,"language":220,"meta":205,"style":205},[203,1283,1284],{"__ignoreMap":205},[224,1285,1286,1288,1290,1292],{"class":226,"line":227},[224,1287,264],{"class":230},[224,1289,733],{"class":234},[224,1291,736],{"class":234},[224,1293,739],{"class":234},[23,1295,1296],{},"Check if everything is running:",[196,1298,1300],{"className":218,"code":1299,"language":220,"meta":205,"style":205},"docker compose ps\n",[203,1301,1302],{"__ignoreMap":205},[224,1303,1304,1306,1308],{"class":226,"line":227},[224,1305,264],{"class":230},[224,1307,733],{"class":234},[224,1309,1310],{"class":234}," ps\n",[23,1312,1313],{},"You should see all three containers (docmost, db, redis) in a \"running\" state.",[32,1315,1317],{"id":1316},"step-7-initial-setup","Step 7: Initial Setup",[23,1319,1320,1321,1323],{},"Open ",[203,1322,852],{}," in your browser. You'll be greeted by the Docmost setup wizard:",[164,1325,1326,1329,1332],{},[43,1327,1328],{},"Create your admin account",[43,1330,1331],{},"Set up your first workspace",[43,1333,1334],{},"Start documenting!",[32,1336,1338],{"id":1337},"maintenance","Maintenance",[74,1340,1342],{"id":1341},"updating-docmost","Updating Docmost",[23,1344,1345],{},"To update to the latest version:",[196,1347,1349],{"className":218,"code":1348,"language":220,"meta":205,"style":205},"cd ~\u002Fdocmost\ndocker compose pull\ndocker compose up -d\n",[203,1350,1351,1357,1366],{"__ignoreMap":205},[224,1352,1353,1355],{"class":226,"line":227},[224,1354,245],{"class":244},[224,1356,238],{"class":234},[224,1358,1359,1361,1363],{"class":226,"line":241},[224,1360,264],{"class":230},[224,1362,733],{"class":234},[224,1364,1365],{"class":234}," pull\n",[224,1367,1368,1370,1372,1374],{"class":226,"line":334},[224,1369,264],{"class":230},[224,1371,733],{"class":234},[224,1373,736],{"class":234},[224,1375,739],{"class":234},[32,1377,1379],{"id":1378},"security-best-practices","Security Best Practices",[164,1381,1382,1388,1394],{},[43,1383,1384,1387],{},[27,1385,1386],{},"Use strong passwords",": Generate random passwords for the database and APP_SECRET",[43,1389,1390,1393],{},[27,1391,1392],{},"Enable firewall",": Only expose ports 80 and 443",[43,1395,1396,1399],{},[27,1397,1398],{},"Regular updates",": Keep Docker images up to date",[32,1401,1403],{"id":1402},"the-easier-way-deploy-with-lowcloud","The Easier Way: Deploy with lowcloud",[23,1405,1406],{},"While this tutorial gives you full control, setting up Docmost manually requires:",[40,1408,1409,1412,1415],{},[43,1410,1411],{},"Server provisioning and SSH configuration",[43,1413,1414],{},"Docker installation and management",[43,1416,1417],{},"Traefik configuration for SSL",[23,1419,1420],{},[27,1421,1422],{},"What if all of this could be automated?",[23,1424,1425,1426,1429],{},"With ",[27,1427,1428],{},"lowcloud",", you can deploy Docmost – or any application with a Docker Compose file – with just a few clicks:",[164,1431,1432,1438,1446],{},[43,1433,1434,1437],{},[27,1435,1436],{},"Connect your Hetzner account"," – link your infrastructure with an API token",[43,1439,1440,1443,1444],{},[27,1441,1442],{},"Configure your compose service"," – paste your ",[203,1445,535],{},[43,1447,1448,1451],{},[27,1449,1450],{},"Hit deploy"," – lowcloud handles the rest",[23,1453,1454],{},"lowcloud automatically provisions your VM, sets up the reverse proxy with SSL, and keeps everything updated. Whether it's Docmost, n8n, or your own custom stack – if it runs with Docker Compose, lowcloud can deploy it. Your data stays on your own server in Germany, fully GDPR-compliant.",[23,1456,1457,1460],{},[27,1458,1459],{},"The result",": All the benefits of self-hosting without the DevOps overhead.",[23,1462,1463,1464,1469],{},"Ready to simplify your deployment workflow? ",[123,1465,1468],{"href":1466,":target":138,"rel":1467},"https:\u002F\u002Fapp.lowcloud.de",[140],"Get started with lowcloud"," and deploy Docmost in under 10 minutes.",[1471,1472],"hr",{},[23,1474,1475],{},[1476,1477,1478,1479,1484],"em",{},"For more information about Docmost, visit the ",[123,1480,1483],{"href":1481,":target":138,"rel":1482},"https:\u002F\u002Fdocmost.com\u002Fdocs",[140],"official documentation",". Questions about deployment? The lowcloud team is happy to help.",[1486,1487,1488],"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 pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":205,"searchDepth":241,"depth":241,"links":1490},[1491,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1506,1507],{"id":34,"depth":241,"text":35,"children":1492},[1493],{"id":76,"depth":334,"text":77},{"id":104,"depth":241,"text":105},{"id":158,"depth":241,"text":159},{"id":211,"depth":241,"text":212},{"id":250,"depth":241,"text":251},{"id":276,"depth":241,"text":277},{"id":742,"depth":241,"text":743},{"id":1249,"depth":241,"text":1250},{"id":1275,"depth":241,"text":1276},{"id":1316,"depth":241,"text":1317},{"id":1337,"depth":241,"text":1338,"children":1504},[1505],{"id":1341,"depth":334,"text":1342},{"id":1378,"depth":241,"text":1379},{"id":1402,"depth":241,"text":1403},"2026-01-14","Learn how to self-host Docmost on your own server using Docker Compose and Traefik as a reverse proxy. A step-by-step tutorial for GDPR-compliant documentation.","md",{"src":1512},"\u002Fimages\u002Fblog\u002Fself_host_docmost_with_docker_and_traefik.jpeg","2026-03-14",{},"\u002Fen\u002Fblog\u002Fself-host-docmost-with-docker-and-traefik",{"title":6,"description":1509},"en\u002F3.blog\u002F5.self-host-docmost-with-docker-and-traefik","-Sl-lY1wQpnLxT4ZlwNDXZeLvj95EOvutTqgX_IvXu0",[1520,1525],{"title":1521,"path":1522,"stem":1523,"description":1524,"children":-1},"Kubernetes Migration: What You Need to Know Before You Start","\u002Fen\u002Fblog\u002Fkubernetes-migration-guide","en\u002F3.blog\u002F49.kubernetes-migration-guide","A successful Kubernetes migration requires solid preparation. Learn the most common mistakes, a step-by-step approach, and when a PaaS is the better choice.",{"title":1526,"path":1527,"stem":1528,"description":1529,"children":-1},"AI Agent Infrastructure: What You Really Need for Production","\u002Fen\u002Fblog\u002Fai-agent-infrastructure","en\u002F3.blog\u002F50.ai-agent-infrastructure","An AI agent is more than a single API call. This guide explains the four infrastructure layers — model hosting, orchestration, memory, and observability — and how they work together in production.",1776469309257]