feat: Add health check endpoint, SEO meta tags, and sitemap/robots support for improved site visibility and functionality

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
2026-04-27 20:51:33 +02:00
parent fe578d490d
commit 0b08dc51c6
5 changed files with 86 additions and 0 deletions
+41
View File
@@ -1615,6 +1615,47 @@ def default():
return render_template("main.html")
@app.route('/health')
def health():
return jsonify({"status": "ok", "time": _utc_now_iso()}), 200
@app.route('/robots.txt')
def robots_txt():
path = os.path.join(BASE_DIR, 'static', 'robots.txt')
if os.path.exists(path):
return send_file(path, mimetype='text/plain')
return (
"User-agent: *\nDisallow: /admin/\nAllow: /\nSitemap: /sitemap.xml\n",
200,
{"Content-Type": "text/plain"},
)
@app.route('/sitemap.xml')
def sitemap_xml():
site_root = request.url_root.rstrip('/')
sitemap_path = os.path.join(BASE_DIR, 'static', 'sitemap.xml')
if os.path.exists(sitemap_path):
try:
with open(sitemap_path, 'r', encoding='utf-8') as fh:
content = fh.read().replace('{{ SITE_ROOT }}', site_root)
return app.response_class(content, mimetype='application/xml')
except Exception:
pass
xml = (
'<?xml version="1.0" encoding="UTF-8"?>\n'
'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n'
' <url>\n'
f' <loc>{site_root}</loc>\n'
' <changefreq>daily</changefreq>\n'
' <priority>1.0</priority>\n'
' </url>\n'
'</urlset>'
)
return app.response_class(xml, mimetype='application/xml')
@app.route('/dienstleistungen')
def dienstleistungen():
return render_template("dienstleistungen.html")
+5
View File
@@ -0,0 +1,5 @@
User-agent: *
Disallow: /admin/
Disallow: /static/uploads/
Allow: /
Sitemap: /sitemap.xml
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>{{ SITE_ROOT }}</loc>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
</urlset>
+14
View File
@@ -8,6 +8,20 @@
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<title>{% block title %}Digitale Schulverwaltung{% endblock %}</title>
{# Basic SEO meta tags, can be overridden per-template by setting `meta_description` #}
<meta name="description" content="{{ meta_description|default('Invario — Lehrmittel-, Inventar- und Ausleihverwaltung für Schulen. Sicher, einfach, nachvollziehbar.') }}">
<link rel="canonical" href="{{ request.url_root.rstrip('/') }}{{ request.path }}">
<!-- OpenGraph / Twitter -->
<meta property="og:site_name" content="Invario">
<meta property="og:title" content="{% block title %}Digitale Schulverwaltung{% endblock %}">
<meta property="og:description" content="{{ meta_description|default('Invario — Lehrmittel-, Inventar- und Ausleihverwaltung für Schulen. Sicher, einfach, nachvollziehbar.') }}">
<meta property="og:type" content="website">
<meta property="og:url" content="{{ request.url_root.rstrip('/') }}{{ request.path }}">
<meta property="og:image" content="{{ url_for('static', filename='images/logo-1.jpeg') }}">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{% block title %}Digitale Schulverwaltung{% endblock %}">
<meta name="twitter:description" content="{{ meta_description|default('Invario — Lehrmittel-, Inventar- und Ausleihverwaltung für Schulen. Sicher, einfach, nachvollziehbar.') }}">
<meta name="twitter:image" content="{{ url_for('static', filename='images/logo-1.jpeg') }}">
{% block head %}
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+18
View File
@@ -1,5 +1,8 @@
{% extends "base.html" %}
{# SEO: per-page description used in base.html meta tags #}
{% set meta_description = "Invario bündelt Lehrmittelverwaltung, Inventar und Ausleihe für Schulen sicher, transparent und einfach zu bedienen." %}
{% block title %}Digitale Schulverwaltung mit Sicherheitsfokus{% endblock %}
{% block head %}
@@ -550,6 +553,21 @@
{% endblock %}
{% block content %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "Invario",
"url": "{{ request.url_root.rstrip('/') }}",
"description": "{{ meta_description }}",
"publisher": {
"@type": "Organization",
"name": "Invario",
"url": "{{ request.url_root.rstrip('/') }}",
"logo": "{{ url_for('static', filename='images/logo-1.jpeg') }}"
}
}
</script>
<section class="hero" id="top">
<div>
<span class="eyebrow">Lehrmittelverwaltungssoftware für Schulen</span>