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.