# 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//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' '' | 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','',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 | `@` | `` | 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) | `._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 `` 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.**