fix: Build meldet wieder ESLint-Fehler
eslint.ignoreDuringBuilds stand auf true, der Build verschluckte also jede Lint-Meldung. Im gesamten Projekt gab es genau zwei echte Errors -- beide "let json" statt "const json" in SettingsSidebar.tsx. Behoben, Schalter aus, next lint endet mit Exit 0. Die 695 Warnungen (470 no-explicit-any, 209 ungenutzte Variablen, 11 unvollstaendige Hook-Abhaengigkeiten) blockieren den Build nicht. Die Hook-Warnungen sind davon die interessantesten, weil daraus echte Bugs entstehen -- stehen als eigener Punkt in TODO.md. Naechster Schritt ist typescript.ignoreBuildErrors; der volle tsc-Lauf dauert wegen WeeklyView.tsx ueber 15 Minuten und laeuft noch. v1.117.4 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
391134f36d
commit
4a9b276d3c
@ -2,6 +2,15 @@
|
|||||||
|
|
||||||
All notable changes to this project are documented in this file.
|
All notable changes to this project are documented in this file.
|
||||||
|
|
||||||
|
## [1.117.4] - 2026-09-07
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Der Build meldet wieder ESLint-Fehler: `eslint.ignoreDuringBuilds` steht auf `false`.
|
||||||
|
Es waren nur **zwei** echte Errors im gesamten Projekt (`let json` statt `const json` in
|
||||||
|
`SettingsSidebar.tsx`), beide behoben. `next lint` endet jetzt mit Exit 0.
|
||||||
|
Die 695 Warnungen — 470-mal `no-explicit-any`, 209 ungenutzte Variablen, 11 unvollständige
|
||||||
|
Hook-Abhängigkeiten — blockieren den Build nicht und werden fortlaufend abgebaut.
|
||||||
|
|
||||||
## [1.117.3] - 2026-09-06
|
## [1.117.3] - 2026-09-06
|
||||||
|
|
||||||
### Security
|
### Security
|
||||||
|
|||||||
54
TODO.md
54
TODO.md
@ -97,12 +97,16 @@ Anleitung siehe [`docs/secret-rotation.md`](docs/secret-rotation.md).
|
|||||||
## Block C — Build und Typsicherheit
|
## Block C — Build und Typsicherheit
|
||||||
|
|
||||||
### C1. Build darf Fehler nicht mehr verschlucken (Audit 1)
|
### C1. Build darf Fehler nicht mehr verschlucken (Audit 1)
|
||||||
- [ ] **Schritt 1:** `eslint.ignoreDuringBuilds` in `next.config.js` auf `false`
|
- [x] **Schritt 1:** `eslint.ignoreDuringBuilds` in `next.config.js` auf `false`
|
||||||
- [ ] Gemeldete ESLint-Fehler abarbeiten
|
- [x] Gemeldete ESLint-Fehler abarbeiten — es waren nur **2** (`prefer-const` in
|
||||||
|
`SettingsSidebar.tsx`), verifiziert: `next lint` endet jetzt mit Exit 0
|
||||||
- [ ] **Schritt 2:** `npm run type-check` laufen lassen, Fehlerzahl notieren
|
- [ ] **Schritt 2:** `npm run type-check` laufen lassen, Fehlerzahl notieren
|
||||||
- [ ] Fehler abarbeiten — modulweise, nicht auf einmal
|
- [ ] Fehler abarbeiten — modulweise, nicht auf einmal
|
||||||
- [ ] **Schritt 3:** `typescript.ignoreBuildErrors` auf `false`
|
- [ ] **Schritt 3:** `typescript.ignoreBuildErrors` auf `false`
|
||||||
- [ ] `any`-Stellen reduzieren (aktuell **452**) — fortlaufend, kein Blocker
|
- [ ] `any`-Stellen reduzieren — ESLint zählt **470** `no-explicit-any` — fortlaufend, kein Blocker
|
||||||
|
- [ ] **209** ungenutzte Variablen (`no-unused-vars`) aufräumen — fortlaufend
|
||||||
|
- [ ] **11** unvollständige Hook-Abhängigkeiten (`react-hooks/exhaustive-deps`) prüfen —
|
||||||
|
die sind die gefährlichsten der Warnungen, weil daraus echte Bugs entstehen
|
||||||
|
|
||||||
**Warum:** `next.config.js` hat `ignoreDuringBuilds: true` **und** `ignoreBuildErrors: true`.
|
**Warum:** `next.config.js` hat `ignoreDuringBuilds: true` **und** `ignoreBuildErrors: true`.
|
||||||
`tsconfig.json` sagt zwar `strict: true`, das ist aber wirkungslos, weil der Build die Fehler
|
`tsconfig.json` sagt zwar `strict: true`, das ist aber wirkungslos, weil der Build die Fehler
|
||||||
@ -229,6 +233,50 @@ F1. Kommt etwas anderes heraus, wurde es längst getauscht und du kannst F1 abha
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Block G — Infrastruktur (Supabase-LXC 201)
|
||||||
|
|
||||||
|
### G1. Container läuft privilegiert *(Sicherheitsthema)*
|
||||||
|
- [ ] Entscheiden, ob `unprivileged: 0` so bleiben soll
|
||||||
|
- [ ] Falls nicht: Container neu aufsetzen und Daten übernehmen
|
||||||
|
|
||||||
|
**Warum:** `pct config 201` meldet `unprivileged: 0`. Wer aus diesem Container ausbricht, ist
|
||||||
|
**root auf dem NUC** — bei einem Container, der die Datenbank betreibt, die relevantere
|
||||||
|
Baustelle als ein fehlendes Root-Passwort. Meist wird das umgestellt, weil Docker im
|
||||||
|
unprivilegierten Container zickt; nachvollziehbar, aber ein bewusster Kompromiss.
|
||||||
|
|
||||||
|
### G2. Besitzverhältnisse im Dateisystem sind schief
|
||||||
|
- [ ] Kurzfix, falls SSH-Zugang zum Container gebraucht wird:
|
||||||
|
`pct exec 201 -- chown 0:0 /etc/passwd` und `pct exec 201 -- chown 0:42 /etc/shadow`
|
||||||
|
- [ ] Langfristig: Container sauber neu aufsetzen
|
||||||
|
|
||||||
|
**Warum:** Das Dateisystem stammt aus einem **unprivilegierten** Container (alles liegt mit
|
||||||
|
UID 100000 auf der Platte), läuft aber jetzt **privilegiert**, also ohne UID-Mapping. root
|
||||||
|
besitzt dadurch praktisch keine Datei im System. Zeitstempel belegen es: alles vom 26.02.2026
|
||||||
|
mit UID 100000, nur `/etc/hostname` vom 06.09. mit `0:0` — das schreibt Proxmox von außen.
|
||||||
|
|
||||||
|
Symptom war `passwd: Authentication token manipulation error`. Das System läuft trotzdem,
|
||||||
|
weil root per `CAP_DAC_OVERRIDE` die Rechteprüfung überspringt; Werkzeuge wie `passwd`, die
|
||||||
|
strenger prüfen, fallen darüber. Weitere solche Merkwürdigkeiten sind zu erwarten.
|
||||||
|
|
||||||
|
⚠️ **Kein `chown -R` über das ganze Dateisystem** — nicht am laufenden Container und schon
|
||||||
|
gar nicht mit Docker darin. Postgres und die Supabase-Container haben eigene UIDs (999, 70, …),
|
||||||
|
die dabei zerschossen würden.
|
||||||
|
|
||||||
|
**Kein Blocker:** `pct enter 201` gibt jederzeit eine Root-Shell ohne Passwort. Ein
|
||||||
|
Root-Passwort wird nur für direkten SSH-Zugang gebraucht.
|
||||||
|
|
||||||
|
### G3. Supabase Studio ist nicht erreichbar
|
||||||
|
- [ ] Auf 201 prüfen: `docker compose ps` — laufen die Container?
|
||||||
|
- [ ] Port klären: Studio hängt hinter Kong auf **8000**, nicht 8001
|
||||||
|
- [ ] `scripts/supabase-setup.sh` korrigieren: falsche Port-Ausgabe und Shebang `#!/bash`
|
||||||
|
|
||||||
|
**Warum:** `http://<IP>:8001` antwortet nicht. Die Zahl stammt aus einer `echo`-Zeile in
|
||||||
|
`scripts/supabase-setup.sh`, die nirgends eine Portfreigabe setzt — beim offiziellen
|
||||||
|
`supabase/docker`-Stack ist Studio nur über Kong auf 8000 erreichbar. Zusätzlich hat das
|
||||||
|
Skript `#!/bash` statt `#!/bin/bash` und ist so gar nicht direkt ausführbar.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Kleinkram (ohne Eile)
|
## Kleinkram (ohne Eile)
|
||||||
|
|
||||||
- [ ] 114 `console.log` aus dem Produktionscode entfernen (die 275 `console.error` sind in Ordnung)
|
- [ ] 114 `console.log` aus dem Produktionscode entfernen (die 275 `console.error` sind in Ordnung)
|
||||||
|
|||||||
@ -4,7 +4,9 @@ const { version } = require('./package.json');
|
|||||||
const nextConfig = {
|
const nextConfig = {
|
||||||
output: 'standalone',
|
output: 'standalone',
|
||||||
eslint: {
|
eslint: {
|
||||||
ignoreDuringBuilds: true,
|
// Aus: Der Build soll ESLint-Fehler melden. Warnungen (aktuell ~695, überwiegend
|
||||||
|
// no-explicit-any) blockieren den Build nicht — nur Errors tun das.
|
||||||
|
ignoreDuringBuilds: false,
|
||||||
},
|
},
|
||||||
typescript: {
|
typescript: {
|
||||||
ignoreBuildErrors: true,
|
ignoreBuildErrors: true,
|
||||||
|
|||||||
4
package-lock.json
generated
4
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "my-weekly-todo-list",
|
"name": "my-weekly-todo-list",
|
||||||
"version": "1.117.3",
|
"version": "1.117.4",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "my-weekly-todo-list",
|
"name": "my-weekly-todo-list",
|
||||||
"version": "1.117.3",
|
"version": "1.117.4",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@auth/prisma-adapter": "^2.11.1",
|
"@auth/prisma-adapter": "^2.11.1",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "my-weekly-todo-list",
|
"name": "my-weekly-todo-list",
|
||||||
"version": "1.117.3",
|
"version": "1.117.4",
|
||||||
"description": "A web-based weekly task management application that organizes to-dos and calendar events in a single, intuitive weekly view",
|
"description": "A web-based weekly task management application that organizes to-dos and calendar events in a single, intuitive weekly view",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@ -3645,7 +3645,7 @@ function SettingsSidebar({
|
|||||||
reader.onload = async (evt) => {
|
reader.onload = async (evt) => {
|
||||||
try {
|
try {
|
||||||
const text = evt.target?.result as string;
|
const text = evt.target?.result as string;
|
||||||
let json = JSON.parse(text);
|
const json = JSON.parse(text);
|
||||||
|
|
||||||
// Normalizing standard terminal formats to a consistent internal format
|
// Normalizing standard terminal formats to a consistent internal format
|
||||||
const normalized: any = {
|
const normalized: any = {
|
||||||
@ -3727,7 +3727,7 @@ function SettingsSidebar({
|
|||||||
reader.onload = async (evt) => {
|
reader.onload = async (evt) => {
|
||||||
try {
|
try {
|
||||||
const text = evt.target?.result as string;
|
const text = evt.target?.result as string;
|
||||||
let json = JSON.parse(text);
|
const json = JSON.parse(text);
|
||||||
|
|
||||||
const normalized: any = {
|
const normalized: any = {
|
||||||
background: json.background,
|
background: json.background,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user