Eerste commit voor Helvoirt Gevelreiniging

This commit is contained in:
Joery Disselhof
2026-08-26 13:57:08 +02:00
commit 276dba07a2
225 changed files with 23121 additions and 0 deletions
+104
View File
@@ -0,0 +1,104 @@
# Go-live checklist — Helvoirt Gevelreiniging
Concrete, kant-en-klare stappen om de site live te zetten op `helvoirtgevelreiniging.nl`.
De **code-laag is af + gedeployed** (preview: `https://helvoirt-gevelreiniging.mike-197.workers.dev`);
hieronder staat alleen wat nog **externe input/toegang** vereist. Achtergrond: `newsite.md` §12.
> **Windows/corporate, elke `astro`/`wrangler`-call:** zet eerst
> `$env:NODE_OPTIONS="--use-system-ca"` (+ `$env:CLOUDFLARE_ACCOUNT_ID="41972f4905f2c83f51111b80283e030b"`
> voor wrangler). Tools via `node node_modules/<tool>/bin/...`.
---
## Vooraf aanleveren (collega / klant)
- **Mailbox** `info@helvoirtgevelreiniging.nl`: wachtwoord + SMTP-host (bv. `mail.helvoirtgevelreiniging.nl`,
poort 465) + DKIM-record uit DirectAdmin. (Collega maakt het account aan.)
- **DNS-toegang**: nameservers naar Cloudflare (collega) → de zone `helvoirtgevelreiniging.nl`
verschijnt in het account. Voor DNS-records: dashboard of een API-token met **Zone.DNS:Edit**.
- **SEO-partij e-mailadres(sen)** voor de CMS-login.
- **Klantcontent**: echte e-mail/KvK/BTW/openingstijden, Google-reviews + URL + score, FAQ-teksten,
foto's, evt. GTM-container-ID en eigen logo.
---
## 1. Mail-secret zetten (na mailbox)
Het wachtwoord is het **enige** geheim. **Via bash `printf`**, nooit via PowerShell-pipe (BOM → 535).
```bash
printf '%s' '<mailbox-wachtwoord>' | NODE_OPTIONS=--use-system-ca \
node node_modules/wrangler/bin/wrangler.js secret put CONTACT_SMTP_PASS
```
Wijkt host/gebruiker/inbox af van de defaults (`mail.helvoirtgevelreiniging.nl`,
`info@helvoirtgevelreiniging.nl`)? Zet dan ook `CONTACT_SMTP_HOST` / `CONTACT_SMTP_USER` /
`CONTACT_EMAIL_TO` als secret/var. **Testen** (na deploy): doe een test-aanvraag op `/contact` en kijk
in `wrangler tail` naar `[contact] mail-sent melding-klant` + `bevestiging-aanvrager`. Ruim de testrij
op uit `contact_submissions`.
## 2. CMS-gebruiker SEO-partij aanmaken
```powershell
$ulid = node --input-type=module -e "import {ulid} from 'ulidx'; console.log(ulid())"
node node_modules/wrangler/bin/wrangler.js d1 execute helvoirt-db --remote --command `
"INSERT INTO users (id, email, role, email_verified, disabled, created_at, updated_at) VALUES `
('$ulid','<email-lowercase>',40,1,0,strftime('%Y-%m-%dT%H:%M:%fZ','now'),strftime('%Y-%m-%dT%H:%M:%fZ','now'))"
```
Rol 40 = EDITOR (content + SEO, geen gebruikers/instellingen), 50 = ADMIN. Inloggen daarna via
`/_emdash/admin/login` → "Sign in with email link" (magic-link werkt zodra stap 1 gezet is).
## 3. Domein koppelen ✅ GEDAAN (17-06-2026) — site live op https://helvoirtgevelreiniging.nl
> Zone actief, `routes` toegevoegd + rebuild + deploy gedaan; apex+www live, www→apex + http→https werken.
> Hieronder ter referentie wat er is gebeurd:
Voeg dit blok toe aan **`wrangler.jsonc`** (naast `main`/`compatibility_date`):
```jsonc
"routes": [
{ "pattern": "helvoirtgevelreiniging.nl", "custom_domain": true },
{ "pattern": "www.helvoirtgevelreiniging.nl", "custom_domain": true }
],
```
**Daarna VERPLICHT rebuilden** (de adapter genereert `dist/server/wrangler.json`; zonder rebuild
deployt wrangler stale config):
```powershell
$env:NODE_OPTIONS="--use-system-ca"; $env:CLOUDFLARE_ACCOUNT_ID="41972f4905f2c83f51111b80283e030b"
node node_modules/astro/bin/astro.mjs build
node node_modules/wrangler/bin/wrangler.js deploy
```
> ⚠️ Voeg de routes pas toe **als de zone bestaat**, anders faalt de deploy. Tot dan blijft
> `wrangler.jsonc` zonder `routes` (preview op `*.workers.dev`).
## 4. Mail-DNS (dashboard of Zone.DNS:Edit-token)
| Type | Naam | Waarde | Prio |
|---|---|---|---|
| MX | `@` | `<smtp-host, bv. mail.helvoirtgevelreiniging.nl>` | 10 |
| TXT (SPF) | `@` | `v=spf1 mx ~all` (of het SPF-record van de hoster) | — |
| TXT (DMARC) | `_dmarc` | `v=DMARC1; p=none; rua=mailto:info@helvoirtgevelreiniging.nl` | — |
| TXT (DKIM) | `<selector>._domainkey` | public key uit DirectAdmin | — |
MX = **DNS-only** (geen Cloudflare-proxy). Verifieer via DoH (corporate-DNS blokkeert poort 53):
`curl -sk "https://dns.google/resolve?name=helvoirtgevelreiniging.nl&type=MX"`.
## 5. HTTPS / security (dashboard)
- **SSL/TLS → Edge Certificates → Always Use HTTPS** aan, daarna **HSTS** aan.
- **SSL-modus** op **Full (strict)** (niet Flexible → redirect-loop).
- `src/middleware.ts` doet al http→https + www→apex (301); security-headers staan in `public/_headers`.
## 6. Verifiëren (corporate-DNS resolvet het nieuwe domein niet → forceer CF-IP)
```powershell
$ip = (Invoke-RestMethod "https://dns.google/resolve?name=helvoirtgevelreiniging.nl&type=A").Answer[0].data
curl.exe -sk --resolve helvoirtgevelreiniging.nl:443:$ip https://helvoirtgevelreiniging.nl/
```
Checklist: homepage 200 · `/sitemap.xml` (root-URL's, incl. CMS-locaties) · `/robots.txt` ·
`www` → apex 301 · `http` → `https` 301 · JSON-LD in de head · contactformulier → 2× mail.
## 7. Klantcontent in het CMS (Instellingen)
Echte e-mail/KvK/BTW/openingstijden, Google-reviews + URL + score, **GTM-container-ID** (wordt
automatisch in de `<head>` gezet), evt. OG-image/logo. Daarna: Search Console + sitemap indienen +
PageSpeed-meting.
---
### Status van de code-laag (af, 17-06-2026, deploy ná OG/JSON-LD-pass)
✅ robots.txt · sitemap.xml (vaste routes + live CMS-`paginas`/`locaties`) · `site:` in config ·
JSON-LD `HomeAndConstructionBusiness` (site-breed) + `Service`/`BreadcrumbList` (dienstpagina's) ·
GTM-renderblok · gebrande 1200×630 OG-image · privacy/voorwaarden + footer-links ·
mail (`lib/smtp.ts` + `contact.ts` → D1 `contact_submissions` + 2 mails) · magic-link-plugin ·
middleware (http→https/www→apex) · `_headers` (caching + security).
**Open = alleen bovenstaande externe stappen + optioneel: CMS-migratie Wave 3/2b, self-hosted fonts,
Lighthouse-meting, checklist.xlsx.**