From b976fc303685ac5f5e2c46862c1d2ca07752586c Mon Sep 17 00:00:00 2001 From: Oliver G Date: Mon, 24 Aug 2026 16:54:40 +0200 Subject: [PATCH] chore: SQLite-Datenbank aus der Versionierung nehmen backend/data/rss_news.db lag im Repo. Auf dem Server liegt unter demselben Pfad die Produktivdatenbank mit 95 MB, im Repo ein Entwicklungsstand mit 200 KB. Jeder Commit, der die Datei mitgenommen haette, haette beim naechsten Deploy die Live-Daten damit ueberschrieben. Die Datei wird untracked (bleibt auf der Platte liegen), *.db und backend/data/ wandern in die .gitignore. init_db() legt die Datenbank beim ersten Start selbst an. Ausserdem: docs/AUTOMATION.md behauptete automatisches Deployment ueber GitHub Actions. Das stimmt nicht - das Remote ist Forgejo ohne Runner, und der Server hat keinen Deploy-Key, `git pull origin main` scheitert dort mit Permission denied. Der tatsaechliche Handbetrieb per Git-Bundle ist jetzt dokumentiert, die Reparatur steht in der TODO. Co-Authored-By: Claude Opus 5 --- .gitignore | 11 ++++++++++ backend/data/rss_news.db | Bin 204800 -> 0 bytes docs/AUTOMATION.md | 43 +++++++++++++++++++++++++++++++++------ docs/TODO.md | 3 +++ 4 files changed, 51 insertions(+), 6 deletions(-) delete mode 100644 backend/data/rss_news.db diff --git a/.gitignore b/.gitignore index aac3a2f..2e1a7b7 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,17 @@ Thumbs.db # dotenv / Umgebungsvariablen .env +# SQLite-Datenbanken NIE versionieren. +# Die Produktivdatenbank liegt auf dem Server unter demselben Pfad +# (backend/data/rss_news.db, 95 MB). Solange die Datei im Repo lag, haette +# jeder Commit, der sie mitnimmt, beim naechsten Deploy die Live-Daten mit +# einem Entwicklungsstand ueberschrieben. init_db() legt die Datei beim +# ersten Start selbst an. +*.db +*.db-wal +*.db-shm +backend/data/ + # JSON-Datenbanken / Zwischenspeicherung # *.json # !feeds.json # optional entfernbar, wenn du Beispielfeeds mit versionieren willst diff --git a/backend/data/rss_news.db b/backend/data/rss_news.db deleted file mode 100644 index 792930712d0b6bc67bf4176b67dc08588b62428c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204800 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 diff --git a/docs/AUTOMATION.md b/docs/AUTOMATION.md index 46c4f86..241a433 100644 --- a/docs/AUTOMATION.md +++ b/docs/AUTOMATION.md @@ -198,14 +198,45 @@ Alle externen Endpunkte benötigen den Header `X-API-Key: `. --- -## Deployment (Hetzner via GitHub) +## Deployment (Hetzner) -Das Deployment läuft automatisch über GitHub Actions beim Push auf `main`: +**Achtung: Das Deployment läuft derzeit NICHT automatisch.** Stand 24.08.2026 +geprüft — `.github/workflows/deploy.yml` ist GitHub-Actions-Syntax, das Remote +ist aber Forgejo (`git.giertz.biz`), und es greift kein Runner. Zusätzlich hat +der Server keinen Deploy-Key für das Repo: `git pull origin main` scheitert dort +mit `Permission denied (publickey)`. Ein Push auf `main` bewirkt also nichts. -1. GitHub Action führt Tests aus -2. Bei Erfolg: SSH-Deploy auf Hetzner -3. `pip install -r requirements.txt` -4. Systemd-Dienst `rss-app` neu starten +Bis das repariert ist, wird von Hand deployt. Weg über ein Git-Bundle, damit die +Historie auf dem Server korrekt bleibt (statt Dateien zu kopieren und die Stände +unbemerkt auseinanderdriften zu lassen): + +```bash +# lokal, = Commit, auf dem der Server steht +git bundle create /tmp/deploy.bundle ..main +scp /tmp/deploy.bundle hetzner:/root/deploy.bundle + +# auf dem Server +cd /opt/rss-news +git pull /root/deploy.bundle main +systemctl restart rss-news-api # zieht die DB-Migration automatisch nach +``` + +`pip install` nur, wenn sich `requirements.txt` oder `backend/requirements.txt` +tatsächlich geändert haben. + +Dienst: `rss-news-api` (systemd), `WorkingDirectory=/opt/rss-news`, +uvicorn auf `127.0.0.1:8790`, davor der Reverse Proxy. + +**Vor jedem Deploy die Datenbank sichern:** + +```bash +ssh hetzner "cp -a /opt/rss-news/backend/data/rss_news.db \ + /root/rss-news-backups/rss_news.db.$(date +%F-%H%M)" +``` + +Dauerhafte Reparatur (offen): entweder einen Deploy-Key auf dem Server +hinterlegen und in Forgejo eintragen, oder den Workflow nach +`.forgejo/workflows/` umziehen und einen Runner registrieren. Workflow-Dateien: `.github/workflows/test.yml` und `.github/workflows/deploy.yml` diff --git a/docs/TODO.md b/docs/TODO.md index f20d39a..989cec3 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -34,6 +34,9 @@ - [x] Manuelle Rechtsfreigabe als Publish-Gate ## Betrieb +- [ ] Deploy reparieren: Server hat keinen Deploy-Key (`git pull` scheitert), Forgejo hat keinen + Runner fuer `.github/workflows/deploy.yml`. Bis dahin Handbetrieb per Bundle, siehe `docs/AUTOMATION.md`. +- [x] `backend/data/rss_news.db` aus der Versionierung genommen (Live-DB 95 MB, Repo-Stand 200 KB) - [ ] Systemd-Service(s) fuer API/Worker erstellen - [ ] Nginx-Routing fuer neue App einrichten - [ ] Healthcheck-Endpunkte + Monitoring einrichten