bugfix update alarm #3

Merged
jhoogie merged 1 commits from update-0.1.9 into main 2026-09-09 12:48:13 +02:00
10 changed files with 95 additions and 6 deletions
+2 -1
View File
@@ -6,7 +6,8 @@ frontend/dist/
# Omgevingsvariabelen (gebruik .env.example als sjabloon) # Omgevingsvariabelen (gebruik .env.example als sjabloon)
.env .env
.env.local .env.*
!.env.example
# Logs en rommel # Logs en rommel
*.log *.log
+36
View File
@@ -95,6 +95,42 @@ $env:GITEA_TOKEN = "<token>"
Het script bouwt één image voor `linux/amd64` en `linux/arm64`, zodat dezelfde Het script bouwt één image voor `linux/amd64` en `linux/arm64`, zodat dezelfde
tag op een Raspberry Pi en op een x86-server werkt. 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=<token met write:repository>
REGISTRY_USER=<gitea-gebruiker>
REGISTRY_TOKEN=<token met write:package>
```
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 ## Docker
+19
View File
@@ -1,5 +1,24 @@
# Changelog # 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 ## [0.1.8] - 2026-09-09
### Gewijzigd ### Gewijzigd
+2 -1
View File
@@ -13,7 +13,8 @@ export default [
languageOptions: { languageOptions: {
ecmaVersion: "latest", ecmaVersion: "latest",
sourceType: "module", 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 } }, parserOptions: { ecmaFeatures: { jsx: true } },
}, },
settings: { react: { version: "detect" } }, settings: { react: { version: "detect" } },
+1 -1
View File
@@ -10,7 +10,7 @@ import SchuldTab from "./pages/SchuldTab.jsx";
import VoortgangTab from "./pages/VoortgangTab.jsx"; import VoortgangTab from "./pages/VoortgangTab.jsx";
import { RED, PURPLE_LIGHT } from "./constants/index.js"; import { RED, PURPLE_LIGHT } from "./constants/index.js";
import { fmt } from "./utils/format.js"; import { fmt } from "./utils/format.js";
import { version } from "../package.json"; import { version } from "./version.js";
import { useUpdateCheck } from "./hooks/useUpdateCheck.js"; import { useUpdateCheck } from "./hooks/useUpdateCheck.js";
import ProfielPopup from "./components/ProfielPopup.jsx"; import ProfielPopup from "./components/ProfielPopup.jsx";
import InstellingenModal from "./components/InstellingenModal.jsx"; import InstellingenModal from "./components/InstellingenModal.jsx";
+1 -1
View File
@@ -1,6 +1,6 @@
import { useState } from "react"; import { useState } from "react";
import { TABS } from "../constants/index.js"; import { TABS } from "../constants/index.js";
import { version } from "../../package.json"; import { version } from "../version.js";
import { useUpdateCheck } from "../hooks/useUpdateCheck.js"; import { useUpdateCheck } from "../hooks/useUpdateCheck.js";
import { useApp } from "../context/AppContext.jsx"; import { useApp } from "../context/AppContext.jsx";
+1 -1
View File
@@ -1,5 +1,5 @@
import { useEffect, useState } from "react"; 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 // 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. // geen CORS-headers, dus de browser mag die niet direct bevragen.
+9
View File
@@ -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__;
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "vibefinance", "name": "vibefinance",
"version": "0.1.8", "version": "0.1.9",
"description": "VibeFinance — persoonlijk vermogensbeheer", "description": "VibeFinance — persoonlijk vermogensbeheer",
"private": true, "private": true,
"repository": "https://vibehoogie.duckdns.org/vibe/VibeFinance", "repository": "https://vibehoogie.duckdns.org/vibe/VibeFinance",
+23
View File
@@ -28,6 +28,29 @@ param(
$ErrorActionPreference = "Stop" $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 ── # ── PROJECTCONFIGURATIE — pas alleen dit blok aan voor een nieuw project ──
# ════════════════════════════════════════════════════════════════════════════ # ════════════════════════════════════════════════════════════════════════════