commit 9da19bc533b3f1104c455f74bf8516b81e06f9f0 Author: matthias.lotz Date: Sun Apr 12 13:24:45 2026 +0200 Initial Testversion diff --git a/README.md b/README.md new file mode 100644 index 0000000..3854322 --- /dev/null +++ b/README.md @@ -0,0 +1,200 @@ +# pretix-Testinstanz unter WSL mit Docker + +Dieses Verzeichnis enthaelt ein lokales Test-Setup fuer pretix unter WSL Ubuntu 22.04 mit Docker Desktop. + +## Voraussetzungen + +- Windows 11 mit installiertem Docker Desktop +- In Docker Desktop: WSL Integration fuer deine Ubuntu-Distribution aktivieren +- Die Dateien sollten im Linux-Dateisystem liegen, also z. B. unter `/home//...` und nicht unter `/mnt/c/...` + +## Start + +1. Datenverzeichnis anlegen und fuer den pretix-Container beschreibbar machen: + + ```bash + mkdir -p data + sudo chown -R 15371:15371 data + ``` + +2. Container starten: + + ```bash + docker compose up -d + ``` + +3. Logs pruefen, bis pretix sauber hochgefahren ist: + + ```bash + docker compose logs -f pretix + ``` + + Optional kannst du auch den periodischen Cronlauf pruefen: + + ```bash + docker compose logs -f pretix-cron + ``` + +4. Im Browser oeffnen: + + - pretix: http://localhost:8345/control/ + - Test-Mailbox: http://localhost:8025 + +## Standardzugang + +Laut offizieller pretix-Dokumentation ist nach dem ersten Start ein Admin-Zugang unter `admin@localhost` mit dem Passwort `admin` verfuegbar. Das Passwort solltest du direkt nach dem Login aendern. + +## Erste Schritte in pretix + +Ja: Nach dem ersten Login ist ein Organizer der erste sinnvolle Schritt. Der Organizer ist in pretix die organisatorische Einheit, unter der spaeter Events, Produkte, Rechnungen und Einstellungen verwaltet werden. + +### Empfohlene Reihenfolge fuer die erste Einrichtung + +1. Passwort des Admin-Benutzers aendern. +2. Einen Organizer anlegen. +3. Ein Test-Event anlegen. +4. Mindestens ein Ticketprodukt anlegen. +5. Den Shop im Frontend pruefen. +6. Eine Testbestellung ausloesen. +7. E-Mail-Eingang in Mailpit kontrollieren. + +### 1. Organizer anlegen + +- Im Backend auf `Organizer erstellen` klicken. +- Einen Namen vergeben, z. B. `Test Organizer`. +- Eine kurze Kennung oder einen Slug vergeben, falls pretix danach fragt. +- Adresse, E-Mail und weitere Stammdaten kannst du fuer den Test zunaechst minimal ausfuellen und spaeter nachziehen. + +### 2. Event anlegen + +- Innerhalb des Organizers ein neues Event erstellen. +- Als Titel z. B. `Testevent 2026` waehlen. +- Eine Zeitzone setzen, sinnvollerweise `Europe/Berlin`. +- Ein Datum in der Zukunft waehlen, damit das Event nicht direkt als abgelaufen wirkt. +- Die Standardwaehrung sollte in diesem Setup bereits auf `EUR` stehen. + +### 3. Ticketprodukt anlegen + +- Im Event zu den Produkten wechseln. +- Ein neues Produkt vom Typ Ticket anlegen. +- Beispielwerte fuer den Test: + - Name: `Standardticket` + - Preis: `10,00 EUR` + - Verfuegbarkeit: z. B. `100` +- Das Produkt speichern und sicherstellen, dass es sichtbar und verkaeuflich ist. + +### 4. Shop testen + +- Im Event die Vorschau oder den Shop-Link oeffnen. +- Pruefen, ob das Ticket im Frontend erscheint. +- Ein Ticket in den Warenkorb legen und eine Testbestellung abschicken. + +### 5. E-Mails pruefen + +- Die Testinstanz liefert E-Mails an Mailpit aus, nicht an ein echtes Postfach. +- Mailpit erreichst du unter `http://localhost:8025`. +- Dort solltest du Bestell- oder System-E-Mails fuer den Test sehen. + +### Sinnvoller Minimaltest + +Wenn du pretix nur einmal durchklicken willst, reicht dieser Ablauf: + +1. Organizer erstellen. +2. Event erstellen. +3. Ein Ticketprodukt anlegen. +4. Shop-Link oeffnen. +5. Testbestellung absenden. +6. E-Mail in Mailpit kontrollieren. + +--- + +## Praxisbeispiel: Kostenlose Veranstaltungsreihe Mo-Do mit Anmeldepflicht + +### Warum "Quota braucht ein Datum" – und was das bedeutet + +pretix unterscheidet zwischen: + +- **Einzelevent**: Ein festes Datum, eine einzige Quota. Keine Datumsauswahl in der Quota noetig. +- **Veranstaltungsreihe** (Sub-Events): Mehrere Termine unter einem Event. Jede Quota kann sich auf bestimmte Termine beziehen. + +Wenn du bei der Quota ein Datum auswaehlen willst (oder musst), aber keines angezeigt wird, bedeutet das: das Event ist noch kein Serienevent. Sub-Events muessen erst aktiviert werden. + +### Schritt 1: Sub-Events am Event aktivieren + +1. Ins Event wechseln → **Einstellungen** → **Allgemein** (oder **Konfiguration**). +2. Die Option **"Dieses Event hat mehrere Termine / Sub-Events"** (englisch: *"This event has multiple dates"*) aktivieren. +3. Speichern. + +Danach erscheint im linken Menue ein neuer Punkt: **Termine** (oder **Sub-Events**). + +### Schritt 2: Die einzelnen Termine anlegen + +Jeden Wochentermin einmal anlegen. Beispiel fuer eine Woche: + +| Name | Datum | Beginn | Ende | +|------------------|-------------|--------|-------| +| Montag-Session | 13.04.2026 | 17:30 | 18:00 | +| Dienstag-Session | 14.04.2026 | 17:30 | 18:00 | +| Mittwoch-Session | 15.04.2026 | 17:30 | 18:00 | +| Donnerstag-Session | 16.04.2026 | 17:30 | 18:00 | + +Fuer laufende Serien empfiehlt es sich, alle Termine einer Woche auf einmal anzulegen oder eine Woche spater zu ergaenzen. + +> **Tipp**: Es gibt keine automatische Wiederholung in pretix. Jeder Termin muss einzeln angelegt werden – entweder manuell oder per API. + +### Schritt 3: Kostenfreies Produkt anlegen (falls nicht schon passiert) + +- Name z. B. `Anmeldung` +- Preis: `0,00 EUR` +- Das Produkt muss trotz Nullpreis angelegt sein, damit pretix die Buchung als "Bestellung" behandelt. + +### Schritt 4: Quota anlegen + +- Zu **Quotas** wechseln → neue Quota anlegen. +- Kontingent z. B. `20` (Maximale Teilnehmerzahl pro Termin). +- Unter **"Gilt fuer Termine"** jetzt die gewuenschten Sub-Events auswaehlen. +- Jeder Termin bekommt idealerweise eine eigene Quota, damit die Kapazitaet pro Tag separat gilt. + +### Schritt 5: Shop pruefen + +- Den Shop-Link des Events oeffnen. +- Eine der Termine auswaehlen und kostenlos anmelden. +- Bestaetigung in Mailpit pruefen (`http://localhost:8025`). + +### Zusammenfassung des Datenmodells fuer diesen Fall + +``` +Organizer + └── Event "Wochentreffen" (Sub-Events aktiviert) + ├── Sub-Event "Montag 13.04." + ├── Sub-Event "Dienstag 14.04." + ├── Sub-Event "Mittwoch 15.04." + ├── Sub-Event "Donnerstag 16.04." + ├── Produkt "Anmeldung" (0,00 EUR) + └── Quotas (je Termin, z. B. 20 Plaetze) +``` + +## Cron-Hinweis + +pretix erwartet, dass regelmaessig `pretix cron` ausgefuehrt wird. In diesem Test-Setup uebernimmt das der Dienst `pretix-cron` automatisch alle 5 Minuten. Direkt nach dem ersten Start kann die Warnung im Dashboard noch kurz sichtbar sein, bis der erste Lauf erfolgt ist. + +## Stoppen und Aufraeumen + +- Stoppen: + + ```bash + docker compose down + ``` + +- Stoppen und auch Datenbank/Redis-Daten entfernen: + + ```bash + docker compose down -v + ``` + +- Das Verzeichnis `data/` bleibt dabei erhalten. Wenn du wirklich ganz von vorn beginnen willst, kannst du es zusaetzlich loeschen. + +## Wichtige Hinweise + +- Diese Konfiguration ist nur fuer lokale Tests gedacht. +- Fuer produktiven Betrieb solltest du der offiziellen pretix-Doku folgen und HTTPS, Reverse Proxy, Backup und Härtung sauber einrichten. \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a3f22f2 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,113 @@ +services: + db: + image: postgres:16-alpine + restart: unless-stopped + environment: + POSTGRES_DB: pretix + POSTGRES_USER: pretix + POSTGRES_PASSWORD: ${PRETIX_DB_PASSWORD:-pretix_test_password} + volumes: + - postgres-data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U pretix -d pretix"] + interval: 10s + timeout: 5s + retries: 10 + + redis: + image: redis:7-alpine + restart: unless-stopped + command: redis-server --save 60 1 --loglevel warning + volumes: + - redis-data:/data + + mailpit: + image: axllent/mailpit:latest + restart: unless-stopped + ports: + - "127.0.0.1:8025:8025" + + pretix: + image: pretix/standalone:stable + restart: unless-stopped + depends_on: + db: + condition: service_healthy + redis: + condition: service_started + mailpit: + condition: service_started + ports: + - "127.0.0.1:8345:80" + environment: + PRETIX_PRETIX_INSTANCE_NAME: "pretix Testinstanz" + PRETIX_PRETIX_URL: "http://localhost:8345" + PRETIX_PRETIX_CURRENCY: "EUR" + PRETIX_PRETIX_DATADIR: "/data" + PRETIX_LOCALE_DEFAULT: "de" + PRETIX_LOCALE_TIMEZONE: "Europe/Berlin" + PRETIX_DATABASE_BACKEND: "postgresql" + PRETIX_DATABASE_NAME: "pretix" + PRETIX_DATABASE_USER: "pretix" + PRETIX_DATABASE_PASSWORD: "${PRETIX_DB_PASSWORD:-pretix_test_password}" + PRETIX_DATABASE_HOST: "db" + PRETIX_DATABASE_PORT: "5432" + PRETIX_MAIL_FROM: "pretix-test@localhost" + PRETIX_MAIL_HOST: "mailpit" + PRETIX_MAIL_PORT: "1025" + PRETIX_MAIL_TLS: "off" + PRETIX_MAIL_SSL: "off" + PRETIX_REDIS_LOCATION: "redis://redis:6379/0" + PRETIX_REDIS_SESSIONS: "true" + PRETIX_CELERY_BACKEND: "redis://redis:6379/1" + PRETIX_CELERY_BROKER: "redis://redis:6379/2" + volumes: + - pretix-data:/data + command: all + + pretix-cron: + image: pretix/standalone:stable + restart: unless-stopped + depends_on: + db: + condition: service_healthy + redis: + condition: service_started + mailpit: + condition: service_started + pretix: + condition: service_started + environment: + PRETIX_PRETIX_INSTANCE_NAME: "pretix Testinstanz" + PRETIX_PRETIX_URL: "http://localhost:8345" + PRETIX_PRETIX_CURRENCY: "EUR" + PRETIX_PRETIX_DATADIR: "/data" + PRETIX_LOCALE_DEFAULT: "de" + PRETIX_LOCALE_TIMEZONE: "Europe/Berlin" + PRETIX_DATABASE_BACKEND: "postgresql" + PRETIX_DATABASE_NAME: "pretix" + PRETIX_DATABASE_USER: "pretix" + PRETIX_DATABASE_PASSWORD: "${PRETIX_DB_PASSWORD:-pretix_test_password}" + PRETIX_DATABASE_HOST: "db" + PRETIX_DATABASE_PORT: "5432" + PRETIX_MAIL_FROM: "pretix-test@localhost" + PRETIX_MAIL_HOST: "mailpit" + PRETIX_MAIL_PORT: "1025" + PRETIX_MAIL_TLS: "off" + PRETIX_MAIL_SSL: "off" + PRETIX_REDIS_LOCATION: "redis://redis:6379/0" + PRETIX_REDIS_SESSIONS: "true" + PRETIX_CELERY_BACKEND: "redis://redis:6379/1" + PRETIX_CELERY_BROKER: "redis://redis:6379/2" + volumes: + - pretix-data:/data + entrypoint: + - /bin/sh + - -c + command: + - 'while true; do pretix cron; sleep 300; done' + +volumes: + postgres-data: + redis-data: + pretix-data: \ No newline at end of file