Single-binary self-hosted uptime monitoring and status pages on Rust axum: HTTP probes, Lighthouse audits, SEO crawler, and PDF reports.
axumdockerrustself-hostedsqlitestatus-pageuptime-monitoringvite
1<!doctype html>
2<html lang="en">
3<head>
4 <meta charset="utf-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1">
6 <title>{% block title %}{{ title }}{% endblock %} · Status</title>
7 <meta name="description" content="{% block description %}{{ description }}{% endblock %}">
8 {% if BASE_URL %}<base href="{{ BASE_URL }}">{% endif %}
9 <link rel="icon" type="image/svg+xml" href="{{ url_for('favicon') }}">
10 {% block extra_head %}{% endblock %}
11 <link rel="stylesheet" href="{{ vite_asset('static_src/base/index.js', 'css') }}">
12 {% block extra_css %}{% endblock %}
13</head>
14<body>
15 {% include 'includes/messages.html' %}
16
17 {% block nav %}
18 <nav class="navbar navbar-dark navbar-expand-md d-print-none">
19 <div class="container">
20 <a class="navbar-brand" href="/">
21 <span class="logo" aria-hidden="true">
22 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
23 <polyline points="2,34 18,34 24,28 30,14 36,52 42,20 48,34 62,34"
24 fill="none" stroke="#6b9e78" stroke-width="6"
25 stroke-linejoin="round" stroke-linecap="round"/>
26 <circle cx="30" cy="14" r="3.5" fill="#c9a84c"/>
27 </svg>
28 </span>
29 <span class="brand-text">Status</span>
30 <span class="brand-dot" aria-hidden="true"></span>
31 </a>
32 <button class="navbar-toggler border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navMain" aria-controls="navMain" aria-expanded="false" aria-label="Toggle navigation">
33 <span class="navbar-toggler-icon"></span>
34 </button>
35 <div class="collapse navbar-collapse" id="navMain">
36 <ul class="navbar-nav ms-3">
37 {% if user.is_authenticated %}
38 <li class="nav-item"><a class="nav-link {% if request.path == '/properties' %}active{% endif %}" href="/properties">Properties</a></li>
39 {% else %}
40 <li class="nav-item"><a class="nav-link {% if request.path == '/' %}active{% endif %}" href="/">Home</a></li>
41 <li class="nav-item"><a class="nav-link {% if request.path == '/changelog' %}active{% endif %}" href="/changelog">Changelog</a></li>
42 {% endif %}
43 </ul>
44 <ul class="navbar-nav ms-auto">
45 {% if user.is_authenticated %}
46 <li class="nav-item d-flex align-items-center">
47 <form method="post" action="{{ url_for('logout') }}" class="d-inline">
48 <button type="submit" class="btn btn-sm btn-outline-light">Logout</button>
49 </form>
50 </li>
51 {% else %}
52 <li class="nav-item d-flex align-items-center">
53 <a href="{{ url_for('login') }}" class="btn btn-sm btn-outline-light">Login</a>
54 </li>
55 {% endif %}
56 </ul>
57 </div>
58 </div>
59 </nav>
60 {% endblock %}
61
62 {% block breadcrumb_wrapper %}
63 <div class="breadcrumb-bar py-2 overflow-auto d-print-none">
64 <div class="container">
65 {% block breadcrumbs %}{% endblock %}
66 </div>
67 </div>
68 {% endblock %}
69
70 <main>
71 {% block main %}{% endblock %}
72 </main>
73
74 {% block footer %}
75 <footer class="d-print-none">
76 <div class="container">
77 <div class="row links">
78 <div class="col-12 col-lg-6 mb-4 mb-lg-0">
79 <div class="h5 mb-3">// Status</div>
80 <p>Self-hosted website monitoring by <a href="https://isaacbythewood.com/">Isaac Bythewood</a>.
81 HTTP checks every three minutes, Lighthouse audits, SEO crawler,
82 security header analysis. Alerts via email + Discord. Own your uptime.</p>
83 </div>
84 <div class="col-6 col-lg-2 offset-lg-2">
85 <div class="h5 mb-3">// Pages</div>
86 <ul class="list-unstyled">
87 <li class="mb-2"><a href="/" class="link-footer">Home</a></li>
88 <li class="mb-2"><a href="/changelog" class="link-footer">Changelog</a></li>
89 <li class="mb-2"><a href="https://github.com/overshard/status-rust" class="link-footer" target="_blank">Source</a></li>
90 </ul>
91 </div>
92 <div class="col-6 col-lg-2">
93 <div class="h5 mb-3">// Operator</div>
94 <ul class="list-unstyled">
95 {% if user.is_authenticated %}
96 <li class="mb-2"><a href="/properties" class="link-footer">Properties</a></li>
97 <li class="mb-2">
98 <form method="post" action="{{ url_for('logout') }}" class="d-inline">
99 <button type="submit" class="btn btn-link link-footer p-0 align-baseline text-start">Logout</button>
100 </form>
101 </li>
102 {% else %}
103 <li class="mb-2"><a href="{{ url_for('login') }}" class="link-footer">Login</a></li>
104 {% endif %}
105 </ul>
106 </div>
107 </div>
108 </div>
109 </footer>
110
111 <div class="footer-bar d-print-none">
112 <div class="container">
113 <div class="row align-items-center">
114 <div class="col-sm-6 d-flex align-items-center justify-content-center justify-content-sm-start order-1 order-sm-0">
115 <small>© {{ now.year }} Isaac Bythewood · Some rights reserved</small>
116 </div>
117 <div class="col-sm-6 d-flex justify-content-center justify-content-sm-end py-3 py-sm-0">
118 <a href="https://github.com/overshard/status-rust" target="_blank" class="footer-bar-link" aria-label="GitHub">
119 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 16 16">
120 <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"/>
121 </svg>
122 </a>
123 </div>
124 </div>
125 </div>
126 </div>
127 {% endblock %}
128
129 <script type="module" src="{{ vite_asset('static_src/base/index.js') }}"></script>
130 {% block extra_js %}{% endblock %}
131</body>
132</html>