No description
  • PHP 72.4%
  • HTML 13.9%
  • CSS 10.3%
  • JavaScript 1.8%
  • Dockerfile 1.3%
  • Other 0.3%
Find a file
Owen Kieffer-Jones 97e9a0f955 feat: Deployment mit Coolify, PHP 8.5
- 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>
2026-10-22 17:48:31 +02:00
bootstrap feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
config feat: Deployment mit Coolify, PHP 8.5 2026-10-22 17:48:31 +02:00
docker feat: Deployment mit Coolify, PHP 8.5 2026-10-22 17:48:31 +02:00
plugins/musikwerk/website feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
scripts feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
storage feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
themes/musikwerk feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
.dockerignore feat: Deployment mit Coolify, PHP 8.5 2026-10-22 17:48:31 +02:00
.editorconfig feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
.env.example feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
.gitignore feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
.htaccess feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
artisan feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
compose.coolify.yaml feat: Deployment mit Coolify, PHP 8.5 2026-10-22 17:48:31 +02:00
compose.yaml feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
composer.json feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
composer.lock feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
Dockerfile feat: Deployment mit Coolify, PHP 8.5 2026-10-22 17:48:31 +02:00
favicon.ico feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
index.php feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
LICENSE feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
phpcs.xml feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
phpunit.xml feat: Winter-CMS-Prototyp der Website 2026-10-22 15:34:45 +02:00
README.md feat: Deployment mit Coolify, PHP 8.5 2026-10-22 17:48:31 +02:00

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: web und db (PostgreSQL 18). Volumes: storage (storage/app/: Uploads, Medienbibliothek) und database.
  • Coolify erzeugt APP_KEY, Datenbank-Zugang und das Passwort des Backend-Kontos admin (SERVICE_PASSWORD_WINTERADMIN, unter Environment Variables). Jeder Start führt winter:up aus 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 audit meldet bekannte Lücken in laravel/framework und enshrined/svg-sanitize; das Blockieren ist in composer.json abgeschaltet (audit.block-insecure). Für den Betrieb vor Entscheidung prüfen.
  • composer audit und Abhängigkeiten: composer.lock ist eingecheckt, damit alle dieselben Versionen installieren.
  • PostgreSQL: Anhänge (system_files.attachment_id ist varchar) lassen sich nicht per with() vorladen; sie werden einzeln nachgeladen.