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

53 lines
2.4 KiB
Markdown

# Projekthinweise
## Was das ist
SendSecret ist ein eigenes Frontend vor [cryptgeon](https://github.com/cupcakearmy/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.