Angebots-tool

Angebots-tool

Docker app from CrazyDevil's Repository

Overview

Angebots-Tool zum Erstellen und Verwalten von Angeboten. Läuft als Node.js-Server mit persistentem Datenspeicher.

AngebotsTool

Eine selbst gehostete Web-App zum Erstellen und Verwalten von Angeboten – optimiert für den Einsatz auf Unraid-Servern.

Features

  • Angebote erstellen – Positionen, Preise, Kundeninfos und PDF-Export
  • Kundenverwaltung – Kunden anlegen und verwalten
  • Dashboard – Übersicht über alle Angebote und Aktivitäten
  • Benutzerverwaltung – Mehrere Benutzer mit Rollen (Admin / Benutzer)
  • Einladungssystem – Neue Benutzer per E-Mail einladen
  • SMTP-Konfiguration – E-Mail-Versand direkt aus der App konfigurierbar
  • Authentifizierung – JWT-basierter Login mit Brute-Force-Schutz
  • Echtzeit-Sync – Änderungen werden live auf allen geöffneten Tabs aktualisiert

Installation auf Unraid

Docker Hub

Das Image ist verfügbar unter:

crazydevil35/angebotstool:latest

Über Community Applications

Nach der Installation des CA-Plugins einfach nach AngebotsTool suchen und installieren. Alle Pfade und Ports sind vorausgefüllt.

Manuelle Docker-Installation

docker run -d \
  --name AngebotsTool \
  -p 3000:3000 \
  -v /mnt/user/appdata/angebots-tool:/app/data \
  -e BASE_URL=http://deine-ip:3000 \
  --restart unless-stopped \
  crazydevil35/angebotstool:latest

Umgebungsvariablen

Variable Beschreibung Standard
PORT Interner Port des Servers 3000
JWT_SECRET Geheimer Schlüssel für JWT-Token. Wird automatisch generiert wenn leer. (automatisch)
BASE_URL Externe URL der App, z.B. https://angebote.meinserver.de (optional)
TZ Zeitzone für automatische Sicherungen und den Ablauf von Angeboten Europe/Berlin
TRUST_PROXY Nur hinter Reverse-Proxy/Cloudflare setzen: Anzahl der Proxys vor dem Container (z.B. 1) oder deren Adressen (z.B. 172.17.0.0/16). Ohne Angabe sieht die Login-Sperre bei Zugriff über einen Proxy alle Nutzer als eine IP. (aus)

Datenspeicherung

Alle Daten werden im Container-Pfad /app/data gespeichert:

  • users.json – Benutzerdaten
  • config.json – App-Konfiguration, SMTP-Einstellungen und JWT-Secret
  • firma.json, kunden.json, katalog.json – Stammdaten
  • angebote/ – ein JSON pro Angebot plus index.json
  • backups/ – automatische Sicherung (automatisch-JJJJ-MM-TT-HHMMSS.json; Häufigkeit, Uhrzeit und Anzahl unter Einstellungen → Firmendaten → Datensicherung, Standard: täglich 02:00, 14 behalten; verpasste Termine werden nach dem Start nachgeholt) und Sicherung des alten Stands vor jedem Backup-Import (vor-import-*.json, wird nie automatisch gelöscht). Die automatischen Sicherungen haben das Export-Format und lassen sich über Importieren wiederherstellen. users.json und config.json sind nicht enthalten – dafür den ganzen Appdata-Ordner sichern.

Über Einstellungen → Datensicherung (nur Admins) lassen sich alle Daten als JSON exportieren und wieder importieren. Ein Import ersetzt den kompletten Datenbestand.

Der Host-Pfad /mnt/user/appdata/angebots-tool (oder ein beliebiger anderer Pfad) muss als Volume eingebunden werden, damit die Daten bei Container-Updates erhalten bleiben.

Erster Start

Beim ersten Aufruf der App wird ein Erstkonfigurations-Assistent gestartet, in dem der erste Admin-Account angelegt wird.

Technik

  • Frontend: React 19, Vite, Tailwind CSS
  • Backend: Node.js, Express
  • Auth: JWT mit automatisch generiertem Secret
  • PDF: @react-pdf/renderer
  • Container: Docker (Node.js 22 Alpine)

Projektstruktur

shared/     Preisberechnung und Nummernvergabe – von Server und Frontend genutzt
server/     index.js (Start), routes/, middleware/, stores/ (Dateizugriff), lib/
src/        api/ (Server-Aufrufe), features/ (Angebots-Editor, Einstellungen, Auth),
            views/ (Listen, Dashboard), components/, pdf/, utils/, lib/

Tests: npm test · Lint: npm run lint

Lizenz

MIT – siehe LICENSE

Download Statistics

651
Total Downloads

Related apps

Explore more like this

Explore all

Details

Repository
crazydevil35/angebotstool:latest
Last Updated2026-06-12
First Seen2026-06-01

Runtime arguments

Web UI
http://[IP]:[PORT:3000]/
Network
bridge
Shell
sh
Privileged
false

Template configuration

WebUI PortPorttcp

Externer Port, über den das Angebots-Tool erreichbar ist.

Target
3000
Default
3000
Value
3000
DatenPathrw

Benutzer, Einstellungen (SMTP, Firmendaten), Angebote, Kunden und Backups. Ohne dieses Volume gehen alle Daten beim Update verloren.

Target
/app/data
Default
/mnt/user/appdata/angebots-tool
Value
/mnt/user/appdata/angebots-tool
TRUST_PROXYVariable

Anzahl vertrauenswürdiger Proxys vor der App (1 = Cloudflare) oder deren Adressen (z. B. 172.17.0.0/16). Nötig, damit die Login-Sperre die echte IP je Nutzer sieht. Leer lassen, wenn die App nur direkt ohne Proxy erreichbar ist.

Default
1
Value
1
BASE_URLVariable

Externe URL des Servers (z. B. https://angebote.meinserver.de). Wird für Einladungslinks verwendet.

JWT_SECRETVariable

Sicherer Zufallswert für die Anmelde-Tokens. Leer lassen: Er wird beim ersten Start erzeugt und im Datenverzeichnis gespeichert.

PORTVariable

Interner Port des Node.js-Servers. Nicht ändern, außer wenn nötig.

Default
3000
Value
3000