Vail/Monitors

Monitors

Add services to your status page and choose how each one is checked.

Services live in the groups array of settings.json. Each group is a heading on the page with its services listed under it.

"groups": [
  {
    "name": "Websites",
    "services": [
      { "name": "Website", "description": "Main site", "type": "http", "target": "https://example.com" },
      { "name": "API", "description": "Public API", "type": "http", "target": "https://api.example.com/health" }
    ]
  },
  {
    "name": "Game Servers",
    "services": [
      { "name": "Survival", "description": "Minecraft Java", "type": "minecraft", "target": "play.example.com" }
    ]
  }
]

When Checks Run

Vail checks every service when someone opens the page, then reuses the results for 15 seconds. There is no background job, so nothing runs while nobody is looking, and Vail does not keep a history.

Service Options

OptionRequiredWhat it does
nameYesThe service name.
descriptionYesA line under the name.
typeYeshttp, tcp, minecraft, srv or manual.
targetFor every type but manualThe URL, hostname or IP to check.
portFor tcpThe port to connect to.
srvRecordNoThe SRV record to look up for srv.
timeoutMsNoHow long to wait, in milliseconds. Defaults to 5000.
statusFor manualoperational, degraded, outage or maintenance.

A service missing its target, or its port for tcp, is not checked and shows as Operational. Double-check new entries after adding them.

http

Sends a request to target and times the answer.

AnswerStatus
200 to 399Operational
400 to 499Degraded
500 or more, no answer or a timeoutOutage
{ "name": "API", "description": "Public API", "type": "http", "target": "https://api.example.com/health", "timeoutMs": 4000 }

Point it at a health route if you have one, so a slow homepage does not count against you.

tcp

Opens a connection to target on port. Use it for a VPS, database, SSH or any other open port. It is Operational if the connection opens and Outage if not.

{ "name": "Database", "description": "PostgreSQL", "type": "tcp", "target": "db.example.com", "port": 5432 }

minecraft

Finds a Minecraft Java server the same way the game does:

  1. With a port, connects to target on that port.
  2. Otherwise looks up _minecraft._tcp.<target> and connects to the host and port it points to.
  3. If there is no record, tries the parent domain, so play.example.com also checks _minecraft._tcp.example.com.
  4. Falls back to port 25565.
{ "name": "Survival", "description": "Minecraft Java", "type": "minecraft", "target": "play.example.com" }

srv

Looks up an SRV record and connects to the first host and port it lists. Uses srvRecord, or target if you leave it out.

{ "name": "Voice", "description": "Voice server", "type": "srv", "target": "voice.example.com", "srvRecord": "_ts3._udp.voice.example.com" }

manual

Not checked. Shows the status you set. Use it for services Vail cannot reach, such as a payment provider, or to mark something as under maintenance.

{ "name": "Payments", "description": "Checkout provider", "type": "manual", "status": "maintenance" }

A manual service set to maintenance changes the summary banner to Active System Maintenance.