Alle Notizen stehen in einer Übersicht auch hier.

API-Key Authentifizierung (Spring Boot 3)

07 Juni 2025

API-Key Authentifizierung

(Spring Boot 3)

Die Security-Konfiguration hat sich in Spring Security 6 deutlich verändert. Beispielsweise wurde die WebSecurityConfigurerAdapter-Klasse entfernt und durch eine SecurityFilterChain-Bean ersetzt.

Beispielprojekt

Das Projekt realisiert einen Spring Boot Webservice. Der Service bietet frei zugängliche und administrative Resourcen an. Die administrativen Resourcen benötigen einen Api-Key zur Authentifikation des Benutzers.

bild 001
Abbildung 1. spring initializr
Dieses Projekt wird intern verwendet. Das Passwort ist in Form eines Hash in der Konfiguration abgelegt. Grundsätzlich und vor allem bei öffentlich bereitgestellten Resourcen sollten Passwörter in einem Key-Vault, z.B. einem Hashicorp Vault, einem OpenBao-Vault oder etwas ähnlichem vorgehalten werden.

Konfiguration

Configuration-SecurityFilterChain (Ausschnitt)
:
:
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfiguration
{

   private final ApiKeyAuthenticationFilter authenticationFilter;   (1)

   @Bean
   public SecurityFilterChain securityFilterChain( HttpSecurity http ) throws Exception
   {
      return http
            .sessionManagement( session -> session.sessionCreationPolicy( SessionCreationPolicy.STATELESS ) )     (2)
            .formLogin(AbstractHttpConfigurer::disable)  (3)
            .csrf( AbstractHttpConfigurer :: disable )  (4)
            .securityMatcher( "/**" )       (5)
            .authorizeHttpRequests( registry -> registry
                  .requestMatchers( AntPathRequestMatcher.antMatcher( "/internal/**" ) ).authenticated()        (6)
                  .anyRequest().permitAll()     (7)
            )
            .addFilterBefore( authenticationFilter, UsernamePasswordAuthenticationFilter.class )        (8)
            .build();
   }

}
:
:
1 ApiKeyAuthenticationFilter ist ein Requestfilter, der den eingehenden Request anhand der Security-Regeln filtert und bei Bedarf die Authentifizierungslogik anwendet. Dazu wird die Methode "doFilterInternal" überschrieben, die als Parameter u.a. die FilterChain-Bean und den Request enthält.
2 Stateless Sessions stellen sicher, dass jeder Request neu authetifiziert wird, da keine Cookies verwendet werden.
3 Damit wird die Out-of-the-box Authentifizierung über ein Formular, d.h. die Weiterleitung auf eine Default-Loginseite verhindert.
4 Spring Security schützt standardmäßig vor CSRF-Angriffen für unsichere HTTP-Methoden, wie z. B. eine POST-Anfrage, sodass kein zusätzlicher Code erforderlich ist. Um POST-Anfragen durchführen zu können, muss CSRF disabled sein.
5 hier kann festgelegt werden, für welche Endpunkte die Sicherheitskonfiguration gültig ist (in diesem Fall für alle Endpunkte).
6 Dieser Matcher legt fest, dass alle Resourcen, die "internal" in der Url enthalten authentifiziert werden müssen.
7 Dieser Matcher legt fest, dass alle weiteren Resourcen keiner Authentifizierung unterliegen.
8 Es wird sichergestellt, dass die individuelle Filterung immer vor der sonst an erster Stelle (default) stehenden User:Password Filterung durchgeführt wird.

Controller

Der Controller enthält Resourcen, die keiner Zugangsbeschränkung unterliegen und administrative Resourcen, die mit einem Api-Key abgesichert werden.

Controller-Resourcen
   :
   :
   @GetMapping("/doSomething")
   public ResponseEntity<String> getDoSomething() {
      return ResponseEntity.ok("This is a public resource.");
   }

   @GetMapping("/internal/doAdmin")
   public ResponseEntity<String> getDoAdmin() {
      return ResponseEntity.ok("This is a a protected resource.");
   }
   :
   :

Filterung

ApiKeyAuthenticationFilter erbt von einem Requestfilter, der den eingehenden Request anhand der Security-Regeln filtert und bei Bedarf die Authentifizierungslogik anwendet. Dazu wird die Methode "doFilterInternal" überschrieben.

