No description
Find a file
Ramon f4a4cbd28c
All checks were successful
dev - build & deploy naar test / build-and-deploy (push) Successful in 1m4s
feat: herteken vierseizoenenboom en dino, herstel windmolen (v0.4.79-beta)
Drie platen die na eerdere reparaties nog niet klopten, nu fundamenteel
anders aangepakt in plaats van bijgeschaafd.

Boom van vier seizoenen: het idee van één cirkel in vier kwarten werkte niet,
ook niet met ronde plukken op de rand - het bleef een bal met een kruis erin.
Vervangen door vier losse boompjes naast elkaar, één per seizoen, elk met een
eigen kroonvorm: lente (bloesem met groene blaadjes), zomer (vol groen blad
met wat vruchten), herfst (oranje/geel blad, twee vallende blaadjes op de
grond) en winter (kale boom - drie echte, gevulde takken vanuit verschillende
hoogtes op de stam, met dunne twijgjes en sneeuwklompjes op de uiteinden).
Eerste versie van de kale winterboom liet takken vanuit één punt uitwaaieren
en oogde als vuurwerk; met gevulde taksegmenten en een aftakpunt per tak is
het nu een boom.

Dinosaurus: nog niet herkenbaar genoeg. Volledig hertekend naar de klassieke,
direct herkenbare langnekdino-verhoudingen: een veel langere gracieuze hals,
een groot rond lijf, een lange dunne staart en een klein koppie met een grote
vriendelijke oog - in plaats van de kortere, gedrongen versie van de vorige
ronde.

Windmolen in de duurzame stad: de drie wieken stonden niet gelijk verdeeld
(twee dicht bij elkaar, één ver weg) en één wiek liep dwars door de zon heen.
Nu netjes 120 graden uit elkaar en gedraaid zodat geen enkele wiek de zon
raakt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011YErxhic5w9K57zmt8Q1uS
2026-07-30 15:25:22 +02:00
.forgejo/workflows v0.3.05-beta: rol nginx-config atomisch uit 2026-07-14 13:23:15 +02:00
db feat: voeg thematische kleurplaten toe (v0.4.65-beta) 2026-07-28 22:34:15 +02:00
deploy feat: breid live klasinteractie grafisch uit 2026-07-24 13:40:18 +02:00
docs/curriculum docs: leg SLO-kerndoelen 2026 vast (v0.4.36-beta) 2026-07-19 20:58:17 +02:00
public feat: herteken vierseizoenenboom en dino, herstel windmolen (v0.4.79-beta) 2026-07-30 15:25:22 +02:00
src feat: voeg thematische kleurplaten toe (v0.4.65-beta) 2026-07-28 22:34:15 +02:00
test fix: maak kleurplaatverf zichtbaar en herteken de atlas (v0.4.75-beta) 2026-07-30 00:39:14 +02:00
.dockerignore Initiële opzet: Fastify + static, Docker, Postgres, Forgejo Actions 2026-07-07 22:41:05 +02:00
.env.example v0.2.00: schoolsysteem met rollen (super/admin/groepsleiding/leerling), koppelcodes, server-API en beheerpaneel 2026-07-09 22:26:01 +02:00
.gitignore feat: voeg afbeeldingscatalogus en opslagquota toe 2026-07-15 23:45:17 +02:00
AGENTS.md v0.2.05-beta: bronwaarde widgets als string bewaren + projectafspraken toegevoegd 2026-07-13 08:04:50 +02:00
CLAUDE.md v0.2.05-beta: bronwaarde widgets als string bewaren + projectafspraken toegevoegd 2026-07-13 08:04:50 +02:00
compose.yaml feat: voeg afbeeldingscatalogus en opslagquota toe 2026-07-15 23:45:17 +02:00
Dockerfile feat: voeg afbeeldingscatalogus en opslagquota toe 2026-07-15 23:45:17 +02:00
package-lock.json feat: make assignments independent from boards 2026-07-25 22:15:52 +02:00
package.json fix: patch Fastify static security vulnerabilities 2026-07-24 22:46:22 +02:00
README.md v0.3.06-beta: herstel bereikbaarheid via Pangolin 2026-07-14 13:26:15 +02:00
VERSION feat: herteken vierseizoenenboom en dino, herstel windmolen (v0.4.79-beta) 2026-07-30 15:25:22 +02:00

Teach

Digibord-webapp (Fastify + static frontend) met PostgreSQL, gecontaineriseerd en via Forgejo Actions automatisch uitgerold: dev → test-VM, release → productie-VM.

Structuur

teach/
├─ public/index.html          # de digibord-app (voorheen teach.html)
├─ src/server.js              # Fastify: serveert de app + /api + DB-pool
├─ db/001_init.sql            # initieel Postgres-schema
├─ Dockerfile                 # productie-image (non-root, healthcheck)
├─ compose.yaml              # lokaal draaien (app + postgres)
├─ deploy/compose.deploy.yaml # test/prod: pullt image uit de registry
├─ .forgejo/workflows/
│  ├─ dev.yaml               # push naar dev → build + deploy test
│  └─ release.yaml           # release → build + deploy prod
└─ .env.example

Lokaal draaien

cp .env.example .env      # pas POSTGRES_PASSWORD en DATABASE_URL aan
docker compose up --build

App op http://localhost:3000, healthcheck op /healthz, DB-check op /readyz.

