From 9ceead6ab6ba2037bb562a382736a16d5d1c0b86 Mon Sep 17 00:00:00 2001 From: Jan Wagner Date: Mon, 31 Aug 2026 20:38:10 +0200 Subject: [PATCH] =?UTF-8?q?chore:=20repo=20hygiene=20=E2=80=94=20.dockerig?= =?UTF-8?q?nore,=20.editorconfig,=20deploy-Doku?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - .dockerignore: schließt node_modules, .next, data/, lokale ENV, Deploy- Skripte und Repo-Metadaten aus dem Build-Kontext aus. Vorher hat 'COPY . .' im Dockerfile alles ins Image kopiert, was unter src/ lag — jetzt wird nur das Nötige gebaut. - .editorconfig: einheitliche Einrückung (LF, 2 Spaces, UTF-8) und final-newline für TS/JS/JSON/YAML/SQL. Verhindert Editor-Drift zwischen pi/laptop/WSL-PC. - README: Live-Status-Block ergänzt (URL, Container-Image 323 MB, Traefik, Repo) und Erst-Deploy-Runbook (DNS, .env.local-Setup, Traefik-Restart wegen ACME 1h-Rate-Limit bei fehlendem A-Record). Hintergrund: vorher hat docker build lokal die data/eldov.db mitkopiert (in node_modules fällt das nicht auf, aber data/ lag im src/-Parent) und die Deploy-Skripte selbst (deploy.sh, deploy-vps.sh) — mit.dockerignore wandert das nicht mehr ins Image. .editorconfig war noch nie da, aber die anderen Repos im Cluster (w-make-com, hermes-tools) haben eins — Konsistenz. --- .dockerignore | 41 +++++++++++++++++++++++++++++++++++++++++ .editorconfig | 24 ++++++++++++++++++++++++ README.md | 45 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 .dockerignore create mode 100644 .editorconfig diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f13b393 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,41 @@ +# .dockerignore — schließt alles aus, was nicht ins Image gehört. +# Wichtig: docker build nutzt NICHT .gitignore, sondern diese Datei. + +# Git / Repo-Metadaten +.git +.gitignore +.gitattributes + +# Lokale Doku / Notizen +AGENTS.md +README.md +CLAUDE.md +PRESENCE-STRATEGY.md + +# Deploy- und Dev-Skripte (gehören auf den Host, nicht ins Image) +deploy.sh +deploy-vps.sh +docker-compose.yml + +# Lokale ENV +.env +.env.local +.env.local.example +.env.*.local + +# Lokale Laufzeit- und Build-Artefakte +node_modules +.next +out +dist +data +*.log +.DS_Store +.vscode +.idea +tsconfig.tsbuildinfo +*.tsbuildinfo + +# Tests (Coverage etc.) +coverage +.nyc_output diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..79e10d8 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,24 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 + +[*.{md,mdx}] +trim_trailing_whitespace = false + +[*.{ts,tsx,js,jsx,mjs,cjs}] +indent_size = 2 + +[*.{yml,yaml}] +indent_size = 2 + +[*.sql] +indent_size = 2 + +[Makefile] +indent_style = tab diff --git a/README.md b/README.md index c9072f6..bf62d56 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,18 @@ # eldov.win -Privates Portfolio für „eldov" — Self-Hosting, Bots, AI-Fleet, Hacks. Domain `eldov.win`. +Privates Portfolio für „eldov" — Self-Hosting, Bots, AI-Fleet, Hacks. Domain [`eldov.win`](https://eldov.win) (live seit 2026-08-31). Das ist das Gegenstück zu [`w-make.com`](../w-make-com/README.md). Dort steht die industrielle Arbeit (Behälterglas, W-Make Batch, Batchmaker Studio). Hier stehen die Dinge, die mich abseits von Auftragsarbeit umtreiben: Hermes, Casino-/Trading-Bots, Freewarez-Selfhosting, Themes für Open-Source-Software. +## Live-Status + +- **URL:** https://eldov.win (und https://www.eldov.win) — Let's Encrypt via Traefik ACME +- **Container:** `eldov-portfolio` auf `free-warez.win`, Image 323 MB (Standalone-Build), Healthcheck `healthy` +- **Routing:** Traefik hinter `cloudflare NS` (DNS only) auf `217.160.217.196`, Labels analog w-make.com +- **DB:** SQLite unter `eldov_data` Volume, Seed mit 13 Projekten + Profil beim ersten Request +- **Admin:** `/admin/login`, single-user via `ADMIN_PASSWORD` + HMAC-Session-Cookie +- **Repo:** https://gitea.free-warez.win/eldov/eldov-win (public) + ## Stack Next.js 16 (App Router) · React 19 · Tailwind 4 · TypeScript · SQLite (`better-sqlite3`). SSR mit dynamischem Content aus DB. @@ -80,6 +89,40 @@ Beim ersten Request ohne DB wird automatisch migriert und mit dem Seed aus `src/ `./deploy.sh` (oder `./deploy-vps.sh`) synct nach `free-warez.win:/opt/containers/eldov-portfolio`. Build und Restart des Containers passieren dort. Traefik routet `eldov.win` & `www.eldov.win` per Docker-Labels → Container-Internes 3000. +### Was beim Erst-Deploy zu tun ist + +1. **DNS:** Im Cloudflare-Dashboard für `eldov.win` zwei A-Records anlegen — `eldov.win` und `www.eldov.win` → `217.160.217.196`, **Proxy: DNS only (graue Wolke)**, TTL 300 oder Auto. +2. **Vorbereitung auf dem VPS:** + ```bash + ssh free-warez.win + sudo mkdir -p /opt/containers/eldov-portfolio + sudo chown 1000:1000 /opt/containers/eldov-portfolio + # Secret generieren: + openssl rand -hex 32 > /tmp/session-secret + openssl rand -base64 18 | tr -d '/+=' | head -c 20 > /tmp/admin-password + ``` + Dann `/opt/containers/eldov-portfolio/.env.local` anlegen (chmod 600): + ``` + ADMIN_PASSWORD= + SESSION_SECRET= + DB_PATH=/app/data/eldov.db + NEXT_PUBLIC_SITE_URL=https://eldov.win + ``` +3. **Erst-Deploy:** `./deploy-vps.sh` (sync + build + up). +4. **Traefik-Restart** nach DNS-Propagation, damit die ACME-Challenge für `eldov.win` startet: + ```bash + ssh free-warez.win 'docker restart traefik' + ``` + Wenn der A-Record vor dem ersten Traefik-Versuch fehlte, kann Let's Encrypt die Domain 5× nicht validieren und macht ein 1h-Rate-Limit. Nach dem Limit + Restart kommt das Zertifikat automatisch. + +### Update-Deploy + +```bash +./deploy-vps.sh # synct + baut + restarts +``` + +Die DB bleibt persistent (`eldov_data` Volume). Admin-Änderungen überleben Deploys. + ## DSGVO-Hinweis Das Admin-Backend speichert keine personenbezogenen Daten außer dem Profil des Betreibers. Login-Cookie ist HMAC-signiert, HttpOnly, SameSite=Lax, 7 Tage gültig. Es findet kein Tracking, keine externen Skripte, keine Schriftarten von Drittanbietern statt.