Filterung-ApiKeyAuthenticationFilter
:
:
@Component
@RequiredArgsConstructor
public class ApiKeyAuthenticationFilter extends OncePerRequestFilter
{
   private final ApiKeyAuthExtractor extractor;       (1)

   @Override
   protected void doFilterInternal( HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain filterChain ) throws ServletException, IOException
   {
      extractor.extract( request )
               .ifPresent( SecurityContextHolder.getContext() :: setAuthentication );        (2)

      filterChain.doFilter( request, response );
   }
}
:
:
1 Der Extractor ist die Klasse, die die Authentifizierung durchführt, d.h. in diesem Fall den übergebenen Api-Key überprüft.
2 Abhängig vom Ergebnis der Extractor-Klasse wird ein Request als authentifiziert bzw. nicht authentifiziert angesehen.

Authentifizierungs-Handler

ApiKeyAuthExtractor ist ein Handler, der in der Methode "extract" in diesem Fall den im Request übergebenen Key mit einem vorhandenen Wert, z.B. aus einem Key-Vault oder Properties-File vergleicht und damit eine erfolgreiche/nicht erfolgreiche Authentifizierung anzeigt.

Authentifizierung-ApiKeyAuthExtractor
:
:
   @Value("${security.key}")
   private String apiKey;

   public Optional<Authentication> handle( HttpServletRequest request) {
      String providedKey = request.getHeader("api-key");
      if (providedKey == null || !providedKey.equals(apiKey))
         return Optional.empty();

      return Optional.of(new ApiKeyAuthentication( providedKey, AuthorityUtils.NO_AUTHORITIES));
   }
:
:

Authentifizierungs-Objekt

ApiKeyAuthentication ist ein Authentifizierungs-Object, d.h. ein Token der bei einer erfolgreichen Authetifizierung erzeugt wird, d.h. wenn im Requestheader ein korrekter API-Schlüssel gefunden wird.

Authentifizierung-ApiKeyAuthentication
:
:
public class ApiKeyAuthentication extends AbstractAuthenticationToken
{
   private final String apiKey;

   public ApiKeyAuthentication(String apiKey, Collection<? extends GrantedAuthority> authorities) {
      super(authorities);
      this.apiKey = apiKey;
      setAuthenticated(true);
   }

   @Override
   public Object getCredentials() {
      return null;
   }

   @Override
   public Object getPrincipal() {
      return apiKey;
   }
}
:
:

Kubernetes Entwicklungsumgebung mit Minikube

10 Februar 2024

  • Kubernetes (K8s) ist ein Open-Source-System zur Automatisierung der Bereitstellung, Skalierung und Verwaltung von containerisierten Anwendungen.

  • "kubectl" ist die Kommandozeilen-Applikation zur Verwaltung eines Kubernetes-Clusters.

  • Minikube stellt einen lokalen Kubernetes Cluster zur lokalen Entwicklung zur Verfügung.

Setup

(Die Überschriften der einzelnen Listings sind Links auf die entsprechenden Kubernetes-Seiten)

sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl

# Download the public signing key for the Kubernetes package repositories. The same signing key is used for all repositories so you can disregard the version in the URL:

# If the folder `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
# sudo mkdir -p -m 755 /etc/apt/keyrings

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# Update apt package index, then install kubectl:

sudo apt-get update
sudo apt-get install -y kubectl
apt-get install bash-completion
source /usr/share/bash-completion/bash_completion
echo 'source <(kubectl completion bash)' >>~/.bashrc

# Wenn es keinen alias gibt:
echo 'alias k=kubectl' >>~/.bashrc

# Wenn der alias angelegt ist
echo 'complete -o default -F __start_kubectl k' >>~/.bashrc

source ~/.bashrc
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
sudo dpkg -i minikube_latest_amd64.deb
minikube start

minikube stop

Datenbanktabellen als Go-Struct abbilden

15 Oktober 2023

Standardvorgehen, um Datenbank-Daten mit Go zu lesen oder zu schreiben ist die Benutzung des "database/sql" Package. Selects werden in der Regel, d.h. wenn es sich nicht um einen einzelnen Spaltenwert handelt mit einem "struct" oder einer Liste von "structs" verarbeitet.
Ein "struct" bildet dabei jeweils eine Datenbanktabelle ab. Es ist mühsam und fehleranfällig, "structs" für jede Tabelle manuell zu pflegen.

