From 4ceb340595ff945c768d420c9b345ae1486ff94b Mon Sep 17 00:00:00 2001 From: amanita Date: Fri, 27 Oct 2023 18:03:25 +0200 Subject: [PATCH 01/17] change inheritance to simplify things; also remove the sexy nerd sentence. --- templates/index.html | 5 ++++- templates/page.html | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/templates/index.html b/templates/index.html index 24aa1c1..6985213 100755 --- a/templates/index.html +++ b/templates/index.html @@ -22,6 +22,9 @@ }); }); + {% block title %} + {{ config.title }} + {% endblock title %}
@@ -62,7 +65,7 @@

mail [at] reudnetz [dot] org

- + {% endblock seitenleiste %}
diff --git a/templates/page.html b/templates/page.html index db7beab..7135463 100755 --- a/templates/page.html +++ b/templates/page.html @@ -1,5 +1,9 @@ {% extends "index.html" %} +{% block title %} + {{ page.title }} - {{ config.title }} +{% endblock title %} + {% block content %} {{ page.content | safe }} {% endblock content %} From 7bdf2109a5f94d6ae9ada46787672108b1520fad Mon Sep 17 00:00:00 2001 From: amanita Date: Fri, 27 Oct 2023 18:04:23 +0200 Subject: [PATCH 02/17] add pagecontent to how-to to allow some pretext --- templates/how-to.html | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/templates/how-to.html b/templates/how-to.html index 3544210..744a929 100755 --- a/templates/how-to.html +++ b/templates/how-to.html @@ -1,10 +1,7 @@ -{% extends "index.html" %} - -{% block title %} - {{ page.title }} - {{ config.title }} -{% endblock title %} +{% extends "page.html" %} {% block content %} +{{ page.content | safe }} {% set anleitungen = get_section(path="how-to/_index.md") %} {% for page in anleitungen.pages %}
  • From c3fe78040b110ad8dd429975af15aa42386f14ec Mon Sep 17 00:00:00 2001 From: amanita Date: Fri, 27 Oct 2023 18:07:41 +0200 Subject: [PATCH 03/17] add a little blog. css still missing :D --- content/blog.md | 6 ++++++ content/blogposts/_index.md | 3 +++ content/blogposts/buchhaltung.md | 16 ++++++++++++++++ content/blogposts/hello_world.md | 9 +++++++++ templates/blog.html | 18 ++++++++++++++++++ 5 files changed, 52 insertions(+) create mode 100644 content/blog.md create mode 100644 content/blogposts/_index.md create mode 100644 content/blogposts/buchhaltung.md create mode 100644 content/blogposts/hello_world.md create mode 100755 templates/blog.html diff --git a/content/blog.md b/content/blog.md new file mode 100644 index 0000000..c9b9c50 --- /dev/null +++ b/content/blog.md @@ -0,0 +1,6 @@ ++++ +title = "Was geht?" +weight = 9 +template = "blog.html" ++++ +# Die neusten Neuigkeiten diff --git a/content/blogposts/_index.md b/content/blogposts/_index.md new file mode 100644 index 0000000..bd38c11 --- /dev/null +++ b/content/blogposts/_index.md @@ -0,0 +1,3 @@ ++++ +title = "Neuigkeiten" ++++ diff --git a/content/blogposts/buchhaltung.md b/content/blogposts/buchhaltung.md new file mode 100644 index 0000000..cc069d0 --- /dev/null +++ b/content/blogposts/buchhaltung.md @@ -0,0 +1,16 @@ ++++ +title = "Überarbeitung unserer Buchhaltung" +date = "2023-03-01" ++++ +Wir sind gerade dabei eine neue Buchhaltungsperson einzuarbeiten. +In diesem Zuge ändern und verbessern wir unsere bisherige Buchhaltung. + +**Wundert euch also nicht, wenn ihr:** +* Rechnungen bekommt +* Rechnungen mehrfach bekommt + +Sollten Zahlungen ausstehen, werden wir euch nochmal explizit daran erinnern. + +Liebe Grüße + +Euer Reudnetz. diff --git a/content/blogposts/hello_world.md b/content/blogposts/hello_world.md new file mode 100644 index 0000000..72c002b --- /dev/null +++ b/content/blogposts/hello_world.md @@ -0,0 +1,9 @@ ++++ +title = "Einen Blog für die Webseite" +date = "2023-10-27" ++++ +Immer mehr machen sich Wunsch und Notwendigkeit breit, auch mal etwas aktuelles über die Webseite zu verbreiten. +Nun soll hier Platz sein, für Geschichten und Einblicke in unsere Arbeit, Störungsmeldungen und Ausfalls-Forensik +oder auch einfach ein Paar nette Worte über Dinge die uns beschäftigen. + +Viel Vergnügen damit. diff --git a/templates/blog.html b/templates/blog.html new file mode 100755 index 0000000..648673c --- /dev/null +++ b/templates/blog.html @@ -0,0 +1,18 @@ +{% extends "page.html" %} + +{% block content %} +{{ page.content | safe }} +{% set posts = get_section(path="blogposts/_index.md") %} + +{% for post in posts.pages %} +

    {{ post.title }}

    +

    {{ post.date }}

    +
    +{% if post.summary %} +{{ post.summary | safe }} +{% else %} +{{ post.content | safe }} +{% endif %} +
    +{% endfor %} +{% endblock content %} From f049281f734ac175bb339b4a5befce34af925f3b Mon Sep 17 00:00:00 2001 From: Carl Suckfuell Date: Sat, 28 Oct 2023 13:27:11 +0200 Subject: [PATCH 04/17] add some css elements to the blog template --- templates/blog.html | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/templates/blog.html b/templates/blog.html index 648673c..ff01e15 100755 --- a/templates/blog.html +++ b/templates/blog.html @@ -1,18 +1,20 @@ {% extends "page.html" %} {% block content %} -{{ page.content | safe }} -{% set posts = get_section(path="blogposts/_index.md") %} - -{% for post in posts.pages %} -

    {{ post.title }}

    -

    {{ post.date }}

    -
    -{% if post.summary %} -{{ post.summary | safe }} -{% else %} -{{ post.content | safe }} -{% endif %} -
    -{% endfor %} + {{ page.content | safe }} + {% set posts = get_section(path="blogposts/_index.md") %} + + {% for post in posts.pages %} +

    {{ post.title }}

    +

    {{ post.date }}

    +
    + {% if post.summary %} + {{ post.summary | safe }} + {% else %} + {{ post.content | safe }} + {% endif %} +
    +
    + {% endfor %} {% endblock content %} From 113a1be0cc9d68726daffcbe76dbbfb0e06dc762 Mon Sep 17 00:00:00 2001 From: Carl Suckfuell Date: Sat, 28 Oct 2023 13:36:08 +0200 Subject: [PATCH 05/17] stretch background; maybe looks better? --- static/style/styles.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/style/styles.css b/static/style/styles.css index 7341d25..c5c2210 100755 --- a/static/style/styles.css +++ b/static/style/styles.css @@ -61,7 +61,7 @@ body { background-image:url(linien1.svg); background-repeat:no-repeat; - background-size:contain; + background-size:100% auto; background-position:center; background-attachment:fixed; background-color:#3F3836; From c41c8b7e7fcca49be57fec5ee572a96fd287c3b6 Mon Sep 17 00:00:00 2001 From: Carl Suckfuell Date: Sun, 29 Oct 2023 15:27:24 +0100 Subject: [PATCH 06/17] remove jobs tab, since it does not start with w --- content/jobs.md | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 content/jobs.md diff --git a/content/jobs.md b/content/jobs.md deleted file mode 100644 index 47dc15d..0000000 --- a/content/jobs.md +++ /dev/null @@ -1,10 +0,0 @@ -+++ -title = "Jobs" -weight = 9 -+++ - -# Jobausschreibungen des Reudnetzes -Aktuell haben wir keine konkreten Stellen anzubieten. - -Falls du trotzdem eine Initiale Bewerbung schreiben möchstest: -Schick Deine Bewerbung mit den üblichen Unterlagen an mail reudnetz org From 75a0a5440aff66dff462806868912a606c81555e Mon Sep 17 00:00:00 2001 From: amanita Date: Sat, 18 Nov 2023 15:59:32 +0100 Subject: [PATCH 07/17] add sorting by date for blog --- content/blogposts/_index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/blogposts/_index.md b/content/blogposts/_index.md index bd38c11..2bceea2 100644 --- a/content/blogposts/_index.md +++ b/content/blogposts/_index.md @@ -1,3 +1,4 @@ +++ title = "Neuigkeiten" +sort_by = "date" +++ From e1ed95e4a1433c5f628e6e3a62863a655c9fe889 Mon Sep 17 00:00:00 2001 From: amanita Date: Sat, 18 Nov 2023 20:28:58 +0100 Subject: [PATCH 08/17] add a blogpost about transparency and protocols --- content/blogposts/2023-11-18-protokolle.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 content/blogposts/2023-11-18-protokolle.md diff --git a/content/blogposts/2023-11-18-protokolle.md b/content/blogposts/2023-11-18-protokolle.md new file mode 100644 index 0000000..830cb87 --- /dev/null +++ b/content/blogposts/2023-11-18-protokolle.md @@ -0,0 +1,21 @@ ++++ +title = "Geheime Interna #1" +date = "2023-11-18" ++++ +Die meisten Entscheidungen trifft das Reudnetz in einem mehr oder weniger unorgansierten Plenum. +Seit je her, beziehungsweise seit dem wir angefangen haben mitzuschreiben, was wir beschließen, veröffentlichen wir +die Protokolle, welche dabei entstehen. +Aus Bequemlichkeit landete bisher alles in einem [Ordner im Git.](https://git.reudnetz.org/reudnetz/public-wiki/src/branch/master/menschenzeugs/protokolle). Dort kann es öffentlich eingesehen werden und wird sogar manchmal gelesen. + +Nun beschäftigt uns allerdings die Frage, ob wir diese Praxis beibehalten wollen. +Denn es gilt: "the internet never forgets" – was einmal veröffentlicht ist, emazipiert sich von uns wird in caches und backups weiterleben, selbst wenn wir einmal entscheiden sollten die Quelle bei uns zu löschen oder zu verändern. +Da wir auch Details zu neuen und alten Anschlüssen besprechen, müssen wir aufpassen, wie wir die Dinge aufschreiben, +um nicht datenschutzrelevante Informationen zu veröffentlichen. +Besonders dieses Risiko nährt die Frage nach den Sinnhaftigkeit dieser kompletten Offenheit. + +Gleichzeitig ist uns klar, was für ein starkes Bekenntnis an Transparenz es darstellt, die Ergebnisse unserer Treffen öffenlich zu halten. +Aus dem Unstand, das wir öffentliche Infrastruktur betreiben, lässt sich unter Umständen sogar ein Anspruch für diese Offenheit ableiten: Öffentliche Infrastruktur muss auch öffentlich verwaltet werden. + +Aber auch die Frage nach dem Nutzen der Protokolle ist nicht abschließend beantwortet. Die Argumentation, das die Protokolle für Auszenstehende wenig informativ sind, da sie oft wenig ausführlich sind, trifft durchaus zu. Zu unserer Überraschung scheinen diese Protokolle aber doch gelegentlich von Menschen gelesen zu werden, die sich für das Reudnetz Interessieren. +Besser könnten Blogposts wie dieser sein, die ausführlicher über Themen berichten, die uns gerade Beschäftigen. +Sie zu schreiben ist aber aufwendig und deckt stets nur einen Teil unserer Arbeit ab. From 38300978c6da7355a2c30e5dc672a76d97df231c Mon Sep 17 00:00:00 2001 From: carl Date: Thu, 30 Nov 2023 12:44:14 +0100 Subject: [PATCH 09/17] add new knowledge about kaese-hack-lauchsuppe --- .../how-to/vegane-kaese-hack-lauch-suppe.md | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 content/how-to/vegane-kaese-hack-lauch-suppe.md diff --git a/content/how-to/vegane-kaese-hack-lauch-suppe.md b/content/how-to/vegane-kaese-hack-lauch-suppe.md new file mode 100644 index 0000000..3501ddf --- /dev/null +++ b/content/how-to/vegane-kaese-hack-lauch-suppe.md @@ -0,0 +1,48 @@ ++++ +title = "Vegane Käse-Hack-Lauchsuppe" ++++ +# Vegane Käse-Hack-Lauchsuppe +Falls das mit dem Internet mal wieder alles nervt, ist es eine gute Idee etwas zu kochen. + +## Das Rezept +Genau wie bei der [Anleitung zum Einrichten von Openwrt](@/how-to/openwrt-router.md) ist ein Rezept ein Modell der +Realität und entspricht normalerweise nicht dem was wirklich ist. +Es sollte stets als Wegweiser durch den Möglichkeitsraum verstanden werden. + +### Zutaten +||| +| ---: | --- +| 3 Stangen | Lauch +| 300g | Sojagranulat +| 1L | Soja/Hafersahne +| 3 | Zwiebeln +| 6 Zehen | Knoblauch +| 6EL | Hefeflocken +|1 Bund | Petersilie +| | Genüsebrühe +| | Sojasauce +| | Öl +| | Salz +| | Pfeffer +| | Kümmel +| | Edelsüßes Paprika + +### Umsetzung +Lauch und Zwiebeln kleinschneiden. +Zwiebeln in **reichlich Öl** anbraten, denn wie häufig bei veganem Essen, enthält hier nichts Fett außer dem Öl. Sojagranulat dazugeben auch kurz anbraten. +Hefeflocken dazu und ebenfalls kurz mitbraten. Lauch dazu und nach kurzer Zeit mit Soja/Hafergetränk ablöschen. + +Mindestens 10min köcheln lassen. + +Währenddessen Knoblauch und Petersilie zerkleinern. +Die Petersilie dient später als Garnitur, der Knoblauch kann sofort in die Suppe. +Abschmecken mit Sojasauce, Hefeflocken, Gemüsebrühe und den Gewürzen. +Servieren mit der Petersilie. + +Have fun. + +### Anmerkungen + +- Soja/Hafersahne ist teuer und kann auch durch entsprechende Pflanzenmilch und Stärke ersetzt werden. #kuefastyle + +- Soja enthält Sojalecithin, Sonneblumenöl enthält auch Sonnenblumenlecithine. Beides kann dabei helfen, das sich Öl und Wasser besser vermischen lassen. Um mehr Fett schön in der Suppe unterzubringen, kann es sich lohnen, beides zu verwenden. From 615b9a40f899d00e223b277bc1eab373d6e86b59 Mon Sep 17 00:00:00 2001 From: carl Date: Thu, 30 Nov 2023 12:54:03 +0100 Subject: [PATCH 10/17] remove windows crlf from style.css and add root em to fix footsize in nested environments --- static/style/styles.css | 441 ++++++++++++++++++++-------------------- 1 file changed, 221 insertions(+), 220 deletions(-) diff --git a/static/style/styles.css b/static/style/styles.css index c5c2210..2fd1d1c 100755 --- a/static/style/styles.css +++ b/static/style/styles.css @@ -1,220 +1,221 @@ -/* - * Web Fonts from fontspring.com - * - * All OpenType features and all extended glyphs have been removed. - * Fully installable fonts can be purchased at http://www.fontspring.com - * - * The fonts included in this stylesheet are subject to the End User License you purchased - * from Fontspring. The fonts are protected under domestic and international trademark and - * copyright law. You are prohibited from modifying, reverse engineering, duplicating, or - * distributing this font software. - * - * (c) 2010-2015 Fontspring - * - * - * - * - * The fonts included are copyrighted by the vendor listed below. - * - * Vendor: Fontfabric - * License URL: http://www.fontspring.com/licenses/fontfabric/webfont - * - * - */ - -@font-face { - font-family: 'intro_rust_gbase_2_line'; - src: url('introrustg-base2line-webfont.eot'); - src: url('introrustg-base2line-webfont.eot?#iefix') format('embedded-opentype'), - url('introrustg-base2line-webfont.woff2') format('woff2'), - url('introrustg-base2line-webfont.woff') format('woff'), - url('introrustg-base2line-webfont.ttf') format('truetype'), - url('introrustg-base2line-webfont.svg#intro_rust_gbase_2_line') format('svg'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'intro_script_rh2_base'; - src: url('introscriptr-h2base-webfont.eot'); - src: url('introscriptr-h2base-webfont.eot?#iefix') format('embedded-opentype'), - url('introscriptr-h2base-webfont.woff2') format('woff2'), - url('introscriptr-h2base-webfont.woff') format('woff'), - url('introscriptr-h2base-webfont.ttf') format('truetype'), - url('introscriptr-h2base-webfont.svg#intro_script_rh2_base') format('svg'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'intro_head_rbase'; - src: url('introheadr-base-webfont.eot'); - src: url('introheadr-base-webfont.eot?#iefix') format('embedded-opentype'), - url('introheadr-base-webfont.woff2') format('woff2'), - url('introheadr-base-webfont.woff') format('woff'), - url('introheadr-base-webfont.ttf') format('truetype'), - url('introheadr-base-webfont.svg#intro_head_rbase') format('svg'); - font-weight: normal; - font-style: normal; -} - -body { - background-image:url(linien1.svg); - background-repeat:no-repeat; - background-size:100% auto; - background-position:center; - background-attachment:fixed; - background-color:#3F3836; - color:#fff; -} - -a:link, a:visited { - color:#fff; -} - -a:hover, a:active, -a:visited:hover, a:visited:active { - background-color:#000; -} - -.legal { - text-align:right; - font-size:0.8em; - text-transform:uppercase; - font-family:'intro_head_rbase',sans-serif; - letter-spacing:1px; -} - -.legal a:link, .legal a:visited, -.nav a:link, .nav a:visited { - text-decoration:none; -} - -.head h1 { - font-family:'intro_rust_gbase_2_line',sans-serif; - font-weight:normal; - font-size:5em; - margin:0; -} - -.head h2 { - font-family:'intro_script_rh2_base',sans-serif; - font-weight:normal; - font-size:2.5em; - padding-top:1.1em; - text-align:right; - margin:0; -} - -.nav ul, .nav ul li { - margin:0; - padding:0; - list-style-type:none; - display:inline; -} - -.nav ul li a:link, .nav ul li a:visited { - display:block; - float:left; - background-color:#fff; - color:#3F3836; - width:10%; - margin-right:2%; - font-size:1.3em; - text-transform:uppercase; - font-family:'intro_head_rbase',sans-serif; -} - -.nav ul li.last a:link, .nav ul li.last a:visited { - margin-right:0; -} - -.nav ul li a:hover, .nav ul li a:visited:hover, -.nav ul li.current a:link, .nav ul li.current a:visited { - background-color:#000; - color:#fff; -} - -.content { - font-family:'intro_head_rbase',sans-serif; - margin-top:2em; -} - -.content h1 { - text-transform:uppercase; - margin-top:0; - font-weight:normal; - font-size:2em; -} - -.content p, .content li, .content td { - font-size:1.3em; -} - -.margin { - font-size:85%; -} - -.margin h3{ - background-color:#000; - padding:0.5em; - margin-top:0; -} - -.ifl { - float:left; - margin:0.5em 0.5em 0.5em 0; -} - -.ifr { - float:right; - margin:0.5em 0 0.5em 0.5em; -} - -.adress ul { - list-style-type:none; -} - -pre { - padding: 1em; - background-color: #008b8b70; - border-radius: 4px; - white-space: pre-wrap; -} - -p code { - vertical-align: baseline; - background-color: #008b8b70; - border-radius: 4px; - padding: 1px 4px; -} - -@media screen and (max-width:48em) { - -.legal { - text-align:center; - margin-top:1em; -} - -.head h1 { - font-size:2.5em; - text-align:center; - padding:0; -} - -.head h2 { - font-size:1.5em; - text-align:center; - padding:0; -} - -.nav ul li a:link, .nav ul li a:visited { - width:100%; - margin:0.2em 0; - text-align:center; -} - - - -} - +/* + * Web Fonts from fontspring.com + * + * All OpenType features and all extended glyphs have been removed. + * Fully installable fonts can be purchased at http://www.fontspring.com + * + * The fonts included in this stylesheet are subject to the End User License you purchased + * from Fontspring. The fonts are protected under domestic and international trademark and + * copyright law. You are prohibited from modifying, reverse engineering, duplicating, or + * distributing this font software. + * + * (c) 2010-2015 Fontspring + * + * + * + * + * The fonts included are copyrighted by the vendor listed below. + * + * Vendor: Fontfabric + * License URL: http://www.fontspring.com/licenses/fontfabric/webfont + * + * + */ + +@font-face { + font-family: 'intro_rust_gbase_2_line'; + src: url('introrustg-base2line-webfont.eot'); + src: url('introrustg-base2line-webfont.eot?#iefix') format('embedded-opentype'), + url('introrustg-base2line-webfont.woff2') format('woff2'), + url('introrustg-base2line-webfont.woff') format('woff'), + url('introrustg-base2line-webfont.ttf') format('truetype'), + url('introrustg-base2line-webfont.svg#intro_rust_gbase_2_line') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'intro_script_rh2_base'; + src: url('introscriptr-h2base-webfont.eot'); + src: url('introscriptr-h2base-webfont.eot?#iefix') format('embedded-opentype'), + url('introscriptr-h2base-webfont.woff2') format('woff2'), + url('introscriptr-h2base-webfont.woff') format('woff'), + url('introscriptr-h2base-webfont.ttf') format('truetype'), + url('introscriptr-h2base-webfont.svg#intro_script_rh2_base') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'intro_head_rbase'; + src: url('introheadr-base-webfont.eot'); + src: url('introheadr-base-webfont.eot?#iefix') format('embedded-opentype'), + url('introheadr-base-webfont.woff2') format('woff2'), + url('introheadr-base-webfont.woff') format('woff'), + url('introheadr-base-webfont.ttf') format('truetype'), + url('introheadr-base-webfont.svg#intro_head_rbase') format('svg'); + font-weight: normal; + font-style: normal; +} + +body { + background-image:url(linien1.svg); + background-repeat:no-repeat; + background-size:100% auto; + background-position:center; + background-attachment:fixed; + background-color:#3F3836; + color:#fff; +} + +a:link, a:visited { + color:#fff; +} + +a:hover, a:active, +a:visited:hover, a:visited:active { + background-color:#000; +} + +.legal { + text-align:right; + font-size:0.8em; + text-transform:uppercase; + font-family:'intro_head_rbase',sans-serif; + letter-spacing:1px; +} + +.legal a:link, .legal a:visited, +.nav a:link, .nav a:visited { + text-decoration:none; +} + +.head h1 { + font-family:'intro_rust_gbase_2_line',sans-serif; + font-weight:normal; + font-size:5em; + margin:0; +} + +.head h2 { + font-family:'intro_script_rh2_base',sans-serif; + font-weight:normal; + font-size:2.5em; + padding-top:1.1em; + text-align:right; + margin:0; +} + +.nav ul, .nav ul li { + margin:0; + padding:0; + list-style-type:none; + display:inline; +} + +.nav ul li a:link, .nav ul li a:visited { + display:block; + float:left; + background-color:#fff; + color:#3F3836; + width:10%; + margin-right:2%; + font-size:1.3em; + text-transform:uppercase; + font-family:'intro_head_rbase',sans-serif; +} + +.nav ul li.last a:link, .nav ul li.last a:visited { + margin-right:0; +} + +.nav ul li a:hover, .nav ul li a:visited:hover, +.nav ul li.current a:link, .nav ul li.current a:visited { + background-color:#000; + color:#fff; +} + +.content { + font-family:'intro_head_rbase',sans-serif; + margin-top:2em; +} + +.content h1 { + text-transform:uppercase; + margin-top:0; + font-weight:normal; + font-size:2em; +} + +.content p, .content li, .content td { + font-size:1.3rem; +} + + + +.margin { + font-size:85%; +} + +.margin h3{ + background-color:#000; + padding:0.5em; + margin-top:0; +} + +.ifl { + float:left; + margin:0.5em 0.5em 0.5em 0; +} + +.ifr { + float:right; + margin:0.5em 0 0.5em 0.5em; +} + +.adress ul { + list-style-type:none; +} + +pre { + padding: 1em; + background-color: #008b8b70; + border-radius: 4px; + white-space: pre-wrap; +} + +p code { + vertical-align: baseline; + background-color: #008b8b70; + border-radius: 4px; + padding: 1px 4px; +} + +@media screen and (max-width:48em) { + +.legal { + text-align:center; + margin-top:1em; +} + +.head h1 { + font-size:2.5em; + text-align:center; + padding:0; +} + +.head h2 { + font-size:1.5em; + text-align:center; + padding:0; +} + +.nav ul li a:link, .nav ul li a:visited { + width:100%; + margin:0.2em 0; + text-align:center; +} + + + +} From 5b10ecde65424eba81ec2fdc1c11c131a300a8e7 Mon Sep 17 00:00:00 2001 From: Gregor Michels Date: Wed, 7 Feb 2024 18:41:35 +0100 Subject: [PATCH 11/17] blog: add post for 2024.02.07 incident --- content/blogposts/2024-02-07-outage.md | 63 ++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 content/blogposts/2024-02-07-outage.md diff --git a/content/blogposts/2024-02-07-outage.md b/content/blogposts/2024-02-07-outage.md new file mode 100644 index 0000000..071ef41 --- /dev/null +++ b/content/blogposts/2024-02-07-outage.md @@ -0,0 +1,63 @@ ++++ +title = "Incident 07.02.2024" +date = "2024-02-07" ++++ + +In der Nacht von Dienstag auf Mittwoch (06.02.24 - 07.02.24) ist in der Wurzner Straße der Strom ausgefallen und hat uns eine ungeplante Downtime geschenkt. + +Unser Kernnetz, sowie die Kundenanschlusse, sind nach dem Stromausfall von selbst wieder hochgefahren. + +Allerdings mussten wir bei beiden Hosting-Servern manuell eingreifen und bis in die Mittagsstunden des Folgetages Entstörungen durchführen. + +--- + +## Verlauf + +* 2024.02.06 23:30 CET: Stromausfall + * gesamter Ausfall unserer Infrastruktur +* 2024.02.07 00:20 CET: Stromausfall beendet + * Kundenanschlüsse stehen wieder zur Verfügung +* 2024.02.07 11:00 CET: _hyper01_ und _sol_ unlocked + * _hyper01_: Kunden VMs wieder online + * _sol_: bootet ohne Netzwerkkonnektivität - Reverse-Proxies und interne VMs weiterhin offline +* 2024.02.07 14:30 CET: _sol_ entstört + * Reverse-Proxies und interne VMs wieder Verfügbar + +Seit 2024.02.07 14:30 CET ist das Reudnetz wieder uneingeschränkt online. + +--- + +## Entstörung _sol_ + +_sol_ ist nach dem Freischalten der `full-disk-encryption` ohne Netzwerkkonnektivität gebootet. +Eine fehlkonfigurierte Boot-Partiton hat einen veralteten Linux-Kernel gebootet für den das OS keine Kernel-Module mehr bereitgestellt hat. + +Durch die fehlenden Module konnte _sol_ seinen Netzwerk-Stack nicht konfigurieren da hierfür (unteranderem) das `bonding` Modul für 802.3ad (LACP) benötigt wird. + +_sol_ konnte über das IPMI entstört werden. + +Der Grund für die defekte Boot-Partiton war eine Wartung im Juni 2023. +Beim Austausch der HDDs in _sol_ gegen SSDs wurde die Bootpartition per `dd` kopiert. +Durch die gleichen FS/UU-IDs hat der Kernel das /boot auf der SSD gemountet, welches nicht in der Firmware als Boot-Device hinterlegt war. +Somit haben sich das Boot-Device und die eigentliche /boot-Partition immer weiter voneinander entfernt. + +## Full-Disk-Encryption + +Die Festplattenverschlüsselung von _hyper01_ und _sol_ musste manuell durch einen admin freigeschaltet werden. + +Das ist 11 Stunden nach Ende des Stromausfalls passiert. + +## PDU issues _hyper01_ + +Aufgrund von Netzteilproblemen ist _hyper01_ nicht automatisch gestartet. +Weder die Betätigung des `power-buttons`, noch das IPMI konnten den Server starten. + + +Aus Energieeffiziengründen wird _hyper01_ nur mit einem Netzteil betrieben. +Der Wechsel auf das Ersatznetzteil hat dem Server dann zum Starten verholfen. + +--- + +## Reflektion + +In den folgenden Pläna werden wir erarbeiten an welchen Stellen wir Verbessrungen erzielen können um diese Form von Ausfall zu verhindern. From 036520da85f5350bd480e24185df7ec860e5f703 Mon Sep 17 00:00:00 2001 From: Gregor Michels Date: Thu, 8 Feb 2024 10:33:12 +0100 Subject: [PATCH 12/17] blog: 2024-02-07-outage fix two typos --- content/blogposts/2024-02-07-outage.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/blogposts/2024-02-07-outage.md b/content/blogposts/2024-02-07-outage.md index 071ef41..9867b33 100644 --- a/content/blogposts/2024-02-07-outage.md +++ b/content/blogposts/2024-02-07-outage.md @@ -5,7 +5,7 @@ date = "2024-02-07" In der Nacht von Dienstag auf Mittwoch (06.02.24 - 07.02.24) ist in der Wurzner Straße der Strom ausgefallen und hat uns eine ungeplante Downtime geschenkt. -Unser Kernnetz, sowie die Kundenanschlusse, sind nach dem Stromausfall von selbst wieder hochgefahren. +Unser Kernnetz, sowie die Kundenanschlüsse, sind nach dem Stromausfall von selbst wieder hochgefahren. Allerdings mussten wir bei beiden Hosting-Servern manuell eingreifen und bis in die Mittagsstunden des Folgetages Entstörungen durchführen. @@ -60,4 +60,4 @@ Der Wechsel auf das Ersatznetzteil hat dem Server dann zum Starten verholfen. ## Reflektion -In den folgenden Pläna werden wir erarbeiten an welchen Stellen wir Verbessrungen erzielen können um diese Form von Ausfall zu verhindern. +In den folgenden Pläna werden wir erarbeiten an welchen Stellen wir Verbesserungen erzielen können um diese Form von Ausfall zu verhindern. From 6889c011caf1cef0e1d5dcb447d3b8202d3a7a33 Mon Sep 17 00:00:00 2001 From: Pluto <> Date: Wed, 19 Jun 2024 15:55:43 +0200 Subject: [PATCH 13/17] remove broken cross-origin zammad chat --- static/jquery-3.4.1.min.js | 2 -- templates/index.html | 13 ------------- 2 files changed, 15 deletions(-) delete mode 100644 static/jquery-3.4.1.min.js diff --git a/static/jquery-3.4.1.min.js b/static/jquery-3.4.1.min.js deleted file mode 100644 index a1c07fd..0000000 --- a/static/jquery-3.4.1.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0
  • - {{ page.title }} + {{ page.title }}
  • {% endfor %} {% endblock content %} diff --git a/templates/index.html b/templates/index.html index e1e94e1..e098282 100755 --- a/templates/index.html +++ b/templates/index.html @@ -18,10 +18,10 @@

    Internet für Leipzigs Osten

    @@ -33,14 +33,13 @@ {% block nav %} {% for page in root_section.pages %}
  • - {{ page.title }} + {{ page.title }}
  • {% endfor %} {% endblock nav %}
    -
    {% block content %} @@ -58,7 +57,7 @@
    From 18925711987a161f67c34e704c4476f6b0b89ddd Mon Sep 17 00:00:00 2001 From: Yannik <> Date: Tue, 25 Nov 2025 18:19:06 +0100 Subject: [PATCH 16/17] public key added --- static/reudnetz.org.pgp.asc | 123 ++++++++++++++++++++++++++++++++++++ templates/index.html | 1 + 2 files changed, 124 insertions(+) create mode 100644 static/reudnetz.org.pgp.asc diff --git a/static/reudnetz.org.pgp.asc b/static/reudnetz.org.pgp.asc new file mode 100644 index 0000000..f58e03a --- /dev/null +++ b/static/reudnetz.org.pgp.asc @@ -0,0 +1,123 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +KErE8JTHyQMAab9cD4NNM/kM +=/qif +-----END PGP PUBLIC KEY BLOCK----- diff --git a/templates/index.html b/templates/index.html index e098282..4812a23 100755 --- a/templates/index.html +++ b/templates/index.html @@ -51,6 +51,7 @@

    Kontakt

    mail [at] reudnetz [dot] org
    + We support encryption

    {% endblock seitenleiste %}
    From 798e26c093ee666dd2a5000218e6162fc0f3040c Mon Sep 17 00:00:00 2001 From: Gregor Michels Date: Thu, 20 Apr 2023 20:17:40 +0200 Subject: [PATCH 17/17] add site about vm hosting --- content/vm-hosting.md | 115 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100755 content/vm-hosting.md diff --git a/content/vm-hosting.md b/content/vm-hosting.md new file mode 100755 index 0000000..fa5487e --- /dev/null +++ b/content/vm-hosting.md @@ -0,0 +1,115 @@ ++++ +title = "VM Hosting" +weight = 9 ++++ +# VM Hosting im Reudnetz + +Das Reudnetz hostet für Kund:inen und befreundete Orgas VMs. +Bei Interesse könnt ihr euch einfach per Mail an uns wenden (`mail [at] reudnetz [dot] org`) + + +## Technischer Überblick + +### Features + +* 2 vCPUs +* 2GB RAM +* 50GB Disk +* 150GB zusätzlicher Speicher pro Organisation für Backups und ISOs +* Netzwerk + * eigenes VLAN pro VM + * `v4`: `/30` pro VLAN/VM (RFC1918) + * `v6`: `/64` pro VM (geroutet auf link-local der VM) + * (optional) v4 port-forwarding + * (optional) v4 reverse-proxy für http/https +* (optional) "ready-to-use" VMs + * für gängige Linux-Distributionen die cloud-images anbieten + * Provisionierung der VMs über `cloud-init` + +_Solltet ihr mehr Resourcen benötigen könnt ihr euch einfach melden_ + +### Virtualisierungslösung + +Wir nutzen [Proxmox VE](proxmox.org) als Virtualisierungslösung. Jede Nutzer:in bekommt einen Zugang zur WebGUI um ihre VMs zu verwalten (Starten, Stoppen, ISO einlegen uvm.). + +## Berechtigunskonzept + +Wir nutzen Gruppen, Rollen und Berechtigungen um den Proxmox mandantenfähig zu machen. +Leider können wir euch keine Hardware-Kontingente zuweisen damit ihr eure eigenen VMs erstellen könnt (alla OpenStack, Hetzner, usw.). +Wir erstellen euch die VMs und weisen die euch "unveränderbar" zu. Damit könnt ihr sie administrieren (starten, stoppen, ISO einlegen usw). aber keine Hardwareeigentschaften verändern (zB. mehr Speicher zuweisen). + + +## Threat Models + +Ihr solltet folgende Dinge beachten, wenn ihr eine VM bei uns habt. + + +### Generischer Virtualisierungsdisclaimer + +Technisch bedingt kann der Virtualisierungsserver/Hypervisor alle 3 Regeln der IT-Sicherheit für eine VM brechen: + +* `Confidentiality`: der Hypervisor hat Einblick in alle Geräte der VM (CPU, RAM, Disk, Network, ...) +* `Integrity`: der Hypervisor kann den Zustand jedes Gerätes der VM verändern +* `Availability`: der Hypervisor kann eine VM ausschalten + +Somit kann auch jede Person, die administrativen Zugang zum Hypervisor hat, die selben Regeln brechen. + +Außerdem können Bugs in der Virtualisierungsschicht dafür sorgen das VMs "ausbrechen" und den Hypervisor und oder andere VMs übernehmen können. + +Dies gilt für alle Cloud-/Virtualisierungsangebote, nicht nur für die vom Reudnetz :) + + +### Full Disk Encryption + +Wir nutzen Proxmox als Virtualisierungsplattform mit ZFS als Storage-Backend. +Dies ermöglicht uns das `Storage Replication` Feature von Proxmox zu benutzen. + +Dadurch werden die Disks aller VMs regelmäßige auf alle Virtualisierungsserver gespiegelt. +Das ermöglicht uns: +* Wartungen an den Virtualisierungsserver ohne Ausfall für die VMs vorzunehmen (durch schnelle Live-Migrationen) +* Im Falle eines Ausfalles die VMs schneller verfügbar zu machen + +Leider [verhindert](https://bugzilla.proxmox.com/show_bug.cgi?id=2350) die Nutzung dieses Features aktuell die Möglichkeit die Virtualisiserungsserver zu verschlüsseln (aka `full disk encryption`). + +Somit sind unsere Virtualisierungsserver nicht verschlüsselt. +Wenn jemensch die Virtualisierungsserver aus dem Keller trägt hat diese Person auch Zugriff auf die Platten der VMs. + +Um das zu verhindern müsst ihr eure VMs selber verschlüsseln. Bitte habt dabei allerdings im Hinterkopf dass wir aus einer laufenden VM auch die Verschlüsselungskeys extrahieren könnten. +Somit ist dies nur ein Schutz gegen physischen Diebstahl der VM - der `Generische Virtualisierungsdisclaimer` gilt trotzdem. + +--- + +**Solltet ihr eine "ready-to-use" VM bestellen hat diese keine full-disk-encryption !** + +--- + +## Disclaimer + + +### Backups + +Wir machen aktuell keine Backups eurer VMs - wenn der Storage kaputt geht sind eure VMs weg. +Somit müsst ihr euch selber um die Sicherung eurer Daten aus der VM kümmern. + + +### Verfügbarkeit + +Wie alle Dienste des Reudnetzes sind auch die VMs auf `best-effort` Basis. +Da wir aktuell noch keinen Cluster haben müsst ihr mit ein bis zwei Ausfällen pro Monat rechnen für Updates des Hypervisors (ihr werdet natürlich vorher benachrichtigt). + + +### Anbindung + +Eure VMs teilen sich mit dem Rest des Reudnetzes unseren symmetrischen 1G Uplink. +Der Router, der die VMs (aktuell) terminiert, kann kein line-rate routing. Deswegen teilen sich alle VMs aktuell 500mbit/s symmetrisch. + + +### Haftung + +--- + +**Dies ist keine juristische Einschätzung** + +--- + +Ihr mietet die VM von uns und haftet deswegen auch für mögliche Straftaten.