Mit dieser kleinen Web-Anwendung gehen Reparaturaufträge nicht mehr verloren. Die Kundschaft scannt einen nummerierten QR-Aufkleber und trägt einmalig ihre Daten und den Reparaturwunsch ein. Danach ist der Auftrag nur noch für die Werkstatt sichtbar (passwortgeschützt).
- PHP 8.2+, MariaDB/MySQL, reines HTML/CSS/JS: keine Frameworks, kein Build-Schritt, kein Composer auf dem Server
- Für das Smartphone gebaut (ab 320 px Breite), mit automatischem Dunkelmodus
- Läuft auf IONOS Linux-Webhosting unter
https://www.pichi.de/auftrag/ - Nicht in Suchmaschinen auffindbar (
noindex), keine externen Ressourcen, keine Cookies für Kunden
auftrag/ ← dieser Ordner kommt auf den Webspace
├── .htaccess Routing, HTTPS-Weiterleitung, Schutz interner Dateien
├── index.php zentraler Einstiegspunkt
├── install.php einmalige Installation (sperrt sich danach selbst)
├── assets/ CSS, JavaScript (inkl. QR-Bibliothek), Bilder
├── cron/bereinigung.php optionaler Cronjob für die automatische Löschung
└── app/ interner Code (per .htaccess gesperrt)
├── config.example.php Vorlage für die Konfiguration
├── schema.sql Tabellen + Standard-Einstellungen
├── bootstrap.php, lib/, seiten/, vorlagen/
├── vendor/PHPMailer/ mitgelieferter Mailversand (SMTP)
└── daten/ Logdatei, Sitzungen, Installationssperre
TESTCHECKLISTE.md manuelle Tests zu den Akzeptanzkriterien
- PHP-Version: Hosting → PHP-Version auf 8.2 oder neuer stellen.
- Datenbank anlegen: Hosting → Datenbanken → Datenbank anlegen (MariaDB). Host, Datenbankname, Benutzername und Passwort notieren.
- Postfach anlegen, z. B.
werkstatt@pichi.de(E-Mail → Postfach anlegen). Adresse und Passwort notieren. - SSL muss für
www.pichi.deaktiv sein (bei IONOS normalerweise der Fall). - Auftragsverarbeitungsvertrag (AVV) unter Mein Konto → Datenschutz abschließen (ein Klick).
- Per SFTP (z. B. mit FileZilla; Zugangsdaten unter Hosting → SFTP & SSH) im Hauptverzeichnis der Website, dort wo die
index.htmvon pichi.de liegt, einen Ordnerauftraganlegen. - Den Inhalt des Ordners
auftrag/aus diesem Repository dort hineinladen. Wichtig: auch die unsichtbaren Dateien.htaccessmitnehmen (in FileZilla: Server → Versteckte Dateien anzeigen).
Die bestehende Website wird dabei nicht verändert. Die Anwendung hat ihre eigene .htaccess nur im Unterordner.
- Direkt nach dem Hochladen
https://www.pichi.de/auftrag/install.phpaufrufen. - Die Systemprüfung muss überall ✓ zeigen.
- Datenbank-Zugangsdaten, Postfach (SMTP) und das Werkstatt-Passwort eintragen und auf Installieren tippen.
- Das Skript legt die Tabellen an, schreibt
app/config.php, setzt das Passwort und schickt eine Test-Mail. Danach ist es gesperrt. install.phplöschen (empfohlen, auch wenn sie gesperrt ist).
Falls
config.phpnicht geschrieben werden kann, zeigt die Installation den Inhalt an. Dann die Datei von Hand alsauftrag/app/config.phphochladen. Alternativapp/config.example.phpnachapp/config.phpkopieren, von Hand ausfüllen und danachinstall.phpaufrufen (dann wird nur noch das Passwort abgefragt).
In der robots.txt im Hauptverzeichnis von pichi.de (falls keine existiert, neu anlegen) ergänzen:
User-agent: *
Disallow: /auftrag/
Die Datei wird bewusst nicht automatisch verändert, damit die bestehende Website unberührt bleibt. Zusätzlich senden alle Seiten noindex per Meta-Tag und HTTP-Header.
Unter https://www.pichi.de/auftrag/login anmelden, dann unter Einstellungen:
- Öffnungszeiten eintragen (sie erscheinen in den Mails)
- Nummernbereich prüfen (Standard 1000–1999)
- Aufkleber-Layout: Maße des gekauften Etikettenbogens eintragen (stehen auf der Packung). Unter Aufkleber mit „Rahmen mitdrucken“ einen Testdruck auf Normalpapier machen und gegen das Licht auf den Etikettenbogen legen.
- Mailvorlagen anpassen und per „Test-Mail“ prüfen
- Betreiberdaten und Datenschutzhinweis kontrollieren
Erledigte Aufträge werden nach der eingestellten Anzahl Jahre gelöscht. Das passiert automatisch einmal täglich, sobald sich die Werkstatt einloggt. Wenn das IONOS-Paket Cronjobs anbietet, kann zusätzlich täglich laufen:
php /homepages/XX/dXXXXXXXXX/htdocs/auftrag/cron/bereinigung.php
(Pfad siehe Hosting → SFTP & SSH. Das Skript ist über den Browser nicht erreichbar.)
| Wer | Was |
|---|---|
| Kunde | scannt Aufkleber → Formular → „Auftrag absenden“ → klebt Aufkleber 1 aufs Instrument, behält Aufkleber 2 als Abholschein |
| Werkstatt | bekommt eine Mail mit Direktlink. Instrument scannen öffnet den Auftrag. |
| Werkstatt | Fertig: Mail-Vorschau → „Mail senden & als fertig markieren“ |
| Werkstatt | bei Abholung Erledigt tippen (rückgängig machbar) |
| Werkstatt | Übersicht: offene Aufträge, Suche, Warnungen bei langer Liegezeit |
Tipp: Die Übersicht auf dem Handy über Teilen → Zum Home-Bildschirm als App-Symbol ablegen.
| Adresse | Funktion |
|---|---|
/auftrag/{nummer} |
QR-Einstieg: freie Nummer = Formular, vergebene Nummer = Auftrag (Login) |
/auftrag/uebersicht (auch /auftrag/übersicht) |
Übersicht |
/auftrag/einstellungen |
Einstellungen |
/auftrag/aufkleber |
Druckbogen |
/auftrag/login, /auftrag/logout |
An-/Abmelden |
/auftrag/rechtliches |
Impressum & Datenschutzhinweis |
- Passwort nur als Argon2id-/bcrypt-Hash. „Angemeldet bleiben“ gilt 30 Tage mit signiertem Token. „Alle Geräte abmelden“ und eine Passwortänderung machen alle anderen Anmeldungen ungültig.
- 5 Fehlversuche pro IP → 15 Minuten Sperre (gespeichert wird nur ein gesalzener Hash der IP).
- Öffentliches Formular: Nummernbereich, Honeypot, Mindest-Ausfüllzeit 3 s, max. 5 Aufträge pro IP und Stunde, signiertes Formular-Token (ohne Cookie).
- CSRF-Token in allen Werkstatt-Formularen, Prepared Statements, konsequentes HTML-Escaping.
- Security-Header (CSP ohne Inline-Skripte,
X-Frame-Options,Referrer-Policy: no-referrer…). app/undcron/sind per.htaccessgesperrt. Die Logdatei heißt zusätzlichfehler-log.phpund kann selbst ohne.htaccessnicht gelesen werden.
Abweichung von der Spezifikation: Der Passwort-Hash liegt in der Datenbank (Tabelle einstellungen) statt in config.php. Nur so kann das Passwort über die Einstellungsseite geändert werden, ohne dass PHP Dateien umschreiben muss.
| Problem | Lösung |
|---|---|
/auftrag/1234 → „Not Found“ von IONOS |
.htaccess fehlt (versteckte Datei!) oder die Anwendung liegt nicht unter /auftrag/. Dann RewriteBase in .htaccess anpassen. |
| Weiße Seite / „Da ist etwas schiefgelaufen“ | Logdatei app/daten/log/fehler-log.php per SFTP herunterladen und ansehen. Zur Not in config.php kurz 'debug' => true setzen. |
| Mails kommen nicht an | Einstellungen → Test-Mail. SMTP-Daten in app/config.php prüfen (IONOS: smtp.ionos.de, Port 587, tls). Spam-Ordner prüfen. |
| Passwort vergessen | In phpMyAdmin (IONOS → Datenbanken) in Tabelle einstellungen den Eintrag passwort_hash leeren, die Datei app/daten/install.lock löschen, install.php erneut hochladen und aufrufen. Dann wird nur das Passwort neu gesetzt, Daten bleiben erhalten. |
| Update einspielen | Alle Dateien außer app/config.php und app/daten/ überschreiben. install.php nicht mit hochladen. |
- Den Datenschutztext am besten einmal mit einem Generator (z. B. eRecht24) gegenprüfen.
- Aufbewahrung: Auftragsdaten sind keine Buchhaltungsunterlagen. Kurze Fristen (1–2 Jahre) sind üblich, solange Rechnungen separat geschrieben werden.
- Das Haupt-Impressum von pichi.de nennt keine E-Mail-Adresse (§ 5 DDG). Mit dem neuen Werkstatt-Postfach lässt sich das nebenbei beheben.
- Die Webagentur (zagam webpublishing) informieren, dass der Ordner
/auftrag/bei Website-Änderungen nicht überschrieben werden darf.
- PHPMailer 6.12.0 (LGPL-2.1), in
app/vendor/PHPMailer/ - qrcode-generator 2.0.4 von Kazuhiko Arase (MIT), in
assets/js/qrcode.js