1. Tables-To-Go

Tables-To-Go kann structs reverse aus einem vorhandenen Datenbankmodell erstellen. Dies funktioniert z.B. mit MySQL, Postgres und (über einen im Repository beschriebenen Umweg, d.h. Klonen des Repositories und Ausführen von " make sqlite3" auch) mit SQLite.

2. Setup

Tables-To-Go lässt sich mit diesem Befehl installieren:

go install github.com/fraenky8/tables-to-go@latest

Nach der Installation mit "go install" oder "make sqlite3" steht eine ausführbare Datei "tables-to-go" im Verzeichnis "~/go/bin" bereit"

3. Verwendung mit Postgres

Die structs für alle Tabellen einer Datenbank lassen sich für Postgres (dem Standardfall) mit folgendem Befehl erstellen

tables-to-go -h <ip der Datenbank> -d <DB-Name> -u <Benutzer> -p <Passwort> -pn <Go-Paketname>

oder mit weiteren Parametern

tables-to-go -v -t pg -h <ip der Datenbank> -port <DB-Port> -d <DB-Name> -u <Benutzer> -p <Passwort> -pn <Go-Paketname> -pre <Prefix> -suf <Postfix> -of <Ausgabeverzeichnis>

4. Verwendung mit SQLite3

Die structs für alle Tabellen einer Datenbank lassen sich für SQLite3 mit folgendem Befehl erstellen

tables-to-go -v -t sqlite3 -d <..Pfad/zur/Datenbank/dbname.sqlite> -of <Ausgabeverzeichnis> -suf <Postfix>

5. Beispiel

Die Tabelle "app_user" in einer Postgres-Datenbank sieht folgendermaßen aus:

DB-Tabelle

Der Befehl:

tables-to-go -v -t pg -h localhost -port 15432 -d mp3 -u psqladmin -p postgres -pn model -suf _entity -of model

erzeugt das "struct" "AppUserEntity" im Unterverzeichnis "model" (Das Verzeichnis muss bereits existieren).

package model

import (
	"database/sql"
	"time"
)

type AppUserEntity struct {
	ID        int            `db:"id"`
	UserCode  string         `db:"user_code"`
	LastName  string         `db:"last_name"`
	FirstName sql.NullString `db:"first_name"`
	Email     string         `db:"email"`
	Password  string         `db:"password"`
	Role      sql.NullString `db:"role"`
	Enabled   sql.NullBool   `db:"enabled"`
	Created   time.Time      `db:"created"`
}

RaspberryPi von USB booten

17 September 2023

Schwachstelle des RaspberryPi ist die SDCard, auf der das Betriebssystem untergebracht ist. Diese Karten sind für das Speichern von Informationen gedacht. Die ständigen Lese- und Schreibvorgänge des Betriebssystems strapazieren die Karte derartig, dass es keine Frage ist, ob Karte ausfällt, sondern nur wann das passiert.
Der RaspberryPi ab Version 3 lässt sich ohne Einschränkungen betreiben, wenn das Betriebssystem auf eine externe Festplatte ausgelagert wird. Das sollte im Idealfall eine SSD sein, da diese stromsparender als eine mechanische HDD arbeitet und auch die Gefahr eines thermischen Schadens gering ist, da in der Regel keine zusätzliche Kühlung notwendig ist.

1. RaspberryPi vorbereiten

Der RaspberryPi ist, wenn er fabrikneu in Betrieb genommen wird so eingestellt, dass er von USB bootet, sofern keine SD-Karte eingesetzt worden ist. Sollte das nicht funktionieren oder ist der Raspberry bereits in Gebrauch gewesen, würde ich eine zusätzliche SD-Karte verwenden und diese mit einem aktuellen Raspberry Pi OS versehen. Das kann man direkt herunterladen oder aber mit dem "Imager" auf die Karte übertragen.
Die Karte verwendet man dann zum Start des Raspberry und zum Aufruf der Konfiguration.

sudo raspi-config

Unter dem Menüpunkt "Advanced Options → Boot Order" lässt sich die Bootreihenfolge ändern. Danach wird die SD-Karte nicht mehr benötigt.

2. Externe USB-Platte vorbereiten

