- PHP 72.4%
- HTML 13.9%
- CSS 10.3%
- JavaScript 1.8%
- Dockerfile 1.3%
- Other 0.3%
- Dockerfile (PHP >= 8.5.12, Apache) und compose.coolify.yaml mit PostgreSQL 18 - Volumes: storage/app/ und Datenbank - Jeder Start: `winter:up`, Passwort von „admin“ aus MW_ADMIN_PASS - TRUSTED_PROXIES aus der Umgebung - Lokales Image (docker/Dockerfile) ebenfalls auf PHP 8.5; Winter 1.2 läuft damit, offiziell unterstützt ist bis 8.3 - Routen-Cache an: nach `musikwerk:seed` `cache:clear` ausführen Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|---|---|---|
| bootstrap | ||
| config | ||
| docker | ||
| plugins/musikwerk/website | ||
| scripts | ||
| storage | ||
| themes/musikwerk | ||
| .dockerignore | ||
| .editorconfig | ||
| .env.example | ||
| .gitignore | ||
| .htaccess | ||
| artisan | ||
| compose.coolify.yaml | ||
| compose.yaml | ||
| composer.json | ||
| composer.lock | ||
| Dockerfile | ||
| favicon.ico | ||
| index.php | ||
| LICENSE | ||
| phpcs.xml | ||
| phpunit.xml | ||
| README.md | ||
Website Musikwerk Stuttgart (Winter-CMS-Prototyp)
Prototyp der öffentlichen Website auf Basis von Winter CMS 1.2
mit dem Plugin Winter.Pages. Nachbau von musikwerk-stuttgart.de mit Startseite, Events,
den Seiten unter „Mitmachen“ und „Verein“ sowie einigen Galerien im Rückblick.
Inhalte sind Beispieldaten aus der bisherigen WordPress-Seite, kein vollständiger Import.
Nicht Teil dieser Website: Webshop, Mitgliederbereich („Interner Bereich“), Ticketverkauf.
Starten
Voraussetzung: Docker mit Compose. PHP 8.5 und PostgreSQL laufen im Container.
cp .env.example .env # MW_ADMIN_PASS setzen
docker compose up -d --build
docker compose exec -u www-data web composer install
scripts/artisan key:generate
scripts/artisan winter:up
scripts/artisan winter:passwd admin "<Passwort aus .env>"
scripts/artisan musikwerk:seed
Website: http://localhost:8020/, Backend: http://localhost:8020/backend (Benutzer admin).
Deployment (Coolify)
Ressource aus dem Git-Repository, Build Pack „Docker Compose“, Compose-Datei
/compose.coolify.yaml. Domain beim Dienst web eintragen. Image:
Dockerfile im Wurzelverzeichnis (PHP ≥ 8.5.12, Apache), nicht
docker/Dockerfile (lokal).
- Dienste:
webunddb(PostgreSQL 18). Volumes:storage(storage/app/: Uploads, Medienbibliothek) unddatabase. - Coolify erzeugt
APP_KEY, Datenbank-Zugang und das Passwort des Backend-Kontosadmin(SERVICE_PASSWORD_WINTERADMIN, unter Environment Variables). Jeder Start führtwinter:upaus und setzt dieses Passwort. - Routen-Cache ist an. Beispielinhalte im Terminal des Containers
web:runuser -u www-data -- php artisan musikwerk:seed && runuser -u www-data -- php artisan cache:clear
Beispielinhalte
scripts/artisan musikwerk:seed # anlegen/aktualisieren
scripts/artisan musikwerk:seed --refresh # Texte neu von der alten Seite laden
scripts/artisan musikwerk:seed --alle-bilder # Galerien vollständig statt 16 Bilder
Cache der alten Seite unter scripts/.cache/ (Dateinamen wie im Kirby-Prototyp).
Was WordPress nicht strukturiert hat (Probenzeiten, Leitung, Farben, Zuordnung
Event↔Chorgruppe, Familiensingen-Termine, Videos), steht von Hand in
plugins/musikwerk/website/console/Seed.php.
Aufbau
| Pfad | Inhalt |
|---|---|
plugins/musikwerk/website/ |
Inhaltsmodell (Modelle, Migration, Backend-Formulare), Menü-Komponente, Bildhelfer, Import |
themes/musikwerk/layouts/ |
Layouts für statische Seiten (start, seite, abschnitt, events, chorgruppen, rueckblick, leitung, dokumente) und standard |
themes/musikwerk/pages/ |
Detailseiten: /events/:slug, /mitmachen/chorgruppen/:slug, /rueckblick/:slug, 404 |
themes/musikwerk/meta/ |
Ausgangsstand von Seitenstruktur und Menüs (Haupt-, Fußmenü) |
docker/, compose.yaml |
lokale Umgebung |
Code, installierte Pakete, Inhalte
| Was | Wo | Git |
|---|---|---|
| Eigener Code | plugins/musikwerk/, themes/musikwerk/, config/, docker/, scripts/ |
ja |
| Winter-Core und fremde Plugins | vendor/, modules/, plugins/winter/ (per Composer, Versionen in composer.lock) |
nein |
| Inhalte | Datenbank, storage/app/ (Uploads, Medienbibliothek) |
nein, Backup |
DATABASE_TEMPLATES=true: Was im Backend an Theme-Dateien geändert wird –
statische Seiten, Seitenbaum, Menüs –, landet in der Tabelle
cms_theme_templates, nicht im Dateisystem. Die Dateien im Theme sind nur der
Ausgangsstand. Eine Änderung in Git an einer Datei, die im Backend schon
bearbeitet wurde, wirkt deshalb nicht, solange der Eintrag in der Datenbank
besteht. Die Texte der statischen Seiten (themes/musikwerk/content/) stehen
gar nicht in Git; musikwerk:seed legt sie in der Datenbank an.
Inhaltsmodell
- Chorgruppe: Steckbrief-Felder, Farbe, Galerie, Leitung (n:m Person),
ist_aktiv(Projektchor inaktiv). - Person: Künstlerische Leitung, Abschnitt mit Anker statt eigener Seite.
- Event mit Terminen (eigene Tabelle): Reihen, abgesagte Einzeltermine. Sortiert und angezeigt wird der nächste stattfindende Termin; vergangene Events verschwinden aus der Übersicht.
- Projekt (Rückblick): Datum → Jahrgang, Galerie getrennt vom Titelbild, Videos (Repeater), Chorgruppen.
- Dokument: PDFs, sortierbar.
- Einstellungen: Beschreibung, Social-Media-Links.
Bildunterschrift = Titel der Bilddatei, Fotonachweis = Beschreibung. Bilder werden beim Hochladen auf 2000 px verkleinert und als WebP in mehreren Breiten ausgeliefert.
Navigation
Menüs unter Seiten → Menüs. Hauptpunkte haben eine Farbe (Feld „Farbe“). Die Komponente
menue markiert immer nur einen Hauptpunkt als aktiv (Fördermöglichkeiten steht zweimal).
Frontend
CSS, JS, Schriften und Logo aus dem Kirby-Prototyp. Keine fremden Server; YouTube erst nach Klick.
Bekannte Einschränkungen
- Winter 1.2 läuft auf Laravel 9 (ohne Sicherheitsupdates).
composer auditmeldet bekannte Lücken inlaravel/frameworkundenshrined/svg-sanitize; das Blockieren ist incomposer.jsonabgeschaltet (audit.block-insecure). Für den Betrieb vor Entscheidung prüfen. composer auditund Abhängigkeiten:composer.lockist eingecheckt, damit alle dieselben Versionen installieren.- PostgreSQL: Anhänge (
system_files.attachment_idist varchar) lassen sich nicht perwith()vorladen; sie werden einzeln nachgeladen.