production-nginx.conf.example (vóór certbot) en production-nginx.conf.post-certbot.example (referentie, na certbot) dekken alléén de react-frontend-site op slpsoftware.nl/www.slpsoftware.nl; de mail/iRedAdmin-proxying die op de daadwerkelijke productieserver ook op dit domein draait valt buiten de scope van deze feature en is bewust weggelaten. Bevat de acme-challenge location in het 443-blok (niet het poort-80-blok) en de sentry-tunnel-proxy, analoog aan de testomgeving- configuratie. Documentatie in deployment-plan.md en deployment-instructions.md bijgewerkt met productie-nginx-setupstappen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
7.0 KiB
Deployment Plan
Chosen Method
Gitea Actions, opgesplitst in twee workflow-bestanden:
.gitea/workflows/continuous_integration.yaml— draait de build/test/lint-gate, automatisch bij elke pull request (ongeacht branch) en bij elke push/merge naarmaster, of handmatig viaworkflow_dispatch. Dedeploy-test-job zelf blijft daarnaast ook beperkt totmaster/workflow_dispatchvia een eigenif-check..gitea/workflows/deploy.yaml— een herbruikbare (workflow_call) job die dedist/build via SCP (over SSH) uploadt naar de webroot van een omgeving.
Sinds deze stap is er een echte, geautomatiseerde upload naar een testomgeving: een Raspberry Pi die de statische site serveert via nginx, achter een tweede Raspberry Pi die als nginx reverse proxy fungeert.
How It Works
- Bij elke pull request draait automatisch de build/test/lint-gate (
prepare→build→test), zodat merge requests direct gevalideerd worden. - Zodra een pull request naar
mastergemerged wordt (of de workflow handmatig viaworkflow_dispatchgestart wordt), draait aanvullend dedeploy-testjob. deploy-testroept de herbruikbaredeploy.yamlworkflow aan metartifact_name/environment/deploy_path, en geeft viasecrets: inheritde Pi-inloggegevens door. Deze drie waarden (samen met de artifact-naam/pad die debuild-job gebruikt) staan als variabelen in hetenv:-blok bovenaancontinuous_integration.yaml(ARTIFACT_NAME,ARTIFACT_PATH,DEPLOY_ENVIRONMENT,DEPLOY_PATH), en worden via een kleineconfig-job als job-outputs doorgegeven aandeploy-test(nodig omdat deenv-context zelf niet werkt in dewith:-sectie van een reusable-workflow-aanroep).DEPLOY_PATHzelf is geen hardcoded waarde meer, maar wordt gelezen uit de Gitea repository variableDEPLOY_PATH_TEST(Repository → Settings → Actions → Variables), zodat het uploadpad aangepast kan worden zonder de workflow te wijzigen — ziedeployment-instructions.md.deploy.yamldownloadt de artifact en uploadt de inhoud via eenscp-commando (metsshpassvoor het wachtwoord) in een gewone shell-stap naar de webserver-Pi op het interne netwerk (192.168.1.103, poort2224). Dit vervangt de eerdereappleboy/scp-action(Docker-container-action), die faalde op de zelf-gehoste Podman-runner (failed to attach to container: unable to upgrade to tcp, received 409).- nginx op de webserver-Pi serveert de bestanden vanaf
/mnt/storage1/www/html/test/slpsoftware; de reverse-proxy-Pi stuurt binnenkomend verkeer door naar deze webserver-Pi. Voorbeeldconfiguraties staan inoperations/deployment/nginx/en zijn de daadwerkelijk in gebruik zijnde configuraties (niet langer illustratieve concepten). - De reverse-proxy-Pi is ook verantwoordelijk voor SSL: certificaten worden net als voorheen aangevraagd via certbot (Let's Encrypt) en HTTP-verkeer wordt doorverwezen naar HTTPS.
Environments
- Test (geautomatiseerd, altijd): zoals hierboven beschreven. Draait automatisch bij elke merge naar
masteren bij elke handmatigeworkflow_dispatch-run. Domeinnaam:test.slpsoftware.nl(SSL via certbot op de reverse-proxy-Pi). - Productie (geautomatiseerd, opt-in): via een eigen
build-production- endeploy-production-job incontinuous_integration.yaml, diedeploy.yamlaanroepen metenvironment: production. In tegenstelling tot de testdeploy draait dit niet automatisch bij een push naarmaster— alleen wanneer je de workflow handmatig start viaworkflow_dispatchmét hetdeploy_production-vinkje aangevinkt. Dit is bewust: zo kan niemand per ongeluk productie deployen door simpelweg naarmasterte pushen. Reden voor een apartebuild-production-job (in plaats van hetzelfde artifact als de testbuild te hergebruiken):VITE_APP_ENVis een build-time Vite-variabele, dus één bundel kan niet tegelijk alstesténproductiongetagd zijn in Sentry/analytics. Domeinnaam:slpsoftware.nl(SSL eveneens via certbot). Productie-nginx-voorbeeldconfiguratie:nginx/production-nginx.conf.example(vóór certbot) ennginx/production-nginx.conf.post-certbot.example(referentie, hoe het bestand er na certbot uitziet) — dekt alléén de react-frontend-site; de daadwerkelijke productieserver regelt op hetzelfde domein ook mail/iRedAdmin-proxying, wat buiten de scope van deze feature valt. Vereist eenmalig de Gitea-variableDEPLOY_PATH_PRODUCTION(ziedeployment-instructions.md) — zonder deze faalt de upload.
Automation Level
Volledig geautomatiseerd voor de testomgeving: build, test, lint én upload naar de test-Pi gebeuren zonder handmatige tussenstap, zodra er gemerged wordt naar master (of handmatig getriggerd wordt). Productie is ook geautomatiseerd, maar alleen als bewuste, expliciete actie (handmatige workflow_dispatch met het deploy_production-vinkje) — nooit automatisch bij een push.
Rollback Strategy
Zie rollback-plan.md — voor de testomgeving kan een eerdere commit/branch opnieuw gebouwd en geüpload worden door de workflow opnieuw te triggeren.
Secrets & Configuration
Voor de testomgeving zijn de volgende Gitea Actions Secrets (repository-niveau) vereist:
PI_MAIN_HOST—192.168.1.103(intern IP van de webserver-Pi)PI_MAIN_PORT—2224PI_MAIN_USERNAME—webadminPI_MAIN_PASSWORD— het SSH-wachtwoord van deze gebruiker
Deze secrets heten bewust PI_MAIN_* in plaats van PI_TEST_*: alle webhosts gebruiken op dit moment dezelfde inloggegevens (dezelfde Pi), dus de naam is niet omgeving-specifiek. Mocht dat in de toekomst veranderen, dan worden alsnog omgeving-specifieke secrets geïntroduceerd.
Dit is bewust wachtwoord-authenticatie (voor nu, zoals gekozen), zodat de testomgeving snel werkend is. Zie "Future Work" in deployment-instructions.md voor de overstap naar SSH-key-authenticatie.
Resolved Item — Productie-deploy Geautomatiseerd
continuous_integration.yaml bevat nu een build-production- en deploy-production-job, alleen actief bij een handmatige workflow_dispatch-run met het deploy_production-vinkje aangevinkt (zie "Environments" hierboven). Aangezien de webhost (Pi Main) dezelfde blijft als de testomgeving, worden de bestaande PI_MAIN_* secrets hergebruikt — pas dit pas aan naar omgeving-specifieke secrets als productie daadwerkelijk op een andere host komt. Domeinnaam (slpsoftware.nl) en SSL-aanpak (certbot/Let's Encrypt op de reverse-proxy-Pi) liggen al vast; zie nginx/production-nginx.conf.example / nginx/production-nginx.conf.post-certbot.example voor de voorbeeldconfiguratie (react-frontend-only, geen mail/iRedAdmin). Voordat dit voor het eerst gebruikt wordt, moet de Gitea-variable DEPLOY_PATH_PRODUCTION nog worden aangemaakt (zie deployment-instructions.md) — zonder deze faalt de upload.
Verified Build Prerequisite
Dit plan bouwt voort op de Build and Test-stage (construction/build-and-test/build-and-test-summary.md): pnpm run build produceert een statische dist/-bundel zonder server-side vereisten, geschikt om direct door nginx geserveerd te worden.