Rabbithole indiekit
Tag 1
- Ich habe Indiekit gefunden.
- Die Docker installation funktionierte gut
- bis auf PASSWORDS_SECRET, bei dem man die $ - Zeichen escapen musste, weil docker diesen Zeichenketten als Variable ansieht und mit nichts ersetzt.
- das kostete mich ein paar Nerven und ein paar Stunden
- Als storage verwende ich ein gitea - repository
- Funktioniert und alles landet als markdown dort in einer eigenen Struktur. Kann man erstmal mit Arbeiten.
- Meine eigene Seite ist statisch generiert mit eleventy
- Wie verbinde ich eleventy mit indiekit?
- Auftritt Ricardo Mendes via https://vuink.com/post/ezraqrf-d-darg/content/articles/2026-02-14-deploying-your-own-indieweb-site
- Der hat auf github rmdes ein indiekit-deploy projekt gebaut
- Das ist riesig, mit vielen Plugins und allen möglichen indieweb-funktionen.
- Eine gute inspirationsquelle für meine eigene Seite.
- Er hat auch ein Caddyfile , das mich daran erinnert, dass ich eigentlich von traefik auf caddy umsteigen wollte und hier vielleicht ein guter Einstiegspunkt ist
- Ich habe eine bestehende traefik installation und möchte diese nach und nach durch das leichtere caddy ersetzen.
- Via perplexity habe ich eine Anleitung, wie ich
- caddy vor traefik setze
- traefik weiterhin die tls zertifikate verwalten lasse und caddy dahinter für einige domains habe.
- Ich möchte caddy for traefik haben.
- Die app aufgesetzt.
- caddy läuft nicht, wegen Error: loading initial config: loading new config: loading tls app module: provision tls: provisioning automation policy 0: on-demand TLS cannot be enabled without a permission module to prevent abuse; please refer to documentation for details
- Die fehlersuche im ansible mit docker containern ist ziemlich aufwändig, ich starte es, es läuft nicht, dann verbinde ich mich mit den docker host und schaue in den logs, was fehlt.
- mein ansible verify-script erweitert, dass es nun die logs für einen container anzeigt, wenn er nicht läuft:
# --- - name: "Get state of container {{ item }}" community.docker.docker_container_info: name: "{{ item }}" register: result - name: "Verify that the container {{ item }} is running" ansible.builtin.assert: that: - result.container.State.Status == "running" ignore_errors: true register: assert_result - name: "Fetch container logs for {{ item }}" ansible.builtin.command: cmd: "{{ docker_cli }} logs {{ item }}" register: container_logs when: assert_result is failed changed_when: false - name: "Display container logs for {{ item }}" ansible.builtin.debug: msg: "{{ container_logs.stdout_lines + container_logs.stderr_lines }}" when: assert_result is failed - name: "Fail when the container {{ item }} is not running" ansible.builtin.fail: msg: "Container {{ item }} is not running. See logs above." when: assert_result is failed
- ich benötige das caddy modul dns.providers.inwx
- Caddyfile muss angepasst werden, damit es das modul anzieht.
- username und passwort sollen nicht im klartext darin stehen
- Es gibt zwei Wege
- über umgebungsvariablen Using Caddyfile's basic_auth with environment variables and Docker
- oder über ein caddy-modul caddy-file-secrets
- ich entscheide mich für die umgebungsvariablen
- in ansible generiere ich jetzt ein secret.env - file aus dem secrets-array für Caddy
- name: create secrets.env from entries in "vault.caddy" ansible.builtin.copy: content: "{% for key, value in vault.caddy.items() %}{{ key }}={{ value }}\n{% endfor %}" dest: "{{ service_cfg.directory }}/secrets.env" owner: "{{ docker_user.name }}" group: "{{ docker_user.group }}" mode: "{{ secret_file_mode }}" no_log: true
- Caddy mag nicht starten, da es das Modul für inwx dns nicht findet.
- Jetzt muss ich caddy mit caddyx bauen, das ist mir gerade zu aufwändig.
Ich verlasse das alles und gehe zwei Episoden The Expanse gucken und danach schlafen.
Ein funktionierendes indiekit habe ich nicht draussen.
Tag 2
- Am nächsten morgen entscheide ich mich dafür, caddy hinter traefik zu setzen.
- Aber dieses Rabbithole von gestern lässt mir keine Ruhe und ich möchte eigentlich mehr aufschreiben, so dass mir nichts verloren geht.
- Diesen Beitrag bis hierher geschrieben.
- es wäre eigentlich cool, wenn er als timeline-items dargestellt wird.
- Mein LLM gebeten:
this is a tailwind css file. add a class to display a list as a timelineput a frame around the timeline items
Das ging nach hinten los und sah sehr komisch aus, wieder zurück.the structure of the li items cannot be changed, there is no div
Nun wird es mal gut dargestellt.
- den text mit
<section class="timeline">eingerahmt - Das wird in obsidian nicht richtig dargestellt
- Schnell einen shortcode dafür gebaut
{% section "my-css-class" %} <p>Content goes here</p> {% endsection %}
- In diesem Beitrag hier muss ich code mit
{% raw %}und{% endraw %}einrahmen, da die njk - engine das parsen möchte. Das gefällt aber Obsidian nicht. - kurze Suche befördert das hier nach oben:
I had to add
templateEngineOverride: mdin the YAML front matter for this post, which tells Eleventy to only process Markdown, ignoring any Nunjucks tags🔖 Eleventy: Escaping Nunjucks Statements in Markdown Code Blocks
- wie kann ich eine section hinzufügen, die in obsidian und in eleventy funktioniert?
- Mein LLM schlägt vor, einen html postProcessor zu verwenden, der das hier interpretieren kann:
<!-- section: my-css-class --> <p>Content goes here</p> <!-- /section --> - noch einen 11ty-transformer hinzugefügt:
eleventyConfig.addTransform("section", function (content, outputPath) { if (outputPath && outputPath.endsWith(".html")) { return content .replace(/<!--\s*section:\s*([\w-]+)\s*-->/g, '<section class="$1">') .replace(/<!--\s*\/section\s*-->/g, '</section>'); } return content; });
- Mein LLM schlägt vor, einen html postProcessor zu verwenden, der das hier interpretieren kann:
- Bin ich jetzt fertig?
- Natürlich nicht.
- Das Design der Timeline in obsidian gefällt mir nicht. Ausserdem muss es doch einen besseren Weg geben, das Markdown für Obsidian und Eleventy zu optimieren.
- Kommen wir zu obsidian sections
- Ein Nachteil ist, wenn man in Obsidian hineinklickt, selektiert er den ganzen Text, das macht das Ergänzen etwas mühsam.
- Diesen Beitrag bis hierher geschrieben.
Ich muss aufhören weiter zu graben, da die Menschen hier langsam aufwachen.
Tag 3
- Weiter mit Caddy
- Zunächst dyndns eingerichtet für die Domain, auf der ich mit caddy spielen möchte.
- Jetzt ist die Frage, wie ich caddy konfigurieren möchte.
- mit docker - ein writeup gibt es hier omltcat/caddy_labels.md
- oder erstmal als Caddyfiles?
- Für das deployment der Docker-Container auf mein nas habe ich ein ansible-Projekt. Dort liegen alle Applikationen als Rollen drin. Je Applikation gibt es eine docker-compose.yaml, die dann die Container der App verwaltet.
- Nun stellt sich die Frage: Konfiguriere ich alles gemeinsam in einer app oder getrennt.
- in einer app - heisst gemeinsames docker compose für alles, was man für einen sicheren Server braucht
- caddy
- authelia (auth.example.com)
- ldap (ldap.example.com)
- einen public www - fileserver zum Ausprobieren, dass irgendwas ausgeliefert wird.
- einen versteckten secure - fileserver zum Testen einer abgesicherten Seite, die nicht jeder aufrufen kann.
- oder getrennt?
- in einer app - heisst gemeinsames docker compose für alles, was man für einen sicheren Server braucht
- Ich entscheide mich alles getrennt zu machen.
- Caddy soll die Zertifikate nicht verwalten, das lasse ich der Einfachheit halber beim traefik:
- Traefik ist eingerichtet
- Caddy müsste ich erst irgendwie neu kompilieren, das dauert mir zu lange.
- Schnell läuft ein fileserver in caddy auf einer www - domain.
- Nun noch authelia daneben setzen, eine secure - domain einrichten und schauen, dass authelia geht.
- Mich interessiert vor allem dass unter Safari die passkeys als zweiter Faktor funktionieren
- Cool wäre es, wenn ich die auch gleich als ersten und einzigen Faktor nehmen könnte, diese Sicherheit ist für mich ausreichend.
- Mist. Ich erhalte mit einer neuen Konfiguration auf dem :latest - image einen Fehler bei
enable_passkey_login: true experimental_enable_passkey_upgrade: true - Nach zwei Stunden sehe ich, dass das :latest docker image nie aktualisiert wurde und noch eine alte 4.38 Version ist. Nachdem ich das neue auf 4.39 gepinnt habe, funktioniert es.
- Der nächste Fehler kommt schon um die Ecke.
- Es wird Error 400 beim Aufruf der sicheren domain angezeigt.
- Wieder nach einigen Iterationen schaue ich ins authelia log und sehe:
Target URL 'http://secured.example.com/' has an insecure scheme 'http', only the 'https' schemes are supported - Eine wilde Suche via duckduckgo fördert nichts brauchbares zutage. Jedoch das LLM meiner Wahl hat nach kurzer Nachfrage eine Lösung.
- zuerst wollte es mein Setup auf https umbauen, was aber nicht geht
- Ich hatte es dann gefragt, ob es nicht eine Lösung mit http-headern gibt. Das führte zur gewünschten Lösung:
# because caddy is on port 80 and traefik is handling https header_up X-Forwarded-Proto https
Danach
Schlussendlich entscheide ich mich gegen obsidian-sections, da diese den ganzen Flow des Text bearbeitens kaputt machen. Ich bin zurück bei den html-kommentaren.
Es gibt noch eine nächste Überarbeitung des timeline-Layouts. Auch hier hat mich das LLM nicht im Stich gelassen mit folgenden Prompts und meinem style.css als input.
the timeline layout should ignore orderd lists withcan you add some boxes with an arrow to the dot around the timeline entries?some how the indentation of the box on the left side is not working, the box overlaps with the dot and the linethat looks good. the nested entries do make sense in the context but i do not like that the boxes are displayed nested as well.you got me wrong. i like the nested display but the second and third sub-timlines should be better distinguishable
Da kam dann dieses Layout heraus, wo ich nur noch die zu kleine Schrift und den Rahmen auf der dritten Ebene geändert habe.
Ohne das LLM hätte ich hier sehr viel Zeit vergeigelt.
Ich habe immer noch keinen indiekit - server, auf dem ich Sachen ausprobieren kann, dafür wieder einiges gelernt.
Mal schauen. Es macht Spass, die Rabbitholes, in die ich mich verirre, aufzuschreiben und nachvollziehbar zu machen. Vielleicht setze ich das noch weiter fort und bekomme irgendwann mal eine indiekit - Installation wie ich sie mir vorstelle. Im Moment bin ich noch beim Caddy und dort wäre es eigentlich cooler und schneller, wenn ich per ansible auf mein lokales Macbook deployen könnte und die Einstellungen direkt ausprobieren kann, anstelle immer auf das nas zu deployen. Oder noch besser mit molecule richtige tests bauen - was wären das dann - integrationstests für mehrere Applikationen? Und dann hätte ich gerne caddy doch via docker konfiguriert - wie bekomme ich dort aber die statischen fileserver hinein, mit denen ich die ganzen nginx - instanzen ablösen möchte?