<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://docs.artisancommerce.at/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>ArtisanCommerce Dokumentation - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.artisancommerce.at/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Spezial:Beitr%C3%A4ge/Admin"/>
	<updated>2026-04-18T13:45:55Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Snap&amp;diff=109</id>
		<title>Snap</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Snap&amp;diff=109"/>
		<updated>2026-03-26T22:24:16Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Was ist Snap? (Paketverwaltung &amp;amp; Container-System) ==&lt;br /&gt;
&#039;&#039;&#039;Snap&#039;&#039;&#039; ist ein von [[Canonical]] (den Machern von Ubuntu) entwickeltes System zur Softwareverteilung und Paketverwaltung. Es unterscheidet sich grundlegend von klassischen Formaten wie `.deb` oder `.rpm`.&lt;br /&gt;
&lt;br /&gt;
=== 1. Kernkonzept: &amp;quot;Everything is Included&amp;quot; ===&lt;br /&gt;
Im Gegensatz zu klassischen Paketen, die Abhängigkeiten vom restlichen System teilen, bringt ein Snap-Paket fast alles mit, was es zum Laufen braucht (Libraries, Python-Interpreter, etc.).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Vorteil:&#039;&#039;&#039; Eine App läuft auf Ubuntu 18.04 genauso wie auf Fedora oder Arch, ohne &amp;quot;Dependency Hell&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Nachteil:&#039;&#039;&#039; Die Pakete sind deutlich größer (Disk Space).&lt;br /&gt;
&lt;br /&gt;
=== 2. Die Architektur: SquashFS &amp;amp; Mount-Points ===&lt;br /&gt;
Das ist der technische Grund, warum Snap nach einem &#039;&#039;&#039;Timeshift-Restore&#039;&#039;&#039; oft bricht:&lt;br /&gt;
&lt;br /&gt;
* Ein Snap ist kein loser Ordner voller Dateien, sondern ein &#039;&#039;&#039;komprimiertes Read-Only Dateisystem&#039;&#039;&#039; (SquashFS).&lt;br /&gt;
* Wenn du eine App startest, &amp;quot;mountet&amp;quot; (einhängen) Linux dieses File als virtuelles Laufwerk unter `/snap/`.&lt;br /&gt;
* Die Basis-Umgebung (z.B. `core22`) ist das Fundament, auf dem die Apps aufbauen.&lt;br /&gt;
&lt;br /&gt;
=== 3. Sicherheit durch Sandboxing ===&lt;br /&gt;
Snaps laufen isoliert vom Rest des Systems. Sie nutzen Mechanismen wie:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AppArmor:&#039;&#039;&#039; Verhindert, dass eine App auf Dateien zugreift, die sie nichts angehen (z.B. dein Browser liest dein SSH-Key Verzeichnis).&lt;br /&gt;
* &#039;&#039;&#039;Seccomp:&#039;&#039;&#039; Schränkt die Systemaufrufe ein, die eine App machen darf.&lt;br /&gt;
&lt;br /&gt;
=== 4. Die Rollback-Funktion ===&lt;br /&gt;
Snap behält standardmäßig die letzten zwei Versionen einer App auf der Platte. Wenn ein Update fehlschlägt, kann man sofort zurückspringen:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo snap revert [app-name]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme m. Snap? (fehlende Abhaengigkeiten &amp;amp; kaputtes System) ==&lt;br /&gt;
&#039;&#039;&#039;Snap&#039;&#039;&#039; ist zwar so konzipiert, dass es eigentlich keine Abhaengigkeiten gibt, aber es gibt etwas das man als externe Abhaengigkeiten bezeichnen kann. Bspw. laesst sich ein Snap Paket oft auf den ersten Blick ohne weiteres installieren und betreiben, aber zur vollen Funktionalitaet braucht es dann eventuell doch Bibliotheken oder Programme die auf dem Host System installiert und richtig konfiguriert sein muessen... bspw. beim Kiview Dolphin Plugin das AFAIR als snap installierbar ist aber dann nicht richtig funktioniert oder falsch konfiguriert erscheint.&lt;br /&gt;
Des weiteren kann es nach einer Systemwiederherstellung mittels eines Snapshots, durchaus zu schwerwiegenden Fehlern am eigentlichen Snap system kommen, um das zu loesen, muss man bspw. den Snap Daemon, Sockets, Service (snapd) stoppen, Konfigurationsdateien loeschen/zuruecksetzen...&lt;br /&gt;
und dann refreshen. &lt;br /&gt;
Siehe dazu den Artikel &#039;[[Snap/Snap-Probleme|Snap-Probleme]]&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Warum snapd nach Backups oft &amp;quot;streikt&amp;quot; ===&lt;br /&gt;
Da Snaps als virtuelle Laufwerke in das System eingehängt sind, speichert der Linux-Kernel Mount-Informationen in Echtzeit. Ein Backup-Tool wie Timeshift sichert oft die Dateien, aber nicht den Zustand der Mount-Punkte oder die spezifischen Sicherheits-Labels (AppArmor). Nach einem Restore versucht der Snap-Daemon (`snapd`), ein Laufwerk zu finden, das technisch nicht mehr &amp;quot;da&amp;quot; ist – es entsteht ein &amp;quot;Ghost Mount&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Offizielle Links ===&lt;br /&gt;
&lt;br /&gt;
* [https://snapcraft.io/about Offizielle &amp;quot;About Snap&amp;quot; Seite]&lt;br /&gt;
* [https://ubuntu.com/blog/a-guide-to-snap-confinement Erläuterung zum Sandboxing (Englisch)]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Snap&amp;diff=108</id>
		<title>Snap</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Snap&amp;diff=108"/>
		<updated>2026-03-26T22:23:29Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Was ist Snap? (Paketverwaltung &amp;amp; Container-System) ==&lt;br /&gt;
&#039;&#039;&#039;Snap&#039;&#039;&#039; ist ein von [[Canonical]] (den Machern von Ubuntu) entwickeltes System zur Softwareverteilung und Paketverwaltung. Es unterscheidet sich grundlegend von klassischen Formaten wie `.deb` oder `.rpm`.&lt;br /&gt;
&lt;br /&gt;
=== 1. Kernkonzept: &amp;quot;Everything is Included&amp;quot; ===&lt;br /&gt;
Im Gegensatz zu klassischen Paketen, die Abhängigkeiten vom restlichen System teilen, bringt ein Snap-Paket fast alles mit, was es zum Laufen braucht (Libraries, Python-Interpreter, etc.).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Vorteil:&#039;&#039;&#039; Eine App läuft auf Ubuntu 18.04 genauso wie auf Fedora oder Arch, ohne &amp;quot;Dependency Hell&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Nachteil:&#039;&#039;&#039; Die Pakete sind deutlich größer (Disk Space).&lt;br /&gt;
&lt;br /&gt;
=== 2. Die Architektur: SquashFS &amp;amp; Mount-Points ===&lt;br /&gt;
Das ist der technische Grund, warum Snap nach einem &#039;&#039;&#039;Timeshift-Restore&#039;&#039;&#039; oft bricht:&lt;br /&gt;
&lt;br /&gt;
* Ein Snap ist kein loser Ordner voller Dateien, sondern ein &#039;&#039;&#039;komprimiertes Read-Only Dateisystem&#039;&#039;&#039; (SquashFS).&lt;br /&gt;
* Wenn du eine App startest, &amp;quot;mountet&amp;quot; (einhängen) Linux dieses File als virtuelles Laufwerk unter `/snap/`.&lt;br /&gt;
* Die Basis-Umgebung (z.B. `core22`) ist das Fundament, auf dem die Apps aufbauen.&lt;br /&gt;
&lt;br /&gt;
=== 3. Sicherheit durch Sandboxing ===&lt;br /&gt;
Snaps laufen isoliert vom Rest des Systems. Sie nutzen Mechanismen wie:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AppArmor:&#039;&#039;&#039; Verhindert, dass eine App auf Dateien zugreift, die sie nichts angehen (z.B. dein Browser liest dein SSH-Key Verzeichnis).&lt;br /&gt;
* &#039;&#039;&#039;Seccomp:&#039;&#039;&#039; Schränkt die Systemaufrufe ein, die eine App machen darf.&lt;br /&gt;
&lt;br /&gt;
=== 4. Die Rollback-Funktion ===&lt;br /&gt;
Snap behält standardmäßig die letzten zwei Versionen einer App auf der Platte. Wenn ein Update fehlschlägt, kann man sofort zurückspringen:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo snap revert [app-name]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme m. Snap? (fehlende Abhaengigkeiten &amp;amp; kaputtes System) ==&lt;br /&gt;
&#039;&#039;&#039;Snap&#039;&#039;&#039; ist zwar so konzipiert, dass es eigentlich keine Abhaengigkeiten gibt, aber es gibt etwas das man als externe Abhaengigkeiten bezeichnen kann. Bspw. laesst sich ein Snap Paket oft auf den ersten Blick ohne weiteres installieren und betreiben, aber zur vollen Funktionalitaet braucht es dann eventuell doch Bibliotheken oder Programme die auf dem Host System installiert und richtig konfiguriert sein muessen... bspw. beim Kiview Dolphin Plugin das AFAIR als snap installierbar ist aber dann nicht richtig funktioniert oder falsch konfiguriert erscheint.&lt;br /&gt;
Des weiteren kann es nach einer Systemwiederherstellung mittels eines Snapshots, durchaus zu schwerwiegenden Fehlern am eigentlichen Snap system kommen, um das zu loesen, muss man bspw. den Snap Daemon, Sockets, Service (snapd) stoppen, Konfigurationsdateien loeschen/zuruecksetzen...&lt;br /&gt;
und dann refreshen. &lt;br /&gt;
Siehe dazu den Artikel &#039;Snap-Probleme&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Warum snapd nach Backups oft &amp;quot;streikt&amp;quot; ===&lt;br /&gt;
Da Snaps als virtuelle Laufwerke in das System eingehängt sind, speichert der Linux-Kernel Mount-Informationen in Echtzeit. Ein Backup-Tool wie Timeshift sichert oft die Dateien, aber nicht den Zustand der Mount-Punkte oder die spezifischen Sicherheits-Labels (AppArmor). Nach einem Restore versucht der Snap-Daemon (`snapd`), ein Laufwerk zu finden, das technisch nicht mehr &amp;quot;da&amp;quot; ist – es entsteht ein &amp;quot;Ghost Mount&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Offizielle Links ===&lt;br /&gt;
&lt;br /&gt;
* [https://snapcraft.io/about Offizielle &amp;quot;About Snap&amp;quot; Seite]&lt;br /&gt;
* [https://ubuntu.com/blog/a-guide-to-snap-confinement Erläuterung zum Sandboxing (Englisch)]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Linux/DistroStack&amp;diff=107</id>
		<title>Linux/DistroStack</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Linux/DistroStack&amp;diff=107"/>
		<updated>2026-03-26T22:16:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Anatomie einer Linux-Distribution: Der Distro-Stack ==&lt;br /&gt;
Diese Seite beschreibt die Standard-Komponenten, die in einer modernen Linux-Distribution (fokussiert auf Ubuntu/Debian) enthalten sind. Ein Betriebssystem ist kein monolithischer Block, sondern ein Stapel (Stack) aus spezialisierten Tools und Diensten.&lt;br /&gt;
&lt;br /&gt;
=== 1. Core System &amp;amp; Boot (Die Basis) ===&lt;br /&gt;
Ohne diese Komponenten würde die Hardware nicht mit der Software kommunizieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Kernel:&#039;&#039;&#039; Das Herzstück. Verwaltet CPU, RAM und Hardware-Treiber.&lt;br /&gt;
* &#039;&#039;&#039;init-System (systemd):&#039;&#039;&#039; Der &amp;quot;Mutter-Prozess&amp;quot; (PID 1). Startet und verwaltet alle anderen Dienste (Daemons).&lt;br /&gt;
* &#039;&#039;&#039;GNU C Library (glibc):&#039;&#039;&#039; Die fundamentale Schnittstelle zwischen Kernel und fast jeder Software auf dem System.&lt;br /&gt;
&lt;br /&gt;
=== 2. System-Daemons (Hintergrunddienste) ===&lt;br /&gt;
Dienste, die im Hintergrund laufen, um die Systemfunktionalität aufrechtzuerhalten:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;systemd-resolved / Avahi:&#039;&#039;&#039; Zuständig für Netzwerk-Namensauflösung und Zeroconf (Geräte im LAN finden).&lt;br /&gt;
* &#039;&#039;&#039;NetworkManager:&#039;&#039;&#039; Verwaltet LAN, WLAN und VPN-Verbindungen.&lt;br /&gt;
* &#039;&#039;&#039;CUPS (Common Unix Printing System):&#039;&#039;&#039; Der Standard-Druckerserver unter Linux.&lt;br /&gt;
* &#039;&#039;&#039;cron / systemd-timers:&#039;&#039;&#039; Zeitgesteuerte Aufgaben (z.B. tägliche Backups oder Log-Rotation).&lt;br /&gt;
* &#039;&#039;&#039;SSH (sshd):&#039;&#039;&#039; Ermöglicht den sicheren Fernzugriff auf das System.&lt;br /&gt;
&lt;br /&gt;
=== 3. Paketverwaltung &amp;amp; Software-Verteilung ===&lt;br /&gt;
Ubuntu nutzt ein hybrides Modell aus klassischer und moderner Paketverwaltung:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;APT (Advanced Package Tool):&#039;&#039;&#039; Verwalter für `.deb` Pakete. Nutzt geteilte Bibliotheken des Systems.&lt;br /&gt;
* &#039;&#039;&#039;[[Snap]] (snapd):&#039;&#039;&#039; Von Canonical entwickeltes Container-Format. Apps bringen ihre eigenen Bibliotheken mit und laufen isoliert (Sandboxed).&lt;br /&gt;
* &#039;&#039;&#039;D-Bus:&#039;&#039;&#039; Ein &amp;quot;Nachrichtensystem&amp;quot;, das es verschiedenen Programmen (z.B. Snap-Apps und dem Desktop) erlaubt, miteinander zu kommunizieren.&lt;br /&gt;
&lt;br /&gt;
=== 4. Build-Chains &amp;amp; Entwicklungstools ===&lt;br /&gt;
Wichtig für Kompilierung und Systempflege (oft im Paket `build-essential` zusammengefasst):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GCC / Clang:&#039;&#039;&#039; Die Compiler, die Quellcode in ausführbare Programme verwandeln.&lt;br /&gt;
* &#039;&#039;&#039;Make / CMake:&#039;&#039;&#039; Tools zur Automatisierung des Build-Prozesses.&lt;br /&gt;
* &#039;&#039;&#039;Python/Perl/Bash:&#039;&#039;&#039; Skriptsprachen, die für viele interne Systemskripte notwendig sind.&lt;br /&gt;
&lt;br /&gt;
=== 5. Grafik &amp;amp; User Interface (UI-Stack) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Display Server (X11 oder Wayland):&#039;&#039;&#039; Zeichnet die Fenster auf den Bildschirm.&lt;br /&gt;
* &#039;&#039;&#039;Desktop Environment (GNOME, KDE, XFCE):&#039;&#039;&#039; Die grafische Oberfläche (Panel, Menüs, Dateimanager).&lt;br /&gt;
* &#039;&#039;&#039;Mesa:&#039;&#039;&#039; Die Open-Source-Treiber für Grafikbeschleunigung (OpenGL/Vulkan).&lt;br /&gt;
&lt;br /&gt;
=== Übersichtstabelle wichtiger Komponenten ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Komponente&lt;br /&gt;
!Funktion&lt;br /&gt;
!Beispiel-Befehl&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;snapd&#039;&#039;&#039;&lt;br /&gt;
|Verwaltung von Snap-Containern&lt;br /&gt;
|&amp;lt;code&amp;gt;snap list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;systemctl&#039;&#039;&#039;&lt;br /&gt;
|Steuerung von System-Diensten&lt;br /&gt;
|&amp;lt;code&amp;gt;systemctl status cups&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;journalctl&#039;&#039;&#039;&lt;br /&gt;
|Zentrales Logging-System&lt;br /&gt;
|&amp;lt;code&amp;gt;journalctl -u ssh&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;dpkg / apt&#039;&#039;&#039;&lt;br /&gt;
|Klassische Paketverwaltung&lt;br /&gt;
|&amp;lt;code&amp;gt;apt update&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;udev&#039;&#039;&#039;&lt;br /&gt;
|Dynamische Geräteverwaltung&lt;br /&gt;
|&amp;lt;code&amp;gt;udevadm monitor&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Offizielle Dokumentation ===&lt;br /&gt;
&lt;br /&gt;
* [https://ubuntu.com/server/docs Ubuntu Server Guide]&lt;br /&gt;
* [https://www.kernel.org/doc/html/latest/ Linux Kernel Documentation]&lt;br /&gt;
* [https://systemd.io/ systemd Project Page]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Linux&amp;diff=106</id>
		<title>Linux</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Linux&amp;diff=106"/>
		<updated>2026-03-26T22:15:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Linux ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Linux&#039;&#039;&#039; bezeichnet eine Familie von freien, quelloffenen Mehrbenutzer-Betriebssystemen, die auf dem Linux-Kernel basieren. In der modernen IT-Infrastruktur ist Linux das unangefochtene Rückgrat für Server-Umgebungen, Cloud-Computing und die professionelle Softwareentwicklung.&lt;br /&gt;
&lt;br /&gt;
Eigentlich wird mit &#039;LINUX&#039; ja der eigentliche Betriebssystemkern bezeichnet der urspruenglich monolithischer Natur und erweiterbar mit Kernel-Modulen ist(dkms..), mittlerweile ist das Wort aber gleichbedeutend mit der Betriebssystem-Distribution die je nach Auspraegung noch unterhalb der eigentlichen Distribution eines Distributors (Ubuntu - Canonical. Suse - Novel, IBM - AIX&amp;lt;eigentlich ein UNIX&amp;gt;), aus verschiedenen Software-Paketen bestehen kann, was man auch als Distributions-Stack bezeichnen kann.&lt;br /&gt;
&lt;br /&gt;
Am ueblichsten ist heutzutage RedHat(Fedora/CentOS) oder Ubuntu...&lt;br /&gt;
&lt;br /&gt;
[[Linux/DistroStack|siehe Linux/DistroStack]] &lt;br /&gt;
&lt;br /&gt;
=== Bedeutung für Web-Infrastrukturen ===&lt;br /&gt;
Während Windows die Bürolandschaften dominiert, ist Linux der Standard für das Hosting von modernen Web-Applikationen. Frameworks und Systeme wie &#039;&#039;&#039;Shopware&#039;&#039;&#039;, &#039;&#039;&#039;Symfony&#039;&#039;&#039; oder &#039;&#039;&#039;UVdesk&#039;&#039;&#039; sind nativ für den Betrieb unter Linux optimiert (insbesondere für den sogenannten LAMP- oder LEMP-Stack).&lt;br /&gt;
&lt;br /&gt;
=== Die wichtigsten Distributionen im Überblick ===&lt;br /&gt;
&lt;br /&gt;
In der Linux-Welt wird zwischen freien Community-Projekten und kommerziellen Enterprise-Lösungen unterschieden:&lt;br /&gt;
&lt;br /&gt;
==== Enterprise-Distributionen (mit Support) ====&lt;br /&gt;
Diese Systeme sind für geschäftskritische Umgebungen ausgelegt, in denen Zertifizierungen und langfristiger Support (LTS) entscheidend sind:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Red Hat Enterprise Linux (RHEL):&#039;&#039;&#039; Der weltweite Industrie-Standard für Unternehmen. Es bietet maximale Sicherheit (SELinux) und ist die Basis für viele Cloud-Infrastrukturen.&lt;br /&gt;
* &#039;&#039;&#039;SUSE Linux Enterprise Server (SLES):&#039;&#039;&#039; Ein Pionier aus Deutschland (ehemals Novell-Umfeld). SLES ist der Goldstandard für &#039;&#039;&#039;SAP-Installationen&#039;&#039;&#039; und bekannt für das mächtige Konfigurationstool &#039;&#039;&#039;YaST&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Ubuntu Pro:&#039;&#039;&#039; Von Canonical entwickelt, verbindet es modernste Software-Pakete mit kommerziellen Wartungsverträgen.&lt;br /&gt;
&lt;br /&gt;
==== Community-Distributionen (frei) ====&lt;br /&gt;
* &#039;&#039;&#039;Debian:&#039;&#039;&#039; Gilt als das &amp;quot;Mutter-System&amp;quot; vieler Distributionen. Es ist bekannt für seine extreme Stabilität und eine strikte Philosophie freier Software.&lt;br /&gt;
* &#039;&#039;&#039;Ubuntu (Community):&#039;&#039;&#039; Basierend auf Debian, ist es die am weitesten verbreitete Distribution für Webserver und Entwickler-Workstations.&lt;br /&gt;
* &#039;&#039;&#039;CentOS Stream / AlmaLinux:&#039;&#039;&#039; Community-Alternativen, die binärkompatibel zu Red Hat (RHEL) sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vergleich der Ökosysteme ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! System-Familie !! Paketmanager !! Fokus !! Bekannte Vertreter&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Debian-basiert&#039;&#039;&#039; || APT / .deb || Stabilität &amp;amp; Web || Debian, Ubuntu, Mint&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Red Hat-basiert&#039;&#039;&#039; || DNF / .rpm || Enterprise &amp;amp; Cloud || RHEL, Fedora, AlmaLinux&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SUSE-basiert&#039;&#039;&#039; || Zypper / .rpm || Enterprise &amp;amp; SAP || SLES, openSUSE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Linux und Containerisierung ===&lt;br /&gt;
Linux ist die Geburtsstätte der Container-Technologie. Werkzeuge wie &#039;&#039;&#039;Docker&#039;&#039;&#039; und &#039;&#039;&#039;Kubernetes&#039;&#039;&#039; basieren auf nativen Linux-Kernel-Features (Cgroups und Namespaces). Dies erlaubt es, Anwendungen wie einen Shopware-Cluster in isolierten Containern zu betreiben, die auf jedem Linux-System identisch funktionieren.&lt;br /&gt;
&lt;br /&gt;
=== Vorteile im Business-Einsatz ===&lt;br /&gt;
* &#039;&#039;&#039;Ressourceneffizienz:&#039;&#039;&#039; Server laufen meist ohne grafische Oberfläche, wodurch die gesamte Leistung der Anwendung (z.B. PHP/Symfony) zugutekommt.&lt;br /&gt;
* &#039;&#039;&#039;Automatisierung:&#039;&#039;&#039; Über die Shell (Bash/Zsh) lassen sich komplexe Deployment-Prozesse perfekt skripten.&lt;br /&gt;
* &#039;&#039;&#039;Sicherheit:&#039;&#039;&#039; Schnelle Sicherheits-Patches durch die weltweite Open-Source-Community.&lt;br /&gt;
&lt;br /&gt;
[[index.php?title=Kategorie:Betriebssystem]]&lt;br /&gt;
[[index.php?title=Kategorie:Open Source]]&lt;br /&gt;
[[index.php?title=Kategorie:Server]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Linux/DistroStack&amp;diff=105</id>
		<title>Linux/DistroStack</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Linux/DistroStack&amp;diff=105"/>
		<updated>2026-03-26T22:10:37Z</updated>

		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „ == Anatomie einer Linux-Distribution: Der Distro-Stack == Diese Seite beschreibt die Standard-Komponenten, die in einer modernen Linux-Distribution (fokussiert auf Ubuntu/Debian) enthalten sind. Ein Betriebssystem ist kein monolithischer Block, sondern ein Stapel (Stack) aus spezialisierten Tools und Diensten.  === 1. Core System &amp;amp; Boot (Die Basis) === Ohne diese Komponenten würde die Hardware nicht mit der Software kommunizieren.  * &amp;#039;&amp;#039;&amp;#039;Kernel:&amp;#039;&amp;#039;&amp;#039; Das H…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Anatomie einer Linux-Distribution: Der Distro-Stack ==&lt;br /&gt;
Diese Seite beschreibt die Standard-Komponenten, die in einer modernen Linux-Distribution (fokussiert auf Ubuntu/Debian) enthalten sind. Ein Betriebssystem ist kein monolithischer Block, sondern ein Stapel (Stack) aus spezialisierten Tools und Diensten.&lt;br /&gt;
&lt;br /&gt;
=== 1. Core System &amp;amp; Boot (Die Basis) ===&lt;br /&gt;
Ohne diese Komponenten würde die Hardware nicht mit der Software kommunizieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Kernel:&#039;&#039;&#039; Das Herzstück. Verwaltet CPU, RAM und Hardware-Treiber.&lt;br /&gt;
* &#039;&#039;&#039;init-System (systemd):&#039;&#039;&#039; Der &amp;quot;Mutter-Prozess&amp;quot; (PID 1). Startet und verwaltet alle anderen Dienste (Daemons).&lt;br /&gt;
* &#039;&#039;&#039;GNU C Library (glibc):&#039;&#039;&#039; Die fundamentale Schnittstelle zwischen Kernel und fast jeder Software auf dem System.&lt;br /&gt;
&lt;br /&gt;
=== 2. System-Daemons (Hintergrunddienste) ===&lt;br /&gt;
Dienste, die im Hintergrund laufen, um die Systemfunktionalität aufrechtzuerhalten:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;systemd-resolved / Avahi:&#039;&#039;&#039; Zuständig für Netzwerk-Namensauflösung und Zeroconf (Geräte im LAN finden).&lt;br /&gt;
* &#039;&#039;&#039;NetworkManager:&#039;&#039;&#039; Verwaltet LAN, WLAN und VPN-Verbindungen.&lt;br /&gt;
* &#039;&#039;&#039;CUPS (Common Unix Printing System):&#039;&#039;&#039; Der Standard-Druckerserver unter Linux.&lt;br /&gt;
* &#039;&#039;&#039;cron / systemd-timers:&#039;&#039;&#039; Zeitgesteuerte Aufgaben (z.B. tägliche Backups oder Log-Rotation).&lt;br /&gt;
* &#039;&#039;&#039;SSH (sshd):&#039;&#039;&#039; Ermöglicht den sicheren Fernzugriff auf das System.&lt;br /&gt;
&lt;br /&gt;
=== 3. Paketverwaltung &amp;amp; Software-Verteilung ===&lt;br /&gt;
Ubuntu nutzt ein hybrides Modell aus klassischer und moderner Paketverwaltung:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;APT (Advanced Package Tool):&#039;&#039;&#039; Verwalter für `.deb` Pakete. Nutzt geteilte Bibliotheken des Systems.&lt;br /&gt;
* &#039;&#039;&#039;Snap (snapd):&#039;&#039;&#039; Von Canonical entwickeltes Container-Format. Apps bringen ihre eigenen Bibliotheken mit und laufen isoliert (Sandboxed).&lt;br /&gt;
* &#039;&#039;&#039;D-Bus:&#039;&#039;&#039; Ein &amp;quot;Nachrichtensystem&amp;quot;, das es verschiedenen Programmen (z.B. Snap-Apps und dem Desktop) erlaubt, miteinander zu kommunizieren.&lt;br /&gt;
&lt;br /&gt;
=== 4. Build-Chains &amp;amp; Entwicklungstools ===&lt;br /&gt;
Wichtig für Kompilierung und Systempflege (oft im Paket `build-essential` zusammengefasst):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GCC / Clang:&#039;&#039;&#039; Die Compiler, die Quellcode in ausführbare Programme verwandeln.&lt;br /&gt;
* &#039;&#039;&#039;Make / CMake:&#039;&#039;&#039; Tools zur Automatisierung des Build-Prozesses.&lt;br /&gt;
* &#039;&#039;&#039;Python/Perl/Bash:&#039;&#039;&#039; Skriptsprachen, die für viele interne Systemskripte notwendig sind.&lt;br /&gt;
&lt;br /&gt;
=== 5. Grafik &amp;amp; User Interface (UI-Stack) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Display Server (X11 oder Wayland):&#039;&#039;&#039; Zeichnet die Fenster auf den Bildschirm.&lt;br /&gt;
* &#039;&#039;&#039;Desktop Environment (GNOME, KDE, XFCE):&#039;&#039;&#039; Die grafische Oberfläche (Panel, Menüs, Dateimanager).&lt;br /&gt;
* &#039;&#039;&#039;Mesa:&#039;&#039;&#039; Die Open-Source-Treiber für Grafikbeschleunigung (OpenGL/Vulkan).&lt;br /&gt;
&lt;br /&gt;
=== Übersichtstabelle wichtiger Komponenten ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Komponente&lt;br /&gt;
!Funktion&lt;br /&gt;
!Beispiel-Befehl&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;snapd&#039;&#039;&#039;&lt;br /&gt;
|Verwaltung von Snap-Containern&lt;br /&gt;
|&amp;lt;code&amp;gt;snap list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;systemctl&#039;&#039;&#039;&lt;br /&gt;
|Steuerung von System-Diensten&lt;br /&gt;
|&amp;lt;code&amp;gt;systemctl status cups&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;journalctl&#039;&#039;&#039;&lt;br /&gt;
|Zentrales Logging-System&lt;br /&gt;
|&amp;lt;code&amp;gt;journalctl -u ssh&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;dpkg / apt&#039;&#039;&#039;&lt;br /&gt;
|Klassische Paketverwaltung&lt;br /&gt;
|&amp;lt;code&amp;gt;apt update&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;udev&#039;&#039;&#039;&lt;br /&gt;
|Dynamische Geräteverwaltung&lt;br /&gt;
|&amp;lt;code&amp;gt;udevadm monitor&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Offizielle Dokumentation ===&lt;br /&gt;
&lt;br /&gt;
* [https://ubuntu.com/server/docs Ubuntu Server Guide]&lt;br /&gt;
* [https://www.kernel.org/doc/html/latest/ Linux Kernel Documentation]&lt;br /&gt;
* [https://systemd.io/ systemd Project Page]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Snap/Snap-Probleme&amp;diff=104</id>
		<title>Snap/Snap-Probleme</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Snap/Snap-Probleme&amp;diff=104"/>
		<updated>2026-03-26T22:07:14Z</updated>

		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „ == Snapd Reparatur nach System-Wiederherstellung (z.B. Timeshift) == Diese Seite beschreibt den &amp;quot;Nuclear Option&amp;quot;-Prozess, um das Snap-System zu reparieren, wenn Mount-Punkte korrupt sind oder die Fehlermeldung &amp;lt;nowiki&amp;gt;&amp;quot;cannot locate base snap core22&amp;quot;&amp;lt;/nowiki&amp;gt; erscheint.  === 1. Snap-Dienste vollständig stoppen === Snapd hat einen &amp;quot;Socket-Aktivierungs&amp;quot;-Mechanismus. Man muss erst den Socket stoppen, sonst startet der Dienst sofort wieder von selbst.&amp;lt;synta…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Snapd Reparatur nach System-Wiederherstellung (z.B. Timeshift) ==&lt;br /&gt;
Diese Seite beschreibt den &amp;quot;Nuclear Option&amp;quot;-Prozess, um das Snap-System zu reparieren, wenn Mount-Punkte korrupt sind oder die Fehlermeldung &amp;lt;nowiki&amp;gt;&amp;quot;cannot locate base snap core22&amp;quot;&amp;lt;/nowiki&amp;gt; erscheint.&lt;br /&gt;
&lt;br /&gt;
=== 1. Snap-Dienste vollständig stoppen ===&lt;br /&gt;
Snapd hat einen &amp;quot;Socket-Aktivierungs&amp;quot;-Mechanismus. Man muss erst den Socket stoppen, sonst startet der Dienst sofort wieder von selbst.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl stop snapd.socket&lt;br /&gt;
sudo systemctl stop snapd.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Defekten Status und Assertions löschen ===&lt;br /&gt;
Dies setzt das &amp;quot;Gedächtnis&amp;quot; von Snap zurück, ohne die installierten App-Daten zu löschen. Damit wird die Datenbank gezwungen, das Dateisystem neu zu scannen.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Löscht die digitalen Signaturen/Bestätigungen&lt;br /&gt;
sudo rm -rf /var/lib/snapd/assertions/*&lt;br /&gt;
&lt;br /&gt;
# Löscht die zentrale Status-Datenbank (die oft nach Timeshift korrupt ist)&lt;br /&gt;
sudo rm -f /var/lib/snapd/state.json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Snap-Dienste wieder starten ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl start snapd.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Basis-System (Foundation) neu installieren ===&lt;br /&gt;
Ohne die Base-Snaps (wie core22) funktionieren die meisten modernen Snaps (Brave, Firefox, etc.) nicht.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo snap install core22&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. Pakete reparieren / Neu erzwingen ===&lt;br /&gt;
Wenn die Apps zwar gelistet, aber nicht startbar sind, hilft der &#039;&#039;&#039;--amend&#039;&#039;&#039; Flag oder eine Neuinstallation.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Alle installierten Snaps validieren und reparieren:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo snap refresh --amend&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Spezifische Apps (z.B. Brave oder Firefox) neu installieren:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo snap remove --purge brave&lt;br /&gt;
sudo snap install brave&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fehlerbehebung: Ghost Mounts ===&lt;br /&gt;
Falls sich ein Snap nicht löschen lässt, weil es &amp;quot;in use&amp;quot; ist, obwohl der Dienst steht, hilft ein &amp;quot;Lazy Unmount&amp;quot;:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount -l /snap/core22/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Offizielle Dokumentation &amp;amp; Links ===&lt;br /&gt;
&lt;br /&gt;
* [https://snapcraft.io/docs/getting-started Snapcraft Documentation]&lt;br /&gt;
* [https://snapcraft.io/docs/snap-cli-cheat-sheet Snap CLI Cheat Sheet]&lt;br /&gt;
* [https://forum.snapcraft.io/ Snapcraft Forum (Community Hilfe)]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Snap&amp;diff=103</id>
		<title>Snap</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Snap&amp;diff=103"/>
		<updated>2026-03-26T22:05:47Z</updated>

		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „ == Was ist Snap? (Paketverwaltung &amp;amp; Container-System) == &amp;#039;&amp;#039;&amp;#039;Snap&amp;#039;&amp;#039;&amp;#039; ist ein von Canonical (den Machern von Ubuntu) entwickeltes System zur Softwareverteilung und Paketverwaltung. Es unterscheidet sich grundlegend von klassischen Formaten wie `.deb` oder `.rpm`.  === 1. Kernkonzept: &amp;quot;Everything is Included&amp;quot; === Im Gegensatz zu klassischen Paketen, die Abhängigkeiten vom restlichen System teilen, bringt ein Snap-Paket fast alles mit, was es zum Laufen…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Was ist Snap? (Paketverwaltung &amp;amp; Container-System) ==&lt;br /&gt;
&#039;&#039;&#039;Snap&#039;&#039;&#039; ist ein von [[Canonical]] (den Machern von Ubuntu) entwickeltes System zur Softwareverteilung und Paketverwaltung. Es unterscheidet sich grundlegend von klassischen Formaten wie `.deb` oder `.rpm`.&lt;br /&gt;
&lt;br /&gt;
=== 1. Kernkonzept: &amp;quot;Everything is Included&amp;quot; ===&lt;br /&gt;
Im Gegensatz zu klassischen Paketen, die Abhängigkeiten vom restlichen System teilen, bringt ein Snap-Paket fast alles mit, was es zum Laufen braucht (Libraries, Python-Interpreter, etc.).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Vorteil:&#039;&#039;&#039; Eine App läuft auf Ubuntu 18.04 genauso wie auf Fedora oder Arch, ohne &amp;quot;Dependency Hell&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Nachteil:&#039;&#039;&#039; Die Pakete sind deutlich größer (Disk Space).&lt;br /&gt;
&lt;br /&gt;
=== 2. Die Architektur: SquashFS &amp;amp; Mount-Points ===&lt;br /&gt;
Das ist der technische Grund, warum Snap nach einem &#039;&#039;&#039;Timeshift-Restore&#039;&#039;&#039; oft bricht:&lt;br /&gt;
&lt;br /&gt;
* Ein Snap ist kein loser Ordner voller Dateien, sondern ein &#039;&#039;&#039;komprimiertes Read-Only Dateisystem&#039;&#039;&#039; (SquashFS).&lt;br /&gt;
* Wenn du eine App startest, &amp;quot;mountet&amp;quot; (einhängen) Linux dieses File als virtuelles Laufwerk unter `/snap/`.&lt;br /&gt;
* Die Basis-Umgebung (z.B. `core22`) ist das Fundament, auf dem die Apps aufbauen.&lt;br /&gt;
&lt;br /&gt;
=== 3. Sicherheit durch Sandboxing ===&lt;br /&gt;
Snaps laufen isoliert vom Rest des Systems. Sie nutzen Mechanismen wie:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AppArmor:&#039;&#039;&#039; Verhindert, dass eine App auf Dateien zugreift, die sie nichts angehen (z.B. dein Browser liest dein SSH-Key Verzeichnis).&lt;br /&gt;
* &#039;&#039;&#039;Seccomp:&#039;&#039;&#039; Schränkt die Systemaufrufe ein, die eine App machen darf.&lt;br /&gt;
&lt;br /&gt;
=== 4. Die Rollback-Funktion ===&lt;br /&gt;
Snap behält standardmäßig die letzten zwei Versionen einer App auf der Platte. Wenn ein Update fehlschlägt, kann man sofort zurückspringen:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo snap revert [app-name]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Warum snapd nach Backups oft &amp;quot;streikt&amp;quot; ===&lt;br /&gt;
Da Snaps als virtuelle Laufwerke in das System eingehängt sind, speichert der Linux-Kernel Mount-Informationen in Echtzeit. Ein Backup-Tool wie Timeshift sichert oft die Dateien, aber nicht den Zustand der Mount-Punkte oder die spezifischen Sicherheits-Labels (AppArmor). Nach einem Restore versucht der Snap-Daemon (`snapd`), ein Laufwerk zu finden, das technisch nicht mehr &amp;quot;da&amp;quot; ist – es entsteht ein &amp;quot;Ghost Mount&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Offizielle Links ===&lt;br /&gt;
&lt;br /&gt;
* [https://snapcraft.io/about Offizielle &amp;quot;About Snap&amp;quot; Seite]&lt;br /&gt;
* [https://ubuntu.com/blog/a-guide-to-snap-confinement Erläuterung zum Sandboxing (Englisch)]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite&amp;diff=102</id>
		<title>Intern:Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite&amp;diff=102"/>
		<updated>2026-03-23T21:14:41Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* 🛠️ Tools &amp;amp; Development Environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
= Interne Dokumentation &amp;amp; Knowledge Base =&lt;br /&gt;
&lt;br /&gt;
Diese Sektion dient als zentraler Wissensspeicher für &#039;&#039;&#039;ArtisanCommerce&#039;&#039;&#039;. Hier dokumentieren wir unsere Infrastruktur, Entwicklungs-Workflows und Architektur-Entscheidungen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Diese Inhalte sind ausschließlich für den internen Gebrauch bestimmt und nicht für Endkunden sichtbar.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 🛠️ Tools &amp;amp; Development Environment ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Kategorie !! Tools&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;IDEs &amp;amp; Editoren&#039;&#039;&#039; || [[VS Code]], [[Zed]], [[JetBrains Suite]], [[XCode]], [[VS 2022/2026]]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Versionskontrolle&#039;&#039;&#039; || [[Pijul]], [[GitHub]]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;CLI &amp;amp; Automation&#039;&#039;&#039; || [[Codex-cli]], Shell-Scripts&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Infrastruktur&#039;&#039;&#039; || [[Kubernetes]] (K8s), [[Docker]], [[Intern:Hauptseite/MinioS3|MinIO S3 Storage]], [[Intern:Hauptseite/Portainer.iO|Portainer.iO - Docker &amp;amp; Podman Cockpit]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 🏗️ Frameworks &amp;amp; Standards ==&lt;br /&gt;
; PHP&lt;br /&gt;
: [[Symfony]] &amp;amp; [[Laravel]]&lt;br /&gt;
; Microsoft Stack&lt;br /&gt;
: [[ASP.NET Core]]&lt;br /&gt;
; Frontend&lt;br /&gt;
: React, Vue, Tailwind&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 📂 Systeme &amp;amp; Applikationen ==&lt;br /&gt;
&lt;br /&gt;
=== Support &amp;amp; Kommunikation ===&lt;br /&gt;
* &#039;&#039;&#039;[[Intern:Hauptseite/UVdesk|UVdesk Helpdesk]]&#039;&#039;&#039; – Unser zentrales Ticket-System.&lt;br /&gt;
** [[Intern:Hauptseite/UVdesk#Debugging-History|Debugging &amp;amp; Setup-Fixes]] (Wichtig für bplaced)&lt;br /&gt;
&lt;br /&gt;
=== Wissensmanagement ===&lt;br /&gt;
* &#039;&#039;&#039;[[MediaWiki]]&#039;&#039;&#039; – Dokumentation der Wiki-Struktur und Namensräume.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 💡 Tipps, Tricks &amp;amp; Best Practices ==&lt;br /&gt;
* &#039;&#039;&#039;Wiki-Syntax:&#039;&#039;&#039; Nutze &amp;lt;code&amp;gt;1=&amp;lt;/code&amp;gt; bei Vorlagen, wenn Gleichheitszeichen im Text vorkommen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/Portainer.iO&amp;diff=101</id>
		<title>Intern:Hauptseite/Portainer.iO</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/Portainer.iO&amp;diff=101"/>
		<updated>2026-03-23T21:13:02Z</updated>

		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „== Portainer.io: Das Grafische Docker &amp;amp; Podman Cockpit ==  &amp;#039;&amp;#039;&amp;#039;Portainer&amp;#039;&amp;#039;&amp;#039; ist die führende Open-Source-Management-Oberfläche für Container-Umgebungen. Es ermöglicht die Verwaltung von Containern, Images, Volumes und Netzwerken, ohne dass komplexe CLI-Befehle auswendig gelernt werden müssen.  === Warum Portainer in unserer Infrastruktur? === * &amp;#039;&amp;#039;&amp;#039;Sichtbarkeit:&amp;#039;&amp;#039;&amp;#039; Ein Klick genügt, um zu sehen, welche Container laufen, welche gestoppt sind und we…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Portainer.io: Das Grafische Docker &amp;amp; Podman Cockpit ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Portainer]]&#039;&#039;&#039; ist die führende Open-Source-Management-Oberfläche für Container-Umgebungen. Es ermöglicht die Verwaltung von Containern, Images, Volumes und Netzwerken, ohne dass komplexe CLI-Befehle auswendig gelernt werden müssen.&lt;br /&gt;
&lt;br /&gt;
=== Warum Portainer in unserer Infrastruktur? ===&lt;br /&gt;
* &#039;&#039;&#039;Sichtbarkeit:&#039;&#039;&#039; Ein Klick genügt, um zu sehen, welche Container laufen, welche gestoppt sind und welche Ressourcen (CPU/RAM) sie fressen.&lt;br /&gt;
* &#039;&#039;&#039;Multi-Engine Support:&#039;&#039;&#039; Portainer verwaltet auf unserer Kubuntu-Maschine sowohl &#039;&#039;&#039;Docker&#039;&#039;&#039; als auch &#039;&#039;&#039;Podman&#039;&#039;&#039; (via API-Socket).&lt;br /&gt;
* &#039;&#039;&#039;Stack-Management:&#039;&#039;&#039; Es nutzt intern Docker Compose, um zusammengehörige Dienste (z. B. App + Datenbank) als eine Einheit zu verwalten.&lt;br /&gt;
* &#039;&#039;&#039;Sicherheit:&#039;&#039;&#039; Erlaubt den Zugriff auf Container-Logs und Konsolen direkt im Browser, ohne dass SSH-Zugriff auf den Host-Server nötig ist.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Installation &amp;amp; Schnellstart ==&lt;br /&gt;
&lt;br /&gt;
Auf unserem Kubuntu 26.04 System wird Portainer als eigener Docker-Container betrieben, um maximale Isolation zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
=== Deployment via CLI ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. Daten-Volume für Persistenz erstellen&lt;br /&gt;
docker volume create portainer_data&lt;br /&gt;
&lt;br /&gt;
# 2. Portainer Container starten&lt;br /&gt;
docker run -d -p 8000:8000 -p 9443:9443 --name portainer \&lt;br /&gt;
    --restart=always \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock \&lt;br /&gt;
    -v portainer_data:/data \&lt;br /&gt;
    portainer/portainer-ce:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zugriff ===&lt;br /&gt;
* &#039;&#039;&#039;URL:&#039;&#039;&#039; &amp;lt;code&amp;gt;https://localhost:9443&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Da Portainer ein selbstsigniertes SSL-Zertifikat nutzt, erscheint eine Browser-Warnung. Diese kann unter &amp;quot;Erweitert -&amp;gt; Risiko akzeptieren&amp;quot; ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Essential Tricks für Profis ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Podman Integration ===&lt;br /&gt;
Um Podman-Container in Portainer zu sehen, muss der Podman-Socket aktiviert sein:&lt;br /&gt;
# Befehl auf dem Host: &amp;lt;code&amp;gt;sudo systemctl enable --now podman.socket&amp;lt;/code&amp;gt;&lt;br /&gt;
# In Portainer: &#039;&#039;&#039;Environments &amp;gt; Add Environment &amp;gt; Docker Standalone &amp;gt; API&#039;&#039;&#039;&lt;br /&gt;
# Pfad angeben: &amp;lt;code&amp;gt;unix:///run/podman/podman.sock&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Container-Konsole (Web-Shell) ===&lt;br /&gt;
Man muss nicht `docker exec -it` nutzen. In der Portainer-Liste einfach auf das &#039;&#039;&#039;&amp;gt;_&#039;&#039;&#039; Icon klicken. Damit landet man sofort in der Shell des Containers – ideal für schnelle Fixes an Node.js Apps.&lt;br /&gt;
&lt;br /&gt;
=== 3. Automatische Updates mit &amp;quot;Webhooks&amp;quot; ===&lt;br /&gt;
Portainer kann so konfiguriert werden, dass ein Container automatisch neu startet und das neueste Image zieht, sobald eine neue Version auf Docker Hub oder in unserer Registry landet (via HTTP POST Request).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;Client sent an HTTP request to an HTTPS server&amp;quot;:&#039;&#039;&#039; Dieser Fehler tritt auf, wenn man &amp;lt;code&amp;gt;http://&amp;lt;/code&amp;gt; statt &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt; auf Port 9443 nutzt. Immer &amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt; erzwingen!&lt;br /&gt;
* &#039;&#039;&#039;Passwort vergessen:&#039;&#039;&#039; Falls das Admin-Passwort verloren geht, muss ein spezieller &amp;quot;Password Reset Helper&amp;quot; Container gestartet werden (siehe offizielle Docs).&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
* [https://docs.portainer.io/ Offizielle Portainer Dokumentation]&lt;br /&gt;
* [https://www.portainer.io/blog Portainer Blog (Best Practices)]&lt;br /&gt;
* [https://www.youtube.com/watch?v=l_N9r8p_GQU Video: Portainer 101 für Anfänger]&lt;br /&gt;
* [https://www.youtube.com/watch?v=v_un6YV3ZNo Video: Managing Podman with Portainer]&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastruktur]] [[Category:Docker]] [[Category:Management]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite&amp;diff=100</id>
		<title>Intern:Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite&amp;diff=100"/>
		<updated>2026-03-23T21:10:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* 🛠️ Tools &amp;amp; Development Environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
= Interne Dokumentation &amp;amp; Knowledge Base =&lt;br /&gt;
&lt;br /&gt;
Diese Sektion dient als zentraler Wissensspeicher für &#039;&#039;&#039;ArtisanCommerce&#039;&#039;&#039;. Hier dokumentieren wir unsere Infrastruktur, Entwicklungs-Workflows und Architektur-Entscheidungen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Diese Inhalte sind ausschließlich für den internen Gebrauch bestimmt und nicht für Endkunden sichtbar.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 🛠️ Tools &amp;amp; Development Environment ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Kategorie !! Tools&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;IDEs &amp;amp; Editoren&#039;&#039;&#039; || [[VS Code]], [[Zed]], [[JetBrains Suite]], [[XCode]], [[VS 2022/2026]]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Versionskontrolle&#039;&#039;&#039; || [[Pijul]], [[GitHub]]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;CLI &amp;amp; Automation&#039;&#039;&#039; || [[Codex-cli]], Shell-Scripts&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Infrastruktur&#039;&#039;&#039; || [[Kubernetes]] (K8s), [[Docker]], [[Intern:Hauptseite/MinioS3|MinIO S3 Storage]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 🏗️ Frameworks &amp;amp; Standards ==&lt;br /&gt;
; PHP&lt;br /&gt;
: [[Symfony]] &amp;amp; [[Laravel]]&lt;br /&gt;
; Microsoft Stack&lt;br /&gt;
: [[ASP.NET Core]]&lt;br /&gt;
; Frontend&lt;br /&gt;
: React, Vue, Tailwind&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 📂 Systeme &amp;amp; Applikationen ==&lt;br /&gt;
&lt;br /&gt;
=== Support &amp;amp; Kommunikation ===&lt;br /&gt;
* &#039;&#039;&#039;[[Intern:Hauptseite/UVdesk|UVdesk Helpdesk]]&#039;&#039;&#039; – Unser zentrales Ticket-System.&lt;br /&gt;
** [[Intern:Hauptseite/UVdesk#Debugging-History|Debugging &amp;amp; Setup-Fixes]] (Wichtig für bplaced)&lt;br /&gt;
&lt;br /&gt;
=== Wissensmanagement ===&lt;br /&gt;
* &#039;&#039;&#039;[[MediaWiki]]&#039;&#039;&#039; – Dokumentation der Wiki-Struktur und Namensräume.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 💡 Tipps, Tricks &amp;amp; Best Practices ==&lt;br /&gt;
* &#039;&#039;&#039;Wiki-Syntax:&#039;&#039;&#039; Nutze &amp;lt;code&amp;gt;1=&amp;lt;/code&amp;gt; bei Vorlagen, wenn Gleichheitszeichen im Text vorkommen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/MinioS3&amp;diff=99</id>
		<title>Intern:Hauptseite/MinioS3</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/MinioS3&amp;diff=99"/>
		<updated>2026-03-23T21:09:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „== MinIO: High-Performance Private S3 Storage ==  &amp;#039;&amp;#039;&amp;#039;MinIO&amp;#039;&amp;#039;&amp;#039; is an open-source, high-performance object storage server that is 100% compatible with the &amp;#039;&amp;#039;&amp;#039;Amazon S3&amp;#039;&amp;#039;&amp;#039; API. Written in Go, it is designed to be the &amp;quot;software-defined&amp;quot; alternative to proprietary cloud storage.  === Core Architecture &amp;amp; Components === * &amp;#039;&amp;#039;&amp;#039;The Server:&amp;#039;&amp;#039;&amp;#039; A lightweight binary (&amp;lt;100MB) that can run as a standalone process or a Docker container. * &amp;#039;&amp;#039;&amp;#039;S3 Compatibility:&amp;#039;&amp;#039;&amp;#039; It s…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MinIO: High-Performance Private S3 Storage ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[MinIO]]&#039;&#039;&#039; is an open-source, high-performance object storage server that is 100% compatible with the &#039;&#039;&#039;Amazon S3&#039;&#039;&#039; API. Written in Go, it is designed to be the &amp;quot;software-defined&amp;quot; alternative to proprietary cloud storage.&lt;br /&gt;
&lt;br /&gt;
=== Core Architecture &amp;amp; Components ===&lt;br /&gt;
* &#039;&#039;&#039;The Server:&#039;&#039;&#039; A lightweight binary (&amp;lt;100MB) that can run as a standalone process or a Docker container.&lt;br /&gt;
* &#039;&#039;&#039;S3 Compatibility:&#039;&#039;&#039; It speaks the exact same &amp;quot;language&amp;quot; as AWS S3. Any application (Node.js, Python, etc.) or tool (Cyberduck, AWS CLI) that works with Amazon will work with your MinIO instance.&lt;br /&gt;
* &#039;&#039;&#039;Erasure Coding:&#039;&#039;&#039; MinIO protects data against hardware failure by breaking objects into data and parity blocks distributed across multiple drives. Even if you lose half your disks, your data remains intact.&lt;br /&gt;
* &#039;&#039;&#039;Bitrot Protection:&#039;&#039;&#039; It uses highwayhash checksums to ensure that the data you read is exactly the data you wrote, preventing &amp;quot;silent data corruption.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Setup &amp;amp; Implementation Guide ==&lt;br /&gt;
&lt;br /&gt;
=== Phase 1: Deploy MinIO via Portainer (The Origin) ===&lt;br /&gt;
To host your own S3 storage on your bare-metal server, use this Docker Compose stack in Portainer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
version: &#039;3.8&#039;&lt;br /&gt;
services:&lt;br /&gt;
  minio:&lt;br /&gt;
    image: quay.io/minio/minio:latest&lt;br /&gt;
    container_name: minio&lt;br /&gt;
    restart: always&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;9000:9000&amp;quot; # S3 API&lt;br /&gt;
      - &amp;quot;9001:9001&amp;quot; # Web Console&lt;br /&gt;
    environment:&lt;br /&gt;
      MINIO_ROOT_USER: admin&lt;br /&gt;
      MINIO_ROOT_PASSWORD: your_strong_password&lt;br /&gt;
    volumes:&lt;br /&gt;
      - minio_data:/data&lt;br /&gt;
    command: server /data --console-address &amp;quot;:9001&amp;quot;&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  minio_data:&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Phase 2: Global Propagation via Cloudflare (The Edge) ===&lt;br /&gt;
Since your server is local/bare-metal, use a &amp;quot;Pull-Based&amp;quot; CDN strategy to propagate files globally.&lt;br /&gt;
&lt;br /&gt;
==== Step 1: Establish the Tunnel ====&lt;br /&gt;
Do not open ports on your router. Use a &#039;&#039;&#039;Cloudflare Tunnel&#039;&#039;&#039; to point a domain (e.g., `s3.yourcompany.com`) to your local Port 9000.&lt;br /&gt;
&lt;br /&gt;
==== Step 2: Enable Tiered Cache ====&lt;br /&gt;
In the Cloudflare Dashboard, go to &#039;&#039;&#039;Caching &amp;gt; Tiered Cache&#039;&#039;&#039;.&lt;br /&gt;
* Enable &#039;&#039;&#039;Smart Tiered Cache Topology&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Why:&#039;&#039;&#039; This forces Cloudflare&#039;s 300+ PoPs to ask a few &amp;quot;Upper Tier&amp;quot; hubs for your files first. It prevents your local NAS from being &amp;quot;hammered&amp;quot; by every single global data center simultaneously.&lt;br /&gt;
&lt;br /&gt;
==== Step 3: The &amp;quot;Immutable&amp;quot; Header Trick ====&lt;br /&gt;
To ensure files stay in the global cache forever, set headers at the origin. &lt;br /&gt;
* &#039;&#039;&#039;Header:&#039;&#039;&#039; `Cache-Control: public, max-age=31536000, immutable`&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Phase 3: The &amp;quot;Pre-Warming&amp;quot; Strategy (Global Seeding) ==&lt;br /&gt;
&lt;br /&gt;
If you want your files to be fast &#039;&#039;&#039;before&#039;&#039;&#039; the first user arrives, you must &amp;quot;prime&amp;quot; the Cloudflare PoPs.&lt;br /&gt;
&lt;br /&gt;
=== Method A: The Python &amp;quot;Global Pinger&amp;quot; Script ===&lt;br /&gt;
Run this script from a VPS or your local machine. It uses a list of global proxy endpoints or simply triggers the Cloudflare Tiered Cache hubs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import requests&lt;br /&gt;
&lt;br /&gt;
# List your most &#039;heavy&#039; assets here (Images, JS Bundles, Video)&lt;br /&gt;
ASSETS = [&lt;br /&gt;
    &amp;quot;https://s3.yourcompany.com/bucket/large-header.webp&amp;quot;,&lt;br /&gt;
    &amp;quot;https://s3.yourcompany.com/bucket/main-bundle.js&amp;quot;,&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
def warm_cache():&lt;br /&gt;
    print(&amp;quot;Starting Global Cache Warm-up...&amp;quot;)&lt;br /&gt;
    for url in ASSETS:&lt;br /&gt;
        try:&lt;br /&gt;
            # We send a HEAD request to save bandwidth while triggering the CDN fetch&lt;br /&gt;
            response = requests.head(url)&lt;br /&gt;
            status = response.headers.get(&#039;CF-Cache-Status&#039;, &#039;MISS/HIT unknown&#039;)&lt;br /&gt;
            print(f&amp;quot;URL: {url} | CF-Status: {status}&amp;quot;)&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Failed to ping {url}: {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    warm_cache()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Method B: Third-Party Global Seeders ===&lt;br /&gt;
Instead of a VPN, use &amp;quot;Synthetic Monitoring&amp;quot; tools to ping your files from multiple global regions simultaneously:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[Checkly]]:&#039;&#039;&#039; (Recommended) Set up a &amp;quot;Browser Check&amp;quot; or &amp;quot;API Check.&amp;quot; In the settings, select 10+ locations (Tokyo, London, Sao Paulo, etc.). Schedule it to run once after every major deployment. It will &amp;quot;force&amp;quot; Cloudflare to pull your files to those specific regions.&lt;br /&gt;
* &#039;&#039;&#039;[[UptimeRobot]]:&#039;&#039;&#039; Create a &amp;quot;Keyword&amp;quot; or &amp;quot;HTTP&amp;quot; monitor for your heaviest asset. While its primary job is uptime, the side effect is that its global nodes will keep your Cloudflare cache &amp;quot;warm&amp;quot; and prevent it from expiring.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Professional &amp;quot;Peer&amp;quot; Tips ==&lt;br /&gt;
* &#039;&#039;&#039;Don&#039;t Warm Everything:&#039;&#039;&#039; Focus on &amp;quot;Heavy&amp;quot; files. A 5KB JSON file taking 200ms once is fine. A 5MB Hero Image taking 3 seconds is a disaster.&lt;br /&gt;
* &#039;&#039;&#039;Tiered Cache is Key:&#039;&#039;&#039; Without Tiered Cache, pre-warming is much harder because you&#039;d have to ping 300+ cities. With Tiered Cache, you only need to hit the &amp;quot;Upper Tier&amp;quot; hubs (usually 5-10 global locations).&lt;br /&gt;
&lt;br /&gt;
== References &amp;amp; Further Learning ==&lt;br /&gt;
* [https://www.min.io/docs/minio/linux/index.html Official MinIO Documentation]&lt;br /&gt;
* [https://www.checklyhq.com/docs/monitoring/global-locations/ Checkly: Global Monitoring Locations]&lt;br /&gt;
* [https://developers.cloudflare.com/cache/how-to/tiered-cache/ Cloudflare Tiered Cache Explained]&lt;br /&gt;
* [https://www.youtube.com/watch?v=eqqA7qxAzHU Video: MinIO vs S3 Performance Deep Dive]&lt;br /&gt;
* [https://www.youtube.com/watch?v=hyBelB1S8KI Video: Cloudflare Cache Reserve Walkthrough]&lt;br /&gt;
* [https://www.youtube.com/watch?v=6w8v89In-mQ Video: How CDNs work (The Pull Method)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure]] [[Category:Storage]] [[Category:DevOps]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/Bplaced/PHP-ini-Konfiguration&amp;diff=98</id>
		<title>Intern:Hauptseite/Bplaced/PHP-ini-Konfiguration</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/Bplaced/PHP-ini-Konfiguration&amp;diff=98"/>
		<updated>2026-02-25T19:49:58Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= PHP-CGI Wrapper &amp;amp; PHP-ini-Konfiguration auf bplaced =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
Dieses Skript dient als Wrapper für PHP-CGI auf Shared-Hosting-Systemen wie bplaced.  &lt;br /&gt;
Ziele:&lt;br /&gt;
* Automatische PHP-Versionserkennung&lt;br /&gt;
* Dynamische Pfad- und Modulkonfiguration&lt;br /&gt;
* OpenBaseDir-Management&lt;br /&gt;
* Integration von Composer-, Mailparse- und IMAP-Pfaden&lt;br /&gt;
* Logging &amp;amp; Debugging&lt;br /&gt;
&lt;br /&gt;
== Aufbau des Wrappers ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Debug-Flag &amp;amp; Argumente ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
DEBUG=0&lt;br /&gt;
for ARG in &amp;quot;$@&amp;quot;; do&lt;br /&gt;
    if [ &amp;quot;$ARG&amp;quot; = &amp;quot;-vv&amp;quot; ]; then&lt;br /&gt;
        DEBUG=1&lt;br /&gt;
        break&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Prüft, ob `-vv` übergeben wird, um Debug-Ausgaben zu aktivieren.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Zu viele Debug-Ausgaben können CGI-Output zerstören.&lt;br /&gt;
&lt;br /&gt;
=== 2. System-Pfad Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ORIGINAL_PATH=&amp;quot;$PATH&amp;quot;&lt;br /&gt;
export PATH=&amp;quot;/usr/share/7.4/ext/bin:/usr/share/8.2/ext/bin:/usr/share/8.3/ext/bin:$ORIGINAL_PATH&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Priorisiert bplaced-spezifische PHP-Binaries.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Fehlende Binaries verhindern Script-Ausführung.&lt;br /&gt;
&lt;br /&gt;
=== 3. Wrapper-Signal ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[[ &amp;quot;$DEBUG&amp;quot; -eq 1 ]] &amp;amp;&amp;amp; echo &amp;quot;PHPWRAPPER_CALL&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Signalisiert den Start des Wrappers bei Debug-Modus.&lt;br /&gt;
&lt;br /&gt;
=== 4. Output-Kontrolle ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
exec 3&amp;gt;&amp;amp;1 4&amp;gt;&amp;amp;2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Speichert stdout &amp;amp; stderr für spätere Wiederherstellung.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Falsches Zurücksetzen unterdrückt Ausgabe.&lt;br /&gt;
&lt;br /&gt;
=== 5. Fehlerbehandlung ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
handle_error() {&lt;br /&gt;
    [[ &amp;quot;$DEBUG&amp;quot; -eq 1 ]] &amp;amp;&amp;amp; echo &amp;quot;Error on line $1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
trap &#039;handle_error $LINENO&#039; ERR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Fängt Script-Fehler ab.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Subshell-Fehler werden nicht immer erfasst.&lt;br /&gt;
&lt;br /&gt;
=== 6. Laufzeit- &amp;amp; Kontextdaten ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
datetime=$(date +&amp;quot;%Y-%m-%d %H:%M:%S&amp;quot;)&lt;br /&gt;
calling_process_info=$(ps -p $$ | tail -n 1)&lt;br /&gt;
current_directory=$(pwd)&lt;br /&gt;
script_name=&amp;quot;$0&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Nützliche Metadaten für Logging.&lt;br /&gt;
&lt;br /&gt;
=== 7. User- &amp;amp; Host-Kontext ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
USERNAME=&#039;peterpatoschka&#039;&lt;br /&gt;
HOST=&#039;server6.bplaced.net&#039;&lt;br /&gt;
source /users/_core/${USERNAME}/env&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Lädt Benutzer-Umgebungsvariablen.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; `env` muss lesbar sein.&lt;br /&gt;
&lt;br /&gt;
=== 8. PHP-Versionserkennung ===&lt;br /&gt;
* Erkennung via `.php-version` oder Verzeichnisregel für Support-Projekte.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Leerzeichen in `.php-version` oder fehlende Datei verhindern korrekte Erkennung.&lt;br /&gt;
&lt;br /&gt;
=== 9. PHP Basis-Konfiguration ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export PHP_INI_SCAN_DIR=&amp;quot;/users/${USERNAME}/etc/php/${PV}&amp;quot;&lt;br /&gt;
export PHPRC=&amp;quot;${PHP_INI_SCAN_DIR}/php.ini&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Bestimmt benutzerdefinierte PHP-INIs.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Falsche Pfade verhindern Modul-Laden.&lt;br /&gt;
&lt;br /&gt;
=== 10. Pfaddefinitionen ===&lt;br /&gt;
* BASE_PATH, TEMP_PATH, Composer-Pfade, Vendor-Pfade.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Schreibrechte prüfen.&lt;br /&gt;
&lt;br /&gt;
=== 11. OpenBaseDir ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
OB=&amp;quot;/users/${USERNAME}/:/users/_temp/${USERNAME}:/etc/ssl/certs/:/etc/ca-certificates/&amp;quot;&lt;br /&gt;
OB=&amp;quot;${OB}:${COMPOSER_CONFIG_PATH}:${COMPOSER_CACHE_PATH}:${COMPOSER_SHARE_PATH}&amp;quot;&lt;br /&gt;
OB=&amp;quot;${OB}:${DIRTYFIX_PATH}&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Limitiert Dateizugriffe auf sichere Pfade.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Fehlerhafte OB-Pfade blockieren Zugriff auf Temp, Composer, SSL.&lt;br /&gt;
&lt;br /&gt;
=== 12. Projekt- / Release-Erkennung ===&lt;br /&gt;
* Fügt Vendor-Pfade dynamisch zu OB hinzu.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Einzelne Dateien als OB-Pfad können fehlschlagen.&lt;br /&gt;
&lt;br /&gt;
=== 13. PHP-Module ===&lt;br /&gt;
* IonCube, Mailparse, IMAP werden nur geladen, wenn vorhanden.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Fehlende `.so` Dateien verhindern PHP-Start.&lt;br /&gt;
&lt;br /&gt;
=== 14. PHP-CGI Kommando ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
CGI=(&lt;br /&gt;
    /usr/share/${PV}${PR}/bin/php&lt;br /&gt;
    -c /users/${USERNAME}/etc/php/${PV}${PR}/php.ini&lt;br /&gt;
    $IC $MP $IMAP&lt;br /&gt;
    -d curl.cainfo=/etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
    -d memory_limit=${MM:=256}M&lt;br /&gt;
    -d open_basedir=&amp;quot;${OB}&amp;quot;&lt;br /&gt;
    -d upload_tmp_dir=&amp;quot;${TEMP_PATH}/&amp;quot;&lt;br /&gt;
    -d session.save_path=&amp;quot;${TEMP_PATH}/&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Fallstricke:&#039;&#039;&#039; curl-Zertifikate, Memory-Limit, Schreibrechte beachten.&lt;br /&gt;
&lt;br /&gt;
=== 15. Logging ===&lt;br /&gt;
* Aufruf wird in zentralem Logfile protokolliert.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Logfile muss beschreibbar sein.&lt;br /&gt;
&lt;br /&gt;
=== 16. Cleanup &amp;amp; Ausführung ===&lt;br /&gt;
* Temporäre Variablen löschen und PHP-CGI ausführen.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung Fallstränge ==&lt;br /&gt;
* OpenBaseDir → Zugriff auf Temp, Composer, SSL&lt;br /&gt;
* PHP-Module → IonCube, Mailparse, IMAP&lt;br /&gt;
* SSL → curl.cainfo&lt;br /&gt;
* Schreibrechte → Temp-Ordner, Logfile&lt;br /&gt;
* PHP-Version → Module/Pfade unterschiedlich&lt;br /&gt;
* Debug/Logging → CGI-Output zerstörbar&lt;br /&gt;
&lt;br /&gt;
== Code-Uebersicht ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
###############################################################################&lt;br /&gt;
# PHP CGI WRAPPER&lt;br /&gt;
#&lt;br /&gt;
# Logik:&lt;br /&gt;
# 1. Debug-Modus &amp;amp; Pfad-Initialisierung&lt;br /&gt;
# 2. Fehlerbehandlung &amp;amp; Umgebungsvariablen&lt;br /&gt;
# 3. Dynamische PHP-Versionserkennung (.php-version oder Projektpfad)&lt;br /&gt;
# 4. Konfiguration von PHP_INI_SCAN_DIR &amp;amp; Open_Basedir (OB)&lt;br /&gt;
# 5. Modul-Check (IonCube, Mailparse, IMAP)&lt;br /&gt;
# 6. Finaler PHP-CGI Call&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# --- 1. DEBUG-FLAG AUS ARGUMENTEN ---&lt;br /&gt;
# Prüft, ob -vv übergeben wurde, um zusätzliche Infos auszugeben.&lt;br /&gt;
DEBUG=0&lt;br /&gt;
for ARG in &amp;quot;$@&amp;quot;; do&lt;br /&gt;
    if [ &amp;quot;$ARG&amp;quot; = &amp;quot;-vv&amp;quot; ]; then&lt;br /&gt;
        DEBUG=1&lt;br /&gt;
        break&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# --- 2. SYSTEM PATH FIX ---&lt;br /&gt;
# Priorisiert die bplaced-spezifischen Binaries in der PATH-Variable.&lt;br /&gt;
ORIGINAL_PATH=&amp;quot;$PATH&amp;quot;&lt;br /&gt;
export PATH=&amp;quot;/usr/share/7.4/ext/bin:/usr/share/8.2/ext/bin:/usr/share/8.3/ext/bin:$ORIGINAL_PATH&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# --- 3. WRAPPER-SIGNAL ---&lt;br /&gt;
# Signalisiert den Start des Wrappers bei aktivem Debugging.&lt;br /&gt;
[[ &amp;quot;$DEBUG&amp;quot; -eq 1 ]] &amp;amp;&amp;amp; echo &amp;quot;PHPWRAPPER_CALL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# --- 4. OUTPUT-KONTROLLE ---&lt;br /&gt;
# Sichert die Standard-Descriptoren für spätere Verwendung.&lt;br /&gt;
exec 3&amp;gt;&amp;amp;1 4&amp;gt;&amp;amp;2&lt;br /&gt;
&lt;br /&gt;
# --- 5. FEHLERBEHANDLUNG ---&lt;br /&gt;
# Einfacher Trap, um Fehlerzeilen im Debug-Modus auszugeben.&lt;br /&gt;
handle_error() {&lt;br /&gt;
    [[ &amp;quot;$DEBUG&amp;quot; -eq 1 ]] &amp;amp;&amp;amp; echo &amp;quot;Error on line $1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
trap &#039;handle_error $LINENO&#039; ERR&lt;br /&gt;
&lt;br /&gt;
# --- 6. LAUFZEIT- &amp;amp; KONTEXTDATEN ---&lt;br /&gt;
datetime=$(date +&amp;quot;%Y-%m-%d %H:%M:%S&amp;quot;)&lt;br /&gt;
calling_process_info=$(ps -p $$ | tail -n 1)&lt;br /&gt;
current_directory=$(pwd)&lt;br /&gt;
script_name=&amp;quot;$0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# --- 7. USER- &amp;amp; HOST-KONTEXT ---&lt;br /&gt;
USERNAME=&#039;peterpatoschka&#039;&lt;br /&gt;
HOST=&#039;server6.bplaced.net&#039;&lt;br /&gt;
source /users/_core/${USERNAME}/env&lt;br /&gt;
&lt;br /&gt;
# --- 8. PHP-VERSION ERKENNUNG ---&lt;br /&gt;
# Ermittelt die PHP-Version basierend auf Verzeichnissen oder .php-version Dateien.&lt;br /&gt;
PV=&amp;quot;7.4&amp;quot; # Initialer Default&lt;br /&gt;
&lt;br /&gt;
detect_php_version_file() {&lt;br /&gt;
    local dir=&amp;quot;$current_directory&amp;quot;&lt;br /&gt;
    local BASE_PATH_LOCAL=&amp;quot;/users/${USERNAME}/www&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Sonderregel für Support-Projekt&lt;br /&gt;
    if [[ &amp;quot;$dir&amp;quot; == &amp;quot;$BASE_PATH_LOCAL/support&amp;quot;* ]]; then&lt;br /&gt;
        PV=&amp;quot;8.3&amp;quot;&lt;br /&gt;
        [[ &amp;quot;$DEBUG&amp;quot; -eq 1 ]] &amp;amp;&amp;amp; echo &amp;quot;Forced PHP 8.3 for support project&amp;quot;&lt;br /&gt;
        return&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    # Rekursive Suche nach .php-version Datei nach oben bis zum Root&lt;br /&gt;
    while [[ &amp;quot;$dir&amp;quot; != &amp;quot;/&amp;quot; &amp;amp;&amp;amp; &amp;quot;$dir&amp;quot; == &amp;quot;$BASE_PATH_LOCAL&amp;quot;* ]]; do&lt;br /&gt;
        if [[ -f &amp;quot;$dir/.php-version&amp;quot; ]]; then&lt;br /&gt;
            local version&lt;br /&gt;
            version=$(tr -d &#039;[:space:]&#039; &amp;lt; &amp;quot;$dir/.php-version&amp;quot;)&lt;br /&gt;
            if [[ &amp;quot;$version&amp;quot; =~ ^8\.[2-3]$ ]]; then&lt;br /&gt;
                PV=&amp;quot;$version&amp;quot;&lt;br /&gt;
                return&lt;br /&gt;
            fi&lt;br /&gt;
        fi&lt;br /&gt;
        dir=$(dirname &amp;quot;$dir&amp;quot;)&lt;br /&gt;
    done&lt;br /&gt;
}&lt;br /&gt;
detect_php_version_file&lt;br /&gt;
&lt;br /&gt;
# Wenn PHP 8.x genutzt wird, erzwinge /ext Variante&lt;br /&gt;
if [[ &amp;quot;$PV&amp;quot; =~ ^8\. ]]; then&lt;br /&gt;
    PR=&amp;quot;/ext&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# --- 9. PHP BASIS KONFIGURATION ---&lt;br /&gt;
# Setzt die Pfade für die INI-Dateien basierend auf der erkannten Version.&lt;br /&gt;
export PHP_INI_SCAN_DIR=&amp;quot;/users/${USERNAME}/etc/php/${PV}&amp;quot;&lt;br /&gt;
export PHPRC=&amp;quot;${PHP_INI_SCAN_DIR}/php.ini&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# --- 10. PFADDEFINITIONEN ---&lt;br /&gt;
BASE_PATH=&amp;quot;/users/${USERNAME}/www&amp;quot;&lt;br /&gt;
TEMP_PATH=&amp;quot;/users/_temp/${USERNAME}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
COMPOSER_CONFIG_PATH=&amp;quot;/users/${USERNAME}/.config/composer/&amp;quot;&lt;br /&gt;
COMPOSER_CACHE_PATH=&amp;quot;/users/${USERNAME}/.cache/composer/&amp;quot;&lt;br /&gt;
COMPOSER_SHARE_PATH=&amp;quot;/users/${USERNAME}/.local/share/composer/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP_BASE_PATH=&amp;quot;/usr/share/7.4/ext/bin/php&amp;quot;&lt;br /&gt;
DIRTYFIX_PATH=&amp;quot;/users/${USERNAME}/www/shopwareshow/release/vendor/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# --- 11. OPEN_BASEDIR (OB) - BASIS ---&lt;br /&gt;
PHP_CONFIG_PATH=&amp;quot;/users/${USERNAME}/etc/php/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Grundberechtigung für User, Temp und SSL-Zertifikate&lt;br /&gt;
OB=&amp;quot;/users/${USERNAME}/:/users/_temp/${USERNAME}:/etc/ssl/certs/:/etc/ca-certificates/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Composer-Pfade hinzufügen&lt;br /&gt;
OB=&amp;quot;${OB}:${COMPOSER_CONFIG_PATH}:${COMPOSER_CACHE_PATH}:${COMPOSER_SHARE_PATH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# DIRTYFIX hinzufügen&lt;br /&gt;
OB=&amp;quot;${OB}:${DIRTYFIX_PATH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# --- 12. PROJEKT / RELEASE ERKENNUNG (OB ERWEITERUNG) ---&lt;br /&gt;
# Durchsucht www-Verzeichnis nach Projekten und deren Releases (für Vendor-Zugriff).&lt;br /&gt;
PROJECT_PATHS=()&lt;br /&gt;
for dir in &amp;quot;${BASE_PATH}&amp;quot;/*; do&lt;br /&gt;
    [[ -d &amp;quot;$dir&amp;quot; ]] &amp;amp;&amp;amp; PROJECT_PATHS+=(&amp;quot;$dir&amp;quot;)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
RELEASE_PATHS=()&lt;br /&gt;
for PROJECT_PATH in &amp;quot;${PROJECT_PATHS[@]}&amp;quot;; do&lt;br /&gt;
    if [[ -d &amp;quot;${PROJECT_PATH}/app/releases&amp;quot; ]]; then&lt;br /&gt;
        for dir in &amp;quot;${PROJECT_PATH}/app/releases/&amp;quot;*; do&lt;br /&gt;
            [[ -d &amp;quot;$dir&amp;quot; ]] &amp;amp;&amp;amp; RELEASE_PATHS+=(&amp;quot;$dir&amp;quot;)&lt;br /&gt;
        done&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
for RELEASE_PATH in &amp;quot;${RELEASE_PATHS[@]}&amp;quot;; do&lt;br /&gt;
    OB=&amp;quot;${OB}:${RELEASE_PATH}/vendor/&amp;quot;&lt;br /&gt;
    OB=&amp;quot;${OB}:${RELEASE_PATH}/vendor/autoload.php&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
[[ &amp;quot;$DEBUG&amp;quot; -eq 1 ]] &amp;amp;&amp;amp; echo &amp;quot;Generated OB: \&amp;quot;$OB\&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# --- 13. HTTP-/CGI-VARIABLEN INITIALISIERUNG ---&lt;br /&gt;
IC=&#039;&#039;   # IonCube&lt;br /&gt;
MP=&#039;&#039;   # Mailparse&lt;br /&gt;
IMAP=&#039;&#039; # IMAP&lt;br /&gt;
&lt;br /&gt;
# --- 14. PHP MODUL LOGIK (IONCUBE) ---&lt;br /&gt;
[[ &amp;quot;$HTTP_IC&amp;quot; == &amp;quot;1&amp;quot; ]] &amp;amp;&amp;amp; IC=&amp;quot;-d zend_extension=/etc/bplaced/php/${PV}/ioncube_loader_lin_${PV}.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# --- 15. PHP MODUL LOGIK (MAILPARSE - NUR PHP 8.3) ---&lt;br /&gt;
MAILPARSE_SO=&amp;quot;/etc/bplaced/php/8.3/mailparse.so&amp;quot;&lt;br /&gt;
if [[ &amp;quot;$PV&amp;quot; == &amp;quot;8.3&amp;quot; &amp;amp;&amp;amp; -f &amp;quot;$MAILPARSE_SO&amp;quot; ]]; then&lt;br /&gt;
    MP=&amp;quot;-d extension=${MAILPARSE_SO}&amp;quot;&lt;br /&gt;
    [[ &amp;quot;$DEBUG&amp;quot; -eq 1 ]] &amp;amp;&amp;amp; echo &amp;quot;Loaded mailparse for PHP 8.3&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# --- 16. PHP MODUL LOGIK (IMAP - NUR PHP 8.3) ---&lt;br /&gt;
IMAP_SO=&amp;quot;/etc/bplaced/php/8.3/imap.so&amp;quot;&lt;br /&gt;
if [[ &amp;quot;$PV&amp;quot; == &amp;quot;8.3&amp;quot; &amp;amp;&amp;amp; -f &amp;quot;$IMAP_SO&amp;quot; ]]; then&lt;br /&gt;
    IMAP=&amp;quot;-d extension=${IMAP_SO}&amp;quot;&lt;br /&gt;
    [[ &amp;quot;$DEBUG&amp;quot; -eq 1 ]] &amp;amp;&amp;amp; echo &amp;quot;Loaded IMAP for PHP 8.3&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# --- 17. PHP CGI KOMMANDO DEFINITION ---&lt;br /&gt;
CGI=(&lt;br /&gt;
    /usr/share/${PV}${PR}/bin/php&lt;br /&gt;
    -c /users/${USERNAME}/etc/php/${PV}${PR}/php.ini&lt;br /&gt;
    $IC&lt;br /&gt;
    $MP&lt;br /&gt;
    $IMAP&lt;br /&gt;
    -d curl.cainfo=/etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
    -d memory_limit=${MM:=256}M&lt;br /&gt;
    -d max_execution_time=${ET:=480}&lt;br /&gt;
    -d open_basedir=&amp;quot;${OB}&amp;quot;&lt;br /&gt;
    -d upload_tmp_dir=&amp;quot;${TEMP_PATH}/&amp;quot;&lt;br /&gt;
    -d session.save_path=&amp;quot;${TEMP_PATH}/&amp;quot;&lt;br /&gt;
    -d soap.wsdl_cache_dir=&amp;quot;${TEMP_PATH}/&amp;quot;&lt;br /&gt;
    -d sys_temp_dir=&amp;quot;${TEMP_PATH}/&amp;quot;&lt;br /&gt;
    -d sendmail_path=&amp;quot;/usr/bin/msmtp -t -i --from=&#039;${USERNAME}@${HOST}&#039;&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# --- 18. LOGGING ---&lt;br /&gt;
# Schreibt den Aufruf in das zentrale Logfile des Users.&lt;br /&gt;
echo -e &amp;quot;${datetime}\t${calling_process_info}, ${current_directory}, ${script_name}, ${PV}&amp;quot; \&lt;br /&gt;
    &amp;gt;&amp;gt; &amp;quot;/users/${USERNAME}/php_access_logfile&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# --- 19. CLEANUP ---&lt;br /&gt;
# Entfernt genutzte Variablen aus der Umgebung vor dem exec.&lt;br /&gt;
unset HTTP_ET HTTP_IC HTTP_MM HTTP_PV HTTP_PR HTTP_SA&lt;br /&gt;
unset ET IC MM PR SA MP IMAP&lt;br /&gt;
&lt;br /&gt;
# --- 20. OUTPUT WIEDER AKTIVIEREN ---&lt;br /&gt;
exec &amp;gt;&amp;amp;3 2&amp;gt;&amp;amp;4&lt;br /&gt;
exec 3&amp;gt;&amp;amp;- 4&amp;gt;&amp;amp;-&lt;br /&gt;
&lt;br /&gt;
# --- 21. PHP AUSFÜHREN ---&lt;br /&gt;
# Finaler Aufruf der PHP-Binary mit allen Argumenten.&lt;br /&gt;
[[ &amp;quot;$DEBUG&amp;quot; -eq 1 ]] &amp;amp;&amp;amp; echo &amp;quot;${CGI[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
exec &amp;quot;${CGI[@]}&amp;quot; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/Bplaced&amp;diff=97</id>
		<title>Intern:Hauptseite/Bplaced</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/Bplaced&amp;diff=97"/>
		<updated>2026-02-25T19:47:48Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Infrastruktur-Analyse: bplaced für Professional Hosting ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Architektur &amp;amp; System-Design ===&lt;br /&gt;
bplaced nutzt eine &#039;&#039;&#039;verteilte Shared-Hosting-Architektur&#039;&#039;&#039;. Im Gegensatz zu monolithischen Systemen sind Web-Server (Apache), Datenbank-Server (MariaDB/PostgreSQL) und Storage-Server physisch getrennt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cluster-Logik:&#039;&#039;&#039; User werden auf spezifische Server-Cluster (z.B. server6, server12) verteilt. Dies ist bei der Konfiguration von Datenbank-Hosts (oft `localhost`, aber bei externen Zugriffen der Cluster-Name) zu beachten.&lt;br /&gt;
* &#039;&#039;&#039;Storage-Backend:&#039;&#039;&#039; Die Speicherung erfolgt oft über Netzwerk-Dateisysteme. Dies bedeutet eine leicht erhöhte Latenz bei Dateizugriffen (I/O), was Caching-Mechanismen (Redis/OPcache) für Frameworks wie Symfony oder Shopware essenziell macht.&lt;br /&gt;
&lt;br /&gt;
=== 2. PHP-Runtime &amp;amp; Prozess-Management ===&lt;br /&gt;
Die PHP-Execution erfolgt primär über &#039;&#039;&#039;FastCGI&#039;&#039;&#039;. Dies ermöglicht eine saubere Trennung der User-Berechtigungen, bringt aber Besonderheiten im Prozess-Handling mit sich.&lt;br /&gt;
&lt;br /&gt;
==== Memory &amp;amp; Execution Limits ====&lt;br /&gt;
In professionellen Umgebungen stoßen Symfony-Commands oft an die Standard-Limits. &lt;br /&gt;
* &#039;&#039;&#039;CLI-Override:&#039;&#039;&#039; Via Wrapper-Script können `memory_limit` und `max_execution_time` oft höher gesetzt werden als im Web-Kontext.&lt;br /&gt;
* &#039;&#039;&#039;Zustandslosigkeit:&#039;&#039;&#039; Da Prozesse nach Timeouts hart beendet werden, sollten Long-Running-Tasks (wie Mail-Abruf oder Massen-Indizierung) in kleine Batches unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
==== Erweiterte Modul-Verfügbarkeit ====&lt;br /&gt;
Viele für Enterprise-Systeme kritische Module sind vorhanden, müssen aber oft manuell adressiert werden:&lt;br /&gt;
* &#039;&#039;&#039;Mailparse &amp;amp; IMAP:&#039;&#039;&#039; Essenziell für Ticket-Systeme (UVdesk). Pfade liegen oft unter `/usr/share/php[Version]/ext/`.&lt;br /&gt;
* &#039;&#039;&#039;BCMath &amp;amp; Intl:&#039;&#039;&#039; Meist standardmäßig aktiv, für E-Commerce (Preiskalkulationen) unverzichtbar.&lt;br /&gt;
&lt;br /&gt;
=== 3. Sicherheit &amp;amp; Zugriffskontrolle ===&lt;br /&gt;
&lt;br /&gt;
==== Open_basedir &amp;amp; Symlink-Sicherheit ====&lt;br /&gt;
Das `open_basedir`-Konzept ist bei bplaced sehr strikt. &lt;br /&gt;
* &#039;&#039;&#039;Problem:&#039;&#039;&#039; Frameworks, die mit Symlinks arbeiten (z.B. `public/storage`), scheitern, wenn der Zielpfad nicht explizit in der `open_basedir`-Variable der PHP-Konfiguration enthalten ist.&lt;br /&gt;
* &#039;&#039;&#039;Fix:&#039;&#039;&#039; Der PHP-Wrapper muss dynamisch die Pfade des aktuellen Release-Ordners inkludieren (besonders bei Atomic Deployments).&lt;br /&gt;
&lt;br /&gt;
==== SSL/TLS Handling ====&lt;br /&gt;
bplaced integriert Let&#039;s Encrypt. Profi-Tipp: Symfony-Apps hinter dem bplaced-Proxy benötigen oft die Konfiguration von `Trusted Proxies`, damit `isSecure()` und Redirects auf HTTPS korrekt funktionieren.&lt;br /&gt;
&lt;br /&gt;
=== 4. Netzwerk-Restriktionen &amp;amp; Mail-Ökosystem ===&lt;br /&gt;
&lt;br /&gt;
==== Socket-Verbindungen (Die &amp;quot;Free&amp;quot;-Barriere) ====&lt;br /&gt;
Einer der größten Fallstricke für Profi-Systeme:&lt;br /&gt;
* &#039;&#039;&#039;Outbound Traffic:&#039;&#039;&#039; Verbindungen zu externen APIs (Stripe, PayPal, Mailgun) oder Mail-Servern (IMAP/SMTP) sind in der Basis-Version oft limitiert oder gesperrt.&lt;br /&gt;
* &#039;&#039;&#039;Lösung:&#039;&#039;&#039; Upgrade auf bplaced Pro/Business schaltet Sockets frei. Ohne diese bleiben Mail-Abrufe (`uvdesk:refresh-mailbox`) trotz korrektem Code ergebnislos.&lt;br /&gt;
&lt;br /&gt;
==== Mail-Reputation ====&lt;br /&gt;
Shared-Hosting-IPs stehen oft auf Blacklists. &lt;br /&gt;
* &#039;&#039;&#039;Strategie:&#039;&#039;&#039; Für geschäftskritische Mails (Bestellbestätigungen, Tickets) sollte niemals der lokale `sendmail`-Pfad, sondern ein dedizierter SMTP-Relay-Provider genutzt werden.&lt;br /&gt;
&lt;br /&gt;
=== 5. DevOp-Workflow &amp;amp; Deployment ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Thema !! Empfehlung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Environment Variables&#039;&#039;&#039; || `.env` Dateien werden unterstützt, aber der PHP-Wrapper sollte sicherstellen, dass diese nicht via Browser (z.B. in falsch konfigurierten Sub-Verzeichnissen) auslesbar sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Git-Deploy&#039;&#039;&#039; || Da kein direktes `git push` auf das Web-Verzeichnis möglich ist, sollte ein Workflow über GitHub Actions oder GitLab CI (via FTP/SFTP oder SSH) implementiert werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Composer&#039;&#039;&#039; || Composer sollte lokal oder in einer CI/CD-Pipeline ausgeführt werden. Das Ausführen von `composer install` auf dem Server kann durch Memory-Limits scheitern.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 6. Professionelle Checkliste für bplaced ===&lt;br /&gt;
* [ ] &#039;&#039;&#039;Absolute Pfade:&#039;&#039;&#039; Pfade wie `/users/NAME/www/support/bin/console` statt relativer Pfade verwenden.&lt;br /&gt;
* [ ] &#039;&#039;&#039;Temp-Ordner:&#039;&#039;&#039; `sys_temp_dir` auf `/users/_temp/NAME` biegen, um Schreibfehler in `/tmp` zu vermeiden.&lt;br /&gt;
* [ ] &#039;&#039;&#039;OPcache Flush:&#039;&#039;&#039; Nach jedem Deployment `php_cache_clear()` oder Neustart der CGI-Instanz erzwingen (via bplaced Panel oder Wrapper-Touch).&lt;br /&gt;
* [ ] &#039;&#039;&#039;Logs:&#039;&#039;&#039; Regelmäßige Rotation der `php_access_logfile` und Framework-Logs, da Quota-Überschreitungen zum Systemstopp führen.&lt;br /&gt;
&lt;br /&gt;
=== 7. PHP Wrapper Scripts ===&lt;br /&gt;
* [ ] &#039;&#039;&#039;Die Konteneinschraenkung:&#039;&#039;&#039; Es kann zwar ein Nutzer in pro/max versch. min. 2 Konten haben, bspw. bietet sich das an um eine als &#039;Production&#039; und eine als &#039;Staging&#039; zu halten, aber pro Konto kann immer nur eine PHP-Version gewaehlt werden. daher bieten sich da PHP Wrapper Skripte an.&lt;br /&gt;
&lt;br /&gt;
* [ ] &#039;&#039;&#039;Das default PHP Wrapper Script&#039;&#039;&#039; Das kann zwar schon einiges, siehe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
USERNAME=&#039;peterpatoschka&#039;;&lt;br /&gt;
HOST=&#039;server6.bplaced.net&#039;;&lt;br /&gt;
&lt;br /&gt;
source /users/_core/${USERNAME}/env&lt;br /&gt;
&lt;br /&gt;
IC=&#039;&#039;;&lt;br /&gt;
PR=&#039;&#039;;&lt;br /&gt;
PV=&#039;&#039;;&lt;br /&gt;
OB=&amp;quot;/users/${USERNAME}/:/users/_temp/${USERNAME}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
if [ ! -z ${PHP+b} ]; then HTTP_PV=$PHP; fi&lt;br /&gt;
if [[ &amp;quot;$HTTP_SA&amp;quot; =~ ^[0-9a-z]{32}$ ]]; then SA=$HTTP_SA;  fi&lt;br /&gt;
if [[ &amp;quot;$HTTP_ET&amp;quot; =~ ^[0-9]{1,3}$ ]];   then ET=$HTTP_ET;  fi&lt;br /&gt;
if [[ &amp;quot;$HTTP_MM&amp;quot; =~ ^[0-9]{1,3}$ ]];   then MM=$HTTP_MM;  fi&lt;br /&gt;
if [[ &amp;quot;$HTTP_PV&amp;quot; =~ ^[5-9]\.[0-9]$ ]]; then PV=$HTTP_PV;  fi&lt;br /&gt;
if [[ &amp;quot;$HTTP_PR&amp;quot; =~ ^(pro)$ ]];        then PR=/$HTTP_PR; fi&lt;br /&gt;
if [[ &amp;quot;$HTTP_PR&amp;quot; =~ ^(max|business|enterprise|edu)$ ]]; then PR=/ext; OB=&amp;quot;&amp;quot;; fi&lt;br /&gt;
&lt;br /&gt;
if [[ &amp;quot;$HTTP_IC&amp;quot; = &amp;quot;1&amp;quot; ]]; then IC=&amp;quot;-d zend_extension=/etc/bplaced/php/${PV}/ioncube_loader_lin_${PV}.so&amp;quot;; fi&lt;br /&gt;
&lt;br /&gt;
if [[ &amp;quot;$USERNAME&amp;quot; =~ ^[a-z0-9][a-z0-9\-]{1,14}[a-z0-9]$ ]]; then&lt;br /&gt;
 CGI=(/usr/share/${PV}${PR}/bin/php -n ${IC}&lt;br /&gt;
  -d zend_extension=/etc/bplaced/php/${PV}/opcache.so&lt;br /&gt;
  -d extension=/etc/bplaced/php/8.3/mailparse.so&lt;br /&gt;
  -c /etc/bplaced/php/${PV}${PR}&lt;br /&gt;
  -d memory_limit=${MM=64}M&lt;br /&gt;
  -d max_execution_time=${ET=12}&lt;br /&gt;
  -d open_basedir=$OB&lt;br /&gt;
  -d upload_tmp_dir=&amp;quot;/users/_temp/${USERNAME}/&amp;quot;&lt;br /&gt;
  -d session.save_path=&amp;quot;/users/_temp/${USERNAME}/&amp;quot;&lt;br /&gt;
  -d sendmail_path=&amp;quot;/usr/bin/msmtp -t -i --from=&#039;${USERNAME}@${HOST}&#039; --user=&#039;${USERNAME}&#039; --password=&#039;echo ${SA}&#039; --&amp;quot;&lt;br /&gt;
  -d soap.wsdl_cache_dir=&amp;quot;/users/_temp/${USERNAME}/&amp;quot;&lt;br /&gt;
  -d sys_temp_dir=&amp;quot;/users/_temp/${USERNAME}/&amp;quot;&lt;br /&gt;
 )&lt;br /&gt;
else&lt;br /&gt;
 exit;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
unset HTTP_ET HTTP_IC HTTP_MM HTTP_PV HTTP_PR HTTP_SA ET IC MM PV PR PATH PWD SHLVL USERNAME SA&lt;br /&gt;
exec &amp;quot;${CGI[@]}&amp;quot; &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; Aber das ist dann noch ein wenig eingeschraenkt. &lt;br /&gt;
&lt;br /&gt;
* [ ] &#039;&#039;&#039;Custom PHP-Wrapper&#039;&#039;&#039; In Zusammenarbeit mit Miro v. Bplaced wurde ein Custom-Script erarbeitet &amp;lt;br \&amp;gt;--&amp;gt; siehe extra Artikel: [[Intern:Hauptseite/Bplaced/PHP-ini-Konfiguration|PHP-ini-Konfiguration]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Hosting-Architektur]] [[Kategorie:PHP-Administration]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/Bplaced/PHP-ini-Konfiguration&amp;diff=96</id>
		<title>Intern:Hauptseite/Bplaced/PHP-ini-Konfiguration</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/Bplaced/PHP-ini-Konfiguration&amp;diff=96"/>
		<updated>2026-02-25T19:36:06Z</updated>

		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „= PHP-CGI Wrapper &amp;amp; PHP-ini-Konfiguration auf bplaced =  == Übersicht == Dieses Skript dient als Wrapper für PHP-CGI auf Shared-Hosting-Systemen wie bplaced.   Ziele: * Automatische PHP-Versionserkennung * Dynamische Pfad- und Modulkonfiguration * OpenBaseDir-Management * Integration von Composer-, Mailparse- und IMAP-Pfaden * Logging &amp;amp; Debugging  == Aufbau des Wrappers ==  === 1. Debug-Flag &amp;amp; Argumente === &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; DEBUG=0 for ARG…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= PHP-CGI Wrapper &amp;amp; PHP-ini-Konfiguration auf bplaced =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
Dieses Skript dient als Wrapper für PHP-CGI auf Shared-Hosting-Systemen wie bplaced.  &lt;br /&gt;
Ziele:&lt;br /&gt;
* Automatische PHP-Versionserkennung&lt;br /&gt;
* Dynamische Pfad- und Modulkonfiguration&lt;br /&gt;
* OpenBaseDir-Management&lt;br /&gt;
* Integration von Composer-, Mailparse- und IMAP-Pfaden&lt;br /&gt;
* Logging &amp;amp; Debugging&lt;br /&gt;
&lt;br /&gt;
== Aufbau des Wrappers ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Debug-Flag &amp;amp; Argumente ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
DEBUG=0&lt;br /&gt;
for ARG in &amp;quot;$@&amp;quot;; do&lt;br /&gt;
    if [ &amp;quot;$ARG&amp;quot; = &amp;quot;-vv&amp;quot; ]; then&lt;br /&gt;
        DEBUG=1&lt;br /&gt;
        break&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Prüft, ob `-vv` übergeben wird, um Debug-Ausgaben zu aktivieren.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Zu viele Debug-Ausgaben können CGI-Output zerstören.&lt;br /&gt;
&lt;br /&gt;
=== 2. System-Pfad Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ORIGINAL_PATH=&amp;quot;$PATH&amp;quot;&lt;br /&gt;
export PATH=&amp;quot;/usr/share/7.4/ext/bin:/usr/share/8.2/ext/bin:/usr/share/8.3/ext/bin:$ORIGINAL_PATH&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Priorisiert bplaced-spezifische PHP-Binaries.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Fehlende Binaries verhindern Script-Ausführung.&lt;br /&gt;
&lt;br /&gt;
=== 3. Wrapper-Signal ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[[ &amp;quot;$DEBUG&amp;quot; -eq 1 ]] &amp;amp;&amp;amp; echo &amp;quot;PHPWRAPPER_CALL&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Signalisiert den Start des Wrappers bei Debug-Modus.&lt;br /&gt;
&lt;br /&gt;
=== 4. Output-Kontrolle ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
exec 3&amp;gt;&amp;amp;1 4&amp;gt;&amp;amp;2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Speichert stdout &amp;amp; stderr für spätere Wiederherstellung.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Falsches Zurücksetzen unterdrückt Ausgabe.&lt;br /&gt;
&lt;br /&gt;
=== 5. Fehlerbehandlung ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
handle_error() {&lt;br /&gt;
    [[ &amp;quot;$DEBUG&amp;quot; -eq 1 ]] &amp;amp;&amp;amp; echo &amp;quot;Error on line $1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
trap &#039;handle_error $LINENO&#039; ERR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Fängt Script-Fehler ab.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Subshell-Fehler werden nicht immer erfasst.&lt;br /&gt;
&lt;br /&gt;
=== 6. Laufzeit- &amp;amp; Kontextdaten ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
datetime=$(date +&amp;quot;%Y-%m-%d %H:%M:%S&amp;quot;)&lt;br /&gt;
calling_process_info=$(ps -p $$ | tail -n 1)&lt;br /&gt;
current_directory=$(pwd)&lt;br /&gt;
script_name=&amp;quot;$0&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Nützliche Metadaten für Logging.&lt;br /&gt;
&lt;br /&gt;
=== 7. User- &amp;amp; Host-Kontext ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
USERNAME=&#039;peterpatoschka&#039;&lt;br /&gt;
HOST=&#039;server6.bplaced.net&#039;&lt;br /&gt;
source /users/_core/${USERNAME}/env&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Lädt Benutzer-Umgebungsvariablen.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; `env` muss lesbar sein.&lt;br /&gt;
&lt;br /&gt;
=== 8. PHP-Versionserkennung ===&lt;br /&gt;
* Erkennung via `.php-version` oder Verzeichnisregel für Support-Projekte.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Leerzeichen in `.php-version` oder fehlende Datei verhindern korrekte Erkennung.&lt;br /&gt;
&lt;br /&gt;
=== 9. PHP Basis-Konfiguration ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export PHP_INI_SCAN_DIR=&amp;quot;/users/${USERNAME}/etc/php/${PV}&amp;quot;&lt;br /&gt;
export PHPRC=&amp;quot;${PHP_INI_SCAN_DIR}/php.ini&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Bestimmt benutzerdefinierte PHP-INIs.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Falsche Pfade verhindern Modul-Laden.&lt;br /&gt;
&lt;br /&gt;
=== 10. Pfaddefinitionen ===&lt;br /&gt;
* BASE_PATH, TEMP_PATH, Composer-Pfade, Vendor-Pfade.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Schreibrechte prüfen.&lt;br /&gt;
&lt;br /&gt;
=== 11. OpenBaseDir ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
OB=&amp;quot;/users/${USERNAME}/:/users/_temp/${USERNAME}:/etc/ssl/certs/:/etc/ca-certificates/&amp;quot;&lt;br /&gt;
OB=&amp;quot;${OB}:${COMPOSER_CONFIG_PATH}:${COMPOSER_CACHE_PATH}:${COMPOSER_SHARE_PATH}&amp;quot;&lt;br /&gt;
OB=&amp;quot;${OB}:${DIRTYFIX_PATH}&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Limitiert Dateizugriffe auf sichere Pfade.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Fehlerhafte OB-Pfade blockieren Zugriff auf Temp, Composer, SSL.&lt;br /&gt;
&lt;br /&gt;
=== 12. Projekt- / Release-Erkennung ===&lt;br /&gt;
* Fügt Vendor-Pfade dynamisch zu OB hinzu.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Einzelne Dateien als OB-Pfad können fehlschlagen.&lt;br /&gt;
&lt;br /&gt;
=== 13. PHP-Module ===&lt;br /&gt;
* IonCube, Mailparse, IMAP werden nur geladen, wenn vorhanden.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Fehlende `.so` Dateien verhindern PHP-Start.&lt;br /&gt;
&lt;br /&gt;
=== 14. PHP-CGI Kommando ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
CGI=(&lt;br /&gt;
    /usr/share/${PV}${PR}/bin/php&lt;br /&gt;
    -c /users/${USERNAME}/etc/php/${PV}${PR}/php.ini&lt;br /&gt;
    $IC $MP $IMAP&lt;br /&gt;
    -d curl.cainfo=/etc/ssl/certs/ca-certificates.crt&lt;br /&gt;
    -d memory_limit=${MM:=256}M&lt;br /&gt;
    -d open_basedir=&amp;quot;${OB}&amp;quot;&lt;br /&gt;
    -d upload_tmp_dir=&amp;quot;${TEMP_PATH}/&amp;quot;&lt;br /&gt;
    -d session.save_path=&amp;quot;${TEMP_PATH}/&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Fallstricke:&#039;&#039;&#039; curl-Zertifikate, Memory-Limit, Schreibrechte beachten.&lt;br /&gt;
&lt;br /&gt;
=== 15. Logging ===&lt;br /&gt;
* Aufruf wird in zentralem Logfile protokolliert.&lt;br /&gt;
* &#039;&#039;&#039;Fallstrick:&#039;&#039;&#039; Logfile muss beschreibbar sein.&lt;br /&gt;
&lt;br /&gt;
=== 16. Cleanup &amp;amp; Ausführung ===&lt;br /&gt;
* Temporäre Variablen löschen und PHP-CGI ausführen.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung Fallstränge ==&lt;br /&gt;
* OpenBaseDir → Zugriff auf Temp, Composer, SSL&lt;br /&gt;
* PHP-Module → IonCube, Mailparse, IMAP&lt;br /&gt;
* SSL → curl.cainfo&lt;br /&gt;
* Schreibrechte → Temp-Ordner, Logfile&lt;br /&gt;
* PHP-Version → Module/Pfade unterschiedlich&lt;br /&gt;
* Debug/Logging → CGI-Output zerstörbar&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/Bplaced&amp;diff=95</id>
		<title>Intern:Hauptseite/Bplaced</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/Bplaced&amp;diff=95"/>
		<updated>2026-02-25T19:34:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „__TOC__  == Infrastruktur-Analyse: bplaced für Professional Hosting ==  === 1. Architektur &amp;amp; System-Design === bplaced nutzt eine &amp;#039;&amp;#039;&amp;#039;verteilte Shared-Hosting-Architektur&amp;#039;&amp;#039;&amp;#039;. Im Gegensatz zu monolithischen Systemen sind Web-Server (Apache), Datenbank-Server (MariaDB/PostgreSQL) und Storage-Server physisch getrennt.  * &amp;#039;&amp;#039;&amp;#039;Cluster-Logik:&amp;#039;&amp;#039;&amp;#039; User werden auf spezifische Server-Cluster (z.B. server6, server12) verteilt. Dies ist bei der Konfiguration von Daten…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Infrastruktur-Analyse: bplaced für Professional Hosting ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Architektur &amp;amp; System-Design ===&lt;br /&gt;
bplaced nutzt eine &#039;&#039;&#039;verteilte Shared-Hosting-Architektur&#039;&#039;&#039;. Im Gegensatz zu monolithischen Systemen sind Web-Server (Apache), Datenbank-Server (MariaDB/PostgreSQL) und Storage-Server physisch getrennt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cluster-Logik:&#039;&#039;&#039; User werden auf spezifische Server-Cluster (z.B. server6, server12) verteilt. Dies ist bei der Konfiguration von Datenbank-Hosts (oft `localhost`, aber bei externen Zugriffen der Cluster-Name) zu beachten.&lt;br /&gt;
* &#039;&#039;&#039;Storage-Backend:&#039;&#039;&#039; Die Speicherung erfolgt oft über Netzwerk-Dateisysteme. Dies bedeutet eine leicht erhöhte Latenz bei Dateizugriffen (I/O), was Caching-Mechanismen (Redis/OPcache) für Frameworks wie Symfony oder Shopware essenziell macht.&lt;br /&gt;
&lt;br /&gt;
=== 2. PHP-Runtime &amp;amp; Prozess-Management ===&lt;br /&gt;
Die PHP-Execution erfolgt primär über &#039;&#039;&#039;FastCGI&#039;&#039;&#039;. Dies ermöglicht eine saubere Trennung der User-Berechtigungen, bringt aber Besonderheiten im Prozess-Handling mit sich.&lt;br /&gt;
&lt;br /&gt;
==== Memory &amp;amp; Execution Limits ====&lt;br /&gt;
In professionellen Umgebungen stoßen Symfony-Commands oft an die Standard-Limits. &lt;br /&gt;
* &#039;&#039;&#039;CLI-Override:&#039;&#039;&#039; Via Wrapper-Script können `memory_limit` und `max_execution_time` oft höher gesetzt werden als im Web-Kontext.&lt;br /&gt;
* &#039;&#039;&#039;Zustandslosigkeit:&#039;&#039;&#039; Da Prozesse nach Timeouts hart beendet werden, sollten Long-Running-Tasks (wie Mail-Abruf oder Massen-Indizierung) in kleine Batches unterteilt werden.&lt;br /&gt;
&lt;br /&gt;
==== Erweiterte Modul-Verfügbarkeit ====&lt;br /&gt;
Viele für Enterprise-Systeme kritische Module sind vorhanden, müssen aber oft manuell adressiert werden:&lt;br /&gt;
* &#039;&#039;&#039;Mailparse &amp;amp; IMAP:&#039;&#039;&#039; Essenziell für Ticket-Systeme (UVdesk). Pfade liegen oft unter `/usr/share/php[Version]/ext/`.&lt;br /&gt;
* &#039;&#039;&#039;BCMath &amp;amp; Intl:&#039;&#039;&#039; Meist standardmäßig aktiv, für E-Commerce (Preiskalkulationen) unverzichtbar.&lt;br /&gt;
&lt;br /&gt;
=== 3. Sicherheit &amp;amp; Zugriffskontrolle ===&lt;br /&gt;
&lt;br /&gt;
==== Open_basedir &amp;amp; Symlink-Sicherheit ====&lt;br /&gt;
Das `open_basedir`-Konzept ist bei bplaced sehr strikt. &lt;br /&gt;
* &#039;&#039;&#039;Problem:&#039;&#039;&#039; Frameworks, die mit Symlinks arbeiten (z.B. `public/storage`), scheitern, wenn der Zielpfad nicht explizit in der `open_basedir`-Variable der PHP-Konfiguration enthalten ist.&lt;br /&gt;
* &#039;&#039;&#039;Fix:&#039;&#039;&#039; Der PHP-Wrapper muss dynamisch die Pfade des aktuellen Release-Ordners inkludieren (besonders bei Atomic Deployments).&lt;br /&gt;
&lt;br /&gt;
==== SSL/TLS Handling ====&lt;br /&gt;
bplaced integriert Let&#039;s Encrypt. Profi-Tipp: Symfony-Apps hinter dem bplaced-Proxy benötigen oft die Konfiguration von `Trusted Proxies`, damit `isSecure()` und Redirects auf HTTPS korrekt funktionieren.&lt;br /&gt;
&lt;br /&gt;
=== 4. Netzwerk-Restriktionen &amp;amp; Mail-Ökosystem ===&lt;br /&gt;
&lt;br /&gt;
==== Socket-Verbindungen (Die &amp;quot;Free&amp;quot;-Barriere) ====&lt;br /&gt;
Einer der größten Fallstricke für Profi-Systeme:&lt;br /&gt;
* &#039;&#039;&#039;Outbound Traffic:&#039;&#039;&#039; Verbindungen zu externen APIs (Stripe, PayPal, Mailgun) oder Mail-Servern (IMAP/SMTP) sind in der Basis-Version oft limitiert oder gesperrt.&lt;br /&gt;
* &#039;&#039;&#039;Lösung:&#039;&#039;&#039; Upgrade auf bplaced Pro/Business schaltet Sockets frei. Ohne diese bleiben Mail-Abrufe (`uvdesk:refresh-mailbox`) trotz korrektem Code ergebnislos.&lt;br /&gt;
&lt;br /&gt;
==== Mail-Reputation ====&lt;br /&gt;
Shared-Hosting-IPs stehen oft auf Blacklists. &lt;br /&gt;
* &#039;&#039;&#039;Strategie:&#039;&#039;&#039; Für geschäftskritische Mails (Bestellbestätigungen, Tickets) sollte niemals der lokale `sendmail`-Pfad, sondern ein dedizierter SMTP-Relay-Provider genutzt werden.&lt;br /&gt;
&lt;br /&gt;
=== 5. DevOp-Workflow &amp;amp; Deployment ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Thema !! Empfehlung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Environment Variables&#039;&#039;&#039; || `.env` Dateien werden unterstützt, aber der PHP-Wrapper sollte sicherstellen, dass diese nicht via Browser (z.B. in falsch konfigurierten Sub-Verzeichnissen) auslesbar sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Git-Deploy&#039;&#039;&#039; || Da kein direktes `git push` auf das Web-Verzeichnis möglich ist, sollte ein Workflow über GitHub Actions oder GitLab CI (via FTP/SFTP oder SSH) implementiert werden.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Composer&#039;&#039;&#039; || Composer sollte lokal oder in einer CI/CD-Pipeline ausgeführt werden. Das Ausführen von `composer install` auf dem Server kann durch Memory-Limits scheitern.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 6. Professionelle Checkliste für bplaced ===&lt;br /&gt;
* [ ] &#039;&#039;&#039;Absolute Pfade:&#039;&#039;&#039; Pfade wie `/users/NAME/www/support/bin/console` statt relativer Pfade verwenden.&lt;br /&gt;
* [ ] &#039;&#039;&#039;Temp-Ordner:&#039;&#039;&#039; `sys_temp_dir` auf `/users/_temp/NAME` biegen, um Schreibfehler in `/tmp` zu vermeiden.&lt;br /&gt;
* [ ] &#039;&#039;&#039;OPcache Flush:&#039;&#039;&#039; Nach jedem Deployment `php_cache_clear()` oder Neustart der CGI-Instanz erzwingen (via bplaced Panel oder Wrapper-Touch).&lt;br /&gt;
* [ ] &#039;&#039;&#039;Logs:&#039;&#039;&#039; Regelmäßige Rotation der `php_access_logfile` und Framework-Logs, da Quota-Überschreitungen zum Systemstopp führen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Hosting-Architektur]] [[Kategorie:PHP-Administration]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=94</id>
		<title>Intern:Hauptseite/UVdesk</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=94"/>
		<updated>2026-02-25T19:09:40Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Debugging-History */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= UVdesk Helpdesk System =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde. &lt;br /&gt;
&lt;br /&gt;
=== Der Tech-Stack ===&lt;br /&gt;
Das System basiert auf einer modernen PHP-Architektur:&lt;br /&gt;
; Framework&lt;br /&gt;
: [[Symfony]] (v4.4 / v5.4 LTS)&lt;br /&gt;
; Datenbank&lt;br /&gt;
: MySQL / MariaDB (Doctrine ORM)&lt;br /&gt;
; Template-Engine&lt;br /&gt;
: Twig&lt;br /&gt;
; Mail-Handling&lt;br /&gt;
: Swiftmailer (in neueren Versionen Symfony Mailer)&lt;br /&gt;
; Paketverwaltung&lt;br /&gt;
: Composer&lt;br /&gt;
&lt;br /&gt;
=== Eigenheiten &amp;amp; Unterschiede zu Standard-Symfony ===&lt;br /&gt;
Obwohl UVdesk auf Symfony basiert, gibt es einige architektonische Besonderheiten:&lt;br /&gt;
; Bundle-Architektur&lt;br /&gt;
: UVdesk ist stark modularisiert. Fast alle Funktionen liegen in separaten Bundles unter {{SMC|vendor/uvdesk/}}.&lt;br /&gt;
; Custom Routing&lt;br /&gt;
: Die Routing-Logik für Member- und Customer-Bereiche ist eng mit der Datenbank verknüpft.&lt;br /&gt;
; Service Decoration&lt;br /&gt;
: Viele Kern-Services sind so konzipiert, dass sie durch eigene Implementierungen erweitert werden können.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&#039;&#039;Dieser Bereich wird noch ergänzt. Geplante Themen:&#039;&#039;&lt;br /&gt;
; DB-Init&lt;br /&gt;
: Initialisierung der Schemata via Doctrine.&lt;br /&gt;
; Admin-Setup&lt;br /&gt;
: Ersteinrichtung über die CLI.&lt;br /&gt;
; bplaced-Permissions&lt;br /&gt;
: Spezifische Rechte für das Temp-Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== How-to&#039;s ==&lt;br /&gt;
=== Konfiguration der Mailbox ===&lt;br /&gt;
&#039;&#039;Beschreibung der Anbindung von IMAP/SMTP (iCloud, Office365 etc.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quirks &amp;amp; Fallstricke ==&lt;br /&gt;
; Zugehörigkeit&lt;br /&gt;
: Achten Sie beim Erstellen von Agents darauf, dass die Rollen-Zuweisung (Role) korrekt erfolgt, da Symfony-Security-Voter den Zugriff steuern.&lt;br /&gt;
; Cache-Inkonsistenz&lt;br /&gt;
: Nach jeder Änderung an Konfigurationsdateien muss der Symfony-Cache physisch geleert werden (siehe Debugging-Sektion).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Debugging-History ==&lt;br /&gt;
&lt;br /&gt;
Hier werden spezifische Probleme dokumentiert, die in der ArtisanCommerce-Umgebung aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
=== Fall 01: Swiftmailer Alias &amp;amp; Memory Limit ===&lt;br /&gt;
; Datum&lt;br /&gt;
: Februar 2026&lt;br /&gt;
; Symptom&lt;br /&gt;
: {{SMC|cache:clear}} schlägt fehl mit {{SMC|ServiceNotFoundException}} oder {{SMC|Memory Limit Exhausted}}.&lt;br /&gt;
&lt;br /&gt;
==== Lösung A: Swiftmailer Alias Fix ====&lt;br /&gt;
In der {{SMC|config/services.yaml}} den Alias manuell setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
    # Fix für RegisterPluginsPass Bug&lt;br /&gt;
    swiftmailer.mailer:&lt;br /&gt;
        alias: swiftmailer.mailer.default&lt;br /&gt;
        public: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lösung B: Memory Limit via Wrapper ====&lt;br /&gt;
; Option 1 (Dauerhaft)&lt;br /&gt;
: In der {{SMC|.env}} oder {{SMC|.env.dev}} Variable setzen: {{SMC|MM{{=}}512}}&lt;br /&gt;
; Option 2 (CLI)&lt;br /&gt;
: Befehl manuell ausführen: {{SMC|MM&amp;amp;equals;512 php bin/console cache:clear}}&lt;br /&gt;
&lt;br /&gt;
=== Fall 02: UVDesk Mailbox / Reply-To Alias Problem ===&lt;br /&gt;
; Datum&lt;br /&gt;
: Februar 2026&lt;br /&gt;
; Symptom&lt;br /&gt;
: Beim Refresh der Mailbox schlägt {{SMC|uvdesk:refresh-mailbox}} fehl mit&lt;br /&gt;
  {{SMC|Call to a member function getTicket() on null}} in&lt;br /&gt;
  {{SMC|MailboxService.php line 516}}.&lt;br /&gt;
&lt;br /&gt;
; Ursache&lt;br /&gt;
: UVDesk prüft beim Erstellen eines Tickets die {{SMC|Reply-To}}-Adresse der eingehenden Email&lt;br /&gt;
  und versucht, eine passende Mailbox in der Konfiguration zu finden.  &lt;br /&gt;
  - Ist die Adresse nicht als Mailbox bekannt, gibt {{SMC|createTicket()}} null zurück → &lt;br /&gt;
    {{SMC|$thread}} wird null → PHP-Fehler beim Aufruf von {{SMC|getTicket()}}.  &lt;br /&gt;
  - Dies passiert oft, wenn Kunden an Alias-Adressen wie {{SMC|support@artisancommerce.at}} schreiben, die auf dasselbe IMAP-Postfach {{SMC|artisancommerce@icloud.com}} weitergeleitet werden.&lt;br /&gt;
&lt;br /&gt;
==== Offizieller Ansatz / Best Practice ====&lt;br /&gt;
# Für jeden Alias eine eigene Mailbox in UVDesk anlegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Name: Support Alias&lt;br /&gt;
IMAP Username: artisancommerce@icloud.com&lt;br /&gt;
IMAP Passwort: &amp;lt;gleich wie Hauptpostfach&amp;gt;&lt;br /&gt;
IMAP Host/Port: &amp;lt;wie Hauptpostfach&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
: - UVDesk kennt die Adresse → Tickets werden korrekt erstellt.&lt;br /&gt;
: - Emails können alle auf dasselbe Postfach zeigen, aber jede Adresse muss als Mailbox konfiguriert sein.&lt;br /&gt;
&lt;br /&gt;
==== Alternative / Quickfix (Patch) ====&lt;br /&gt;
# Patch in {{SMC|MailboxService.php}} oder {{SMC|TicketService.php}}:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mailbox = $this-&amp;gt;mailboxService-&amp;gt;getMailboxByEmail($ticketData[&#039;mailboxEmail&#039;]);&lt;br /&gt;
if (!$mailbox) {&lt;br /&gt;
    $mailboxes = $this-&amp;gt;mailboxService-&amp;gt;getAllMailboxes();&lt;br /&gt;
    $mailbox = reset($mailboxes); // Fallback auf Hauptpostfach&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
: - Damit werden alle Emails verarbeitet, auch wenn die Reply-To-Adresse nicht offiziell als Mailbox konfiguriert ist.&lt;br /&gt;
: - Tickets werden angelegt, $thread ist nie null, PHP-Fehler entfällt.&lt;br /&gt;
&lt;br /&gt;
==== ASCII-Diagramm: Alias → Postfach → UVDesk ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Kunde sendet Email&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
  Reply-To: support@artisancommerce.at&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
+------------------------+&lt;br /&gt;
| IMAP Postfach           |&lt;br /&gt;
| artisancommerce@icloud.com&lt;br /&gt;
+------------------------+&lt;br /&gt;
        ^&lt;br /&gt;
        |&lt;br /&gt;
  +------------------+&lt;br /&gt;
  | UVDesk Mailboxes |&lt;br /&gt;
  | ---------------- |&lt;br /&gt;
  | support@artisancommerce.at  --&amp;gt; Alias als Mailbox&lt;br /&gt;
  | help@artisancommerce.at     --&amp;gt; Alias als Mailbox&lt;br /&gt;
  | &amp;lt;Hauptpostfach&amp;gt;             --&amp;gt; Original&lt;br /&gt;
  +------------------+&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
  Ticket / Thread wird erstellt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
: - Die Mailbox-Zuordnung erfolgt anhand der Reply-To-Adresse.&lt;br /&gt;
: - Ohne eingetragene Mailbox → $thread = null → Fehler.&lt;br /&gt;
&lt;br /&gt;
==== Hinweis: IMAP Host / Port / Pfad ====&lt;br /&gt;
Beim Einrichten einer UVDesk-Mailbox über IMAP ist nicht nur der Servername entscheidend, sondern auch die **korrekte Pfadangabe für den Posteingang**.&lt;br /&gt;
&lt;br /&gt;
Viele versuchen z. B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Host: imap.mail.me.com&lt;br /&gt;
Port: 993&lt;br /&gt;
SSL: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
→ Das funktioniert oft nicht, weil UVDesk intern den **exakten Pfad zum Posteingang** benötigt.&lt;br /&gt;
&lt;br /&gt;
**Besser** ist, den IMAP-Pfad direkt anzugeben, z. B.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Host: {imap.mail.me.com:993/imap/ssl}INBOX&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung in Klartext:  &lt;br /&gt;
&lt;br /&gt;
- `{imap.mail.me.com:993/imap/ssl}` → sagt UVDesk, dass der Server `imap.mail.me.com` auf Port 993 über SSL angesprochen wird.  &lt;br /&gt;
- `INBOX` → gibt den **exakten Pfad zum Posteingang** an.  &lt;br /&gt;
&lt;br /&gt;
**Vorteile dieser Struktur:**  &lt;br /&gt;
1. UVDesk kann den Posteingang zuverlässig abholen, auch bei Anbietern wie iCloud oder Exchange, die strengere IMAP-Strukturen haben.  &lt;br /&gt;
2. Man kann **beliebige Unterordner oder spezielle Mailboxen** angeben, z. B. `Support`, `Tickets`, `Spam`, je nach der Folder-Struktur des IMAP-Postfachs.  &lt;br /&gt;
3. Dies erleichtert z. B. Multi-Mailbox-Setups oder die Verarbeitung von automatischen Unterordnern für bestimmte Kunden oder Departments.&lt;br /&gt;
&lt;br /&gt;
**Praktischer Tipp:**  &lt;br /&gt;
- Wenn Emails nicht abgeholt werden oder `$thread` null bleibt, immer prüfen, ob der **IMAP Host + Pfad korrekt angegeben** ist.  &lt;br /&gt;
- Mit dieser Syntax ist man flexibel und kann mehrere Folder gezielt in UVDesk konfigurieren.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=93</id>
		<title>Intern:Hauptseite/UVdesk</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=93"/>
		<updated>2026-02-22T16:42:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= UVdesk Helpdesk System =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde. &lt;br /&gt;
&lt;br /&gt;
=== Der Tech-Stack ===&lt;br /&gt;
Das System basiert auf einer modernen PHP-Architektur:&lt;br /&gt;
; Framework&lt;br /&gt;
: [[Symfony]] (v4.4 / v5.4 LTS)&lt;br /&gt;
; Datenbank&lt;br /&gt;
: MySQL / MariaDB (Doctrine ORM)&lt;br /&gt;
; Template-Engine&lt;br /&gt;
: Twig&lt;br /&gt;
; Mail-Handling&lt;br /&gt;
: Swiftmailer (in neueren Versionen Symfony Mailer)&lt;br /&gt;
; Paketverwaltung&lt;br /&gt;
: Composer&lt;br /&gt;
&lt;br /&gt;
=== Eigenheiten &amp;amp; Unterschiede zu Standard-Symfony ===&lt;br /&gt;
Obwohl UVdesk auf Symfony basiert, gibt es einige architektonische Besonderheiten:&lt;br /&gt;
; Bundle-Architektur&lt;br /&gt;
: UVdesk ist stark modularisiert. Fast alle Funktionen liegen in separaten Bundles unter {{SMC|vendor/uvdesk/}}.&lt;br /&gt;
; Custom Routing&lt;br /&gt;
: Die Routing-Logik für Member- und Customer-Bereiche ist eng mit der Datenbank verknüpft.&lt;br /&gt;
; Service Decoration&lt;br /&gt;
: Viele Kern-Services sind so konzipiert, dass sie durch eigene Implementierungen erweitert werden können.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&#039;&#039;Dieser Bereich wird noch ergänzt. Geplante Themen:&#039;&#039;&lt;br /&gt;
; DB-Init&lt;br /&gt;
: Initialisierung der Schemata via Doctrine.&lt;br /&gt;
; Admin-Setup&lt;br /&gt;
: Ersteinrichtung über die CLI.&lt;br /&gt;
; bplaced-Permissions&lt;br /&gt;
: Spezifische Rechte für das Temp-Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== How-to&#039;s ==&lt;br /&gt;
=== Konfiguration der Mailbox ===&lt;br /&gt;
&#039;&#039;Beschreibung der Anbindung von IMAP/SMTP (iCloud, Office365 etc.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quirks &amp;amp; Fallstricke ==&lt;br /&gt;
; Zugehörigkeit&lt;br /&gt;
: Achten Sie beim Erstellen von Agents darauf, dass die Rollen-Zuweisung (Role) korrekt erfolgt, da Symfony-Security-Voter den Zugriff steuern.&lt;br /&gt;
; Cache-Inkonsistenz&lt;br /&gt;
: Nach jeder Änderung an Konfigurationsdateien muss der Symfony-Cache physisch geleert werden (siehe Debugging-Sektion).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Debugging-History ==&lt;br /&gt;
&lt;br /&gt;
Hier werden spezifische Probleme dokumentiert, die in der ArtisanCommerce-Umgebung aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
=== Fall 01: Swiftmailer Alias &amp;amp; Memory Limit ===&lt;br /&gt;
; Datum&lt;br /&gt;
: Februar 2026&lt;br /&gt;
; Symptom&lt;br /&gt;
: {{SMC|cache:clear}} schlägt fehl mit {{SMC|ServiceNotFoundException}} oder {{SMC|Memory Limit Exhausted}}.&lt;br /&gt;
&lt;br /&gt;
==== Lösung A: Swiftmailer Alias Fix ====&lt;br /&gt;
In der {{SMC|config/services.yaml}} den Alias manuell setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
    # Fix für RegisterPluginsPass Bug&lt;br /&gt;
    swiftmailer.mailer:&lt;br /&gt;
        alias: swiftmailer.mailer.default&lt;br /&gt;
        public: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lösung B: Memory Limit via Wrapper ====&lt;br /&gt;
; Option 1 (Dauerhaft)&lt;br /&gt;
: In der {{SMC|.env}} oder {{SMC|.env.dev}} Variable setzen: {{SMC|MM{{=}}512}}&lt;br /&gt;
; Option 2 (CLI)&lt;br /&gt;
: Befehl manuell ausführen: {{SMC|MM&amp;amp;equals;512 php bin/console cache:clear}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=92</id>
		<title>Intern:Hauptseite/UVdesk</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=92"/>
		<updated>2026-02-22T16:41:19Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= UVdesk Helpdesk System =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde. &lt;br /&gt;
&lt;br /&gt;
=== Der Tech-Stack ===&lt;br /&gt;
Das System basiert auf einer modernen PHP-Architektur:&lt;br /&gt;
; Framework&lt;br /&gt;
: [[Symfony]] (v4.4 / v5.4 LTS)&lt;br /&gt;
; Datenbank&lt;br /&gt;
: MySQL / MariaDB (Doctrine ORM)&lt;br /&gt;
; Template-Engine&lt;br /&gt;
: Twig&lt;br /&gt;
; Mail-Handling&lt;br /&gt;
: Swiftmailer (in neueren Versionen Symfony Mailer)&lt;br /&gt;
; Paketverwaltung&lt;br /&gt;
: Composer&lt;br /&gt;
&lt;br /&gt;
=== Eigenheiten &amp;amp; Unterschiede zu Standard-Symfony ===&lt;br /&gt;
Obwohl UVdesk auf Symfony basiert, gibt es einige architektonische Besonderheiten:&lt;br /&gt;
; Bundle-Architektur&lt;br /&gt;
: UVdesk ist stark modularisiert. Fast alle Funktionen liegen in separaten Bundles unter {{SMC|vendor/uvdesk/}}.&lt;br /&gt;
; Custom Routing&lt;br /&gt;
: Die Routing-Logik für Member- und Customer-Bereiche ist eng mit der Datenbank verknüpft.&lt;br /&gt;
; Service Decoration&lt;br /&gt;
: Viele Kern-Services sind so konzipiert, dass sie durch eigene Implementierungen erweitert werden können.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&#039;&#039;Dieser Bereich wird noch ergänzt. Geplante Themen:&#039;&#039;&lt;br /&gt;
; DB-Init&lt;br /&gt;
: Initialisierung der Schemata via Doctrine.&lt;br /&gt;
; Admin-Setup&lt;br /&gt;
: Ersteinrichtung über die CLI.&lt;br /&gt;
; bplaced-Permissions&lt;br /&gt;
: Spezifische Rechte für das Temp-Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== How-to&#039;s ==&lt;br /&gt;
=== Konfiguration der Mailbox ===&lt;br /&gt;
&#039;&#039;Beschreibung der Anbindung von IMAP/SMTP (iCloud, Office365 etc.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quirks &amp;amp; Fallstricke ==&lt;br /&gt;
; Zugehörigkeit&lt;br /&gt;
: Achten Sie beim Erstellen von Agents darauf, dass die Rollen-Zuweisung (Role) korrekt erfolgt, da Symfony-Security-Voter den Zugriff steuern.&lt;br /&gt;
; Cache-Inkonsistenz&lt;br /&gt;
: Nach jeder Änderung an Konfigurationsdateien muss der Symfony-Cache physisch geleert werden (siehe Debugging-Sektion).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Debugging-History ==&lt;br /&gt;
&lt;br /&gt;
Hier werden spezifische Probleme dokumentiert, die in der ArtisanCommerce-Umgebung aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
=== Fall 01: Swiftmailer Alias &amp;amp; Memory Limit ===&lt;br /&gt;
; Datum&lt;br /&gt;
: Februar 2026&lt;br /&gt;
; Symptom&lt;br /&gt;
: {{SMC|cache:clear}} schlägt fehl mit {{SMC|ServiceNotFoundException}} oder {{SMC|Memory Limit Exhausted}}.&lt;br /&gt;
&lt;br /&gt;
==== Lösung A: Swiftmailer Alias Fix ====&lt;br /&gt;
In der {{SMC|config/services.yaml}} den Alias manuell setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
    # Fix für RegisterPluginsPass Bug&lt;br /&gt;
    swiftmailer.mailer:&lt;br /&gt;
        alias: swiftmailer.mailer.default&lt;br /&gt;
        public: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lösung B: Memory Limit via Wrapper ====&lt;br /&gt;
; Option 1 (Dauerhaft)&lt;br /&gt;
: In der {{SMC|.env}} oder {{SMC|.env.dev}} Variable setzen: {{SMC|MM{{=}}512}}&lt;br /&gt;
; Option 2 (CLI)&lt;br /&gt;
: Befehl manuell ausführen: {{SMC|MM&amp;amp;equals;512 php bin/console cache:clear}}&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;br /&gt;
&lt;br /&gt;
# heul&lt;br /&gt;
# schluchz&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite&amp;diff=91</id>
		<title>Intern:Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite&amp;diff=91"/>
		<updated>2026-02-22T16:36:52Z</updated>

		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „__NOTOC__ = Interne Dokumentation &amp;amp; Knowledge Base =  Diese Sektion dient als zentraler Wissensspeicher für &amp;#039;&amp;#039;&amp;#039;ArtisanCommerce&amp;#039;&amp;#039;&amp;#039;. Hier dokumentieren wir unsere Infrastruktur, Entwicklungs-Workflows und Architektur-Entscheidungen.   &amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; Diese Inhalte sind ausschließlich für den internen Gebrauch bestimmt und nicht für Endkunden sichtbar.&amp;lt;/blockquote&amp;gt;  ---  == 🛠️ Tools &amp;amp; Development Environment == {| class=&amp;quot;wikitable&amp;quot; style=…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
= Interne Dokumentation &amp;amp; Knowledge Base =&lt;br /&gt;
&lt;br /&gt;
Diese Sektion dient als zentraler Wissensspeicher für &#039;&#039;&#039;ArtisanCommerce&#039;&#039;&#039;. Hier dokumentieren wir unsere Infrastruktur, Entwicklungs-Workflows und Architektur-Entscheidungen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Diese Inhalte sind ausschließlich für den internen Gebrauch bestimmt und nicht für Endkunden sichtbar.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 🛠️ Tools &amp;amp; Development Environment ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! Kategorie !! Tools&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;IDEs &amp;amp; Editoren&#039;&#039;&#039; || [[VS Code]], [[Zed]], [[JetBrains Suite]], [[XCode]], [[VS 2022/2026]]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Versionskontrolle&#039;&#039;&#039; || [[Pijul]], [[GitHub]]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;CLI &amp;amp; Automation&#039;&#039;&#039; || [[Codex-cli]], Shell-Scripts&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Infrastruktur&#039;&#039;&#039; || [[Kubernetes]] (K8s), Docker&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 🏗️ Frameworks &amp;amp; Standards ==&lt;br /&gt;
; PHP&lt;br /&gt;
: [[Symfony]] &amp;amp; [[Laravel]]&lt;br /&gt;
; Microsoft Stack&lt;br /&gt;
: [[ASP.NET Core]]&lt;br /&gt;
; Frontend&lt;br /&gt;
: React, Vue, Tailwind&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 📂 Systeme &amp;amp; Applikationen ==&lt;br /&gt;
&lt;br /&gt;
=== Support &amp;amp; Kommunikation ===&lt;br /&gt;
* &#039;&#039;&#039;[[Intern:Hauptseite/UVdesk|UVdesk Helpdesk]]&#039;&#039;&#039; – Unser zentrales Ticket-System.&lt;br /&gt;
** [[Intern:Hauptseite/UVdesk#Debugging-History|Debugging &amp;amp; Setup-Fixes]] (Wichtig für bplaced)&lt;br /&gt;
&lt;br /&gt;
=== Wissensmanagement ===&lt;br /&gt;
* &#039;&#039;&#039;[[MediaWiki]]&#039;&#039;&#039; – Dokumentation der Wiki-Struktur und Namensräume.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 💡 Tipps, Tricks &amp;amp; Best Practices ==&lt;br /&gt;
* &#039;&#039;&#039;Wiki-Syntax:&#039;&#039;&#039; Nutze &amp;lt;code&amp;gt;1=&amp;lt;/code&amp;gt; bei Vorlagen, wenn Gleichheitszeichen im Text vorkommen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=90</id>
		<title>Intern:Hauptseite/UVdesk</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=90"/>
		<updated>2026-02-22T16:27:52Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= UVdesk Helpdesk System =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde. &lt;br /&gt;
&lt;br /&gt;
=== Der Tech-Stack ===&lt;br /&gt;
Das System basiert auf einer modernen PHP-Architektur:&lt;br /&gt;
* **Framework:** [[Symfony]] (v4.4 / v5.4 LTS)&lt;br /&gt;
* **Datenbank:** MySQL / MariaDB (Doctrine ORM)&lt;br /&gt;
* **Template-Engine:** Twig&lt;br /&gt;
* **Mail-Handling:** Swiftmailer (in neueren Versionen Symfony Mailer)&lt;br /&gt;
* **Paketverwaltung:** Composer&lt;br /&gt;
&lt;br /&gt;
=== Eigenheiten &amp;amp; Unterschiede zu Standard-Symfony ===&lt;br /&gt;
Obwohl UVdesk auf Symfony basiert, gibt es einige architektonische Besonderheiten:&lt;br /&gt;
* **Bundle-Architektur:** UVdesk ist stark modularisiert. Fast alle Funktionen (Tickets, Knowledgebase, Mailbox) liegen in separaten Bundles unter {{SMC|vendor/uvdesk/}}.&lt;br /&gt;
* **Custom Routing:** Die Routing-Logik für Member- und Customer-Bereiche ist eng mit der Datenbank verknüpft.&lt;br /&gt;
* **Service Decoration:** Viele Kern-Services sind so konzipiert, dass sie durch eigene Implementierungen erweitert werden können (wichtig für unsere Anpassungen ohne Vendor-Patching).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&#039;&#039;Dieser Bereich wird noch ergänzt. Hier folgen Informationen zu:&#039;&#039;&lt;br /&gt;
* &#039;&#039;Datenbank-Initialisierung&#039;&#039;&lt;br /&gt;
* &#039;&#039;Ersteinrichtung des Admin-Accounts&#039;&#039;&lt;br /&gt;
* &#039;&#039;Verzeichnisrechte auf bplaced&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== How-to&#039;s ==&lt;br /&gt;
=== Konfiguration der Mailbox ===&lt;br /&gt;
&#039;&#039;Beschreibung der Anbindung von IMAP/SMTP (iCloud, Office365 etc.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quirks &amp;amp; Fallstricke ==&lt;br /&gt;
* **Zugehörigkeit:** Achten Sie beim Erstellen von Agents darauf, dass die Rollen-Zuweisung (Role) korrekt erfolgt, da Symfony-Security-Voter den Zugriff steuern.&lt;br /&gt;
* **Cache:** Nach jeder Änderung an Konfigurationsdateien muss der Symfony-Cache physisch geleert werden (siehe Debugging-Sektion).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Debugging-History ==&lt;br /&gt;
&lt;br /&gt;
Hier werden spezifische Probleme und deren Lösungen dokumentiert, die während des Betriebs im ArtisanCommerce-Netzwerk aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
=== Fall 01: Swiftmailer Alias &amp;amp; Memory Limit (bplaced Umgebung) ===&lt;br /&gt;
&#039;&#039;&#039;Datum:&#039;&#039;&#039; Februar 2026&lt;br /&gt;
&#039;&#039;&#039;Symptom:&#039;&#039;&#039; {{SMC|cache:clear}} schlägt fehl mit {{SMC|ServiceNotFoundException}} oder {{SMC|Memory Limit Exhausted}}.&lt;br /&gt;
&lt;br /&gt;
==== Lösung A: Swiftmailer Alias Fix ====&lt;br /&gt;
Da der interne Symfony-Compiler den Dienst {{SMC|swiftmailer.mailer}} erwartet, dieser aber bei benutzerdefinierten Mailer-Namen fehlt, muss ein Alias in der {{SMC|config/services.yaml}} gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
    # Fix für RegisterPluginsPass Bug&lt;br /&gt;
    swiftmailer.mailer:&lt;br /&gt;
        alias: swiftmailer.mailer.default&lt;br /&gt;
        public: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lösung B: Memory Limit via Wrapper ====&lt;br /&gt;
Auf bplaced-Umgebungen überschreibt der PHP-Wrapper das Memory-Limit oft auf 64MB. Für Symfony-Operationen müssen mindestens 512MB erzwungen werden:&lt;br /&gt;
&lt;br /&gt;
# In der {{SMC|.env}} oder {{SMC|.env.dev}} Variable setzen: {{SMC|MM{{=}}512}}&lt;br /&gt;
# Befehl manuell ausführen: {{SMC|MM&amp;amp;equals;512 php bin/console cache:clear}}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Vorlage:%3D&amp;diff=89</id>
		<title>Vorlage:=</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Vorlage:%3D&amp;diff=89"/>
		<updated>2026-02-22T16:27:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „=“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=88</id>
		<title>Intern:Hauptseite/UVdesk</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=88"/>
		<updated>2026-02-22T16:26:29Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= UVdesk Helpdesk System =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde. &lt;br /&gt;
&lt;br /&gt;
=== Der Tech-Stack ===&lt;br /&gt;
Das System basiert auf einer modernen PHP-Architektur:&lt;br /&gt;
* **Framework:** [[Symfony]] (v4.4 / v5.4 LTS)&lt;br /&gt;
* **Datenbank:** MySQL / MariaDB (Doctrine ORM)&lt;br /&gt;
* **Template-Engine:** Twig&lt;br /&gt;
* **Mail-Handling:** Swiftmailer (in neueren Versionen Symfony Mailer)&lt;br /&gt;
* **Paketverwaltung:** Composer&lt;br /&gt;
&lt;br /&gt;
=== Eigenheiten &amp;amp; Unterschiede zu Standard-Symfony ===&lt;br /&gt;
Obwohl UVdesk auf Symfony basiert, gibt es einige architektonische Besonderheiten:&lt;br /&gt;
* **Bundle-Architektur:** UVdesk ist stark modularisiert. Fast alle Funktionen (Tickets, Knowledgebase, Mailbox) liegen in separaten Bundles unter {{SMC|vendor/uvdesk/}}.&lt;br /&gt;
* **Custom Routing:** Die Routing-Logik für Member- und Customer-Bereiche ist eng mit der Datenbank verknüpft.&lt;br /&gt;
* **Service Decoration:** Viele Kern-Services sind so konzipiert, dass sie durch eigene Implementierungen erweitert werden können (wichtig für unsere Anpassungen ohne Vendor-Patching).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&#039;&#039;Dieser Bereich wird noch ergänzt. Hier folgen Informationen zu:&#039;&#039;&lt;br /&gt;
* &#039;&#039;Datenbank-Initialisierung&#039;&#039;&lt;br /&gt;
* &#039;&#039;Ersteinrichtung des Admin-Accounts&#039;&#039;&lt;br /&gt;
* &#039;&#039;Verzeichnisrechte auf bplaced&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== How-to&#039;s ==&lt;br /&gt;
=== Konfiguration der Mailbox ===&lt;br /&gt;
&#039;&#039;Beschreibung der Anbindung von IMAP/SMTP (iCloud, Office365 etc.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quirks &amp;amp; Fallstricke ==&lt;br /&gt;
* **Zugehörigkeit:** Achten Sie beim Erstellen von Agents darauf, dass die Rollen-Zuweisung (Role) korrekt erfolgt, da Symfony-Security-Voter den Zugriff steuern.&lt;br /&gt;
* **Cache:** Nach jeder Änderung an Konfigurationsdateien muss der Symfony-Cache physisch geleert werden (siehe Debugging-Sektion).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Debugging-History ==&lt;br /&gt;
&lt;br /&gt;
Hier werden spezifische Probleme und deren Lösungen dokumentiert, die während des Betriebs im ArtisanCommerce-Netzwerk aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
=== Fall 01: Swiftmailer Alias &amp;amp; Memory Limit (bplaced Umgebung) ===&lt;br /&gt;
&#039;&#039;&#039;Datum:&#039;&#039;&#039; Februar 2026&lt;br /&gt;
&#039;&#039;&#039;Symptom:&#039;&#039;&#039; {{SMC|cache:clear}} schlägt fehl mit {{SMC|ServiceNotFoundException}} oder {{SMC|Memory Limit Exhausted}}.&lt;br /&gt;
&lt;br /&gt;
==== Lösung A: Swiftmailer Alias Fix ====&lt;br /&gt;
Da der interne Symfony-Compiler den Dienst {{SMC|swiftmailer.mailer}} erwartet, dieser aber bei benutzerdefinierten Mailer-Namen fehlt, muss ein Alias in der {{SMC|config/services.yaml}} gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
    # Fix für RegisterPluginsPass Bug&lt;br /&gt;
    swiftmailer.mailer:&lt;br /&gt;
        alias: swiftmailer.mailer.default&lt;br /&gt;
        public: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lösung B: Memory Limit via Wrapper ====&lt;br /&gt;
Auf bplaced-Umgebungen überschreibt der PHP-Wrapper das Memory-Limit oft auf 64MB. Für Symfony-Operationen müssen mindestens 512MB erzwungen werden:&lt;br /&gt;
&lt;br /&gt;
# In der {{SMC|.env}} oder {{SMC|.env.dev}} Variable setzen: {{SMC|MM 512}}&lt;br /&gt;
# Befehl manuell ausführen: {{SMC|MM&amp;amp;equals;512 php bin/console cache:clear}}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=87</id>
		<title>Intern:Hauptseite/UVdesk</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=87"/>
		<updated>2026-02-22T16:23:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= UVdesk Helpdesk System =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde. &lt;br /&gt;
&lt;br /&gt;
=== Der Tech-Stack ===&lt;br /&gt;
Das System basiert auf einer modernen PHP-Architektur:&lt;br /&gt;
* **Framework:** [[Symfony]] (v4.4 / v5.4 LTS)&lt;br /&gt;
* **Datenbank:** MySQL / MariaDB (Doctrine ORM)&lt;br /&gt;
* **Template-Engine:** Twig&lt;br /&gt;
* **Mail-Handling:** Swiftmailer (in neueren Versionen Symfony Mailer)&lt;br /&gt;
* **Paketverwaltung:** Composer&lt;br /&gt;
&lt;br /&gt;
=== Eigenheiten &amp;amp; Unterschiede zu Standard-Symfony ===&lt;br /&gt;
Obwohl UVdesk auf Symfony basiert, gibt es einige architektonische Besonderheiten:&lt;br /&gt;
* **Bundle-Architektur:** UVdesk ist stark modularisiert. Fast alle Funktionen (Tickets, Knowledgebase, Mailbox) liegen in separaten Bundles unter {{SMC|vendor/uvdesk/}}.&lt;br /&gt;
* **Custom Routing:** Die Routing-Logik für Member- und Customer-Bereiche ist eng mit der Datenbank verknüpft.&lt;br /&gt;
* **Service Decoration:** Viele Kern-Services sind so konzipiert, dass sie durch eigene Implementierungen erweitert werden können (wichtig für unsere Anpassungen ohne Vendor-Patching).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&#039;&#039;Dieser Bereich wird noch ergänzt. Hier folgen Informationen zu:&#039;&#039;&lt;br /&gt;
* &#039;&#039;Datenbank-Initialisierung&#039;&#039;&lt;br /&gt;
* &#039;&#039;Ersteinrichtung des Admin-Accounts&#039;&#039;&lt;br /&gt;
* &#039;&#039;Verzeichnisrechte auf bplaced&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== How-to&#039;s ==&lt;br /&gt;
=== Konfiguration der Mailbox ===&lt;br /&gt;
&#039;&#039;Beschreibung der Anbindung von IMAP/SMTP (iCloud, Office365 etc.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quirks &amp;amp; Fallstricke ==&lt;br /&gt;
* **Zugehörigkeit:** Achten Sie beim Erstellen von Agents darauf, dass die Rollen-Zuweisung (Role) korrekt erfolgt, da Symfony-Security-Voter den Zugriff steuern.&lt;br /&gt;
* **Cache:** Nach jeder Änderung an Konfigurationsdateien muss der Symfony-Cache physisch geleert werden (siehe Debugging-Sektion).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Debugging-History ==&lt;br /&gt;
&lt;br /&gt;
Hier werden spezifische Probleme und deren Lösungen dokumentiert, die während des Betriebs im ArtisanCommerce-Netzwerk aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
=== Fall 01: Swiftmailer Alias &amp;amp; Memory Limit (bplaced Umgebung) ===&lt;br /&gt;
&#039;&#039;&#039;Datum:&#039;&#039;&#039; Februar 2026&lt;br /&gt;
&#039;&#039;&#039;Symptom:&#039;&#039;&#039; {{SMC|cache:clear}} schlägt fehl mit {{SMC|ServiceNotFoundException}} oder {{SMC|Memory Limit Exhausted}}.&lt;br /&gt;
&lt;br /&gt;
==== Lösung A: Swiftmailer Alias Fix ====&lt;br /&gt;
Da der interne Symfony-Compiler den Dienst {{SMC|swiftmailer.mailer}} erwartet, dieser aber bei benutzerdefinierten Mailer-Namen fehlt, muss ein Alias in der {{SMC|config/services.yaml}} gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
    # Fix für RegisterPluginsPass Bug&lt;br /&gt;
    swiftmailer.mailer:&lt;br /&gt;
        alias: swiftmailer.mailer.default&lt;br /&gt;
        public: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lösung B: Memory Limit via Wrapper ====&lt;br /&gt;
Auf bplaced-Umgebungen überschreibt der PHP-Wrapper das Memory-Limit oft auf 64MB. Für Symfony-Operationen müssen mindestens 512MB erzwungen werden:&lt;br /&gt;
&lt;br /&gt;
# In der {{SMC|.env}} oder {{SMC|.env.dev}} Variable setzen: {{SMC|MM 512}}&lt;br /&gt;
# Befehl manuell ausführen: {{SMC|MM512 php bin/console cache:clear}}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=86</id>
		<title>Intern:Hauptseite/UVdesk</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=86"/>
		<updated>2026-02-22T16:22:01Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= UVdesk Helpdesk System =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde. &lt;br /&gt;
&lt;br /&gt;
=== Der Tech-Stack ===&lt;br /&gt;
Das System basiert auf einer modernen PHP-Architektur:&lt;br /&gt;
* **Framework:** [[Symfony]] (v4.4 / v5.4 LTS)&lt;br /&gt;
* **Datenbank:** MySQL / MariaDB (Doctrine ORM)&lt;br /&gt;
* **Template-Engine:** Twig&lt;br /&gt;
* **Mail-Handling:** Swiftmailer (in neueren Versionen Symfony Mailer)&lt;br /&gt;
* **Paketverwaltung:** Composer&lt;br /&gt;
&lt;br /&gt;
=== Eigenheiten &amp;amp; Unterschiede zu Standard-Symfony ===&lt;br /&gt;
Obwohl UVdesk auf Symfony basiert, gibt es einige architektonische Besonderheiten:&lt;br /&gt;
* **Bundle-Architektur:** UVdesk ist stark modularisiert. Fast alle Funktionen (Tickets, Knowledgebase, Mailbox) liegen in separaten Bundles unter {{SMC|vendor/uvdesk/}}.&lt;br /&gt;
* **Custom Routing:** Die Routing-Logik für Member- und Customer-Bereiche ist eng mit der Datenbank verknüpft.&lt;br /&gt;
* **Service Decoration:** Viele Kern-Services sind so konzipiert, dass sie durch eigene Implementierungen erweitert werden können (wichtig für unsere Anpassungen ohne Vendor-Patching).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&#039;&#039;Dieser Bereich wird noch ergänzt. Hier folgen Informationen zu:&#039;&#039;&lt;br /&gt;
* &#039;&#039;Datenbank-Initialisierung&#039;&#039;&lt;br /&gt;
* &#039;&#039;Ersteinrichtung des Admin-Accounts&#039;&#039;&lt;br /&gt;
* &#039;&#039;Verzeichnisrechte auf bplaced&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== How-to&#039;s ==&lt;br /&gt;
=== Konfiguration der Mailbox ===&lt;br /&gt;
&#039;&#039;Beschreibung der Anbindung von IMAP/SMTP (iCloud, Office365 etc.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quirks &amp;amp; Fallstricke ==&lt;br /&gt;
* **Zugehörigkeit:** Achten Sie beim Erstellen von Agents darauf, dass die Rollen-Zuweisung (Role) korrekt erfolgt, da Symfony-Security-Voter den Zugriff steuern.&lt;br /&gt;
* **Cache:** Nach jeder Änderung an Konfigurationsdateien muss der Symfony-Cache physisch geleert werden (siehe Debugging-Sektion).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Debugging-History ==&lt;br /&gt;
&lt;br /&gt;
Hier werden spezifische Probleme und deren Lösungen dokumentiert, die während des Betriebs im ArtisanCommerce-Netzwerk aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
=== Fall 01: Swiftmailer Alias &amp;amp; Memory Limit (bplaced Umgebung) ===&lt;br /&gt;
&#039;&#039;&#039;Datum:&#039;&#039;&#039; Februar 2026&lt;br /&gt;
&#039;&#039;&#039;Symptom:&#039;&#039;&#039; {{SMC|cache:clear}} schlägt fehl mit {{SMC|ServiceNotFoundException}} oder {{SMC|Memory Limit Exhausted}}.&lt;br /&gt;
&lt;br /&gt;
==== Lösung A: Swiftmailer Alias Fix ====&lt;br /&gt;
Da der interne Symfony-Compiler den Dienst {{SMC|swiftmailer.mailer}} erwartet, dieser aber bei benutzerdefinierten Mailer-Namen fehlt, muss ein Alias in der {{SMC|config/services.yaml}} gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
    # Fix für RegisterPluginsPass Bug&lt;br /&gt;
    swiftmailer.mailer:&lt;br /&gt;
        alias: swiftmailer.mailer.default&lt;br /&gt;
        public: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lösung B: Memory Limit via Wrapper ====&lt;br /&gt;
Auf bplaced-Umgebungen überschreibt der PHP-Wrapper das Memory-Limit oft auf 64MB. Für Symfony-Operationen müssen mindestens 512MB erzwungen werden:&lt;br /&gt;
&lt;br /&gt;
# In der {{SMC|.env}} oder {{SMC|.env.dev}} Variable setzen: {{SMC|MM 512}}&lt;br /&gt;
# Befehl manuell ausführen: {{SMC|MM=512 php bin/console cache:clear}}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=85</id>
		<title>Intern:Hauptseite/UVdesk</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=85"/>
		<updated>2026-02-22T16:21:35Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= UVdesk Helpdesk System =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde. &lt;br /&gt;
&lt;br /&gt;
=== Der Tech-Stack ===&lt;br /&gt;
Das System basiert auf einer modernen PHP-Architektur:&lt;br /&gt;
* **Framework:** [[Symfony]] (v4.4 / v5.4 LTS)&lt;br /&gt;
* **Datenbank:** MySQL / MariaDB (Doctrine ORM)&lt;br /&gt;
* **Template-Engine:** Twig&lt;br /&gt;
* **Mail-Handling:** Swiftmailer (in neueren Versionen Symfony Mailer)&lt;br /&gt;
* **Paketverwaltung:** Composer&lt;br /&gt;
&lt;br /&gt;
=== Eigenheiten &amp;amp; Unterschiede zu Standard-Symfony ===&lt;br /&gt;
Obwohl UVdesk auf Symfony basiert, gibt es einige architektonische Besonderheiten:&lt;br /&gt;
* **Bundle-Architektur:** UVdesk ist stark modularisiert. Fast alle Funktionen (Tickets, Knowledgebase, Mailbox) liegen in separaten Bundles unter {{SMC|vendor/uvdesk/}}.&lt;br /&gt;
* **Custom Routing:** Die Routing-Logik für Member- und Customer-Bereiche ist eng mit der Datenbank verknüpft.&lt;br /&gt;
* **Service Decoration:** Viele Kern-Services sind so konzipiert, dass sie durch eigene Implementierungen erweitert werden können (wichtig für unsere Anpassungen ohne Vendor-Patching).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&#039;&#039;Dieser Bereich wird noch ergänzt. Hier folgen Informationen zu:&#039;&#039;&lt;br /&gt;
* &#039;&#039;Datenbank-Initialisierung&#039;&#039;&lt;br /&gt;
* &#039;&#039;Ersteinrichtung des Admin-Accounts&#039;&#039;&lt;br /&gt;
* &#039;&#039;Verzeichnisrechte auf bplaced&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== How-to&#039;s ==&lt;br /&gt;
=== Konfiguration der Mailbox ===&lt;br /&gt;
&#039;&#039;Beschreibung der Anbindung von IMAP/SMTP (iCloud, Office365 etc.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quirks &amp;amp; Fallstricke ==&lt;br /&gt;
* **Zugehörigkeit:** Achten Sie beim Erstellen von Agents darauf, dass die Rollen-Zuweisung (Role) korrekt erfolgt, da Symfony-Security-Voter den Zugriff steuern.&lt;br /&gt;
* **Cache:** Nach jeder Änderung an Konfigurationsdateien muss der Symfony-Cache physisch geleert werden (siehe Debugging-Sektion).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Debugging-History ==&lt;br /&gt;
&lt;br /&gt;
Hier werden spezifische Probleme und deren Lösungen dokumentiert, die während des Betriebs im ArtisanCommerce-Netzwerk aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
=== Fall 01: Swiftmailer Alias &amp;amp; Memory Limit (bplaced Umgebung) ===&lt;br /&gt;
&#039;&#039;&#039;Datum:&#039;&#039;&#039; Februar 2026&lt;br /&gt;
&#039;&#039;&#039;Symptom:&#039;&#039;&#039; {{SMC|cache:clear}} schlägt fehl mit {{SMC|ServiceNotFoundException}} oder {{SMC|Memory Limit Exhausted}}.&lt;br /&gt;
&lt;br /&gt;
==== Lösung A: Swiftmailer Alias Fix ====&lt;br /&gt;
Da der interne Symfony-Compiler den Dienst {{SMC|swiftmailer.mailer}} erwartet, dieser aber bei benutzerdefinierten Mailer-Namen fehlt, muss ein Alias in der {{SMC|config/services.yaml}} gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
    # Fix für RegisterPluginsPass Bug&lt;br /&gt;
    swiftmailer.mailer:&lt;br /&gt;
        alias: swiftmailer.mailer.default&lt;br /&gt;
        public: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lösung B: Memory Limit via Wrapper ====&lt;br /&gt;
Auf bplaced-Umgebungen überschreibt der PHP-Wrapper das Memory-Limit oft auf 64MB. Für Symfony-Operationen müssen mindestens 512MB erzwungen werden:&lt;br /&gt;
&lt;br /&gt;
# In der {{SMC|.env}} oder {{SMC|.env.dev}} Variable setzen: {{SMC|MM512}}&lt;br /&gt;
# Befehl manuell ausführen: {{SMC|MM=512 php bin/console cache:clear}}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=84</id>
		<title>Intern:Hauptseite/UVdesk</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=84"/>
		<updated>2026-02-22T16:20:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= UVdesk Helpdesk System =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde. &lt;br /&gt;
&lt;br /&gt;
=== Der Tech-Stack ===&lt;br /&gt;
Das System basiert auf einer modernen PHP-Architektur:&lt;br /&gt;
* **Framework:** [[Symfony]] (v4.4 / v5.4 LTS)&lt;br /&gt;
* **Datenbank:** MySQL / MariaDB (Doctrine ORM)&lt;br /&gt;
* **Template-Engine:** Twig&lt;br /&gt;
* **Mail-Handling:** Swiftmailer (in neueren Versionen Symfony Mailer)&lt;br /&gt;
* **Paketverwaltung:** Composer&lt;br /&gt;
&lt;br /&gt;
=== Eigenheiten &amp;amp; Unterschiede zu Standard-Symfony ===&lt;br /&gt;
Obwohl UVdesk auf Symfony basiert, gibt es einige architektonische Besonderheiten:&lt;br /&gt;
* **Bundle-Architektur:** UVdesk ist stark modularisiert. Fast alle Funktionen (Tickets, Knowledgebase, Mailbox) liegen in separaten Bundles unter {{SMC|vendor/uvdesk/}}.&lt;br /&gt;
* **Custom Routing:** Die Routing-Logik für Member- und Customer-Bereiche ist eng mit der Datenbank verknüpft.&lt;br /&gt;
* **Service Decoration:** Viele Kern-Services sind so konzipiert, dass sie durch eigene Implementierungen erweitert werden können (wichtig für unsere Anpassungen ohne Vendor-Patching).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&#039;&#039;Dieser Bereich wird noch ergänzt. Hier folgen Informationen zu:&#039;&#039;&lt;br /&gt;
* &#039;&#039;Datenbank-Initialisierung&#039;&#039;&lt;br /&gt;
* &#039;&#039;Ersteinrichtung des Admin-Accounts&#039;&#039;&lt;br /&gt;
* &#039;&#039;Verzeichnisrechte auf bplaced&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== How-to&#039;s ==&lt;br /&gt;
=== Konfiguration der Mailbox ===&lt;br /&gt;
&#039;&#039;Beschreibung der Anbindung von IMAP/SMTP (iCloud, Office365 etc.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quirks &amp;amp; Fallstricke ==&lt;br /&gt;
* **Zugehörigkeit:** Achten Sie beim Erstellen von Agents darauf, dass die Rollen-Zuweisung (Role) korrekt erfolgt, da Symfony-Security-Voter den Zugriff steuern.&lt;br /&gt;
* **Cache:** Nach jeder Änderung an Konfigurationsdateien muss der Symfony-Cache physisch geleert werden (siehe Debugging-Sektion).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Debugging-History ==&lt;br /&gt;
&lt;br /&gt;
Hier werden spezifische Probleme und deren Lösungen dokumentiert, die während des Betriebs im ArtisanCommerce-Netzwerk aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
=== Fall 01: Swiftmailer Alias &amp;amp; Memory Limit (bplaced Umgebung) ===&lt;br /&gt;
&#039;&#039;&#039;Datum:&#039;&#039;&#039; Februar 2026&lt;br /&gt;
&#039;&#039;&#039;Symptom:&#039;&#039;&#039; {{SMC|cache:clear}} schlägt fehl mit {{SMC|ServiceNotFoundException}} oder {{SMC|Memory Limit Exhausted}}.&lt;br /&gt;
&lt;br /&gt;
==== Lösung A: Swiftmailer Alias Fix ====&lt;br /&gt;
Da der interne Symfony-Compiler den Dienst {{SMC|swiftmailer.mailer}} erwartet, dieser aber bei benutzerdefinierten Mailer-Namen fehlt, muss ein Alias in der {{SMC|config/services.yaml}} gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
    # Fix für RegisterPluginsPass Bug&lt;br /&gt;
    swiftmailer.mailer:&lt;br /&gt;
        alias: swiftmailer.mailer.default&lt;br /&gt;
        public: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lösung B: Memory Limit via Wrapper ====&lt;br /&gt;
Auf bplaced-Umgebungen überschreibt der PHP-Wrapper das Memory-Limit oft auf 64MB. Für Symfony-Operationen müssen mindestens 512MB erzwungen werden:&lt;br /&gt;
&lt;br /&gt;
# In der {{SMC|.env}} oder {{SMC|.env.dev}} Variable setzen: {{SMC|MM=512}}&lt;br /&gt;
# Befehl manuell ausführen: {{SMC|MM=512 php bin/console cache:clear}}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=83</id>
		<title>Intern:Hauptseite/UVdesk</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=83"/>
		<updated>2026-02-22T16:17:17Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= UVdesk Helpdesk System =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde. &lt;br /&gt;
&lt;br /&gt;
=== Der Tech-Stack ===&lt;br /&gt;
Das System basiert auf einer modernen PHP-Architektur:&lt;br /&gt;
* **Framework:** [[Symfony]] (v4.4 / v5.4 LTS)&lt;br /&gt;
* **Datenbank:** MySQL / MariaDB (Doctrine ORM)&lt;br /&gt;
* **Template-Engine:** Twig&lt;br /&gt;
* **Mail-Handling:** Swiftmailer (in neueren Versionen Symfony Mailer)&lt;br /&gt;
* **Paketverwaltung:** Composer&lt;br /&gt;
&lt;br /&gt;
=== Eigenheiten &amp;amp; Unterschiede zu Standard-Symfony ===&lt;br /&gt;
Obwohl UVdesk auf Symfony basiert, gibt es einige architektonische Besonderheiten:&lt;br /&gt;
* **Bundle-Architektur:** UVdesk ist stark modularisiert. Fast alle Funktionen (Tickets, Knowledgebase, Mailbox) liegen in separaten Bundles unter {{SMC|vendor/uvdesk/}}.&lt;br /&gt;
* **Custom Routing:** Die Routing-Logik für Member- und Customer-Bereiche ist eng mit der Datenbank verknüpft.&lt;br /&gt;
* **Service Decoration:** Viele Kern-Services sind so konzipiert, dass sie durch eigene Implementierungen erweitert werden können (wichtig für unsere Anpassungen ohne Vendor-Patching).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&#039;&#039;Dieser Bereich wird noch ergänzt. Hier folgen Informationen zu:&#039;&#039;&lt;br /&gt;
* &#039;&#039;Datenbank-Initialisierung&#039;&#039;&lt;br /&gt;
* &#039;&#039;Ersteinrichtung des Admin-Accounts&#039;&#039;&lt;br /&gt;
* &#039;&#039;Verzeichnisrechte auf bplaced&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== How-to&#039;s ==&lt;br /&gt;
=== Konfiguration der Mailbox ===&lt;br /&gt;
&#039;&#039;Beschreibung der Anbindung von IMAP/SMTP (iCloud, Office365 etc.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quirks &amp;amp; Fallstricke ==&lt;br /&gt;
* **Zugehörigkeit:** Achten Sie beim Erstellen von Agents darauf, dass die Rollen-Zuweisung (Role) korrekt erfolgt, da Symfony-Security-Voter den Zugriff steuern.&lt;br /&gt;
* **Cache:** Nach jeder Änderung an Konfigurationsdateien muss der Symfony-Cache physisch geleert werden (siehe Debugging-Sektion).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Debugging-History ==&lt;br /&gt;
&lt;br /&gt;
Hier werden spezifische Probleme und deren Lösungen dokumentiert, die während des Betriebs im ArtisanCommerce-Netzwerk aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
=== Fall 01: Swiftmailer Alias &amp;amp; Memory Limit (bplaced Umgebung) ===&lt;br /&gt;
&#039;&#039;&#039;Datum:&#039;&#039;&#039; Februar 2026&lt;br /&gt;
&#039;&#039;&#039;Symptom:&#039;&#039;&#039; {{SMC|cache:clear}} schlägt fehl mit {{SMC|ServiceNotFoundException}} oder {{SMC|Memory Limit Exhausted}}.&lt;br /&gt;
&lt;br /&gt;
==== Lösung A: Swiftmailer Alias Fix ====&lt;br /&gt;
Da der interne Symfony-Compiler den Dienst {{SMC|swiftmailer.mailer}} erwartet, dieser aber bei benutzerdefinierten Mailer-Namen fehlt, muss ein Alias in der {{SMC|config/services.yaml}} gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
    # Fix für RegisterPluginsPass Bug&lt;br /&gt;
    swiftmailer.mailer:&lt;br /&gt;
        alias: swiftmailer.mailer.default&lt;br /&gt;
        public: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lösung B: Memory Limit via Wrapper ====&lt;br /&gt;
Auf bplaced-Umgebungen überschreibt der PHP-Wrapper das Memory-Limit oft auf 64MB. Für Symfony-Operationen müssen mindestens 512MB erzwungen werden:&lt;br /&gt;
&lt;br /&gt;
# In der {{SMC|.env}} oder {{SMC|.env.dev}} Variable setzen: {{SMC|&amp;quot;MM=512&amp;quot;}}&lt;br /&gt;
# Befehl manuell ausführen: {{SMC|MM=512 php bin/console cache:clear}}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=82</id>
		<title>Intern:Hauptseite/UVdesk</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=82"/>
		<updated>2026-02-22T15:55:49Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= UVdesk Helpdesk System =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde. &lt;br /&gt;
&lt;br /&gt;
=== Der Tech-Stack ===&lt;br /&gt;
Das System basiert auf einer modernen PHP-Architektur:&lt;br /&gt;
* **Framework:** [[Symfony]] (v4.4 / v5.4 LTS)&lt;br /&gt;
* **Datenbank:** MySQL / MariaDB (Doctrine ORM)&lt;br /&gt;
* **Template-Engine:** Twig&lt;br /&gt;
* **Mail-Handling:** Swiftmailer (in neueren Versionen Symfony Mailer)&lt;br /&gt;
* **Paketverwaltung:** Composer&lt;br /&gt;
&lt;br /&gt;
=== Eigenheiten &amp;amp; Unterschiede zu Standard-Symfony ===&lt;br /&gt;
Obwohl UVdesk auf Symfony basiert, gibt es einige architektonische Besonderheiten:&lt;br /&gt;
* **Bundle-Architektur:** UVdesk ist stark modularisiert. Fast alle Funktionen (Tickets, Knowledgebase, Mailbox) liegen in separaten Bundles unter {{SMC|vendor/uvdesk/}}.&lt;br /&gt;
* **Custom Routing:** Die Routing-Logik für Member- und Customer-Bereiche ist eng mit der Datenbank verknüpft.&lt;br /&gt;
* **Service Decoration:** Viele Kern-Services sind so konzipiert, dass sie durch eigene Implementierungen erweitert werden können (wichtig für unsere Anpassungen ohne Vendor-Patching).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&#039;&#039;Dieser Bereich wird noch ergänzt. Hier folgen Informationen zu:&#039;&#039;&lt;br /&gt;
* &#039;&#039;Datenbank-Initialisierung&#039;&#039;&lt;br /&gt;
* &#039;&#039;Ersteinrichtung des Admin-Accounts&#039;&#039;&lt;br /&gt;
* &#039;&#039;Verzeichnisrechte auf bplaced&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== How-to&#039;s ==&lt;br /&gt;
=== Konfiguration der Mailbox ===&lt;br /&gt;
&#039;&#039;Beschreibung der Anbindung von IMAP/SMTP (iCloud, Office365 etc.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quirks &amp;amp; Fallstricke ==&lt;br /&gt;
* **Zugehörigkeit:** Achten Sie beim Erstellen von Agents darauf, dass die Rollen-Zuweisung (Role) korrekt erfolgt, da Symfony-Security-Voter den Zugriff steuern.&lt;br /&gt;
* **Cache:** Nach jeder Änderung an Konfigurationsdateien muss der Symfony-Cache physisch geleert werden (siehe Debugging-Sektion).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Debugging-History ==&lt;br /&gt;
&lt;br /&gt;
Hier werden spezifische Probleme und deren Lösungen dokumentiert, die während des Betriebs im ArtisanCommerce-Netzwerk aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
=== Fall 01: Swiftmailer Alias &amp;amp; Memory Limit (bplaced Umgebung) ===&lt;br /&gt;
&#039;&#039;&#039;Datum:&#039;&#039;&#039; Februar 2026&lt;br /&gt;
&#039;&#039;&#039;Symptom:&#039;&#039;&#039; {{SMC|cache:clear}} schlägt fehl mit {{SMC|ServiceNotFoundException}} oder {{SMC|Memory Limit Exhausted}}.&lt;br /&gt;
&lt;br /&gt;
==== Lösung A: Swiftmailer Alias Fix ====&lt;br /&gt;
Da der interne Symfony-Compiler den Dienst {{SMC|swiftmailer.mailer}} erwartet, dieser aber bei benutzerdefinierten Mailer-Namen fehlt, muss ein Alias in der {{SMC|config/services.yaml}} gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
    # Fix für RegisterPluginsPass Bug&lt;br /&gt;
    swiftmailer.mailer:&lt;br /&gt;
        alias: swiftmailer.mailer.default&lt;br /&gt;
        public: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lösung B: Memory Limit via Wrapper ====&lt;br /&gt;
Auf bplaced-Umgebungen überschreibt der PHP-Wrapper das Memory-Limit oft auf 64MB. Für Symfony-Operationen müssen mindestens 512MB erzwungen werden:&lt;br /&gt;
&lt;br /&gt;
# In der {{SMC|.env}} oder {{SMC|.env.dev}} Variable setzen: {{SMC|&#039;MM=512&#039;}}&lt;br /&gt;
# Befehl manuell ausführen: {{SMC|&#039;MM=512 php bin/console cache:clear&#039;}}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=81</id>
		<title>Intern:Hauptseite/UVdesk</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=81"/>
		<updated>2026-02-22T15:53:33Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= UVdesk Helpdesk System =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde. &lt;br /&gt;
&lt;br /&gt;
=== Der Tech-Stack ===&lt;br /&gt;
Das System basiert auf einer modernen PHP-Architektur:&lt;br /&gt;
* **Framework:** [[Symfony]] (v4.4 / v5.4 LTS)&lt;br /&gt;
* **Datenbank:** MySQL / MariaDB (Doctrine ORM)&lt;br /&gt;
* **Template-Engine:** Twig&lt;br /&gt;
* **Mail-Handling:** Swiftmailer (in neueren Versionen Symfony Mailer)&lt;br /&gt;
* **Paketverwaltung:** Composer&lt;br /&gt;
&lt;br /&gt;
=== Eigenheiten &amp;amp; Unterschiede zu Standard-Symfony ===&lt;br /&gt;
Obwohl UVdesk auf Symfony basiert, gibt es einige architektonische Besonderheiten:&lt;br /&gt;
* **Bundle-Architektur:** UVdesk ist stark modularisiert. Fast alle Funktionen (Tickets, Knowledgebase, Mailbox) liegen in separaten Bundles unter {{SMC|vendor/uvdesk/}}.&lt;br /&gt;
* **Custom Routing:** Die Routing-Logik für Member- und Customer-Bereiche ist eng mit der Datenbank verknüpft.&lt;br /&gt;
* **Service Decoration:** Viele Kern-Services sind so konzipiert, dass sie durch eigene Implementierungen erweitert werden können (wichtig für unsere Anpassungen ohne Vendor-Patching).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&#039;&#039;Dieser Bereich wird noch ergänzt. Hier folgen Informationen zu:&#039;&#039;&lt;br /&gt;
* &#039;&#039;Datenbank-Initialisierung&#039;&#039;&lt;br /&gt;
* &#039;&#039;Ersteinrichtung des Admin-Accounts&#039;&#039;&lt;br /&gt;
* &#039;&#039;Verzeichnisrechte auf bplaced&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== How-to&#039;s ==&lt;br /&gt;
=== Konfiguration der Mailbox ===&lt;br /&gt;
&#039;&#039;Beschreibung der Anbindung von IMAP/SMTP (iCloud, Office365 etc.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quirks &amp;amp; Fallstricke ==&lt;br /&gt;
* **Zugehörigkeit:** Achten Sie beim Erstellen von Agents darauf, dass die Rollen-Zuweisung (Role) korrekt erfolgt, da Symfony-Security-Voter den Zugriff steuern.&lt;br /&gt;
* **Cache:** Nach jeder Änderung an Konfigurationsdateien muss der Symfony-Cache physisch geleert werden (siehe Debugging-Sektion).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Debugging-History ==&lt;br /&gt;
&lt;br /&gt;
Hier werden spezifische Probleme und deren Lösungen dokumentiert, die während des Betriebs im ArtisanCommerce-Netzwerk aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
=== Fall 01: Swiftmailer Alias &amp;amp; Memory Limit (bplaced Umgebung) ===&lt;br /&gt;
&#039;&#039;&#039;Datum:&#039;&#039;&#039; Februar 2026&lt;br /&gt;
&#039;&#039;&#039;Symptom:&#039;&#039;&#039; {{SMC|cache:clear}} schlägt fehl mit {{SMC|ServiceNotFoundException}} oder {{SMC|Memory Limit Exhausted}}.&lt;br /&gt;
&lt;br /&gt;
==== Lösung A: Swiftmailer Alias Fix ====&lt;br /&gt;
Da der interne Symfony-Compiler den Dienst {{SMC|swiftmailer.mailer}} erwartet, dieser aber bei benutzerdefinierten Mailer-Namen fehlt, muss ein Alias in der {{SMC|config/services.yaml}} gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
    # Fix für RegisterPluginsPass Bug&lt;br /&gt;
    swiftmailer.mailer:&lt;br /&gt;
        alias: swiftmailer.mailer.default&lt;br /&gt;
        public: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lösung B: Memory Limit via Wrapper ====&lt;br /&gt;
Auf bplaced-Umgebungen überschreibt der PHP-Wrapper das Memory-Limit oft auf 64MB. Für Symfony-Operationen müssen mindestens 512MB erzwungen werden:&lt;br /&gt;
&lt;br /&gt;
# In der {{SMC|.env}} oder {{SMC|.env.dev}} Variable setzen: {{SMC|MM=512}}&lt;br /&gt;
# Befehl manuell ausführen: {{SMC|MM=512 php bin/console cache:clear}}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=80</id>
		<title>Intern:Hauptseite/UVdesk</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=80"/>
		<updated>2026-02-22T15:46:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= UVdesk Helpdesk System =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde. &lt;br /&gt;
&lt;br /&gt;
=== Der Tech-Stack ===&lt;br /&gt;
Das System basiert auf einer modernen PHP-Architektur:&lt;br /&gt;
* **Framework:** [[Symfony]] (v4.4 / v5.4 LTS)&lt;br /&gt;
* **Datenbank:** MySQL / MariaDB (Doctrine ORM)&lt;br /&gt;
* **Template-Engine:** Twig&lt;br /&gt;
* **Mail-Handling:** Swiftmailer (in neueren Versionen Symfony Mailer)&lt;br /&gt;
* **Paketverwaltung:** Composer&lt;br /&gt;
&lt;br /&gt;
=== Eigenheiten &amp;amp; Unterschiede zu Standard-Symfony ===&lt;br /&gt;
Obwohl UVdesk auf Symfony basiert, gibt es einige architektonische Besonderheiten:&lt;br /&gt;
* **Bundle-Architektur:** UVdesk ist stark modularisiert. Fast alle Funktionen (Tickets, Knowledgebase, Mailbox) liegen in separaten Bundles unter {{SMC|vendor/uvdesk/}}.&lt;br /&gt;
* **Custom Routing:** Die Routing-Logik für Member- und Customer-Bereiche ist eng mit der Datenbank verknüpft.&lt;br /&gt;
* **Service Decoration:** Viele Kern-Services sind so konzipiert, dass sie durch eigene Implementierungen erweitert werden können (wichtig für unsere Anpassungen ohne Vendor-Patching).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&#039;&#039;Dieser Bereich wird noch ergänzt. Hier folgen Informationen zu:&#039;&#039;&lt;br /&gt;
* &#039;&#039;Datenbank-Initialisierung&#039;&#039;&lt;br /&gt;
* &#039;&#039;Ersteinrichtung des Admin-Accounts&#039;&#039;&lt;br /&gt;
* &#039;&#039;Verzeichnisrechte auf bplaced&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== How-to&#039;s ==&lt;br /&gt;
=== Konfiguration der Mailbox ===&lt;br /&gt;
&#039;&#039;Beschreibung der Anbindung von IMAP/SMTP (iCloud, Office365 etc.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quirks &amp;amp; Fallstricke ==&lt;br /&gt;
* **Zugehörigkeit:** Achten Sie beim Erstellen von Agents darauf, dass die Rollen-Zuweisung (Role) korrekt erfolgt, da Symfony-Security-Voter den Zugriff steuern.&lt;br /&gt;
* **Cache:** Nach jeder Änderung an Konfigurationsdateien muss der Symfony-Cache physisch geleert werden (siehe Debugging-Sektion).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Debugging-History ==&lt;br /&gt;
&lt;br /&gt;
Hier werden spezifische Probleme und deren Lösungen dokumentiert, die während des Betriebs im ArtisanCommerce-Netzwerk aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
=== Fall 01: Swiftmailer Alias &amp;amp; Memory Limit (bplaced Umgebung) ===&lt;br /&gt;
&#039;&#039;&#039;Datum:&#039;&#039;&#039; Februar 2026&lt;br /&gt;
&#039;&#039;&#039;Symptom:&#039;&#039;&#039; {{SMC|cache:clear}} schlägt fehl mit {{SMC|ServiceNotFoundException}} oder {{SMC|Memory Limit Exhausted}}.&lt;br /&gt;
&lt;br /&gt;
==== Lösung A: Swiftmailer Alias Fix ====&lt;br /&gt;
Da der interne Symfony-Compiler den Dienst {{SMC|swiftmailer.mailer}} erwartet, dieser aber bei benutzerdefinierten Mailer-Namen fehlt, muss ein Alias in der {{SMC|config/services.yaml}} gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
    # Fix für RegisterPluginsPass Bug&lt;br /&gt;
    swiftmailer.mailer:&lt;br /&gt;
        alias: swiftmailer.mailer.default&lt;br /&gt;
        public: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lösung B: Memory Limit via Wrapper ====&lt;br /&gt;
Auf bplaced-Umgebungen überschreibt der PHP-Wrapper das Memory-Limit oft auf 64MB. Für Symfony-Operationen müssen mindestens 512MB erzwungen werden:&lt;br /&gt;
&lt;br /&gt;
# In der {{:SMC|.env}} oder {{SMC|.env.dev}} Variable setzen: {{SMC|MM=512}}&lt;br /&gt;
# Befehl manuell ausführen: {{SMC|MM=512 php bin/console cache:clear}}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Vorlage:SMC&amp;diff=79</id>
		<title>Vorlage:SMC</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Vorlage:SMC&amp;diff=79"/>
		<updated>2026-02-22T15:40:53Z</updated>

		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „&amp;lt;code&amp;gt;{{{1}}}&amp;lt;/code&amp;gt;“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;{{{1}}}&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=78</id>
		<title>Intern:Hauptseite/UVdesk</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Intern:Hauptseite/UVdesk&amp;diff=78"/>
		<updated>2026-02-22T15:40:22Z</updated>

		<summary type="html">&lt;p&gt;Admin: Die Seite wurde neu angelegt: „__TOC__  = UVdesk Helpdesk System =  == Übersicht == UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde.   === Der Tech-Stack === Das System basiert auf einer modernen PHP-Architektur: * **Framework:** Symfony (v4.4 / v5.4 LTS) * **Datenbank:** MySQL / MariaDB (Doctrine ORM) * **Template-Engine:** Twig * **Mail-Handling:** Swiftmailer (in neueren Versionen Symfony Mailer) *…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
= UVdesk Helpdesk System =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
UVdesk ist eine Enterprise-Grade Helpdesk-Lösung, die speziell für die Automatisierung von Support-Prozessen entwickelt wurde. &lt;br /&gt;
&lt;br /&gt;
=== Der Tech-Stack ===&lt;br /&gt;
Das System basiert auf einer modernen PHP-Architektur:&lt;br /&gt;
* **Framework:** [[Symfony]] (v4.4 / v5.4 LTS)&lt;br /&gt;
* **Datenbank:** MySQL / MariaDB (Doctrine ORM)&lt;br /&gt;
* **Template-Engine:** Twig&lt;br /&gt;
* **Mail-Handling:** Swiftmailer (in neueren Versionen Symfony Mailer)&lt;br /&gt;
* **Paketverwaltung:** Composer&lt;br /&gt;
&lt;br /&gt;
=== Eigenheiten &amp;amp; Unterschiede zu Standard-Symfony ===&lt;br /&gt;
Obwohl UVdesk auf Symfony basiert, gibt es einige architektonische Besonderheiten:&lt;br /&gt;
* **Bundle-Architektur:** UVdesk ist stark modularisiert. Fast alle Funktionen (Tickets, Knowledgebase, Mailbox) liegen in separaten Bundles unter {{SMC|vendor/uvdesk/}}.&lt;br /&gt;
* **Custom Routing:** Die Routing-Logik für Member- und Customer-Bereiche ist eng mit der Datenbank verknüpft.&lt;br /&gt;
* **Service Decoration:** Viele Kern-Services sind so konzipiert, dass sie durch eigene Implementierungen erweitert werden können (wichtig für unsere Anpassungen ohne Vendor-Patching).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Initial Setup ==&lt;br /&gt;
&#039;&#039;Dieser Bereich wird noch ergänzt. Hier folgen Informationen zu:&#039;&#039;&lt;br /&gt;
* &#039;&#039;Datenbank-Initialisierung&#039;&#039;&lt;br /&gt;
* &#039;&#039;Ersteinrichtung des Admin-Accounts&#039;&#039;&lt;br /&gt;
* &#039;&#039;Verzeichnisrechte auf bplaced&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== How-to&#039;s ==&lt;br /&gt;
=== Konfiguration der Mailbox ===&lt;br /&gt;
&#039;&#039;Beschreibung der Anbindung von IMAP/SMTP (iCloud, Office365 etc.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Quirks &amp;amp; Fallstricke ==&lt;br /&gt;
* **Zugehörigkeit:** Achten Sie beim Erstellen von Agents darauf, dass die Rollen-Zuweisung (Role) korrekt erfolgt, da Symfony-Security-Voter den Zugriff steuern.&lt;br /&gt;
* **Cache:** Nach jeder Änderung an Konfigurationsdateien muss der Symfony-Cache physisch geleert werden (siehe Debugging-Sektion).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Debugging-History ==&lt;br /&gt;
&lt;br /&gt;
Hier werden spezifische Probleme und deren Lösungen dokumentiert, die während des Betriebs im ArtisanCommerce-Netzwerk aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
=== Fall 01: Swiftmailer Alias &amp;amp; Memory Limit (bplaced Umgebung) ===&lt;br /&gt;
&#039;&#039;&#039;Datum:&#039;&#039;&#039; Februar 2026&lt;br /&gt;
&#039;&#039;&#039;Symptom:&#039;&#039;&#039; {{SMC|cache:clear}} schlägt fehl mit {{SMC|ServiceNotFoundException}} oder {{SMC|Memory Limit Exhausted}}.&lt;br /&gt;
&lt;br /&gt;
==== Lösung A: Swiftmailer Alias Fix ====&lt;br /&gt;
Da der interne Symfony-Compiler den Dienst {{SMC|swiftmailer.mailer}} erwartet, dieser aber bei benutzerdefinierten Mailer-Namen fehlt, muss ein Alias in der {{SMC|config/services.yaml}} gesetzt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
services:&lt;br /&gt;
    # Fix für RegisterPluginsPass Bug&lt;br /&gt;
    swiftmailer.mailer:&lt;br /&gt;
        alias: swiftmailer.mailer.default&lt;br /&gt;
        public: true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lösung B: Memory Limit via Wrapper ====&lt;br /&gt;
Auf bplaced-Umgebungen überschreibt der PHP-Wrapper das Memory-Limit oft auf 64MB. Für Symfony-Operationen müssen mindestens 512MB erzwungen werden:&lt;br /&gt;
&lt;br /&gt;
# In der {{SMC|.env}} oder {{SMC|.env.dev}} Variable setzen: {{SMC|MM=512}}&lt;br /&gt;
# Befehl manuell ausführen: {{SMC|MM=512 php bin/console cache:clear}}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Software-Dokumentation]]&lt;br /&gt;
[[Kategorie:Helpdesk]]&lt;br /&gt;
[[Kategorie:Intern]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=C%2B%2B&amp;diff=77</id>
		<title>C++</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=C%2B%2B&amp;diff=77"/>
		<updated>2026-02-18T17:58:59Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== C++ ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++&#039;&#039;&#039; ist eine leistungsstarke Allzweck-Sprache, die Hardwarenähe mit komplexen Abstraktionsmechanismen verbindet. Sie gilt als eine der effizientesten Sprachen der Welt.&lt;br /&gt;
&lt;br /&gt;
=== Aktuelle Features (C++20/23) ===&lt;br /&gt;
* &#039;&#039;&#039;Concepts:&#039;&#039;&#039; Typprüfung für Template-Parameter zur Kompilierzeit, was Fehlermeldungen verständlicher macht.&lt;br /&gt;
* &#039;&#039;&#039;Modules:&#039;&#039;&#039; Ersetzt das klassische Header-System (`#include`), was die Kompilierzeit massiv beschleunigt und Abhängigkeiten sauberer trennt.&lt;br /&gt;
* &#039;&#039;&#039;Ranges:&#039;&#039;&#039; Ermöglicht eine funktionale Arbeitsweise mit Datenströmen über Pipes (z. B. `view | filter | transform`).&lt;br /&gt;
* &#039;&#039;&#039;std::expected:&#039;&#039;&#039; Ein neuer Typ für das Fehlerhandling, der angibt, ob ein Wert oder ein Fehler zurückgegeben wurde (Vermeidung von Exceptions).&lt;br /&gt;
&lt;br /&gt;
=== Eignung ===&lt;br /&gt;
* &#039;&#039;&#039;Ressourcenkritische Software:&#039;&#039;&#039; Betriebssysteme, Treiber und Browser-Engines.&lt;br /&gt;
* &#039;&#039;&#039;Gaming:&#039;&#039;&#039; Kernsprache der [[Unreal Engine]] und High-End-Grafik-Engines.&lt;br /&gt;
* &#039;&#039;&#039;Systemnahe Programmierung:&#039;&#039;&#039; Embedded Systems und IoT.&lt;br /&gt;
* &#039;&#039;&#039;Finanzwesen:&#039;&#039;&#039; Hochgeschwindigkeits-Handelssysteme (HFT).&lt;br /&gt;
* &#039;&#039;&#039;Web:&#039;&#039;&#039; .ansonsten in PHP eher resourcenhungriger Code&amp;lt;br /&amp;gt;&amp;lt;small&amp;gt;*(C++ ist hochperformant u. kann auch echtes Multithreading nutzen.)&amp;lt;/small&amp;gt;&lt;br /&gt;
NGINX(der gemeinhin als schnellster bekannte Webserver, ist in C++ geschrieben)&lt;br /&gt;
&lt;br /&gt;
[[index.php?title=Kategorie:Programmierung]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=C%2B%2B&amp;diff=76</id>
		<title>C++</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=C%2B%2B&amp;diff=76"/>
		<updated>2026-02-18T17:58:34Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Eignung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== C++ ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++&#039;&#039;&#039; ist eine leistungsstarke Allzweck-Sprache, die Hardwarenähe mit komplexen Abstraktionsmechanismen verbindet. Sie gilt als eine der effizientesten Sprachen der Welt.&lt;br /&gt;
&lt;br /&gt;
=== Aktuelle Features (C++20/23) ===&lt;br /&gt;
* &#039;&#039;&#039;Concepts:&#039;&#039;&#039; Typprüfung für Template-Parameter zur Kompilierzeit, was Fehlermeldungen verständlicher macht.&lt;br /&gt;
* &#039;&#039;&#039;Modules:&#039;&#039;&#039; Ersetzt das klassische Header-System (`#include`), was die Kompilierzeit massiv beschleunigt und Abhängigkeiten sauberer trennt.&lt;br /&gt;
* &#039;&#039;&#039;Ranges:&#039;&#039;&#039; Ermöglicht eine funktionale Arbeitsweise mit Datenströmen über Pipes (z. B. `view | filter | transform`).&lt;br /&gt;
* &#039;&#039;&#039;std::expected:&#039;&#039;&#039; Ein neuer Typ für das Fehlerhandling, der angibt, ob ein Wert oder ein Fehler zurückgegeben wurde (Vermeidung von Exceptions).&lt;br /&gt;
&lt;br /&gt;
=== Eignung ===&lt;br /&gt;
* &#039;&#039;&#039;Ressourcenkritische Software:&#039;&#039;&#039; Betriebssysteme, Treiber und Browser-Engines.&lt;br /&gt;
* &#039;&#039;&#039;Gaming:&#039;&#039;&#039; Kernsprache der [[Unreal Engine]] und High-End-Grafik-Engines.&lt;br /&gt;
* &#039;&#039;&#039;Systemnahe Programmierung:&#039;&#039;&#039; Embedded Systems und IoT.&lt;br /&gt;
* &#039;&#039;&#039;Finanzwesen:&#039;&#039;&#039; Hochgeschwindigkeits-Handelssysteme (HFT).&lt;br /&gt;
* &#039;&#039;&#039;Web:&#039;&#039;&#039; .ansonsten in PHP eher resourcenhungriger Code&amp;lt;br /&amp;gt;&amp;lt;small&amp;gt;*(C++ ist hochperformant u. kann auch echtes Multithreading nutzen.)&amp;lt;/small&amp;gt;&lt;br /&gt;
NGINX(der gemeinhin als schnellster bekannte Webserver ist in C++ geschrieben)&lt;br /&gt;
&lt;br /&gt;
[[index.php?title=Kategorie:Programmierung]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=Hauptseite&amp;diff=75</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=Hauptseite&amp;diff=75"/>
		<updated>2026-02-18T17:53:13Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{| style=&amp;quot;width: 100%; background: transparent; border-spacing: 10px;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center; background: #f0f0f0; border: 1px solid #ccc; padding: 20px; border-radius: 8px;&amp;quot; |&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 200%; font-weight: bold; color: #222;&amp;quot;&amp;gt;ArtisanCommerce / DevPow&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 120%; color: #666;&amp;quot;&amp;gt;DOKUMENTATION &amp;amp; KNOWLEDGE-WIKI&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[ArtisanCommerce / DevPow|&amp;amp;rarr; Zur Projektübersicht]]&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 50%; vertical-align: top; background: #fff; border: 1px solid #ddd; padding: 15px; border-radius: 8px; box-shadow: 2px 2px 5px #eee;&amp;quot; |&lt;br /&gt;
=== Web-Systeme &amp;amp; Shops ===&lt;br /&gt;
&#039;&#039;Plattformen für Content und Commerce&#039;&#039;&lt;br /&gt;
* [[Craft CMS]]&lt;br /&gt;
* [[WordPress]]&lt;br /&gt;
* [[Kirby (CMS)]]&lt;br /&gt;
* [[JTL-Shop]]&lt;br /&gt;
* [[Shopware]]&lt;br /&gt;
* [[Symfony (Framework)]]&lt;br /&gt;
* [[Laravel]]&lt;br /&gt;
* [[Flight PHP]]&lt;br /&gt;
* [[.NET Core (ASP)]]&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 50%; vertical-align: top; background: #fff; border: 1px solid #ddd; padding: 15px; border-radius: 8px; box-shadow: 2px 2px 5px #eee;&amp;quot; |&lt;br /&gt;
=== Development Stack ===&lt;br /&gt;
&#039;&#039;Sprachen und Frameworks&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Backend:&#039;&#039;&#039; [[PHP]], [[C-Sharp/.NET]], [[C++]]&lt;br /&gt;
* &#039;&#039;&#039;Frontend:&#039;&#039;&#039; [[JavaScript]], [[Nuxt.js]], [[Next.js]], [[SvelteKit]]&lt;br /&gt;
* &#039;&#039;&#039;Special:&#039;&#039;&#039; [[Kirby (CMS)]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 50%; vertical-align: top; background: #fff; border: 1px solid #ddd; padding: 15px; border-radius: 8px; box-shadow: 2px 2px 5px #eee;&amp;quot; |&lt;br /&gt;
=== Tools &amp;amp; Workflow ===&lt;br /&gt;
&#039;&#039;Unsere täglichen Werkzeuge&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Kollaboration:&#039;&#039;&#039; [[MediaWiki]], [[UVdesk]]&lt;br /&gt;
* &#039;&#039;&#039;Versionierung:&#039;&#039;&#039; [[GitHub]], [[Pijul]]&lt;br /&gt;
* &#039;&#039;&#039;Editoren:&#039;&#039;&#039; [[VS Code]], [[Zed (Editor)]]&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 50%; vertical-align: top; background: #fff; border: 1px solid #ddd; padding: 15px; border-radius: 8px; box-shadow: 2px 2px 5px #eee;&amp;quot; |&lt;br /&gt;
=== Infrastructure ===&lt;br /&gt;
&#039;&#039;Hosting &amp;amp; Betriebssysteme&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;OS:&#039;&#039;&#039; [[Linux]], [[Windows]], [[MacOS (Darwin BSD)]]&lt;br /&gt;
* &#039;&#039;&#039;Provider:&#039;&#039;&#039; &lt;br /&gt;
** [[Hetzner Online]]&lt;br /&gt;
** [[Mittwald]]&lt;br /&gt;
** [[Timmehosting]]&lt;br /&gt;
** [[Bplaced]]&lt;br /&gt;
* &#039;&#039;&#039;Cloud:&#039;&#039;&#039; [[Hyperscale Cloud Computing]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Dokumentation]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=74</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=74"/>
		<updated>2026-02-18T12:14:20Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
/* html{min-height: 100vh !important;}&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; } */&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    min-height: 95vh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-wrapper {&lt;br /&gt;
    flex: 1 0 auto; /* This makes the wrapper grow */&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-block {&lt;br /&gt;
    flex: 1 0 auto; /* This pushes the footer down */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-container.ts-container{&lt;br /&gt;
	height: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 850px) {&lt;br /&gt;
    #mw-content {&lt;br /&gt;
        padding-left: 1.75em;&lt;br /&gt;
        padding-right: 1.75em;&lt;br /&gt;
        padding-top: 1.25em;&lt;br /&gt;
        border-width: 0;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=73</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=73"/>
		<updated>2026-02-18T12:06:46Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
/* html{min-height: 100vh !important;}&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; } */&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    min-height: 95vh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-wrapper {&lt;br /&gt;
    flex: 1 0 auto; /* This makes the wrapper grow */&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-block {&lt;br /&gt;
    flex: 1 0 auto; /* This pushes the footer down */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-container.ts-container{&lt;br /&gt;
	height: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 850px) {&lt;br /&gt;
    #mw-content {&lt;br /&gt;
        padding-left: 1.75em;&lt;br /&gt;
        padding-right: 1.75em;&lt;br /&gt;
        border-width: 0;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=72</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=72"/>
		<updated>2026-02-18T12:06:00Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
/* html{min-height: 100vh !important;}&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; } */&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    min-height: 95vh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-wrapper {&lt;br /&gt;
    flex: 1 0 auto; /* This makes the wrapper grow */&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-block {&lt;br /&gt;
    flex: 1 0 auto; /* This pushes the footer down */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-container.ts-container{&lt;br /&gt;
	height: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 850px) {&lt;br /&gt;
    #mw-content {&lt;br /&gt;
        padding-left: 0.75em;&lt;br /&gt;
        padding-right: 0.75em;&lt;br /&gt;
        border-width: 0;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=71</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=71"/>
		<updated>2026-02-18T12:03:52Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
/* html{min-height: 100vh !important;}&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; } */&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    min-height: 95vh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-wrapper {&lt;br /&gt;
    flex: 1 0 auto; /* This makes the wrapper grow */&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-block {&lt;br /&gt;
    flex: 1 0 auto; /* This pushes the footer down */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-container.ts-container{&lt;br /&gt;
	height: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 850px) {&lt;br /&gt;
    #mw-content {&lt;br /&gt;
        padding: 0.75em;&lt;br /&gt;
        border-width: 0;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=70</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=70"/>
		<updated>2026-02-18T12:02:12Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
/* html{min-height: 100vh !important;}&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; } */&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    min-height: 95vh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-wrapper {&lt;br /&gt;
    flex: 1 0 auto; /* This makes the wrapper grow */&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-block {&lt;br /&gt;
    flex: 1 0 auto; /* This pushes the footer down */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-container.ts-container{&lt;br /&gt;
	height: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=69</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=69"/>
		<updated>2026-02-18T12:01:30Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
/* html{min-height: 100vh !important;}&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; } */&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    min-height: 95vh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-wrapper {&lt;br /&gt;
    flex: 1 0 auto; /* This makes the wrapper grow */&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-block {&lt;br /&gt;
    flex: 1 0 auto; /* This pushes the footer down */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-container.ts-container{&lt;br /&gt;
	height: 100% !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=68</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=68"/>
		<updated>2026-02-18T12:00:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
/* html{min-height: 100vh !important;}&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; } */&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    min-height: 95vh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-wrapper {&lt;br /&gt;
    flex: 1 0 auto; /* This makes the wrapper grow */&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-block {&lt;br /&gt;
    flex: 1 0 auto; /* This pushes the footer down */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-container{&lt;br /&gt;
	height: 100% !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=67</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=67"/>
		<updated>2026-02-18T11:59:33Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
/* html{min-height: 100vh !important;}&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; } */&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    min-height: 95vh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-wrapper {&lt;br /&gt;
    flex: 1 0 auto; /* This makes the wrapper grow */&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-block {&lt;br /&gt;
    flex: 1 0 auto; /* This pushes the footer down */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-container{&lt;br /&gt;
	height: 100%;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=66</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=66"/>
		<updated>2026-02-18T11:51:10Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
/* html{min-height: 100vh !important;}&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; } */&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    min-height: 95vh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-wrapper {&lt;br /&gt;
    flex: 1 0 auto; /* This makes the wrapper grow */&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-block {&lt;br /&gt;
    flex: 1 0 auto; /* This pushes the footer down */&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=65</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=65"/>
		<updated>2026-02-18T11:50:52Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
/* html{min-height: 100vh !important;}&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; } */&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    height: 95vh;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-wrapper {&lt;br /&gt;
    flex: 1 0 auto; /* This makes the wrapper grow */&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-block {&lt;br /&gt;
    flex: 1 0 auto; /* This pushes the footer down */&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=64</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=64"/>
		<updated>2026-02-18T11:49:52Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
/* html{min-height: 100vh !important;}&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; } */&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-wrapper {&lt;br /&gt;
    flex: 1 0 auto; /* This makes the wrapper grow */&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-content-block {&lt;br /&gt;
    flex: 1 0 auto; /* This pushes the footer down */&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=63</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=63"/>
		<updated>2026-02-18T11:47:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
html{min-height: 100vh !important;}&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; }&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=62</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=62"/>
		<updated>2026-02-18T11:47:17Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
html{min-height: 100vh}&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; }&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=61</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=61"/>
		<updated>2026-02-18T11:46:41Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
body{min-height: 100vh}&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; }&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=60</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://docs.artisancommerce.at/index.php?title=MediaWiki:Timeless.css&amp;diff=60"/>
		<updated>2026-02-18T11:44:33Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS an dieser Stelle wird für Benutzer geladen, die die Benutzeroberfläche „Timeless“ verwenden */&lt;br /&gt;
#footer-poweredbyico{ display: none; }&lt;br /&gt;
.mw-content-container{ min-height: 86vh; }&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>