Minimalistic uptime server in Elixir with HTTP API and WebSocket SPA status page with proxy to Instatus. See up.erp.uno. UP supports mupltiple Accounts, multiple Sites per account, multiple Components per Site, multiple Incidents per Components, multiple Maintenances per Incident, multiple Subscription callback per Site.
Similar produts: Sematext, Hyperping, Cronitor, Atlassian Statuspage, Better Uptime, Instatus, Freshstatus, Statuspal, Cachet, Vigil, StatusCast, Statping.
- Incidents reporting
- Maintenance announcing
- Components management
- Callback URL Subscriptions
- Telemetry
Public Endpoints (Announce):
get "/"
Security Admin Endpoints:
get "/accounts"
get "/accounts/:id"
put "/accounts/"
Account Auth Endpoints:
get "/incidents"
get "/incidents/:id"
put "/incidents/:id"
get "/sites"
get "/sites/:id"
put "/sites/:id"
get "/maintenance"
get "/maintenance/:id"
put "/maintenance/:id"
get "/metrics"
get "/metrics/:id"
put "/metrics/:id"
get "/components"
get "/components/:id"
put "/components/:id"
get "/subscriptions"
get "/subscriptions/:id"
put "/subscriptions/:id"
$ mix deps.get
$ iex -S mix
UP UPTIME/STATUS version 1.0.
1: HTTP API listening at port: 5010.
2: WebSocket NITRO listening at port: 5011.
Interactive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
The schema objects have the following life cycles:
- For
Site
:UP
|HASISSUES
|MAINTENANCE
. - For
Component
:AUTH_ERR
|WRITE_ERR
|READ_ERR
|EXTERNAL_ERR
. - For
Incident
:NEW_IDENTIFIED
|INVESTIGATING_PROCESS
|CLOSED
|RESOLVED
|AWAITING_EXTERNAL
. - For
Maintenance
:NOTSTARTEDYET
|INPROGRESS
|COMPLETED
.
Accounts could only by created with security admin API key, which can
be set with :application.set_env(:up, :security_admin, "secret")
.
Then you can add new accounts.
Create User:
$ curl -H "Auth: secret" -X PUT "http://localhost:5010/account" -d @priv/account.json
[
{
"id": "maxim-0012",
"spec": "put",
"type": "accounts"
}
]
List Users:
$ curl -H "Auth: secret" -X GET "http://localhost:5010/account"
[
{
"result": [
{
"id": "maxim-0012",
"key": "01707128300216989000",
"name": "Maksym Sokhatskyi",
"sites": []
}
],
"spec": "lst",
"type": "accounts"
}
]
$ curl -H "Auth: 01707128300216989000" -X GET "http://localhost:5010/site/maxim-0012"
[
{
"result": [],
"spec": "get",
"type": "sites"
}
]
$ curl -H "Auth: 01707128300216989000" -X GET "http://localhost:5010/subscription/maxim-0012"
[
{
"result": [],
"spec": "get",
"type": "subscriptions"
}
]
$ curl -H "Auth: 01707128300216989000" -X GET "http://localhost:5010/component/maxim-0012"
[
{
"result": [],
"spec": "get",
"type": "component"
}
]
$ curl -H "Auth: 01707135870515017000" -X GET "http://localhost:5010/maintenance"
[
{
"result": [
{
"account": "01707135870515049000",
"id": "01707136783810045000",
"incident": [],
"name": "Maksym Sokhatskyi"
},
{
"account": "01707135870515049000",
"id": "01707136783833913000",
"incident": [],
"name": "Maksym Sokhatskyi"
}
],
"spec": "lst",
"type": "maintenance"
}
]