Back to Blog
How to Set Up a Self-Hosted Status Page with Cachet
smmdeskk@gmail.com

How to Set Up a Self-Hosted Status Page with Cachet

Deploy Cachet as your self-hosted status page to keep users informed about service health and incidents without relying on third-party providers.

["self-hosting""status-page""monitoring""cachet""docker"]

How to Set Up a Self-Hosted Status Page with Cachet


A status page is essential for communicating service health to your users. Cachet is an open-source status page system that you can self-host for complete control over your incident communication.


Why Self-Host Your Status Page?


Third-party status page providers charge per-component pricing that adds up quickly. Self-hosting with Cachet gives you unlimited components, subscribers, and incidents for the cost of a small VPS.


More importantly, if your infrastructure provider has an outage, a third-party status page hosted on the same provider won't help. Self-hosting on separate infrastructure ensures your status page stays up when it matters most.


Prerequisites


  • A VPS with Docker and Docker Compose installed
  • A domain name pointed to your server
  • Basic familiarity with the command line

  • Docker Compose Configuration


    Create a `docker-compose.yml` for Cachet:


    yaml

    version: '3'

    services:

    cachet:

    image: cachethq/docker:latest

    ports:

  • "8000:8000"
  • environment:

  • DB_DRIVER=pgsql
  • DB_HOST=postgres
  • DB_DATABASE=cachet
  • DB_USERNAME=cachet
  • DB_PASSWORD=your_secure_password
  • APP_KEY=base64:your_app_key_here
  • APP_LOG=errorlog
  • MAIL_DRIVER=smtp
  • MAIL_HOST=smtp.example.com
  • MAIL_PORT=587
  • MAIL_USERNAME=alerts@example.com
  • MAIL_PASSWORD=your_mail_password
  • depends_on:

  • postgres
  • restart: unless-stopped


    postgres:

    image: postgres:15-alpine

    environment:

  • POSTGRES_USER=cachet
  • POSTGRES_PASSWORD=your_secure_password
  • POSTGRES_DB=cachet
  • volumes:

  • postgres_data:/var/lib/postgresql/data
  • restart: unless-stopped


    volumes:

    postgres_data:


    Setting Up Components and Groups


    After deployment, organize your services into logical groups:


    1. **Infrastructure** — Servers, networking, DNS

    2. **Core Services** — API, web application, database

    3. **Integrations** — Email, webhooks, third-party connections


    Each component gets its own status indicator: Operational, Performance Issues, Partial Outage, or Major Outage.


    Automating Status Updates


    Cachet provides a REST API for automated status updates. Integrate it with your monitoring stack:


    bash

    curl -X POST https://status.example.com/api/v1/components/1 \

    -H "X-Cachet-Token: your_api_token" \

    -H "Content-Type: application/json" \

    -d '{"status": 1}'


    Connect this to Uptime Kuma, Healthchecks.io, or your preferred monitoring tool to automatically update component status when issues are detected.


    Subscriber Notifications


    Cachet supports email notifications for subscribers. Users can subscribe to specific components and receive updates only for services they care about. Configure your SMTP settings to enable this feature.


    Reverse Proxy Setup


    Place Cachet behind your reverse proxy for SSL termination:


    status.example.com {

    reverse_proxy cachet:8000

    }


    Incident Management Best Practices


    When creating incidents, follow these guidelines:


  • **Be specific** about what's affected and what users might experience
  • **Update frequently** even if there's no change — silence breeds anxiety
  • **Post a postmortem** for major incidents to build trust with users
  • **Use scheduled maintenance** for planned downtime to set expectations

  • A well-maintained status page significantly reduces support tickets during incidents and builds user confidence in your platform's transparency.