From df807b4e7da6a252a6c9c98bbd382f8435d0ed83 Mon Sep 17 00:00:00 2001 From: Sukka Date: Sun, 3 Sep 2023 16:21:08 +0800 Subject: [PATCH] Initial commit --- .gitattributes | 9 + .github/ISSUE_TEMPLATE/bug_report.md | 40 ++ .github/ISSUE_TEMPLATE/config.yml | 8 + .github/ISSUE_TEMPLATE/maintainance-event.md | 17 + .github/workflows/graphs.yml | 32 ++ .github/workflows/response-time.yml | 33 ++ .github/workflows/setup.yml | 65 +++ .github/workflows/site.yml | 41 ++ .github/workflows/summary.yml | 32 ++ .github/workflows/update-template.yml | 32 ++ .github/workflows/updates.yml | 30 + .github/workflows/uptime.yml | 33 ++ .templaterc.json | 3 + .upptimerc.yml | 31 + LICENSE | 21 + README.md | 117 ++++ api/google/response-time-day.json | 1 + api/google/response-time-month.json | 1 + api/google/response-time-week.json | 1 + api/google/response-time-year.json | 1 + api/google/response-time.json | 1 + api/google/uptime-day.json | 1 + api/google/uptime-month.json | 1 + api/google/uptime-week.json | 1 + api/google/uptime-year.json | 1 + api/google/uptime.json | 1 + api/hacker-news/response-time-day.json | 1 + api/hacker-news/response-time-month.json | 1 + api/hacker-news/response-time-week.json | 1 + api/hacker-news/response-time-year.json | 1 + api/hacker-news/response-time.json | 1 + api/hacker-news/uptime-day.json | 1 + api/hacker-news/uptime-month.json | 1 + api/hacker-news/uptime-week.json | 1 + api/hacker-news/uptime-year.json | 1 + api/hacker-news/uptime.json | 1 + api/test-broken-site/response-time-day.json | 1 + api/test-broken-site/response-time-month.json | 1 + api/test-broken-site/response-time-week.json | 1 + api/test-broken-site/response-time-year.json | 1 + api/test-broken-site/response-time.json | 1 + api/test-broken-site/uptime-day.json | 1 + api/test-broken-site/uptime-month.json | 1 + api/test-broken-site/uptime-week.json | 1 + api/test-broken-site/uptime-year.json | 1 + api/test-broken-site/uptime.json | 1 + api/wikipedia/response-time-day.json | 1 + api/wikipedia/response-time-month.json | 1 + api/wikipedia/response-time-week.json | 1 + api/wikipedia/response-time-year.json | 1 + api/wikipedia/response-time.json | 1 + api/wikipedia/uptime-day.json | 1 + api/wikipedia/uptime-month.json | 1 + api/wikipedia/uptime-week.json | 1 + api/wikipedia/uptime-year.json | 1 + api/wikipedia/uptime.json | 1 + assets/upptime-icon.svg | 4 + graphs/google.png | Bin 0 -> 16200 bytes graphs/google/response-time-day.png | Bin 0 -> 12110 bytes graphs/google/response-time-month.png | Bin 0 -> 27588 bytes graphs/google/response-time-week.png | Bin 0 -> 17932 bytes graphs/google/response-time-year.png | Bin 0 -> 71690 bytes graphs/google/response-time.png | Bin 0 -> 70950 bytes graphs/hacker-news.png | Bin 0 -> 12250 bytes graphs/hacker-news/response-time-day.png | Bin 0 -> 3434 bytes graphs/hacker-news/response-time-month.png | Bin 0 -> 34647 bytes graphs/hacker-news/response-time-week.png | Bin 0 -> 16624 bytes graphs/hacker-news/response-time-year.png | Bin 0 -> 124569 bytes graphs/hacker-news/response-time.png | Bin 0 -> 130137 bytes graphs/test-broken-site/response-time-day.png | Bin 0 -> 1196 bytes .../test-broken-site/response-time-month.png | Bin 0 -> 1196 bytes .../test-broken-site/response-time-week.png | Bin 0 -> 1196 bytes .../test-broken-site/response-time-year.png | Bin 0 -> 1196 bytes graphs/test-broken-site/response-time.png | Bin 0 -> 1196 bytes graphs/wikipedia.png | Bin 0 -> 23004 bytes graphs/wikipedia/response-time-day.png | Bin 0 -> 11739 bytes graphs/wikipedia/response-time-month.png | Bin 0 -> 27715 bytes graphs/wikipedia/response-time-week.png | Bin 0 -> 17258 bytes graphs/wikipedia/response-time-year.png | Bin 0 -> 96680 bytes graphs/wikipedia/response-time.png | Bin 0 -> 107420 bytes history/LICENSE | 540 ++++++++++++++++++ history/google.yml | 7 + history/hacker-news.yml | 7 + history/summary.json | 469 +++++++++++++++ history/test-broken-site.yml | 7 + history/wikipedia.yml | 7 + 86 files changed, 1625 insertions(+) create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/maintainance-event.md create mode 100644 .github/workflows/graphs.yml create mode 100644 .github/workflows/response-time.yml create mode 100644 .github/workflows/setup.yml create mode 100644 .github/workflows/site.yml create mode 100644 .github/workflows/summary.yml create mode 100644 .github/workflows/update-template.yml create mode 100644 .github/workflows/updates.yml create mode 100644 .github/workflows/uptime.yml create mode 100644 .templaterc.json create mode 100644 .upptimerc.yml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 api/google/response-time-day.json create mode 100644 api/google/response-time-month.json create mode 100644 api/google/response-time-week.json create mode 100644 api/google/response-time-year.json create mode 100644 api/google/response-time.json create mode 100644 api/google/uptime-day.json create mode 100644 api/google/uptime-month.json create mode 100644 api/google/uptime-week.json create mode 100644 api/google/uptime-year.json create mode 100644 api/google/uptime.json create mode 100644 api/hacker-news/response-time-day.json create mode 100644 api/hacker-news/response-time-month.json create mode 100644 api/hacker-news/response-time-week.json create mode 100644 api/hacker-news/response-time-year.json create mode 100644 api/hacker-news/response-time.json create mode 100644 api/hacker-news/uptime-day.json create mode 100644 api/hacker-news/uptime-month.json create mode 100644 api/hacker-news/uptime-week.json create mode 100644 api/hacker-news/uptime-year.json create mode 100644 api/hacker-news/uptime.json create mode 100644 api/test-broken-site/response-time-day.json create mode 100644 api/test-broken-site/response-time-month.json create mode 100644 api/test-broken-site/response-time-week.json create mode 100644 api/test-broken-site/response-time-year.json create mode 100644 api/test-broken-site/response-time.json create mode 100644 api/test-broken-site/uptime-day.json create mode 100644 api/test-broken-site/uptime-month.json create mode 100644 api/test-broken-site/uptime-week.json create mode 100644 api/test-broken-site/uptime-year.json create mode 100644 api/test-broken-site/uptime.json create mode 100644 api/wikipedia/response-time-day.json create mode 100644 api/wikipedia/response-time-month.json create mode 100644 api/wikipedia/response-time-week.json create mode 100644 api/wikipedia/response-time-year.json create mode 100644 api/wikipedia/response-time.json create mode 100644 api/wikipedia/uptime-day.json create mode 100644 api/wikipedia/uptime-month.json create mode 100644 api/wikipedia/uptime-week.json create mode 100644 api/wikipedia/uptime-year.json create mode 100644 api/wikipedia/uptime.json create mode 100644 assets/upptime-icon.svg create mode 100644 graphs/google.png create mode 100644 graphs/google/response-time-day.png create mode 100644 graphs/google/response-time-month.png create mode 100644 graphs/google/response-time-week.png create mode 100644 graphs/google/response-time-year.png create mode 100644 graphs/google/response-time.png create mode 100644 graphs/hacker-news.png create mode 100644 graphs/hacker-news/response-time-day.png create mode 100644 graphs/hacker-news/response-time-month.png create mode 100644 graphs/hacker-news/response-time-week.png create mode 100644 graphs/hacker-news/response-time-year.png create mode 100644 graphs/hacker-news/response-time.png create mode 100644 graphs/test-broken-site/response-time-day.png create mode 100644 graphs/test-broken-site/response-time-month.png create mode 100644 graphs/test-broken-site/response-time-week.png create mode 100644 graphs/test-broken-site/response-time-year.png create mode 100644 graphs/test-broken-site/response-time.png create mode 100644 graphs/wikipedia.png create mode 100644 graphs/wikipedia/response-time-day.png create mode 100644 graphs/wikipedia/response-time-month.png create mode 100644 graphs/wikipedia/response-time-week.png create mode 100644 graphs/wikipedia/response-time-year.png create mode 100644 graphs/wikipedia/response-time.png create mode 100644 history/LICENSE create mode 100644 history/google.yml create mode 100644 history/hacker-news.yml create mode 100644 history/summary.json create mode 100644 history/test-broken-site.yml create mode 100644 history/wikipedia.yml diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..2a9eb71da2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +# Markdown +*.md linguist-detectable=true +*.md linguist-documentation=false + +# JSON +*.json linguist-detectable=true + +# YAML +*.yml linguist-detectable=true diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..e705887d41 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,40 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: 'bug' +assignees: 'AnandChowdhary' + +--- + + + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..5c1e200992 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: true +contact_links: + - name: Feature requests and ideas + url: https://github.com/upptime/upptime/discussions/new?category=ideas + about: Suggest an idea for this project + - name: Questions + url: https://github.com/upptime/upptime/discussions/new?category=q-a + about: Please ask and answer questions here diff --git a/.github/ISSUE_TEMPLATE/maintainance-event.md b/.github/ISSUE_TEMPLATE/maintainance-event.md new file mode 100644 index 0000000000..7abcd25324 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/maintainance-event.md @@ -0,0 +1,17 @@ +--- +name: Maintenance Event +about: Schedule a work window +title: "[Scheduled Maintenance] Site down for Maintenance" +labels: maintenance +assignees: '' + +--- + + + +**Additional context** +Who/what/when/where/why is this maintenance happening diff --git a/.github/workflows/graphs.yml b/.github/workflows/graphs.yml new file mode 100644 index 0000000000..5fa2831912 --- /dev/null +++ b/.github/workflows/graphs.yml @@ -0,0 +1,32 @@ +# This file was generated by upptime/uptime-monitor@v1.31.2 +# +# =============================== +# Do not edit this file directly! +# =============================== +# +# Your changes will be overwritten when the template updates (daily) +# Instead, change your .upptimerc.yml configuration: https://upptime.js.org/docs + +name: Graphs CI +on: + schedule: + - cron: "0 0 * * *" + repository_dispatch: + types: [graphs] + workflow_dispatch: +jobs: + release: + name: Generate graphs + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + token: ${{ secrets.GH_PAT || github.token }} + - name: Generate graphs + uses: upptime/uptime-monitor@v1.31.2 + with: + command: "graphs" + env: + GH_PAT: ${{ secrets.GH_PAT || github.token }} diff --git a/.github/workflows/response-time.yml b/.github/workflows/response-time.yml new file mode 100644 index 0000000000..e1f8e5de83 --- /dev/null +++ b/.github/workflows/response-time.yml @@ -0,0 +1,33 @@ +# This file was generated by upptime/uptime-monitor@v1.31.2 +# +# =============================== +# Do not edit this file directly! +# =============================== +# +# Your changes will be overwritten when the template updates (daily) +# Instead, change your .upptimerc.yml configuration: https://upptime.js.org/docs + +name: Response Time CI +on: + schedule: + - cron: "0 23 * * *" + repository_dispatch: + types: [response_time] + workflow_dispatch: +jobs: + release: + name: Check status + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + token: ${{ secrets.GH_PAT || github.token }} + - name: Update response time + uses: upptime/uptime-monitor@v1.31.2 + with: + command: "response-time" + env: + GH_PAT: ${{ secrets.GH_PAT || github.token }} + SECRETS_CONTEXT: ${{ toJson(secrets) }} diff --git a/.github/workflows/setup.yml b/.github/workflows/setup.yml new file mode 100644 index 0000000000..9a38e4ccde --- /dev/null +++ b/.github/workflows/setup.yml @@ -0,0 +1,65 @@ +# This file was generated by upptime/uptime-monitor@v1.31.2 +# +# =============================== +# Do not edit this file directly! +# =============================== +# +# Your changes will be overwritten when the template updates (daily) +# Instead, change your .upptimerc.yml configuration: https://upptime.js.org/docs + +name: Setup CI +on: + push: + paths: + - ".upptimerc.yml" + repository_dispatch: + types: [setup] + workflow_dispatch: +jobs: + release: + name: Setup Upptime + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + token: ${{ secrets.GH_PAT || github.token }} + - name: Update template + uses: upptime/uptime-monitor@v1.31.2 + with: + command: "update-template" + env: + GH_PAT: ${{ secrets.GH_PAT || github.token }} + - name: Update response time + uses: upptime/uptime-monitor@v1.31.2 + with: + command: "response-time" + env: + GH_PAT: ${{ secrets.GH_PAT || github.token }} + SECRETS_CONTEXT: ${{ toJson(secrets) }} + - name: Update summary in README + uses: upptime/uptime-monitor@v1.31.2 + with: + command: "readme" + env: + GH_PAT: ${{ secrets.GH_PAT || github.token }} + - name: Generate graphs + uses: benc-uk/workflow-dispatch@v1 + with: + workflow: Graphs CI + token: ${{ secrets.GH_PAT || github.token }} + - name: Generate site + uses: upptime/uptime-monitor@v1.31.2 + with: + command: "site" + env: + GH_PAT: ${{ secrets.GH_PAT || github.token }} + - uses: peaceiris/actions-gh-pages@v3.7.3 + name: GitHub Pages Deploy + with: + github_token: ${{ secrets.GH_PAT || github.token }} + publish_dir: "site/status-page/__sapper__/export/" + force_orphan: "false" + user_name: "Upptime Bot" + user_email: "73812536+upptime-bot@users.noreply.github.com" diff --git a/.github/workflows/site.yml b/.github/workflows/site.yml new file mode 100644 index 0000000000..c62bc1e7ff --- /dev/null +++ b/.github/workflows/site.yml @@ -0,0 +1,41 @@ +# This file was generated by upptime/uptime-monitor@v1.31.2 +# +# =============================== +# Do not edit this file directly! +# =============================== +# +# Your changes will be overwritten when the template updates (daily) +# Instead, change your .upptimerc.yml configuration: https://upptime.js.org/docs + +name: Static Site CI +on: + schedule: + - cron: "0 1 * * *" + repository_dispatch: + types: [static_site] + workflow_dispatch: +jobs: + release: + name: Build and deploy site + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, '[skip ci]')" + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + token: ${{ secrets.GH_PAT || github.token }} + - name: Generate site + uses: upptime/uptime-monitor@v1.31.2 + with: + command: "site" + env: + GH_PAT: ${{ secrets.GH_PAT || github.token }} + - uses: peaceiris/actions-gh-pages@v3.7.3 + name: GitHub Pages Deploy + with: + github_token: ${{ secrets.GH_PAT || github.token }} + publish_dir: "site/status-page/__sapper__/export/" + force_orphan: "false" + user_name: "Upptime Bot" + user_email: "73812536+upptime-bot@users.noreply.github.com" diff --git a/.github/workflows/summary.yml b/.github/workflows/summary.yml new file mode 100644 index 0000000000..acdcee2ab6 --- /dev/null +++ b/.github/workflows/summary.yml @@ -0,0 +1,32 @@ +# This file was generated by upptime/uptime-monitor@v1.31.2 +# +# =============================== +# Do not edit this file directly! +# =============================== +# +# Your changes will be overwritten when the template updates (daily) +# Instead, change your .upptimerc.yml configuration: https://upptime.js.org/docs + +name: Summary CI +on: + schedule: + - cron: "0 0 * * *" + repository_dispatch: + types: [summary] + workflow_dispatch: +jobs: + release: + name: Generate README + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + token: ${{ secrets.GH_PAT || github.token }} + - name: Update summary in README + uses: upptime/uptime-monitor@v1.31.2 + with: + command: "readme" + env: + GH_PAT: ${{ secrets.GH_PAT || github.token }} diff --git a/.github/workflows/update-template.yml b/.github/workflows/update-template.yml new file mode 100644 index 0000000000..6011bc2f0e --- /dev/null +++ b/.github/workflows/update-template.yml @@ -0,0 +1,32 @@ +# This file was generated by upptime/uptime-monitor@v1.31.2 +# +# =============================== +# Do not edit this file directly! +# =============================== +# +# Your changes will be overwritten when the template updates (daily) +# Instead, change your .upptimerc.yml configuration: https://upptime.js.org/docs + +name: Update Template CI +on: + schedule: + - cron: "0 0 * * *" + repository_dispatch: + types: [update_template] + workflow_dispatch: +jobs: + release: + name: Build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + token: ${{ secrets.GH_PAT || github.token }} + - name: Update template + uses: upptime/uptime-monitor@master + with: + command: "update-template" + env: + GH_PAT: ${{ secrets.GH_PAT || github.token }} diff --git a/.github/workflows/updates.yml b/.github/workflows/updates.yml new file mode 100644 index 0000000000..3fe298dc86 --- /dev/null +++ b/.github/workflows/updates.yml @@ -0,0 +1,30 @@ +# This file was generated by upptime/uptime-monitor@v1.31.2 +# +# =============================== +# Do not edit this file directly! +# =============================== +# +# Your changes will be overwritten when the template updates (daily) +# Instead, change your .upptimerc.yml configuration: https://upptime.js.org/docs + +name: Updates CI +on: + schedule: + - cron: "0 3 * * *" + repository_dispatch: + types: [updates] + workflow_dispatch: +jobs: + release: + name: Deploy updates + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + token: ${{ secrets.GH_PAT || github.token }} + - name: Update code + uses: upptime/updates@master + env: + GH_PAT: ${{ secrets.GH_PAT || github.token }} diff --git a/.github/workflows/uptime.yml b/.github/workflows/uptime.yml new file mode 100644 index 0000000000..f1a02d26cb --- /dev/null +++ b/.github/workflows/uptime.yml @@ -0,0 +1,33 @@ +# This file was generated by upptime/uptime-monitor@v1.31.2 +# +# =============================== +# Do not edit this file directly! +# =============================== +# +# Your changes will be overwritten when the template updates (daily) +# Instead, change your .upptimerc.yml configuration: https://upptime.js.org/docs + +name: Uptime CI +on: + schedule: + - cron: "*/5 * * * *" + repository_dispatch: + types: [uptime] + workflow_dispatch: +jobs: + release: + name: Check status + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + token: ${{ secrets.GH_PAT || github.token }} + - name: Check endpoint status + uses: upptime/uptime-monitor@v1.31.2 + with: + command: "update" + env: + GH_PAT: ${{ secrets.GH_PAT || github.token }} + SECRETS_CONTEXT: ${{ toJson(secrets) }} diff --git a/.templaterc.json b/.templaterc.json new file mode 100644 index 0000000000..3c6c2a1140 --- /dev/null +++ b/.templaterc.json @@ -0,0 +1,3 @@ +{ + "files": [".github/**/*"] +} diff --git a/.upptimerc.yml b/.upptimerc.yml new file mode 100644 index 0000000000..ef29512458 --- /dev/null +++ b/.upptimerc.yml @@ -0,0 +1,31 @@ +# Change these first +owner: upptime # Your GitHub organization or username, where this repository lives +repo: upptime # The name of this repository + +sites: + - name: Google + url: https://www.google.com + - name: Wikipedia + url: https://en.wikipedia.org + - name: Hacker News + url: https://news.ycombinator.com + - name: Test Broken Site + url: https://thissitedoesnotexist.koj.co + +status-website: + # Add your custom domain name, or remove the `cname` line if you don't have a domain + # Uncomment the `baseUrl` line if you don't have a custom domain and add your repo name there + cname: demo.upptime.js.org + # baseUrl: /your-repo-name + logoUrl: https://raw.githubusercontent.com/upptime/upptime.js.org/master/static/img/icon.svg + name: Upptime + introTitle: "**Upptime** is the open-source uptime monitor and status page, powered entirely by GitHub." + introMessage: This is a sample status page which uses **real-time** data from our [GitHub repository](https://github.com/upptime/upptime). No server required — just GitHub Actions, Issues, and Pages. [**Get your own for free**](https://github.com/upptime/upptime) + navbar: + - title: Status + href: / + - title: GitHub + href: https://github.com/$OWNER/$REPO + +# Upptime also supports notifications, assigning issues, and more +# See https://upptime.js.org/docs/configuration diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..f76bb38c5d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Anand Chowdhary + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000000..826505913f --- /dev/null +++ b/README.md @@ -0,0 +1,117 @@ +# [![Upptime](https://raw.githubusercontent.com/upptime/upptime.js.org/master/static/img/logo.svg)](https://upptime.js.org) + + + +**Upptime** (https://upptime.js.org) is the open-source uptime monitor and status page, powered entirely by GitHub Actions, Issues, and Pages. It's made with 💚 by your friends at [Koj](https://koj.co). + +> I find Upptime an incredible clever usage of \[GitHub Actions]. You essentially get a free configurable uptime monitor for whatever you want. – [CSS Tricks](https://css-tricks.com/upptime/) + +Upptime is used by [**1,000+**](https://github.com/topics/upptime) people and teams to ensure they know when their endpoints go down. + + + +[![Uptime CI](https://github.com/upptime/upptime/workflows/Uptime%20CI/badge.svg)](https://github.com/upptime/upptime/actions?query=workflow%3A%22Uptime+CI%22) +[![Response Time CI](https://github.com/upptime/upptime/workflows/Response%20Time%20CI/badge.svg)](https://github.com/upptime/upptime/actions?query=workflow%3A%22Response+Time+CI%22) +[![Graphs CI](https://github.com/upptime/upptime/workflows/Graphs%20CI/badge.svg)](https://github.com/upptime/upptime/actions?query=workflow%3A%22Graphs+CI%22) +[![Static Site CI](https://github.com/upptime/upptime/workflows/Static%20Site%20CI/badge.svg)](https://github.com/upptime/upptime/actions?query=workflow%3A%22Static+Site+CI%22) +[![Summary CI](https://github.com/upptime/upptime/workflows/Summary%20CI/badge.svg)](https://github.com/upptime/upptime/actions?query=workflow%3A%22Summary+CI%22) + +## [📈 Live Status](https://demo.upptime.js.org): **🟧 Partial outage** + + + + + +| URL | Status | History | Response Time | Uptime | +| --- | ------ | ------- | ------------- | ------ | +| [Google](https://www.google.com) | 🟩 Up | [google.yml](https://github.com/upptime/upptime/commits/HEAD/history/google.yml) |
Response time graph 103ms
Response time 102
24-hour response time 90
7-day response time 103
30-day response time 105
1-year response time 106
|
100.00%All-time uptime 100.00%
24-hour uptime 100.00%
7-day uptime 100.00%
30-day uptime 100.00%
1-year uptime 99.99%
+| [Wikipedia](https://en.wikipedia.org) | 🟩 Up | [wikipedia.yml](https://github.com/upptime/upptime/commits/HEAD/history/wikipedia.yml) |
Response time graph 169ms
Response time 212
24-hour response time 265
7-day response time 169
30-day response time 199
1-year response time 214
|
100.00%All-time uptime 100.00%
24-hour uptime 100.00%
7-day uptime 100.00%
30-day uptime 100.00%
1-year uptime 100.00%
+| [Hacker News](https://news.ycombinator.com) | 🟩 Up | [hacker-news.yml](https://github.com/upptime/upptime/commits/HEAD/history/hacker-news.yml) |
Response time graph 220ms
Response time 305
24-hour response time 127
7-day response time 220
30-day response time 298
1-year response time 309
|
100.00%All-time uptime 98.27%
24-hour uptime 100.00%
7-day uptime 100.00%
30-day uptime 99.96%
1-year uptime 94.85%
+| [Test Broken Site](https://thissitedoesnotexist.koj.co) | 🟥 Down | [test-broken-site.yml](https://github.com/upptime/upptime/commits/HEAD/history/test-broken-site.yml) |
Response time graph 0ms
Response time 0
24-hour response time 0
7-day response time 0
30-day response time 0
1-year response time 0
|
0.00%All-time uptime 0.00%
24-hour uptime 0.00%
7-day uptime 0.00%
30-day uptime 0.00%
1-year uptime 0.00%
+ + + + + +## ⭐ How it works + +- GitHub Actions is used as an uptime monitor + - Every 5 minutes, a workflow visits your website to make sure it's up + - Response time is recorded every 6 hours and committed to git + - Graphs of response time are generated every day +- GitHub Issues is used for incident reports + - An issue is opened if an endpoint is down + - People from your team are assigned to the issue + - Incidents reports are posted as issue comments + - Issues are locked so non-members cannot comment on them + - Issues are closed automatically when your site comes back up + - Slack notifications are sent on updates +- GitHub Pages is used for the status website + - A simple, beautiful, and accessible PWA is generated + - Built with Svelte and Sapper + - Fetches data from this repository using the GitHub API + +_Upptime is not affiliated to or endorsed by GitHub._ + +[![Screenshot of status website](https://raw.githubusercontent.com/upptime/upptime.js.org/master/static/img/screenshot-status.png)](https://upptime.js.org) + +## 👩‍💻 [Documentation](https://upptime.js.org) + +1. [How it works](https://upptime.js.org/docs) +1. [Getting started](https://upptime.js.org/docs/get-started) +1. [Configuration](https://upptime.js.org/docs/configuration) +1. [Triggers](https://upptime.js.org/docs/triggers) +1. [Notifications](https://upptime.js.org/docs/notifications) +1. [Badges](https://upptime.js.org/docs/badges) +1. [Packages](https://upptime.js.org/docs/packages) +1. [Contributing](https://upptime.js.org/docs/contributing) +1. [Frequently Asked Questions](https://upptime.js.org/docs/faq) + +### Concepts + +#### Issues as incidents + +When the GitHub Actions workflow detects that one of your URLs is down, it automatically opens a GitHub issue ([example issue #67](https://github.com/upptime/upptime/issues/67)). You can add incident reports to this issue by adding comments. When your site comes back up, the issue will be closed automatically as well. + + + + + + +
+ Screenshot of GitHub issue + + Screenshot of incident page +
+ +#### Commits for response time + +Four times per day, another workflow runs and records the response time of your websites. This data is committed to GitHub, so it's available in the commit history of each file ([example commit history](https://github.com/koj-co/upptime/commits/master/history/wikipedia.yml)). Then, the GitHub API is used to graph the response time history of each endpoint and to track when a site went down. + + + + + + +
+ Screenshot of GitHub commits + + Screenshot of live status +
+ + +## 📄 License + +- Code: [MIT](./LICENSE) © [Koj](https://koj.co) +- Data in the `./history` directory: [Open Database License](https://opendatacommons.org/licenses/odbl/1-0/) + + +

+ + Koj + +

+

+ An open source project by Koj.
Furnish your home in style, for as low as CHF175/month →
+

+ diff --git a/api/google/response-time-day.json b/api/google/response-time-day.json new file mode 100644 index 0000000000..340670cdf2 --- /dev/null +++ b/api/google/response-time-day.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 24h","message":"90 ms","color":"brightgreen"} diff --git a/api/google/response-time-month.json b/api/google/response-time-month.json new file mode 100644 index 0000000000..ad5e4cc4af --- /dev/null +++ b/api/google/response-time-month.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 30d","message":"105 ms","color":"brightgreen"} diff --git a/api/google/response-time-week.json b/api/google/response-time-week.json new file mode 100644 index 0000000000..3573ca6fcc --- /dev/null +++ b/api/google/response-time-week.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 7d","message":"103 ms","color":"brightgreen"} diff --git a/api/google/response-time-year.json b/api/google/response-time-year.json new file mode 100644 index 0000000000..9bdbe138e4 --- /dev/null +++ b/api/google/response-time-year.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 1y","message":"106 ms","color":"brightgreen"} diff --git a/api/google/response-time.json b/api/google/response-time.json new file mode 100644 index 0000000000..924e5c7383 --- /dev/null +++ b/api/google/response-time.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time","message":"102 ms","color":"brightgreen"} diff --git a/api/google/uptime-day.json b/api/google/uptime-day.json new file mode 100644 index 0000000000..226baeab58 --- /dev/null +++ b/api/google/uptime-day.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 24h","message":"100%","color":"brightgreen"} diff --git a/api/google/uptime-month.json b/api/google/uptime-month.json new file mode 100644 index 0000000000..059c01da0a --- /dev/null +++ b/api/google/uptime-month.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 30d","message":"100%","color":"brightgreen"} diff --git a/api/google/uptime-week.json b/api/google/uptime-week.json new file mode 100644 index 0000000000..fccd794d26 --- /dev/null +++ b/api/google/uptime-week.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 7d","message":"100%","color":"brightgreen"} diff --git a/api/google/uptime-year.json b/api/google/uptime-year.json new file mode 100644 index 0000000000..e26af93c15 --- /dev/null +++ b/api/google/uptime-year.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 1y","message":"99.99%","color":"brightgreen"} diff --git a/api/google/uptime.json b/api/google/uptime.json new file mode 100644 index 0000000000..bd71d6f882 --- /dev/null +++ b/api/google/uptime.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime","message":"100%","color":"brightgreen"} diff --git a/api/hacker-news/response-time-day.json b/api/hacker-news/response-time-day.json new file mode 100644 index 0000000000..5ab4fa17a0 --- /dev/null +++ b/api/hacker-news/response-time-day.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 24h","message":"127 ms","color":"brightgreen"} diff --git a/api/hacker-news/response-time-month.json b/api/hacker-news/response-time-month.json new file mode 100644 index 0000000000..82cc546b52 --- /dev/null +++ b/api/hacker-news/response-time-month.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 30d","message":"298 ms","color":"green"} diff --git a/api/hacker-news/response-time-week.json b/api/hacker-news/response-time-week.json new file mode 100644 index 0000000000..edea0d7642 --- /dev/null +++ b/api/hacker-news/response-time-week.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 7d","message":"220 ms","color":"green"} diff --git a/api/hacker-news/response-time-year.json b/api/hacker-news/response-time-year.json new file mode 100644 index 0000000000..a596769e29 --- /dev/null +++ b/api/hacker-news/response-time-year.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 1y","message":"309 ms","color":"green"} diff --git a/api/hacker-news/response-time.json b/api/hacker-news/response-time.json new file mode 100644 index 0000000000..394bfd7379 --- /dev/null +++ b/api/hacker-news/response-time.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time","message":"305 ms","color":"green"} diff --git a/api/hacker-news/uptime-day.json b/api/hacker-news/uptime-day.json new file mode 100644 index 0000000000..226baeab58 --- /dev/null +++ b/api/hacker-news/uptime-day.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 24h","message":"100%","color":"brightgreen"} diff --git a/api/hacker-news/uptime-month.json b/api/hacker-news/uptime-month.json new file mode 100644 index 0000000000..9d8261fcd6 --- /dev/null +++ b/api/hacker-news/uptime-month.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 30d","message":"99.96%","color":"brightgreen"} diff --git a/api/hacker-news/uptime-week.json b/api/hacker-news/uptime-week.json new file mode 100644 index 0000000000..fccd794d26 --- /dev/null +++ b/api/hacker-news/uptime-week.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 7d","message":"100%","color":"brightgreen"} diff --git a/api/hacker-news/uptime-year.json b/api/hacker-news/uptime-year.json new file mode 100644 index 0000000000..4377afaba2 --- /dev/null +++ b/api/hacker-news/uptime-year.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 1y","message":"94.85%","color":"green"} diff --git a/api/hacker-news/uptime.json b/api/hacker-news/uptime.json new file mode 100644 index 0000000000..ffea0b0330 --- /dev/null +++ b/api/hacker-news/uptime.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime","message":"98.27%","color":"brightgreen"} diff --git a/api/test-broken-site/response-time-day.json b/api/test-broken-site/response-time-day.json new file mode 100644 index 0000000000..7c501ec98a --- /dev/null +++ b/api/test-broken-site/response-time-day.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 24h","message":"0 ms","color":"red"} diff --git a/api/test-broken-site/response-time-month.json b/api/test-broken-site/response-time-month.json new file mode 100644 index 0000000000..d7245c628d --- /dev/null +++ b/api/test-broken-site/response-time-month.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 30d","message":"0 ms","color":"red"} diff --git a/api/test-broken-site/response-time-week.json b/api/test-broken-site/response-time-week.json new file mode 100644 index 0000000000..578e0757ec --- /dev/null +++ b/api/test-broken-site/response-time-week.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 7d","message":"0 ms","color":"red"} diff --git a/api/test-broken-site/response-time-year.json b/api/test-broken-site/response-time-year.json new file mode 100644 index 0000000000..c60b234b80 --- /dev/null +++ b/api/test-broken-site/response-time-year.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 1y","message":"0 ms","color":"red"} diff --git a/api/test-broken-site/response-time.json b/api/test-broken-site/response-time.json new file mode 100644 index 0000000000..3ef4a0d46d --- /dev/null +++ b/api/test-broken-site/response-time.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time","message":"0 ms","color":"red"} diff --git a/api/test-broken-site/uptime-day.json b/api/test-broken-site/uptime-day.json new file mode 100644 index 0000000000..7ca7a963fb --- /dev/null +++ b/api/test-broken-site/uptime-day.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 24h","message":"0%","color":"red"} diff --git a/api/test-broken-site/uptime-month.json b/api/test-broken-site/uptime-month.json new file mode 100644 index 0000000000..deb931b9f1 --- /dev/null +++ b/api/test-broken-site/uptime-month.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 30d","message":"0%","color":"red"} diff --git a/api/test-broken-site/uptime-week.json b/api/test-broken-site/uptime-week.json new file mode 100644 index 0000000000..a18f456594 --- /dev/null +++ b/api/test-broken-site/uptime-week.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 7d","message":"0%","color":"red"} diff --git a/api/test-broken-site/uptime-year.json b/api/test-broken-site/uptime-year.json new file mode 100644 index 0000000000..03954cfc98 --- /dev/null +++ b/api/test-broken-site/uptime-year.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 1y","message":"0%","color":"red"} diff --git a/api/test-broken-site/uptime.json b/api/test-broken-site/uptime.json new file mode 100644 index 0000000000..0657891e4f --- /dev/null +++ b/api/test-broken-site/uptime.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime","message":"0%","color":"red"} diff --git a/api/wikipedia/response-time-day.json b/api/wikipedia/response-time-day.json new file mode 100644 index 0000000000..7246d0d904 --- /dev/null +++ b/api/wikipedia/response-time-day.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 24h","message":"265 ms","color":"green"} diff --git a/api/wikipedia/response-time-month.json b/api/wikipedia/response-time-month.json new file mode 100644 index 0000000000..cfa36ab23a --- /dev/null +++ b/api/wikipedia/response-time-month.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 30d","message":"199 ms","color":"brightgreen"} diff --git a/api/wikipedia/response-time-week.json b/api/wikipedia/response-time-week.json new file mode 100644 index 0000000000..3588604dc2 --- /dev/null +++ b/api/wikipedia/response-time-week.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 7d","message":"169 ms","color":"brightgreen"} diff --git a/api/wikipedia/response-time-year.json b/api/wikipedia/response-time-year.json new file mode 100644 index 0000000000..2b59363b81 --- /dev/null +++ b/api/wikipedia/response-time-year.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time 1y","message":"214 ms","color":"green"} diff --git a/api/wikipedia/response-time.json b/api/wikipedia/response-time.json new file mode 100644 index 0000000000..35578a8b97 --- /dev/null +++ b/api/wikipedia/response-time.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"response time","message":"212 ms","color":"green"} diff --git a/api/wikipedia/uptime-day.json b/api/wikipedia/uptime-day.json new file mode 100644 index 0000000000..226baeab58 --- /dev/null +++ b/api/wikipedia/uptime-day.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 24h","message":"100%","color":"brightgreen"} diff --git a/api/wikipedia/uptime-month.json b/api/wikipedia/uptime-month.json new file mode 100644 index 0000000000..059c01da0a --- /dev/null +++ b/api/wikipedia/uptime-month.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 30d","message":"100%","color":"brightgreen"} diff --git a/api/wikipedia/uptime-week.json b/api/wikipedia/uptime-week.json new file mode 100644 index 0000000000..fccd794d26 --- /dev/null +++ b/api/wikipedia/uptime-week.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 7d","message":"100%","color":"brightgreen"} diff --git a/api/wikipedia/uptime-year.json b/api/wikipedia/uptime-year.json new file mode 100644 index 0000000000..8923b68ad6 --- /dev/null +++ b/api/wikipedia/uptime-year.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime 1y","message":"100%","color":"brightgreen"} diff --git a/api/wikipedia/uptime.json b/api/wikipedia/uptime.json new file mode 100644 index 0000000000..bd71d6f882 --- /dev/null +++ b/api/wikipedia/uptime.json @@ -0,0 +1 @@ +{"schemaVersion":1,"label":"uptime","message":"100%","color":"brightgreen"} diff --git a/assets/upptime-icon.svg b/assets/upptime-icon.svg new file mode 100644 index 0000000000..f909d51a29 --- /dev/null +++ b/assets/upptime-icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/graphs/google.png b/graphs/google.png new file mode 100644 index 0000000000000000000000000000000000000000..52f13e8d0dd5b6f28921351cc7296dcc0d08d1cf GIT binary patch literal 16200 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 F{~rP&)AaxV literal 0 HcmV?d00001 diff --git a/graphs/google/response-time-day.png b/graphs/google/response-time-day.png new file mode 100644 index 0000000000000000000000000000000000000000..fdeb8471c9c2cfa997ade20be68ebee44b158cce GIT binary patch literal 12110 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