Die externe Disk muss analog zur SD-Karte mit einem Betriebssystem für den Raspberry Pi versehen werden. Verwendet man ein Raspberry Pi OS kann man dazu ebenfalls den Imager verwenden.

Optionen Imager

In den Zusatzoptionen können gleich die Zugangsdaten für den SSH-Zugfriff und das WLAN, sowie die Länder- und Tastatureinstellungen festgelegt werden.

Optionen Imager

Angeschlossen wird die externe Platte an den schnbellen blauen USB-3-Ports des Raspberry Pi (in der Version 4).

RaspberryPi OS auf Bookworm updaten

16 September 2023

Aktuell basiert die "stable" Version des https://www.raspberrypi.com/software [Raspberry Pi OS] noch auf Debian Bullseye (Debian 11) und es ist nicht sicher, wann ein Upgrade erfolgen wird. Mit folgenden Schritten kann man auf die neue Version "Bookworm" upgraden.

1. Upgrade via Terminal

Als erstes ein Backup anlegen, Daten sichern usw. !!

1.1. Altes System aktualisieren

sudo apt update
sudo apt upgrade

1.2. Sourcen anpassen

sudo nano /etc/apt/sources.list     (1)
1 In der Datei /etc/apt/sources.list alle Vorkommen von "bullseye" zu "bookworm" ändern und die einzelnen Zeilen um "…​-firmware" Einträge ergänzen.

Das Ergenis sieht dann etwa so aus:

deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware

1.3. Geänderte Quellen aktualisieren

  • Die Fragen, die während des Update-Vorganges im Terminal autauchen jeweils mit den Default-Werten (Enter) bestätigen.

  • Die Änderungs Protokolle mit "q" beenden.

sudo apt update
sudo apt upgrade

1.4. Die Distribution aktualisieren

sudo apt dist-upgrade
  • Neu Starten (reboot)

  • Die neue Version (12) kann jetzt überprüft werden:

cat /etc/debian_version

RaspberryPi - Docker installieren

16 September 2023

Docker ist mit wenigen Befehlen installiert

sudo apt update                             (1)
sudo apt upgrade                            (2)
sudo curl -sSL https://get.docker.com | sh  (3)
sudo usermod -aG docker $USER               (4)
1 Update des Systems
2 Gegebenenfalls Upgrade einzelner Pakete
3 Installation von Docker
4 Hinzufügen des aktuellen Users zur Gruppe "docker"

Ubuntu ACPI Bios Error

03 April 2023

Wenn der Rechner "normal" bootet, dabei aber Fehlermeldungen wirft:

ACPI BIOS Error (bug): Failure creating named object ...
:
.... ACPI Error: AE_ALREADY_EXISTS, During name ...
:

kann das mit der verwendeten Grafikkarte zusammenhängen. Es handelt sich um einen bekannten Ubuntu-Bug ohne weitere Auswirkungen. Die Meldungen können durch das Ändern des Log-Levels ausgeblendet und ignoriert werden.

In der Datei /etc/default/grub die Zeile

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

um loglevel=3 ergänzen. Ergebnis:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash loglevel=3"

Danach sudo update-grub ausführen.

Asciidoc - Include mit "Tags"

02 April 2023

Quellcodeabschnitte werden mit Kommentarzeichen und "tag:name[]", bzw. "end:name[]" unterteilt.

HelloWorld.java
public class HelloWorld {
    // tag::mainMethod[]
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
    // end::mainMethod[]
}

Der tag-Abschnitt kann dann im Asciidoc-Test eingefügt werden

 [source,java]
 ----
 include::HelloWorld.java[tags=mainMethod]
 ----

das ergibt dann in der Dokumentation

Text vor dem Tag
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
Text nach dem Tag

VirtualBox unter Linux Mint 21

01 April 2023

Unter Linux Mint 21 lässt sich aus den Repositories VirtualBox nur in Version 6.x installieren. So wird die aktuelle Version (7.x) direkt von VirtualBox installiert.

1. Installation des GPG-Key

wget -O- https://www.virtualbox.org/download/oracle_vbox_2016.asc | sudo gpg --dearmor --yes --output /usr/share/keyrings/oracle-virtualbox-2016.gpg

