{"id":148759,"date":"2026-05-22T05:45:00","date_gmt":"2026-05-22T05:45:00","guid":{"rendered":"\/tutorials\/?p=148759"},"modified":"2026-05-19T17:33:03","modified_gmt":"2026-05-19T17:33:03","slug":"how-to-install-docmost-docker","status":"publish","type":"post","link":"\/tutorials\/how-to-install-docmost-docker","title":{"rendered":"How to create a self-hosted team knowledge base with Docmost and Docker"},"content":{"rendered":"<p>To create a self-hosted team knowledge base with Docmost and Docker, deploy the Docmost application with PostgreSQL, Redis, persistent storage, and a configured public URL. This setup gives your team a private workspace for internal documentation, onboarding guides, project notes, runbooks, and company policies.<\/p><p>Docmost runs as a Docker container, while PostgreSQL stores workspace data and Redis supports caching and real-time collaboration. Once the containers are running, you can secure the workspace with HTTPS, create team spaces, set permissions, and turn the installation into a structured documentation hub.<\/p><h2 class=\"wp-block-heading\" id=\"h-what-do-you-need-to-install-docmost-with-docker\">What do you need to install Docmost with Docker?<\/h2><p>Before installing Docmost, prepare the following:<\/p><ul class=\"wp-block-list\">\n<li><strong>A VPS or Linux server<\/strong> &ndash; use a server with enough resources to run Docmost, PostgreSQL, and Redis.<\/li>\n\n\n\n<li><strong>SSH access<\/strong> &ndash; connect to the server and run installation commands from the terminal.<\/li>\n\n\n\n<li><strong>Docker Engine<\/strong> &ndash; run the Docmost application and its required services in containers.<\/li>\n\n\n\n<li><strong>Docker Compose plugin<\/strong> &ndash; define and start Docmost, PostgreSQL, and Redis from one docker-compose.yml file.<\/li>\n\n\n\n<li><strong>A domain or subdomain<\/strong> &ndash; optional for testing, but recommended for production use.<\/li>\n\n\n\n<li><strong>Basic firewall access<\/strong> &ndash; open port 3000 for testing or ports 80 and 443 if using a reverse proxy with HTTPS.<\/li>\n\n\n\n<li><strong>A secure app secret and database password<\/strong> &ndash; replace the default values before starting the containers.<\/li>\n<\/ul><h2 class=\"wp-block-heading\" id=\"h-how-to-install-docmost-with-docker-compose\">How to install Docmost with Docker Compose<\/h2><p>Docmost runs on <a href=\"\/tutorials\/what-is-docker\">Docker<\/a> with three services: the Docmost application, a PostgreSQL database, and Redis. PostgreSQL stores your team&rsquo;s wiki data, while Redis provides caching and real-time collaboration.<\/p><p>Before starting, make sure your <a href=\"\/tutorials\/how-to-install-docker-on-ubuntu\">VPS has Docker and the Docker Compose plugin installed<\/a>. You also need SSH access to your server and a domain or subdomain if you want to access Docmost through a custom URL.<\/p><h3 class=\"wp-block-heading\">1. Create a Docmost project directory<\/h3><p><a href=\"\/tutorials\/how-to-use-putty-ssh\">Connect to your VPS via SSH<\/a> and create a dedicated directory for Docmost:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">mkdir docmost\ncd docmost<\/pre><p>This directory will store the <a href=\"\/tutorials\/what-is-docker-compose\">Docker Compose<\/a> configuration for the Docmost application, PostgreSQL database, Redis service, and persistent Docker volumes.<\/p><h3 class=\"wp-block-heading\">2. Create the Docker Compose file<\/h3><p>Create a new docker-compose.yml file inside the docmost directory:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nano docker-compose.yml<\/pre><p>Add the following configuration:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\ndocmost:\nimage: docmost\/docmost:latest\ndepends_on:\n- db\n- redis\nenvironment:\nAPP_URL: \"http:\/\/your-server-ip:3000\"\nAPP_SECRET: \"replace-this-with-a-secure-random-string\"\nDATABASE_URL: \"postgresql:\/\/docmost:replace-this-password@db:5432\/docmost?schema=public\"\nREDIS_URL: \"redis:\/\/redis:6379\"\nports:\n- \"3000:3000\"\nvolumes:\n- docmost_data:\/app\/data\nrestart: unless-stopped\ndb:\nimage: postgres:16-alpine\nenvironment:\nPOSTGRES_DB: docmost\nPOSTGRES_USER: docmost\nPOSTGRES_PASSWORD: \"replace-this-password\"\nvolumes:\n- db_data:\/var\/lib\/postgresql\/data\nrestart: unless-stopped\nredis:\nimage: redis:7.2-alpine\nvolumes:\n- redis_data:\/data\nrestart: unless-stopped\nvolumes:\ndocmost_data:\ndb_data:\nredis_data:<\/pre><p>This file defines all services required to run Docmost. The docmost service starts the application, the db service starts PostgreSQL, and the redis service starts Redis. The three named volumes preserve application files, database records, and Redis data after container restarts.<\/p><h3 class=\"wp-block-heading\">3. Replace the placeholder values<\/h3><p>Before starting the containers, replace the default values in the Compose file.<\/p><p>First, update APP_URL with the address users will use to access Docmost. For a basic setup, use your server IP address:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">APP_URL: \"http:\/\/your-server-ip:3000\"<\/pre><p>If you already pointed a domain or subdomain to your VPS, use that URL instead:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">APP_URL: \"https:\/\/docs.example.com\"<\/pre><p>Next, replace APP_SECRET with a secure random string. Generate one with OpenSSL:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">openssl rand -hex 32<\/pre><p>Copy the generated value and add it to the APP_SECRET line:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">APP_SECRET: \"your-generated-secret\"<\/pre><p>Then, replace the PostgreSQL password in both DATABASE_URL and POSTGRES_PASSWORD:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">DATABASE_URL: \"postgresql:\/\/docmost:your-secure-password@db:5432\/docmost?schema=public\"\nPOSTGRES_PASSWORD: \"your-secure-password\"<\/pre><p>The PostgreSQL password must be identical in both places. Docmost uses the password in DATABASE_URL to connect to the PostgreSQL container, while PostgreSQL uses POSTGRES_PASSWORD to create the database user.<\/p><p>Save and close the file. In Nano, press CTRL + X, then Y, then Enter.<\/p><h3 class=\"wp-block-heading\">4. Start Docmost with Docker Compose<\/h3><p>Start the Docmost stack from the same directory as your docker-compose.yml file:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose up -d<\/pre><p>Docker Compose will download the Docmost, PostgreSQL, and Redis images, create the volumes, and start the containers in the background.<\/p><p>Check the container status:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose ps<\/pre><p>All three services should appear as running. If one service exits or keeps restarting, check the logs:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose logs<\/pre><p>To view only the Docmost application logs, run:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose logs docmost<\/pre><p>The logs help identify common configuration issues, such as an invalid APP_SECRET, mismatched database password, or unavailable Redis service.<\/p><h3 class=\"wp-block-heading\">5. Open Docmost in your browser<\/h3><p>After the containers are running, open Docmost using your server IP and port 3000:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/your-server-ip:3000<\/pre><p>If you configured a domain in APP_URL, open that domain instead:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">https:\/\/docs.example.com<\/pre><p>Docmost will display the initial setup screen. Create the first admin account and workspace. This admin account manages users, team spaces, permissions, and documentation settings.<\/p><p>You can also verify the application with the health check endpoint:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/your-server-ip:3000\/api\/health<\/pre><p>A successful health check confirms that the Docmost application is responding.<\/p><h3 class=\"wp-block-heading\">6. Allow access to port 3000<\/h3><p>If Docmost does not load in the browser, the server firewall may be blocking port 3000.<\/p><p>On servers using UFW, allow TCP traffic on port 3000:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo ufw allow 3000\/tcp\nsudo ufw reload<\/pre><p>Then, open Docmost again:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/your-server-ip:3000<\/pre><p>This setup is enough for initial testing. For production use, place Docmost behind a reverse proxy with SSL, so your team can access the knowledge base through a secure domain such as https:\/\/docs.example.com.<\/p><h2 class=\"wp-block-heading\" id=\"h-how-to-secure-docmost-for-team-use\">How to secure Docmost for team use<\/h2><p>A Docmost knowledge base can contain internal policies, onboarding documents, project plans, and technical documentation. Secure the application before inviting teammates so that only authorized users can access, edit, and manage your workspace.<\/p><p>For general server protection, follow our<a href=\"\/tutorials\/vps-security?utm_source=chatgpt.com\" data-wpel-link=\"internal\" rel=\"follow\"> <\/a><a href=\"\/tutorials\/vps-security?utm_source=chatgpt.com\" data-wpel-link=\"internal\" rel=\"follow\">VPS security best practices<\/a>, which cover SSH keys, firewall configuration, root login protection, strong passwords, malware scanning, and server monitoring. This section focuses only on Docmost-specific security steps for a team documentation setup. Hostinger&rsquo;s VPS security guide recommends monitoring SSH access, root permissions, passwords, firewalls, user privileges, and server logs as part of regular VPS protection.<\/p><h3 class=\"wp-block-heading\">1. Use a domain with HTTPS<\/h3><p>Run Docmost behind a domain or subdomain instead of sharing the raw server IP with your team. A domain like docs.example.com is easier to manage, works better with <a href=\"\/tutorials\/what-is-ssl\">SSL certificates<\/a>, and keeps the workspace URL consistent if you move the application later.<\/p><p>After <a href=\"\/tutorials\/how-to-point-domain-to-vps\">pointing the domain to your VPS<\/a>, update the APP_URL value in your docker-compose.yml file:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">APP_URL: \"https:\/\/docs.example.com\"<\/pre><p>Then restart the Docmost container:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose up -d<\/pre><p>Use HTTPS for production workspaces. SSL encrypts the connection between Docmost and your team members, which helps protect login sessions, page content, and account data during transmission.<\/p><h3 class=\"wp-block-heading\">2. Put Docmost behind a reverse proxy<\/h3><p>A <a href=\"\/tutorials\/how-to-set-up-nginx-reverse-proxy\">reverse proxy<\/a> lets users access Docmost through ports 80 and 443 instead of opening port 3000 publicly. It also handles SSL certificates and routes traffic from your domain to the Docmost container.<\/p><p>For a production setup, configure Nginx, Caddy, or another reverse proxy to forward requests from your domain to:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/127.0.0.1:3000<\/pre><p>After the reverse proxy is working, limit public access to port 3000. On servers using UFW, remove the public rule for port 3000 and allow only HTTP, HTTPS, and SSH:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo ufw delete allow 3000\/tcp\nsudo ufw allow OpenSSH\nsudo ufw allow 80\/tcp\nsudo ufw allow 443\/tcp\nsudo ufw reload<\/pre><p>This keeps Docmost accessible through the secure domain while reducing unnecessary open ports on the VPS.<\/p><h3 class=\"wp-block-heading\">3. Enable WebSocket support<\/h3><p>Docmost uses real-time collaboration features, so the reverse proxy must support WebSocket connections. Without WebSocket forwarding, pages may load correctly, but live editing and collaboration features may not work as expected.<\/p><p>For Nginx, include the WebSocket headers in the Docmost server block:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">proxy_http_version 1.1;\nproxy_set_header Upgrade $http_upgrade;\nproxy_set_header Connection \"upgrade\";\nproxy_set_header Host $host;\nproxy_set_header X-Real-IP $remote_addr;\nproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\nproxy_set_header X-Forwarded-Proto $scheme;<\/pre><p>After updating the reverse proxy configuration, reload Nginx:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo systemctl reload nginx<\/pre><p>Then test Docmost by opening the workspace in two browser windows and editing the same page from both sessions.<\/p><h3 class=\"wp-block-heading\">4. Keep secrets and passwords unique<\/h3><p>Docmost relies on APP_SECRET and the PostgreSQL password to secure the application and database connection. These values should be unique, long, and different from other server or account passwords.<\/p><p>Your Compose file should not keep placeholder values like these:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">APP_SECRET: \"replace-this-with-a-secure-random-string\"\nPOSTGRES_PASSWORD: \"replace-this-password\"<\/pre><p>Use generated values instead:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">APP_SECRET: \"your-generated-app-secret\"\nPOSTGRES_PASSWORD: \"your-secure-database-password\"<\/pre><p>Generate a new app secret with:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">openssl rand -hex 32<\/pre><p>Do not change APP_SECRET after users start using the workspace unless you are prepared to invalidate existing sessions. For team environments, store credentials in a secure password manager and limit access to the VPS and Compose file.<\/p><h3 class=\"wp-block-heading\">5. Configure team spaces and permissions<\/h3><p>Docmost security also depends on workspace structure. Create separate spaces for teams, departments, or projects instead of storing every document in one shared area.<\/p><p>For example, you can create spaces for:<\/p><ul class=\"wp-block-list\">\n<li>Engineering documentation<\/li>\n\n\n\n<li>HR and onboarding<\/li>\n\n\n\n<li>Product requirements<\/li>\n\n\n\n<li>Internal policies<\/li>\n\n\n\n<li>Customer support playbooks<\/li>\n<\/ul><p>Assign users to groups based on their role. Give edit access only to team members who maintain the documentation, and use view-only access for readers who only need to reference pages.<\/p><p>This structure prevents accidental edits and keeps sensitive documentation, such as HR policies or infrastructure notes, visible only to the right users.<\/p><h3 class=\"wp-block-heading\">6. Back up Docmost data<\/h3><p>Docmost stores important workspace data in Docker volumes. Back up the PostgreSQL volume and application data volume regularly so you can restore your knowledge base after accidental deletion, server failure, or a broken update.<\/p><p>At minimum, back up these volumes from the Docker Compose setup:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docmost_data\ndb_data\nredis_data<\/pre><p>The PostgreSQL volume is the most important because it stores the main workspace records. The application data volume can include uploaded files and other persistent Docmost data.<\/p><p>Before updating or changing the setup, create a fresh backup. This is especially important for team wikis because documentation changes often happen daily.<\/p><h3 class=\"wp-block-heading\">7. Update Docmost regularly<\/h3><p>Keep the Docmost image up to date to receive application improvements and security fixes. To update the Docmost container, pull the latest image and recreate the application service:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker pull docmost\/docmost:latest\ndocker compose up --force-recreate --build docmost -d<\/pre><p>After the update, check the container status:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose ps<\/pre><p>Then open Docmost and confirm that users, spaces, and pages load correctly.<\/p><p>Do not update production workspaces without a backup. A backup gives you a restore point if the new container version causes compatibility or startup issues.<\/p><h2 class=\"wp-block-heading\" id=\"h-how-to-use-docmost-as-a-team-wiki-and-documentation-hub\">How to use Docmost as a team wiki and documentation hub<\/h2><p>After installing Docmost, organize the workspace around how your team searches for information. A good team wiki should make recurring knowledge easy to find, update, and reuse across departments.<\/p><p>Start by creating spaces for the main documentation areas your team uses every day. For example, create separate spaces for the company handbook, employee onboarding, engineering documentation, product notes, customer support playbooks, and internal operations.<\/p><p>Each space should have a clear purpose. The Engineering space can store architecture notes, deployment steps, incident response guides, and runbooks. The Employee onboarding space can include first-week tasks, instructions for accessing tools, team introductions, and role-specific checklists.<\/p><h3 class=\"wp-block-heading\">Create spaces for teams, projects, or departments<\/h3><p>Spaces are the main containers for organizing documentation in Docmost. Use them to separate broad knowledge areas rather than storing every page in a single shared workspace.<\/p><p>For a small team, create spaces by function:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Engineering\nProduct\nSupport\nHR and onboarding\nCompany handbook<\/pre><p>For a larger organization, create spaces by department, project, or access level:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Infrastructure\nFrontend\nBackend\nInternal policies\nLeadership notes\nCustomer operations<\/pre><p>Use clear space names that match how your team describes its work. Avoid vague labels like General, Misc, or Docs, because they make the wiki harder to navigate as the number of pages grows.<\/p><h3 class=\"wp-block-heading\">Add core pages before inviting the team<\/h3><p>A new knowledge base works best when it already contains useful starting points. Before inviting the whole team, add the pages people will need first.<\/p><p>Start with these core pages:<\/p><ul class=\"wp-block-list\">\n<li><strong>Start here<\/strong> &ndash; explain how the team should use the wiki.<\/li>\n\n\n\n<li><strong>Documentation rules<\/strong> &ndash; define naming, formatting, and ownership standards.<\/li>\n\n\n\n<li><strong>Team directory<\/strong> &ndash; list teams, owners, and responsibilities.<\/li>\n\n\n\n<li><strong>Onboarding checklist<\/strong> &ndash; show new members what to read and complete first.<\/li>\n\n\n\n<li><strong>Frequently used processes<\/strong> &ndash; document recurring tasks such as access requests, deployments, or support escalations.<\/li>\n<\/ul><p>Each page should answer one clear question. For example, create a page called How to request production access instead of placing access instructions inside a long onboarding document. This makes the page easier to search, share, and update.<\/p><h3 class=\"wp-block-heading\">Use nested pages for step-by-step documentation<\/h3><p>Nested pages help turn broad topics into structured documentation paths. Use a parent page for the main topic, then add child pages for specific procedures or references.<\/p><p>For example, an Engineering space can use this structure:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Engineering\n&#9500;&#9472;&#9472; Architecture overview\n&#9500;&#9472;&#9472; Deployment process\n&#9474; &#9500;&#9472;&#9472; Deploying the frontend\n&#9474; &#9500;&#9472;&#9472; Deploying the backend\n&#9474; &#9492;&#9472;&#9472; Rolling back a release\n&#9500;&#9472;&#9472; Incident response\n&#9474; &#9500;&#9472;&#9472; Severity levels\n&#9474; &#9500;&#9472;&#9472; On-call checklist\n&#9474; &#9492;&#9472;&#9472; Postmortem template\n&#9492;&#9472;&#9472; Development environment\n&#9500;&#9472;&#9472; Local setup\n&#9500;&#9472;&#9472; Environment variables\n&#9492;&#9472;&#9472; Testing commands<\/pre><p>This structure helps users move from general context to specific instructions. It also prevents long pages from becoming difficult to scan.<\/p><h3 class=\"wp-block-heading\">Assign ownership to important pages<\/h3><p>Every important page should have an owner. Page ownership helps teams keep documentation accurate after processes, tools, or responsibilities change.<\/p><p>Add the owner near the top of each page:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Owner: Engineering team\nLast reviewed: 2026-05-18\nReview cycle: Every 3 months<\/pre><p>For critical documentation, such as deployment steps or incident response procedures, assign ownership to a team rather than one person. Team ownership reduces the risk of outdated documentation when someone changes roles or leaves the company.<\/p><p>Use a review cycle for pages that affect daily operations. For example, onboarding pages can be reviewed every quarter, while deployment runbooks should be reviewed after major infrastructure changes.<\/p><h3 class=\"wp-block-heading\">Set permissions based on how each team uses the wiki<\/h3><p>Docmost permissions should match the sensitivity of each documentation area. Give edit access to people responsible for maintaining the content, and give view access to people who only need to read it.<\/p><p>For example, HR can edit the company handbook while all employees can view it. Engineering leads can edit deployment runbooks, while the wider technical team can use them as references. Leadership notes should stay limited to the people who need access.<\/p><p>This setup keeps documentation open enough to be useful while reducing accidental edits in important spaces.<\/p><h3 class=\"wp-block-heading\">Use real-time editing for collaborative documentation<\/h3><p>Docmost supports collaborative editing, which is useful when several team members need to build or update the same page. Use real-time editing for planning documents, meeting notes, incident reports, and process updates.<\/p><p>Good use cases include writing release notes during a product launch, updating an incident report during an outage, creating onboarding documentation with input from multiple departments, and reviewing a new internal process with team leads.<\/p><p>After a collaborative session, clean up the page before treating it as official documentation. Remove temporary notes, assign an owner, add a review date, and link the page from the right parent page or space.<\/p><h3 class=\"wp-block-heading\">Use diagrams to explain processes and systems<\/h3><p>Visual documentation helps teams understand workflows faster than text-only pages. Use diagrams in Docmost to explain systems, handoffs, decision paths, and internal processes.<\/p><p>For example, add diagrams for application architecture, deployment flow, customer escalation, employee onboarding, incident response, or approval workflows.<\/p><p>Place the diagram near the top of the page, then explain each step below it. This gives readers a quick overview first and detailed instructions afterward.<\/p><h3 class=\"wp-block-heading\">Create templates for repeatable documentation<\/h3><p>Templates keep documentation consistent across the team. Instead of writing every page from scratch, create reusable formats for common page types.<\/p><p>Useful team wiki templates include:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Meeting notes\nIncident report\nProject brief\nRunbook\nHow-to guide\nRelease notes\nDecision record\nOnboarding checklist<\/pre><p>For example, an incident report template can include:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Title:\nDate:\nIncident owner:\nImpact:\nTimeline:\nRoot cause:\nResolution:\nFollow-up actions:<\/pre><p>A consistent template helps readers know where to find the same type of information on every page. It also makes new documentation easier to create because writers do not need to decide the structure each time.<\/p><h3 class=\"wp-block-heading\">Keep the team wiki easy to maintain<\/h3><p>A team knowledge base becomes less useful when old pages, duplicate instructions, and unclear ownership start to pile up. Keep Docmost maintainable by reviewing the workspace regularly.<\/p><p>Archive pages that are no longer relevant, merge duplicate pages that explain the same process, and add owners and review dates to operational documents. Link related pages together so users can move between connected topics.<\/p><p>Keep page titles specific and action-based. For example, use How to deploy the API instead of API notes. The first title tells readers exactly what the page helps them do, while the second title is too broad to be useful in search results.<\/p><p>A well-maintained Docmost workspace becomes the source of truth for team knowledge. New employees can onboard faster, existing team members can find answers without asking in chat, and process owners can keep critical documentation updated in one place.<\/p><h2 class=\"wp-block-heading\" id=\"h-how-to-deploy-docmost-faster-with-hostingers-docker-template\">How to deploy Docmost faster with Hostinger&rsquo;s Docker template<\/h2><p>Manual Docker Compose installation gives you full control over the Docmost setup. Hostinger&rsquo;s <a href=\"\/vps\/docker\">Docker catalog<\/a> is faster because it deploys Docmost from a preconfigured application catalog, rather than requiring you to create a Compose file, install dependencies, and start each service manually.<\/p><p>Use this option if you want to launch a team wiki quickly and manage it from a VPS control panel. Hostinger&rsquo;s Docmost template includes a preconfigured setup for the application, while the VPS plans include Docker manager, container logs, one-click updates, and automatic weekly backups.<\/p><p>To deploy Docmost with Hostinger&rsquo;s Docker template:<\/p><ol class=\"wp-block-list\">\n<li>Open the<a data-wpel-link=\"internal\" href=\"\/vps\/docker\/docmost?utm_source=chatgpt.com\" rel=\"follow\"> <\/a><a href=\"\/vps\/docker\/docmost\">Docmost Docker template page<\/a>.<\/li>\n\n\n\n<li>Choose a VPS plan that matches your team size and expected documentation usage.<\/li>\n\n\n\n<li>Complete the VPS setup.<\/li>\n\n\n\n<li>Open the VPS dashboard.<\/li>\n\n\n\n<li>Select the Docmost application template from the Docker catalog.<\/li>\n\n\n\n<li>Launch the template and wait for the deployment to finish.<\/li>\n\n\n\n<li>Open the generated Docmost URL.<\/li>\n\n\n\n<li>Create the first admin account and workspace.<\/li>\n<\/ol><p>After deployment, use the admin account to create spaces, invite users, and set permissions for each team. For example, create separate spaces for Engineering, Product, Support, and HR rather than storing all internal documentation in a single shared area.<\/p><p>Hostinger&rsquo;s template is especially useful if you want to avoid manual Docker configuration. The catalog page positions the template as a one-click Docmost installation with no manual setup, while the built-in Docker manager helps you deploy, update, and monitor containers from one place.<\/p><p>You can still apply the same production steps after using the template. Point a domain or subdomain to the VPS, use HTTPS, review access permissions, and set a backup routine before making the knowledge base the source of truth for your team.<\/p><h2 class=\"wp-block-heading\" id=\"h-next-steps-for-your-self-hosted-team-knowledge-base\">Next steps for your self-hosted team knowledge base<\/h2><p>After Docmost is running, turn the empty workspace into a reliable source of truth for your team. Start with the documentation that people request most often, such as onboarding steps, access instructions, deployment processes, internal policies, and support workflows.<\/p><p>Create a simple structure first. Add a space for each main team or documentation area, then create a few high-value pages within each space. For example, an Engineering space can start with deployment steps and incident response notes, while an HR space can start with onboarding, benefits, and company policy pages.<\/p><p>Before inviting the whole team, define how documentation should be created and maintained. Add a short Documentation rules page that explains how to name pages, when to use templates, who owns each space, and how often important pages should be reviewed. This prevents the wiki from becoming a collection of outdated notes.<\/p><p>Next, assign owners to critical pages. Deployment runbooks, onboarding checklists, policy documents, and support playbooks should have a clear owner and review date. A simple ownership note is enough:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Owner: Engineering team\nLast reviewed: 2026-05-18\nReview cycle: Every 3 months<\/pre><p>Once the structure is ready, invite users and set permissions. Give edit access to people who maintain the documentation, and give view access to people who only need to read it. This keeps the knowledge base useful without making sensitive or operational pages easy to change by accident.<\/p><p>Finally, treat Docmost like part of your team&rsquo;s infrastructure. Keep the Docker containers updated, back up the application and database volumes, and review access regularly. If you deployed Docmost manually, document the setup process inside Docmost itself so future administrators can maintain or restore the workspace more easily.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>To create a self-hosted team knowledge base with Docmost and Docker, deploy the Docmost application with PostgreSQL, Redis, persistent storage, [&#8230;]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"\/tutorials\/how-to-install-docmost-docker\">Read More&#8230;<\/a><\/p>\n","protected":false},"author":342,"featured_media":147369,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"How to install Docmost with Docker","rank_math_description":"Learn how to install Docmost with Docker, secure it for team use, and create a self-hosted knowledge base for internal documentation.","rank_math_focus_keyword":"docmost docker","footnotes":""},"categories":[22646,22644],"tags":[],"class_list":["post-148759","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-pre-installed-applications","category-vps"],"hreflangs":[{"locale":"en-US","link":"https:\/\/www.hostinger.com\/tutorials\/how-to-install-docmost-docker","default":1},{"locale":"en-PH","link":"https:\/\/www.hostinger.com\/ph\/tutorials\/how-to-install-docmost-docker","default":0},{"locale":"en-MY","link":"https:\/\/www.hostinger.com\/my\/tutorials\/how-to-install-docmost-docker","default":0},{"locale":"en-UK","link":"https:\/\/www.hostinger.com\/uk\/tutorials\/how-to-install-docmost-docker","default":0},{"locale":"en-IN","link":"https:\/\/www.hostinger.com\/in\/tutorials\/how-to-install-docmost-docker","default":0},{"locale":"en-CA","link":"https:\/\/www.hostinger.com\/ca\/tutorials\/how-to-install-docmost-docker","default":0},{"locale":"en-AU","link":"https:\/\/www.hostinger.com\/au\/tutorials\/how-to-install-docmost-docker","default":0},{"locale":"en-NG","link":"https:\/\/www.hostinger.com\/ng\/tutorials\/how-to-install-docmost-docker","default":0}],"_links":{"self":[{"href":"https:\/\/www.hostinger.com\/tutorials\/wp-json\/wp\/v2\/posts\/148759","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hostinger.com\/tutorials\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hostinger.com\/tutorials\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/tutorials\/wp-json\/wp\/v2\/users\/342"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/tutorials\/wp-json\/wp\/v2\/comments?post=148759"}],"version-history":[{"count":5,"href":"https:\/\/www.hostinger.com\/tutorials\/wp-json\/wp\/v2\/posts\/148759\/revisions"}],"predecessor-version":[{"id":148915,"href":"https:\/\/www.hostinger.com\/tutorials\/wp-json\/wp\/v2\/posts\/148759\/revisions\/148915"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/tutorials\/wp-json\/wp\/v2\/media\/147369"}],"wp:attachment":[{"href":"https:\/\/www.hostinger.com\/tutorials\/wp-json\/wp\/v2\/media?parent=148759"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hostinger.com\/tutorials\/wp-json\/wp\/v2\/categories?post=148759"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hostinger.com\/tutorials\/wp-json\/wp\/v2\/tags?post=148759"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}