[{"data":1,"prerenderedAt":186},["ShallowReactive",2],{"seo-verification":3,"blog-self-host-kener-vps-status-page-en":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-self-host-kener-vps-status-page-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":124,"ctaBody":125,"ctaButton":126,"ctaUrl":127,"relatedPosts":128},543,"self-host-kener-vps-status-page",{"fr":12,"en":10,"ar":13,"es":14},"self-host-kener-vps","استضافة-kener-على-vps-صفحة-حالة","autoalojar-kener-vps-pagina-de-estado","Kener on a VPS: a self-hosted status page for your services","Install Kener on a VPS: an open-source status page with built-in checks, incidents, scheduled maintenance and subscribers notified by email.",6,0,false,"2026-10-31T00:00:00+00:00","2026-10-31T19:07:30+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\u002Fself-host-kener-vps-poster.svg",{"categorySlug":34,"appSlug":35},"monitoring-observability","kener","When your service goes down, your customers' first question is « is it me or is it you? ». A status page answers it before they write to support. Kener is an open-source status page (MIT licensed) that monitors what it displays: HTTP, TCP, DNS, SSL and heartbeat checks, uptime history, incidents with a timeline, scheduled maintenance and email subscriptions. This guide installs it with Docker Compose on a VPS, publishes it over HTTPS behind nginx, then sets up checks, incidents and alerts.",[38,42,52,86,89,105,109,112,115,118,121],{"type":39,"title":40,"body":41},"h2","Why a public status page","A monitoring tool tells your team that a service is down. A status page tells your users — and that is often what is missing during an incident: customers do not know whether the problem is on their side, open duplicate tickets and chase you on social media.\n\nKener combines both roles. Its checks test your services at regular intervals and publish the uptime history; when an incident happens, you add updates that everyone reads in one place. Hosting this page yourself avoids a status-page subscription billed per subscriber or per page, and keeps your monitoring data with you.",{"type":43,"title":44,"items":45},"ul","What Kener brings",[46,47,48,49,50,51],"**Built-in checks** — API and HTTP, ping, TCP, DNS, SSL, SQL and heartbeat for scheduled jobs.","**Incidents with a timeline** — every update stays visible, from detection to resolution.","**Scheduled maintenance** — announced in advance, with no false alert during the work.","**Email subscriptions** — visitors subscribe to the incidents and maintenance that concern them.","**Team alerts** — webhook, Slack, Discord and email, with message templates.","**Your brand** — logo, colours, light or dark theme, several pages, badges and widgets.",{"type":53,"title":54,"headers":55,"rows":59},"comparison","Kener, Uptime Kuma and Gatus",[5,56,57,58],"Kener","Uptime Kuma","Gatus",[60,65,70,74,78,81],[61,62,63,64],"Main role","Status page with built-in monitoring","Monitoring with optional status pages","Monitoring declared in YAML",[66,67,68,69],"Configuration","Web admin interface","Web interface","YAML file",[71,72,73,73],"Visitor email subscriptions","Yes (SMTP or Resend)","No",[75,76,76,77],"Several status pages","Yes","No, a single dashboard",[79,76,76,80],"Scheduled maintenance","Yes, declared in YAML",[82,83,84,85],"Storage","SQLite, PostgreSQL or MySQL, plus Redis","SQLite or MariaDB","Memory, SQLite or PostgreSQL",{"type":39,"title":87,"body":88},"Prerequisites","An Ubuntu 24.04 VPS with 1 GB of RAM and 10 GB of disk, Docker and the Compose plugin installed, and a hostname pointing to the VPS — for example `status.example.com`. Kener needs to know its public address: the `ORIGIN` variable drives its cross-site request protection, and any request from another origin is rejected. Also plan nginx and Certbot for HTTPS.",{"type":90,"title":91,"steps":92},"steps","Install Kener with Docker Compose",[93,96,99,102],{"title":94,"body":95},"Prepare the directory and the secret key","Create the application directory and a `.env` file holding the session signing key and the public address.\n```bash\nmkdir -p \u002Fopt\u002Fkener && cd \u002Fopt\u002Fkener\necho \"SECRET_KEY=$(openssl rand -hex 32)\" > .env\necho \"DOMAIN=status.example.com\" >> .env\nchmod 600 .env\n```",{"title":97,"body":98},"Write the docker-compose.yml file","Two services: Redis, which holds the job queues and the check scheduler, and Kener, with its SQLite database in a volume. The port is published on the loopback only: only nginx reaches it.\n```yaml\nservices:\n  redis:\n    image: redis:7.4-alpine\n    restart: unless-stopped\n    command: [\"redis-server\", \"--appendonly\", \"yes\"]\n    volumes:\n      - kener-redis:\u002Fdata\n    healthcheck:\n      test: [\"CMD\", \"redis-cli\", \"ping\"]\n      interval: 10s\n      timeout: 5s\n      retries: 10\n\n  kener:\n    image: rajnandan1\u002Fkener:4.1.10\n    restart: unless-stopped\n    depends_on:\n      redis:\n        condition: service_healthy\n    ports:\n      - \"127.0.0.1:3000:3000\"\n    environment:\n      KENER_SECRET_KEY: ${SECRET_KEY}\n      ORIGIN: https:\u002F\u002F${DOMAIN}\n      REDIS_URL: redis:\u002F\u002Fredis:6379\n      DATABASE_URL: sqlite:\u002F\u002F.\u002Fdatabase\u002Fkener.sqlite.db\n    volumes:\n      - kener-data:\u002Fapp\u002Fdatabase\n\nvolumes:\n  kener-data: {}\n  kener-redis: {}\n```",{"title":100,"body":101},"Start and check","Start the stack, then query the health endpoint: it answers as soon as the application is ready, usually within about fifteen seconds.\n```bash\ndocker compose up -d\ndocker compose ps\ncurl -fsS http:\u002F\u002F127.0.0.1:3000\u002Fhealthcheck\n```",{"title":103,"body":104},"Publish over HTTPS with nginx","Create a vhost that forwards requests to Kener, then get the certificate with `certbot --nginx -d status.example.com`.\n```nginx\nserver {\n    listen 443 ssl http2;\n    server_name status.example.com;\n    # ssl_certificate \u002F ssl_certificate_key: added by Certbot\n\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:3000;\n        proxy_set_header Host $host;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n    }\n}\n```",{"type":106,"title":107,"body":108},"tip","Create the admin account straight away","Kener creates no account in advance: the first visitor of `\u002Faccount\u002Fsignin` sees the **Create Admin Account** form and becomes administrator. Open this page as soon as HTTPS works and create your account with a strong password. After that the form disappears and any new creation is refused.",{"type":39,"title":110,"body":111},"Create your first checks","In the admin area, each monitor is one line on the public page. Start with three checks: an **API** check on your application's home page or health endpoint (expected HTTP code, maximum delay), an **SSL** check that turns to alert a few days before the certificate expires, and a **TCP** check on your database port if it is reachable from the VPS.\n\nFor a scheduled job — backup, export, synchronisation — use a **heartbeat** check: the job calls Kener when it finishes, and no signal at the expected time triggers the outage.\n```bash\n# at the end of your backup script\ncurl -fsS -m 10 https:\u002F\u002Fstatus.example.com\u002Fext\u002Fheartbeat\u002Fnightly-backup\u002FYOUR_SECRET\n```\n\nGroup monitors by service (website, API, payment) so the page stays readable, and hide those that only concern the team.",{"type":39,"title":113,"body":114},"Declare an incident and schedule maintenance","An incident is created from the admin area: title, affected monitors, severity, then successive updates — « investigating », « identified », « resolved ». Each update stays visible in the timeline, which beats a single message edited along the way.\n\nMaintenance is scheduled in advance with its start and end window. It shows on the page before the work, and the affected monitors do not count the interruption as an outage.",{"type":39,"title":116,"body":117},"Notify your team and your users","Two separate channels. For the team, alerts fire on a monitor's state and go to a webhook, Slack, Discord or an email, with adjustable message templates. For visitors, subscriptions send them incidents and maintenance by email, after they confirm their address with a code.\n\nBoth require email sending to be configured: add the `SMTP_HOST`, `SMTP_PORT`, `SMTP_USER`, `SMTP_PASSWORD` and `SMTP_SENDER` variables to the `kener` service environment, or `RESEND_API_KEY` and `RESEND_SENDER_EMAIL`, then restart with `docker compose up -d`. Then enable subscriptions in the admin area.",{"type":39,"title":119,"body":120},"Backup and updates","All the configuration and history live in the SQLite database of the `kener-data` volume; Redis only holds queues and cache. Back up the volume after briefly stopping the service to get a consistent copy:\n```bash\ncd \u002Fopt\u002Fkener\ndocker compose stop kener\ndocker run --rm -v kener_kener-data:\u002Fdata -v \"$PWD\":\u002Fbackup alpine \\\n  tar czf \u002Fbackup\u002Fkener-$(date +%F).tar.gz -C \u002Fdata .\ndocker compose start kener\n```\n\nTo update, read the release notes on the repository's releases page, change the image tag in `docker-compose.yml`, then run `docker compose pull && docker compose up -d`. The container upgrades its database on start: take the backup first.",{"type":39,"title":122,"body":123},"One-click install from the ServOrbit Marketplace","On a ServOrbit VPS, Kener installs from the Marketplace in your client area: choose the address — a subdomain of one of your domains or the VPS's free subdomain, HTTPS included — and click Install. The script deploys Kener and Redis, generates the secret key, sets the public address and configures nginx. All that is left is to open `\u002Faccount\u002Fsignin` to create the admin account, then add your checks.","Your status page, on your VPS","A ServOrbit Ubuntu 24.04 VPS with 1 GB of RAM is enough for Kener. One-click install from the Marketplace, HTTPS on your domain or on the VPS's free subdomain, secret key generated for you.","Install Kener","\u002Fmarketplace\u002Fmonitoring-observability\u002Fkener",[129,151,170],{"id":130,"slug":131,"slugs":132,"title":136,"excerpt":137,"readTime":138,"views":18,"isPinned":19,"publishedAt":139,"updatedAt":140,"category":141,"categories":146,"featuredImage":30,"bgImage":31,"posterImage":148,"relatedSolution":149},105,"monitoring-your-vps-with-uptime-kuma",{"fr":133,"en":131,"ar":134,"es":135},"superviser-vps-uptime-kuma","مراقبة-خادمك-الافتراضي-vps-باستخدام-uptime-kuma","supervisar-vps-con-uptime-kuma","Monitoring your VPS with Uptime Kuma","Deploy Uptime Kuma on your VPS to monitor your sites and services self-hosted, with alerts and a public status page.",8,"2026-03-07T00:00:00+00:00","2026-10-23T23:43:01+00:00",{"id":138,"name":142,"slug":143,"color":144,"icon":145},"Security & Monitoring","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[147],{"id":138,"name":142,"slug":143,"color":144,"icon":145},"\u002Fblog\u002Fcovers\u002Fsuperviser-vps-uptime-kuma-poster.svg",{"categorySlug":34,"appSlug":150},"uptime-kuma",{"id":152,"slug":153,"slugs":154,"title":158,"excerpt":159,"readTime":160,"views":161,"isPinned":19,"publishedAt":162,"updatedAt":163,"category":164,"categories":165,"featuredImage":30,"bgImage":31,"posterImage":167,"relatedSolution":168},209,"self-host-gatus-on-a-vps-config-as-code-status-page-and-checks",{"fr":155,"en":153,"ar":156,"es":157},"self-host-gatus-vps","استضافة-gatus-على-vps-صفحة-حالة-بالكود-ومراقبة-شاملة","alojar-gatus-en-un-vps","Self-host Gatus on a VPS: config-as-code status page and checks","Deploy Gatus on your ServOrbit VPS: a public status page plus HTTP, TCP, DNS, ICMP and TLS-expiry checks from one YAML file, with 40+ alert integrations.",4,1,"2026-08-02T00:00:00+00:00","2026-09-11T11:34:11+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[166],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fself-host-gatus-vps-poster.svg",{"categorySlug":34,"appSlug":169},"gatus",{"id":171,"slug":172,"slugs":173,"title":177,"excerpt":178,"readTime":179,"views":18,"isPinned":19,"publishedAt":180,"updatedAt":181,"category":182,"categories":183,"featuredImage":30,"bgImage":31,"posterImage":185,"relatedSolution":30},541,"monitor-client-site-availability-agency-monthly-report",{"fr":174,"en":172,"ar":175,"es":176},"monitoring-disponibilite-sites-clients-agence-rapport","مراقبة-توفر-مواقع-العملاء-الوكالة-التقرير-الشهري","monitorizar-disponibilidad-sitios-clientes-agencia-informe-mensual","Monitoring client site uptime: the monthly report","Probes, checks before alerting, maintenance windows and a monthly report: how an agency monitors client sites without drowning in false positives.",10,"2026-10-30T00:00:00+00:00","2026-10-31T01:54:06+00:00",{"id":138,"name":142,"slug":143,"color":144,"icon":145},[184],{"id":138,"name":142,"slug":143,"color":144,"icon":145},"\u002Fblog\u002Fcovers\u002Fmonitoring-disponibilite-sites-clients-agence-rapport-poster.svg",1793480368439]