2. VirtualBox-Repository verwenden

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/oracle-virtualbox-2016.gpg] http://download.virtualbox.org/virtualbox/debian jammy contrib" | sudo tee /etc/apt/sources.list.d/virtualbox.list
# update der Paketquellen und Installation
sudo apt update
sudo apt install virtualbox-7.0

3. Extension Pack installieren

# Exakte VirtualBox-Version feststellen
vboxmanage -v | cut -dr -f1
# Extension Pack herunterladen
Oracle_VM_VirtualBox_Extension_Pack-7.0.6.vbox-extpack
wget https://download.virtualbox.org/virtualbox/7.0.6/Oracle_VM_VirtualBox_Extension_Pack-7.0.6.vbox-extpack
# Extension Pack installieren
sudo vboxmanage extpack install Oracle_VM_VirtualBox_Extension_Pack-7.0.6.vbox-extpack
# Installation des Extension Packs prüfen
vboxmanage list extpacks

4. Benutzer zur Gruppe "vboxusers" hinzufügen

sudo usermod -a -G vboxusers $USER

JBake Arbeitsumgebung einrichten

01 Februar 2023

1. Java Runtime Environment

Windows Linux

JRE-Test

  • Wenn "java -version" kein Ergebnis anzeigt, muss ein Java Runtime Environment installiert werden.

  • Es kann für Windows bei www.java.com unter diesem Link heruntergeladen und danach installiert werden.

Unter Linux ist in der Regel ein JRE vorhanden. Es kann, wenn notwendig mit "sudo apt-get install default-jre" (bei Debian basierten Distributionen) installiert werden.

2. JBake installieren

JBake wird einfach von hier heruntergeladen und in einem beliebigen Verzeichnis ausgepackt. Es ist komfortabel, den Pfad der JBake-Startdatei (Verzeichnis: bin) in den Umgebungsvariablen bekannt zu geben, um das Eintippen des Pfades in der Konsole zu vermeiden.

Windows Linux

Environment

  • Start anklicken → Umgebungsvariable eintippen, dann unter Systemeigenschaften → Umgebungsvariablen → Path → Neu den Pfad angeben, der zum Entpacken ausgewählt worden ist (Das bin-Verzeichnis, z.B. c:\Program Files\jbake-2.6.7-bin\bin)

Unter Linux kann je nach Distribution und verwendeter Shell der Pfad des bin-Verzeichnisses mit einer Ergänzung in z.B. der Datei .bashrc exportiert werden.

Danach kann in der Eingabeaufforderung oder einem Terminal überprüft werden, ob JBake ohne Angabe des Installationspfades gefunden wird.
JBake-Test

3. Git installieren

Die Versionsverwaltungssoftware Git wird nicht zum Erstellen der Webseiten benötigt. Git verwaltet die Quelldateien (Asciidoc, Markdown, HTML) für uns in Repositories lokal und auf z.B. GitHub. Sie sind dort gesichert und stehen zur Änderung, Ergänzung und nachfolgender Verwendung mit JBake bereit.

Windows Linux

Das Konsolenprogramm Git kann von dieser Adresse heruntergeladen und mit einem Doppelklick installiert werden.

Unter Linux kann git, wenn notwendig mit "sudo apt-get install git" (bei Debian basierten Distributionen) installiert werden.

