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>
53 lines
2.4 KiB
Markdown
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.
|