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>
This commit is contained in:
Lucas Orth
2026-08-25 07:26:15 +02:00
commit 681fc1649a
19 changed files with 3096 additions and 0 deletions

View File

@@ -0,0 +1,61 @@
name: Build & Deploy
on:
push:
tags:
- 'v*'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# Intern klonen statt ueber die oeffentliche Domain: Gitea laeuft auf
# demselben Host, der Weg ueber die oeffentliche IP findet nicht
# zurueck (NAT-Hairpin). Der Job-Container erreicht Gitea ueber das
# Netz gitea-ci unter seinem Containernamen.
- uses: actions/checkout@v4
with:
github-server-url: http://gitea:3000
# --- Build & Tests -----------------------------------------------
# Laeuft vor dem Deploy: ein roter Bundle-Build darf den Server nicht
# anfassen. Der Docker-Build wiederholt die Schritte spaeter im Image.
- uses: actions/setup-node@v4
with:
node-version: '22'
- name: Abhaengigkeiten installieren
working-directory: app
run: npm ci
- name: Frontend-Bundles bauen
working-directory: app
run: npm run build
- name: Server-Syntax pruefen
working-directory: app
run: node --check server.js
# ------------------------------------------------------------------
- name: Tag ermitteln
run: echo "IMAGE_TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
# Ein einziges Repo-Secret DOTENV mit dem kompletten .env-Inhalt
# (mehrzeilig). Ueber env: statt direkter Interpolation, damit
# Anfuehrungszeichen, Backticks und $ in den Werten unangetastet bleiben.
- name: .env aus Secret erzeugen
env:
DOTENV: ${{ secrets.DOTENV }}
run: |
if [ -z "$DOTENV" ]; then
echo "Secret DOTENV ist leer oder nicht gesetzt."
exit 1
fi
umask 077
echo "$DOTENV" > .env
- name: Deployen
run: docker compose up -d --build --remove-orphans --wait --wait-timeout 180
- name: Alte Layer aufraeumen
run: docker image prune -f