From 51f876efd37ec08a56441765cff14af7105d9bc2 Mon Sep 17 00:00:00 2001 From: Jordy Hoogeveen Date: Wed, 9 Sep 2026 12:43:11 +0200 Subject: [PATCH] bugfix --- .gitignore | 3 ++- BEHEER.md | 36 ++++++++++++++++++++++++++++ Changelog.md | 19 +++++++++++++++ frontend/eslint.config.js | 3 ++- frontend/src/App.jsx | 2 +- frontend/src/components/NavBar.jsx | 2 +- frontend/src/hooks/useUpdateCheck.js | 2 +- frontend/src/version.js | 9 +++++++ package.json | 2 +- release.ps1 | 23 ++++++++++++++++++ 10 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 frontend/src/version.js diff --git a/.gitignore b/.gitignore index ac5226a..83e001e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,8 @@ frontend/dist/ # Omgevingsvariabelen (gebruik .env.example als sjabloon) .env -.env.local +.env.* +!.env.example # Logs en rommel *.log diff --git a/BEHEER.md b/BEHEER.md index 3aeac79..b8925f6 100644 --- a/BEHEER.md +++ b/BEHEER.md @@ -95,6 +95,42 @@ $env:GITEA_TOKEN = "" Het script bouwt één image voor `linux/amd64` en `linux/arm64`, zodat dezelfde tag op een Raspberry Pi en op een x86-server werkt. +### Tokens niet elke sessie opnieuw zetten + +Staat er een `.env.release` naast `release.ps1`, dan leest het script die in +voordat er iets gebeurt. Handig voor stap 3, die anders elke nieuwe shell +opnieuw met de hand moet: + +``` +# .env.release — staat in .gitignore, hoort alleen op de release-machine +GITEA_TOKEN= +REGISTRY_USER= +REGISTRY_TOKEN= +``` + +Een variabele die al in je shell staat wint, zodat je per run kunt afwijken +zonder het bestand aan te passen. Het script logt alleen welke namen het heeft +geladen, nooit de waarden. + +Twee **verschillende** tokens is hier de bedoeling: de registry heeft +`write:package` nodig en het aanmaken van een release `write:repository`. Eén +breed token voor beide werkt ook, maar dan gaat een repo-schrijfrecht mee bij +elke `docker push`. + +> Een **404** in stap 5 betekent bijna altijd dat de token de repo niet mag +> zien: Gitea geeft op repo-endpoints 404 in plaats van 403, om niet te +> verklappen dat iets bestaat. Controleer dan eerst wie de token is en wat hij +> ziet: +> +> ```powershell +> $h = @{ Authorization = "token $env:GITEA_TOKEN" } +> (Invoke-RestMethod https://vibehoogie.duckdns.org/api/v1/user -Headers $h).login +> (Invoke-RestMethod https://vibehoogie.duckdns.org/api/v1/user/repos -Headers $h).full_name +> ``` +> +> Staat de repo niet in die lijst, dan mist de token de repository-scope of +> hoort hij bij een account zonder toegang. + --- ## Docker diff --git a/Changelog.md b/Changelog.md index 4f0ddc4..1bacf58 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,24 @@ # Changelog +## [Niet vrijgegeven] + +### Gewijzigd +- `release.ps1` leest een `.env.release` naast het script in (niet in git), zodat + `GITEA_TOKEN` en de registry-credentials niet elke shell opnieuw gezet hoeven + te worden; een variabele die al in de omgeving staat wint, en alleen de namen + worden gelogd +- `.gitignore` negeert nu alle `.env.*` op `.env.example` na — `.env.release` + zou anders door een `git add .` in git belanden +- `BEHEER.md` beschrijft welke token-scopes waarvoor nodig zijn + (`write:package` voor de registry, `write:repository` voor een release) en + hoe je een 404 in stap 5 nakijkt +- De draaiende versie komt uit de build in plaats van uit een bestand: de + frontend leest `__APP_VERSION__` via het nieuwe `src/version.js`, niet meer + rechtstreeks uit `frontend/package.json`. `vite.config.js` definieerde die + constante al, maar niets gebruikte hem — een productie-image gebouwd terwijl + er een `-dev` in `package.json` stond, sloeg de update-check stil helemaal + over + ## [0.1.8] - 2026-09-09 ### Gewijzigd diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js index 287a706..e258ca1 100644 --- a/frontend/eslint.config.js +++ b/frontend/eslint.config.js @@ -13,7 +13,8 @@ export default [ languageOptions: { ecmaVersion: "latest", sourceType: "module", - globals: { ...globals.browser }, + // Door Vite ingebakken tijdens de build (define in vite.config.js) + globals: { ...globals.browser, __APP_VERSION__: "readonly" }, parserOptions: { ecmaFeatures: { jsx: true } }, }, settings: { react: { version: "detect" } }, diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 745cef7..ec684c7 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -10,7 +10,7 @@ import SchuldTab from "./pages/SchuldTab.jsx"; import VoortgangTab from "./pages/VoortgangTab.jsx"; import { RED, PURPLE_LIGHT } from "./constants/index.js"; import { fmt } from "./utils/format.js"; -import { version } from "../package.json"; +import { version } from "./version.js"; import { useUpdateCheck } from "./hooks/useUpdateCheck.js"; import ProfielPopup from "./components/ProfielPopup.jsx"; import InstellingenModal from "./components/InstellingenModal.jsx"; diff --git a/frontend/src/components/NavBar.jsx b/frontend/src/components/NavBar.jsx index 6b3bdcb..ba57ce4 100644 --- a/frontend/src/components/NavBar.jsx +++ b/frontend/src/components/NavBar.jsx @@ -1,6 +1,6 @@ import { useState } from "react"; import { TABS } from "../constants/index.js"; -import { version } from "../../package.json"; +import { version } from "../version.js"; import { useUpdateCheck } from "../hooks/useUpdateCheck.js"; import { useApp } from "../context/AppContext.jsx"; diff --git a/frontend/src/hooks/useUpdateCheck.js b/frontend/src/hooks/useUpdateCheck.js index 11348a0..43024b0 100644 --- a/frontend/src/hooks/useUpdateCheck.js +++ b/frontend/src/hooks/useUpdateCheck.js @@ -1,5 +1,5 @@ import { useEffect, useState } from "react"; -import { version } from "../../package.json"; +import { version } from "../version.js"; // De check loopt via de eigen backend (/api/update-check): de Gitea API stuurt // geen CORS-headers, dus de browser mag die niet direct bevragen. diff --git a/frontend/src/version.js b/frontend/src/version.js new file mode 100644 index 0000000..0c91a09 --- /dev/null +++ b/frontend/src/version.js @@ -0,0 +1,9 @@ +// Draaiende versie, tijdens de build ingebakken door Vite (`define` in +// vite.config.js). Die leest VITE_APP_VERSION uit de omgeving — de build-arg +// die de Dockerfile en release.ps1 doorgeven — en valt terug op de versie uit +// package.json wanneer die niet gezet is (dev-server, `npm run build` los). +// +// Niet rechtstreeks uit package.json importeren: dan hangt de versie aan een +// bestand in plaats van aan de build, en checkt een image dat gebouwd is met +// een `-dev` in package.json stil nooit meer op updates. +export const version = __APP_VERSION__; diff --git a/package.json b/package.json index ce92d31..f4408b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vibefinance", - "version": "0.1.8", + "version": "0.1.9", "description": "VibeFinance — persoonlijk vermogensbeheer", "private": true, "repository": "https://vibehoogie.duckdns.org/vibe/VibeFinance", diff --git a/release.ps1 b/release.ps1 index 4d54ab9..2f452fc 100644 --- a/release.ps1 +++ b/release.ps1 @@ -28,6 +28,29 @@ param( $ErrorActionPreference = "Stop" +# ── Geheimen uit .env.release ────────────────────────────────────────────── +# Staat niet in git (.gitignore) en bestaat alleen op de release-machine, zodat +# GITEA_TOKEN niet elke sessie met de hand gezet hoeft te worden. Een variabele +# die al in de omgeving staat wint, zodat je per run kunt afwijken. +$envFile = Join-Path $PSScriptRoot ".env.release" +if (Test-Path $envFile) { + $geladen = @() + foreach ($regel in Get-Content $envFile) { + if ($regel -notmatch '^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$') { continue } + $naam = $Matches[1] + $waarde = $Matches[2].Trim().Trim('"').Trim("'") + if (-not $waarde) { continue } + # Al gezet in de shell? Dan die laten staan. + if ([Environment]::GetEnvironmentVariable($naam)) { continue } + [Environment]::SetEnvironmentVariable($naam, $waarde) + $geladen += $naam + } + # Alleen de namen loggen, nooit de waarden. + if ($geladen) { + Write-Host "Geheimen geladen uit .env.release: $($geladen -join ', ')" -ForegroundColor DarkGray + } +} + # ════════════════════════════════════════════════════════════════════════════ # ── PROJECTCONFIGURATIE — pas alleen dit blok aan voor een nieuw project ── # ════════════════════════════════════════════════════════════════════════════