Visitenkarten-Scanner: Stapelscan, Extraktion, Übersicht, vCard-Export
Selbst gehostete PWA, die Visitenkarten von einem Foto freistellt, ausliest und als Kontakt bereitstellt. - Stapelscan: OpenCV findet die Kartenrechtecke über mehrere Binärmasken, entzerrt sie perspektivisch und schneidet sie einzeln aus. Ohne Fund gilt das ganze Foto als eine Karte. - Extraktion: ein Aufruf je Zuschnitt an das Vision-Modell mit JSON-Schema. Kein vorgeschaltetes OCR - das würde Layout und Schriftgrößen wegwerfen, aus denen die Feldzuordnung entsteht. - Metadaten: Aufnahmezeit und GPS aus den EXIF-Daten des Fotos, Ortsname über Nominatim, Browserstandort nur als Rückfallebene. - Übersicht mit Volltextsuche und Filtern, Detailansicht mit Korrekturmaske. - Notizfeld je Karte, Erinnerungen per Mail inklusive Nachholen verpasster Termine nach einem Neustart. - vCard 3.0 einzeln und als Sammeldatei, Karte gilt danach als exportiert. - Anmeldung über ein Passwort, Sitzung als signiertes Cookie. - Deployment per Tag-Push nach den Konventionen in DEPLOY.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
50
.gitea/workflows/deploy.yml
Normal file
50
.gitea/workflows/deploy.yml
Normal file
@@ -0,0 +1,50 @@
|
||||
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).
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
github-server-url: http://gitea:3000
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
|
||||
- name: Abhaengigkeiten installieren
|
||||
run: pip install -r requirements-dev.txt
|
||||
|
||||
- name: Tests
|
||||
run: pytest -q
|
||||
|
||||
- name: Tag ermitteln
|
||||
run: echo "IMAGE_TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
||||
|
||||
# Ein einziges Repo-Secret DOTENV mit dem kompletten .env-Inhalt.
|
||||
# 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 300
|
||||
|
||||
- name: Alte Layer aufraeumen
|
||||
run: docker image prune -f
|
||||
Reference in New Issue
Block a user