Architectuurkeuzes

  • Container i.p.v. losse static site: omdat er een database bijkomt, is een backend nodig (browser praat niet rechtstreeks met Postgres). De Fastify-app serveert de HTML én biedt de /api, en praat met de DB.
  • Forgejo container registry: CI bouwt de image één keer en pusht die; beide VM's pullen exact dezelfde geteste image. Geen build op de productie-VM.
  • Pangolin/Traefik verzorgt de publieke HTTPS-ingang. De meegeleverde nginx vormt de interne proxylaag en luistert standaard op poort 8081, zodat de Pangolin/Traefik-route deze via het VM-/containernetwerk kan bereiken. De Fastify-app vertrouwt precies twee proxy-hops.

Eenmalige setup

1. Repo aanmaken in Forgejo

Maak een leeg repo (bv. ramon/teach) en push (zie onderaan).

2. Registry / Actions variabelen en secrets

Onder Settings → Actions → Variables van het repo (of org):

Variable Waarde Uitleg
REGISTRY 10.0.20.22:3000 Host van je Forgejo = registry

De image heet dan 10.0.20.22:3000/bes-r/teach.

Onder Settings → Actions → Secrets:

Secret Uitleg
REGISTRY_USER Forgejo-gebruiker met package-write rechten
REGISTRY_TOKEN Token/wachtwoord voor die gebruiker (scope: packages)
TEST_HOST IP/hostname van de test-VM
TEST_USER SSH-gebruiker op de test-VM
TEST_SSH_KEY Private SSH-key (deploy key) voor de test-VM
TEST_DEPLOY_PATH Pad op de test-VM met compose.deploy.yaml + .env + db/
PROD_HOST IP/hostname van de productie-VM
PROD_USER SSH-gebruiker op de productie-VM
PROD_SSH_KEY Private SSH-key voor de productie-VM
PROD_DEPLOY_PATH Pad op de productie-VM met de deploy-bestanden

De runner moet de docker-CLI kunnen gebruiken (host-socket of docker-in-docker) en actions/checkout + appleboy/ssh-action kunnen ophalen. Pas runs-on in de workflows aan naar het label van jouw runner als dat niet ubuntu-latest is.

2b. HTTP-registry toestaan (insecure-registries)

Je Forgejo draait op http://10.0.20.22:3000 (platte HTTP). Docker weigert HTTP-registries tenzij je ze expliciet toestaat. Doe dit op drie plekken: de runner-host (die pusht) en beide VM's (die pullen). Op elke Docker-host:

# /etc/docker/daemon.json
{
  "insecure-registries": ["10.0.20.22:3000"]
}
sudo systemctl restart docker

Zet je Forgejo later achter HTTPS met een echt domein, dan kan deze stap weg en gebruik je dat domein als REGISTRY.

3. Deploy-map op elke VM

Op zowel de test- als de productie-VM, in het pad dat je bij *_DEPLOY_PATH opgeeft:

mkdir -p teach && cd teach
# kopieer deze twee uit de repo:
#   deploy/compose.deploy.yaml  -> compose.deploy.yaml
#   db/                         -> db/
# maak een .env aan:
cat > .env <<'EOF'
IMAGE=10.0.20.22:3000/bes-r/teach:dev   # prod: laat CI dit op :vX.Y.Z zetten
POSTGRES_DB=teach
POSTGRES_USER=teach
POSTGRES_PASSWORD=<sterk-wachtwoord>
DATABASE_URL=postgres://teach:<sterk-wachtwoord>@db:5432/teach
APP_PORT=3000
WEB_BIND_IP=0.0.0.0
WEB_PORT=8081
TRUST_PROXY_HOPS=2
SUPER_USER=beheerder
SUPER_PASS=<uniek-sterk-eerste-wachtwoord>
EOF

CI werkt bij elke deploy de IMAGE=-regel bij, pullt en herstart.

4. Pangolin/Traefik publiceren

Publiceer http://<interne-vm-ip>:8081 via Pangolin/Traefik en laat daar TLS beëindigen. De interne nginx behoudt X-Forwarded-Proto: https, waarna de app Secure/HttpOnly/SameSite-cookies, HSTS en overige securityheaders gebruikt.

  • Beperk poort 8081 met de hostfirewall tot het Pangolin/Traefik- of tunnelnetwerk.
  • Pas TRUST_PROXY_HOPS alleen aan wanneer de proxyketen werkelijk verandert.
  • Bij een aparte Traefik-container kan een gedeeld intern Docker-netwerk nodig zijn; zet WEB_BIND_IP niet ruimer dan noodzakelijk.
  • SUPER_PASS is alleen nodig bij een lege database, wordt nooit gelogd en moet via de beveiligde deploy-omgeving worden aangeleverd.
  • De overgang naar v0.3.03-beta trekt bestaande browsersessies bewust in.

Workflow / branching

  • Werk op feature-branches, merge naar dev → automatisch naar test.
  • Tevreden? Maak een release (tag vX.Y.Z) → automatisch naar productie.

Push naar Forgejo (eerste keer)

git remote add origin http://10.0.20.22:3000/bes-r/teach.git
git push -u origin main
git push -u origin dev

Volgende stap: data uit localStorage naar de database

De frontend bewaart borden/gebruikers nu nog in localStorage. Om echt een gedeelde database te gebruiken, bouwen we /api-endpoints (boards, folders, users) in src/server.js en laten we de frontend die aanroepen i.p.v. localStorage. Het schema in db/001_init.sql is daarvoor het startpunt.