<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>christianbaer.me</title><link>https://christianbaer.me/</link><description>Recent content on christianbaer.me</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Thu, 05 Oct 2023 22:49:24 +0000</lastBuildDate><atom:link href="https://christianbaer.me/index.xml" rel="self" type="application/rss+xml"/><item><title>Posts</title><link>https://christianbaer.me/post/</link><pubDate>Thu, 05 Oct 2023 22:49:24 +0000</pubDate><guid>https://christianbaer.me/post/</guid><description/></item><item><title>Root-less Podman als Docker-Alternative unter Debian</title><link>https://christianbaer.me/post/2023/10/root-less-podman-als-docker-alternative-unter-debian/</link><pubDate>Thu, 05 Oct 2023 22:49:24 +0000</pubDate><guid>https://christianbaer.me/post/2023/10/root-less-podman-als-docker-alternative-unter-debian/</guid><description>&lt;p&gt;Ich habe in den letzten Tagen ein Bisschen mit &lt;a href="https://podman.io/"&gt;podman&lt;/a&gt; rumgespielt. podman positioniert sich als drop-in-Alternative zu &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; und ermöglicht es, Container auch als nicht root-User zu nutzen.
Primär für mich habe ich mal aufgeschrieben, wie ich das alles aufgesetzt habe.&lt;/p&gt;
&lt;p&gt;Als OS habe ich ein aktuelles Debian genutzt.&lt;/p&gt;
&lt;h2 id="podman-installieren"&gt;Podman installieren&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install podman podman-compose
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Um container starten zu können, wenn der User nicht eingeloggt ist bzw. die Container weiter laufen zu lassen, wenn der User sich ausloggt, muss &lt;em&gt;linger&lt;/em&gt; aktiviert werden.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo loginctl enable-linger &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Falls es möglich sein soll, Container bzw. Dienste auf privilegierten Ports (unter 1024) hören zu lassen (z.B. für einen Samba-Server), können wir das folgendermaßen aktivieren.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;net.ipv4.ip_unprivileged_port_start=80&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/sysctl.d/podman-privileged-ports.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sysctl --load /etc/sysctl.d/podman-privileged-ports.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Damit sind die Grundvoraussetzungen gegeben. Alles Weitere wird als nicht-root User ausgeführt.&lt;/p&gt;
&lt;h2 id="podman-root-less-nutzen"&gt;Podman root-less nutzen&lt;/h2&gt;
&lt;p&gt;Die nötigen Verzeichnisse anlegen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/.config/systemd/user
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/.config/containers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="dockerio-als-container-registry-hinzufügen"&gt;docker.io als Container-Registry hinzufügen:&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp /etc/containers/registries.conf &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/.config/containers/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;[registries.search]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;registries = [&amp;#39;docker.io&amp;#39;]&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tee -a &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/.config/containers/registries.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="yacht-container-aufsetzen"&gt;Yacht-Container aufsetzen&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://yacht.sh/"&gt;Yacht&lt;/a&gt; ist ein Verwaltungstool für Docker und bietet auch schon rudimentären Support für podman. Da podman standardmäßig ohne Daemon im Hintergrund arbeitet, müssen wir zunächst einen userspezifischen socket starten. Ebenfalls ist es bei podman deshalb nmotwendig, systemd zum (neu)-starten der Container zu benutzen. Im Folgenden setze ich einen Yacht-Container auf lasse ihn über systemd beim booten starten.&lt;/p&gt;
&lt;h3 id="podman-socket-starten"&gt;Podman-socket starten&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl --user &lt;span class="nb"&gt;enable&lt;/span&gt; --now podman.socket
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Der Socket ist jetzt verfügbar unter &lt;em&gt;/var/run/user/$(id -u)/podman/podman.sock&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id="yacht-container-starten"&gt;Yacht Container starten&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;podman volume create yacht
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;podman run -v /var/run/user/&lt;span class="k"&gt;$(&lt;/span&gt;id -u&lt;span class="k"&gt;)&lt;/span&gt;/podman/podman.sock:/var/run/docker.sock -v yacht:/config -p 8000:8000 --name yacht -d ghcr.io/selfhostedpro/yacht:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="systemd-service-für-yacht-erstellen-damit-der-container-beim-booten-gestartet-wird"&gt;systemd-Service für Yacht erstellen, damit der Container beim Booten gestartet wird&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;podman generate systemd --new --name --files yacht
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv container-yacht.service &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/.config/systemd/user/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl --user &lt;span class="nb"&gt;enable&lt;/span&gt; --now container-yacht.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-compose"&gt;docker compose&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;docker compose&lt;/em&gt; kann einfach durch &lt;em&gt;podman-compose&lt;/em&gt; ersetzt werden. ein &lt;code&gt;podman-compose up -d&lt;/code&gt; pulled die notwendigen images und startet den Container.&lt;/p&gt;
&lt;p&gt;Was ich noch nicht zum Laufen bekommen habe, sind builds aus einem git-Repo über eine docker-compose.yml wie z.B.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cbme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;christianbaer.me&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;christianbaer_me&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://github.com/chrisb86/christianbaer.me.git&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Home Assistant: Benutzer-Authentication mit Authelia und LDAP</title><link>https://christianbaer.me/post/2023/06/homeassistant-authentication-mit-authelia/</link><pubDate>Sat, 10 Jun 2023 10:12:24 +0000</pubDate><guid>https://christianbaer.me/post/2023/06/homeassistant-authentication-mit-authelia/</guid><description>&lt;p&gt;Ich setze be mir zu Hause zur Authentifizierung und als Lösung für SSO (Single Sign On) &lt;a href="https://authelia.com"&gt;Authelia&lt;/a&gt; ein. Als Backend zur Verwaltung der User kommt dabei &lt;a href="https://github.com/lldap/lldap"&gt;LLDAP&lt;/a&gt; als abgespeckter LDAP-Server zum Einsatz.&lt;/p&gt;
&lt;p&gt;Ich versuche, möglichst alle Dienste, die ich selbst betreibe damit zu Verknüpfen, damit ich nicht an 1000 Stellen viele verschiedene Accounts habe, sondern eben nur eine Instanz, die sich sowohl um Authentifizierung, als auch Berechtigungen kümmert.&lt;/p&gt;
&lt;p&gt;Wo immer es geht, versuche ich Authelia einzubinden. Bei Dingen, wo dies mangels (befähigtem) Webfrontend nicht klappt, kommt dann eben LDAP zum Einsatz (z.B. bei E-Mail).&lt;/p&gt;
&lt;p&gt;Um das Thema Home Assistant habe ich mich hierbei lane gedrückt. Es war zwar möglich, Home Assistant per OAuth mit Authelia zu verheiraten, das spielte aber bei Nutzung der mobile App nicht richtig zusammen. Die genauen Symptome weiß ich jetzt schon gar nicht mehr.&lt;/p&gt;
&lt;p&gt;Die Nutzung von Authentifizierung per LDAP war auch irgendwie hacky, da man erst ein mal die LDAP-Tools in Home Assistant reinbekommen muss, um mit dem Server sprechen zu können. Das war also auch nichts, was mich irgendwie weiter brachte.&lt;/p&gt;
&lt;p&gt;Vor ein paar Wochen bin ich dan über den Post &lt;a href="https://kevo.io/posts/2023-01-29-authelia-home-assistant-auth/"&gt;Home Assistant Command Line Authentication for Authelia&lt;/a&gt; von Kevin O&amp;rsquo;Connor gestoßen. Er nutzt einfach die Authelia-API selbst, um die User zu authentifizieren. Hierfür ist nur &lt;em&gt;curl&lt;/em&gt; notwendig und das ist bei Home Assistant dabei.&lt;/p&gt;
&lt;p&gt;Seine Lösung scherte sich nicht um Gruppen-Berechtigungen, weshalb ich auf seiner Grundlage ein wenig weiter gebaut habe.&lt;/p&gt;
&lt;p&gt;Unter &lt;a href="https://github.com/chrisb86/homeassistant-auth-authelia/"&gt;homeassistant-auth-authelia&lt;/a&gt; findest Du jetzt ein Script, welches genau das tut. Es erwartet beim Aufruf die Authelia-, und Home Assistant-URLs, sowie optional eine Gruppe, die Berechtigt sein soll, Home Assistant zu nutzen. Der eingegebene Username und das Passwort für von Home Assistant als Umgegungsvariable gesetzt und das Script kann darauf zugreifen.&lt;/p&gt;
&lt;p&gt;In die &lt;em&gt;configuration.yaml&lt;/em&gt; tragen wir nun einfach folgendes ein:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;homeassistant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;auth_providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;command_line&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/config/bin/auth_authelia.sh&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://auth.example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://homeassistant.example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;homeassistant_users&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;homeassistant&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das erste Argument ist die Authelia-URL, das zweite Argument ist die Home Assistant-URL und das dritte Argument ist die Gruppe, die Zugriff auf Home Assistant haben soll. Wird die Gruppe weggelassen, schaut das Script eben nur auf Username und Passwort.&lt;/p&gt;
&lt;p&gt;Wenn das Script nach &lt;em&gt;/config/bin/auth_authelia.sh&lt;/em&gt; kopiert wurde, kann Home Assistant neu gestartet werden und alles sollte laufen.&lt;/p&gt;
&lt;p&gt;Single Sign On habe ich mit dieser Lösung zwar noch nicht, ich nutze aber ohne zusätzliche Abhängigkeiten in Home Assistant letztendlich meinen LDAP-Server als Authentifizierungs-Backend und kann den Zugriff auf eine bestimmte Gruppe einschränken.&lt;/p&gt;</description></item><item><title>Lokale Verzeichnisse eines FreeBSD-Servers in einer bhyve-VM mounten</title><link>https://christianbaer.me/post/2023/05/lokale-verzeichnisse-in-bhyve-vm-mounten/</link><pubDate>Fri, 05 May 2023 15:13:08 +0000</pubDate><guid>https://christianbaer.me/post/2023/05/lokale-verzeichnisse-in-bhyve-vm-mounten/</guid><description>&lt;p&gt;Ich versuche mich gerade in der Nutzung von &lt;a href="https://wiki.freebsd.org/bhyve"&gt;bhyve&lt;/a&gt; als Virtualisierungslösung unter &lt;a href="https://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt;, um eine Alternative zu &lt;a href="https://www.proxmox.com/"&gt;Proxmox&lt;/a&gt; zu haben.&lt;/p&gt;
&lt;p&gt;Unter Proxmox betreibe ich z.B. meinen Docker-Host als virtuelle Maschine mit &lt;a href="https://www.alpinelinux.org/"&gt;Alpine Linux&lt;/a&gt;. Ein Verzeichnis meines Storage-Servers (eigentlich eine FreeBSD-VM) mounte ich über NFS und erstelle regelmäßig Backups der Docker-Daten darauf. Zur Laufzeit liegen alle Daten in der VM. Dies ist notwendig, da insbesondere Datenbanken nicht (gut) funktionieren, wenn ihre Daten auf einem NFS-Share liegen.&lt;/p&gt;
&lt;p&gt;Als ich dabei war, dieses Setup unter FreeBSD mit bhyve nachzubauen, bin ich über eine &lt;a href="https://github.com/churchers/vm-bhyve/wiki/Virtual-Disks"&gt;wesentlich elegantere und stressfreiere Methode&lt;/a&gt; gestoßen, um Daten in virtuellen Maschinen verfügbar zu machen.&lt;/p&gt;
&lt;p&gt;Unter FreeBSD funktiniert das Bereitstellen von geteilten Verzeichnissen &lt;a href="https://www.freebsd.org/releases/13.0R/relnotes/"&gt;seit FreebSD 13.0&lt;/a&gt; über VirtIO-9p (aka VirtFS). So kann man einfach ein lokales Verzeichnis für eine VM verfügbar machen und dieses dann darin mounten.&lt;/p&gt;
&lt;p&gt;Zur Verwaltung meiner VMs nutze ich &lt;a href="https://github.com/churchers/vm-bhyve"&gt;vm-bhyve&lt;/a&gt;. Zur (sehr einfachen) Installation gibt es viele Anleitungen, weshalb ich jetzt hier nicht darauf eingehen werde.&lt;/p&gt;
&lt;p&gt;Ich habe eine VM names &lt;em&gt;docker01&lt;/em&gt;. Diese stoppe ich erst mal mit &lt;code&gt;sudo vm stop docker&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Über &lt;code&gt;sudo vm config docker&lt;/code&gt; öffne ich nun die Konfigurationsdatei für die VM.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;grub&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;cpu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;4096M&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;network0_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;virtio-net&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;network0_switch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dmz&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;disk0_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;virtio-blk&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;disk0_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;disk0.img&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;grub_install0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;linux /boot/vmlinuz-virt initrd=/boot/initramfs-virt alpine_dev=cdrom:iso9660 modules=loop,squashfs,sd-mod,usb-storage,sr-mod&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;grub_install1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;initrd /boot/initramfs-virt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;grub_run0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;linux /boot/vmlinuz-virt root=/dev/vda3 modules=ext4&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;grub_run1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;initrd /boot/initramfs-virt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;5c93bf9d-eb53-11ed-b2ae-ac1f6b6337b0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;network0_mac&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;58:9c:fc:0f:c7:5b&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mit folgenden Optionen kann man nun einen 9p-Share hinzufügen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;disk1_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;virtio-9p&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;disk1_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;sharename=/path/to/share&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;disk1_dev&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;custom&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;sharename&lt;/em&gt; (als Wort) muss nun durch einen Namen ersetzt werden, welchen wir in der VM ansprechen wollen. Der Pfad dahinter, dann entsprechend durch das Verzeichnis, welches wir teilen wollen.&lt;/p&gt;
&lt;p&gt;In meinem Fall füge ich also Folgendes ein:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;disk1_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;virtio-9p&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;disk1_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;docker=/mnt/dozer/docker-backup&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;disk1_dev&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;custom&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wenn weitere Shares hinzugefügt werden sollen, muss die Disk-Nummer entsprechend erhöht werden (disk2_type usw&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Wenn die Datei gespeichert ist, können wir über ein &lt;code&gt;sudo vm start docker&lt;/code&gt; die VM wieder hochfahren.&lt;/p&gt;
&lt;p&gt;In der VM erstellen wir ein Verzeichnis zum Mounten des Shares z.B. mit &lt;code&gt;mkdir -p /mnt/docker&lt;/code&gt; und können dann anschließend über &lt;code&gt;mount -t 9p -o trans=virtio docker /mnt/docker&lt;/code&gt; den Share einbinden.&lt;/p&gt;
&lt;p&gt;Wenn alles soweit geklappt hat und die Daten da sind, können wir &lt;code&gt;docker /mnt/docker 9p trans=virtio,rw 0 0&lt;/code&gt; in die &lt;em&gt;/etc/fstab&lt;/em&gt; einfügen, um das Verzeichnis zukünftig direkt beim Booten zu starten.&lt;/p&gt;
&lt;p&gt;Das alles ist auf jeden Fall schon mal wesentlich einfacher, als alles über NFS zu machen und sich über Firewallregeln, Berechtigungen usw. Gedanken zu machen. Ob ich darauf jetzt Datenbanken betreiben kann, oder nur NFS aus meinem vorherigen Setup ersetzen kann, muss ich noch ausprobieren.&lt;/p&gt;
&lt;p&gt;Ich bin auf jeden Fall froh, dass FreeBSD jetzt für mich nicht nur durch Jails, sondern auch mit virtuellen Maschinen nutzbar ist. Für mich ist und bleibt FreeBSD auf dem Server das Betriebssystem der Wahl.&lt;/p&gt;</description></item><item><title>Hugo-Site mit nginx über Docker hosten</title><link>https://christianbaer.me/post/2023/01/hugo-site-mit-nginx-ueber-docker-hosten/</link><pubDate>Fri, 27 Jan 2023 10:34:08 +0000</pubDate><guid>https://christianbaer.me/post/2023/01/hugo-site-mit-nginx-ueber-docker-hosten/</guid><description>&lt;p&gt;Ich habe in den letzten Monaten viele meiner Services auf Docker migriert, da in einigen Bereichen die Administration wesentlich einfacher und schneller machbar ist, als es mit einem baremetal FreeBSD-System und selbst administrierter Software der Fall wäre.&lt;/p&gt;
&lt;p&gt;Meine Webseite betreibe ich, nach wie vor, mit &lt;em&gt;Hugo&lt;/em&gt;. Als reverse Proxy setze ich &lt;em&gt;traefik&lt;/em&gt; ein.&lt;/p&gt;
&lt;p&gt;Ich stand also vor der Herausforderung, meine Webseite aus den Hugo-Sourcen zu rendern und diese dann über einen Webserver zur Verfügung zu stellen, den ich hinter &lt;em&gt;traefik&lt;/em&gt; hängen kann. Bisher habe ich das Rendern immer auf meinem MacBook erledigt, und die fertige Seite per rsync in mein nginx-Verzeichnis geschoben.&lt;/p&gt;
&lt;p&gt;Da ich diesen Prozess auch vereinfachen wollte, begann ich damit, meine Hugo-Quellen jetzt in einem &lt;em&gt;git-Repository&lt;/em&gt; zu pflegen.&lt;/p&gt;
&lt;p&gt;Da die Dateien jetzt einfach clonebar sind, gestaltet sicher der Prozess des Hostings ziemlich simpel.&lt;/p&gt;
&lt;p&gt;Wir brauchen ein &lt;em&gt;Dockerfile&lt;/em&gt;, sowie eine &lt;em&gt;docker-compose.yaml&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Im &lt;em&gt;Dockerfile&lt;/em&gt; beschreiben wir, wie das Image gebaut werden soll. In der &lt;em&gt;docker-compose.yaml&lt;/em&gt; wird es gebaut, daraus ein Container erstellt und dieser in die restliche Infrastruktur eingebunden.&lt;/p&gt;
&lt;h2 id="dockerfile"&gt;Dockerfile&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;## Set some variables&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ARG&lt;/span&gt; &lt;span class="nv"&gt;HUGO_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.110.0&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ARG&lt;/span&gt; &lt;span class="nv"&gt;GITHUB_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;chrisb86
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ARG&lt;/span&gt; &lt;span class="nv"&gt;GITHUB_REPOSITORY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;christianbaer.me&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;## Download Hugo from github&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ADD&lt;/span&gt; https://github.com/gohugoio/hugo/releases/download/v&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HUGO_VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/hugo_&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HUGO_VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;_Linux-64bit.tar.gz /hugo.tar.gz&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; tar -zxvf hugo.tar.gz&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;## Install git for gitInfo support in Hugo &lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; apk add --no-cache git&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;## Copy site sources to /site&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; ./ /site&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/site&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Cache Bust upon new commits&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ADD&lt;/span&gt; https://api.github.com/repos/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GITHUB_USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GITHUB_REPOSITORY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/git/refs/heads/master /.git-hashref&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;## Run Hugo&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; /hugo --gc --enableGitInfo&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;## Copy rendered site to nginx image&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nginxinc/nginx-unprivileged&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; --from&lt;span class="o"&gt;=&lt;/span&gt;build /site/public /usr/share/nginx/html&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;## Expose port 8080 to docker&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;8080&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Im Dockerfile definieren wir, dass wir ein alpine-Image nutzen und setzen die zu nutzende Hugo-Version sowie GitHub-User und -Repository.&lt;/p&gt;
&lt;p&gt;Anschließend laden wir die spezifizierte Hugo-Version von GitHub herunter und entpacken sie. Um die &lt;em&gt;&amp;ndash;gitInfo&lt;/em&gt;-Option in Hugo nutzen zu können, installieren wir noch &lt;em&gt;git&lt;/em&gt; über die Paketverwaltung.&lt;/p&gt;
&lt;p&gt;Die Vorbereitungen sind soweit erst mal abgeschlossen.&lt;/p&gt;
&lt;p&gt;Damit Docker nicht die ggf. Schon gecachten Site-Quellen nutzt, sondern die aktuellsten, fügen wir dem Image über &lt;code&gt;ADD&lt;/code&gt;noch eine Datei von GitHub hinzu, die sich bei einem neuen Commit auf jeden Fall geändert hat.&lt;/p&gt;
&lt;p&gt;Im nächsten Schritte lassen wir &lt;em&gt;Hugo&lt;/em&gt; die Webseite rendern.&lt;/p&gt;
&lt;p&gt;Als letztes nutzen wir ein &lt;em&gt;nginx-unprivileged&lt;/em&gt;-Image und kopieren die gerenderte Webseite von &lt;em&gt;/site/public&lt;/em&gt; in die Webroot unter &lt;em&gt;/share/nginx_html&lt;/em&gt; von wo aus sie unter dem Port &lt;em&gt;8080&lt;/em&gt; angeboten wird.&lt;/p&gt;
&lt;p&gt;Diesen öffnen wir aus dem Image heraus.&lt;/p&gt;
&lt;p&gt;Wenn hier eine andere Seite genutzt werden soll, muss nur die URL zum git-Repository geändert werden.&lt;/p&gt;
&lt;h2 id="docker-composeyaml"&gt;docker-compose.yaml&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cbme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;christianbaer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;me&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;christianbaer_me&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;chrisb86&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;christianbaer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;proxy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;traefik&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;traefik&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;routers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cbme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="n"&gt;christianbaer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;traefik&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;routers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cbme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;entrypoints&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;traefik&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;routers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cbme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;certresolver&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;inwx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;traefik&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;routers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cbme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;middlewares&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;secured&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;traefik&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;routers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cbme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;modern&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;traefik&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cbme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loadbalancer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;traefik&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;proxy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;external&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In der &lt;em&gt;docker-compose.yaml&lt;/em&gt; definieren wir einen Service für unser Image. Über die build-context sagen wir &lt;em&gt;docker-compose&lt;/em&gt;, welches git-Repository als Grundlage für den Container dienen soll. Das darin befindliche &lt;em&gt;Dockerfile&lt;/em&gt; wird dann automatisch ausgeführt.&lt;/p&gt;
&lt;p&gt;Die networks- und label-Parts binden das Image in mein traefik-Netzwerk ein, sorgen dafür, dass es über TLS unter &lt;a href="https://christianbaer.me"&gt;https://christianbaer.me&lt;/a&gt; erreichbar ist und kümmern sich um die Zertifikate. Falls ein anderer Proxy genutzt wird, kann der Teil entsprechend weggelassen und stattdessen der Port 8080 ganz klassisch nach deinen Bedürfnissen exposed werden.&lt;/p&gt;
&lt;p&gt;Alles in allem ist das alles viel einfacher, als gedacht. Ich schreibe jetzt einfach einen Beitrag, committe ihn zu git und baue über &lt;code&gt;docker-compose up -d --build&lt;/code&gt; in ein paar Sekunden das Image neu. Um alles andere kümmert sich Docker.&lt;/p&gt;</description></item><item><title>Raspberry Pi als universelle Zigbee-Bridge in Homekit konfigurieren</title><link>https://christianbaer.me/post/2021/04/raspberry-pi-als-universelle-zigbee-bridge-in-homekit-konfigurieren/</link><pubDate>Mon, 12 Apr 2021 17:31:20 +0200</pubDate><guid>https://christianbaer.me/post/2021/04/raspberry-pi-als-universelle-zigbee-bridge-in-homekit-konfigurieren/</guid><description>&lt;p&gt;Wie im &lt;a href="https://christianbaer.me/post/2021/04/zigbee-als-brueckentechnologie-im-smarthome-mit-raspbee-und-homebridge/"&gt;letzten Post&lt;/a&gt; beschrieben, habe ich mir aus einem alten Raspberry Pi 3 mit dem &lt;a href="https://phoscon.de/de/raspbee"&gt;RaspBee II-Modul&lt;/a&gt; eine universelle Zigbee-Bridge gebaut, die ich über &lt;a href="https://homebridge.io/"&gt;Homebridge&lt;/a&gt; und das &lt;a href="https://www.npmjs.com/package/homebridge-hue"&gt;entsprechende Plugin&lt;/a&gt; in HomeKit einbinde.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://christianbaer.me/post/2021/04/raspberry-pi-als-universelle-zigbee-bridge-in-homekit-konfigurieren/homeapp.png" &gt;&lt;img src="https://christianbaer.me/post/2021/04/raspberry-pi-als-universelle-zigbee-bridge-in-homekit-konfigurieren/homeapp_hu_5e09474014695e84.png" width="700" height="337" /&gt;&lt;/a&gt;
&lt;figcaption&gt;
&lt;small&gt;
Screenshot der macOS Home-App
&lt;/small&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Im Folgenden will ich nun die notwendigen Schritte beschreiben, da sie - zumindest mir - nicht von Anfang an klar waren. Der Post ist recht lang, die Umsetzung dauert aber nur ca. 15 Minuten.&lt;/p&gt;
&lt;p&gt;Sowohl für &lt;a href="https://github.com/homebridge/homebridge-raspbian-image"&gt;Homebridge&lt;/a&gt;, als auch für &lt;a href="https://phoscon.de/en/raspbee/sdcard"&gt;deCONZ&lt;/a&gt; gibt es eigene Distributionen, die ihr jeweiliges Projekt vorkonfiguriert mitbringen. Theoretisch ist es auch möglich, in diesen Systemen das jeweils andere Projekt nach zu installieren. Da ich jeweils verschiedene Dinge in der Umsetzung nicht mochte und gerne weiß, was warum wie funktioniert, habe ich mich dazu entschieden, auf einem frischen &lt;a href="https://www.raspberrypi.org/software/operating-systems/"&gt;Raspbian Lite&lt;/a&gt; einfach alles von Hand zu konfigurieren. So habe ich alles unter Kontrolle und kann einfacher Anpassungen vornehmen.&lt;/p&gt;
&lt;p&gt;Im folgende gehe ich davon aus, dass wir auf einem jungfräulichen Raspbian Buster Lite arbeiten, welches online ist. Der Hostname, den ich gewählt habe lautet &amp;ldquo;&lt;a href="http://homebridge.local"&gt;homebridge.local&amp;rdquo;&lt;/a&gt; und ich werde auf Ihn im weiteren Text verweisen. Ersetze ihn an den entsprechenden Stellen durch den Hostnamen oder die IP deines Systems.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://christianbaer.me/post/2021/04/raspberry-pi-als-universelle-zigbee-bridge-in-homekit-konfigurieren/rpi-raspbee-gpio.png" &gt;&lt;img src="https://christianbaer.me/post/2021/04/raspberry-pi-als-universelle-zigbee-bridge-in-homekit-konfigurieren/rpi-raspbee-gpio_hu_56a631c1680dc2c4.png" width="700" height="393" /&gt;&lt;/a&gt;
&lt;figcaption&gt;
&lt;small&gt;
Foto eines RaspBee-Moduls im Raspberry Pi
&lt;/small&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="raspbee-modul-einbauen"&gt;RaspBee-Modul einbauen&lt;/h2&gt;
&lt;p&gt;Das Einstecken des Moduls ist recht simpel. Es muss an ganz den Rand der Stiftleiste auf der von den USB-Ports abgewandten Seite eingesteckt werden. dresden elektronik hat hierzu eine &lt;a href="https://phoscon.de/de/raspbee/install"&gt;bebilderte Anleitung&lt;/a&gt; veröffentlicht.&lt;/p&gt;
&lt;p&gt;Falls ein Lüfter genutzt werden soll, der eigentlich ebenfalls an die ersten beiden Pins angeschlossen wird, bietet es sich an, hierfür die Pins 14 und 17 zu nutzen. Der Pin 17 bietet statt 5 V zwar nur 3,3 V und der Lüfter dreht dadurch langsamer, aber er kann wenigstens weiter genutzt werden. Die Pin-Belegung ist &lt;a href="https://www.raspberrypi.org/documentation/usage/gpio/"&gt;hier&lt;/a&gt; dokumentiert.&lt;/p&gt;
&lt;h2 id="zugriffsrechte-für-serielle-schnittstelle-aktivieren"&gt;Zugriffsrechte für serielle Schnittstelle aktivieren&lt;/h2&gt;
&lt;p&gt;Da in aktuellen Raspbian-Versionen die serielle Schnittstelle nicht ohne Weiteres nutzbar ist, müssen wir zunächst die benötigten Zugriffsrechte setzen.&lt;/p&gt;
&lt;p&gt;Dies geschieht über &lt;code&gt;sudo raspi-config&lt;/code&gt;. Dort wählen wir aus dem Menü &lt;strong&gt;&lt;em&gt;Interface Options&lt;/em&gt;&lt;/strong&gt; → &lt;strong&gt;&lt;em&gt;Serial Port&lt;/em&gt;&lt;/strong&gt; und beantworten die Frage, ob die Login Shell über die serielle Schnittstelle verfügbar sein soll mit &lt;em&gt;nein&lt;/em&gt; und die Frage, ob Hardware am seriellen Port aktiviert werden soll, mit &lt;em&gt;ja&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Schneller geht es mit &lt;code&gt;sudo raspi-config nonint do_serial 1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Nach einem Neustart sind die GPIO-Pins aktiviert und das Modul für das Betriebssystem ansprechbar.&lt;/p&gt;
&lt;h2 id="updaten"&gt;Updaten&lt;/h2&gt;
&lt;p&gt;Zu allererst bringen wir das Basissystem und die Hardware mal auf den aktuellen Stand.&lt;/p&gt;
&lt;h3 id="firmware"&gt;Firmware&lt;/h3&gt;
&lt;p&gt;Je nachdem, wie lange der Raspberry Pi schon in der Schublade lag, macht es Sinn, die aktuellen Firmware-Updates zu installieren.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo rpi-update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="raspbian"&gt;Raspbian&lt;/h3&gt;
&lt;p&gt;Anschließend wird der Pi neu gebootet und wir können anschließend Raspian aktualisieren.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ipv6-für-apt-deaktivieren"&gt;IPv6 für apt deaktivieren&lt;/h3&gt;
&lt;p&gt;Da ich mit den Pis häufiger mal Probleme in Zusammenhang mit apt und IPv6 hatte, weise ich apt an, künftig nur noch über IPv4 zu connecten.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Acquire::ForceIPv4 &amp;#34;true&amp;#34;;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/apt/apt.conf.d/99disable-ipv6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="deconz-installieren"&gt;deCONZ installieren&lt;/h2&gt;
&lt;p&gt;Wenn alles auf dem aktuellen Stand und das RaspBee-Modul verbaut ist, können wir damit beginnen, deCONZ und die Phoscon App zu installieren.&lt;/p&gt;
&lt;p&gt;dresden elektronik betreibt ein eigenes Repository für die ganze Software. Wir werden dieses also einbinden, um die Software installieren zu können&lt;/p&gt;
&lt;h3 id="gpg-key-importieren"&gt;GPG-Key importieren&lt;/h3&gt;
&lt;p&gt;Als erstes importieren wir den GPG-Key&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O - http://phoscon.de/apt/deconz.pub.key &lt;span class="p"&gt;|&lt;/span&gt; sudo apt-key add -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="repository-hinzufügen"&gt;Repository hinzufügen&lt;/h3&gt;
&lt;p&gt;Als nächsten fügen wir das Repository zu apt hinzu und aktualisieren die Paketquellen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;deb http://phoscon.de/apt/deconz $(lsb_release -cs) main&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/apt/sources.list.d/deconz.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="deconz-installieren-1"&gt;deCONZ installieren&lt;/h3&gt;
&lt;p&gt;Wenn das alles erledigt ist, können wir die Software installieren.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install deconz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="port-für-deconz-ändern"&gt;Port für deCONZ ändern&lt;/h3&gt;
&lt;p&gt;Standardmäßig hört die Phoscon App auf den Port 80. Da ich gegebenenfalls noch andere Dienste auf dem Pi betreiben und diese hinter einen nginx-Proxy hängen möchte, ändere ich den Port auf 8080.&lt;/p&gt;
&lt;p&gt;Dies erreichen wir, in dem wir den systemd-Aufruf für deCONZ überschreiben. Dies könnten wir entweder direkt im Service-File machen, oder die Möglichkeit von systemd nutzen, einen Override zu konfigurieren.&lt;/p&gt;
&lt;p&gt;Ich wähle letztere Variante, da das erstens die elegantere Möglichkeit ist und zweitens auch erhalten bleibt, wenn ein Software-Update das normale Service-File überschreibt.&lt;/p&gt;
&lt;p&gt;Mit einem &lt;code&gt;sudo systemctl edit deconz&lt;/code&gt; öffnen wir einen Editor, welcher die benötigte Verzeichnis-Struktur und die override.conf erstellt.
In diesen Editor fügen wir dann Folgendes ein&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/deCONZ -platform minimal --http-port=8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wenn Du einen andere Port nutzen möchtest, ersetze &lt;em&gt;8080&lt;/em&gt; entsprechend durch Deine Wunschkonfiguration.&lt;/p&gt;
&lt;p&gt;Über &lt;code&gt;sudo systemctl daemon-reload&lt;/code&gt; weisen wir den Daemon an, die Konfiguration neu einzulesen.&lt;/p&gt;
&lt;h3 id="deconz-aktivieren-und-starten"&gt;deCONZ aktivieren und starten&lt;/h3&gt;
&lt;p&gt;Wenn das alles erledigt ist, können wir den deCONZ-Dienst aktivieren und starten.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; deconz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start deconz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="homebridge-installieren"&gt;Homebridge installieren&lt;/h2&gt;
&lt;h3 id="nodejs-installieren"&gt;node.js installieren&lt;/h3&gt;
&lt;p&gt;Homebridge ist eine Node.js-Software, die zur Verwaltung der Plugins auf NPM setzt. Wir beginnen also damit, erst mal das offizielle Node.js-Repository hinzuzufügen und die Paketquellen zu aktualisieren.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sL https://deb.nodesource.com/setup_14.x &lt;span class="p"&gt;|&lt;/span&gt; sudo bash -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="nodejs-und-benötigte-abhängigkeiten-installieren"&gt;node.js und benötigte Abhängigkeiten installieren&lt;/h3&gt;
&lt;p&gt;Nun können wir Node.js installieren. Des Weiteren benötigen wir ein paar Pakete, um die jeweiligen Homebridge-Plugins zu bauen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y nodejs gcc g++ make python net-tools
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="homebridge-installieren-1"&gt;Homebridge installieren&lt;/h3&gt;
&lt;p&gt;Jetzt ist das System bereit, um Homebridge, sowie das Webfrontend und das Hue-Plugin zu installieren, welches wir nutzen, um Homebridge mit der deCONZ-Bridge zu verbinden. Dies läuft jetzt alles über NPM.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo npm install -g --unsafe-perm homebridge homebridge-config-ui-x homebridge-hue
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="homebridge-service-einrichten"&gt;Homebridge Service einrichten&lt;/h3&gt;
&lt;p&gt;Homebridge bringt ein kleines Tool mit, welches es auf einfachste Art und Weise ermöglicht, Homebridge als systemd-Service zu konfigurieren und hierfür einen eigenen User anzulegen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo hb-service install --user homebridge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wenn das erledigt ist, legen wir auch für Homebridge einen Override an. Für eine reibungslose Funktion ist es sinnvoll, Homebridge erst nach deCONZ zu starten. Ansonsten versucht Homebridge, deCONZ zu erreichen, bekommt keine Rückmeldung und die gekoppelten Zigbee-Geräte sind erst nach einem erneuten Neustart von Homebridge verfügbar. Das umgehen wir jetzt einfach.&lt;/p&gt;
&lt;p&gt;Wir starten also wieder über &lt;code&gt;sudo systemctl edit homebridge&lt;/code&gt; den Editor und fügen Folgendes ein&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;syslog.target network-online.target deconz.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Von nun an wird Homebridge erst gestartet, wenn deCONZ gestartet wurde und alles sollte geschmeidig durchlaufen.&lt;/p&gt;
&lt;p&gt;Zum Abschluss lassen wir die Service-Files neu einlesen und restarten Homebridge noch mal.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart homebridge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Homebridge ist jetzt auf dem Port &lt;em&gt;8581&lt;/em&gt; erreichbar. Der Defaultaccount heißt &lt;em&gt;admin&lt;/em&gt; und das Passwort lautet ebenfalls &lt;em&gt;admin&lt;/em&gt;. Das sollte später in den Einstellungen geändert werden.&lt;/p&gt;
&lt;h2 id="homebridge-konfigurieren-und-beide-systeme-verheiraten"&gt;Homebridge konfigurieren und beide Systeme verheiraten&lt;/h2&gt;
&lt;h3 id="homebridge-vorbereiten"&gt;Homebridge vorbereiten&lt;/h3&gt;
&lt;p&gt;Die Konfiguration von Homebridge erfolgt über die Datei &lt;em&gt;/var/lib/homebridge/config.json&lt;/em&gt;. Diese kann entweder direkt auf der Shell oder eben auch über das Webinterface bearbeitet werden.&lt;/p&gt;
&lt;p&gt;Wir Fügen erst ein mal folgenden Code hinzu, um das Hue-Plugin in Betrieb zu nehmen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;platforms&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;anyOn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;effects&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;hosts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;homebridge.local:8080&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;lights&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;nativeHomeKitLights&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;nativeHomeKitSensors&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;resource&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;sensors&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;platform&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hue&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dies bringt Homebridge bei, zu welcher Bridge sie sich verbinden soll und welche Geräte an HomeKit weitergereicht werden sollen. So betreibe ich die Homebridge als Hue-Bridge-Ersatz und bin bisher zufrieden.&lt;/p&gt;
&lt;p&gt;Im nächsten Schritt müssen wir dann nach einen User-Account auf der Bridge erstellen, damit Homebridge sich damit verbinden kann.&lt;/p&gt;
&lt;h3 id="deconz-unlocken"&gt;deCONZ unlocken&lt;/h3&gt;
&lt;p&gt;Als erstes öffnen wir hierfür die Phoscon App unter &lt;em&gt;&lt;a href="http://homebridge.local:8080"&gt;http://homebridge.local:8080&lt;/a&gt;&lt;/em&gt; und vergeben einen Namen sowie ein Login-Passwort für das Gateway.&lt;/p&gt;
&lt;p&gt;Den Dialog zum Hinzufügen von Lampen können wir erst ein mal überspringen.&lt;/p&gt;
&lt;p&gt;Wenn wir jetzt in Phoscon eingeloggt sind, klicken wir in der Sidebar auf &lt;strong&gt;Gateway&lt;/strong&gt;. Dort haben wir die Möglichkeit, ggf. Die Firmware des Moduls, sowie die Phoscon App zu aktualisieren.&lt;/p&gt;
&lt;p&gt;Wir klicken unten auf &lt;strong&gt;Erweitert&lt;/strong&gt; und anschließend auf den Button &lt;strong&gt;Authenticate App&lt;/strong&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://christianbaer.me/post/2021/04/raspberry-pi-als-universelle-zigbee-bridge-in-homekit-konfigurieren/phoscon-unlock.png" &gt;&lt;img src="https://christianbaer.me/post/2021/04/raspberry-pi-als-universelle-zigbee-bridge-in-homekit-konfigurieren/phoscon-unlock_hu_acac5904230d3d0b.png" width="700" height="426" /&gt;&lt;/a&gt;
&lt;figcaption&gt;
&lt;small&gt;
Screenshot der Phoscon App
&lt;/small&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Dies gibt uns nun 60 Sekunden Zeit, uns durch Homebridge einen API-Zugang erstellen zu lassen.&lt;/p&gt;
&lt;h3 id="zugangsdaten-erstellen-und-in-die-konfiguration-einfügen"&gt;Zugangsdaten erstellen und in die Konfiguration einfügen&lt;/h3&gt;
&lt;p&gt;Wir loggen uns also in Homebridge unter &lt;a href="http://homebridge.local:8581"&gt;http://homebridge.local:8581&lt;/a&gt; ein und klicken auf das &lt;strong&gt;⏻-Symbol&lt;/strong&gt;, um Homebridge neu zu starten.&lt;/p&gt;
&lt;p&gt;Im Log auf dem Dashboard können wir nun verfolgen, wie Homebridge die Konfiguration und alle Plugins lädt.&lt;/p&gt;
&lt;p&gt;Irgendwann meldet die Software, dass ein neuer User angelegt wurde und wie die Zugangsdaten lauten.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[4/14/2021, 3:14:40 PM] [Hue] Phoscon-GW: dresden elektronik deCONZ gateway v2.10.4, api v1.16.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[4/14/2021, 3:14:40 PM] [Hue] Phoscon-GW: created user - please edit config.json and restart homebridge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;platforms&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;platform&amp;#34;: &amp;#34;Hue&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;users&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;00212EFFFF06F00E&amp;#34;: &amp;#34;5A03564876&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Diesen Codeschnipsel kopieren wir nun in unsere Homebridge-Konfiguration.&lt;/p&gt;
&lt;p&gt;Die Komplette Konfiguration könnte nun so aussehen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;bridge&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Homebridge A7F6&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;username&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0E:FA:B7:84:A7:F6&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;port&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;51775&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;pin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;119-28-333&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;accessories&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;platforms&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Config&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;port&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8581&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;platform&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;config&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;anyOn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;effects&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;hosts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;homebridge.local:8080&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;users&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;00212EFFFF06F00E&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;5A03564876&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;lights&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;nativeHomeKitLights&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;nativeHomeKitSensors&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;resource&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;sensors&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;platform&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hue&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="homebridge-in-homekit-einbinden"&gt;Homebridge in HomeKit einbinden&lt;/h3&gt;
&lt;p&gt;Das Einbinden der Homebridge in HomeKit könnte einfacher nicht sein.&lt;/p&gt;
&lt;p&gt;Sowohl auf dem Homebridge-Dashboard, als auch im Logfile bietet Homebridge uns einen QR-Code an, den wir, wie bei jedem anderen HomeKit-Gerät, mit der Home-App scannen und so importieren können.&lt;/p&gt;
&lt;h3 id="das-wars-schon"&gt;Das war&amp;rsquo;s schon&lt;/h3&gt;
&lt;p&gt;Nun können wir damit beginnen allerlei Zigbee-Geräte in Phoscon zu pairen. Gegebenenfalls ist ein Neustart von Homebridge notwendig, damit sie in HomeKit erscheinen.&lt;/p&gt;</description></item><item><title>Zigbee als Brückentechnologie im Smarthome mit RaspBee und Homebridge</title><link>https://christianbaer.me/post/2021/04/zigbee-als-brueckentechnologie-im-smarthome-mit-raspbee-und-homebridge/</link><pubDate>Mon, 12 Apr 2021 10:19:08 +0000</pubDate><guid>https://christianbaer.me/post/2021/04/zigbee-als-brueckentechnologie-im-smarthome-mit-raspbee-und-homebridge/</guid><description>&lt;p&gt;Ich habe in den letzten Monaten damit begonnen, zu Hause ein Bisschen mit Smart-Home-Geräten und HomeKit zu experimentieren.&lt;/p&gt;
&lt;p&gt;Auslöser war der Wunsch die Beleuchtung an meinem Schreibtisch ein wenig besser steuern zu können um für &amp;ldquo;casual Computing&amp;rdquo;, Arbeiten und Videocalls unterschiedliche Beleuchtungssituationen zu haben, die bis zum Tageslichtsprektrum reichen.&lt;/p&gt;
&lt;p&gt;Eingezogen sind somit die ersten drei &lt;a href="https://www.philips-hue.com/de-de"&gt;Philips Hue&lt;/a&gt;-Birnen, sowie die dazugehörige Hue-Bridge.&lt;/p&gt;
&lt;p&gt;Im nächsten Schritt wollte ich das ganze auch über einen physischen Schalter steuerbar machen. Ich habe mir also einen Hue Button und den &lt;a href="https://www.aqara.com/us/cube.html"&gt;&amp;ldquo;Zauberwürfel&amp;rdquo; von Aqara&lt;/a&gt; zugelegt. Den Hue Button konnte ich erwartungsgemäß ziemlich einfach einbinden. Gehapert hat es dann aber am Aqara-Würfel. Dieser benötigt nämlich die Aqara-Bridge, was mir vorher nicht so klar war.&lt;/p&gt;
&lt;p&gt;Da ich keine Lust hatte, mir jetzt auch noch eine Aqara-Bridge ins Haus zu holen, welche wohl auch noch einen Cloud-Zwang mit sich zu bringen scheint, machte ich mich auf die Suche nach Alternativen.&lt;/p&gt;
&lt;p&gt;Relativ schnell stieß ich auf den &lt;a href="https://phoscon.de/de/raspbee"&gt;RaspBee II&lt;/a&gt; von &lt;a href="https://www.dresden-elektronik.de"&gt;dresden elektronik&lt;/a&gt;. Dies ist ein kleines Modul, welches auf den GPIO-Port des Raspberry Pi gesteckt wird und ihm ermöglicht, Zigbee zu sprechen, was das Protokoll ist, dass die meisten Smart-Home-Bridges nutzen, um mit ihren Geräten zu kommunizieren. Die Technik des RaspBee gibt es als ConBee auch noch in Form eines USB-Sticks, der dann auch an &amp;ldquo;normalen&amp;rdquo; PCs genutzt werden kann.&lt;/p&gt;
&lt;p&gt;Da ich noch einen ungenutzten Raspberry Pi in der Schublade liegen hatte, dachte ich mir, ich probiere das einfach mal aus. Das Modul kostet die Hälfte der Aqara-Bridge und hat sich dann schon quasi gelohnt. Die Hue Bridge kann ich auch wieder abstoßen und mir hoffentlich zukünftig auch den Kauf von weiteren Bridges sparen.&lt;/p&gt;
&lt;p&gt;Aber zuerst mal noch ein kleiner und oberflächlicher Ausritt zu Zigbee.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://de.wikipedia.org/wiki/ZigBee"&gt;Zigbee&lt;/a&gt; ist ein Mesh-Netzwerk. Das bedeutet, alle Zigbee-Geräte untereinander schließen sich zusammen und können (soweit sie dauerhaft am Strom hängen) Signale dorthin weiterleiten, wo sie hin sollen. So kann eine Birne auch sehr weit von der Bridge entfernt sein, wenn zwischendurch noch genug andere Geräte eingebunden sind, die die Wegstrecken verkürzen. Eine strategisch platzierte Zigbee-Steckdose oder Birne im Obergeschoss reichen meist schon aus, um das Erdgeschoss mit dem Dachgeschoss zu verbinden.&lt;/p&gt;
&lt;p&gt;Das Problem aktuell ist jedoch, dass die meisten Hersteller ihre eigenen Bridges an den Start bringen und diese jeweils voneinander unabhängige Zigbee-Netzwerke aufbauen. Dann meshed Hue mit Hue, Aqara mit Aqara usw. Und der ganze schöne Vorteil von Zigbee ist dem Vendor-LockIn zum Opfer gefallen.&lt;/p&gt;
&lt;p&gt;Mit &lt;a href="https://www.threadgroup.org"&gt;Thread&lt;/a&gt; ist eine auf diesen Bausteinen aufbauende Technologie im Anmarsch, die ähnlich funktioniert und Herstellerunabhängigkeit und ein Leben ohne Bridges verspricht. Hier braucht man dann nur noch einen Thread-fähigen Border-Router wie z.B. den HomePod mini und alle Geräte können über ihn meshen. Die Anzahl an Thread-fähigen Geräten wächst langsam und viele Geräte mit Zigbee und Bluetooth sind zumindest hardwareseitig wohl auch schon Thread-fähig.&lt;/p&gt;
&lt;p&gt;Bis alles mit Thread realisierbar ist, bleibt Zigbee aber die Brückentechnologie (pun intended).&lt;/p&gt;
&lt;p&gt;Nun zurück zum RaspBee II. Das Modul ermöglicht es nun, mit dem Raspberry Pi eine Zigbee-Bridge aufzubauen, die mit Geräten unterschiedlichster Hersteller spricht. Ich habe jetzt zum Beispiel meine Hue-Geräte, sowie den Aqara-Schalterwürfel eingebunden. Ebenso wäre es möglich, Bosch- oder IKEA-Geräte mit einzubinden.&lt;/p&gt;
&lt;p&gt;Der Vorteil liegt nun darin, dass ich nur noch eine Bridge habe. Und wie durch ein Wunder sprechen auf ein mal auch alle Geräte miteinander und ich habe ein einziges wunderbar großes Zigbee-Netz.&lt;/p&gt;
&lt;p&gt;Um das zu realisieren, gibt es für den RaspBee II die &lt;a href="https://www.dresden-elektronik.de/funk/software/deconz.html"&gt;deCONZ-Software&lt;/a&gt;. Diese ist quasi die Steuerungsschicht, über die der Raspberry Pi mit den Zigbee-Geräten sprechen kann. Verwaltet wird dies entweder über die Shell, oder über die &lt;a href="https://www.phoscon.de/de/app/doc"&gt;Phoscon App&lt;/a&gt;. Diese ist ein Webinterface, die es ermöglicht, über den Browser Geräte zu pairen, Firmware-Updates einzuspielen, Räume und Szenen anzulegen und eben alles zu machen, was man mit der Hue Bridge auch machen kann.&lt;/p&gt;
&lt;p&gt;Mit einer &lt;a href="https://homebridge.io"&gt;Homebridge&lt;/a&gt; und einem &lt;a href="https://www.npmjs.com/package/homebridge-hue"&gt;entsprechenden Plugin&lt;/a&gt; lässt sich das ganze auch in Apples HomeKit einbinden und dann alles schön automatisieren und über den Mac, iOS-Geräte oder eben Siri, steuern.&lt;/p&gt;
&lt;p&gt;Da die Installationsanleitung mit ein paar Tipps, um das ganze ein Bisschen weniger fehleranfällig zu machen, hier den Rahmen sprengen würde, kommt diese im &lt;a href="https://christianbaer.me/post/2021/04/raspberry-pi-als-universelle-zigbee-bridge-in-homekit-konfigurieren/"&gt;nächsten Post&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>caldav2todoist - Todoist mit Siri ohne IFTTT</title><link>https://christianbaer.me/post/2020/09/caldav2todoist-todoist-mit-siri-ohne-ifttt/</link><pubDate>Wed, 23 Sep 2020 21:31:20 +0200</pubDate><guid>https://christianbaer.me/post/2020/09/caldav2todoist-todoist-mit-siri-ohne-ifttt/</guid><description>&lt;p&gt;Ich bin langjähriger Nutzer von &lt;a href="https://todoist.com"&gt;Todoist&lt;/a&gt; und versuche möglichst viele Dinge (mit meiner Nextcloud) selbst zu hosten.&lt;/p&gt;
&lt;p&gt;Zusätzlich bin ich voll im Apple-Ökosystem zu Hause und genieße es, Aufgaben über &lt;em&gt;Siri&lt;/em&gt; in meine Watch, mein iPhone oder auch im Auto über CarPlay zu diktieren.&lt;/p&gt;
&lt;p&gt;Der von Todoist empfohlene Weg, Siri und Todoist zu verbinden, sieht vor, dass die Aufgaben in einer Reminders-Liste landen und man den Dienst &lt;a href="https://ifttt.com"&gt;IFTTT&lt;/a&gt; nutzt, um diese dann in Todoist erstellen zu lassen.&lt;/p&gt;
&lt;p&gt;Das hat vor ein paar Jahren mal eine Zeit lang mehr oder weniger funktioniert. Mindestens seit einem Jahr aber bei mir nicht mehr, und wenn, nicht zuverlässig. Zudem ist IFTTT eben wieder ein externer Dienst, den ich mit in die Kette nehmen muss und der Zugriff auf meine Daten hat.&lt;/p&gt;
&lt;p&gt;Ich überlegte also schon die ganze Zeit, wie ich das Thema anders lösen kann und war auch schon auf der Suche nach einem anderen Todolisten-Dienst.&lt;/p&gt;
&lt;p&gt;Gestern habe ich mir dann mal angeschaut, wie man mit &lt;em&gt;curl&lt;/em&gt; CalDAV-Server abfragen und die Todoist-API bedienen kann. Nach ein Bisschen rumprobieren ist es mir dann gelungen, und &lt;a href="https://git.debilux.org/chbaer/caldav2todoist"&gt;caldav2todoist&lt;/a&gt; ist entstanden.&lt;/p&gt;
&lt;p&gt;Dieses Script läuft in &lt;em&gt;/bin/sh&lt;/em&gt; und hat keine externen Abhängigkeiten (&lt;em&gt;curl&lt;/em&gt; und &lt;em&gt;uuidgen&lt;/em&gt; sollten auf allen modernen Systemen ja vorhanden sein).&lt;/p&gt;
&lt;p&gt;Es ruft von einem CalDAV-Kalender die Tasks ab, die seit dem letzten Abruf erstellt wurden. Diese werden in einer Datei zwischengespeichert und dann Stück für Stück in die Todoist-Inbox gepusht. Falls das fehlschlägt, bleiben sie gespeichert und sind beim nächsten Aufruf noch mal dran.&lt;/p&gt;
&lt;p&gt;Dieses Script läuft bei mir jetzt minütlich per &lt;em&gt;cron&lt;/em&gt; und mein Problem ist gelöst.&lt;/p&gt;
&lt;p&gt;Nebenbei habe ich noch einen &lt;a href="https://github.com/nextcloud/server/issues/23011#event-3796562061"&gt;Bug in nextcloud&lt;/a&gt; bzw. der Tasks-App gefunden.
Wenn man diese nutzt, um über das Webinterface eine Aufgabe zu erstellen, werden diese mit der Zeitzone des Servers für das CREATED-Feld und alle anderen zeitrelevanten Dinge gespeichert. Wenn man sie anders, wie in meinem Fall über Siri oder die Reminders-App direkt, erstellt, wird UTC als Zeitzone benutzt, was auch &lt;a href="https://tools.ietf.org/html/rfc4791"&gt;RFC 4791&lt;/a&gt; fordert.&lt;/p&gt;
&lt;p&gt;Dadurch fallen bei caldav2todoist Tasks durchs Raster oder werden doppelt erstellt, da ich immer von UTC ausgehe.&lt;/p&gt;
&lt;p&gt;Es stellt sich heraus, dass die Tasks-App für nextcloud einfach &lt;a href="https://github.com/nextcloud/server/issues/23011#issuecomment-697175561"&gt;noch nicht mit Zeitzonen umgehen kann&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>OpenVPN on demand mit iOS</title><link>https://christianbaer.me/post/2020/06/openvpn-on-demand-mit-ios/</link><pubDate>Sun, 28 Jun 2020 17:00:11 +0200</pubDate><guid>https://christianbaer.me/post/2020/06/openvpn-on-demand-mit-ios/</guid><description>&lt;p&gt;Ich war für meine VPN-Lösung jahrelang Nutzer von IPSec, da dies zuerst von der Fritz!Box und dann die letzten Jahre vom EdgeRouter und zuletzt vom USG direkt unterstützt wurde.&lt;/p&gt;
&lt;p&gt;Diverse Gründe haben mich aber in den letzten Wochen zum Umstieg auf einen DIY-Router mit &lt;a href="https://opnsense.org/"&gt;OPNsense&lt;/a&gt; bewegt.&lt;/p&gt;
&lt;p&gt;Da IPSec irgendwie immer eine Krücke ist und OpenVPN direkt von OPNsense unterstützt wird und viele Vorteile bringt, habe ich mich entschlossen, mit dem Router auch den VPN-Server zu wechseln.&lt;/p&gt;
&lt;p&gt;Wenn man diesen in OPNsense einrichtet und einen User inkl. Zertifikaten etc. anlegt, gibt es die Möglichkeit, das entsprechende ovpn-File zur Konfiuration der Clients direkt aus OPNsense herunter zu laden.&lt;/p&gt;
&lt;p&gt;Wie ich &lt;a href="https://christianbaer.me/post/2018/03/ios-in-unbekannten-wlans-automatisch-mit-vpn-verbinden/"&gt;hier&lt;/a&gt; beschrieben habe, nutzte ich mit IPsec die Möglichkeit, unter iOS eine VPN-Verbindung aufzubauen, wenn ich mich außerhalb vertrauenswürdiger WLANs bewegte. So einen einfachen Konfigurator gibt es für OpenVPN leider nicht. Auch der offizielle OpenVPN-Client für iOS bietet diese Konfigurationsmöglichkeiten nicht.&lt;/p&gt;
&lt;p&gt;Durch Zufall bin ich dann aber über &lt;a href="https://passepartoutvpn.app/"&gt;Passepartout&lt;/a&gt;, einen alternativen iOS-OpenVPN-Client, gestoßen. Dieser bietet genau die Möglichkeiten, die gesucht habe.&lt;/p&gt;
&lt;p&gt;Ich kann vertrauenswürdige WLANs definieren, angeben, ob das Mobilfunknetz mit oder ohne VPN genutzt werden soll und einfach mein Configfile aus OPNsense importieren. Und er ist &lt;a href="https://github.com/passepartoutvpn"&gt;Open Source&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ich habe ihn jetzt ein paar Wochen im Einsatz und muss sagen, er macht was er soll und ich bin sehr zufrieden.&lt;/p&gt;</description></item><item><title>iocage VNET-Jails Unter FreeBSD in VLANs Betreiben</title><link>https://christianbaer.me/post/2020/06/iocage-vnet-jails-unter-freebsd-in-vlans-betreiben/</link><pubDate>Sun, 07 Jun 2020 12:16:03 +0200</pubDate><guid>https://christianbaer.me/post/2020/06/iocage-vnet-jails-unter-freebsd-in-vlans-betreiben/</guid><description>&lt;p&gt;Ich habe einige Zeit damit verbracht, iocage VNET Jails und VLANs unter einen Hut zu bekommen. Da ich erfolgreich war, möchte ich meinen Weg hier dokumentieren.&lt;/p&gt;
&lt;p&gt;Zuerst ein mal ein paar Infos zu meinem Setup.&lt;/p&gt;
&lt;p&gt;Das ungetaggte Management-Netz hat das IP-Netz 192.168.1.1/24.&lt;/p&gt;
&lt;p&gt;Zusätzlich gibt es mehrere getaggte VLANS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LAN 10.0.3.12/24 (VLAN 30)&lt;/li&gt;
&lt;li&gt;IoT 10.0.4.12/24 (VLAN 40)&lt;/li&gt;
&lt;li&gt;Guest 10.0.5.12/24 (VLAN 50)&lt;/li&gt;
&lt;li&gt;VOIP 10.0.6.12/24 (VLAN 60)&lt;/li&gt;
&lt;li&gt;DMZ 10.0.7.12/24 (VLAN 70)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der Server verfügt über zwei NICs (&lt;em&gt;igb0&lt;/em&gt; und &lt;em&gt;igb1&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Das Ziel ist, dass &lt;em&gt;igb0&lt;/em&gt; im Management-Netz hängt und z.B. der SSH-Server des Hosts darüber verfügbar ist. Das über den Switch schon das richtige Netz ankommt, ist hier nichts großartig zu konfigurieren.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;igb1&lt;/em&gt; soll als Interface für die iocage-Jails dienen. Der Port ist auf dem Switch als Trunk konfiguriert. Hier kommen also alle VLANs getagged an. Für die Jails möchte ich jeweils konfigurieren können, in welchem VLAN und dementsprechend auch welchem IP-Netz sie betrieben werden, um z.B. den Webserver in der DMZ und den Samba-Server im normalen LAN erreichbar zu machen.&lt;/p&gt;
&lt;p&gt;Hierfür ist es zunächst notwendig, erst mal alles in der &lt;em&gt;/etc/rc.conf&lt;/em&gt; zu konfigurieren. Später konfigurieren wir noch die Jails.&lt;/p&gt;
&lt;h2 id="etcrcconf"&gt;/etc/rc.conf&lt;/h2&gt;
&lt;p&gt;Als erstes setzen wir für den Host den Defaultrouter und den Nameserver aus dem untagged Management-Netz.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;defaultrouter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;192.168.1.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;nameserver&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;192.168.1.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Als nächstes konfigurieren wir &lt;em&gt;igb0&lt;/em&gt; (welche im Management-Netz hängt) und vergeben hier eine IP (192.168.1.12).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_igb0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;inet 192.168.1.12/24 -rxcsum -rxcsum6 -txcsum -txcsum6 -lro -tso -vlanhwtso description Management&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Der Host ist nun regulär über 192.168.1.12 erreichbar, solange man im Management-Netz hängt, oder entsprechende Firewall-Regeln gesetzt hat. Bis hierhin erst mal nichts besonderes.&lt;/p&gt;
&lt;p&gt;Widmen wir uns nun also &lt;em&gt;igb1&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Zuerst konfigurieren wir das Interface, bringen es hoch, aber vergeben keine IP.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_igb1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;up -lro -tso4 -tso6 -vlanhwtso&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Im nächsten schritt definieren wir, welche VLANs wir auf der NIC sprechen wollen. Die Namen sind prinzipiell frei wählbar, eine einheitliche Namensgebung vereinfacht aber die Übersicht.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;vlans_igb1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;vlan30 vlan40 vlan50 vlan60 vlan70&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jetzt müssen wir für jedes eben angelegt Netz noch definieren, in welches VLAN es gehört, welche IP das Interface erhalten soll (auch hier vergebe ich einfach die 12 in allen Netzen um es übersichtlich zu haben) und können noch eine Beschreibung eintragen, die z.B. von &lt;em&gt;ifconfig&lt;/em&gt; ausgegeben wird.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;create_args_vlan30&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;vlan 30&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_vlan30&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;inet 10.0.3.12/24&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_vlan30_descr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;LAN (VLAN 30)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;create_args_vlan40&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;vlan 40&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_vlan40&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;inet 10.0.4.12/24&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_vlan40_descr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;IoT (VLAN 40)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;create_args_vlan50&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;vlan 50&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_vlan50&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;inet 10.0.5.12/24&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_vlan50_descr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Guest (VLAN 50)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;create_args_vlan60&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;vlan 60&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_vlan60&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;inet 10.0.6.12/24&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_vlan60_descr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;VOIP (VLAN 60)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;create_args_vlan70&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;vlan 70&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_vlan70&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;inet 10.0.7.12/24&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_vlan70_descr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;DMZ (VLAN 70)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Da &lt;em&gt;iocage&lt;/em&gt; mit den Interfaces alleine noch nichts anfangen kann, müssen wir jetzt für jedes VLAN noch eine Bridge anlegen, welche dann später von den Jails genutzt wird. Auch hier gilt wieder: Einheitliche Namen erleichtern die Übersicht.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;cloned_interfaces&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bridge30 bridge40 bridge50 bridge60 bridge70&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_bridge30&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;up addm vlan30&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_bridge40&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;up addm vlan40&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_bridge50&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;up addm vlan50&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_bridge60&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;up addm vlan60&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_bridge70&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;up addm vlan70&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nach einem Reboot ist unsere Konfiguration geladen und aktiv.&lt;/p&gt;
&lt;h2 id="iocage-jails-konfigurieren"&gt;iocage Jails konfigurieren&lt;/h2&gt;
&lt;p&gt;Zu guterletzt müssen wir iocage noch beibringen, die Bridges zu nutzen. Das eben angesprochene Szenario, Webserver in der DMZ und Samba-Server im LAN würden wir wie folgt realisieren.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;iocage &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;interfaces&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vnet0:bridge30 samba
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;iocage &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;interfaces&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vnet0:bridge70 www
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Da iocage standardmäßig die Nameserver aus der &lt;em&gt;/etc/resolv.conf&lt;/em&gt; des Hosts an
die Jails weitergibt, und diese dann aus der Jail nicht erreichbar sind, da sie
ja in einem anderen Netz liegen, ist noch ein Bisschen Handarbeit notwendig.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;iocage &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;defaultrouter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;10.0.3.1&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;resolver&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;10.0.3.1&amp;#34;&lt;/span&gt; samba
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;iocage &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;defaultrouter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;10.0.7.1&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;resolver&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;10.0.7.1&amp;#34;&lt;/span&gt; www
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Somit haben wir für die Jail das entsprechende Gateway und den Resolver des
VLANs gesetzt und die Kommunikation sollte funktionieren.&lt;/p&gt;
&lt;p&gt;Wenn die Jails neugestartet wurden, sind sie im richtigen Netz. Auf dem selben Weg können wir nun auch alle anderen Jails zu allen anderen VLANs hinzufügen.&lt;/p&gt;
&lt;h2 id="linkaggregation-mit-lacp"&gt;Linkaggregation mit LACP&lt;/h2&gt;
&lt;p&gt;Wenn wir jetzt aber statt einer einzelnen NIC für die Jails gerne mehrere NICs
bündeln würden, um die Bandbreite zu erhöhen, können wir das auch mit minimalen
Änderungen tun.&lt;/p&gt;
&lt;p&gt;Ich habe im Server noch eine andere Karte &lt;em&gt;em0&lt;/em&gt; stecken und möchte diese für das Management-Netz
nutzen. So habe ich &lt;em&gt;igb0&lt;/em&gt; und &lt;em&gt;igb1&lt;/em&gt; frei, um sie über LACP zu bündeln und den
Jails zur Verfüfung zu stellen.&lt;/p&gt;
&lt;p&gt;Zuerst konfigurieren wir &lt;em&gt;em0&lt;/em&gt; genau so, wie wir es oben mit &lt;em&gt;igb0&lt;/em&gt; gemacht
haben.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_em0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;inet 192.168.1.12/24 -rxcsum -rxcsum6 -txcsum -txcsum6 -lro -tso -vlanhwtso description Management&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Als nächstes machen wir dem System _igb_0 und &lt;em&gt;igb1&lt;/em&gt; bekannt und bündeln diese
im Interface &lt;em&gt;lagg0&lt;/em&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_igb0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;up -lro -tso4 -tso6 -vlanhwtso&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_igb1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;up -lro -tso4 -tso6 -vlanhwtso&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Und zum Schluss definieren wir dann die VLANs statt auf &lt;em&gt;igb1&lt;/em&gt; eben auf &lt;em&gt;lagg0&lt;/em&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;cloned_interfaces&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;lagg0 bridge30 bridge40 bridge50 bridge60 bridge70&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ifconfig_lagg0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;laggproto lacp laggport igb0 laggport igb1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;vlans_lagg0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;vlan30 vlan40 vlan50 vlan60 vlan70&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;An der Config der Jails müssen wir nichts ändern, da diese ja die bridges nutzen
und wir in die Bridges die VLAN-Interfaces packen, und nicht die NICs direkt.&lt;/p&gt;
&lt;p&gt;Den Jails steht jetzt die gebündlete Bandbreite von 2 GBit-Nics zur Verfügung.
Jede Verbindung nutzt weiterhin nur eine NIC und kann somit maximal 1 GBit
erreichen. Mehrere Verbindungen verteilen sich dann aber auf die Karten und
können dann zusammen eben theoretisch 2 GBit erreichen. Man könnte dies auch
noch mit zusätzlichen NICs erweitern, falls man sie hat und muss sie nur hochbringen und
ins &lt;em&gt;lagg0&lt;/em&gt; packen.&lt;/p&gt;</description></item><item><title>Some zshrc tricks</title><link>https://christianbaer.me/post/2020/05/some-zshrc-tricks/</link><pubDate>Sun, 24 May 2020 22:53:40 +0200</pubDate><guid>https://christianbaer.me/post/2020/05/some-zshrc-tricks/</guid><description>&lt;p&gt;&lt;a href="https://www.arp242.net/"&gt;Martin Tournoij&lt;/a&gt; hat in seinem Artikel &lt;a href="https://www.arp242.net/zshrc.html"&gt;Some zshrc
tricks&lt;/a&gt; ein paar sehr hilfreiche Tipps für
eine schöne und portable ZSH-Konfiguration niedergeschrieben. Ich habe einige
davon direkt mal in meine &lt;a href="https://git.debilux.org/chbaer/dotfiles"&gt;dotfiles&lt;/a&gt;
eingebaut.&lt;/p&gt;
&lt;p&gt;Insbesondere die Tipps zum Aufräumen des $PATH (keine Duplikate, nur Pfade, die
auch existieren) fand ich sehr hilfreich.&lt;/p&gt;</description></item><item><title>Usefull one line scripts for sed</title><link>https://christianbaer.me/post/2020/05/usefull-one-line-scripts-for-sed/</link><pubDate>Wed, 13 May 2020 09:46:19 +0200</pubDate><guid>https://christianbaer.me/post/2020/05/usefull-one-line-scripts-for-sed/</guid><description>&lt;p&gt;&lt;a href="http://www.pement.org/"&gt;Eric Pement&lt;/a&gt; pflegt &lt;a href="http://www.pement.org/sed/sed1line.txt"&gt;eine Liste&lt;/a&gt;
mit nützlichen Onelinern für sed. Wenn man also mal schauen möchte, was sed alles
kann oder Tipps für einen konkreten Anwendungsfall braucht,lohnt sich ein Blick.
Auch, wenn die letzte Aktualisierung vom 29. Dezember 2005 ist.&lt;/p&gt;
&lt;p&gt;Ein Beispiel:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# align all text flush right on a 79-column width&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sed -e :a -e &lt;span class="s1"&gt;&amp;#39;s/^.\{1,78\}$/ &amp;amp;/;ta&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# set at 78 plus 1 space&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Mac-Keyboard unter Linux benutzen</title><link>https://christianbaer.me/post/2020/05/mac-keyboard-unter-linux-benutzen/</link><pubDate>Tue, 12 May 2020 22:08:35 +0200</pubDate><guid>https://christianbaer.me/post/2020/05/mac-keyboard-unter-linux-benutzen/</guid><description>&lt;p&gt;Ich habe häufiger das Problem, dass ich in virtuellen Linux-Maschinen, die ich in
VirtualBox auf macOS ausführe kein vernünftiges Keyboard-Layout habe. Wenn man
dann zum Beispiel ein @ eintippen möchte, passiert einfach nichts. Selbst dann,
wenn man beim Setup ein Macintosh-Layout wählt.&lt;/p&gt;
&lt;p&gt;Das Problem lässt sich aber recht leicht beheben, indem wir die XKB-Config
anpassen.&lt;/p&gt;
&lt;p&gt;Unter Ubuntu-basierten Distributionen erledigen wir das in der Datei
&lt;em&gt;/etc/default/keyboard&lt;/em&gt;. Einfach folgende Parameter einfügen, und die Tastatur
funktioniert, wie sie soll.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;XKBMODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;macintosh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;XKBLAYOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ch&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;XKBVARIANT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;de_mac&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;XKBOPTIONS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;lv3:alt_switch&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;BACKSPACE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;guess&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>jailer.sh endlich ordentlich dokumentiert</title><link>https://christianbaer.me/post/2020/05/jailer.sh-endlich-ordentlich-dokumentiert/</link><pubDate>Sun, 10 May 2020 22:25:03 +0200</pubDate><guid>https://christianbaer.me/post/2020/05/jailer.sh-endlich-ordentlich-dokumentiert/</guid><description>&lt;p&gt;Ich habe in den letzten Tagen ein Bisschen am Code von
&lt;a href="https://github.com/chrisb86/jailer.sh"&gt;jailer.sh&lt;/a&gt; geschraubt und einen
umfangreichen sample-Flavour hinzugefügt.&lt;/p&gt;
&lt;p&gt;Das ganz ist jetzt auch endlich mal ordentlich dokumentiert.&lt;/p&gt;
&lt;p&gt;Wer also eine Möglichkeit sucht, iocage-Jails auf FreeBSD einfach zu maintainen
und eine schicke Templating-Lösung á la ezjail mit moderner Grundlage zu haben,
sollte sich das Ganze mal anschauen.&lt;/p&gt;
&lt;p&gt;Pull requests, bug reports und feature requests sind gerne wilkommen :)&lt;/p&gt;</description></item><item><title>Meine Infrastruktur 2020</title><link>https://christianbaer.me/post/2020/05/meine-infrastruktur-2020/</link><pubDate>Sun, 03 May 2020 11:29:46 +0200</pubDate><guid>https://christianbaer.me/post/2020/05/meine-infrastruktur-2020/</guid><description>&lt;p&gt;Ich hatte schon länger vor, mal etwas über meine Infrastruktur zu schreiben.
Jetzt nutze ich die Zeit einfach mal.&lt;/p&gt;
&lt;p&gt;Prinzipiell versuche ich, so viel es geht selbst zu betreiben, um nicht auf
externe Dienste angewiesen zu sein, die mit meinen Daten Geld verdienen wollen.
Zu diesem Zwecke betreibe ich aktuell vier Server an vier Standorten.&lt;/p&gt;
&lt;p&gt;Ich betreibe die Dienste für mich, für Freunde, die Familie und befreundete
Organisationen.&lt;/p&gt;
&lt;p&gt;Die Server benenne ich nach den Companions von Doctor Who. Ich mag Doctor Who.
Und viele der Comapnions. Und die Liste an Möglichen Namen ist auch sehr lang.
Lasst uns also starten.&lt;/p&gt;
&lt;h2 id="meine-hosts"&gt;Meine Hosts&lt;/h2&gt;
&lt;p&gt;Aktuell betreibe ich &lt;em&gt;donna&lt;/em&gt;, &lt;em&gt;rory&lt;/em&gt;, &lt;em&gt;rose&lt;/em&gt; und &lt;em&gt;amy&lt;/em&gt; (und &lt;em&gt;river&lt;/em&gt; als Gateway zu Hause).
Auf allen Servern läuft FreeBSD auf einer ZFS-Konfiguration. Die Jails betreibe
ich mit iocage und manage sie mit meine Script jailer.sh. Die Webserver laufen
auf nginx und ich manage sie mit meinem Sccript ngineerx. Zum Monitoring setze
ich auf allen Servern monit ein, was auch dafür sorgt, dass Dienste neu
gestartet werden, falls sie mal Probleme machen sollten.&lt;/p&gt;
&lt;h3 id="donna"&gt;donna&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;donna&lt;/em&gt; steht bei uns im Keller. Er beinhaltet drei Unterschiedliche zpools. Zwei
gemirrorte SSDs für das Betriebssystem und Daten, die flüchtig sein können
(Caches etc), zwei gemirrorte SSDs für die Jails und Datenbanken etc, wo es auf
Geschwingkeit ankommt und 6 ordinäre Festplatten in einem RAIDZ2, auf dem die
großen Datenmengen Liegen, bei denen es nicht auf eine Sekunde ankommt.&lt;/p&gt;
&lt;p&gt;Auf donna laufen aktuell 10 Jails:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;gitea&lt;/strong&gt;: Das ist der &lt;a href="https://gitea.io"&gt;Gitea&lt;/a&gt;-Server, der meine
Git-Repositories unter
&lt;a href="https://git.debilux.org/chbaer"&gt;https://git.debilux.org/chbaer&lt;/a&gt; hostet&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;redis&lt;/strong&gt;: Die &lt;a href="https://redis.io/"&gt;redis&lt;/a&gt;-Datenbank als Cache für Gitea und
Nextcloud&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;samba&lt;/strong&gt;: Der &lt;a href="https://www.samba.org/"&gt;Samba&lt;/a&gt;-Server, der im lokalen Netz die
Daten zur Verfüfung stellt und als Backup-Target für TimeMachine dient.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;sql&lt;/strong&gt;: Die &lt;a href="https://mariadb.org/"&gt;MariaDB&lt;/a&gt;-Datenbank, die von Nextcloud
benutzt wird.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;unbound&lt;/strong&gt;: &lt;a href="https://nlnetlabs.nl/projects/unbound/about/"&gt;unbound&lt;/a&gt; als lokaler
DNS-Server und Resolver für das heimische Netz.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;plex&lt;/strong&gt;: Der &lt;a href="https://plex.tv"&gt;Plex&lt;/a&gt;-Server streamt Medien an Familie und
Freunde.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;rmbackup&lt;/strong&gt;: Diese Jail zieht regelmäßig Backups von allen Servern mithilfe von
&lt;a href="https://github.com/chrisb86/rmbackup"&gt;rmbackup&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;sbbackup&lt;/strong&gt;: &lt;a href="https://git.debilux.org/chbaer/sbbackup"&gt;sbbackup&lt;/a&gt; ist ein
kleines Script, dass die Home-Directories auf donna regelmäßig offsite in eine
Hetzner Storage-Box sichert.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;tautulli&lt;/strong&gt;: &lt;a href="https://tautulli.com/"&gt;Tautulli&lt;/a&gt; ist ein Monitoring-Tool für den
PLEX-Server.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;www&lt;/strong&gt;: &lt;a href="https://www.nginx.com/"&gt;nginx&lt;/a&gt; dient als reverse Proxy für Gitea,
hostet die Nextcloud und stellt mir Zugriff auf Administrationsoberflächen zur
Verfügung.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rose"&gt;rose&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;rose&lt;/em&gt; ist ein ein Cloud-Server von Hetzner, der in Falkenstein betrieben wird.&lt;/p&gt;
&lt;p&gt;Aktuell laufen auf rose 10 Jails:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ftp&lt;/strong&gt;: Hier läuft ein &lt;a href="https://www.pureftpd.org/project/pure-ftpd/"&gt;PureFTPd&lt;/a&gt;
als FTP-Server meine Webprojekte.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;memcache&lt;/strong&gt;: &lt;a href="https://memcached.org/"&gt;memached&lt;/a&gt; dient als Cache für Roundcube.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;nsd&lt;/strong&gt;: Hier läuft ein &lt;a href="https://www.nlnetlabs.nl/projects/nsd/"&gt;nsd&lt;/a&gt; als
Master-Nameserver unter ns1.dblx.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;solr&lt;/strong&gt;: &lt;a href="https://lucene.apache.org/solr/"&gt;Solr&lt;/a&gt; dient als Datenbank für die
serverseitige Suche für den Dovocot-IMAP-Server&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;unifi&lt;/strong&gt;: Der &lt;a href="https://www.ui.com/software/"&gt;Controller&lt;/a&gt; für meine
Unifi-Netzwerke.
&lt;strong&gt;mail&lt;/strong&gt;: Hier läuft &lt;a href="https://opensmtpd.org/"&gt;opensmtpd&lt;/a&gt; als SMTP-Server und mx
unter mx1.dblx.io, Dovecot als IMAP-Server mit sieve zur Filterung sowie rspamd
als Spamfilter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ns&lt;/strong&gt;: Wie zu Hause auch, ein unbound-Server als DNS resolver für die Jails.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;redis&lt;/strong&gt;: Als Cache für rspamd und wallabag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;sql&lt;/strong&gt;: MariaDB für die Webprojekte, sowie roundcube, FTP-Server, ttrss und
wallabag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;www&lt;/strong&gt;: nginx als reverse Proxy für den UniFi-Controller, sowie als Host für
ttrss, wallabag, &lt;a href="https://ip.dblx.io"&gt;https://ip.dblx.io&lt;/a&gt;, &lt;a href="https://christianbaer.me"&gt;https://christianbaer.me&lt;/a&gt;, Autoconfig für
den Mail-Server und Seiten befreundeter Organisationen.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rory"&gt;rory&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;rory&lt;/em&gt; ist ein ein Cloud-Server von Hetzner, der in Nürnberg betrieben wird.&lt;/p&gt;
&lt;p&gt;Hier laufen nur zwei Jails:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;nsd&lt;/strong&gt;: nsd als secondary Nameserver unter ns2.dblx.io&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;smtpd&lt;/strong&gt;: opensmtpd als Backup-MX unter mx2.dblx.io&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="amy"&gt;amy&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;amy&lt;/em&gt; ist ein ein Cloud-Server von Hetzner, der in Helsinki betrieben wird.&lt;/p&gt;
&lt;p&gt;Hier laufen nur zwei Jails:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;nsd&lt;/strong&gt;: nsd als dritter Nameserver unter ns3.dblx.io&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;smtpd&lt;/strong&gt;: opensmtpd als Backup-MX unter mx3.dblx.io&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="river-und-heimnetzwerk"&gt;river und Heimnetzwerk&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;river&lt;/em&gt; ist ein UniFi USG 4 Pro und Teil des UniFi-Setups, das ich zu Hause
betreibe. Dazu gesellen sich noch 6 Access Points im Haus und im Garten, ein
24-Port PoE-Switch im Keller, ein 5-Port USW Flex Mini auf meinem Schreibtisch
und eine Fritz-Box als SIP-Client für das Festnetztelefon, dass nie benutzt
wird.&lt;/p&gt;
&lt;p&gt;Das Netzwerk ist in verschiedene WLANs und VLANs für Management, LAN, Telefonie,
Gäste und iOT-Geräte aufgeteilt.&lt;/p&gt;
&lt;p&gt;Als ISP setzen wir auf die Telekom, welche uns eine 100 MBit-Leitung bei innogy
angemietet hat. Durch diese Kombination haben wir zu Hause leider kein IPv6
mehr, aber knapp 95 MBit Downstream und 38 MBit Upstream, was mir dann ein
Bisschen wichtiger war.&lt;/p&gt;
&lt;h2 id="erfahrungen"&gt;Erfahrungen&lt;/h2&gt;
&lt;p&gt;Alles in allem bin ich sehr zufrieden. Die Cloud-Hosts bei Hetzner sind
vergleichsweise günstig für die Leistung. Das Setup bietet die notewendige
Redundanz und die wirklich wichtigen Dienste sind auch zu Hause erreichbar, wenn
das Internet mal nicht laufen sollte. Natürlcih könnte man die Cloud-Server noch
auf mehrere Anbieter verteilen, um wirklich sicher zu gehen, aber der Aufwand
rechtfertigt für mich den Nutzen nicht.&lt;/p&gt;
&lt;p&gt;Bei meiner Softwareauswahl gehe ich gerne auf Nummer sicher und nehme gut
abgehangene Software, die ein gewisses Security-Standing hat und habe wenig Lust
auf Experimente, da der Kram ja in erster Linie laufen soll und ich meine
Produktivsysteme vermissen würde, wenn sie nicht mehr da sind.&lt;/p&gt;</description></item><item><title>Von GitHub zu Gitea</title><link>https://christianbaer.me/post/2020/05/von-github-zu-gitea/</link><pubDate>Sat, 02 May 2020 23:35:23 +0200</pubDate><guid>https://christianbaer.me/post/2020/05/von-github-zu-gitea/</guid><description>&lt;p&gt;Ich versuche, wo immer es nur geht, nicht auf externe Dienste angewiesen zu
sein.&lt;/p&gt;
&lt;p&gt;Einen Schritt, den ich schon seit längerer Zeit gehen wollte, ist meine Projekte
von &lt;a href="https://github.com/chrisb86"&gt;GitHub&lt;/a&gt; wegzubekommen, beziehungsweise einen eigenen Git-Server zu betreiben
und GitHub nur noch als Mirror zu nutzen.&lt;/p&gt;
&lt;p&gt;Vor ein paar Wochen bin ich dann auf &lt;a href="https://gitea.io/"&gt;Gitea&lt;/a&gt; gestoßen. Gitea ist ein
offensichtlicher Clone von GitHub, in Go geschrieben und lässt sich
dementsprechend als einfaches Binary ziemlich easy installieren.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://christianbaer.me/post/2020/05/von-github-zu-gitea/gitea.png" &gt;&lt;img src="https://christianbaer.me/post/2020/05/von-github-zu-gitea/gitea_hu_7547458da6e76bdf.png" width="700" height="396" /&gt;&lt;/a&gt;
&lt;figcaption&gt;
&lt;small&gt;
Screenshot von Gitea
&lt;/small&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Ich habe es jetzt auf meinem Heimserver in eine Jail verfrachtet und einen nginx
als Reverse-Proxy davor geschaltet.&lt;/p&gt;
&lt;p&gt;Die Inbetriebnahme war schmerzfrei und es tut, was es soll. In den kommenden
Wochen werde ich jetzt Stück für Stück meine Repos auf &lt;a href="https://git.debilux.org/chbaer"&gt;git.debilux.org/chbaer&lt;/a&gt; umziehen.&lt;/p&gt;</description></item><item><title>FreeBSD-Server mit Jails: Host-System vorbereiten</title><link>https://christianbaer.me/post/2019/04/freebsd-server-mit-jails-host-system-vorbereiten/</link><pubDate>Mon, 15 Apr 2019 23:59:27 +0200</pubDate><guid>https://christianbaer.me/post/2019/04/freebsd-server-mit-jails-host-system-vorbereiten/</guid><description>&lt;p&gt;Da bei mir mal wieder das Neuaufsetzen eines Servers ansteht, dachte ich, ich dokumentiere das ganze mal. Als Betriebssystem kommt &lt;a href="https://freebsd.org"&gt;FreeBSD&lt;/a&gt; zum Einsatz. Das Basissystem soll möglichst schlank gehalten werden. Die einzelnen Dienste werden jeweils in eigenen Jails separiert. Beim Management der Jails kommt &lt;a href="https://iocage.io/"&gt;iocage&lt;/a&gt; zum Einsatz.&lt;/p&gt;
&lt;p&gt;Zuerst installieren wir die aktuellste FreeBSD-Version. Bei mir ist das aktuell Version &lt;em&gt;12.0-RELEASE&lt;/em&gt;. Für die Installation habe ich das Memstick-Image benutzt. Der installer ist relativ selbst erklärend. Wichtig ist nur, dass wir für die Installation die Option &lt;em&gt;ZFS&lt;/em&gt; im Partionierungsmenü nutzen.&lt;/p&gt;
&lt;h3 id="system-updaten"&gt;System updaten&lt;/h3&gt;
&lt;p&gt;Nach der Installation booten wir in unser jungfräuliches System und updaten erst ein mal die Installation und die Ports auf das aktuellste Patchlevel.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;freebsd-update fetch install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;portsnap auto
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Anschließend nehmen wir noch ein paar kleine Anpassungen vor.&lt;/p&gt;
&lt;h4 id="zeitsynchronisation-aktivieren"&gt;Zeitsynchronisation aktivieren&lt;/h4&gt;
&lt;p&gt;Der Server synchronisiert beim Booten die Zeit mit deutschen Zeitservern.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysrc &lt;span class="nv"&gt;ntpdate_enable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysrc &lt;span class="nv"&gt;ntpdate_hosts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;de.pool.ntp.org&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="bootdelay-reduzieren"&gt;Bootdelay reduzieren&lt;/h4&gt;
&lt;p&gt;Die Wartezeit beim Booten wird auf drei Sekunden reduziert.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;autoboot_delay=3&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /boot/loader.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="system-bleibt-bei-shutwdown-hängen-wenn-root-auf-einem-usb-device-liegt"&gt;System bleibt bei Shutwdown hängen, wenn root auf einem USB-Device liegt&lt;/h4&gt;
&lt;p&gt;Falls FreeBSD auf einem USB-Device installiert wurde, kann es sein, dass das System nach dem Shutdown hängen bleibt. Ein Reboot ist nur per Hardware-Taste möglich. Folgender Befehl fixt das.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hw.usb.no_shutdown_wait=1&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl hw.usb.no_shutdown_wait&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Anschließend starten wir das System noch mal neu.&lt;/p&gt;
&lt;h3 id="user-hinzufügen"&gt;User hinzufügen&lt;/h3&gt;
&lt;p&gt;Per default ist das Login mit &lt;em&gt;root&lt;/em&gt; über &lt;em&gt;SSH&lt;/em&gt; deaktiviert. Das ist auch sinnvoll. Wir werden uns also einen User zum Arbeiten erstellen und diesen in die Lage versetzen, root-Rechte zu erlangen.&lt;/p&gt;
&lt;p&gt;Über &lt;em&gt;adduser&lt;/em&gt; legen wir uns als erstes einen User an, mit welchem wir uns per SSH einloggen können.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;adduser
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wir beantworten einfach die Fragen. Die angebotenen Standard-Optionen passen soweit. Hier muss nichts geändert werden. Wenn die Frage &lt;strong&gt;&amp;ldquo;Invite $USER into other groups?&amp;rdquo;&lt;/strong&gt; kommt, geben wir zusätzlich noch die Gruppe &lt;em&gt;wheel&lt;/em&gt; an. So gehört unser User zu den Administratoren. In einem weiteren Schritt werden wir &lt;em&gt;doas&lt;/em&gt; installieren, damit wir dann auch root-Rechte erlangen können.&lt;/p&gt;
&lt;h4 id="doas-installieren"&gt;doas installieren&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pkg install doas
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;permit keepenv :wheel&amp;#34;&lt;/span&gt; &amp;gt; /usr/local/etc/doas.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Die Zeile &lt;strong&gt;permit keepenv :wheel&lt;/strong&gt; sagt &lt;em&gt;doas&lt;/em&gt;, dass alle Benutzer, welche der Gruppe &lt;em&gt;wheel&lt;/em&gt; angehören, durch Eingabe ihres Passworts root werden können.&lt;/p&gt;
&lt;p&gt;Jetzt sind wir in der Lage, uns per SSH mit dem Server zu verbinden und dann auch Dinge wie Copy und Paste zu nutzen, um die Configs zu erstellen.&lt;/p&gt;
&lt;p&gt;Mit einem behrtzten &lt;strong&gt;doas -s&lt;/strong&gt; gelangen wir nach Eingabe unseres Passworts in eine root-Shell.&lt;/p&gt;
&lt;h3 id="build-system-einrichten"&gt;Build-System einrichten&lt;/h3&gt;
&lt;p&gt;Ich bin ein großer Fan davon, die Programme nicht als Binärpakete zu installieren, sondern selbst aus den Ports zu bauen. So kann ich unnötige Funktionen deaktivieren und das Host-System schön schlank halten, da ich versuche, überflüssige Abhängigkeiten weitestgehend zu vermeiden.&lt;/p&gt;
&lt;p&gt;Als erstes legen wir &lt;em&gt;/etc/make.conf&lt;/em&gt; und &lt;em&gt;/etc/src.conf&lt;/em&gt; an. In diesen Files habe ich ein paar Defaults konfiguriert, um z.B. immer die aktuelle OpenSSL-Version aus den Ports zu nehmen, X11-Funktionen zu deaktivieren, da wir ja auf einem Server sind usw.. &lt;em&gt;/etc/src.conf&lt;/em&gt; kommt zum Einsatz, falls wir uns einen angepassten Kernel bauen wollen. Da &lt;em&gt;VIMAGE&lt;/em&gt; mittlerweile im Standard-Kernel ist, besteht nicht mehr zwingend die Notwendigkeit dazu.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;### /etc/make.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## Nearby mirror&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MASTER_SITE_OVERRIDE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ftp://ftp.de.freebsd.org/pub/FreeBSD/ports/distfiles/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## Build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MAKE_JOBS_NUMBER?&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## Optimizations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CPUTYPE?&lt;span class="o"&gt;=&lt;/span&gt;native
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;OPTIONS_SET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;OPTIMIZED_CFLAGS CPUFLAGS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## Headless server options&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_MODULES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sound ntfs linux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.if &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;.CURDIR:&lt;/span&gt;&lt;span class="nv"&gt;M&lt;/span&gt;&lt;span class="p"&gt;/usr/ports/*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;OPTIONS_SET&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;CRYPTO GSSAPI_NONE IPV6 OPENSSL THREADS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;OPTIONS_UNSET&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;DEBUG DTRACE GSSAPI_BASE GSSAPI_HEIMDAL GSSAPI_MIT READLINE TEST TESTS X11 CUPS DOCS FONTCONFIG NLS X11 EXAMPLES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DEFAULT_VERSIONS&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="nv"&gt;ssl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;openssl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.endif
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## Disable sendmail!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NO_SENDMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#ccache&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITH_CCACHE_BUILD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CCACHE_UMASK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;022&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CCACHE_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/cache/ccache
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CCACHE_MAXSIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5G
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;### /etc/src.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITH_CCACHE_BUILD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_AMD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_APM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_ATF&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_ATM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_AUTHPF&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_AUTOFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_BHYVE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_BLUETOOTH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_BOOTPARAMD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_BOOTPD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_BSNMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_CALENDAR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITH_CCACHE_BUILD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_CCD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITH_CLANG_EXTRAS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_CTM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_CUSE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_DEBUG_FILES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_DMAGENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_FINGER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_FLOPPY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_GAMES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_GPIB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_GPIO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITH_GSSAPI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_HTML&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_HYPERV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_I4B&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_INETD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_INFO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_IPX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_KERBEROS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_KVM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_LIB32&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_LPR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_NCP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_NDIS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_NIS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_PC_SYSINSTALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_PMC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_PPP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#WITHOUT_PROFILE=YES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_RADIUS_SUPPORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_RBOOTD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_RCMDS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_RCS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_SENDMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_SHAREDOCS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_SYSINSTALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_TALK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_TCP_WRAPPERS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_TESTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_TFTP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_TIMED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WITHOUT_WIRELESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="ccache-als-compiler-cache"&gt;ccache als Compiler-Cache&lt;/h4&gt;
&lt;p&gt;Viele Pakete, die wir bauen, werden in mehreren Jails und auf dem Host-System benötigt. Es bietet sich also an, die Kompilate zu cachen, um beim erneuten Bauen Zeit zu sparen. Hier kommt &lt;em&gt;ccache&lt;/em&gt; zum Einsatz.&lt;/p&gt;
&lt;p&gt;Die grundlegende Konfiguration haben wir bereits in &lt;em&gt;/etc/make.conf&lt;/em&gt; und &lt;em&gt;/etc/src.conf&lt;/em&gt; getätigt. Unter anderem ist &lt;em&gt;/var/cache/ccache&lt;/em&gt; als Ort des Caches festgelegt.&lt;/p&gt;
&lt;p&gt;Wir erstellen uns also hierfür erst mal ein ZFS-Dataset&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zfs create zroot/var/cache
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zfs create zroot/var/cache/ccache
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Anschließend installieren wir &lt;em&gt;ccache&lt;/em&gt; und &lt;em&gt;portmaster&lt;/em&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pkg install ccache portmaster
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;portmaster&lt;/em&gt; macht es uns sehr viel einfacher, mit den Ports zu hantieren. Statt &lt;strong&gt;cd /usr/ports/sysutils/ccache &amp;amp;&amp;amp; make install clean&lt;/strong&gt; reicht jetzt ein &lt;strong&gt;portmaster sysutils/ccache&lt;/strong&gt;, um &lt;em&gt;ccache&lt;/em&gt; zu installieren. Ein &lt;strong&gt;portmaster -Bad&lt;/strong&gt; aktualisiert z.B alle installierten Ports und erstellt hierbei keine Backup-Packages. die Manpages zu &lt;em&gt;portmaster&lt;/em&gt; nennen noch viele weitere Optionen. Durch &lt;em&gt;ccache&lt;/em&gt; wird jeder Compile-Vorgang, der schon mal ausgeführt wurde, beim nächsten mal wesentlich schneller vonstatten gehen.&lt;/p&gt;
&lt;h3 id="weitere-nützliche-programme-installieren"&gt;Weitere nützliche Programme installieren&lt;/h3&gt;
&lt;p&gt;Wenn das alles geschafft ist, installiere ich immer noch ein paar weitere Programme, um mir die Arbeitsumgebung an meine Bedürfnisse anzupassen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;portmaster -Bd editors/vim-console net/mosh shells/zsh sysutils/tmux devel/git-lite net/rsync
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Zu guter letzt setze ich mir dann noch &lt;em&gt;ZSH&lt;/em&gt; als Shell, installiere meine &lt;a href="https://github.com/chrisb86/dotfiles.git"&gt;dotfiles&lt;/a&gt; und alles ist so, wie ich es auf meinen Servern gerne habe.&lt;/p&gt;
&lt;h3 id="weitere-sinnvolle-anpassungen"&gt;Weitere sinnvolle Anpassungen&lt;/h3&gt;
&lt;h4 id="ssmtp"&gt;ssmtp&lt;/h4&gt;
&lt;p&gt;Ich finde es immer ganz praktisch, wenn mein Server mir Mails schicken kann, wenn irgend etwas nicht funktioniert. Hierfür nutze ich seit einiger Zeit &lt;em&gt;ssmtp&lt;/em&gt;, ein Programm, welches Mails an einen externen Mailserver weiterreicht und von dort aus versendet.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;portmaster -Bd mail/ssmtp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Konfiguriert wird &lt;em&gt;ssmtp&lt;/em&gt; in &lt;em&gt;/usr/local/etc/ssmtp/ssmtp.conf&lt;/em&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;### /usr/local/etc/ssmtp/ssmtp.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin@example.org
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;mailhub&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mail.example.org:587
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;rewriteDomain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;hostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;_HOSTNAME_
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;FromLineOverride&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;UseTLS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;UseSTARTTLS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YES
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;AuthUser&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ssmtp@example.org
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;AuthPass&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;SuperSecret-Passw0rd!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;AuthMethod&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;LOGIN
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Abschließend setzen wir &lt;em&gt;ssmtp&lt;/em&gt; in der &lt;em&gt;/etc/mail/mailer.conf&lt;/em&gt; als Standard und wir sind fertig.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;### /etc/mail/mailer.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sendmail /usr/local/sbin/ssmtp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;send-mail /usr/local/sbin/ssmtp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mailq /usr/local/sbin/ssmtp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;newaliases /usr/local/sbin/ssmtp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hoststat /usr/bin/true
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;purgestat /usr/bin/true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="festplatten-mit-smartd-überwachen"&gt;Festplatten mit smartd überwachen&lt;/h4&gt;
&lt;p&gt;Zum Auslesend des SMART-Status meiner Festplatten nutze ich &lt;em&gt;smartd&lt;/em&gt; aus den &lt;em&gt;smartmontools&lt;/em&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;portmaster -Bd sysutils/smartmontools
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;DEVICESCAN -a -o on -S on -n standby,q -s (S/../.././02|L/../../6/03) -W 4,55,65 -m admin@example.org -M test&amp;#34;&lt;/span&gt; &amp;gt; /usr/local/etc/smartd.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysrc &lt;span class="nv"&gt;smartd_enable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;YES&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;smartd&lt;/em&gt; prüft beim Starten jetzt alle Platten, die er finden kann und sendet eine Testmail an die definierte Adresse. Nebenbei erfährt man so nach einem Reboot auch, wann die Kiste wieder oben ist.&lt;/p&gt;
&lt;p&gt;Jetzt ist der Server soweit erst ein mal eingerichtet. Diese Basiskonfiguration nutze ich für alle Systeme. Egal, ob er später ein Webserver, ein NAS, ein E-Mail-Server oder sonstwas werden soll. Die Absicherung mittels der Firewall &lt;em&gt;pf&lt;/em&gt; und die Einrichtung von &lt;em&gt;iocage&lt;/em&gt; werde ich in späteren Beiträgen erläutern.&lt;/p&gt;</description></item><item><title>A warm welcome to DNS</title><link>https://christianbaer.me/post/2019/04/a-warm-welcome-to-dns/</link><pubDate>Sat, 13 Apr 2019 23:29:59 +0200</pubDate><guid>https://christianbaer.me/post/2019/04/a-warm-welcome-to-dns/</guid><description>&lt;p&gt;Wer eine gute Einführung zum Thema DNS sucht, sollte sich mal &lt;a href="https://powerdns.org/hello-dns/"&gt;A warm welcome to DNS&lt;/a&gt; anschauen.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This series of documents attempts to provide a correct introduction to the Domain Name System as of 2018. The original RFCs remain the authoritative source of normative text, but this document tries to make this venerable protocol more accessible, while maintaining full alignment with all relevant and useful RFCs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Das ganze Ding ist eine Gemeinschaftsarbeit und wird in einem &lt;a href="https://github.com/ahupowerdns/hello-dns/"&gt;GitHub-Repo&lt;/a&gt; maintained.&lt;/p&gt;</description></item><item><title>Shell Mistakes</title><link>https://christianbaer.me/post/2019/04/shell-mistakes/</link><pubDate>Sat, 13 Apr 2019 23:15:10 +0200</pubDate><guid>https://christianbaer.me/post/2019/04/shell-mistakes/</guid><description>&lt;p&gt;&lt;a href="https://www.greenend.org.uk/rjk/"&gt;Richard Kettlewell&lt;/a&gt; zeigt in seinem Beitrag &lt;a href="https://www.greenend.org.uk/rjk/tech/shellmistakes.html"&gt;Shell Mistakes&lt;/a&gt; einige sehr häufige Fehler auf, die Menschen in Shell-Scripts machen.&lt;/p&gt;
&lt;p&gt;Der Artikel ist zwar von 2001, der Inhalt aber nach wie vor aktuell.&lt;/p&gt;</description></item><item><title>macOS: In unbekannten WLANs automatisch mit VPN verbinden</title><link>https://christianbaer.me/post/2019/04/macos-in-unbekannten-wlans-automatisch-mit-vpn-verbinden/</link><pubDate>Sat, 13 Apr 2019 22:27:45 +0200</pubDate><guid>https://christianbaer.me/post/2019/04/macos-in-unbekannten-wlans-automatisch-mit-vpn-verbinden/</guid><description>&lt;p&gt;In meinem &lt;a href="https://christianbaer.me/post/2018/03/ios-in-unbekannten-wlans-automatisch-mit-vpn-verbinden/"&gt;Beitrag zu iOS&lt;/a&gt; habe ich beschrieben, wie ich mein iPhone dazu bringe, sich in unbekannten WLANs automatisch mit meinem L2TP-VPN zu Hause zu verbinden, um unterwegs nie ungeschützt zu sein.&lt;/p&gt;
&lt;p&gt;Für mein MacBook wollte ich schon länger eine ähnliche Funktion haben und habe viele Versuche unternommen, mir das irgendwie zurecht zu scripten. &lt;a href="https://itunes.apple.com/us/app/vpn-monitor/id887410814?mt=12"&gt;VPN Monitor&lt;/a&gt;, eine App, welche ich vor einigen Jahren mal gekauft habe, hat diese Funktion irgendwann in der Zwischenzeit erhalten.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;VPN Monitor is a status bar application to monitor and automatically reconnect a dropped VPN connection. When additional VPN services are configured, VPN Monitor will use these services as a fallback option in case the VPN server is down.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Die App lebt in der Statusbar und sorgt dafür, dass immer eine VPN-Verbindung aufgebaut wird, wenn sie läuft. Bisher musste ich unterwegs daran denken, sie zu starten. Jetzt kann man sichere WLANs definieren. In Netzwerken, welche in dieser Whitelist aufgeführt werden, wird kein VPN-Tunnel aufgebaut. Ich habe sie jetzt also im Autostart, mein eigenes WLAN als Ausnahme hinzugefügt und bin zu Hause ohne VPN und in fremden Netzen eben mit Verbunden.&lt;/p&gt;
&lt;p&gt;Man sollte beachten, dass die App keine Verbindungen blockt. Wenn man also, warum auch immer, nicht mit dem VPN verbunden ist, geht sämtlicher Traffic ungetunnelt über das jeweilige Netz. Hierfür habe ich mir eine umfangreiche Little Snitch-Config gebaut. Diese erläutere ich irgendwann mal in einem eigenen Beitrag.&lt;/p&gt;
&lt;p&gt;Bisher tut VPN Monitor, was es soll, und ist auf jeden Fall eine Empfehlung wert. Für OpenVPN-Tunnel ist &lt;a href="https://tunnelblick.net/"&gt;Tunnelblick&lt;/a&gt; eine sehr gute Alternative.&lt;/p&gt;</description></item><item><title>exiftool: Bilder in Unterordner sortieren, auch ohne EXIF-Tag</title><link>https://christianbaer.me/post/2019/03/exiftool-bilder-in-unterordner-sortieren-auch-ohne-exif-tag/</link><pubDate>Mon, 18 Mar 2019 00:00:36 +0100</pubDate><guid>https://christianbaer.me/post/2019/03/exiftool-bilder-in-unterordner-sortieren-auch-ohne-exif-tag/</guid><description>&lt;p&gt;Wenn man Bilder mit &lt;a href="https://owl.phy.queensu.ca/~phil/exiftool/"&gt;exiftool&lt;/a&gt; automatisch in Ordner sortieren möchte, aber nicht alle Bilder ordentlich eingebettete Tags haben, kann man auch weitere Daten zur Ermittlung des Erstellungsdatums zu Rate ziehen.&lt;/p&gt;
&lt;p&gt;Folgendes Kommando schaut zuerst nach einem Aufnahmedatum im EXIF-Tag und wählt das Dateierstellungsdatum, falls keines gefunden wird.&lt;/p&gt;
&lt;p&gt;Anschließend wird die Datei in Unterordner nach Jahr und Monat abgelegt.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;exiftool&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-directory&amp;lt;datetimeoriginal&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-directory&amp;lt;createdate&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;%Y/%m&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ich poste das hier mal, damit ich es selbst nicht vergesse.&lt;/p&gt;</description></item><item><title>Bye Bye Wordpress</title><link>https://christianbaer.me/post/2019/03/bye-bye-wordpress/</link><pubDate>Sat, 02 Mar 2019 19:43:54 +0100</pubDate><guid>https://christianbaer.me/post/2019/03/bye-bye-wordpress/</guid><description>&lt;p&gt;Nach 14 Jahren bloggen mit Wordpress läuft diese Seite ab heute mit &lt;a href="https://gohugo.io"&gt;Hugo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hugo ist ein Static Site Generator, welcher den Content der Seite in einem Verzeichnis auf der lokalen Festplatte verwaltet und daraus statische HTML-Seiten erstellt, welche jetzt auf dem Server liegen.&lt;/p&gt;
&lt;p&gt;Das Blog braucht dementsprechend jetzt kein PHP und keine Datenbank mehr und öffnet von daher auch keine potentiellen Sicherheitslücken für Angreifer_innen.&lt;/p&gt;
&lt;p&gt;Ich habe mich in den letzten Wochen in die Hugothematik eingelesen, dieses Theme hier erstellt und meine Daten von Wordpress importiert.&lt;/p&gt;
&lt;p&gt;Der ganze Prozess hat mir viel Spaß gemacht und es scheint bisher alles zu laufen.&lt;/p&gt;
&lt;p&gt;Falls Du das Blog per RSS-Feed liest, biege dein Abonnement auf den &lt;a href="https://christianbaer.me/index.xml"&gt;neuen Feed&lt;/a&gt; um.&lt;/p&gt;</description></item><item><title>iOS: In unbekannten WLANs automatisch mit VPN verbinden</title><link>https://christianbaer.me/post/2018/03/ios-in-unbekannten-wlans-automatisch-mit-vpn-verbinden/</link><pubDate>Sat, 24 Mar 2018 12:21:59 +0000</pubDate><guid>https://christianbaer.me/post/2018/03/ios-in-unbekannten-wlans-automatisch-mit-vpn-verbinden/</guid><description>&lt;p&gt;Mit VPN-Verbindungens ist es, wie mit Backups. Meistens benötigt man sie, wenn man vorher nicht daran gedacht hat, sie zu erstellen.&lt;/p&gt;
&lt;p&gt;Ich bin viel unterwegs und häufig in fremden oder offenen WLANs eingeloggt. Prinzipiell bin ich in solchen Situationen, wenn möglich, am Liebsten mit meinem heimischen VPN verbunden.&lt;/p&gt;
&lt;p&gt;Lange Zeit nutzte ich ich nur aus einem einzigen Grund OpenVPN: Die iOS-App bietet eine Möglichkeit, das VPN anzuknipsen und iOS stellt die Verbindung immer wieder her, wenn sie abgebrochen wurde. Dies ist wenig elegant und OpenVPN relativ komplex. Ich hatte also keine Lust mehr darauf und musste bisher ja auch immer daran denken, das VPN auf dem iPhone explizit anzuschalten. Ich war also entweder nicht in WLANs oder dann selten in meinem VPN.&lt;/p&gt;
&lt;p&gt;Nach der Umstellung auf meinen &lt;a href="https://christianbaer.me/891-telekom-vdsl-und-entertain-mit-draytek-vigor130-und-ubiquiti-edgerouter-x/"&gt;EdgeRouter und dem Switch auf L2TP&lt;/a&gt; als VPN-Standard las ich davon, dass man mit iOS-Profilen die Möglichkeit hat, WLANs zu whitelisten und bei allen anderen WLANs automatisch eine VPN-Verbindung aufzubauen. Nach einer Suche auf GitHub bin ich auf ein höchst praktisches Projekt von &lt;a href="http://www.linquist.com/"&gt;Kris Linquist&lt;/a&gt; gestoßen. &lt;a href="https://github.com/klinquist/iOS-VPN-Autoconnect"&gt;iOS-VPN-Autoconnect&lt;/a&gt; bietet eine schlanke HTML-Seite, die ein paar Daten abfragt und lokal per JavaScript eine entsprechende Profildatei erstellt. Diese habe ich per AirDrop auf mein Telefon geabeamed und bin nun immer im VPN, wenn ich in einem anderen, als meinem heimischen WLAN eingeloggt bin. Das ist sehr simpel und funktioniert bisher zuverlässig.&lt;/p&gt;
&lt;p&gt;Wenn es nicht funktionierte, lag es bisher an schlechten WLANs oder mangelnder Internetkonnektivität. In diesen fällen war aber immer das WLAN auch ohne VPN nicht wirklich nutzbar und ich bin auf LTE ausgewichen.&lt;/p&gt;</description></item><item><title>Telekom VDSL und Entertain mit DrayTek Vigor130 und Ubiquiti Edgerouter X</title><link>https://christianbaer.me/post/2018/03/telekom-vdsl-und-entertain-mit-draytek-vigor130-und-ubiquiti-edgerouter-x/</link><pubDate>Fri, 23 Mar 2018 20:32:12 +0000</pubDate><guid>https://christianbaer.me/post/2018/03/telekom-vdsl-und-entertain-mit-draytek-vigor130-und-ubiquiti-edgerouter-x/</guid><description>&lt;p&gt;In letzter Zeit ging mir die Fritz!Box immer mehr auf die Nerven.&lt;/p&gt;
&lt;p&gt;Nachdem mir Anfang des Jahres nach vielen Jahren meine 7390 verstorben ist, habe ich mir eine 7490 gekauft. Schmerzlich musste ich feststellen, dass AVM immer mehr funktionen streicht, die ich in meinem Setup aber dringend benötige.&lt;/p&gt;
&lt;p&gt;Ich betreibe z.B. Jails auf einem FreeBSD-Server. Gegenüber dem Router haben alle Jails unterschiedliche IP-Adressen, aber die selbe MAC, da sie ja die selbe Netzwerkkarte benutzen. In aktuellen Fritz!OS-Versionen ist es nicht mehr möglich, für die Jails konsistente Portweiterleitungen einzurichten, da diese immer an die MAC-Adresse gekoppelt sind und die IP in der Firewall ständig geändert wird.&lt;/p&gt;
&lt;p&gt;Ich habe mir dann kurzfristig noch eine EdgeRouter X (ERX) von Ubiquiti dazu geordert. Die Fritz!Box hat dann die Internetverbindung aufgebaut und sämtlichen Traffic einfach an den ERX durchgereicht. Inklusive doppeltem NAT und allen anderen Nachteilen, die diese Lösung mit sich bringt. Ich habe also den Entschluss gefasst, die Fritz!Box abzuschaffen und das ganze Netzwerksetup ein mal vernüftig aufzubauen.&lt;/p&gt;
&lt;p&gt;Nach einiger Recherche setze ich jetzt folgende Hardware ein:
• Mein VDSL-Modem ist ein DrayTek Vigor130
• Das Routing und den Aufbau der PPoE-Verbindung übernimmt der Ubiquiti EdgeRouter X.
• Als WLAN-Accesspoint kommt ein Ubiquiti UniFi AP AC Lite zum Einsatz
• Des Weiteren tun noch zwei Netgear GS108Ev3-Switches ihren Dienst.&lt;/p&gt;
&lt;p&gt;Das Zielsetup zum Ersetzen der Fritz!Box war dann also folgendes.&lt;/p&gt;
&lt;p&gt;Der Vigor130 soll als reines Modem zum Einsatz kommen. Der EdgeRouter soll die Internetverbindung vie Telekom VDSL aufbauen. Er soll sich um die VLANs kümmern, um Entertain nutzen zu können, DHCP anbieten, das IPv6-Subnet, das von der Telekom zugeteilt wird über Prefix-Delegation an die Clients im LAN verteilen, sowie einen L2TP-VPN-Server anbieten. Der Router soll DNS-Forwarding machen und hierfür die Nameserver nutzen, die die Telekom ihm zuweist.&lt;/p&gt;
&lt;p&gt;Nach einegm Rumprobieren habe ich jetzt alles ans Laufen bekommen. Das Modem hängt an eth0 des ERX. Das Modem hat die IP 192.168.1.1.. eth0 des ERX hat die 192.168.1.2.. Das Interne Netz läuft als 192.168.178.0/24 und die restlichen Ethernet-Ports des ERX laufen im Switch-Modus alle auf dem selben Netz.&lt;/p&gt;
&lt;p&gt;Das ich im Netz immer nur Teil-Lösungen gefunden habe, oder welche, die eher exotische Setups bedienen, dachte ich, ich teile meine Config mal mit Euch.
Sie sollte fast Copy-Paste-fähig sein. Die einzigen Dinge, die Du ändern musst, sind deine VDSL-Zugangsdaten und den Preshared Key des VPN.&lt;/p&gt;
&lt;p&gt;Über SSH kannst Du dann noch VPN-User hinzufügen.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;configure
set vpn l2tp remote-access authentication local-users username &amp;lt;USERNAME&amp;gt; password &amp;lt;PASSWORD&amp;gt;
commit; save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Portweiterleitungen usw. lassen sich anschließend sehr gut über das Webinterface unter 192.168.178.1 einrichten.&lt;/p&gt;
&lt;p&gt;Hier nun also die Config:&lt;/p&gt;
&lt;h3 id="configboot"&gt;config.boot&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;firewall {
all-ping enable
broadcast-ping disable
ipv6-name IPv6_WAN_IN {
default-action drop
description &amp;quot;IPv6 packets from the Internet to LAN&amp;quot;
enable-default-log
rule 1 {
action accept
description &amp;quot;Allow established sessions&amp;quot;
state {
established enable
related enable
}
}
rule 2 {
action drop
state {
invalid enable
}
}
rule 5 {
action accept
description &amp;quot;Allow ICMPv6&amp;quot;
log disable
protocol icmpv6
}
}
ipv6-name IPv6_WAN_LOCAL {
default-action drop
description &amp;quot;IPv6 packets from the Internet to the router&amp;quot;
enable-default-log
rule 1 {
action accept
description &amp;quot;Allow established sessions&amp;quot;
log disable
state {
established enable
related enable
}
}
rule 2 {
action drop
log disable
state {
invalid enable
}
}
rule 5 {
action accept
description &amp;quot;Allow ICMPv6&amp;quot;
log disable
protocol icmpv6
}
rule 110 {
action accept
description &amp;quot;Allow DHCPv6 packets&amp;quot;
destination {
port 546
}
protocol udp
source {
port 547
}
}
}
ipv6-name WANv6_IN {
default-action drop
description &amp;quot;WAN inbound traffic forwarded to LAN&amp;quot;
enable-default-log
rule 10 {
action accept
description &amp;quot;Allow established/related sessions&amp;quot;
state {
established enable
related enable
}
}
rule 20 {
action drop
description &amp;quot;Drop invalid state&amp;quot;
state {
invalid enable
}
}
}
ipv6-name WANv6_LOCAL {
default-action drop
description &amp;quot;WAN inbound traffic to the router&amp;quot;
enable-default-log
rule 10 {
action accept
description &amp;quot;Allow established/related sessions&amp;quot;
state {
established enable
related enable
}
}
rule 20 {
action drop
description &amp;quot;Drop invalid state&amp;quot;
state {
invalid enable
}
}
rule 30 {
action accept
description &amp;quot;Allow IPv6 icmp&amp;quot;
protocol ipv6-icmp
}
rule 40 {
action accept
description &amp;quot;allow dhcpv6&amp;quot;
destination {
port 546
}
protocol udp
source {
port 547
}
}
}
ipv6-receive-redirects disable
ipv6-src-route disable
ip-src-route disable
log-martians enable
name WAN_IN {
default-action drop
description &amp;quot;WAN to internal&amp;quot;
enable-default-log
rule 1 {
action accept
description &amp;quot;Allow established/related&amp;quot;
state {
established enable
related enable
}
}
rule 3 {
action drop
description &amp;quot;Drop invalid state&amp;quot;
state {
invalid enable
}
}
}
name WAN_IPTV {
default-action drop
description &amp;quot;Telekom Entertain&amp;quot;
enable-default-log
rule 1 {
action accept
description &amp;quot;Allow IPTV Multicast UDP&amp;quot;
destination {
address 224.0.0.0/4
}
log disable
protocol udp
source {
}
}
rule 2 {
action accept
description &amp;quot;Allow IGMP&amp;quot;
log disable
protocol igmp
}
}
name WAN_LOCAL {
default-action drop
description &amp;quot;WAN to router&amp;quot;
enable-default-log
rule 1 {
action accept
description &amp;quot;Allow Ping&amp;quot;
log disable
protocol icmp
}
rule 2 {
action accept
description &amp;quot;Allow Multicast&amp;quot;
destination {
address 224.0.0.0/4
}
log disable
protocol all
}
rule 7 {
action accept
description &amp;quot;Allow established/related&amp;quot;
state {
established enable
related enable
}
}
rule 8 {
action drop
description &amp;quot;Drop invalid state&amp;quot;
log enable
state {
invalid enable
}
}
rule 30 {
action accept
description IKE
destination {
port 500
}
log disable
protocol udp
}
rule 40 {
action accept
description ESP
log disable
protocol esp
}
rule 50 {
action accept
description NAT-T
destination {
port 4500
}
log disable
protocol udp
}
rule 60 {
action accept
description L2TP
destination {
port 1701
}
ipsec {
match-ipsec
}
log disable
protocol udp
}
}
options {
mss-clamp {
mss 1412
}
}
receive-redirects disable
send-redirects enable
source-validation disable
syn-cookies enable
}
interfaces {
ethernet eth0 {
address 192.168.1.2/24
duplex auto
speed auto
vif 7 {
description &amp;quot;Internet (PPPoE)&amp;quot;
pppoe 0 {
default-route auto
dhcpv6-pd {
pd 0 {
interface eth1 {
no-dns
prefix-id 42
service slaac
}
interface switch0 {
host-address ::dead:beef
prefix-id :1
service slaac
}
prefix-length 56
}
prefix-only
rapid-commit enable
}
firewall {
in {
ipv6-name IPv6_WAN_IN
name WAN_IN
}
local {
ipv6-name IPv6_WAN_LOCAL
name WAN_LOCAL
}
}
ipv6 {
address {
autoconf
}
dup-addr-detect-transmits 1
enable {
}
}
mtu 1492
name-server auto
## Hier PPPoE-Zugangsdaten ändern
password KENNWORT
user-id ANSCHLUSSKENNUNGZUGANGSNUMMER0001@t-online.de
}
}
vif 8 {
address dhcp
description &amp;quot;Telekom Entertain&amp;quot;
firewall {
local {
name WAN_IPTV
}
}
mtu 1500
}
}
ethernet eth1 {
description Local
duplex auto
ipv6 {
dup-addr-detect-transmits 1
}
speed auto
}
ethernet eth2 {
description Local
duplex auto
speed auto
}
ethernet eth3 {
description Local
duplex auto
speed auto
}
ethernet eth4 {
description Local
duplex auto
speed auto
}
loopback lo {
}
switch switch0 {
address 192.168.178.1/24
description Local
mtu 1500
switch-port {
interface eth1 {
}
interface eth2 {
}
interface eth3 {
}
interface eth4 {
}
vlan-aware disable
}
}
}
port-forward {
auto-firewall enable
hairpin-nat enable
lan-interface switch0
wan-interface pppoe0
}
protocols {
igmp-proxy {
interface eth0.8 {
alt-subnet 0.0.0.0/0
role upstream
threshold 1
}
interface eth1 {
alt-subnet 0.0.0.0/0
role downstream
threshold 1
whitelist 239.35.0.0/16
}
}
}
service {
dhcp-server {
disabled false
hostfile-update disable
shared-network-name LAN {
authoritative disable
subnet 192.168.178.0/24 {
default-router 192.168.178.1
dns-server 192.168.178.1
lease 86400
start 192.168.178.100 {
stop 192.168.178.200
}
}
}
static-arp disable
use-dnsmasq disable
}
dns {
forwarding {
cache-size 1000
listen-on switch0
options listen-address=192.168.178.1
}
}
gui {
http-port 80
https-port 443
older-ciphers enable
}
nat {
rule 5001 {
description &amp;quot;Masquerade outgoing pppoe0&amp;quot;
log disable
outbound-interface pppoe0
protocol all
type masquerade
}
rule 5011 {
description &amp;quot;Webinterface Modem&amp;quot;
destination {
address 192.168.1.0/24
}
log disable
outbound-interface eth0
protocol all
type masquerade
}
}
ssh {
port 22
protocol-version v2
}
unms {
disable
}
}
system {
login {
user ubnt {
authentication {
encrypted-password $6$KAQUivwa0C$tawQZnN4aM4CxmQo0RgfUQjij.YJ239CN.1B6yaPfin1jCZvsZ4kSVSlqEXurai5AQSX.XAMfC3rIVuKnmEpM1
plaintext-password &amp;quot;&amp;quot;
}
level admin
}
}
ntp {
server 0.ubnt.pool.ntp.org {
}
server 1.ubnt.pool.ntp.org {
}
server 2.ubnt.pool.ntp.org {
}
server 3.ubnt.pool.ntp.org {
}
}
offload {
hwnat enable
}
static-host-mapping {
}
syslog {
global {
facility all {
level notice
}
facility protocols {
level debug
}
}
}
time-zone Europe/Berlin
traffic-analysis {
dpi disable
export enable
}
}
vpn {
ipsec {
auto-firewall-nat-exclude disable
ipsec-interfaces {
interface pppoe0
}
}
l2tp {
remote-access {
authentication {
mode local
}
client-ip-pool {
start 192.168.178.85
stop 192.168.178.99
}
dns-servers {
server-1 192.168.178.1
}
idle 1800
ipsec-settings {
authentication {
mode pre-shared-secret
## Hier Preshared Secret festlegen
pre-shared-secret PRESHAREDSECRET
}
ike-lifetime 3600
lifetime 3600
}
mtu 1492
outside-address 0.0.0.0
}
}
}
/* Warning: Do not remove the following line. */
/* === vyatta-config-version: &amp;quot;config-management@1:conntrack@1:cron@1:dhcp-relay@1:dhcp-server@4:firewall@5:ipsec@5:nat@3:qos@1:quagga@2:system@4:ubnt-pptp@1:ubnt-udapi-server@1:ubnt-unms@1:ubnt-util@1:vrrp@1:webgui@1:webproxy@1:zone-policy@1&amp;quot; === */
/* Release version: v1.10.0.5056246.180125.0954 */
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>FreeBSD-Server inkl. ezjail-Jails auf neue Version upgraden</title><link>https://christianbaer.me/post/2016/08/freebsd-server-inkl.-ezjail-jails-auf-neue-version-upgraden/</link><pubDate>Wed, 17 Aug 2016 23:32:08 +0000</pubDate><guid>https://christianbaer.me/post/2016/08/freebsd-server-inkl.-ezjail-jails-auf-neue-version-upgraden/</guid><description>&lt;p&gt;Ich bin gerade dabei, einen FreeBSD-Server, der als Host für diverse ezjail-Jails dient, auf eine neue FreeBSD-Version upzugraden. Als Referenz für mich dokumentiere ich das ganze hier einfach mal.&lt;/p&gt;
&lt;p&gt;Das System läuft aktuell auf 10.1 und wird auf 10.3 gehoben. Bei späteren Upgrades müssen die Versionsnummern entsprechend angepasst werden.&lt;/p&gt;
&lt;p&gt;Als erstes bringen wir das aktuell installierte System auf den letzten Stand und aktualisieren die Ports.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;freebsd-update fetch
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;freebsd-update install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;portsnap fetch update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Im nächsten Schritt laden wir die neuen Systemfiles herunter, installieren den neuen Kernel und rebooten das System.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;freebsd-update upgrade -r 10.3-RELEASE
freebsd-update install
shutdown -r now
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nach dem Reboot installieren wir die restlichen Systemfiles und rekompilieren alle installierten Ports. Anschließend starten wir den Server noch mal neu. Die Option &lt;em&gt;-m DISABLE_VULNERABILITIES=yes&lt;/em&gt; setze ich, damit ich nicht mitten im Upgrade aufhören muss, falls bei einem Port Sicherheitslücken bekannt sind. Temporär damit hinter der Firewall zu leben erscheint mir sinnvoller, als ein gebrickter Server. ;)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;freebsd-update install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;portmaster -af -m &lt;span class="nv"&gt;DISABLE_VULNERABILITIES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;shutdown -r now
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nach dem Reboot ist der Server an sich auf 10.3. Nun müssen noch die ezjail-Jails upgegradet werden.&lt;/p&gt;
&lt;p&gt;Hierfür laden und installieren wir zunächst die aktualisierten Files für die Basejail und starten anschließend ezjail neu.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ezjail-admin install -r 10.3-RELEASE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;env &lt;span class="nv"&gt;UNAME_r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10.3-RELEASE ezjail-admin update -s 10.1-RELEASE -U
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ezjail-admin update -P
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;service ezjail-admin restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jetzt müssen wir nur noch in jeder einzelnen Jail die Ports rekompilieren und einmal neustarten.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;portmaster -af -m &lt;span class="nv"&gt;DISABLE_VULNERABILITIES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;service -R
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das war&amp;rsquo;s. Wenn keine Probleme auftreten und kann man damit in ner Stunde durch sein. Wenn mehrere Jails betrieben werden und viele Ports gebaut werden müssen, dauert es entsprechend länger.&lt;/p&gt;</description></item><item><title>Status einer SSH-Session an sudo weitergeben</title><link>https://christianbaer.me/post/2016/04/status-einer-ssh-session-an-sudo-weitergeben/</link><pubDate>Tue, 19 Apr 2016 11:16:04 +0000</pubDate><guid>https://christianbaer.me/post/2016/04/status-einer-ssh-session-an-sudo-weitergeben/</guid><description>&lt;p&gt;Wenn man sich per SSH auf einen Rechner connected und anschließend mit &amp;lsquo;&amp;lsquo;sudo&amp;rsquo;&amp;rsquo; root-Rechte erlangt, kann man in dieser Session nicht feststellen, ob man per SSH verbunden ist, oder nicht. Ich brauchte dies z.B., um meinen Shell-Prompt in diesem Fall anders anzuzeigen.&lt;/p&gt;
&lt;p&gt;Es ist aber sehr einfach, hier Abhilfe zu schaffen. Wir müssen sudo nur sagen, dass es die Variablen betreffend SSH im Environment halten soll.&lt;/p&gt;
&lt;p&gt;Hierfür müssen wir nur folgende Zeile in die sudo-Config (/usr/local/etc/sudoers oder /etc/sudoers) eintragen:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Defaults env_keep += &amp;quot;SSH_TTY SSH_CONNECTION SSH_CLIENT&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Von nun an sind die drei Variablen auch in sudo-Sessions verfügbar.&lt;/p&gt;</description></item><item><title>Omnifocus, Todoist, Remember the Milk - Die Qual der Wahl der richtigen Todoliste</title><link>https://christianbaer.me/post/2016/02/omnifocus-todoist-remember-the-milk-die-qual-der-wahl-der-richtigen-todoliste/</link><pubDate>Thu, 04 Feb 2016 12:25:48 +0000</pubDate><guid>https://christianbaer.me/post/2016/02/omnifocus-todoist-remember-the-milk-die-qual-der-wahl-der-richtigen-todoliste/</guid><description>
&lt;figure&gt;
&lt;a href="https://christianbaer.me/post/2016/02/omnifocus-todoist-remember-the-milk-die-qual-der-wahl-der-richtigen-todoliste/todoist-ipad.jpg" &gt;&lt;img src="https://christianbaer.me/post/2016/02/omnifocus-todoist-remember-the-milk-die-qual-der-wahl-der-richtigen-todoliste/todoist-ipad_hu_4595ebc6803dfcc.jpg" width="700" height="296" /&gt;&lt;/a&gt;
&lt;figcaption&gt;
&lt;small&gt;
Todoist auf dem iPad mini
&lt;/small&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Andreas Lorenz beschreibt in seinem Beitrag &lt;a href="http://andreaslorenz.me/omnifocus-for-pc-users/"&gt;&amp;ldquo;How to get the best out of Omnifocus – for PC Users&amp;rdquo;&lt;/a&gt; wie er als iOS-User, der dienstlich einen PC benutzt das Beste aus Omnifocus heraus holt und es auch ganz ohne eine fehlende Webapp oder einen Mac-Client nutzt.&lt;/p&gt;
&lt;p&gt;Ich bin auch bis heute noch stark begeistert von Omnifocus. Mitte letzten Jahres habe ich nach 8 Jahren als pro-Member &lt;a href="https://rememberthemilk.com"&gt;Remember the Milk&lt;/a&gt; den Rücken gekehrt und bin zu Omnifocus gewechselt. Beim Setup meines Systems habe ich mich ganz stark von &lt;a href="http://simplicitybliss.com/"&gt;Sven Fechner&lt;/a&gt; und seinen sehr ausführlichen Artikeln zu Omnifocus inspirieren lassen. Ich konnte mich jedoch mit der iOS-only-Lösung auf Arbeit nie so richtig anfreunden, auch wenn Die Apps für Mac, iOS und Apple Watch am schönsten und durchdachtetsten sind. Nur E-Mails weiterleiten oder Siri um Tasks anzulegen hat mich zu sehr eingeschränkt und ich hatte zu oft das Gefühl, nicht alles im Griff zu haben.&lt;/p&gt;
&lt;p&gt;Nach drei Monaten Omnifocus bin ich dann zu Todoist gewechselt und hier bisher am glücklichsten, auch wenn mir hier ein paar Dinge fehlen und wieder andere etwas umständlich sind. Im Design der Apps, sowohl auf iOS, als auch im Web haben alle Elemente ziemlich viel Whitespace. Ich würde mir wünschen, mehr Content sehen zu können und alles etwas kompakter zu haben. Auch das Templating-System ist etwas umständlich und arbeitet mit wenig intuitiven CSV-Files. Die App für die Apple Watch hat leider (noch) keine Compliation und ist manchmal etwas lahm. Außerdem wäre es schön, Start-Dates für Tasks vergeben zu können.&lt;/p&gt;
&lt;p&gt;Mit der Veröffentlichung der neuen Remember the Milk-App ging dann jetzt auch die neue Webapp online, die ich im letzten Jahr in der closed Beta intensiv im Einsatz hatte. Auch hier fehlen mir aber noch ein paar Dinge, die mich wieder zu einem Wechsel bewegen könnten. Eine App für die Apple Watch fehlt bisher und eine Möglichkeit verschachtelte Projekte anzulegen fehlt mir auch. Das Handling von Subtasks ist etwas hakelig, das macht Todoist besser. Dafür bietet RTM eine extrem mächtige Query Language um Filter zu erstellen und die Möglichkeit, auch ganze Tasklisten per E-Mail zu importieren.&lt;/p&gt;
&lt;p&gt;Ich werde jetzt erst ein mal bei Todoist bleiben und die anderen Entwicklungen beobachten. Ein trusted System, dem man nicht traut, weil man das Gefühl hat, es nicht so nutzen zu können, wie man möchte, oder Angst hat, es nicht komplett zu durchschauen, macht eben einfach keinen Sinn.&lt;/p&gt;</description></item><item><title>Mehrere SSH-Connections zum selben Host beschleunigen</title><link>https://christianbaer.me/post/2016/01/mehrere-ssh-connections-zum-selben-host-beschleunigen/</link><pubDate>Sun, 31 Jan 2016 21:59:41 +0000</pubDate><guid>https://christianbaer.me/post/2016/01/mehrere-ssh-connections-zum-selben-host-beschleunigen/</guid><description>&lt;p&gt;Manchmal kommt es vor, dass man mehrere SSH-Connections zum selben Host aufbauen muss, um z.B. gleichzeit etwas auszuführen und parallel dazu, die Logfiles zu sehen.&lt;/p&gt;
&lt;p&gt;Bei jedem Verbindungsaufbau muss die Verbindung inkl. dem ganzen Overhead neu aufgebaut werden, was Zeit kostet und u.U. dazu führt, dass man Passwörter usw. erneut eingeben muss.&lt;/p&gt;
&lt;p&gt;SSH bietet die Möglichkeit, in solchen Fällen die bestehende Verbindung einfach erneut zu benutzen.&lt;/p&gt;
&lt;p&gt;Füge folgendes in die &lt;em&gt;.ssh/config&lt;/em&gt; ein:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host *
ControlMaster auto
ControlPath ~/.ssh/control-%h-%p-%r
ControlPersist 600
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Host *&lt;/em&gt; sorgt dafür, dass die folgenden Bedingungen auf alle Verbindungen angewandt werden. Wenn Du statt dem * einen Hostnamen (z.B. github.com) angibst, beziehen sich die Settings nur auf die Verbindungen zu eben jenem.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ControlMaster auto&lt;/em&gt; sorgt dafür, dass bestehende Connections automatisch verwendet werden.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ControlPath ~/.ssh/control-%h-%p-%r&lt;/em&gt; legt für jede Verbindung einen Control-Socket unter ~/.ssh an. Diesen Pfad kannst Du frei wählen. Er muss jedoch bereits existieren.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ControlPersist 600&lt;/em&gt; hält die Verbindung für 10 Minuten offen, nachdem die erste Verbindung (der Master) geschlossen wurde. Ohne diese Option werden alle Connections gekappt, sobald der Master geschlossen wird.&lt;/p&gt;
&lt;p&gt;In der &lt;a href="http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man5/ssh_config.5"&gt;Manpage zu ssh_config&lt;/a&gt; gibt es noch viele weitere Optionen und Konfigurationsbeispiele.&lt;/p&gt;</description></item><item><title>Hostnames und Usernames die man reservieren sollte</title><link>https://christianbaer.me/post/2016/01/hostnames-und-usernames-die-man-reservieren-sollte/</link><pubDate>Sun, 31 Jan 2016 08:57:29 +0000</pubDate><guid>https://christianbaer.me/post/2016/01/hostnames-und-usernames-die-man-reservieren-sollte/</guid><description>&lt;p&gt;Wenn man im Internet Dienste anbietet, die es Menschen ermöglichen, sich selbst zu registrieren, macht es Sinn, von vorneherein einige Namen selbst zu reservieren oder die Reservierung dieser zu blocken.&lt;/p&gt;
&lt;p&gt;Bei einigen gibt es Vorschriften, bei anderen Ratschläge aus RFCs und wieder andere sind aus anderen Gründen einfach sinnvoll. Insbesondere, wenn der Username am Ende zu einer automatisch generierten Subdomain oder E-Mail-Adresse führt, kann es hier ganz schnell zu ungewünschten Effekten kommen, die es gilt, zu vermeiden.&lt;/p&gt;
&lt;p&gt;Geoffrey Thomas hat in seinem &lt;a href="https://ldpreload.com/blog/names-to-reserve"&gt;Blogbeitrag&lt;/a&gt; mal eine &lt;a href="https://ldpreload.com/files/names-to-reserve.txt"&gt;Liste solcher Namen&lt;/a&gt; erstellt und will diese weiterpflegen. Er erklärt auch, warum welche Einträge darin aufgenommen wurden.&lt;/p&gt;
&lt;p&gt;Aktuell empfiehlt er folgende Namen zu blocken:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;abuse
admin
administrator
autoconfig
broadcasthost
ftp
hostmaster
imap
info
is
isatap
it
localdomain
localhost
mail
mailer-daemon
marketing
mis
news
nobody
noc
noreply
no-reply
pop
pop3
postmaster
root
sales
security
smtp
ssladmin
ssladministrator
sslwebmaster
support
sysadmin
usenet
uucp
webmaster
wpad
www
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Home-Office-Studie: Gut für Unternehmen, schlecht für Beschäftigte</title><link>https://christianbaer.me/post/2015/12/home-office-studie-gut-f%C3%BCr-unternehmen-schlecht-f%C3%BCr-besch%C3%A4ftigte/</link><pubDate>Tue, 15 Dec 2015 07:12:21 +0000</pubDate><guid>https://christianbaer.me/post/2015/12/home-office-studie-gut-f%C3%BCr-unternehmen-schlecht-f%C3%BCr-besch%C3%A4ftigte/</guid><description>&lt;p&gt;Die &lt;a href="http://karrierebibel.de/home-office-bilanz-gut-fuer-unternehmen-schlecht-fuer-heimarbeiter/"&gt;Karrierebiebel berichtet&lt;/a&gt; über eine neue Studie der Standford University zum Thema Heimarbeit.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Zunächst einmal hatte das Arbeiten zuhause durchweg positive Auswirkungen auf die Beschäftigten und das Unternehmen: Die Heimarbeit steigerte die Leistung der Versuchsteilnehmer um stolze 13 Prozent. 9 Prozent davon ergaben sich allein dadurch, dass die Heimarbeiter mehr Zeit (pro Schicht) arbeiteten als sie tatsächlich mussten. Sie machten weniger und kürzer Pausen und waren auch seltener krank. 4 Prozent ergaben sich durch die gestiegene Konzentration - dank weniger Störquellen und -geräusche im Umfeld. Zudem berichteten die Heimarbeiter einhellig, sie seien zufriedener mit ihrer Arbeit. Aber lohnt sich Heimarbeit auch wirklich?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Die komplette Studie gibt es auch als &lt;a href="http://web.stanford.edu/~nbloom/WFH.pdf"&gt;PDF&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>System-Monitoring mit Glances</title><link>https://christianbaer.me/post/2015/11/system-monitoring-mit-glances/</link><pubDate>Fri, 20 Nov 2015 20:01:03 +0000</pubDate><guid>https://christianbaer.me/post/2015/11/system-monitoring-mit-glances/</guid><description>&lt;p&gt;&lt;a href="https://nicolargo.github.io/glances/"&gt;Glances&lt;/a&gt; ist ein ziemlich schickes System-Monitoring-Tool für die Shell.&lt;/p&gt;
&lt;p&gt;Es ist in Python geschrieben, für alle gängigen Betriebssysteme verfügbar und so eine Art (h)top auf Steroiden.&lt;/p&gt;
&lt;p&gt;Es zeigt u.A. CPU- und Speicher-Auslastung, Load, Prozesse, Auslastung der Netzwerk-Interfaces, Disk I/O, Temperaturen und die Filesystembelegung an. So hat man alles auf einen Blick, was man sich sonst mit vielen verschiedenen Tools zusammen basteln müsste.&lt;/p&gt;
&lt;p&gt;Es bietet eine API und kann die Daten z.B. an einen StatsD weitergeben oder per Web-Interface zugänglich machen. Den Source Code, Instruktionen zum Schreiben von Plugins, sowie Installationsanleitungen gibt&amp;rsquo;s auf &lt;a href="https://github.com/nicolargo/glances"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://christianbaer.me/post/2015/11/system-monitoring-mit-glances/screenshot-glances.png" &gt;&lt;img src="https://christianbaer.me/post/2015/11/system-monitoring-mit-glances/screenshot-glances_hu_addb7ecac951c336.png" width="700" height="420" /&gt;&lt;/a&gt;
&lt;figcaption&gt;
&lt;small&gt;
Screenshot von Glances auf einem meiner Server
&lt;/small&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Ich habe Glances jetzt seit ein paar Tagen auf allen Servern und dem MacBook im Einsatz und mag es.&lt;/p&gt;</description></item><item><title>5 Punkte, die Du getrost von jeder PowerPoint-Folie streichen kannst</title><link>https://christianbaer.me/post/2015/11/5-punkte-die-du-getrost-von-jeder-powerpoint-folie-streichen-kannst/</link><pubDate>Fri, 20 Nov 2015 19:24:25 +0000</pubDate><guid>https://christianbaer.me/post/2015/11/5-punkte-die-du-getrost-von-jeder-powerpoint-folie-streichen-kannst/</guid><description>&lt;p&gt;Andrea Jost beschreibt in &lt;a href="http://www.andreajoost.de/2015/11/schlanke-powerpoint-folien/"&gt;ihrem Beitrag&lt;/a&gt;, welche Dinge man ruhig aus PowerPoint-Folien streichen sollte, um sie schlanker zu machen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Der eigene Namen und das Logo&lt;/li&gt;
&lt;li&gt;Die Kontaktdaten&lt;/li&gt;
&lt;li&gt;Copy-Right-Vermerke&lt;/li&gt;
&lt;li&gt;Seitenzahlen&lt;/li&gt;
&lt;li&gt;Dateinamen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich kann alle Punkte voll unterstützen, und würde mir wünschen, ein paar Menschen würden die Tipps beherzigen.&lt;/p&gt;</description></item><item><title>Aus zwei mach eins. debilux.org ist umgezogen</title><link>https://christianbaer.me/post/2015/11/aus-zwei-mach-eins.-debilux.org-ist-umgezogen/</link><pubDate>Sun, 15 Nov 2015 11:52:52 +0000</pubDate><guid>https://christianbaer.me/post/2015/11/aus-zwei-mach-eins.-debilux.org-ist-umgezogen/</guid><description>&lt;p&gt;Ich habe die Beiträge meines &lt;a href="https://debilux.org"&gt;anderen Blogs&lt;/a&gt; jetzt hierhin umgezogen und Umleitungen für die alten Beiträge eingerichtet.&lt;/p&gt;
&lt;p&gt;Irgendwie wurden beide nicht so regelmäßig gepflegt und hatten ähnliche Inhalte. Ich wollte jetzt konsolidieren und eben einfach nur noch eine Anlaufstelle bieten.&lt;/p&gt;
&lt;p&gt;Alle, die &lt;a href="https://debilux.org"&gt;debilux.org&lt;/a&gt; per RSS lesen, würde ich bitten, das Abonnement auf &lt;a href="https://christianbaer.me"&gt;christianbaer.me&lt;/a&gt; umzubiegen. Irgendwann werde ich dann mit debilux.org etwas anderes anfangen. Und vielleicht gibt&amp;rsquo;s ja auch hin und wieder mal neue Beiträge ;)&lt;/p&gt;
&lt;p&gt;Falls es mit irgendetwas Probleme geben sollte, würde ich mich über Hinweise freuen.&lt;/p&gt;</description></item><item><title>22 Produktivitätstipps und die dazu passenden Studien</title><link>https://christianbaer.me/post/2014/09/22-produktivit%C3%A4tstipps-und-die-dazu-passenden-studien/</link><pubDate>Fri, 26 Sep 2014 11:16:23 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/22-produktivit%C3%A4tstipps-und-die-dazu-passenden-studien/</guid><description>&lt;p&gt;Ich bin über das &lt;a href="http://www.toolblog.de/2014/09/22-produktivitaetstipps-infografik/"&gt;Toolblog&lt;/a&gt; auf einen Artikel gestoßen, welcher &lt;a href="http://blog.surepayroll.com/22-powerful-productivity-hacks-for-small-business/"&gt;22 Produktivitätstipps&lt;/a&gt; liefert.&lt;/p&gt;
&lt;p&gt;Das tolle daran ist, dass er nicht als langweiliger Tipp-Listen-Post daher kommt. Die Tipps sind mit Infografiken garniert und dort, wo es welche gibt, sind die zugrundeliegenden wissenschaftlichen Studien mit verlinkt. So machen Die Tipps auch Spaß und Sinn.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Die Tipps beschäftigen sich unter anderem mit:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Der richtigen Temperatur zum Arbeiten&lt;/li&gt;
&lt;li&gt;Zitronen als optimaler Geruch für die Arbeitsumgebung&lt;/li&gt;
&lt;li&gt;Schlafmangel und seine Auswirkungen&lt;/li&gt;
&lt;li&gt;Kaugummikauen&lt;/li&gt;
&lt;li&gt;Frühaufstehen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der Artikel ist auf jeden Fall mal einen Blick wert und die wissenschaftlichen Aspekte bieten bestimmt auch Munition beim Smalltalk. ;-)&lt;/p&gt;</description></item><item><title>Erkenntnisse einer menschlichen Laborratte</title><link>https://christianbaer.me/post/2014/09/erkenntnisse-einer-menschlichen-laborratte/</link><pubDate>Fri, 26 Sep 2014 07:53:00 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/erkenntnisse-einer-menschlichen-laborratte/</guid><description>&lt;p&gt;Graham Allcott hat sich ein Jahr lang mit seiner Aussage nach &amp;ldquo;extremen Produktivitätsexperimenten&amp;rdquo; beschäftigt. Über seine Erfahrungen schreibt er im Post &lt;a href="http://productivemag.com/18/extreme-productivity-10-key-lessons-from-a-human-lab-rat"&gt;Extreme Productivity: 10 key lessons from a human lab rat&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Besonders die Erkenntnis &amp;ldquo;Most email is meaningless noise&amp;rdquo; brachte mich zum schmunzeln und deckt sich so auch mit meinen Erfahrungen. Der Rest ist wohl in der konkreten Umsetzung nichts für den Alltag, kann aber bestimmt an der einen oder anderen Stelle zum Nachdenken anregen.&lt;/p&gt;</description></item><item><title>Das mache ich morgen: Die verschiedenen Arten der Prokrastination</title><link>https://christianbaer.me/post/2014/09/das-mache-ich-morgen-die-verschiedenen-arten-der-prokrastination/</link><pubDate>Thu, 18 Sep 2014 12:37:07 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/das-mache-ich-morgen-die-verschiedenen-arten-der-prokrastination/</guid><description>&lt;p&gt;Die Karrierebibel beschreibt in &amp;ldquo;&lt;a href="http://karrierebibel.de/aufgeschoben-und-wie-prokrastinieren-sie/"&gt;Aufgeschoben: Und wie prokrastinieren Sie?&lt;/a&gt;&amp;rdquo; die verschiedenen Typen von Aufschieber_innen und ihre Gründe und bietet praktischerweise auch gleich Tipps an, wie man die Aufschieberitis bekämpfen kann.&lt;/p&gt;
&lt;p&gt;Zumindest zeitweise konnte ich mich in einigen Rollen wiederfinden. Wie sieht es bei Dir aus?&lt;/p&gt;</description></item><item><title>"Eine gute Website bleibt ein Muss"</title><link>https://christianbaer.me/post/2014/09/eine-gute-website-bleibt-ein-muss/</link><pubDate>Thu, 18 Sep 2014 08:14:26 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/eine-gute-website-bleibt-ein-muss/</guid><description>&lt;p&gt;Anette Schwindt schreibt &lt;a href="http://www.couragiert-magazin.de/as/social-media.html"&gt;auf couragiert&lt;/a&gt; darüber, dass eine Webseite, gerade für NGOs ein Muss ist und soziale Netzwerke lediglich zusätzlich dazu eingesetzt werden sollten.&lt;/p&gt;
&lt;p&gt;Sie nennt verschiedene Gründe. Auf der einen Seite hast Du bei der eigenen Website Kontrolle über Aussehen und Inhalt, zum anderen sorgt der regelmäßig neue Content dafür, dass Nutzer_innen einen Mehrwert in der Seite sehen. Auf der anderen Seite bist Du nicht von Downtimes, Inhaltefiltern und Restriktionen der sozialen Netzwerke abhängig und verlierst den Content nicht, wenn eines schließt oder Du die Präsenz dort einstellst.&lt;/p&gt;
&lt;p&gt;Als erstes sollte die Seite stehen, anschließend solltest Du zielgruppenspezifisch schauen, welche Netzwerke Du mit welchen Inhalten deiner Seite bespielst.&lt;/p&gt;
&lt;p&gt;Ich stimme ihr da vollumfänglich zu.&lt;/p&gt;</description></item><item><title>Notizen mit dem Dash/Plus-System</title><link>https://christianbaer.me/post/2014/09/notizen-mit-dem-dash/plus-system/</link><pubDate>Wed, 17 Sep 2014 14:21:36 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/notizen-mit-dem-dash/plus-system/</guid><description>&lt;p&gt;2008 muss es gewesen sein, als ich den Drang und die Notwendigkeit hatte, das erstellen meiner Notizen zu systematisieren. Auf der Suche nach einem praktikablen Systen, dass nicht auf das studieren ausgelegt ist, oder davon ausgeht, dass ich die Verwaltung meiner Todos analog mache, bin ich auf das &lt;a href="http://patrickrhone.com/dashplus/"&gt;Dash/Plus-System von Patrick Rhone&lt;/a&gt; gestoßen.&lt;/p&gt;
&lt;p&gt;Patrick beschrieb es erstmals 2006 in &lt;a href="http://patrickrhone.com/2006/05/12/org-fu-uberpost-productivity-whitepaper/"&gt;Org-Fu Überpost – Productivity Whitepaper&lt;/a&gt;. Mittlerweile gibt es &lt;a href="http://dashplus.net/"&gt;iPhone-Apps&lt;/a&gt;, die dieses System nutzen, &lt;a href="http://patrickrhone.com/2014/03/28/extending-dashplus/"&gt;Erweiterungen um Ideen oder Gedanken zu markieren&lt;/a&gt; und auch &lt;a href="http://jamesgowans.com/hybrid"&gt;Mashups mit anderen System, wie dem Bullet Journal&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Basis eines jeden Items ist ein &amp;ldquo;-&amp;rdquo; (also das Minus-Zeichen, Dash). Dieses wird dann erweitert, je nachdem, ob es sich um eine erledigte, oder delegierte Aufgabe, eine Merkenswerte Information handelt etc.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(Dash): Undone Action Item&lt;/strong&gt; — Individual items (action items and ideas) are marked with a dash preceding them. All items, no matter what they are, are therefore treated as items to be processed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Plus): Done Action Item&lt;/strong&gt; — If the item is an action item (todo), when the item is complete, a vertical line is drawn through the “dash” thus making it resemble a “plus”. This makes the dashed items stand out quite well despite the fact that the same color pen or pencil may be used.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Right Arrow): Waiting&lt;/strong&gt; – (i.e. for another action) — Drawing an arrow pointing to the the item denotes that it is something that is waiting on another action to happen or deliverable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Left Arrow): Delegated&lt;/strong&gt; — Drawing an arrow pointing to the left of the item denotes that it has been delegated (with a note to whom and the date) .&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Triangle): Data Point&lt;/strong&gt; — Turning the dash into a triangle denotes a data point (a fact or figure you wish to remember for instance).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Circle)&lt;/strong&gt; — A circle around any of the above means that it has been carried forward, moved to another list or otherwise changed status – i.e. a “Waiting” item has now become an Action Item elsewhere (with a note about where that item has gone).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So ist es möglich, beim späteren Scannen der Notizen sehr schnell Aufgaben heraus zu filtern, und sich wieder in ein Thema einzulesen. Bei mir hat es sich jetzt seit ein paar Jahren bewährt. Die ToDos wandern nach der Besprechung, Konferenz oder wo ich auch immer gerade Notizen gemacht habe, in Remember the Milk und können nicht untergehen.&lt;/p&gt;
&lt;p&gt;Wie hältst Du es mit den Notizen? Hast Du ein bestimmtes System? Führst Du sie digital oder analog? Ich freue mich darauf, von deinen Erfahrungen zu hören.&lt;/p&gt;</description></item><item><title>"How OmniFocus controls my life"</title><link>https://christianbaer.me/post/2014/09/how-omnifocus-controls-my-life/</link><pubDate>Wed, 17 Sep 2014 09:05:11 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/how-omnifocus-controls-my-life/</guid><description>&lt;p&gt;Daniel Schauenberger ist entwickler bei Etsy und beschreibt in &lt;a href="http://www.unwiredcouch.com/2014/05/13/omnifocus.html"&gt;How OmniFocus controls my life&lt;/a&gt;, wie er OmniFocus nutzt, um mit GTD sein Leben zu managen.&lt;/p&gt;
&lt;p&gt;Das Setup ist recht umfangreich und beschreibt auf der einen Seite das tägliche und wöchentliche Review, auf der anderen Seite die Integration von GitHub und Jira in das System. Das System passt mit Sicherheit nicht auf alle, da er relativ wenige Inboxen hat. Eine Inspiration für eine eigene Umsetzung kann es aber allemal sein.&lt;/p&gt;
&lt;p&gt;Auf jeden Fall ist es ein lesenswerter Post.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://simplicitybliss.com/blog/how-omnifocus-controls-life"&gt;via SIMPLICITYBLISS&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Amerikanische Firmen haben Angst vor dem dualen Ausbildungssystem</title><link>https://christianbaer.me/post/2014/09/amerikanische-firmen-haben-angst-vor-dem-dualen-ausbildungssystem/</link><pubDate>Wed, 17 Sep 2014 07:41:36 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/amerikanische-firmen-haben-angst-vor-dem-dualen-ausbildungssystem/</guid><description>&lt;p&gt;US-Präsident Barack Obama ist Fan des dualen Ausbildungssystems, wie wir es in Deutschland haben.&lt;/p&gt;
&lt;p&gt;Er sieht es als Chance, die hohe Jugendarbeitslosigkeit zu bekämpfen doch der Import in die USA will nicht so recht gelingen. Firmen, die sich an der Initiative beteiligen, sind zumeist deutsche Firmen oder Töchter von diesen.&lt;/p&gt;
&lt;p&gt;Das Wall Street Journal hat hierzu einen &lt;a href="http://www.wsj.de/nachrichten/SB10001424052970203927204580149920350781704?mg=reno64-wsjde"&gt;interessanten Bericht&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Das deutsche System ist relativ einzigartig auf der Welt. Ich habe schon mit Menschen aus Israel, Frankreich und Spanien darüber gesprochen und alle hatten den Eindruck, dass die Kombination aus sowohl fachlicher, als auch praktischer Ausbildung sehr viel Sinn ergibt. Außerhalb Deutschlands findet Ausbildung meist rein schulisch statt, und die Praxisphase erfolgt danach im Job oder Praktika.&lt;/p&gt;</description></item><item><title>Wie Du nach dem Urlaub wieder motiviert und produktiv wirst</title><link>https://christianbaer.me/post/2014/09/wie-du-nach-dem-urlaub-wieder-motiviert-und-produktiv-wirst/</link><pubDate>Mon, 15 Sep 2014 07:42:39 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/wie-du-nach-dem-urlaub-wieder-motiviert-und-produktiv-wirst/</guid><description>&lt;p&gt;Wir kennen das alle. Der Urlaub ist vorbei, die erste Arbeitswoche beginnt und Dir fällt es schwer, Dich wieder ans frühe Aufstehen und das Arbeiten an sich zu gewöhnen.&lt;/p&gt;
&lt;p&gt;Leo Babauta hat sich auf seinem Blog der Thematik angenommen und in &lt;a href="http://zenhabits.net/vacation/"&gt;einem Artikel &lt;/a&gt; im Prinzip vier Tipps erarbeitet, um nach dem Urlaub wieder in Schwung zu kommen.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Get lots of rest.&lt;/li&gt;
&lt;li&gt;Find a purpose, where you’re helping people.&lt;/li&gt;
&lt;li&gt;Get the ball rolling with a very small task.&lt;/li&gt;
&lt;li&gt;Ask someone to hold you accountable.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wie sieht es bei Dir aus? Hast Du Probleme nach dem Urlaub wieder in den Alltag einzutauchen? Welche Tipps hast Du?&lt;/p&gt;</description></item><item><title>GTD-Einführung als kostenloses E-Book</title><link>https://christianbaer.me/post/2014/09/gtd-einf%C3%BChrung-als-kostenloses-e-book/</link><pubDate>Sun, 14 Sep 2014 17:38:48 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/gtd-einf%C3%BChrung-als-kostenloses-e-book/</guid><description>&lt;p&gt;&lt;a href="http://www.einfach-produktiv-sein.de/"&gt;Ralf Grabowski&lt;/a&gt; stellt auf seiner Homepage eine sehr &lt;a href="http://www.einfach-produktiv-sein.de/downloads/"&gt;gute und knappe Zusammenfassung zu &amp;ldquo;Getting Things Done&amp;rdquo;&lt;/a&gt; bereit.&lt;/p&gt;
&lt;p&gt;Das kostenlose E-Book ist ein gelungener Einstieg in GTD und fasst auf 22 Seiten alles wichtige Zusammen. Ralf geht Sowohl auf die Methode als auch auf den Einsatz verschiedener Tools ein und nennt Beispiele. Vielen Dank dafür!&lt;/p&gt;</description></item><item><title>Inbox Zero: Den E-Mail-Eingang bezwingen</title><link>https://christianbaer.me/post/2014/09/inbox-zero-den-e-mail-eingang-bezwingen/</link><pubDate>Thu, 11 Sep 2014 07:46:43 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/inbox-zero-den-e-mail-eingang-bezwingen/</guid><description>&lt;p&gt;Das Prinzip &lt;a href="http://www.43folders.com/izero"&gt;Inbox Zero&lt;/a&gt; von &lt;a href="http://www.merlinmann.com/"&gt;Merlin Mann&lt;/a&gt; ist ein Klassiker und den Produktivitäts-Tipps und hilft mir nun schon seit eingen Jahren, die schier endlose E-Mail-Flut zu bewältigen. Es gliedert sich gut in &lt;a href="http://gettingthingsdone.com/"&gt;Getting Things Done&lt;/a&gt; ein und ist eine Kombination aus einer simplen Ordnerstruktur und Verhaltensweisen.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/z9UjeTMb3Yk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Der Vortrag im Video erklärt die ganze Sache recht gut. In einem späteren Beitrag werde ich noch mal mein gesamtes System beschreiben. Dieser Post hier soll erst mal nur einen Einstieg darstellen.&lt;/p&gt;
&lt;p&gt;Hast Du Tipps für den Umgang mit E-Mails? Wie sieht deine Struktur aus und was tust Du, um den Überblick zu behalten?&lt;/p&gt;</description></item><item><title>Verdeckte PR in Wikipedia – Das Weltwissen im Visier von Unternehmen</title><link>https://christianbaer.me/post/2014/09/verdeckte-pr-in-wikipedia-das-weltwissen-im-visier-von-unternehmen/</link><pubDate>Wed, 10 Sep 2014 13:23:30 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/verdeckte-pr-in-wikipedia-das-weltwissen-im-visier-von-unternehmen/</guid><description>&lt;p&gt;Die Otto-Brenner-Stiftung hat &lt;a href="http://www.otto-brenner-blog.de/blog/2014/01/13/verdeckte-pr-in-wikipedia-das-weltwissen-im-visier-von-unternehmen.html"&gt;in einer Studie&lt;/a&gt; die Aktivitäten von Unternehmen in der Wikipedia untersucht.&lt;/p&gt;
&lt;p&gt;Die Studie kommt zum Ergebnis, dass PR in der Wikipedia allgegenwärtig ist und untermauert dies mit verschiedenen Beispielen und Themenkomplexen. Gleichzeitig kommt die Studie zur Erkenntnis, dass die innere Struktur der Wikipedia aktuell nicht dazu geeignet ist, wirksam dagegen Vorzugehen, dass Unternehmen das freie Weltwissen für ihre PR-Zwecke nutzen.&lt;/p&gt;
&lt;p&gt;Die Studie lässt sich bei der Stiftung &lt;a href="https://www.otto-brenner-stiftung.de/otto-brenner-stiftung/aktuelles/verdeckte-pr-in-wikipedia-das-weltwissen-im-visier-von-unternehmen.html"&gt;kostenlos als Printversion bestellen, oder als PDF herunterladen&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Wie Du das Meiste aus Konferenzen heraus holst</title><link>https://christianbaer.me/post/2014/09/wie-du-das-meiste-aus-konferenzen-heraus-holst/</link><pubDate>Wed, 10 Sep 2014 08:13:00 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/wie-du-das-meiste-aus-konferenzen-heraus-holst/</guid><description>&lt;p&gt;An Konferenzen teilzunehmen, ohne Mehrwert daraus zu schöpfen, ist meist Zeit- und oft auch Geldverschwendung. Ob man einen Gewinn aus der Zeit zieht, hängt davon ab, mit welchen Zielen man an einer Konferenz teilnimmt.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://christianbaer.me/post/2014/09/wie-du-das-meiste-aus-konferenzen-heraus-holst/9906758784_fe54a56041_o.jpg" &gt;&lt;img src="https://christianbaer.me/post/2014/09/wie-du-das-meiste-aus-konferenzen-heraus-holst/9906758784_fe54a56041_o_hu_73dea7bc4572e484.jpg" width="700" height="393" /&gt;&lt;/a&gt;
&lt;figcaption&gt;
&lt;small&gt;
&lt;a href="https://www.flickr.com/photos/zeldman/9906758784"&gt;Edge Conference at Google New York, Jeffrey Zeldmann, CC BY 2.0&lt;/a&gt;
&lt;/small&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;HubSpot empfiehlt daher, sich &lt;a href="https://blog.hubspot.com/marketing/conference-checklists"&gt;vor einer Konferenz eine Checkliste anzulegen&lt;/a&gt;, um das Ziel nicht aus den Augen zu verlieren. Außerdem wird empfohlen, das Ziel im Zweifelsfall zu wechseln. Wenn Du mit dem Ziel des Lernens auf eine Konferenz fährst und merkst im Laufe der Zeit, dass Du in den angebotenen Talks nicht wirklich neues Wissen mitnehmen kannst, macht es Sinn, das Ziel zum beispiel auf das Netzwerken zu verlagern und nach den Talks mit den Speaker_innen in Kontakt zu kommen.&lt;/p&gt;
&lt;p&gt;Der Artikel empfiehlt verschiedene Checklisten für verschiedene Ziele. Netzwerker_innen sollen zum Beispiel vor einer Konferenz folgende Dinge tun:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Erstelle eine Liste der Menschen, mit denen Du auf der Konferenz in Kontakt kommen möchtest.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nimm mit den Menschen schon vorher online KOntakt auf und vereinbare konkrete Termine für Treffen.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Organisiere Dir Visitenkarten.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Außerdem wird darauf eingegangen, die gewonnen Informationen im Team zu teilen und allen verfügbar zumachen.&lt;/p&gt;
&lt;p&gt;Wie hältst Du es auf Konferenzen? Wie bereitest Du dich vor und wie entscheidest Du, was Du auf einer Konferenz machst?&lt;/p&gt;</description></item><item><title>HumHub: Das Open-Source Social-Intranet zum Selberhosten</title><link>https://christianbaer.me/post/2014/09/humhub-das-open-source-social-intranet-zum-selberhosten/</link><pubDate>Tue, 09 Sep 2014 08:30:02 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/humhub-das-open-source-social-intranet-zum-selberhosten/</guid><description>&lt;p&gt;HumHub beschreibt sich selbst als &amp;ldquo;&lt;a href="https://www.humhub.org/"&gt;flexible Open Source Social Network Kit&lt;/a&gt;&amp;rdquo; und soll die Möglichkeit bieten, ein selbstgehostetes, soziales Intranet aufzusetzen.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://christianbaer.me/post/2014/09/humhub-das-open-source-social-intranet-zum-selberhosten/screenshot-humhub.png" &gt;&lt;img src="https://christianbaer.me/post/2014/09/humhub-das-open-source-social-intranet-zum-selberhosten/screenshot-humhub_hu_5d6d77b5d531a258.png" width="700" height="441" /&gt;&lt;/a&gt;
&lt;figcaption&gt;
&lt;small&gt;
Screenshot von HumHub
&lt;/small&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Es bietet die obligatorischen Status-Updates, die Möglichkeit, Dateien hochzuladen und Gruppen anzulegen. Des Weiteren ist es durch verschiedene Module erweiterbar.&lt;/p&gt;
&lt;p&gt;Auf der Seite des Projektes gibt es die Möglichkeit, eine limitierte Test-Installation aufzusetzen. Ich habe es bisher nicht großartig getestet. Beim ersten Durchstöbern, wusste es jedoch zu gefallen. Von der Anmutung her erinnert es ein wenig an Facebook.&lt;/p&gt;
&lt;p&gt;HumHub ist es definitiv Wert, es im Auge zu behalten. Vielleicht findet ist es ja eine Option, bei der nächsten Gelegenheit statt Wikis oder Foren, einfach mal eine HumHub-Installation einzusetzen.&lt;/p&gt;</description></item><item><title>Anzahl gescheiterter Bewerbungen aufgrund von schlechten Online-Profilen steigt</title><link>https://christianbaer.me/post/2014/09/anzahl-gescheiterter-bewerbungen-aufgrund-von-schlechten-online-profilen-steigt/</link><pubDate>Mon, 08 Sep 2014 21:06:54 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/anzahl-gescheiterter-bewerbungen-aufgrund-von-schlechten-online-profilen-steigt/</guid><description>&lt;p&gt;Dass Arbeitgeber_innen Potentielle Beschäftigte im Internet recherchieren und es im Bewerbungsprozess unvorteilhaft ist, wenn man auf Profilseiten in den sozialen Netzwerken mit Alkohol, Drogen oder Ähnlichem in Verbindung zu bringen ist, &lt;a href="http://t3n.de/news/bewerbung-diese-561809/"&gt;sollte mittlerweile hinlänglich bekannt sein&lt;/a&gt;. Trotzdem steigen laut einer &lt;a href="http://www.careerbuilder.com/share/aboutus/pressreleasesdetail.aspx?id=pr829&amp;amp;sd=6/26/2014&amp;amp;ed=06/26/2014"&gt;aktuellen Umfrage unter Arbeitgebern&lt;/a&gt; die gescheiterten Bewerbungen, gerade wegen schlechten Online-Profilen, kontinuierlich.&lt;/p&gt;
&lt;p&gt;Mit verantwortlich hierfür sind auch folgende, weniger bekannte, Ablehnungsgründe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Die Bewerber_innen äußern sich abschätzig über ehemalige Arbeitgeber und/oder Kolleg_innen&lt;/li&gt;
&lt;li&gt;Sie halten sich nicht an grammatikalische Regeln&lt;/li&gt;
&lt;li&gt;Der Username ist unprofessionell&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn die Bewerbung auf fruchtbaren Boden stoßen soll, ist eine kontinuierliche Pflege der Profilseiten von hoher Bedeutung. Die Karrierebibel hat &lt;a href="http://karrierebibel.de/social-media-profil-15-pflegetipps-fuer-bewerber/"&gt;15 Tipps für Bewerber_innen&lt;/a&gt; zusammen gefasst, die in der Online-Visitenkarte beherzigt werden sollten.&lt;/p&gt;
&lt;p&gt;Welche Erfahrungen hast Du gemacht?&lt;/p&gt;</description></item><item><title>Gewerkschaftliche Gegenöffentlichkeit in Zeiten betrieblicher Vereinzelung</title><link>https://christianbaer.me/post/2014/09/gewerkschaftliche-gegen%C3%B6ffentlichkeit-in-zeiten-betrieblicher-vereinzelung/</link><pubDate>Mon, 08 Sep 2014 09:55:10 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/gewerkschaftliche-gegen%C3%B6ffentlichkeit-in-zeiten-betrieblicher-vereinzelung/</guid><description>&lt;p&gt;Der Wandel der Arbeitswelt stellt Gewerkschaften seit einigen Jahren vor größere Probleme. Betriebe werden immer kleinteiliger organisiert, Techniker_innen beginnen und beenden ihre Arbeitstage zu Hause und auch das Homeoffice erfreut sich größter Beliebtheit.&lt;/p&gt;
&lt;p&gt;Das Zusammenkommen im Betrieb, das gemeinsame Austauschen über die Arbeit, über Bedürfnisse und die Schaffung einer gemeinsamen Belegschaftsidentität werden zunehmend schwieriger. Seit einiger Zeit nun nutzen Belegschaften, gewerkschaftlich Aktive und Betriebsräte daher Blogs und soziale Netzwerke für die Information, Schaffung von Transparenz und die Diskussion um eben diese Lücken zu schließen.&lt;/p&gt;
&lt;p&gt;In der ver.di-Publik 5-2014 erschien der Artikel &amp;ldquo;&lt;a href="https://www.verdi.de/themen/arbeit/++co++c9e51c80-2855-11e4-8947-5254008a33df"&gt;Im Blog wird&amp;rsquo;s diskutiert&lt;/a&gt;&amp;rdquo;, welcher über erfolgreiche Beispiele von moderner basisdemokratischer Gegenöffentlichkeit aus der Dinestleistungsbranche berichtet und &amp;ldquo;&lt;a href="http://fallbeispiele.sozialebewegungen.org/betriebsratsblogs/"&gt;Die Arbeitnehmer-Blogosphäre&lt;/a&gt;&amp;rdquo; beleuchtet das ganze Geschehen aus österreichischer Sicht und bietet noch viele weitere Informationen und Verweise.&lt;/p&gt;
&lt;p&gt;Ich finde, dies ist ein sehr spannendes Feld. Die Gewerkschaften haben hier noch viel Potential nach oben und für die basisdemokratische Vernetzung ist es unumgänglich, die Menschen dort abzuholen, wo sie sich treffen. Im Internet.&lt;/p&gt;</description></item><item><title>Der Schreibtisch wird zum Fließband</title><link>https://christianbaer.me/post/2014/09/der-schreibtisch-wird-zum-flie%C3%9Fband/</link><pubDate>Sun, 07 Sep 2014 14:51:43 +0000</pubDate><guid>https://christianbaer.me/post/2014/09/der-schreibtisch-wird-zum-flie%C3%9Fband/</guid><description>&lt;p&gt;Der Generator auf Bayern 2 spricht in der Sendung &lt;a href="http://www.br.de/radio/bayern2/sendungen/zuendfunk/kolumnen-sendungen/generator/crowdworking-digitale-arbeiterklasse-100.html"&gt;&amp;ldquo;Crowdwork: Vom Entstehen der digitalen Arbeiterklasse&amp;rdquo;&lt;/a&gt; über den Wandel der Arbeitswelt und der Umdeutung der Rollen in dieser.&lt;/p&gt;
&lt;p&gt;Durch die Grenzenlose Verfügbarkeit von Arbeitskraft über das Internet werden Arbeitgeber zu Usern, die sich im Internet von Clickworkern Ergebnisse liefern lassen. Die Arbeitnehmer_innen hingegen erledigen simpelste Aufgaben, wie z.B. Adressrecherche und werden im Accord bezahlt. Heraus kommen extrem prkäre Arbeitsverheltnisse. Wenn das Ergebnis nicht gefällt, gibt&amp;rsquo;s auch keine Bezahlung.&lt;/p&gt;
&lt;p&gt;Ein wirklich spannendes Radiofeature.&lt;/p&gt;</description></item><item><title>Dynamisches DNS bei INWX mit eigener Domain</title><link>https://christianbaer.me/post/2013/10/dynamisches-dns-bei-inwx-mit-eigener-domain/</link><pubDate>Sun, 13 Oct 2013 20:29:55 +0000</pubDate><guid>https://christianbaer.me/post/2013/10/dynamisches-dns-bei-inwx-mit-eigener-domain/</guid><description>&lt;p&gt;Ich verwalte alle meine Domains bei &lt;a href="https://www.inwx.de"&gt;InterNetWorX&lt;/a&gt; (welcher nebenbei erwähnt, ein ziemlich schnieker Domain-Registrar ist, den ich uneingeschränkt empfehlen kann).&lt;/p&gt;
&lt;p&gt;Dieser bietet unter anderem eine API an, mit der ich Domaineinstellungen ändern kann. Da ich meinen Homeserver gerne von außen erreichen möchte, lag die Idee nahe, beides zu kombinieren.&lt;/p&gt;
&lt;p&gt;Mit folgendem Script, welches ich auf &lt;a href="https://github.com/chrisb86/nsupdate"&gt;Github&lt;/a&gt; gestellt habe, ist es mir möglich, die Nameservereinstellungen automatisch so anzupassen, so dass zum Beispiel &lt;em&gt;&lt;a href="http://homeserver.meinedomain.de"&gt;http://homeserver.meinedomain.de&lt;/a&gt;&lt;/em&gt; immer auf meinen Server im heimischen Arbeitszimmer zeigt. So bin ich unabhängig von anderen Diensten und kann ihn eben auch mit meiner eigenen Domain nutzen. Nebenbei kostet mich das alles nichts extra, da die Funktion eben bei INWX eingebaut ist.&lt;/p&gt;
&lt;p&gt;Das Script &lt;em&gt;nsupdate.sh&lt;/em&gt; wird auf dem Server zu Hause stündlich per cron aufgerufen. Es liest dann die WAN-IP des Anschlusses aus und vergleicht sie mit der IP, die im Nameserver für die Subdomain hinterlegt ist. Wenn sich beide unterscheiden, trägt sie die aktuelle IP per XML-Voodo in den Nameserver ein.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
# Update a nameserver entry at inwx with the current WAN IP (DynDNS)
# Copyright 2013 Christian Busch
# http://github.com/chrisb86/
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# &amp;quot;Software&amp;quot;), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# from which site should we get your wan ip?
IP_CHECK_SITE=http://checkip.dyndns.org
source nsupdate.config
LOG=$0.log
NSLOOKUP=$(nslookup -sil $HOSTNAME - ns.inwx.de | tail -2 | head -1 | cut -d' ' -f2)
WAN_IP=`curl -s ${IP_CHECK_SITE}| grep -Eo '&amp;lt;[[:digit:]]{1,3}(.[[:digit:]]{1,3}){3}&amp;gt;'`
API_XML=&amp;quot;nameserver.updateRecord
user
$INWX_USER
pass
$INWX_PASS
id
$INWX_DOMAIN_ID
content
$WAN_IP
&amp;quot;
if [ ! &amp;quot;$NSLOOKUP&amp;quot; == &amp;quot;$WAN_IP&amp;quot; ]; then
curl -silent -v -XPOST -H&amp;quot;Content-Type: application/xml&amp;quot; -d &amp;quot;$API_XML&amp;quot; https://api.domrobot.com/xmlrpc/
echo &amp;quot;$(date) - $HOSTNAME updated. Old IP: &amp;quot;$NSLOOKUP &amp;quot;New IP: &amp;quot;$WAN_IP &amp;gt;&amp;gt; $LOG
else
echo &amp;quot;$(date) - No update needed for $HOSTNAME. Current IP: &amp;quot;$NSLOOKUP &amp;gt;&amp;gt; $LOG
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Konfiguriert wird das ganze in der &lt;em&gt;nsupdate.config&lt;/em&gt;. Diese liegt im selber Folder, wie das Script selbst. Hier werden die Zugangsdaten für INWX angegeben. Außerdem steht hier die Subdomain, die wir für DynDNS nutzen wollen und die ID, unter welcher die Domain bei INWX geführt wird.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# nsupdate.config
# Login credentials for the inwx admin interface
INWX_USER=&amp;quot;USERNAME&amp;quot;
INWX_PASS=&amp;quot;PASSWORD&amp;quot;
# The hostname that you want to update and it's ID from the inwx interface
# You get the ID when you edit the given nameserver entry and hover the save button.
HOSTNAME=&amp;quot;subdomain.example.com&amp;quot;
INWX_DOMAIN_ID=&amp;quot;123456789&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Diese Lösung läuft bei mir jetzt seit einigen Monaten sehr zuverlässig. Die Aktuelle Version findest Du immer auf &lt;a href="https://github.com/chrisb86/"&gt;meiner Github-Seite&lt;/a&gt;. Getestet habe ich es nur auf dem Mac und FreeBSD.&lt;/p&gt;</description></item><item><title>Selbstbau-NAS mit FreeBSD</title><link>https://christianbaer.me/post/2013/02/selbstbau-nas-mit-freebsd/</link><pubDate>Thu, 14 Feb 2013 16:13:38 +0000</pubDate><guid>https://christianbaer.me/post/2013/02/selbstbau-nas-mit-freebsd/</guid><description>&lt;p&gt;Wie in &lt;a href="http://skrupuloes.de/podcast/skr002-das-nas-ist-voll-und-die-telekom-kann-manchmal-doch-was/"&gt;Ausgabe 2 von skrupuloes&lt;/a&gt; zu hören war, hatte ich Probleme mit dem Speicherplatz auf meinem NAS. Die &lt;a href="http://www.synology.de/products/product.php?product_name=DS211j&amp;amp;lang=deu"&gt;Synology Diskstation 211J&lt;/a&gt; hat nur Platz für zwei Platten, die ich aus Redundanzgründen gespiegelt habe. Ich hatte also effektiv 2 TB Platz. Da die Diskstation auch meine Boxee-Box, Raspberry Pi mit XBMC und diverse iDevices mit Mediendateien versorgt hat, war der Platz relativ schnell voll, wenn man die Time Machine-Backups für zwei MacBooks dazu rechnet. Es musste also etwas neues her.&lt;/p&gt;
&lt;p&gt;Die fertigen Lösungen, die es auf dem Markt gibt waren mir alle zu unflexibel und mit Platz für mind. vier Festplatten auch relativ schnell relativ teuer. Ich entschied mich also, etwas selbst zu bauen.&lt;/p&gt;
&lt;p&gt;Nach ein wenig Recherche entschied ich mich für folgende Komponenten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mainboard&lt;/strong&gt;: &lt;a href="http://www.asus.com/Motherboard/C60M1I/"&gt;ASUS C60M1-I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gehäuse&lt;/strong&gt;: &lt;a href="http://www.fractal-design.com/?view=product&amp;amp;category=9&amp;amp;prod=43"&gt;Fractal Design Array R2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM&lt;/strong&gt;: Corsair XMS3 PC-133 8GB (CL9)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Festplatten&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Western Digital WD20EZRX Green 2TB&lt;/li&gt;
&lt;li&gt;320 GB Hitachi 2,5&amp;quot; HDD aus MacBook Pro&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das Mainboard ist passivgekühlt, kommt mit einem AMD Fusion Dualcore mit 1GHz, Gigabit-LAN und 6 SATA-Ports. Dazu habe ich 8 GB RAM verbaut (man weiß ja nie…). Gespeichert wird auf vier 2 TB-Platten und einer 320 GB-Platte, die ich noch aus meinem MacBook rumliegen hatte. Das Gehäuse ist extra für den Einsatz als NAS entwickelt worden. Es kommt komplett mit einem großen Gehäuse-Lüfter, 300 W-Netzteil und bietet sowohl einen herausnehmbaren Festplattenkäfig für bis zu sechs Platten und die Möglichkeit, zusätzlich eine 2,5&amp;quot;-Platte zu verbauen.&lt;/p&gt;
&lt;p&gt;Da ich aus Gründen der Datensicherheit gerne &lt;a href="http://de.wikipedia.org/wiki/ZFS_(Dateisystem)"&gt;ZFS&lt;/a&gt; nutzen wollte, bin ich nun gezwungen, nicht mehr Linux zu benutzen. Da mir fertige NAS-Distributionen zu unflexibel sind, entschied ich mich, mal etwas neues zu wagen und jetzt läuft hier ein schickes &lt;a href="http://www.freebsd.org"&gt;FreeBSD&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Als Linux-Umsteiger war FreeBSD kurzzeitig ungewohnt, aber mittlerweile bin ich recht gut drin und lerne die diversen Vorzüge bezüglich Software-Verwaltung mit Ports, Konfigurationsdatein etc. zu schätzen.&lt;/p&gt;
&lt;p&gt;Die vier großen Platten laufen als RAIDZ1 (vergleichbar mit RAID5) und bieten mir somit knapp 6 TB Speicherplatz und eine mögliche Wiederherstellung, falls eine Platte ausfällt. Wenn der Speicherplatz knapp wird, kann ich noch zwei weitere Platten verbauen und das RAID einfach erweitern. Die 2,5&amp;quot;-Platte nutze ich als Systemplatte und habe hierauf das BSD installiert.&lt;/p&gt;
&lt;p&gt;Alles in allem habe ich jetzt für vergleichsweise wenig Geld ein kleines, Leistungsstarkes, stromsparendes und flexibel einsetzbares System, das auch noch Spaß beim Herumexperimentieren mit einem echten UNIX gibt ;-)&lt;/p&gt;</description></item><item><title>Analyse der Apache-Logs einer Wordpress-Multisite mit Piwik</title><link>https://christianbaer.me/post/2013/01/analyse-der-apache-logs-einer-wordpress-multisite-mit-piwik/</link><pubDate>Tue, 08 Jan 2013 11:02:58 +0000</pubDate><guid>https://christianbaer.me/post/2013/01/analyse-der-apache-logs-einer-wordpress-multisite-mit-piwik/</guid><description>&lt;p&gt;Ich habe gestern meine diversen Projekte, die auf Wordpress laufen endlich mal in eine &lt;a href="http://codex.wordpress.org/Create_A_Network"&gt;Multisite-Installation&lt;/a&gt; gepackt. Das heißt, alle Blogs sind weiterhin ganz normal erreichbar, ich muss aber nur noch eine Wordpressinstallation mit Plugins etc. pflegen und habe somit weniger Administrationsaufwand.
Bisher habe ich die Nutzungszahlen der Seiten mit Piwik und dem dazugehörigen Javascript-Snippet getrackt. Das hat dort anscheinend auch ganz gut funktioniert. Es läuft aber auch nur dort, wo HTML-Code durch mich beeinflussbar ist.&lt;/p&gt;
&lt;p&gt;Seit der Version 1.8 beherrscht Piwik jedoch auch das &lt;a href="http://piwik.org/log-analytics/"&gt;Parsen und Einlesen von Apache Logfiles&lt;/a&gt; und das wollte ich dann gestern auch mal ausprobieren.&lt;/p&gt;
&lt;p&gt;Nach ein Bisschen rumprobieren ist mir ein Fehler bzw. unerwünschtes Verhalten aufgefallen. Vorher hatten alle Seiten einen eigenen Apache-vHost und entsprechend eigene Logs. Da jetzt alle Blogs unter einem einzigen vHost laufen, waren die Logs nicht mehr aussagefähig, da ja alle Seitenaufrufe an den selben Host gingen.&lt;/p&gt;
&lt;h3 id="apache-beibringen-mehr-bzw-anders-zu-loggen"&gt;Apache beibringen, mehr bzw. anders zu loggen&lt;/h3&gt;
&lt;p&gt;Die Lösung lag also darin, Apache zu sagen, dass er anders loggen soll.&lt;/p&gt;
&lt;p&gt;Hierfür nutze ich in der vHost-Datei unter &lt;em&gt;/etc/apaches2/sites-avaliable/&lt;/em&gt; die Definitionen &lt;em&gt;LogFormat&lt;/em&gt; und &lt;em&gt;CustomLog&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;LogFormat &amp;quot;%{Host}i %h %l %u %t &amp;quot;%r&amp;quot; %&amp;gt;s %b &amp;quot;%{Referer}i&amp;quot; &amp;quot;%{User-Agent}i&amp;quot;&amp;quot; vhost_common
CustomLog &amp;quot;|/usr/sbin/rotatelogs /var/www/$DOMAIN/logs/access.%Y-%m-%d.log 86400&amp;quot; vhost_common
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mit &lt;em&gt;Logformat&lt;/em&gt; sage ich, in welchem Format die Logs geschrieben werden sollen. Hierbei kommt dann sowas raus, wie z.B:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;skrupuloes.de XXX.XXX.XXX.XXX - - [08/Jan/2013:11x:03:39 +0100] &amp;quot;GET /feed/podcast-mp3/ HTTP/1.1&amp;quot; 200 9964 &amp;quot;-&amp;quot; &amp;quot;PritTorrent/0.1&amp;quot;
skrupuloes.de XXX.XXX.XXX.XXX - - [08/Jan/2013:11:10:27 +0100] &amp;quot;GET /wp-content/uploads/sites/7/2012/09/coverart-300x274.jpg HTTP/1.1&amp;quot; 304 - &amp;quot;http://skrupuloes.de/ueber-skrupuloes/&amp;quot; &amp;quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4&amp;quot;
skrupuloes.de XXX.XXX.XXX.XXX - - [08/Jan/2013:11:10:27 +0100] &amp;quot;GET /favicon.ico HTTP/1.1&amp;quot; 200 - &amp;quot;-&amp;quot; &amp;quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4&amp;quot;
debilux.org XXX.XXX.XXX.XXX - - [08/Jan/2013:11:10:31 +0100] &amp;quot;GET / HTTP/1.1&amp;quot; 200 14279 &amp;quot;-&amp;quot; &amp;quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4&amp;quot;
debilux.org XXX.XXX.XXX.XXX - - [08/Jan/2013:11:10:33 +0100] &amp;quot;GET /2012/09/28/fuer-filevault-anderes-passwort-nutzen-als-fuer-systemaccount/ HTTP/1.1&amp;quot; 200 13658 &amp;quot;http://debilux.org/&amp;quot; &amp;quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;%{Host}i&lt;/em&gt; ist hierbei dafür zuständig, dass auch die Domain mitgeloggt wird, über die der Zugriff erfolgte. Jetzt sind die Logs wieder aussagefähig.&lt;/p&gt;
&lt;p&gt;Die &lt;em&gt;CustomLog&lt;/em&gt;-Direktive sagt Apache, wie er die Logs in welche Files schreiben soll. Ich nutze hier &lt;em&gt;rotatelogs&lt;/em&gt;, um die Files jeden Tag zu rotieren. Meine Logs sind dann zum Beispiel unter &lt;em&gt;/var/www/$DOMAIN/logs/access.2013–01–07.log&lt;/em&gt; zu finden.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;$DOMAIN&lt;/em&gt; steht hier für den Ordner, den ich für jede Domain unter &lt;em&gt;/var/www/&lt;/em&gt; habe. Diese beinhalten einen Ordner _“logs/”, in dem die Logs der jeweiligen Domain abgelegt werden. &lt;em&gt;%Y-%m-%d&lt;/em&gt; wird Durch Jahr-Monat-Tag ersetzt. Jede Nacht um 0:00 Uhr wird ein neues Log angefangen und die Logs vom Vortag sind “fertig”.&lt;/p&gt;
&lt;h3 id="apache-logs-in-piwik-einlesen"&gt;Apache-Logs in Piwik einlesen&lt;/h3&gt;
&lt;p&gt;Der Parser für die Piwik-Logfiles liegt im Piwik-Verzeichnis unter &lt;em&gt;/misc/log-analytics/import_logs.py&lt;/em&gt;. Man kann ihm viele Argumente mit auf den Weg geben und praktischerweise gleich mehrere Logfiles auf einmal zum Fraß vorwerfen. Da ich keine Lust hatte, großartige Configs zu schreiben, haben ich mir ein kleines Shellscript gebastelt.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
PATH_TO_PIWIK='/var/www/meine_domain/www/piwik' # e.g. /var/www/piwik
PIWIK_URL='https://meine_domain/piwik' # e.g. http://mysite.tld/piwik
WWWFOLDER='/var/www/'
# search logs
LOGDATE=`(date --date='1 days ago' '+%Y-%m-%d')`
LOGFILES=`(find $WWWFOLDER -iname access.$LOGDATE.log | grep &amp;quot;/logs/&amp;quot; | tr 'n' ' ')`
# import found logs to piwik
python $PATH_TO_PIWIK/misc/log-analytics/import_logs.py --url=$PIWIK_URL --recorders=4 --add-sites-new-hosts --show-progress $LOGFILES
# run Piwik Auto-Archiving
php5 $PATH_TO_PIWIK/misc/cron/archive.php --url=$PIWIK_URL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In den ersten drei Variablen sage ich dem Script, wo es Piwik findet, wie Piwik per URL zu erreichen ist und wo die Webseiten, respektive Logs liegen. &lt;em&gt;$LOGDATE&lt;/em&gt; stellt fest, welches Datum gestern war (da sind ja die Logs schon “fertig”) und mit Logfiles suche ich dann in &lt;em&gt;/var/www/&lt;/em&gt; nach den Logs von gestern und ersetze in der Ausgabe Zeilenumbrüche durch Leerzeichen, damit ich sie an den Importer als Parameter weitergeben kann.&lt;/p&gt;
&lt;p&gt;Anschließend lasse ich den Importer laufen. Er nutzt vier Threads und legt noch unbekannte Hosts automatisch in Piwik an (spart wieder Arbeit ;) ). Es gibt noch viele Parameter mehr, aber die könnt ihr Auch ja auch selbst anschauen.&lt;/p&gt;
&lt;p&gt;Da es hier auch irgendwie reinpasst, lasse ich mit dem Piwik Auto-Archiving auch gleich noch die &lt;a href="http://piwik.org/docs/setup-auto-archiving/"&gt;Datenbank aufräumen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Das Script läuft bei mir jede Nacht als Cronjob, sodass ich jeden Morgen die Statistiken von gestern einsehen kann. Die sind jetzt zwar nicht mehr tagesaktuell, ich kann aber zum ersten Mal auch die Downloads unseres Podcasts, die nicht über die Seite gingen, tracken.&lt;/p&gt;</description></item><item><title>Six Clever Tricks for a Better To-Do List - by Dumb Little Man</title><link>https://christianbaer.me/post/2012/09/six-clever-tricks-for-a-better-to-do-list-by-dumb-little-man/</link><pubDate>Sat, 29 Sep 2012 19:06:43 +0000</pubDate><guid>https://christianbaer.me/post/2012/09/six-clever-tricks-for-a-better-to-do-list-by-dumb-little-man/</guid><description>&lt;p&gt;&lt;a href="http://www.dumblittleman.com/2012/09/six-clever-tricks-for-better-to-do-list.html?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+DumbLittleMan+%28Dumb+Little+Man+-+tips+for+life%29"&gt;Six Clever Tricks for a Better To-Do List - by Dumb Little Man&lt;/a&gt;.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;When you fail to make headway with your to-do list, you might end up blaming yourself – but it’s probably not your fault.&lt;/p&gt;
&lt;p&gt;To-do lists are great tools, but to be truly effective, you need to know a few tricks for making them work well.&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description></item><item><title>Für FileVault anderes Passwort nutzen als für Systemaccount</title><link>https://christianbaer.me/post/2012/09/f%C3%BCr-filevault-anderes-passwort-nutzen-als-f%C3%BCr-systemaccount/</link><pubDate>Fri, 28 Sep 2012 08:55:15 +0000</pubDate><guid>https://christianbaer.me/post/2012/09/f%C3%BCr-filevault-anderes-passwort-nutzen-als-f%C3%BCr-systemaccount/</guid><description>&lt;p&gt;Apples FileVault hat, mal abgesehen von den Sicherheitsbedenken die man prinzipiell gegenüber nichtoffener Kryptosoftware haben sollte, ein riesiges Problem.&lt;/p&gt;
&lt;p&gt;Das Userpasswort entspricht dem Passwort zum Entschlüsseln der Festplatte.&lt;/p&gt;
&lt;p&gt;Für Verschlüsselung nutze ich gerne Passwörter die an die 30 Zeichen lang sind, um ein einfaches Erraten so unwahrscheinlich wie möglich zu machen. Mein Userpasswort habe ich gerne etwas kürzer, da ich es öfter eingeben muss.&lt;/p&gt;
&lt;p&gt;Apple stellt uns hier vor die Qual der Wahl. Bequemlichkeit oder Sicherheit? Es geht erst mal nur eins von beidem, da für die Verschlüsselung kein separates Passwort vergeben werden kann.&lt;/p&gt;
&lt;p&gt;Über einen kleinen Umweg ist es aber doch möglich, ein langes Passwort als einzige Angriffsfläche zu setzen.&lt;/p&gt;
&lt;p&gt;Hierfür sind zwei Verhaltensweisen von OS X bzw. FileVault ausschlaggebend.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Neue User werden automatisch berechtigt, mit ihrem Passwort die Festplatte zu entschlüsseln&lt;/li&gt;
&lt;li&gt;Wird für einen bereits bestehenden User ein leeres Passwort gesetzt, wird ihm die Berechtigung zum entschlüsseln entzogen.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;enn wir das beides kombinieren, tut sich folgender Weg auf. Wir legen einen neuen User mit einem sehr langen (sicheren) Passwort an. Dieser bekommt automatisch das Recht zum Entschlüsseln. Unserem eigenen User setzen wir kurzzeitig ein leeres Passwort und entziehen ihm diese Berechtigung. Wir können die Festplatte jetzt nur noch mit dem langen Passwort des neuen Users entschlüsseln. Wir werden dann als dieser User angemeldet, können uns wieder ausloggen und mit unserem &amp;ldquo;Arbeitsuser&amp;rdquo; wieder anmelden.&lt;/p&gt;
&lt;p&gt;Ich arbeite mit dem Account &lt;em&gt;&lt;strong&gt;chris&lt;/strong&gt;&lt;/em&gt;. FileVault ist aktiviert und alles verschlüsselt. &lt;/p&gt;
&lt;p&gt;Ich lege jetzt in den Systemeinstellungen den User &lt;em&gt;&lt;strong&gt;leia&lt;/strong&gt;&lt;/em&gt; an und vergebe ein sehr langes Passwort. Anschließend öffne ich das Terminal und tippe &lt;em&gt;passwd&lt;/em&gt; ein. Ich werde nach dem aktuellen Passwort gefragt und anschließend zwei mal nach dem Neuen. Die Frage nach dem Neuen bestätige ich einfach mit Return ohne eine Eingabe zu machen. Mein Passwort ist jetzt leer und ich kann die Festplatte nicht mehr entschlüsseln.&lt;/p&gt;
&lt;p&gt;Dann führe ich &lt;em&gt;passwd&lt;/em&gt; noch mal aus, bestätige die Frage nach dem aktuellen Passwort mit Return, da es ja leer ist, und vergebe als neues Passwort jenes, welches ich vorher hatte.&lt;/p&gt;
&lt;p&gt;Wenn ich jetzt neu starte, kann ich mich nur noch als &lt;em&gt;&lt;strong&gt;leia&lt;/strong&gt;&lt;/em&gt; mit dem langen Passwort anmelden. Voilá, Ziel erfüllt!&lt;/p&gt;</description></item><item><title>Time Machine Backups verschlüsselt über das Internet erstellen</title><link>https://christianbaer.me/post/2011/12/time-machine-backups-verschl%C3%BCsselt-%C3%BCber-das-internet-erstellen/</link><pubDate>Mon, 26 Dec 2011 23:43:21 +0000</pubDate><guid>https://christianbaer.me/post/2011/12/time-machine-backups-verschl%C3%BCsselt-%C3%BCber-das-internet-erstellen/</guid><description>&lt;p&gt;An Tagen wie diesen (z.B. Weihnachten) stellt sich immer wieder ein Problem. Das NAS steht zu Hause, man selbst ist zum Beispiel bei seinen Eltern und das über Tage hinweg. Der paranoide Nerd hat dann immer wieder das gleiche Problem: Was ist mit den Backups. Was soll ich nur machen, wenn die Festplatte des MacBooks nach zwei Tagen abraucht?&lt;/p&gt;
&lt;p&gt;Genau diesem (meinem) Problem habe ich mich über Weihnachten mal angenommen. Zu Hause steht meine Synology Disk Station. Sie ist im Netzwerk u.A. per AFP (Apple Filing Protocol) als Time Machine-Volume ansprechbar. SSH läuft, die Authentifizierung läuft schon seit Längerem über Keys und der SSH-Port ist über den Router freigegeben, welcher wiederum per DDNS erreichbar ist.&lt;/p&gt;
&lt;p&gt;Ich habe also ein Script gebastelt, welches all diese Faktoren kombiniert und es mir ermöglicht, auf meine Disk Station per AFP zuzugreifen und Backups zu machen.&lt;/p&gt;
&lt;p&gt;Das Script stellt eine Verbindung zum SSH-Server im NAS her, und Tunnelt den dortigen AFP-Port per SSH auf einen Port meines Rechners. Über diesen Port kann ich dann über eine verschlüsselte Verbindung auf mein NAS zugreifen. Der Tunnel bzw. der durch den Tunnel angebotene Service wird dem Betriebssystem per dns-sd bekannt gemacht, was dazu führt, dass es ihn &amp;ldquo;entdeckt&amp;rdquo; und im Finder aufführt, als wäre ich im heimischen Netzwerk.&lt;/p&gt;
&lt;p&gt;Wird das Script noch mal aufgerufen, prüft es, ob schon ein Tunnel besteht. Wenn dies nicht der Fall ist, versucht es einen zu erstellen. Dadurch bietet es sich an, das Script per cron regelmäßig ausführen zu lassen um den Tunnel dauerhaft aufrecht zu erhalten.&lt;/p&gt;
&lt;p&gt;Alles in allem ist das bisher eine sehr coole Sache :) Gigabyteweise Time Machine Backups mit 128kb Upstream machen jedoch keinen Spaß.&lt;/p&gt;
&lt;p&gt;Ich habe das Projekt wie immer &lt;a href="https://github.com/chrisb86/ssh-ds"&gt;auf github gehostet&lt;/a&gt; und Pflege es auch dort. Über Anregungen und Commits würde ich mich freuen.&lt;/p&gt;
&lt;p&gt;Anbei zusätzlich auch noch mal das aktuelle Listing des Codes.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
## CONFIG
REMOTEUSER=&amp;quot;user&amp;quot; # The ssh user name on remote server
REMOTEHOST=&amp;quot;remote.host.name&amp;quot; # The ssh user password on remote server
LABEL=&amp;quot;DiskStation&amp;quot; # The label for the service, that's registered with dns-sd
## NO NEED TO EDIT BELOW THIS LINE
VERSION=&amp;quot;2011-12-27&amp;quot;
VERBOSE=false
REMOTELOGIN=&amp;quot;$REMOTEUSER@$REMOTEHOST&amp;quot;
createTunnel() {
# Create tunnel to port 548 on remote host and make it avaliable at port 12345 at localhost
# Also tunnel ssh for connection testing purposes
ssh -gNf
-L 12345:127.0.0.1:548
-L 19922:127.0.0.1:22
-C $REMOTELOGIN &amp;amp;
if [[ $? -eq 0 ]]; then
# Register AFP as service via dns-sd
dns-sd -R $LABEL _afpovertcp._tcp . 12345 &amp;gt; /dev/null &amp;amp;
if [ $VERBOSE = &amp;quot;true&amp;quot; ]; then echo Tunnel to $REMOTEHOST created successfully; fi
exit 0
else
if [ $VERBOSE = &amp;quot;true&amp;quot; ]; then echo An error occurred creating a tunnel to $REMOTEHOST RC was $?; fi
exit 1
fi
}
killTunnel() {
MYPID=`ps aux | egrep -w &amp;quot;$REMOTEHOST|dns-sd -R $LABEL&amp;quot; | grep -v egrep | awk '{print $2}'`
for i in $MYPID; do kill $i; done
echo All processes killed
}
help() {
echo &amp;quot;ssh-ds version $VERSION
ssh-ds is a small shell script that tunnels the AFP port of your disk station
(and propably every other NAS with AFP and SSH services running) over ssh to your client computer.
Put your settings in the config section in the script itself!
Options
-v, --verbose increase verbosity
-k, --kill kill all ssh-ds processes
-h, --help show this screen
&amp;quot;
exit 0
}
# Yippieeh, commandline parameters
while [ $# -gt 0 ]; do # Until you run out of parameters . . .
case &amp;quot;$1&amp;quot; in
-k|--kill)
killTunnel
exit 0
;;
-v|--verbose)
VERBOSE=true
;;
-h|--help)
help
;;
*)
;;
esac
shift # Check next set of parameters.
done
## Run the 'ls' command remotely. If it returns non-zero, create a new connection
ssh -q -p 19922 $REMOTEUSER@localhost ls &amp;gt; /dev/null
if [[ $? -ne 0 ]]; then
createTunnel
else
if [ $VERBOSE = &amp;quot;true&amp;quot; ]; then echo Tunnel to $REMOTEHOST is active; fi
fi
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>A very zombie holiday (Instructional video)</title><link>https://christianbaer.me/post/2011/12/a-very-zombie-holiday-instructional-video/</link><pubDate>Mon, 26 Dec 2011 23:21:41 +0000</pubDate><guid>https://christianbaer.me/post/2011/12/a-very-zombie-holiday-instructional-video/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/0UqEhUm2B_8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;An instructional video for ensuring a happy home during this zombie-infested holiday season.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Aufruf an die gelangweilten Coder dieser Welt: Helft uns!</title><link>https://christianbaer.me/post/2011/12/aufruf-an-die-gelangweilten-coder-dieser-welt-helft-uns/</link><pubDate>Wed, 14 Dec 2011 12:09:18 +0000</pubDate><guid>https://christianbaer.me/post/2011/12/aufruf-an-die-gelangweilten-coder-dieser-welt-helft-uns/</guid><description>&lt;p&gt;Ich habe ein Problem und weiß, dass es zumindest einigen anderen Menschen genau so geht.&lt;/p&gt;
&lt;p&gt;Als politisch aktiver Mensch lerne ich ständig und überall auf der Welt Menschen kennen. Ihre Kontaktdaten wandern in mein Adressbuch und gesellen sich dort zu 700 anderen. Ich kann die Organisation angeben, kann auch Notizen hinzufügen und eintragen, wo sie wohnen oder arbeiten. So entsteht relativ schnell ein sehr unübersichtliches Netzwerk. Überblick bekomme ich nur, wenn ich mir alle Kontakte einzeln anschaue und versuche, irgendwelche Strukturen nachzuvollziehen. Das ist sehr mühselig und zeitaufwendig.&lt;/p&gt;
&lt;p&gt;Wenn ich z.B. einen Kontakt Anja Musterfrau habe, weiß ich, dass sie in Pinneberg wohnt wohnt, wie ich sie erreichen kann und dass sie bei einer Altenpflegeeinrichtung arbeitet. Vielleicht erinnere ich mich auch noch daran, dass sie in Hamburg in einer Gruppe aktiv ist, die sich gegen Gentrifizierung engagiert. Dass sie beim DGB und in der Tierrechtsszene aktiv ist, vergesse ich aber immer.&lt;/p&gt;
&lt;p&gt;Nun plane ich z.B. eine dreitägige Fahrt nach Hamburg und möchte dort einige Menschen treffen, um meine Netzwerke zu pflegen. Mir fehlt ein Überblick, mit wem ich mich in Hamburg treffen könnte. Welche Kontakte machen aufgrund meiner aktuell laufenden Projekte Sinn?&lt;/p&gt;
&lt;p&gt;Oder ich möchte in den Gewerkschaften eine Kampagne initiieren, die zum Ziel hat, dass die eine Gesetzesinitiative gestartet wird, die eine Kenzeichnungsflicht für Lebensmittel fordert, die Vegetarier_innen ermöglicht, auf den ersten Blick zu sehen, ob tierische Bestandteile in einem Lebensmittel verwendet wurden. Wo habe ich in Deutschland Kontakte, die ich mit einspannen könnte?&lt;/p&gt;
&lt;p&gt;Ihr seht, das ist alles nicht einfach. Was will ich also, um mir das alles zu vereinfachen und das Netzwerken systematischer betreiben zu können?&lt;/p&gt;
&lt;p&gt;Ich möchte Kontakten mehrere Organisationen zuweisen können
Bei Anja: z.B. Altenpflegeinrichtung Kunz, DGB, Recht auf Stadt, Animal Liberation Front&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ich möchte Kontakten mehrere Organisationen zuweisen können (bei Anja: z.B. Altenpflegeinrichtung Kunz, DGB, Recht auf Stadt, Animal Liberation Front)&lt;/li&gt;
&lt;li&gt;Ich möchte Kontakte thematisch taggen können (bei Anja z.B. gewerkschaft, antifa, gentrification, tierrechte, altenpflege)&lt;/li&gt;
&lt;li&gt;Ich möchte unabhängig von den Adressen im Adressbuch auch Orte hinzufügen können (Anja hat ihren politischen Wirkungskreis in Hamburg und nicht in Pinneberg, wo sie wohnt und arbeitet. Das muss ersichtlich sein.)&lt;/li&gt;
&lt;li&gt;Die Kontakte lassen sich dann nach allen möglichen Kriterien filtern&lt;/li&gt;
&lt;li&gt;Darstellung der Menschen pro Ort auf einer Karte&lt;/li&gt;
&lt;li&gt;Verknüpfungd der Menschen in Mindmaps um Netzwerke darzustellen (und die Map dann auch als Overlay auf der Karte)&lt;/li&gt;
&lt;li&gt;Ich kann Kontakten weitere Kontaktmöglichkeiten hinzufügen, die nicht in einer Standard-vCard vorhanden sind (JID, GPG-Key, in welchen IRC-Channels hängen die Menschen rum etc.)&lt;/li&gt;
&lt;li&gt;All diese Informationen werden am Besten in den Kontakten im Adressbuch selbst gespeichert, um sie damit auch auf dem Exchange, LDAP, SyncML-Server liegen zu haben und um Kontakte nicht in zwei Systemen pflegen zu müssen&lt;/li&gt;
&lt;li&gt;Sollte Plattformunabhängig funktionieren und vorhandene Standards nutzen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ja, das ist ne ganze Menge und es gibt mit Sicherheit auch noch mehr denkbare Anwendungsfälle und Kriterien. Ich hoffe aber, ihr versteht, worauf ich hinaus will.&lt;/p&gt;
&lt;p&gt;Zur möglichen Umsetzung habe ich mir auch schon ein paar Gedanken gemacht.&lt;/p&gt;
&lt;p&gt;Eine denkbare Möglichkeit wäre es, das Notizfeld einer vCard zu nutzen. Die Informationen könnten dann strukturiert als XML-Tree gespeichert werden. Ein Nachteil ist jedoch die schlechte Lesbarkeit z.B. mit Smartphones.&lt;/p&gt;
&lt;p&gt;Eine andere denkbare Möglichkeit wäre eine eigene Markup-Language (#tag, @ort, §organisation etc.), die eine einfache Lesbarkeit am Smartphone ermöglicht und sich trotzdem gut parsen lässt.&lt;/p&gt;
&lt;p&gt;Wenn Ihr nun also Lust habt, mir und dem Rest der Menschheit etwas Gutes zu tun. Dann fangt an irgendetwas in diese Richtung zu coden. Jeder kleine Schritt ist besser, als die jetzige Situation.&lt;/p&gt;
&lt;p&gt;Ich bin bereit dazu, mit Ideen und Kreativität meinen Teil dazu beizutragen. Ich stelle Webspace zur Verfügung und tue sonst alles was nötig ist, um zu unterstützen. Aber bitte helft uns!&lt;/p&gt;</description></item><item><title>Die Occupy-Bewegung in Deutschland - Problem oder Debattierclub?</title><link>https://christianbaer.me/post/2011/11/die-occupy-bewegung-in-deutschland-problem-oder-debattierclub/</link><pubDate>Wed, 02 Nov 2011 10:54:23 +0000</pubDate><guid>https://christianbaer.me/post/2011/11/die-occupy-bewegung-in-deutschland-problem-oder-debattierclub/</guid><description>&lt;p&gt;Ausgehend vom &amp;ldquo;arabischen Frühling&amp;rdquo; sind zunächst in Spanien, dann in den USA, Israel und seit dem 15. Oktober weltweit Menschen auf die Straße gegangen und haben Plätze besetzt um ihren Forderungen Luft zu machen. In einigen arabischen Ländern konnten diese Menschen Regierungen stürzen. Ihr Antrieb war der Wunsch nach Demokratie, Gleichheit, der Kampf gegen Repression und Korruption.&lt;/p&gt;
&lt;p&gt;In den USA haben es die Menschen satt, dass sie als unprivilegierte, Arme, Nichtkrankenversicherte darunter leiden müssen, dass die Reichen sich immer weiter bereichern und die Reformen im Rahmen der Krisen den &amp;ldquo;99%&amp;rdquo;, als die die Besetzer_innen sich begreifen, immer mehr Lasten aufbürden. Aus meiner Sicht betrachtet, finden die Occupys in den USA einen gewissen Zuspruch und werden für den Staat und die Exekutive langsam zu einem Problem. In Oakland sind die Proteste letzte Woche eskaliert, als die Polizei einem Demonstranten mit einem Tränengaskanister einen &lt;a href="https://www.taz.de/t172/Occupy-Proteste-in-den-USA-eskalieren/!80723/"&gt;Schädelbruch geschossen&lt;/a&gt; hat.&lt;/p&gt;
&lt;p&gt;Auch in Deutschland gibt es seit dem 15. Oktober regelmäßig Occupy-Demos in Berlin Hamburg und Frankfurt am Main. In Berlin gelang es schon mehrmals bei den Demonstrationen auf die Wiese vor dem Reichstag zu gelangen, in &lt;a href="http://www.occupyfrankfurt.de/"&gt;Frankfurt&lt;/a&gt; und &lt;a href="http://www.occupyhamburg.org/"&gt;Hamburg&lt;/a&gt; gibt es Protestcamps.&lt;/p&gt;
&lt;p&gt;Das Camp vor der Europäischen Zentralbank in Frankfurt ist &amp;ldquo;genehmigt&amp;rdquo; und darauf ist man stolz. Es gibt eine Internetpräsenz, Podcasts aus dem Camp und sogar ein Intranet für die Orgamenschen selbst. In den arabischen Ländern rückte das Militär an, um die Camps zu räumen, es starben viele Menschen. Das Internet wurde abgeschaltet um die Proteste einzudämmen.&lt;/p&gt;
&lt;p&gt;Ist das nicht aber irgendwie ein Zeichen dafür, dass der Aufstand der &amp;ldquo;99%&amp;rdquo; für die Handelnden in Politik und Wirtschaft kein Problem darstellt? Es stehen dort über 100 Zelte, es besteht ein beachtenswerte Infrastruktur und jeden Samstag demonstrieren fünf bis achttausend Menschen durch Frankfurt. Getan hat sich jedoch nichts. Weder hat die Politik auf die Bewegung Bezug genommen, noch hat sie versucht, die Proteste zu verhindern.&lt;/p&gt;
&lt;p&gt;Die Forderungen der Menschen im Camp sind so unterschiedlich, wie die Menschen, die sich dort jeden Tag einfinden. Und das ist auch gut so. Muss nicht aber langsam mal ein Diskussionsprozess starten, wo das alles hinführen soll? Sind die Forderung, wie die nach einer Finanztransaktionssteuer, die Forderung, dem Finanzkapitalismus Fesseln anzulegen, nicht viel zu Kurz gedacht? Können wir die Banken dafür verantwortlich machen, dass sie die Möglichkeiten, die ihnen dieses System bietet nutzen? Ein System, das darauf ausgerichtet ist, dass die einen Menschen mehr haben, was zwangsläufig dazu führt, dass andere Menschen weniger haben. Ist nicht viel mehr das System das Problem?&lt;/p&gt;
&lt;p&gt;Das &lt;a href="http://uprising.blogsport.de/"&gt;recherchejournal zum aufstand&lt;/a&gt; veröffentlichte einen &lt;a href="http://uprising.blogsport.de/2011/10/27/ein-brief-aus-kairo-in-die-usa/"&gt;Brief aus Kairo&lt;/a&gt;, gerichtet an die Besetzungen in den USA.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Die &lt;a href="https://www.taz.de/Occupy-in-Oakland/!81054/"&gt;Menschen in Oakland rufen für nächste Woche zu einem Generalstreik auf&lt;/a&gt;. Freilich fehlt der Bewegung in Deutschland noch die Macht, die Anerkennung um solche Forderungen und Aufrufe zu stellen. Sollte der Weg aber nicht in diese Richtung gehen?&lt;/p&gt;
&lt;p&gt;Es bleibt abzuwarten, was in den USA nächste Woche geschieht. Und noch spannender wird die Entwicklung hier in Deutschland.&lt;/p&gt;
&lt;p&gt;Wird die Occupy-Bewegung endlich zu einem Problem oder verkommt sie zu einem Debattierclub der die schöne Erfahrung einer &lt;a href="http://debilux.org/283-fotos-occupyfrankfurt-protestcamp-16-10-2011/"&gt;neuen Art des Zusammenlebens&lt;/a&gt; macht aber von den &amp;ldquo;Mächtigen&amp;rdquo; ignoriert wird?&lt;/p&gt;</description></item><item><title>Umzug geglückt und neues Design</title><link>https://christianbaer.me/post/2011/10/umzug-gegl%C3%BCckt-und-neues-design/</link><pubDate>Sun, 23 Oct 2011 12:38:44 +0000</pubDate><guid>https://christianbaer.me/post/2011/10/umzug-gegl%C3%BCckt-und-neues-design/</guid><description>&lt;p&gt;Das Blog ist heute umgezogen und wohnt jetzt auf meinem vServer. Es kann sein, dass es Zugriffsprobleme gibt, da die DNS-Server noch ein Bisschen zum Aktualisieren brauchen. In ein paar Stunden sollte aber wieder alles klappen.&lt;/p&gt;
&lt;p&gt;Gleichzeitig habe ich ein neues Theme installiert. Es kommt jetzt &lt;a href="http://www.elmastudio.de/wordpress-themes/piha/"&gt;Piha&lt;/a&gt; von &lt;a href="http://www.elmastudio.de/"&gt;Elmastudio&lt;/a&gt; zum Einsatz. Dieses grandiose Theme bietet endlich ein Responsive Layout, Custom Post Types und ein schickes Design obendrauf. So ist es auf mobilen Geräten genauso gut nutzbar, wie am Rechner und unterscheidet bei Posts zwischen Artikeln, Bildern, Gallerien etc.&lt;/p&gt;
&lt;p&gt;Da ich versuche, so viele Dienste wie möglich selber zu hosten, gehen Bilder, die ich twittere nicht zu Twitpic oder Twitter sondern landen jetzt hier und ich habe die volle Kontrolle darüber. Möglich macht dies das &lt;a href="https://wordpress.org/extend/plugins/tweet-images/"&gt;Wordpress-Plugin Tweet Images&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Jetzt sieht es zumindest schon mal schön aus, die Bilder landen hier und ich bin glücklich. :)&lt;/p&gt;
&lt;p&gt;Ob ich jetzt wieder mehr schreibe, weiß ich nicht. Das wird sich zeigen.&lt;/p&gt;</description></item><item><title>The Colour Clock - Zeit als Farbe</title><link>https://christianbaer.me/post/2011/02/the-colour-clock-zeit-als-farbe/</link><pubDate>Fri, 18 Feb 2011 11:47:37 +0000</pubDate><guid>https://christianbaer.me/post/2011/02/the-colour-clock-zeit-als-farbe/</guid><description>
&lt;figure&gt;
&lt;a href="https://christianbaer.me/post/2011/02/the-colour-clock-zeit-als-farbe/screenshot-screensaver-the-color-clock.png" &gt;&lt;img src="https://christianbaer.me/post/2011/02/the-colour-clock-zeit-als-farbe/screenshot-screensaver-the-color-clock_hu_fd1987a8f5e97847.png" width="700" height="438" /&gt;&lt;/a&gt;
&lt;figcaption&gt;
&lt;small&gt;
Screenshot von &amp;ldquo;The Colour Clock
&lt;/small&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href="http://thecolourclock.co.uk/"&gt;The Colour Clock&lt;/a&gt; von &lt;a href="http://www.lookatjack.com"&gt;Jack Hughes&lt;/a&gt; zeigt die aktuelle Uhrzeit als Hexdezimalfarbe an. Dadurch ändert sich der Hintergrund der Zeitanzeige jede Sekunde ein wenig.&lt;/p&gt;
&lt;p&gt;Herunterladen kann man die Uhr als Mac OS Bildschirmschoner. Ich finde das Teil extrem stylish und habe es jetzt installiert.&lt;/p&gt;</description></item><item><title>Aus Backup-Script mit rsync und growl wird fabula-backup</title><link>https://christianbaer.me/post/2011/02/aus-backup-script-mit-rsync-und-growl-wird-fabula-backup/</link><pubDate>Sun, 06 Feb 2011 09:48:38 +0000</pubDate><guid>https://christianbaer.me/post/2011/02/aus-backup-script-mit-rsync-und-growl-wird-fabula-backup/</guid><description>&lt;p&gt;In meinem Artikel &amp;ldquo;&lt;a href="https://christianbaer.me/102-mac-inkrementelle-backups-mit-rsync-und-growl/"&gt;Mac: Inkrementelle Backups mit rsync und growl&lt;/a&gt;&amp;rdquo; habe ich letztens mein Backup-Script für den Mac veröffentlicht, welches mit rsync und growl bei mir Time Machine ersetzt und wesentlich mehr Möglichkeiten bietet.&lt;/p&gt;
&lt;p&gt;Da ich jetzt noch ein Bisschen daran rumgeschraubt habe und auch für die Zukunft noch ein paar Dinge geplant sind, habe ich mich entschlossen, das Teil zu &lt;a href="https://github.com/chrisb86/"&gt;GitHub&lt;/a&gt; zu schieben.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/chrisb86/fabula-backup"&gt;Hier&lt;/a&gt; gibt&amp;rsquo;s jetzt immer die aktuellste Version mit der Möglichkeit des Downloads und der Mitarbeit. Wenn es großartige Änderungen gibt, werde ich über neue Versionen auch hier berichten.&lt;/p&gt;
&lt;p&gt;Aktuell sind wir bei Version 0.7.1 und es hat sich Folgendes getan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Anstatt alles in einer log-Datei pro Ausführung zu dokumentieren, nutzt das Script jetzt den Syslog und schreibt ein Error-log nur, wenn Fehler aufgetreten sind. Es ist jetzt also näher an den Standardmethoden von OS X dran und müllt die Festplatte nicht mit Logfiles zu ;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Die growl-Notifications sind jetzt nur sticky, wenn Fehler aufgetreten sind. Ansonsten verschwinden alle Benachrichtigungen, nach der von Euch eingestellten Zeit.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Für die Zukunft geplant ist noch eine stärkere Linux-Kompatibilität und evt. eine Setup-Prozedur o. Ä.&lt;/p&gt;</description></item><item><title>Mac: Inkrementelle Backups mit rsync und growl</title><link>https://christianbaer.me/post/2011/01/mac-inkrementelle-backups-mit-rsync-und-growl/</link><pubDate>Sun, 30 Jan 2011 20:59:57 +0000</pubDate><guid>https://christianbaer.me/post/2011/01/mac-inkrementelle-backups-mit-rsync-und-growl/</guid><description>
&lt;figure&gt;
&lt;a href="https://christianbaer.me/post/2011/01/mac-inkrementelle-backups-mit-rsync-und-growl/screenshot-rsync-growl.png" &gt;&lt;img src="https://christianbaer.me/post/2011/01/mac-inkrementelle-backups-mit-rsync-und-growl/screenshot-rsync-growl_hu_f74a33bf51e79fc7.png" width="700" height="438" /&gt;&lt;/a&gt;
&lt;figcaption&gt;
&lt;small&gt;
Screenshot von meinem Desktop mit growl
&lt;/small&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Ich bin seit ca. einem halben Jahr Mac-User und wirklich zufrieden mit OS X. Das Einzige, was mich stört, ist Time Machine.&lt;/p&gt;
&lt;p&gt;Ich habe meinen Home-Folder verschlüsselt in einem FileVault und meine restlichen Daten auf einer separaten, mit Truecrypt verschlüsselten, Partition liegen. Time Machine ist relativ beschränkt, wenn es darum geht, die Backups anzupassen. Um mein Verschlüsseltes Home-Verzeichnis zu sichern, muss ich mich ausloggen, MacOS komprimiert den FileVault und schmeißt ihn dann auf das Backup-Medium. Die Sicherung des Truecrypt-Volumes ist gar nicht möglich.&lt;/p&gt;
&lt;p&gt;Da dies für eine Backup-Strategie, welche automatisch im Hintergrund läuft, denkbar unpraktisch ist, musste eine andere Lösung her.&lt;/p&gt;
&lt;p&gt;Ich habe also ein Bisschen gegoogelt und mir aus verschiedenen Backup-Scripts Anregungen geholt. Heraus kam ein Backup-Script, welches die Backups ähnlich anlegt, wie Time Machine.&lt;/p&gt;
&lt;p&gt;Ich konfiguriere die Quell-Ordner, gebe das Ziel-Medium an und der Rest geschieht im Hintergrund. Da rsync in meiner Configuration nur neue und geänderte Dateien übertragen muss und nicht veränderte Dateien einfach verlinkt werden, geht das Backup relativ schnell und verbraucht sehr wenig Platz. Bei jedem Durchlauf wird ein neuer Ordner angelegt, welcher immer ein Vollbackup enthält. Wenn sich keine Dateien verändert haben, wird aber kein zusätzlicher Platz verbraucht.&lt;/p&gt;
&lt;p&gt;Am Ende jedes Durchlaufs werde ich per growl benachrichtigt, dass das Backup gemacht wurde und ob es Fehler gab.&lt;/p&gt;
&lt;p&gt;Alles in allem funktioniert jetzt alles so, wie ich es will. Das Script läuft stündlich per cron im Hintergrund und ich brauche mich um nichts zu kümmern. Trotzdem habe ich Gewissheit, dass alle meine Daten gesichert sind, falls etwas passiert.&lt;/p&gt;
&lt;p&gt;Folgenden Code einfach in eine Textdatei packen, mit root-Rechten ausführen und glücklich sein :)&lt;/p&gt;
&lt;p&gt;P.S.: Der Code funktioniert auf jedem System, af dem rsync läuft (Linux, Unix, Windows mit Cygwin). Hier muss dann aber unter Umständen auf die Benachrichtigungen verzichtet werden, wenn Ihr das Script nicht an des Benachrichtigungssystem Eures Betriebssystem anpassen wollt (z.B. notify-bin in Ubuntu).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
# --- Set backup parameters ---
# What local files/folders are we backing up (without trailin &amp;quot;/&amp;quot;)?
SOURCES='/bin /private/etc /sbin /etc /usr /opt /Volumes/Macintosh/Library /Volumes/Macintosh/System /Volumes/Macintosh/Users/chris /Volumes/Macintosh/Applications /Volumes/Daten'
# What location shall we back up to (without trailin &amp;quot;/&amp;quot;)?
DEST='/Volumes/Elements'
# Any non-valuable stuff to exclude by name/location (seperated by &amp;quot;,&amp;quot;)?
EXCLUDE='.DS_Store,/.chris/,.Trash/,tmp/,LastPass/pipes/,log/,.log'
# --- Get some data and make some declarations ---
# What's the local hostname?
HOST=`hostname -fs`
# Get the date
DATE=`date &amp;quot;+%Y-%m-%d-%H%M%S&amp;quot;`
# Set the folder for backups for this host
BACKUPPATH=&amp;quot;$DEST/Backup/$HOST&amp;quot;
# Where shall we write the error log?
ERRORS=&amp;quot;$BACKUPPATH/errors-$DATE.log&amp;quot;
# --- Set Growl parameters ---
# What will this script be called in the Growl prefpane?
GROWLNAME=&amp;quot;Backup of $HOST&amp;quot;
# And what app's icon will appear in Growl notifications?
APPICON=&amp;quot;/Users/chris/bin/Time-Machine.icns&amp;quot;
# --- Do it! ---
# Check if $DEST is mounted. Otherwise quit script
DESTMOUNTED=`mount | grep &amp;quot;$DEST&amp;quot;`
if [ -z &amp;quot;$DESTMOUNTED&amp;quot; ]; then
/bin/growlnotify --name &amp;quot;$GROWLNAME&amp;quot; --image &amp;quot;$APPICON&amp;quot;
--message &amp;quot;$DEST is not mounted.&amp;quot; &amp;quot;Ignoring scheduled backup&amp;quot;
exit 1
fi
PROCS=`ps -A -o &amp;quot;pid=,command=&amp;quot;`
MYNAME=&amp;quot;$0&amp;quot;
MYBASENAME=`basename $MYNAME`
MYPID=$$
# The next line works like so:
# * take the process list (for all users),
# * filter *in* processes named like this script (making sure we're on word boundaries),
# * filter *out* (-v) the one that *is* this script (by PID), and finally
# * filter *out* the grep commands themselves.
MERUNNING=`echo &amp;quot;$PROCS&amp;quot; | grep -E -e &amp;quot;b$MYBASENAMEb&amp;quot;
| grep -E -v &amp;quot;b$MYPIDb&amp;quot; | grep -v grep`
# Then, if anything's left (i.e. MERUNNING isn't a zero-length string...)
if [ ! -z &amp;quot;$MERUNNING&amp;quot; ]; then
/bin/growlnotify --name &amp;quot;$GROWLNAME&amp;quot; --image &amp;quot;$APPICON&amp;quot;
--message &amp;quot;Another backup seems to be in progress&amp;quot; &amp;quot;Ignoring scheduled backup&amp;quot;
exit 1
fi
EXPEXCLUDES=`eval &amp;quot;echo --exclude={$EXCLUDE} &amp;quot;`
STARTTIME=`date &amp;quot;+%Y-%m-%d %H:%M:%S&amp;quot;`
/bin/growlnotify --name &amp;quot;$GROWLNAME&amp;quot; --image &amp;quot;$APPICON&amp;quot; --message &amp;quot;Backup of $HOST has been startet at $STARTTIME&amp;quot;
echo &amp;quot;Backup of $HOST has been startet at $STARTTIME&amp;quot; &amp;gt;&amp;gt; $ERRORS
for D in $SOURCES; do
mkdir -p $BACKUPPATH/$DATE.inProgress$D
rsync -aH $EXPEXCLUDES --link-dest=$BACKUPPATH/current$D $D/ $BACKUPPATH/$DATE.inProgress$D 2&amp;gt;&amp;gt;&amp;quot;$ERRORS&amp;quot;
done
FINISHTIME=`date &amp;quot;+%Y-%m-%d %H:%M:%S&amp;quot;`
NUMERRORS=`awk '{x++}END{ print x}' $ERRORS`
NUMERRORS=$[$NUMERRORS-1]
/bin/growlnotify --name &amp;quot;$GROWLNAME&amp;quot; --image &amp;quot;$APPICON&amp;quot; -s
--message &amp;quot;Completed backup of $HOST at $FINISHTIME. There were $NUMERRORS errors.&amp;quot; &amp;quot;$HOST has been backed up to $DEST.&amp;quot;
echo &amp;quot;Completed backup of $HOST at $FINISHTIME. There were $NUMERRORS errors.&amp;quot; &amp;gt;&amp;gt; $ERRORS
mv $BACKUPPATH/$DATE.inProgress $BACKUPPATH/$DATE
rm -f &amp;quot;$BACKUPPATH/current&amp;quot; &amp;amp;&amp;amp; ln -nsf &amp;quot;$BACKUPPATH/$DATE/&amp;quot; &amp;quot;$BACKUPPATH/current&amp;quot;
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Posteingang Null: Wie ich meine E-Mails bearbeite</title><link>https://christianbaer.me/post/2010/09/posteingang-null-wie-ich-meine-e-mails-bearbeite/</link><pubDate>Sat, 18 Sep 2010 10:10:05 +0000</pubDate><guid>https://christianbaer.me/post/2010/09/posteingang-null-wie-ich-meine-e-mails-bearbeite/</guid><description>&lt;p&gt;Da ich relativ viele E-Mails erhalte brauchte ich irgendwie ein System um damit klar zu kommen. Vor einigen Jahren bin ich auf einen Vortrag von &lt;a href="http://www.merlinmann.com/"&gt;Merlin Mann&lt;/a&gt; gestoßen, in welchem er sein &lt;a href="http://www.slideshare.net/merlinmann/inbox-zero-actionbased-email"&gt;System Inbox Zero vorstellt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Das System funktioniert für mich sehr gut und im Folgenden werde ich erläutern, wie ich es umsetze.&lt;/p&gt;
&lt;p&gt;Meine E-Mails habe ich auf einem IMAP-Server liegen. Der Server hat 40 GB Platz und bietet daher genügend Ressourcen für ein großes E-Mail-Archiv. Ankommende E-Mails werden durch Sieve gefiltert.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://christianbaer.me/post/2010/09/posteingang-null-wie-ich-meine-e-mails-bearbeite/thunderbird-folders-inboxzero.png" &gt;&lt;img src="https://christianbaer.me/post/2010/09/posteingang-null-wie-ich-meine-e-mails-bearbeite/thunderbird-folders-inboxzero_hu_3af327c069a840ba.png" width="220" height="339" /&gt;&lt;/a&gt;
&lt;figcaption&gt;
&lt;small&gt;
Screenshot von Thunderbird welcher meine Ordnerstruktur zeigt
&lt;/small&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Auf dem Server habe ich folgende Ordnerstruktur angelegt:&lt;/p&gt;
&lt;p&gt;Im &lt;strong&gt;Posteingang&lt;/strong&gt; landen alle E-Mails, die nach dem Filtern übrig bleiben. Um diese kümmere ich mich immer, wenn ich den Eingang durchsehe.&lt;/p&gt;
&lt;p&gt;Im &lt;strong&gt;Entwürfe&lt;/strong&gt;-Ordner liegen evt. verfasste E-Mails, die noch nicht verschickt wurden. Sollte klar sein ;)&lt;/p&gt;
&lt;p&gt;Der &lt;strong&gt;Gesendet&lt;/strong&gt;-Ordner sollte auch klar sein.&lt;/p&gt;
&lt;p&gt;Der &lt;strong&gt;Archiv&lt;/strong&gt;-Ordner ist, wie der Name schon sagt, mein zentrales Archiv. In diesem Ordner landen alle E-Mails, die nicht gelöscht wurden.&lt;/p&gt;
&lt;p&gt;Der &lt;strong&gt;Junk&lt;/strong&gt;-Ordner enthält gelegentlich mal Spam.&lt;/p&gt;
&lt;p&gt;Der &lt;strong&gt;Papierkorb&lt;/strong&gt; enthält gelöschte E-Mails.&lt;/p&gt;
&lt;p&gt;Der Ordner &lt;strong&gt;Buzz&lt;/strong&gt; enthält die von Sieve weggefilterten eher unwichtigen E-Mails. Hier landet alles, was ich nicht im Laufe des Tages ständig im Blick haben will (Newsletter, Rechnungen, Bestellbestätigungen, Facebook etc.).&lt;/p&gt;
&lt;p&gt;Die Ordner im Screenshot mit den** Ziffern** davor, sind Suchordner aus Thunderbird. Dazu komme ich später noch.&lt;/p&gt;
&lt;p&gt;In den Posteingang schaue ich mehrmals am Tag und bearbeite alle E-Mails darin. Den Buzz-Ordner öffne ich meist erst, wenn ich Abends zu Hause bin und ein Bisschen Zeit habe.&lt;/p&gt;
&lt;p&gt;Als E-Mail-Client nutze ich schon seit Jahren Thunderbird. Er wurde mit der zeit immer besser und bietet eine gute Anpassbarkeit durch Erweiterungen aber hat gleichzeitig ein sehr aufgeräumtes Interface.&lt;/p&gt;
&lt;p&gt;Er bietet die Möglichkeit E-Mails mit &amp;ldquo;Schlagworten&amp;rdquo; zu versehen. Ich habe die voreingestellten Schlagworte gelöscht und mir die Schlagworte &amp;ldquo;Antworten&amp;rdquo;, &amp;ldquo;Zu erledigen&amp;rdquo;, &amp;ldquo;Wichtig&amp;rdquo; und &amp;ldquo;Warten&amp;rdquo; angelegt. Thunderbird nummeriert diese durch und man kann dann zum Beispiel die Taste 3 drücken um eine E-Mail als wichtig zu markieren. Des Weiteren bietet er die Möglichkeit, durch einen Druck auf die Taste A eine E-Mail ins Archiv zu verschieben. So ist es möglich, E-Mails in relativ kurzer Zeit durch zu arbeiten.&lt;/p&gt;
&lt;p&gt;Wenn jetzt eine E-Mail ankommt, wird sie zuerst auf dem Server gefiltert.&lt;/p&gt;
&lt;p&gt;Wenn auf sie kein Filter zutrifft, landet sie im Posteingang.&lt;/p&gt;
&lt;p&gt;Wenn ich sie gelesen habe, kommt sie ins Archiv.&lt;/p&gt;
&lt;p&gt;Wenn ich darauf antworten muss und das innerhalb von zwei Minuten erledigen kann, antworte ich sofort und schiebe die E-Mail ins Archiv.&lt;/p&gt;
&lt;p&gt;Wenn eine Antwort länger dauern würde, wird sie mit dem Schlagwort &amp;ldquo;Antworten&amp;rdquo; versehen und kommt ins Archiv. Gleichzeitig lege ich mir einen &lt;a href="http://debilux.org/56-remember-the-milk-als-aufgabenverwaltung/"&gt;Eintrag auf meiner ToDo-Liste&lt;/a&gt; an.&lt;/p&gt;
&lt;p&gt;Das Gleiche gilt, wenn die E-Mail einen Arbeitsauftrag enthält. Sie wird dann jedoch mit &amp;ldquo;Zu erledigen&amp;rdquo; markiert.&lt;/p&gt;
&lt;p&gt;Wenn eine E-Mail Informationen enthält, die kurzzeitig wichtig sind (z.B. für ein Telefonat, was ich führen muss) wird sie als &amp;ldquo;Wichtig&amp;rdquo; markiert.&lt;/p&gt;
&lt;p&gt;Wenn ich eine E-Mail verschickt habe und auf eine Antwort warte, markiere ich die gesendete E-Mail als &amp;ldquo;Warten&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Wenn sich der Status einer E-Mail ändert, weil ich z.B. einen Auftrag erledigt habe, dann löscht ein Druck auf die Taste 0 (Null) alle einer E-Mail zugewiesenen Schlagworte.&lt;/p&gt;
&lt;p&gt;Mit diesem System bleibt der Posteingang übersichtlich und leer und ich habe trotzdem die Möglichkeit, mir anhand der Suchordner in Thunderbird die entsprechenden E-Mails auflisten zu lassen. Die Zahlen in den Namen der Suchordner erinnern mich an den entsprechenden Shortcuts zum zuweisen des Schlagworts.&lt;/p&gt;
&lt;p&gt;Thunderbird legt normalerweise im Archiv-Ordner noch Jahresordner an in die E-Mails normalerweise sortiert werden. Um dieses Verhalten zu ändern gibt es die &lt;a href="https://addons.mozilla.org/de/thunderbird/addon/14896/"&gt;Erweiterung Message Archive Options&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wenn ich unterwegs bin, greife ich entweder über das iPhone oder meinen Webmailer auf die E-Mails zu. Dadurch, dass die E-Mails und Ordner auf dem Server liegen, kann ich dann genau so arbeiten wie mit Thunderbird. Was nicht funktioniert, sind die Schlagworte aber das stört mich unterwegs nicht. Wenn ich z.B. am iPhone eine E-Mail aus dem Blickfeld haben möchte, schiebe ich sie erst mal in den Buzz-Ordner und kümmere mich zu Hause wieder darum.&lt;/p&gt;
&lt;p&gt;Wahrscheinlich klingt das jetzt alles furchtbar kompliziert aber eigentlich ist es das überhaupt nicht. Wenn man sich die Routine des Durchsehens und Bearbeitens einmal angewöhnt hat geht sie relativ leicht von der Hand und durch die Shortcuts ist der Posteingang auch relativ schnell wieder leer. :)&lt;/p&gt;</description></item><item><title>fuck you very much</title><link>https://christianbaer.me/post/2010/09/fuck-you-very-much/</link><pubDate>Mon, 06 Sep 2010 16:56:39 +0000</pubDate><guid>https://christianbaer.me/post/2010/09/fuck-you-very-much/</guid><description>&lt;blockquote&gt;
&lt;p&gt;“fuck you is the new thank you”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://fuckyouverymuch.dk/"&gt;fyvm&lt;/a&gt; ist derzeit eines meiner Lieblingsblogs. Pro Post gibt es ein Foto und einen Satz. Unterhält und regt manchmal zum nachdenken an.&lt;/p&gt;</description></item><item><title>Remember The Milk als Aufgabenverwaltung</title><link>https://christianbaer.me/post/2010/09/remember-the-milk-als-aufgabenverwaltung/</link><pubDate>Mon, 06 Sep 2010 16:52:30 +0000</pubDate><guid>https://christianbaer.me/post/2010/09/remember-the-milk-als-aufgabenverwaltung/</guid><description>
&lt;figure&gt;
&lt;a href="https://christianbaer.me/post/2010/09/remember-the-milk-als-aufgabenverwaltung/screenshot-rtm.png" &gt;&lt;img src="https://christianbaer.me/post/2010/09/remember-the-milk-als-aufgabenverwaltung/screenshot-rtm_hu_dfa8020d54c77fbb.png" width="700" height="333" /&gt;&lt;/a&gt;
&lt;figcaption&gt;
&lt;small&gt;
Screenshot von &lt;a href="https://rememberthemilk.com"&gt;Remember The Milk&lt;/a&gt;
&lt;/small&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;RTM ist über den Browser von jedem Rechner aus erreichbar und bietet außerdem Apps für iPhone, Android und Blackberry an.&lt;/p&gt;
&lt;p&gt;Eine Stärke von Remember The Milk ist das offene Konzept. Man wird nicht in irgendwelche Organisationssysteme gezwungen sondern kann sich anhand von Listen alles zusammen bauen, was man braucht.&lt;/p&gt;
&lt;p&gt;Eine weitere Stärke sind die dynamischen Listen. Anhand von bestimmten Suchkriterien kann man sich hier verschiedenste Aufgaben dynamisch zusammen fassen lassen. Wo das praktisch ist, werde ich gleich noch zeigen.&lt;/p&gt;
&lt;p&gt;Ansonsten kann man Aufgaben mit Tags versehen, Orte hinzufügen, an Andere delegieren und noch vieles mehr.&lt;/p&gt;
&lt;p&gt;Die Standard-Liste nennt sich Eingang. Hier kommen alle Aufgaben rein, die entweder noch keiner Liste zugeordnet oder per E-Mail importiert wurden. Ich organisiere meine Aufgaben dann auf folgenden Listen: &amp;ldquo;Arbeit&amp;rdquo;, &amp;ldquo;Persönlich&amp;rdquo;, &amp;ldquo;Dieses Jahr&amp;rdquo; und &amp;ldquo;Irgendwann/Vielleicht&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Zusätzlich lege ich &amp;ldquo;Smartlists&amp;rdquo; an, welche meine Aufgaben nach bestimmten Kriterien filtern und sie mir anzeigen. #heute, #morgen und #überfällig sollten selbsterklärend sein. @büro und @home unterscheiden Aufgaben nach Büro (dienstlich) und zu Hause. @einkaufen zeigt mir alle Dinge, die ich besorgen muss und @telefon sind alle Telefonate die ich führen muss. Wenn ich bei einer Aufgabe auf Zuarbeit bzw. auf Rückmeldung von Dritten angewiesen bin, erscheint sie in der Liste @warten.&lt;/p&gt;
&lt;p&gt;Die Liste #dash zeigt alle Aufgaben, die bisher noch im Eingang liegen, und denen ich keinen Ort und keinen Zieltermin zugewiesen habe.&lt;/p&gt;
&lt;p&gt;So habe ich immer alle Aufgaben im Blick und kann kontext- bzw. ortsabhängig genau das anzeigen lassen, was ich im Augenblick erledigen kann.&lt;/p&gt;
&lt;p&gt;Anbei noch ein Listing der Suchkriterien meiner Smartlists:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;#heute:&lt;/strong&gt; due:heute OR dueBefore:Today OR (dueAfter:&amp;ldquo;today 0:00&amp;rdquo; AND dueBefore:&amp;ldquo;Now&amp;rdquo;) OR tag:&amp;ldquo;na&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;#morgen:&lt;/strong&gt; due:morgen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;#überfällig:&lt;/strong&gt; dueBefore:Today OR (dueAfter:&amp;ldquo;today 0:00&amp;rdquo; AND dueBefore:&amp;ldquo;Now&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;@büro:&lt;/strong&gt; location:@büro AND NOT tag:@warten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;@home:&lt;/strong&gt; location:@home AND NOT tag:@warten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;@einkaufen:&lt;/strong&gt; tag:@einkaufen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;@telefon:&lt;/strong&gt; tag:@telefon or name:anrufen and not tag:@warten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;@warten:&lt;/strong&gt; tag:@warten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;#dash:&lt;/strong&gt; (dueBefore:today OR due:never OR isLocated:false OR list:Eingang) NOT (list:&amp;ldquo;Irgendwann/Vielleicht&amp;rdquo; OR list:&amp;ldquo;Dieses Jahr&amp;rdquo; OR list:&amp;quot;@einkaufen&amp;quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ich denke, das Prinzip wird klar und sollte sich auch auf andere Aufgabenverwaltungen übertragen lassen. Ich kann RTM nur empfehlen und bin seit zwei Jahren vollends zufrieden damit.&lt;/p&gt;</description></item><item><title>Tagebuch führen für Nerds</title><link>https://christianbaer.me/post/2010/09/tagebuch-f%C3%BChren-f%C3%BCr-nerds/</link><pubDate>Sat, 04 Sep 2010 09:58:35 +0000</pubDate><guid>https://christianbaer.me/post/2010/09/tagebuch-f%C3%BChren-f%C3%BCr-nerds/</guid><description>&lt;p&gt;Ich finde, es ist immer schön, wenn man sich zurück erinnern kann, was man vor ein paar Monaten, Jahren so gemacht hat. Das ruft Erinnerungen an schöne Momente zurück oder erinnert daran, dass man dieses oder jenes beim nächsten Mal anders machen wollte.&lt;/p&gt;
&lt;p&gt;Für sowas eignet sich ein Tagebuch. Doch Tagebuch führen ist ja sowas von 1980. Man muss das Buch immer dabei haben, sitzt dann vor einer leeren Seite und verliert irgendwann die Lust zu schreiben.&lt;/p&gt;
&lt;p&gt;Ich habe mir folgendermaßen Abhilfe geschaffen. Ich habe in einer einfachen Textdatei ein 80-Char-Diary gestartet, in welchem ich in 80 Zeichen meinen Tag zusammen fasste. Ein Eintrag für die Abendstunden war an jedem Tag auf meiner ToDo-Liste und so gewöhnte ich mich daran, dass jeden Tag zu schreiben.&lt;/p&gt;
&lt;p&gt;Ich merkte in den letzten Wochen, dass mir 80 Zeichen nicht ausreichen und ich mehr schreiben will. Außerdem war es langweilig jedes Mal die Textdatei zu öffnen, zu schreiben, sie zu schließen.&lt;/p&gt;
&lt;p&gt;Ich habe mir also ein kleines Bash-Script für dieses &amp;ldquo;Problem&amp;rdquo; geschrieben&amp;quot;.&lt;/p&gt;
&lt;p&gt;Wird das Script ohne Parameter aufgerufen, stellt es mir die Frage &amp;ldquo;Was ist heute passiert?&amp;rdquo;, ich tippe meinen Text ein und er wird automatisch an die Datei angehängt. Eine Linie dient hierbei als Anhaltspunkt für die alte 80-Zeichen-Grenze.&lt;/p&gt;
&lt;p&gt;Der Parameter &amp;ldquo;-s&amp;rdquo; gibt aus, seit wievielen Tagen ich das Tagebuch schon führe. Über &amp;ldquo;-p&amp;rdquo; kann ich mir das Tagebuch in der Shell ausgeben lassen und über &amp;ldquo;-e&amp;rdquo; wird es mit dem Editor nano bearbeitet.&lt;/p&gt;
&lt;p&gt;Ich komme damit bisher super klar und bin für Verbesserungsvorschläge offen.&lt;/p&gt;
&lt;p&gt;Ihr könnt &lt;a href="https://christianbaer.me/files/diary.sh.zip"&gt;diary.sh als zip-File herunterladen&lt;/a&gt; oder Euch das Listing unten kopieren. In jedem Fall muss aber die Variable FILENAME noch an Speicherchort Eurer Datei angepasst werden.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
# /home/chris/bin/diary.sh
FILENAME=&amp;quot;/media/daten/Ablage/diary&amp;quot;
COUNTDAYS=`cat $FILENAME | wc -l`
while [ $# -gt 0 ]; do # Until you run out of parameters . . .
case &amp;quot;$1&amp;quot; in
-e|--edit)
nano $FILENAME
exit 0
;;
-p|--print)
cat $FILENAME
exit 0
;;
-s|--status)
echo &amp;quot;Du führst das Tagebuch seit &amp;quot;$COUNTDAYS&amp;quot; Tagen.&amp;quot;
exit 0
;;
*)
;;
esac
shift # Check next set of parameters.
done
echo &amp;quot;Du führst das Tagebuch seit &amp;quot;$COUNTDAYS&amp;quot; Tagen.&amp;quot;
echo
echo &amp;quot;Was ist heute passiert?&amp;quot;
echo &amp;quot;--------------------------------------------------------------------------------&amp;quot;
read DIARYTEXT
echo `date +%y%m%d%a`&amp;quot; |&amp;quot;$DIARYTEXT &amp;gt;&amp;gt; $FILENAME
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Bookshelf Porn</title><link>https://christianbaer.me/post/2010/08/bookshelf-porn/</link><pubDate>Mon, 23 Aug 2010 22:01:04 +0000</pubDate><guid>https://christianbaer.me/post/2010/08/bookshelf-porn/</guid><description>&lt;p&gt;Ich liebe Bücher. Ich liebe es, sie zu lesen, zu fühlen und zu riechen. Ein Bücherregal ist für mich ein absolutes must-have in jedem Wohnzimmer und sagt so viel Persönliches über die Bewohner_innen aus.&lt;/p&gt;
&lt;p&gt;Umso mehr freute ich mich, als ich vor ein paar Wochen auf &lt;a href="http://bookshelfporn.com/"&gt;Bookshelf Porn&lt;/a&gt; gestoßen bin.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A collection of all the best bookshelf photos for people who &lt;em&gt;heart&lt;/em&gt; bookshelves.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Diese Seite macht nichts anderes als Fotos von Bücherregalen, Buchhandlungen und Bibliotheken zu posten und lädt zum träumen ein. Für Menschen wie mich eine absolute Bereicherung im Feedreader.&lt;/p&gt;</description></item><item><title>"Wie ich mein Leben regele" oder auch "Wer viel zu tun hat, kann viel vergessen..."</title><link>https://christianbaer.me/post/2010/08/wie-ich-mein-leben-regele-oder-auch-wer-viel-zu-tun-hat-kann-viel-vergessen.../</link><pubDate>Thu, 19 Aug 2010 23:03:44 +0000</pubDate><guid>https://christianbaer.me/post/2010/08/wie-ich-mein-leben-regele-oder-auch-wer-viel-zu-tun-hat-kann-viel-vergessen.../</guid><description>&lt;p&gt;Ich bin in den letzten Jahren politisch immer aktiver geworden und habe immer mehr Verantwortungen übernommen. Zusammen mit einem Job in dem ich viel Unterwegs bin und ebenfalls sehr viel Verantwortung trage, brachte dies die Notwendigkeit mit sich, ein System zu finden, um alles geregelt zu bekommen.&lt;/p&gt;
&lt;p&gt;Nachdem ich mich viel mit den Themen &amp;ldquo;Produktivität&amp;rdquo;, &amp;ldquo;Selbstmanagement&amp;rdquo; und &amp;ldquo;Lifehacking&amp;rdquo; beschäftigt, Bücher gelesen und einige Blogs abonniert hatte, habe ich mittlerweile ein recht verlässliches System gefunden, welches ich gerne nutze und welches mir hilft meine Aufgaben im Griff zu haben, meine Online- und Offline-Post zu bewältigen und ansonsten alles zu verwalten, was so in mein Leben tritt.&lt;/p&gt;
&lt;p&gt;In den kommenden Tagen oder Wochen werde ich hier einfach mal niederschreiben, welche Erfahrungen ich gemacht habe und welche Wege ich für mich gefunden habe um mein Leben in den Griff zu bekommen.&lt;/p&gt;
&lt;p&gt;Um Euch den Einstieg ins Thema zu erleichtern und die Wartezeit zu verkürzen, anbei  mal ein paar Literaturtipps.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Zen To Done&amp;rdquo; oder ZTD ist ein leicht zu erlerndes Selbstmanagement-System von &lt;a href="http://zenhabits.net/"&gt;Leo Babauta&lt;/a&gt;. Bei imgriff gibt es eine &lt;a href="http://imgriff.com/serien/zen-to-done/"&gt;Artikel-Serie&lt;/a&gt; dazu und das auf deutsch übersetzte Buch zum Download. ZTD war das erste Buch, welches ich zum Thema gelesen habe. Es basiert auf auf dem System Getting Things Done und ist weniger restriktiv als dieses. Man kann sich die Dinge raussuchen, die einem passen und kann die Sache so langsam und einfach anlaufen lassen. Bei Orangetopic gibt es einen &lt;a href="http://www.orangetopic.de/zen-to-done-der-praxistest-neue-serie-auf-orangetopic/"&gt;25-teiligen Praxistest von Svenja&lt;/a&gt;, die sich der selben Aufgabe gestellt hat wie ich.&lt;/p&gt;
&lt;p&gt;Das Buch &amp;ldquo;Gettings Things Done&amp;rdquo; oder die deutsche Version &amp;ldquo;&lt;a href="http://www.amazon.de/Wie-Dinge-geregelt-kriege-Selbstmanagement/dp/3492240607/ref=sr_1_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1282078511&amp;amp;sr=8-2"&gt;Wie ich die Dinge geregelt kriege&lt;/a&gt;&amp;rdquo; von David Allen ist soetwas wie die Bibel für die &amp;ldquo;Lifehacker&amp;rdquo; weltweit. Viele Menschen finden &amp;ldquo;GTD&amp;rdquo; sehr aufwändig und scheitern an sich selbst, da sie nicht diszipliniert genug sind um alles umzusetzen. Ich habe es nach erst gelesen, nachdem ich ZTD schon ca. ein Jahr angewandt habe. Es ist wirklich komplexer als ZTD aber bot mir auch noch viele Denkansätze um &amp;ldquo;meinen eigenen Weg&amp;rdquo; weniger holprig zu gestalten.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linktipps:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.43folders.com/"&gt;43 Folders&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lifehacker.com/"&gt;Lifehacker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://imgriff.com/"&gt;imgriff.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zenhabits.net/"&gt;zen habits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blatternet.ch/blog/"&gt;blatternet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.selbstadministration.de/"&gt;Selbstadministration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lifehack.org/"&gt;Stepcase Lifehack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ein Neuanfang</title><link>https://christianbaer.me/post/2010/07/ein-neuanfang/</link><pubDate>Sun, 11 Jul 2010 20:51:31 +0000</pubDate><guid>https://christianbaer.me/post/2010/07/ein-neuanfang/</guid><description>&lt;p&gt;Als ich 2005 meine Ausbildung begann und alleine in eine neue Stadt zog, begann ich zu bloggen. &lt;a href="http://chris-b-online.de/blog"&gt;chris-b-online&lt;/a&gt; lief damals unter dem Titel “Freie Software, Politik und der Wahnsinn des Alltags” und sollte alles beherbergen, was mich in meinem Leben bewegt. Mein Leben befand sich damals im Umbruch und es kamen immer mehr Interessensfelder hinzu. Ich lernte über das Netz interessante Menschen kennen und entwickelte mich in dieser Zeit auch selbst weiter. Irgendwann verkam das schreiben zur Pflicht und der Zwang zur Blockade. Mittlerweile ist der alte Blog zu einem Twitterarchiv verkommen. Gelegentlich schauen noch mal Menschen nach längst veralteten Tech-Artikeln aber wirklich etwas Neues geschieht dort nicht mehr.&lt;/p&gt;
&lt;p&gt;Mein Leben befindet sich gerade wieder in einem Umbruch. Und deshalb wage ich einen Neuanfang. Hier auf debilux soll es nicht um Software gehen, nicht um polemische Kommentare des Zeitgeschehens, und auch nicht um Nebensächliches. Hier geht es um mich. &lt;a href="../../"&gt;debilux&lt;/a&gt; soll für mich ein Platz zum Denken sein. Ob das hier philosophisch wird oder nicht, müsst Ihr beurteilen. Mir geht es darum, meine Gedanken nieder zu schreiben und mich von Anderen zum Nachdenken anregen zu lassen. Die Politik wird mit Sicherheit in jeden Text einfließen, soll hier aber nicht Selbstzweck sein. Ich möchte denken, schreiben, reflektieren und lernen. Ihr seid recht herzlich dazu eingeladen, mich auf diesem Weg zu begleiten.&lt;/p&gt;</description></item></channel></rss>