[{"data":1,"prerenderedAt":148},["ShallowReactive",2],{"seo-verification":3,"blog-hosting-homepage-on-your-own-vps-ma-en":6,"promo-bar-likely":147},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-hosting-homepage-on-your-own-vps-ma-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":30,"intro":33,"sections":34,"ctaTitle":87,"ctaBody":88,"ctaButton":89,"ctaUrl":90,"relatedPosts":91},92,"hosting-homepage-on-your-own-vps",{"fr":12,"en":10,"ar":13,"es":14},"heberger-homepage","استضافة-homepage-على-خادم-vps-الخاص-بك","alojar-homepage-en-un-vps","Hosting Homepage on your own VPS","Deploy Homepage, the open-source dashboard, on your VPS with Docker. Complete guide: YAML architecture, widgets, Caddy\u002FTraefik reverse proxy, SSL, security and backup.",8,3,false,"2026-03-20T00:00:00+00:00","2026-11-08T01:13:13+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-homepage-poster.svg","Homepage is a self-hosted dashboard that centralizes all your services, widgets and favorite links on a single page. Deploying it on your own VPS gives you a fully customizable home page, accessible from any browser, without depending on a third-party service. This guide covers the full installation with Docker, advanced widget configuration, security hardening and backup.",[35,39,50,53,72,75,78,81,84],{"type":36,"title":37,"body":38},"h2","Why host Homepage on your VPS","Homepage (gethomepage.dev) is a dashboard written in Next.js, designed to be the home page of your infrastructure. Unlike SaaS start-page solutions, everything stays under your control: the configuration lives in simple YAML files, the widgets query your own services (Proxmox, qBittorrent, Sonarr, Pi-hole…), and no data transits through an external cloud. Hosting it on a VPS makes it accessible everywhere, from any browser.\n\nIt is also the ideal entry point to pilot a growing Docker stack: a single `services.yaml` file is enough to map dozens of containers. As your infrastructure grows more complex — multiple applications, multiple subdomains, services across several VPS — Homepage becomes the single cockpit from which you check the status of each one at a glance, without opening five tabs.",{"type":40,"title":41,"items":42},"ul","The concrete benefits of a self-hosted Homepage",[43,44,45,46,47,48,49],"YAML configuration versionable in Git: rebuild your dashboard identically in seconds after a reinstall.","Native widgets for over 100 services (Docker, Proxmox, Plex, Grafana, AdGuard, Pi-hole, Portainer…) with real-time stat display.","Automatic detection of Docker containers via labels, with no manual URL entry.","Light memory footprint, suited to a small VPS already running other containers.","No telemetry or cloud dependency: your home page stays 100% private, even during a network outage.","Full customization of the theme, wallpapers, search bar and service groups.","Declarative configuration: a change to the YAML files is checked by reloading the page, and a `docker compose restart homepage` is enough if it does not show up.",{"type":36,"title":51,"body":52},"Technical prerequisites","Homepage is very lightweight. A VPS with 1 vCPU and 512 MB of RAM is sufficient in practice, even running other containers alongside. Plan for around 300 MB of disk space for the image and the configuration. You will need:\n\n- **Docker** and **Docker Compose v2** installed (check with `docker compose version`).\n- A **domain name or subdomain** pointing to the public IP of the VPS, for example `home.yourdomain.com`.\n- A **reverse proxy** — Caddy or Traefik — to handle HTTPS and the Let's Encrypt certificate.\n- The Docker socket `\u002Fvar\u002Frun\u002Fdocker.sock` mounted read-only if you want to use Docker widgets and automatic discovery — or, safer, a socket proxy (see the security section).\n\nIf you start from a fresh VPS, install Docker following the official documentation, then enable automatic start with `systemctl enable --now docker`.",{"type":54,"title":55,"steps":56},"steps","Deploy Homepage with Docker in 5 steps",[57,60,63,66,69],{"title":58,"body":59},"Prepare the directory tree","Connect to your VPS over SSH and create the folders:\n\n```bash\nmkdir -p ~\u002Fhomepage\u002Fconfig\ncd ~\u002Fhomepage\n```\n\nThe files `services.yaml`, `widgets.yaml`, `settings.yaml` and `bookmarks.yaml` will be generated automatically on first start inside this `config\u002F` folder. You can also create them empty in advance to control their content from the start.",{"title":61,"body":62},"Write the docker-compose.yml","Create `~\u002Fhomepage\u002Fdocker-compose.yml` with the following content:\n\n```bash\nservices:\n  homepage:\n    image: ghcr.io\u002Fgethomepage\u002Fhomepage:latest\n    container_name: homepage\n    restart: unless-stopped\n    ports:\n      - 127.0.0.1:3000:3000\n    volumes:\n      - .\u002Fconfig:\u002Fapp\u002Fconfig\n      - \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock:ro\n    environment:\n      - HOMEPAGE_ALLOWED_HOSTS=home.yourdomain.com\n```\n\nNote the `127.0.0.1:3000:3000` binding: the port is only accessible from the local loopback, never exposed directly on the public IP. The reverse proxy is the only entry point.",{"title":64,"body":65},"Start the container","Start Homepage in the background and check the logs:\n\n```bash\ndocker compose up -d\ndocker compose logs -f\n```\n\nHomepage listens on port `3000`. Test locally before opening the reverse proxy:\n\n```bash\ncurl http:\u002F\u002Flocalhost:3000\n```\n\nIf the response is an HTML document, the container is working.",{"title":67,"body":68},"Connect the reverse proxy and SSL","**With Caddy** — add to your `Caddyfile`:\n\n```bash\nhome.yourdomain.com {\n    reverse_proxy localhost:3000\n}\n```\n\nCaddy generates and renews the Let's Encrypt certificate automatically. Reload: `systemctl reload caddy`.\n\n**With Traefik** — add labels to the service in `docker-compose.yml`:\n\n```bash\nlabels:\n  - traefik.enable=true\n  - traefik.http.routers.homepage.rule=Host(`home.yourdomain.com`)\n  - traefik.http.routers.homepage.entrypoints=websecure\n  - traefik.http.routers.homepage.tls.certresolver=letsencrypt\n```\n\nIn both cases, verify that your DNS points to the VPS IP before attempting the ACME challenge.",{"title":70,"body":71},"Customize services and widgets","Edit `config\u002Fservices.yaml` to declare your applications in groups:\n\n```bash\n- Tools:\n    - Portainer:\n        href: https:\u002F\u002Fportainer.yourdomain.com\n        description: Container management\n        icon: portainer.png\n```\n\nAdd system resource widgets in `config\u002Fwidgets.yaml`:\n\n```bash\n- resources:\n    cpu: true\n    memory: true\n    disk: \u002F\n```\n\nReload the page in your browser after each change; if a change does not show up (especially in `settings.yaml`), restart the container with `docker compose restart homepage`.",{"type":36,"title":73,"body":74},"Configure service widgets","Widgets are the added value of Homepage over a simple list of links. Each widget queries its target service's API and displays real-time metrics directly on the card.\n\nTo enable a widget, add a `widget` block under the service declaration in `services.yaml`. Example with **Portainer**:\n\n```bash\n- Portainer:\n    href: https:\u002F\u002Fportainer.yourdomain.com\n    widget:\n      type: portainer\n      url: https:\u002F\u002Fportainer.yourdomain.com\n      env: 1\n      key: {{HOMEPAGE_VAR_PORTAINER_KEY}}\n```\n\nAPI keys must never be written in plain text in `services.yaml` if that file is versioned in a public repository. Pass them to the container as environment variables prefixed with `HOMEPAGE_VAR_`, for example from a `.env` file loaded by `env_file: .env` in `docker-compose.yml`, then reference them with the `{{HOMEPAGE_VAR_PORTAINER_KEY}}` notation in the YAML: Homepage replaces each `{{HOMEPAGE_VAR_…}}` with the variable's value.\n\nOther widely used widgets: **Proxmox** (CPU, RAM, cluster storage), **Pi-hole** (blocked requests, active clients), **Sonarr \u002F Radarr** (active downloads), **Grafana** (embedded panels), **Uptime Kuma** (status of each monitor). The full list is in the official gethomepage.dev documentation.",{"type":76,"body":77},"tip","Enable automatic discovery by adding `homepage.group`, `homepage.name`, `homepage.href` and `homepage.icon` labels directly on your other Docker containers. Homepage detects them through the Docker instance declared in `config\u002Fdocker.yaml` and adds them to the dashboard without touching `services.yaml`. Combining this approach with a `.env` file to store your widget API keys (never in the clear in the versioned YAML) gives you a dashboard that updates itself with each new deployment: set the labels once, Homepage reads them continuously.",{"type":36,"title":79,"body":80},"Secure access to your dashboard","A dashboard listing all your services is an attractive target. Two basic measures are needed before exposing Homepage on the internet.\n\n**Restrict access by IP or authentication.** If Homepage is only for you, the simplest solution is to allow only your IP address in your reverse proxy configuration. With Caddy:\n\n```bash\nhome.yourdomain.com {\n    @allowed remote_ip 203.0.113.42\n    handle @allowed {\n        reverse_proxy localhost:3000\n    }\n    respond 403\n}\n```\n\nIf you access the dashboard from multiple networks, prefer HTTP basic authentication or an authentication middleware such as **Authelia** or **Authentik** in front of Homepage. Since v2.0, Homepage also offers its own authentication gate, by password or OIDC (`HOMEPAGE_AUTH_ENABLED=true`).\n\n**Do not hand over the raw Docker socket.** The `:ro` in the `\u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock:ro` mount only protects the file: the Docker API remains fully reachable through it, and a compromised container can create new containers with arbitrary volumes on the host. The Homepage documentation recommends a socket proxy (`docker-socket-proxy`) that only allows reads: `CONTAINERS=1` and `POST=0`, port bound to `127.0.0.1`, then `host: dockerproxy` and `port: 2375` in `config\u002Fdocker.yaml`.\n\n**Update the image regularly.** Use `docker compose pull && docker compose up -d` to update Homepage whenever a new image is available. You can automate this with a cron job. **Watchtower**, long recommended for this, is no longer maintained: its GitHub repository is archived.",{"type":36,"title":82,"body":83},"Back up and restore your configuration","All Homepage configuration lives in the `config\u002F` folder: that is the only directory to back up. No database, no persistent state outside these YAML files.\n\n**Version in Git.** The most reliable method is to initialize a Git repository in `~\u002Fhomepage\u002Fconfig\u002F` and commit after each change. If your configuration contains API keys (even via variables), add a `.gitignore` to exclude the `.env` file and version only the YAML files.\n\n**Incremental backup to object storage.** With `restic` and an S3-compatible bucket (Garage, MinIO, Backblaze B2), schedule a daily backup from a cron job:\n\n```bash\nrestic -r s3:s3.example.com\u002Fmy-bucket\u002Fhomepage backup ~\u002Fhomepage\u002Fconfig\n```\n\n**Restoration.** In case of VPS loss, recreate the container, restore the `config\u002F` folder from the backup, and run `docker compose up -d`. Homepage is operational in under a minute — one of the concrete advantages of a 100% declarative YAML configuration.",{"type":36,"title":85,"body":86},"Install Homepage via the ServOrbit Marketplace","If you prefer not to configure Docker manually, the ServOrbit Marketplace offers Homepage as a guided installation. A few clicks from your client dashboard provision a VPS with Homepage ready to use: official image, loopback-bound port and a persistent configuration volume.\n\nThe template does not set up a reverse proxy: declare your subdomain, plug in Caddy or Traefik as described above for HTTPS, and restrict `HOMEPAGE_ALLOWED_HOSTS` to that subdomain, since the recipe ships it open to all hosts (`*`). Then customize the YAML files in `config\u002F`.\n\nFind the full spec sheet, minimum requirements and the install button on the dedicated Marketplace page.","Install Homepage in one click","Deploy Homepage on a ServOrbit Cloud VPS with a preconfigured Docker template. SSD storage, Docker ready to use and generous bandwidth to serve your home page without latency.","Deploy on a Cloud VPS","\u002Fapplications\u002Fmonitoring-observability\u002Fhomepage",[92,111,129],{"id":93,"slug":94,"slugs":95,"title":99,"excerpt":100,"readTime":101,"views":102,"isPinned":19,"noindex":19,"publishedAt":103,"updatedAt":104,"category":105,"categories":106,"featuredImage":30,"bgImage":31,"posterImage":108,"relatedSolution":109},71,"hosting-nextcloud-on-your-own-vps",{"fr":96,"en":94,"ar":97,"es":98},"heberger-nextcloud","استضافة-nextcloud-على-خادمك-الـvps-الخاص","alojar-nextcloud-en-su-propio-vps","Self-Host Nextcloud on VPS: NC 35, PHP 8.3 and MariaDB 11 Guide","Host Nextcloud on a VPS: Docker Compose, Redis, MariaDB backup, uploads over 40 GB behind Cloudflare and an alternative to Office 2021.",20,1,"2026-04-10T00:00:00+00:00","2026-11-08T16:32:50+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[107],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-nextcloud-poster.svg",{"categorySlug":25,"appSlug":110},"nextcloud",{"id":112,"slug":113,"slugs":114,"title":118,"excerpt":119,"readTime":120,"views":102,"isPinned":19,"noindex":19,"publishedAt":121,"updatedAt":122,"category":123,"categories":124,"featuredImage":30,"bgImage":31,"posterImage":126,"relatedSolution":127},72,"hosting-ghost-on-your-own-vps",{"fr":115,"en":113,"ar":116,"es":117},"heberger-ghost","استضافة-ghost-على-خادمك-الـvps-الخاص","alojar-ghost-en-un-vps","Hosting Ghost on your own VPS: complete 2026 guide","Deploy Ghost v6 on your VPS with Caddy, MySQL, Ghost CLI and Stripe Tax: installation, TLS reverse proxy, updates and troubleshooting common startup errors.",10,"2026-04-09T00:00:00+00:00","2026-11-04T16:30:25+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[125],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-ghost-poster.svg",{"categorySlug":25,"appSlug":128},"ghost",{"id":130,"slug":131,"slugs":132,"title":136,"excerpt":137,"readTime":23,"views":138,"isPinned":19,"noindex":19,"publishedAt":139,"updatedAt":140,"category":141,"categories":142,"featuredImage":30,"bgImage":31,"posterImage":144,"relatedSolution":145},73,"host-wordpress-on-your-own-vps",{"fr":133,"en":131,"ar":134,"es":135},"heberger-wordpress","استضافة-wordpress-على-خادم-vps-الخاص-بك","alojar-wordpress-en-un-vps","Host WordPress on your own VPS","Host WordPress on your VPS for maximum performance and control: Docker, MariaDB, caching, reverse proxy and SSL.",0,"2026-04-08T00:00:00+00:00","2026-11-09T20:55:18+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[143],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-wordpress-poster.svg",{"categorySlug":25,"appSlug":146},"wordpress",true,1794270418147]