Intern:Hauptseite/Bplaced

Aus ArtisanCommerce Dokumentation

Infrastruktur-Analyse: bplaced für Professional Hosting

1. Architektur & System-Design

bplaced nutzt eine verteilte Shared-Hosting-Architektur. Im Gegensatz zu monolithischen Systemen sind Web-Server (Apache), Datenbank-Server (MariaDB/PostgreSQL) und Storage-Server physisch getrennt.

  • Cluster-Logik: 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.
  • Storage-Backend: 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.

2. PHP-Runtime & Prozess-Management

Die PHP-Execution erfolgt primär über FastCGI. Dies ermöglicht eine saubere Trennung der User-Berechtigungen, bringt aber Besonderheiten im Prozess-Handling mit sich.

Memory & Execution Limits

In professionellen Umgebungen stoßen Symfony-Commands oft an die Standard-Limits.

  • CLI-Override: Via Wrapper-Script können `memory_limit` und `max_execution_time` oft höher gesetzt werden als im Web-Kontext.
  • Zustandslosigkeit: Da Prozesse nach Timeouts hart beendet werden, sollten Long-Running-Tasks (wie Mail-Abruf oder Massen-Indizierung) in kleine Batches unterteilt werden.

Erweiterte Modul-Verfügbarkeit

Viele für Enterprise-Systeme kritische Module sind vorhanden, müssen aber oft manuell adressiert werden:

  • Mailparse & IMAP: Essenziell für Ticket-Systeme (UVdesk). Pfade liegen oft unter `/usr/share/php[Version]/ext/`.
  • BCMath & Intl: Meist standardmäßig aktiv, für E-Commerce (Preiskalkulationen) unverzichtbar.

3. Sicherheit & Zugriffskontrolle

Das `open_basedir`-Konzept ist bei bplaced sehr strikt.

  • Problem: 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.
  • Fix: Der PHP-Wrapper muss dynamisch die Pfade des aktuellen Release-Ordners inkludieren (besonders bei Atomic Deployments).

SSL/TLS Handling

bplaced integriert Let'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.

4. Netzwerk-Restriktionen & Mail-Ökosystem

Socket-Verbindungen (Die "Free"-Barriere)

Einer der größten Fallstricke für Profi-Systeme:

  • Outbound Traffic: Verbindungen zu externen APIs (Stripe, PayPal, Mailgun) oder Mail-Servern (IMAP/SMTP) sind in der Basis-Version oft limitiert oder gesperrt.
  • Lösung: Upgrade auf bplaced Pro/Business schaltet Sockets frei. Ohne diese bleiben Mail-Abrufe (`uvdesk:refresh-mailbox`) trotz korrektem Code ergebnislos.

Mail-Reputation

Shared-Hosting-IPs stehen oft auf Blacklists.

  • Strategie: Für geschäftskritische Mails (Bestellbestätigungen, Tickets) sollte niemals der lokale `sendmail`-Pfad, sondern ein dedizierter SMTP-Relay-Provider genutzt werden.

5. DevOp-Workflow & Deployment

Thema Empfehlung
Environment Variables `.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.
Git-Deploy 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.
Composer 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.

6. Professionelle Checkliste für bplaced

  • [ ] Absolute Pfade: Pfade wie `/users/NAME/www/support/bin/console` statt relativer Pfade verwenden.
  • [ ] Temp-Ordner: `sys_temp_dir` auf `/users/_temp/NAME` biegen, um Schreibfehler in `/tmp` zu vermeiden.
  • [ ] OPcache Flush: Nach jedem Deployment `php_cache_clear()` oder Neustart der CGI-Instanz erzwingen (via bplaced Panel oder Wrapper-Touch).
  • [ ] Logs: Regelmäßige Rotation der `php_access_logfile` und Framework-Logs, da Quota-Überschreitungen zum Systemstopp führen.

7. PHP Wrapper Scripts

  • [ ] Die Konteneinschraenkung: Es kann zwar ein Nutzer in pro/max versch. min. 2 Konten haben, bspw. bietet sich das an um eine als 'Production' und eine als 'Staging' zu halten, aber pro Konto kann immer nur eine PHP-Version gewaehlt werden. daher bieten sich da PHP Wrapper Skripte an.
  • [ ] Das default PHP Wrapper Script Das kann zwar schon einiges, siehe:
#!/bin/bash

USERNAME='peterpatoschka';
HOST='server6.bplaced.net';

source /users/_core/${USERNAME}/env

IC='';
PR='';
PV='';
OB="/users/${USERNAME}/:/users/_temp/${USERNAME}";

if [ ! -z ${PHP+b} ]; then HTTP_PV=$PHP; fi
if [[ "$HTTP_SA" =~ ^[0-9a-z]{32}$ ]]; then SA=$HTTP_SA;  fi
if [[ "$HTTP_ET" =~ ^[0-9]{1,3}$ ]];   then ET=$HTTP_ET;  fi
if [[ "$HTTP_MM" =~ ^[0-9]{1,3}$ ]];   then MM=$HTTP_MM;  fi
if [[ "$HTTP_PV" =~ ^[5-9]\.[0-9]$ ]]; then PV=$HTTP_PV;  fi
if [[ "$HTTP_PR" =~ ^(pro)$ ]];        then PR=/$HTTP_PR; fi
if [[ "$HTTP_PR" =~ ^(max|business|enterprise|edu)$ ]]; then PR=/ext; OB=""; fi

if [[ "$HTTP_IC" = "1" ]]; then IC="-d zend_extension=/etc/bplaced/php/${PV}/ioncube_loader_lin_${PV}.so"; fi

if [[ "$USERNAME" =~ ^[a-z0-9][a-z0-9\-]{1,14}[a-z0-9]$ ]]; then
 CGI=(/usr/share/${PV}${PR}/bin/php -n ${IC}
  -d zend_extension=/etc/bplaced/php/${PV}/opcache.so
  -d extension=/etc/bplaced/php/8.3/mailparse.so
  -c /etc/bplaced/php/${PV}${PR}
  -d memory_limit=${MM=64}M
  -d max_execution_time=${ET=12}
  -d open_basedir=$OB
  -d upload_tmp_dir="/users/_temp/${USERNAME}/"
  -d session.save_path="/users/_temp/${USERNAME}/"
  -d sendmail_path="/usr/bin/msmtp -t -i --from='${USERNAME}@${HOST}' --user='${USERNAME}' --password='echo ${SA}' --"
  -d soap.wsdl_cache_dir="/users/_temp/${USERNAME}/"
  -d sys_temp_dir="/users/_temp/${USERNAME}/"
 )
else
 exit;
fi

unset HTTP_ET HTTP_IC HTTP_MM HTTP_PV HTTP_PR HTTP_SA ET IC MM PV PR PATH PWD SHLVL USERNAME SA
exec "${CGI[@]}" "$@"

Aber das ist dann noch ein wenig eingeschraenkt.

  • [ ] Custom PHP-Wrapper In Zusammenarbeit mit Miro v. Bplaced wurde ein Custom-Script erarbeitet
    --> siehe extra Artikel: PHP-ini-Konfiguration