Abschließend sollten noch folgende Konfigurationsbefehle ausgeführt werden, da Git sonst danach fragt und keine Befehle ausführt. In einer Konsole oder z.B. der "Windows Eingabeaufforderung" müssen die folgenden Befehle ausgeführt werden (das terminal (cmd oder Konsole kann in jedem beliebigen Verzeichnis des Rechners geöffnet werden.):

git config --global user.email "ftp@posaunenchor-urberach.de"
git config --global user.name "Posaunenchor"
  • Die Emailadresse und der Benutzername sin nicht vorgegeben, dort sollte etwas sinnvolles und gültiges eingetragen werden.

  • Lässt man "--global" weg, gelten die Einträge nur für den gerade angemeldeten Benutzer. Das ist Geschmackssache.

  • Wir arbeiten nur im Hauptbranch (master oder main), deshalb werden Branches hier nicht weiter berücksichtigt!

4. Filezilla installieren

Filezilla ist ein FTP-Programm, das zum Übertragen der fertig "gebackenen" Webseiten auf den Webserver verwendet wird.

Windows Linux

Filezilla kann z.B. von dieser Adresse in einer portablen Variante heruntergeladen und mit Doppelklick installiert werden.

Unter Linux kann filezilla, wenn notwendig mit "sudo apt-get install filezilla" (bei Debian basierten Distributionen) installiert werden.

FileZilla Serverangaben

Um einen Server einzurichten müssen nur die gelb hinterlegten Felder mit den bekannten Angaben ausgefüllt werden.

FileZilla erklärt sich eigentlich selber. Server werden im Servermanager angelegt und dann oben links ausgewählt. Ist die Verbindung aufgebaut können unten links auf dem lokalen Rechner z.B. Dateien oder Verzeichnisses ausgewählt werden und dann mit einem rechten Mausklick und dem nachfolgenden Dialog auf den Server, der unten rechts angezeigt wird hochgeladen werden - fertig.

FileZilla Fenster

Notizen zu JBake

31 Januar 2023

JBake ist ein Generator statischer Webseiten. Dabei werden aus verschiedenen Quelldateien (Asciidoc, Markdown, HTML) statische HTML-Seiten auf dem lokalen Rechner erzeugt. Die fertigen Seiten werden dann per FTP z.B. auf gemieteten Webspace übertragen und von einem Webserver angezeigt.
Statische Webseiten sind lediglich eine Sammlung von Dateien und lassen sich mit minimalem Aufwand hosten. HTML- und CSS-Elemente werden direkt bei einer Veränderung des Codes gerendert und erst nach diesem "Prerendering" auf dem Webserver bereitgestellt. Dadurch wird die Performance des Webauftrittes erhöht, die Komplexität ist generell geringer und die statischen Seiten bieten keine Angriffspunkte, wie dies zum Beispiel bei einem CMS (z.B. Wordpress) der Fall ist.

1. JBake Quickstart

Die Dokumentation für JBake 2.6.7 enthält einen Quickstart Guide, in dem beschrieben ist, wie mit wenigen Befehlen ein neues JBake Projekt erzeugt werden kann. Die folgenden Konsolenbefehle reichen dafür aus:

$ mkdir project        (1)
$ cd project
$ jbake -i             (2)
($ ODER: jabake -i -t groovy mit Groovy-Templates)
$ jbake -b -s          (3)
1 Anlegen eines Projektverzeichnises und Wechsel in dieses Verzeichnis.
2 Initialisieren des Projektes (Defaulttemplatesprache ist freemarker, wenn Groovy-Templates verwendet werden sollen mit dem Zusatz -t groovy)
3 Fertigstellen der vorhandenen Seiten und Starten des internen Servers. Die Seiten können nun im Browser unter der Adresse http://localhost:8820 (oder einem anderen Port, wenn dies in der properties-Datei angegeben ist.) angezeigt werden. Der JBake Server läuft im Watch-Mode und aktualisiert die bearbeiteten Seiten selbständig.

2. JBake Projektverzeichnis

projektverzeichnis
|-- assets
|  |-- css
|  |-- fonts
|  |-- img
|  |-- js
|-- content
|  |-- blog
|  |   |-- 2022
|  |   |-- 2023
|  |-- image
|-- output
|-- templates
  • assets - Verzeichnis mit allen für das Projekt statischen Dateien in Unterverzeichnissen, z.B. Javascript-Dateien, CSS-Dateien, Images

  • content - Inhalt der Webseiten, d.h. einzelne Asciidoc, Markdown oder HTML-Dateien. Das Verzeichnis "blog" enthält die Artikel (Posts) der Webseite. Es kann zur besseren Verwaltbarkeit in weitere Unterverzeichnisse aufgeteilt sein. Je nach Umfang ist es denkbar, auf Ebene von "blog" auch ein Verzeichnis "pages" anzulegen, das einzelne Seiten und Unterseiten enthält, wenn es der Übersicht dient.

  • output - Gerenderte Dateien, die mittels FTP auf den Wepräsenz-Server übertragen werden können.

  • templates - JBake Vorlagen-Dateien, aus denen JBake Seiten und Artikel erzeugt.

3. JBake Properties

Die Erstellung der Webseiten lässt sich mit der Datei "jbake.properties" beeinflussen. Auf die einzelnen Einträge kann in den Templates mit Platzhaltern zugrgriffen werden. Sie ist in der JBake Dokumentation zur Konfiguration beschrieben.

JBake enthält eine Default-Konfiguration (default.properties), die in der individuellen Konfiguration (jbake.properties) überschrieben werden können. Die Konfiguration kann Kommentare enthalten. Dafür wird die entsprechende Zeile mit einem "#"" auskommentiert.

Eintrag Beschreibung

site.host=https://eulon.de

Host der Webseiten

index.file=index.html
archive.file=archive.html
feed.file=feed.xml
sitemap.file=sitemap.xml

Default-Dateinamen

asset.folder=site/assets
content.folder=site/content
template.folder=site/templates

Namen der Projekt-Unterverzeichnisse (jeweils die Default-Werte)

render.feed=false
render.index=false
render.archive=false
render.feed=false
render.tags=false
render.sitemap=false

welche Content unabhängigen Seiten sollen angelegt werden?

template.index.file=index.gsp
template.archive.file=archive.gsp
template.tag.file=tags.gsp
template.sitemap.file=sitemap.gsp
template.post.file=post.gsp
template.page.file=page.gsp
template.feed.file=feed.gsp

Groovy-Vorlagendateien (jeweils die Default-Werte. Wird kein Groovy verwendet, können diese Einträge entfallen.)

4. JBake Templates

JBake verwendet je nach Initialisierung eines Projektes verschiedene Sprachen in den Templates, die zur Erstellung der eigentlichen Webseiten verwendet werden. Das sind Freemarker, Groovy, Thymeleaf oder Jade, die entsprechend in den Templates eingebettet sind.

Es sind Templates für verschiedene Seiten enthalten, die nicht direkt dem zu erstellenden Content zuzuordnen sind, z.B. index, archive, feed oder sitemap. Jede dieser Dateien kann beim rendern der Seiten übersprungen werden. Dazu werden sie in der Konfigurationsdatei deaktiviert (z.B. render.archive=false).
Weitere Templates werden zur Erzeugung von z.B. header, footer und menu verwendet. Diese sind in den Seiten-Templates inkludiert.
Weitere Konfigurationsmöglichkeiten sind in der JBake Dokumentation zur Konfiguration beschrieben.

Virtuelle Umgebungen in Python

29 September 2022

  • Bei der Entwicklung mit Python immer mit virtuellen Umgebungen (Virtual Environments, kurz „venv“) arbeiten.

  • Eine virtuelle Umgebung enthält den Python-Interpreter und alle für das Projekt importierten Module in einem Unterverzeichnis, unabhängig davon, welche Version des Interpreters und welche Module auf dem Entwicklungs-System vorhanden sind.

Seit Python 3.3 gehört das venv-Modul zum Lieferumfang; eine neue virtuelle Umgebung mit dem Namen venv entsteht mit nur einem Befehl:

python3 -m venv venv     (1)
1 python3 -m venv <Name des Verzeichnisses> In diesem Beispiel liegt das Verzeichnis venv unterhalb des Verzeichnisses, in dem der Befehl ausgeführt wurde.

Aktivierung des venv der ­folgende Befehl:

source venv/bin/activate    (1)
1 Unter Windows: venv\Scripts\activate.bat

Jetzt können beliebige Python-Modul installiert/deinstalliert werden.

pip3 install <modulname>
pip3 uninstall <modulname>
  • Nach der Installation ist das Modul im virtuellen Environment zu finden (unterhalb von venv\Lib\site-packages).

  • Um das virtuelle Environment wieder zu deaktivieren reicht "deactivate"

  • Um es zu löschen muss nur der Ordner (z.B. venv) gelöscht werden.

1. Requirements

Die für ein Projekt installierten Module werden in einer Datei requirements.txt zusammengestellt.

pip3 freeze > requirements.txt

Diese Datei wird mit dem Projekt ausgeliefert. Auf dem Zielsystem muss dann,um alle notwendigen Module zu installieren, lediglich folgendes ausgeführt werden:

pip3 install -r requirements.txt
(oder)
pip3 install -r requirements.txt --user  (1)
1 Außerhalb eines virtuellen Environments werden Module nur im User-Verzeichnis und nicht global installiert, wenn --user angegeben worden ist.


Alle Notizen stehen in einer Übersicht auch hier.