Files
sendsecret/CLAUDE.md
Lucas Orth 681fc1649a SendSecret: Erstimport und Umstellung auf Tag-Deployment
Wrapper-Frontend vor cryptgeon: der Browser verschluesselt lokal, per Mail
geht nur der Link raus.

Fuer das Deployment nach den Konventionen aus DEPLOY.md hergerichtet:

- docker-compose.yml mit festem Projekt- und Container-Namen, kein
  ports-Mapping, Healthcheck als Deploy-Gate. cryptgeon und redis liegen
  im internen Netz, nur app haengt im Web-Netz.
- cryptgeon von latest auf 2.9.3 gepinnt. Das ist derselbe Stand, den
  latest bisher geliefert hat; 2.6.2 existiert nicht.
- /healthz in server.js, vor dem Catch-all-Proxy registriert.
- Dockerfile auf npm ci mit Lockfile und non-root umgestellt.
- .gitea/workflows/deploy.yml: Build und Syntaxpruefung vor dem Deploy,
  .env aus dem Repo-Secret DOTENV.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 07:26:15 +02:00

2.4 KiB

Projekthinweise

Was das ist

SendSecret ist ein eigenes Frontend vor cryptgeon. Kunden geben ein Passwort ein, der Browser verschluesselt es lokal (occulto), legt es als Notiz in cryptgeon ab und schickt nur den Link per Mail an RECIPIENT_EMAIL. Der Schluessel steht im URL-Fragment und erreicht den Server nie.

Drei Container: app (Express-Wrapper, Mail, Proxy), cryptgeon, redis. Nur app haengt im Web-Netz, die anderen beiden im internen Netz.

Wo was liegt

Pfad Inhalt
app/server.js Express: statische Seiten, /api/send (Mail), /healthz, Catch-all-Proxy auf http://cryptgeon:8000
app/src/ Frontend-Quellen, werden von build.js (esbuild) nach app/public/ gebundelt
app/public/ index.html, link.html, style.css (Quellen) + generierte Bundles (nicht im Git)
docker-compose.yml Stack, Konventionen aus DEPLOY.md
.gitea/workflows/deploy.yml Tag-Deploy

Beim Aendern beachten

  • express.json() nicht global setzen. Es wuerde den Body-Stream aufbrauchen, bevor der Proxy ihn an cryptgeon weiterreichen kann. Nur an /api/send haengen.
  • Neue Routen vor dem Catch-all-Proxy registrieren, sonst gehen sie an cryptgeon. Betrifft insbesondere /healthz - das ist das Deploy-Gate.
  • cryptgeon-Version ist gepinnt (2.9.3). Die Bundles verschluesseln mit occulto 2.0.6 gegen dieses API-Format (POST /api/notes/ mit contents / meta / views). Vor einem Upgrade beide Seiten pruefen.
  • Redis hat bewusst keine Persistenz (--save "" --appendonly no) und deshalb kein Volume. Notizen sollen einen Neustart nicht ueberleben.

Deployment

Diese App wird per Tag-Push deployt, nicht manuell hochgeladen. Die verbindlichen Konventionen stehen in DEPLOY.md. Vor Aenderungen an Dockerfile, docker-compose.yml oder .gitea/workflows/ dort nachsehen.

Kurzfassung der Regeln, die man leicht bricht:

  • Kein ports: im Compose. Der Proxy erreicht den Container ueber das Netz nginx-proxy-manager_default unter seinem container_name (sendsecret).
  • name: im Compose ist Pflicht (fester Projektname), sonst legt der CI-Job einen zweiten Stack an.
  • Keine relativen Bind-Mounts. Compose laeuft im Job-Container, der Pfad zeigt auf dem Host ins Leere.
  • Healthcheck ist Pflicht, der Deploy nutzt ihn als Gate.
  • Secrets kommen aus dem Repo-Secret DOTENV, nie in die Compose-Datei.