Commit Graph
8 Commits
Author SHA1 Message Date
Kerim (portable/claudecode)andClaude Opus 5 70756f3762 Bon fuer die Kasse auf einem USB-Bondrucker ausgeben
Der Kunde soll mit einem Zettel zur Kasse gehen koennen, auf dem steht, was
er zahlen muss. Drei Wege fuehren jetzt zu einem Bon: der Knopf "Bon" auf der
Timer-Karte druckt den Zwischenstand und laesst den Timer weiterlaufen,
"Beenden" druckt den Endbeleg, und in der Historie laesst sich jeder Beleg
nachdrucken.

Der Drucker haengt per USB an einem Raspberry Pi und ist damit vom
Timer-Server aus nicht direkt erreichbar. Auf dem Pi laeuft deshalb eine
kleine Bruecke (deploy/bondrucker/, nur Python-Standardbibliothek), die
fertige ESC/POS-Daten per HTTP annimmt. Das Bon-Layout bleibt bewusst hier
im Repo, damit Aenderungen daran nicht auf dem Pi angefasst werden muessen.

Beim Beenden wird erst gespeichert und dann gedruckt. Eine leere Papierrolle
ist damit ein Papierproblem und kein Datenproblem - der Vorgang steht in der
Historie, die Oberflaeche sagt ausdruecklich, dass der Bon nicht gedruckt
wurde, und nennt den Grund.

Ohne PRINTER_HOST in der .env ist die Druckfunktion aus und die App verhaelt
sich unveraendert.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 20:37:12 +02:00
adminandClaude Opus 5 5e83999950 Abgleich ohne rsync ueber einen Commit-Merkzettel
Deploy auf den Timer-Server / deploy (push) Successful in 18s
Auf dem Zielhost gibt es kein rsync (und im Runner-Container laeuft es
wegen des Docker-Hosts ohnehin nicht). Der ausgerollte Commit steht jetzt
in /opt/timer-app/.deploy-commit; die Aenderungsliste kommt aus git diff
gegen diesen Stand.

Das ist genauer als ein Zeitstempelvergleich: geloeschte Dateien sind als
solche benannt und werden gezielt entfernt, und ob npm ci und ein Neustart
noetig sind, entscheidet dieselbe Liste. Ist kein Vorgaengerstand bekannt,
gilt alles als neu.

Der Pruefschritt bricht jetzt ab, wenn der Deploy-Benutzer im Zielpfad
nicht schreiben darf - das ist besser als ein halb ausgerollter Stand.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 18:10:07 +02:00
adminandClaude Opus 5 b85e4610e0 Uebertragung per tar, Abgleich auf dem Zielhost
Deploy auf den Timer-Server / deploy (push) Failing after 13s
rsync scheitert im Runner-Container am Docker-Host ('pipe: Permission
denied', auch im 22.04-Image). Das Paket geht jetzt per tar hinueber und
wird auf dem Server abgeglichen, wo rsync normal laeuft.

Dabei die Rechte geradegezogen: der Deploy-Benutzer besitzt den Code und
braucht dafuer kein sudo. Das frueher vorgesehene 'chown -R timerapp' nach
jedem Lauf haette ihm die Schreibrechte fuer den naechsten Lauf entzogen -
und die Einrichtungsanleitung haette dem Dienst das Datenverzeichnis
weggenommen. Jetzt: Code gehoert deploy, data/ gehoert timerapp.

Ein Diagnoseschritt meldet zu Beginn Benutzer, Werkzeuge, Rechte und
sudo-Regeln, damit solche Faelle im Protokoll sichtbar sind.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 18:08:09 +02:00
adminandClaude Opus 5 51c809dedc Auf das 22.04-Runner-Image wechseln
Deploy auf den Timer-Server / deploy (push) Failing after 1m20s
Im 24.04-Image schlagen auf diesem Runner Syscalls fehl, die neuere
Programme benutzen: actions/checkout starb mit 'read ENOTCONN', rsync
bricht mit 'pipe: Permission denied' ab. Beides deutet auf das seccomp-
Profil des Docker-Hosts, nicht auf den Workflow.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 18:04:23 +02:00
adminandClaude Opus 5 c2e9f4d2d2 Klon-Adresse aus dem Server-URL ableiten statt https annehmen
Deploy auf den Timer-Server / deploy (push) Failing after 11s
Gitea gibt in GITHUB_SERVER_URL seine interne Adresse an (http://192.168.1.5:3000).
Die alte Zeile setzte https davor und baute daraus 'https://http://...'.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 17:59:25 +02:00
adminandClaude Opus 5 307fec6b99 Checkout ohne actions/checkout
Deploy auf den Timer-Server / deploy (push) Failing after 12s
Der erste Lauf brach im Runner-Image von Gitea 1.27 ab: die JS-Aktion
actions/checkout stirbt beim Aufruf von "git version" mit "read ENOTCONN"
- ein Node-24-Fehler im Container, nicht unser Workflow.

Der Code wird jetzt per Shell geklont. Das braucht kein Node und ist damit
unabhaengig vom Image. Geholt wird flach nach Commit-SHA, ersatzweise nach
Branch, falls der Server das Anfordern einzelner SHAs nicht erlaubt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 17:58:29 +02:00
adminandClaude Opus 5 1cd966a208 Deploy per Gitea Actions auf 192.168.1.5
Deploy auf den Timer-Server / deploy (push) Failing after 2s
Push auf main rollt den Stand selbst aus, statt ihn von Hand zu kopieren.
Der Runner (pve-runner) liegt im selben LAN wie der Zielhost.

Drei Dinge, die dabei nicht passieren duerfen und deshalb abgesichert sind:

- Die .env, das data-Verzeichnis und node_modules sind vom rsync-Abgleich
  ausgenommen. Das --delete raeumt zwar geloeschte Dateien weg, laesst diese
  Pfade aber in Ruhe (kein --delete-excluded).
- npm ci laeuft auf dem Zielhost, nicht im Runner-Container: bcrypt und
  sqlite3 sind native Module und muessen zur dortigen Umgebung passen.
  Aufgerufen wird es nur, wenn sich backend/package*.json geaendert hat.
- Neu gestartet wird nur bei Aenderungen unter backend/ oder deploy/.
  Eine geaenderte Frontend-Datei wird ausgeliefert, ohne den laufenden
  Dienst anzufassen.

Danach ein Health-Check gegen /health; bleibt die Antwort aus, schlaegt der
Lauf fehl und die letzten Journal-Zeilen stehen im Protokoll.

Die Einrichtung (Deploy-Benutzer, eng gefasste sudo-Regel, Variablen und
Secrets) steht in DEPLOY.md.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 17:56:35 +02:00
adminandClaude Opus 5 a7e77793a8 Timer-App unter Versionsverwaltung stellen
Stand der laufenden Anwendung von 192.168.1.5:/opt/timer-app (systemd-Dienst
timer-app, Port 3003). Zeiterfassung mit Kostenberechnung: Node/Express,
SQLite, Anmeldung ausschliesslich ueber Authentik (OIDC, PKCE, RP-Logout) -
der frueher vorhandene Passwort-Login ist entfernt.

Nicht im Repo, bewusst:
- backend/.env und die .env-Sicherung: enthalten Session-Secret und die
  Authentik-Zugangsdaten. Vorlage ist backend/.env.example.
- data/: die Datenbank mit den echten Zeiterfassungen.
- node_modules/.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 17:47:07 +02:00