diff --git a/CHANGELOG.md b/CHANGELOG.md index 869ce768..ad6ed4f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,13 @@ All notable changes to this project will be documented in this file. ## v1.24.0 - Unreleased ### Improvements -- Switch from croniter to cronsim (vendored in hc.lib.cronsim) +- Switch from croniter to cronsim - Change outgoing webhook timeout to 10s, but cap the total time to 20s - Implement automatic `api_ping` and `api_notification` pruning (#556) - Update Dockerfile to install apprise (#581) - Improve period and grace controls, allow up to 365 day periods (#281) - Add SIGTERM handling in sendalerts and sendreports +- Remove the "welcome" landing page, direct users to the sign in form instead ### Bug Fixes - Fix hc.api.views.ping to handle non-utf8 data in request body (#574) diff --git a/hc/accounts/tests/test_close_account.py b/hc/accounts/tests/test_close_account.py index 3306f068..d8c01455 100644 --- a/hc/accounts/tests/test_close_account.py +++ b/hc/accounts/tests/test_close_account.py @@ -34,7 +34,7 @@ class CloseAccountTestCase(BaseTestCase): payload = {"confirmation": "alice@example.org"} r = self.client.post("/accounts/close/", payload) - self.assertRedirects(r, "/") + self.assertRedirects(r, "/accounts/login/") # Alice should be gone alices = User.objects.filter(username="alice") @@ -68,7 +68,7 @@ class CloseAccountTestCase(BaseTestCase): payload = {"confirmation": "bob@example.org"} r = self.client.post("/accounts/close/", payload) - self.assertRedirects(r, "/") + self.assertRedirects(r, "/accounts/login/") # Alice should be still present self.alice.refresh_from_db() diff --git a/hc/accounts/views.py b/hc/accounts/views.py index 35f1b493..fbc61e60 100644 --- a/hc/accounts/views.py +++ b/hc/accounts/views.py @@ -631,7 +631,7 @@ def close(request): user.delete() request.session.flush() - return redirect("hc-index") + return redirect("hc-login") ctx = {} if "confirmation" in request.POST: diff --git a/hc/front/tests/test_basics.py b/hc/front/tests/test_basics.py index c1d20f74..9cf95ae2 100644 --- a/hc/front/tests/test_basics.py +++ b/hc/front/tests/test_basics.py @@ -4,24 +4,29 @@ from django.test.utils import override_settings class BasicsTestCase(TestCase): @override_settings(DEBUG=False, SECRET_KEY="abc") - def test_it_shows_welcome(self): + def test_it_redirects_to_login(self): r = self.client.get("/") - self.assertContains(r, "Get Notified", status_code=200) + self.assertRedirects(r, "/accounts/login/") + + @override_settings(DEBUG=False, SECRET_KEY="abc") + def test_it_shows_no_warning(self): + r = self.client.get("/accounts/login/") + self.assertContains(r, "Sign In to", status_code=200) self.assertNotContains(r, "do not use in production") @override_settings(DEBUG=True, SECRET_KEY="abc") def test_it_shows_debug_warning(self): - r = self.client.get("/") + r = self.client.get("/accounts/login/") self.assertContains(r, "Running in debug mode") @override_settings(DEBUG=False, SECRET_KEY="---") def test_it_shows_secret_key_warning(self): - r = self.client.get("/") - self.assertContains(r, "Get Notified", status_code=200) + r = self.client.get("/accounts/login/") + self.assertContains(r, "Sign In to", status_code=200) self.assertContains(r, "Running with an insecure SECRET_KEY value") @override_settings(REGISTRATION_OPEN=False) def test_it_obeys_registration_open(self): - r = self.client.get("/") + r = self.client.get("/accounts/login/") - self.assertNotContains(r, "Get Started") + self.assertNotContains(r, "Sign Up") diff --git a/hc/front/views.py b/hc/front/views.py index 019b1227..d58bc619 100644 --- a/hc/front/views.py +++ b/hc/front/views.py @@ -310,42 +310,7 @@ def index(request): return render(request, "front/projects.html", ctx) - check = Check() - - ctx = { - "page": "welcome", - "check": check, - "ping_url": check.url(), - "enable_apprise": settings.APPRISE_ENABLED is True, - "enable_call": settings.TWILIO_AUTH is not None, - "enable_discord": settings.DISCORD_CLIENT_ID is not None, - "enable_linenotify": settings.LINENOTIFY_CLIENT_ID is not None, - "enable_matrix": settings.MATRIX_ACCESS_TOKEN is not None, - "enable_mattermost": settings.MATTERMOST_ENABLED is True, - "enable_msteams": settings.MSTEAMS_ENABLED is True, - "enable_opsgenie": settings.OPSGENIE_ENABLED is True, - "enable_pagertree": settings.PAGERTREE_ENABLED is True, - "enable_pd": settings.PD_ENABLED is True, - "enable_pd_simple": settings.PD_APP_ID is not None, - "enable_prometheus": settings.PROMETHEUS_ENABLED is True, - "enable_pushbullet": settings.PUSHBULLET_CLIENT_ID is not None, - "enable_pushover": settings.PUSHOVER_API_TOKEN is not None, - "enable_shell": settings.SHELL_ENABLED is True, - "enable_signal": settings.SIGNAL_CLI_ENABLED is True, - "enable_slack": settings.SLACK_ENABLED is True, - "enable_slack_btn": settings.SLACK_CLIENT_ID is not None, - "enable_sms": settings.TWILIO_AUTH is not None, - "enable_spike": settings.SPIKE_ENABLED is True, - "enable_telegram": settings.TELEGRAM_TOKEN is not None, - "enable_trello": settings.TRELLO_APP_KEY is not None, - "enable_victorops": settings.VICTOROPS_ENABLED is True, - "enable_webhooks": settings.WEBHOOKS_ENABLED is True, - "enable_whatsapp": settings.TWILIO_USE_WHATSAPP, - "enable_zulip": settings.ZULIP_ENABLED is True, - "registration_open": settings.REGISTRATION_OPEN, - } - - return render(request, "front/welcome.html", ctx) + return redirect("hc-login") def dashboard(request): diff --git a/static/css/signup.css b/static/css/signup.css new file mode 100644 index 00000000..cf85d128 --- /dev/null +++ b/static/css/signup.css @@ -0,0 +1,28 @@ +#signup-modal .modal-header { + border-bottom: 0; +} + +#signup-modal .modal-body { + padding: 0 50px 50px 50px; +} + +#signup-modal div.title { + font-size: 30px; + text-align: center; + margin: 0 0 50px 0; +} + +#signup-modal label { + font-weight: normal; +} + +#signup-modal #link-instruction { + text-align: center; +} + +#signup-result { + margin-top: 20px; + text-align: center; + font-size: 18px; + display: none; +} \ No newline at end of file diff --git a/static/css/welcome.css b/static/css/welcome.css deleted file mode 100644 index a312123d..00000000 --- a/static/css/welcome.css +++ /dev/null @@ -1,189 +0,0 @@ -.page-welcome .navbar { - margin-bottom: 0; -} - -.index-bleed { - padding-bottom: 2em; -} - -.get-started-bleed { - background: var(--get-started-bg); - padding: 3em 0; -} - -.footer-jumbo-bleed { - background: #eee; -} - - -#pitch { - text-align: center; - padding: 100px 0; - margin: 0; - font-size: 36px; - font-weight: bold; -} - -#pitch small { - display: block; - margin-top: 10px; - font-size: 18px; - color: #333; -} - -#pitch-subtitle { - font-size: 14px; - margin-top: 0; - text-align: center; -} - -#pitch-url { - text-align: center; - font-family: monospace; - margin: 10px auto; -} - -#pitch-url code { - color: var(--text-color); - background: var(--pre-bg); - display: inline-block; - margin-top: 0px; - padding: 6px 9px; -} - -#pitch-text { - margin: 0 auto 72px auto; -} - -.nav-tabs { - margin-bottom: 0; -} - -#get-started h1 { - font-size: 20px; - line-height: 1.5; - margin: 0 0 20px 0; -} - -.tour-title { - margin: 50px 0; -} - - -.tour-section { - margin-bottom: 80px; -} - -.tour-section h3 { - margin-top: 10px; - font-weight: bold; -} - -#welcome-integrations { - margin-bottom: 80px; -} - -#welcome-integrations h2 { - font-size: 24px; - text-align: center; - margin-bottom: 20px; -} - -#welcome-integrations h2 small { - font-size: 14px; -} - -#welcome-integrations .integration { - display: block; - color: var(--text-color); - border: 1px solid var(--border-color); - border-radius: 3px; - padding: 20px 0; - text-align: center; - margin-bottom: 30px; - text-decoration: none; -} - -#welcome-integrations a.integration:hover { - border-color: #0091EA; - text-decoration: none; -} - -#welcome-integrations img { - width: 48px; - height: 48px; -} - -#welcome-integrations p { - font-size: 18px; - margin: 20px 0 0 0; - line-height: 1.1; -} - -#welcome-integrations p small { - font-size: 12px; - color: #777777; -} - -.use-cases li { - line-height: 200%; -} - -.page-welcome .tab-content { - border: 1px solid var(--border-color); - border-top: 0; -} - -#email.tab-pane { - padding: 20px; - margin: 0; -} - -.page-welcome .highlight:nth-child(n+2) { - border-top: 1px solid var(--border-color); -} - -.page-welcome .tab-pane pre { - margin-bottom: 0; - background: transparent; - padding: 15px; -} - -.tab-pane.tab-pane-email { - border: none; -} - -#signup-modal .modal-header { - border-bottom: 0; -} - -#signup-modal .modal-body { - padding: 0 50px 50px 50px; -} - -#signup-modal div.title { - font-size: 30px; - text-align: center; - margin: 0 0 50px 0; -} - -#signup-modal label { - font-weight: normal; -} - -#signup-modal #link-instruction { - text-align: center; -} - -#signup-result { - margin-top: 20px; - text-align: center; - font-size: 18px; - display: none; -} - -#footer-cta p { - max-width: 800px; - margin-left: auto; - margin-right: auto; -} diff --git a/templates/base.html b/templates/base.html index aa791786..0d59ec76 100644 --- a/templates/base.html +++ b/templates/base.html @@ -56,9 +56,9 @@ <link rel="stylesheet" href="{% static 'css/settings.css' %}" type="text/css"> <link rel="stylesheet" href="{% static 'css/snippet-copy.css' %}" type="text/css"> <link rel="stylesheet" href="{% static 'css/syntax.css' %}" type="text/css"> - <link rel="stylesheet" href="{% static 'css/welcome.css' %}" type="text/css"> <link rel="stylesheet" href="{% static 'css/set_password.css' %}" type="text/css"> <link rel="stylesheet" href="{% static 'css/project.css' %}" type="text/css"> + <link rel="stylesheet" href="{% static 'css/signup.css' %}" type="text/css"> {% endcompress %} </head> <body class="page-{{ page }}{% if request.user.is_authenticated and request.profile.theme == 'dark' %} dark{% endif%}"> diff --git a/templates/front/welcome.html b/templates/front/welcome.html deleted file mode 100644 index 3d91164c..00000000 --- a/templates/front/welcome.html +++ /dev/null @@ -1,787 +0,0 @@ -{% extends "base.html" %} -{% load compress hc_extras i18n static %} - -{% block description %} - <meta name="description" content="{% blocktrans %}Cron Monitoring. Monitor nightly backups, weekly reports, cron jobs and background tasks. Receive alerts when your tasks don't run on time.{% endblocktrans %}"> -{% endblock %} - - -{% block head %} - <link rel="canonical" href="{% site_root %}" /> -{% endblock %} - -{% block containers %} -<div class="index-bleed"> -<div class="container"> - <div class="row"> - <div class="col-sm-12"> - <h1 id="pitch"> - {% trans "Monitoring for your nightly backups, weekly reports, cron jobs and background tasks." %} - </h1> - </div> - </div> - - <div class="row"> - <div class="col-sm-6 col-sm-push-6"> - <p id="pitch-text"> - {% trans "Make HTTP requests to the Ping URL at regular intervals." %} - <strong> - {% blocktrans trimmed %} - When the URL is not pinged on time, - {{ site_name }} will send you an alert. - {% endblocktrans %} - </strong> - - {% trans "You can monitor any service that can make HTTP requests or send emails." %} - </p> - </div> - <div class="col-sm-6 col-sm-pull-6"> - <h2 id="pitch-subtitle"> - {% blocktrans trimmed %} - For each of your periodic tasks, - {{ site_name }} provides an unique URL similar to this one: - {% endblocktrans %} - </h2> - <div id="pitch-url"> - <code>{{ ping_url }}</code> - </div> - </div> - </div> - - <div class="row"> - <div class="col-sm-12"> - <ul class="nav nav-tabs" role="tablist"> - <li class="active"> - <a href="#crontab" data-toggle="tab">Crontab</a> - </li> - <li> - <a href="#bash" data-toggle="tab">Bash</a> - </li> - <li> - <a href="#python" data-toggle="tab">Python</a> - </li> - <li class="hidden-xs"> - <a href="#ruby" data-toggle="tab">Ruby</a> - </li> - <li class="hidden-xs"> - <a href="#node" data-toggle="tab">Node.js</a> - </li> - <li class="hidden-xs"> - <a href="#go" data-toggle="tab">Go</a> - </li> - <li class="hidden-xs"> - <a href="#php" data-toggle="tab">PHP</a> - </li> - <li class="hidden-xs"> - <a href="#cs" data-toggle="tab">C#</a> - </li> - <li class="hidden-xs"> - <a href="#browser" data-toggle="tab">{% trans "Browser" %}</a> - </li> - <li class="hidden-xs"> - <a href="#powershell" data-toggle="tab">PowerShell</a> - </li> - <li class="hidden-xs"> - <a href="#email" data-toggle="tab">{% trans "Email" %}</a> - </li> - </ul> - <div class="tab-content"> - <div role="tabpanel" class="tab-pane active" id="crontab"> - {% include "front/snippets/crontab.html" %} - </div> - <div role="tabpanel" class="tab-pane" id="bash"> - {% include "front/snippets/bash_curl.html" %} - {% include "front/snippets/bash_wget.html" %} - </div> - <div role="tabpanel" class="tab-pane" id="python"> - {% include "front/snippets/python_urllib2.html" %} - {% include "front/snippets/python_requests.html" %} - </div> - <div role="tabpanel" class="tab-pane" id="ruby"> - {% include "front/snippets/ruby.html" %} - </div> - <div role="tabpanel" class="tab-pane" id="node"> - {% include "front/snippets/node.html" %} - </div> - <div role="tabpanel" class="tab-pane" id="go"> - {% include "front/snippets/go.html" %} - </div> - <div role="tabpanel" class="tab-pane" id="php"> - {% include "front/snippets/php.html" %} - </div> - <div role="tabpanel" class="tab-pane" id="cs"> - {% include "front/snippets/cs.html" %} - </div> - <div class="tab-pane" id="browser"> - {% include "front/snippets/browser.html" %} - </div> - <div class="tab-pane" id="powershell"> - {% include "front/snippets/powershell.html" %} - {% include "front/snippets/powershell_inline.html" %} - </div> - <div class="tab-pane tab-pane-email" id="email"> - <p> - {% blocktrans trimmed %} - As an alternative to HTTP requests, - you can also report "liveness" by - <strong>sending email messages</strong>. - {% endblocktrans %} - </p> - <p> - {% blocktrans trimmed %} - You can instruct {{ site_name }} to look for a particular - keyword in the subject line. This is handy when your backup - software sends an email after every run, and uses a different - subject line depending on success or failure. - {% endblocktrans %} - </p> - </div> - </div> - </div> - </div> -</div> -</div> - -{% if registration_open %} -<div class="get-started-bleed"> -<div class="container"> - <div class="row"> - <div id="get-started" class="col-sm-8 col-sm-offset-2 text-center"> - <h1> - {% blocktrans trimmed %} - {{ site_name }} monitors the heartbeat messages sent by your cron - jobs, services and APIs. Get immediate alerts when they don't - arrive on schedule. - {% endblocktrans %} - </h1> - <a href="#" data-toggle="modal" data-target="#signup-modal" class="btn btn-lg btn-primary"> - {% trans "Sign Up – It's Free" %} - </a> - </div> - </div> -</div> -</div> -{% endif %} - -<div class="container"> - <div class="row"> - <div class="col-sm-12"> - <h2 class="tour-title"> - {% trans "A quick peek of what's inside:" %} - </h2> - </div> - </div> - - <div class="row tour-section"> - <div class="col-sm-8"> - <img - class="img-responsive" - src="{% static 'img/my_checks.png' %}" - srcset="{% static 'img/my_checks.png'%} 1x, {% static 'img/my_checks@2x.png'%} 2x" - alt="My Checks page" /> - </div> - <div class="col-sm-4"> - <h3> - {% trans "Live-updating Dashboard" %} - </h3> - <p> - {% blocktrans trimmed %} - A list of your checks, one for each Cron job, daemon or - scheduled task you want to monitor. - {% endblocktrans %} - </p> - <p> - {% blocktrans trimmed %} - Give names and assign tags to your checks to easily recognize - them later. - {% endblocktrans %} - </p> - <p> - {% blocktrans trimmed %} - Tap on the integration icons to toggle them on and off. - {% endblocktrans %} - </p> - <p> - {% blocktrans trimmed %} - Adjust Period and Grace time to match the - periodicity and duration of your tasks. - {% endblocktrans %} - </p> - </div> - </div> - - <div class="row tour-section"> - <div class="col-sm-8"> - <img - class="img-responsive" - src="{% static 'img/period_grace.png' %}" - srcset="{% static 'img/period_grace.png'%} 1x, {% static 'img/period_grace@2x.png'%} 2x" - alt="Period/Grace Time dialog" /> - </div> - <div class="col-sm-4"> - <h3>{% trans "Simple Configuration" %}</h3> - {% blocktrans trimmed %} - Each check has configurable <strong>Period</strong> and <strong>Grace Time</strong> parameters. - Depending on these parameters and time since the last ping, the check is in one of the - following states: - {% endblocktrans %} - - <table class="table"> - <tr> - <td> - <span class="status ic-new"></span> - </td> - <td> - {% blocktrans trimmed %} - New. - A check that has been created, but has not received any pings yet. - {% endblocktrans %} - </td> - </tr> - <tr> - <td> - <span class="status ic-up"></span> - </td> - <td> - {% blocktrans trimmed %} - Up. - The time since the last ping has not exceeded <strong>Period</strong>. - {% endblocktrans %} - </td> - </tr> - <tr> - <td> - <span class="status ic-grace"></span> - </td> - <td> - {% blocktrans trimmed %} - Late. - The time since the last ping has exceeded <strong>Period</strong>, - but has not yet exceeded <strong>Period</strong> + <strong>Grace</strong>. - {% endblocktrans %} - </td> - </tr> - <tr> - <td> - <span class="status ic-down"></span> - </td> - <td> - {% blocktrans trimmed %} - Down. - The time since the last ping has exceeded <strong>Period</strong> + <strong>Grace</strong>. - When a check goes from "Late" to "Down", {{ site_name }} - sends you a notification. - {% endblocktrans %} - </td> - </tr> - </table> - - </div> - </div> - - <div class="row tour-section"> - <div class="col-sm-8"> - <img - class="img-responsive" - src="{% static 'img/cron.png' %}" - srcset="{% static 'img/cron.png'%} 1x, {% static 'img/cron@2x.png'%} 2x" - alt="Cron dialog" /> - </div> - <div class="col-sm-4"> - <h3>{% trans "Cron Expression Support" %}</h3> - <p> - {% blocktrans trimmed %} - Alternatively, you can define the expected ping dates and times - using a cron expression. See - {% endblocktrans %} - <a href="{% url 'hc-docs-cron' %}"> - {% trans "Cron Syntax Cheatsheet" %} - </a> - {% blocktrans trimmed %} - for the supported syntax features. - {% endblocktrans %} - </p> - <p> - {% blocktrans trimmed %} - <strong>Grace Time</strong> specifies how "late" a ping can - be before you are alerted. You should set it to be a little above - the expected duration of your cron job. - {% endblocktrans %} - </p> - </div> - </div> - - <div class="row tour-section"> - <div class="col-sm-8"> - <img - class="img-responsive" - src="{% static 'img/check_details.png' %}" - srcset="{% static 'img/check_details.png'%} 1x, {% static 'img/check_details@2x.png'%} 2x" - alt="Details Page" /> - </div> - <div class="col-sm-4"> - <h3>{% trans "Details and Event Log" %}</h3> - <p> - {% blocktrans trimmed %} - You can add a longer, free-form description to each - check. Leave notes and pointers for yourself and - your team. - {% endblocktrans %} - </p> - <p> - {% blocktrans trimmed %} - You can also see the log of received pings and - sent "Down" notifications. - {% endblocktrans %} - </p> - </div> - </div> - - <div class="row tour-section"> - <div class="col-sm-8"> - <img - class="img-responsive" - src="{% static 'img/badges.png' %}" - srcset="{% static 'img/badges.png'%} 1x, {% static 'img/badges@2x.png'%} 2x" - alt="Details Page" /> - </div> - <div class="col-sm-4"> - <h3>{% trans "Public Status Badges" %}</h3> - <p> - {% blocktrans trimmed %} - {{ site_name }} provides status badges for each of the tags - you have used. Additionally, the "{{ site_name }}" badge - shows the overall status of all checks in your account. - {% endblocktrans %} - </p> - <p> - {% blocktrans trimmed %} - The badges have public but hard-to-guess URLs. - You can use them in your READMEs, dashboards, or status pages. - {% endblocktrans %} - </p> - </div> - </div> - - <div id="welcome-integrations" class="row"> - <div class="col-sm-12"> - <h2>{% trans "Integrations" %}<br> - <small> - {% trans "Set up multiple ways to get notified:" %} - </small> - </h2> - </div> - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/email.png' %}" class="icon" alt="" /> - <p> - {% trans "Email" %}<br> - <small> </small> - </p> - </div> - </div> - - {% if enable_webhooks %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/webhook.png' %}" class="icon" alt="" /> - <p> - Webhooks<br> - <small> </small> - </p> - </div> - </div> - {% endif %} - - {% if enable_slack %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - {% if enable_slack_btn %} - <a href="{% url 'hc-slack-help' %}" class="integration"> - <img src="{% static 'img/integrations/slack.png' %}" class="icon" alt="" /> - <p> - Slack<br> - <small>{% trans "Chat" %}</small> - </p> - </a> - {% else %} - <div class="integration"> - <img src="{% static 'img/integrations/slack.png' %}" class="icon" alt="" /> - <p> - Slack<br> - <small>{% trans "Chat" %}</small> - </p> - </div> - {% endif %} - </div> - {% endif %} - - {% if enable_apprise %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/apprise.png' %}" class="icon" alt="" /> - <p> - Apprise<br> - <small>{% trans "Push Notifications" %}</small> - </p> - </div> - </div> - {% endif %} - - {% if enable_discord %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/discord.png' %}" class="icon" alt="" /> - <p> - Discord<br> - <small>{% trans "Chat" %}</small> - </p> - </div> - </div> - {% endif %} - - {% if enable_linenotify %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/linenotify.png' %}" class="icon" alt="" /> - <p>LINE Notify<br><small>Chat</small></p> - </div> - </div> - {% endif %} - - {% if enable_matrix %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/matrix.png' %}" class="icon" alt="" /> - <p> - Matrix<br> - <small>{% trans "Chat" %}</small> - </p> - </div> - </div> - {% endif %} - - {% if enable_mattermost %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/mattermost.png' %}" class="icon" alt="" /> - <p> - Mattermost<br> - <small>{% trans "Chat" %}</small> - </p> - </div> - </div> - {% endif %} - - {% if enable_msteams %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/msteams.png' %}" class="icon" alt="" /> - <p> - Microsoft Teams<br> - <small>{% trans "Chat" %}</small> - </p> - </div> - </div> - {% endif %} - - {% if enable_opsgenie %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/opsgenie.png' %}" class="icon" alt="" /> - <p> - OpsGenie<br> - <small>{% trans "Incident Management" %}</small> - </p> - </div> - </div> - {% endif %} - - {% if enable_pd %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - {% if enable_pd_simple %} - <a href="{% url 'hc-pagerduty-help' %}" class="integration"> - <img src="{% static 'img/integrations/pd.png' %}" class="icon" alt="" /> - <p> - PagerDuty<br> - <small>{% trans "Incident Management" %}</small> - </p> - </a> - {% else %} - <div class="integration"> - <img src="{% static 'img/integrations/pd.png' %}" class="icon" alt="" /> - <p> - PagerDuty<br> - <small>{% trans "Incident Management" %}</small> - </p> - </div> - {% endif %} - </div> - {% endif %} - - {% if enable_pagertree %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/pagertree.png' %}" class="icon" alt="" /> - <p> - PagerTree<br> - <small>{% trans "Incident Management" %}</small> - </p> - </div> - </div> - {% endif %} - - {% if enable_call %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/call.png' %}" class="icon" alt="" /> - <p> - {% trans "Phone Call" %}<br> - <small> </small> - </p> - </div> - </div> - {% endif %} - - {% if enable_prometheus %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <a href="{% url 'hc-serve-doc' 'configuring_prometheus' %}" class="integration"> - <img src="{% static 'img/integrations/prometheus.png' %}" class="icon" alt="" /> - <p> - Prometheus<br> - <small>{% trans "Event Monitoring" %}</small> - </p> - </a> - </div> - {% endif %} - - {% if enable_pushbullet %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/pushbullet.png' %}" class="icon" alt="" /> - <p> - Pushbullet<br> - <small>{% trans "Push Notifications" %}</small> - </p> - </div> - </div> - {% endif %} - - {% if enable_pushover %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <a href="{% url 'hc-pushover-help' %}" class="integration"> - <img src="{% static 'img/integrations/po.png' %}" class="icon" alt="" /> - <p> - Pushover<br> - <small>{% trans "Push Notifications" %}</small> - </p> - </a> - </div> - {% endif %} - - {% if enable_shell %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/shell.png' %}" class="icon" alt="" /> - <p> - {% trans "Shell Commands" %}<br> - <small> </small> - </p> - </div> - </div> - {% endif %} - - {% if enable_signal %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/signal.png' %}" class="icon" alt="" /> - <p> - {% trans "Signal" %}<br> - <small>{% trans "Chat" %}</small> - </p> - </div> - </div> - {% endif %} - - {% if enable_sms %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/sms.png' %}" class="icon" alt="" /> - <p> - {% trans "SMS" %}<br> - <small> </small> - </p> - </div> - </div> - {% endif %} - - {% if enable_spike %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/spike.png' %}" class="icon" alt="Spike.sh icon" /> - <p> - Spike.sh<br> - <small>{% trans "Incident Management" %}</small> - </p> - </div> - </div> - {% endif %} - - {% if enable_telegram %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <a href="{% url 'hc-telegram-help' %}" class="integration"> - <img src="{% static 'img/integrations/telegram.png' %}" class="icon" alt="" /> - <p> - Telegram<br> - <small>{% trans "Chat" %}</small> - </p> - </a> - </div> - {% endif %} - - {% if enable_trello %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/trello.png' %}" class="icon" alt="" /> - <p> - Trello<br> - <small>{% trans "Project Management" %}</small> - </p> - </div> - </div> - {% endif %} - - {% if enable_victorops %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/victorops.png' %}" class="icon" alt="" /> - <p> - Splunk On-Call<br> - <small>{% trans "Incident Management" %}</small> - </p> - </div> - </div> - {% endif %} - - {% if enable_whatsapp %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/whatsapp.png' %}" class="icon" alt="" /> - <p> - WhatsApp<br> - <small>{% trans "Chat" %}</small> - </p> - </div> - </div> - {% endif %} - - {% if enable_zulip %} - <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> - <div class="integration"> - <img src="{% static 'img/integrations/zulip.png' %}" class="icon" alt="" /> - <p> - Zulip<br> - <small>{% trans "Chat" %}</small> - </p> - </div> - </div> - {% endif %} - </div> - - <div class="row tour-section"> - <div class="col-sm-12"> - <h1 class="text-center"> - {% blocktrans trimmed %} - What Can I Monitor With {{ site_name }}? - {% endblocktrans %} - </h1> - </div> - <div class="col-sm-6 use-cases"> - <h3>{% trans "Cron Jobs" %}</h3> - <p> - {% blocktrans trimmed %} - {{ site_name }} monitoring is a great fit for cron jobs and cron-like - systems (systemd timers, Jenkins build jobs, Windows Scheduled Tasks, - wp-cron, uwsgi cron-like interface, Heroku Scheduler, ...). A failed - cron job often has no immediate visible consequences and can go - unnoticed for a long time. - {% endblocktrans %} - </p> - - <p>{% trans "Specific examples:" %}</p> - <ul> - <li>{% trans "Filesystem backups" %}</li> - <li>{% trans "Database backups" %}</li> - <li>{% trans "Daily, weekly, monthly report emails" %}</li> - <li>{% trans "SSL renewals" %}</li> - <li>{% trans "Business data import and sync" %}</li> - <li>{% trans "Antivirus scans" %}</li> - <li>{% trans "Dynamic DNS updates" %}</li> - </ul> - </div> - <div class="col-sm-6 use-cases"> - <h3>{% trans "Processes, Services, Servers" %}</h3> - - <p> - {% blocktrans trimmed %} - You can use {{ site_name }} for lightweight server - monitoring: ensuring a particular system service or the whole server - is alive and healthy. Write a shell script that checks for a - specific condition, and pings {{ site_name }} if successful. Run the - shell script regularly. - {% endblocktrans %} - </p> - - <p>{% trans "Specific examples:" %}</p> - <ul> - <li>{% trans "Check a specific docker container is running" %}</li> - <li>{% trans "Check a specific application process is running" %}</li> - <li>{% trans "Check database replication lag" %}</li> - <li>{% trans "Check system resources: free disk, free RAM, ..." %}</li> - <li> - {% blocktrans trimmed %} - Send simple, unconditional "I'm alive" messages from your server - (or your NAS, router, Raspberry Pi, ...) - {% endblocktrans %} - </li> - </ul> - </div> - </div> - - <div class="row"> - - {% if registration_open %} - <div class="footer-jumbo-bleed"> - <div class="col-sm-10 col-sm-offset-1"> - <div id="footer-cta" class="jumbotron text-center"> - <p> - {% blocktrans trimmed %} - {{ site_name }} is a <strong>free</strong> and - <a href="https://github.com/healthchecks/healthchecks">open source</a> - service. Setting up monitoring for your cron jobs only takes minutes. - Start sleeping better at nights! - {% endblocktrans %} - </p> - <a href="#" data-toggle="modal" data-target="#signup-modal" class="btn btn-lg btn-primary"> - {% trans "Sign Up" %} - </a> - </div> - </div> - </div> - {% endif %} - - </div> -</div> - -{% include "front/signup_modal.html" %} - -{% endblock %} - -{% block scripts %} -{% compress js %} -<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script> -<script src="{% static 'js/bootstrap.min.js' %}"></script> -<script src="{% static 'js/clipboard.min.js' %}"></script> -<script src="{% static 'js/snippet-copy.js' %}"></script> -<script src="{% static 'js/signup.js' %}"></script> -{% endcompress %} -{% endblock %}