1. Systemanforderungen
| Komponente | Mindestversion |
|---|---|
| PHP | 7.4+ (getestet mit 8.0, 8.1, 8.2, 8.3, 8.4) |
| Webserver | Apache mit mod_rewrite oder Nginx |
| Schreibrechte | data/, uploads/ |
PHP-Erweiterungen
- json (Standard aktiviert)
- session (Standard aktiviert)
- mbstring (fuer Unicode-Support)
- openssl (fuer HTTPS/SMTP)
2. Installation
Schritt 1: Dateien hochladen
- ZIP-Datei buchhaltungssystem.zip herunterladen
- Entpacken
- Den Ordner accounting-system komplett auf den Webserver hochladen
Zielverzeichnis (Beispiel fuer intrasaar.de):
/var/www/vhosts/intrasaar.de/httpdocs/accounting-system/
Schritt 2: Verzeichnisrechte setzen
chmod -R 755 accounting-system/data/ accounting-system/uploads/
Falls der Webserver-Putzer dies nicht kann:
chmod -R 777 accounting-system/data/ accounting-system/uploads/
Schritt 3: .htaccess pruefen
Die .htaccess-Datei muss im Hauptverzeichnis liegen.
Fuer Nginx-Server - diesen Block in die nginx.conf einfuegen:
location /accounting-system/ {
try_files $uri $uri/ /accounting-system/index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
3. Ersteinrichtung
Schritt 1: Setup aufrufen
Im Browser oeffnen:
https://ihredomain.de/accounting-system/setup.php
Das System leitet automatisch auf setup.php weiter, wenn die Daten-Dateien noch nicht existieren.
Schritt 2: Installation starten
- Admin-Passwort eingeben (Standard: admin123)
- Auf "Installation starten" klicken
- Das System erstellt ALLE noetigen Dateien: Benutzer, Beispiel-Kunden, Beispiel-Artikel, Einstellungen, Zaehler
- Auf "Zum Admin-Login" klicken
Schritt 3: Setup sperren
rm setup.php
# Oder (empfohlen):
mv setup.php setup.php.old
4. Lizenzierung
Das System ist domaingebunden. Bei Kopie auf einen anderen Server blockiert es sich automatisch.
Lizenzschluessel generieren (nur fuer Entwickler)
generate_license.php ist nicht im Verteilungs-ZIP enthalten. Nur lokal ausfuehren:
require 'core/License.php';
$key = License::generateKey('kundendomain.de', 'unlimited', 0);
echo $key;
Lizenzschluessel beim Kunden aktivieren
- Admin-Login -> Einstellungen -> Lizenz
- Schluessel eingeben -> "Lizenz aktivieren"
- Status zeigt "Aktiviert" mit Domain und Gueltigkeit
Was passiert bei Kopie?
Jeder Seitenaufruf (ausser Login und Setup) prueft, ob die aktuelle Domain mit der Domain im Lizenzschluessel uebereinstimmt. Bei Abweichung erfolgt eine Weiterleitung auf die Einstellungen mit Fehlermeldung.
Lizenzschluessel-Uebersicht
| Domain | Schluessel | Typ |
|---|---|---|
| intrasaar.de | BMS-eyJkIjoiaW50cmFzYWFyLmRlIiwidCI6InN0YW5kYXJkIiwiZSI6InVubGltaXRlZCJ9-d7aa3fc2 | standard/unlimited |
| www.intrasaar.de | BMS-eyJkIjoid3d3LmludHJhc2Fhci5kZSIsInQiOiJzdGFuZGFyZCIsImUiOiJ1bmxpbWl0ZWQifQ-34323c74 | standard/unlimited |
5. Login-Daten
Administrator
| Feld | Wert |
|---|---|
| URL | https://ihredomain.de/accounting-system/login |
| Benutzername | admin |
| Passwort | admin123 |
Buchhalter
| Feld | Wert |
|---|---|
| URL | https://ihredomain.de/accounting-system/login |
| Benutzername | buchhalter |
| Passwort | admin123 |
Kundenportal (Beispiel)
| Feld | Wert |
|---|---|
| URL | https://ihredomain.de/accounting-system/portal/login |
| weber@techsolutions.de | |
| Passwort | admin123 |
6. Funktionen
Dashboard
- Umsatzuebersicht (monatlich/jaehrlich)
- Offene Posten und ueberfaellige Rechnungen
- Letzte Rechnungen
Rechnungen
- Rechnungen erstellen, bearbeiten, loeschen
- Dokumenttypen: Rechnung (RE-), Gutschrift (GS-), Lieferschein (LS-)
- Reverse Charge (Paragraph 13b UStG) - kein MwSt-Ausweis
- PDF-Druckansicht mit firmenlogo
- Lieferschein-Druck (ohne Preise)
- Gutschriften erstellen (automatisch negierte Betraege)
- Versand per E-Mail (SMTP)
- Statusverwaltung (Entwurf - Offen - Bezahlt)
- Fortlaufende Nummerierung pro Dokumenttyp (konfigurierbar)
Kunden
- Kundenstammdaten verwalten
- Portal-Zugang pro Kunde aktivieren
- Umsatz pro Kunde
Artikel und Dienstleistungen
- Artikel mit Preisen und Steuersaetzen
- Nummerierung und Kategorisierung
- SKR03-Kontenrahmen-Zuordnung pro Artikel
Berichte
- Monatliche/jaehrliche Umsatzuebersicht
- Offene Posten-Liste
- Bilanzuebersicht
- DATEV-Export
Einstellungen
- Firmendaten, Rechnungsnummern-Praefix
- Standard-Zahlungsbedingungen
- SMTP-Einstellungen fuer E-Mail-Versand
- Firmenlogo, Lizenzverwaltung
Benutzerverwaltung
- Rollen: Admin, Buchhalter, Rechnungsstellung, Betrachter
- Individuelle Berechtigungen pro Benutzer
- Benutzer anlegen/deaktivieren/loeschen
Kundenportal
- Kunden koennen eigene Rechnungen einsehen
- Konto-Daten aktualisieren
- PDF-Download
7. Verzeichnisstruktur
accounting-system/
.htaccess # Apache-Rewriting & Sicherheit
index.php # Haupt-Einstiegspunkt (Router)
setup.php # Ersteinrichtung (danach loeschen!)
config/
config.php # Systemkonfiguration, Konstanten
core/
Auth.php # Authentifizierung & Sitzung
Database.php # JSON-Datei-Database-Engine
License.php # Lizenzverwaltung
Router.php # URL-Routing
Security.php # XSS-Schutz, CSRF, Validierung
Session.php # Session-Management
models/
Model.php # Basisklasse (CRUD)
User.php # Benutzer-Model
Customer.php # Kunden-Model
Invoice.php # Rechnungs-Model
Item.php # Artikel-Model
Setting.php # Einstellungen-Model
controllers/
AuthController.php # Login/Logout
DashboardController.php # Dashboard
CustomerController.php # Kunden-CRUD
InvoiceController.php # Rechnungen-CRUD
ItemController.php # Artikel-CRUD
ReportController.php # Berichte & Export
SettingController.php # Einstellungen & Lizenz
UserController.php # Benutzer-CRUD
PortalController.php # Kundenportal
views/
layouts/
header.php # HTML-Head, Navigation
footer.php # HTML-Footer
auth/login.php # Admin-Login
dashboard/index.php # Dashboard-Ansicht
customers/ # Kunden-Ansichten
invoices/ # Rechnungs-Ansichten
items/ # Artikel-Ansichten
reports/ # Berichts-Ansichten
settings/ # Einstellungs-Ansicht
users/ # Benutzer-Ansichten
portal/ # Kundenportal-Ansichten
assets/
css/style.css # Stylesheet
js/app.js # JavaScript
lib/
EmailService.php # E-Mail-Versand (SMTP)
DatevExport.php # DATEV-Export
data/ # JSON-Datenbank (beschreibbar!)
skr03.json # SKR03 Kontenrahmen
uploads/ # Uploads (beschreibbar!)
8. Konfiguration
Basispfad aendern
Falls das System in ein Unterverzeichnis verschoben wird, passt sich der Router automatisch an.
SMTP fuer E-Mail-Versand
In Einstellungen -> SMTP konfigurieren:
| Feld | Beschreibung | Beispiel |
|---|---|---|
| SMTP-Host | Mailserver | smtp.gmail.com |
| Port | SMTP-Port | 587 (TLS) oder 465 (SSL) |
| Benutzername | E-Mail-Adresse | user@gmail.com |
| Passwort | E-Mail-Passwort | (App-Passwort bei Gmail) |
| Versandadresse | Absender-E-Mail | rechnung@firma.de |
| Absendername | Name des Absenders | Firma GmbH |
| Verschluesselung | TLS oder SSL | tls |
Produktiv-Einstellungen in config.php
Fuer den Produktivbetrieb in config/config.php pruefen:
ini_set('display_errors', '0');
ini_set('log_errors', '1');
9. Sicherheit
Was ist abgedeckt
| Schutz | Umsetzung |
|---|---|
| XSS-Schutz | htmlspecialchars() ueber Security::sanitize() |
| CSRF-Schutz | Token-basiert in allen Formularen |
| Passwoerter | password_hash() mit bcrypt (cost 12) |
| Session-Sicherheit | HttpOnly, Secure (bei HTTPS), SameSite=Lax, Timeout 30 Min |
| Versteckte Dateien | .htaccess blockiert .json, .log, .ini |
| Lizenzbindung | HMAC-signierte Schluessel, domaingebunden |
Nach der Installation
- setup.php loeschen (kritisch!)
- Standard-Passwoerter aendern (admin123)
- data/-Verzeichnis auf 755 setzen (nicht 777)
- SSL-Zertifikat installieren (HTTPS erzwingen)
10. Backup
Vollstaendiges Backup
# Gesamtes Verzeichnis sichern
tar czf backup-buchhaltung-$(date +%Y%m%d).tar.gz accounting-system/
# Nur Daten sichern
tar czf backup-daten-$(date +%Y%m%d).tar.gz \
accounting-system/data/ \
accounting-system/uploads/
Automatisches Backup (Cron)
# Taegliches Backup um 2:00 Uhr
0 2 * * * tar czf /backups/buchhaltung-$(date +\%Y\%m\%d).tar.gz /var/www/html/accounting-system/data/
11. Deployment auf neuem Server
Das System ist vollstaendig portabel. Alle Pfade sind relativ.
Checkliste
| Pruefpunkt | Befehl/Info |
|---|---|
| PHP >= 7.4? | php -v |
| mod_rewrite aktiv? | apache2ctl -M | grep rewrite |
| data/ beschreibbar? | chmod 755 data/ |
| uploads/ beschreibbar? | chmod 755 uploads/ |
| setup.php geloescht? | ls setup.php - darf nicht existieren |
Schritt-fuer-Schritt
- Dateien kopieren
- Rechte setzen:
chmod -R 755 accounting-system/data/ accounting-system/uploads/ - setup.php aufrufen und Installation durchfuehren
- Lizenz aktivieren (neuer Schluessel fuer neue Domain noetig!)
- setup.php loeschen
Lizenz bei Serverwechsel
Der bestehende Lizenzschluessel gilt nur fuer die Original-Domain. Fuer den neuen Server:
- generate_license.php mit neuer Domain ausfuehren (lokal)
- Neuen Schluessel beim Kunden unter Einstellungen -> Lizenz eingeben
12. Fehlerbehebung
ERR_TOO_MANY_REDIRECTS
Ursache 1: Session-Cookie wird nicht gespeichert (HTTPS) - SSL pruefen, Browser-Cookies loeschen.
Ursache 2: setup.php wurde noch nicht ausgefuehrt - setup.php aufrufen und Installation starten.
Ursache 3: .htaccess-Konflikt mit Server-Konfiguration - parent-.htaccess und RewriteBase pruefen:
RewriteEngine On
RewriteBase /accounting-system/
Ursache 4: www/non-www Redirect-Schleife - Domain konsistent aufrufen (mit oder ohne www).
HTTP 500
Ursache 1: PHP-Fehler - temporaer Fehleranzeige aktivieren:
error_reporting(E_ALL);
ini_set('display_errors', '1');
Ursache 2: Fehlende require_once-Zeilen in index.php.
Ursache 3: Verzeichnisrechte pruefen: chmod -R 755 data/ uploads/
Ursache 4: mod_rewrite nicht geladen: a2enmod rewrite && systemctl restart apache2
Login funktioniert nicht
- Passwort pruefen (Standard: admin123)
- Setup nochmal ausfuehren (setzt Passwoerter zurueck)
- Browser-Cookies loeschen, anderen Browser oder Incognito-Modus testen
- JSON-Datei pruefen:
cat data/users.json | python3 -m json.tool
Daten werden nicht gespeichert
Ursache 1: Keine Schreibrechte - ls -la data/ pruefen.
Ursache 2: JSON-Datei beschraenkt - cat data/invoices.json | python3 -m json.tool
Rechnungsnummern-Spruenge
Das System nutzt einen Zaehler in data/counter.json. Bei jedem Erstellen wird er erhoht.
Performance-Probleme bei vielen Daten
JSON-Dateien werden bei jedem Zugriff komplett geladen. Ab ca. 1000+ Rechnungen kann es langsam werden. Loesung: Auf ein SQL-basiertes System migrieren.
Fehler im Apache Error Log finden
tail -50 /var/log/apache2/error.log
Bei Plesk/cPanel: Logs - Fehlerprotokolle im Hosting-Dashboard.