ubnrb#Xfr3#((6g&_7UT_5b0U(2^;D>y%P- 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 X4TB;-mfv^<9zjay)#MA#nfmNDmI112x1AbwC zP?U#&?(Tmwn)Bj7peLX=5NUPyl@Y`9-PGX#PKF0~T zF-!T9Kn;h=4>E;+48+ggyR=?p+i&@jqvPfm>duy|xy1}V2L%@@;z>!I`0kzgqB1Zr zL?{{E?kDT3v{r5>!LsAi4TQ9AmHblBMWH; zP5J$U`Y%Y!p?V6lg1$qgTUisv$a|rG{d3%qyxEC-x78}?hPf80DC~2=(Bi&{1=^49 zUN|rBdyq%4{xKN*>Sut4-bC8v(b~Iz*5>^2*l=f@nT}vrL+WZW_WQY19F7SFu&xoD4nPWA=%P=>;0T`bLnwRFX&HW>00fICCFdxApKtfIw2kQx=CiV zrSf1=x%kTI>7`p5J`?cYXF4?(LRa(XhqjLp{3K|aL`Dx{4`|-W{c+`iVWB8K3gU{8 z#N=RL$igmGvZ6=5Ud$rot&uI)h^7;PF7P$}V$9y7)mMe_d%DfI}Q z!%3UFgyzV$78ykAwmG+Qdoz8#C~=Oap5dCoQ<@Eb zYB!9nEx4NA;KI!?ip(E`5%|RypjM3w2LZ}@uu{IXLV*HCpZ0hlDXtzWpp^gQ!?eui zO?bbUs3}BK2W{H~|0f+WEeE)vm(a&%y!-#J1k>{M&~i&dKn@Ay=N)%oFxn!zT=~y? zWsE%;ZXiZz3f1F*wAi?6d0k8kiAcQu8)@YI)(bG|;!rgQ&G-=BgF>mEWliccaQMBz zh6Y>*FY$ilVSrReo09mH6}^9|{#4Hq<)G0tAw$G^Qe9hc^EwH_FUu z0Or{V8}vhr<)i;E2wK$(3<;?9_7n7WW2*QOK;fW=)yr8-bHkFFwRI{3#{Z`|hH8O& zG{B<&4F{f~;BDxV9z<#+Z~_MX?<-7;k4=!e!i!YWV!8*v9>ZSx*w)WqA4po9_TK}L zsgjvt8J1$WR3itY|ym*+XDny1%VM0MKF{_ z%U#jT(XBsUKK!>(a8`i7Moxe!<)R{dN8O1lVkY`O1<*D9@N2Zf=%W#|qA8O-_|FKS zPwIs#t_g|b@6Xvhiea5J4=R+6@;5!!E+Nx-sSd+nU;R%CVh*s*mXafuCI&}8^I6^h zgb-wdssgjU07v{IHu}wTj|>7bz#fO@VD;&}9MfZn5_`~GNEq