Aller au contenu

Migration Checklist (per practice)

Reusable template for migrating a dental practice from an existing site to Helios.

Pre-requisites: Helios platform deployed, practice exists in Aletheia (Practice model with address, phone, hours, team), SiteConfig created.


Phase 1 — Content Extraction

1-2 weeks before cutover. Owner: Claude + manual review.

  • [ ] 1.1 Crawl existing site
  • Run: npx tsx scripts/crawl-site.ts https://{domain} migrations/{code}/
  • Output: migrations/{code}/crawl.json (all pages with URL, title, meta, H1, body text, images, word count)
  • Visually review key pages (homepage, services, contact) in browser for layout/content nuances

  • [ ] 1.2 Build redirect map

  • From crawl data, map each old URL to its new Helios URL
  • Output: migrations/{code}/redirects.json ({ "/old-path": "/new-path" })
  • For Drupal: /node/XX/service-ville/ (full URL change)
  • For WordPress: many URLs may stay the same or similar (low risk)

  • [ ] 1.3 Assess content quality

  • Review migrations/{code}/content-assessment.md (auto-generated by crawl script)
  • Per page, annotate verdict column: reuse / rewrite / skip
  • Flag thin content (< 100 words), missing images, outdated info

  • [ ] 1.4 Verify Aletheia data completeness

  • Check: GET /sites/{domain}/practice/ — address, phone, hours, access info, parking, transit
  • Check: GET /sites/{domain}/team/ — all dentists have photos, bios, skills, booking URLs
  • Check: GET /sites/{domain}/config/ — theme colors, logo, favicon, SEO settings
  • Flag gaps → fix in Aletheia before Phase 2

  • [ ] 1.5 Upload missing assets

  • Team photos, case study before/after images, cabinet gallery photos
  • Upload via Aletheia /web/ editor (auto-processed to WebP + responsive srcset)

Phase 2 — Build & QA

1 week before cutover. Owner: Aletheia (content) + Helios (config) + manual QA.

  • [ ] 2.1 Create all pages in Aletheia
  • Minimum pages: homepage, contact, mentions-legales, politique-confidentialite
  • Service pages: one hub (L1) + details (L2) per enabled service
  • Cabinet pages: philosophie, technologies, tarifs, acces
  • Votre-besoin pages linked to services
  • Use content verdicts from 1.3 — paste reusable content, rewrite flagged pages

  • [ ] 2.2 Configure navigation

  • Verify: GET /sites/{domain}/nav/ — all items present, correct URLs, proper nesting
  • Check dropdowns: Le Cabinet, Nos Soins, Votre Besoin

  • [ ] 2.3 Verify theme on staging

  • Visit {code}-staging.groupe-suffren.com
  • Check: colors, fonts, logo, hero images, overall visual quality

  • [ ] 2.4 Add redirect map to proxy.ts

  • Import migrations/{code}/redirects.json into proxy.ts
  • Test redirects locally: curl -I localhost:3000/old-path → 301 to new path

  • [ ] 2.5 QA all pages

  • Visit every page on staging
  • Check: content renders, images load, nav works, footer correct (hours, address, phone)
  • Check: CTAs link correctly, contact form submits, map shows with correct pin
  • Check: mobile responsive, bottom dock visible

  • [ ] 2.6 Lighthouse audit

  • Run on homepage + 2-3 key service pages
  • Target: Performance > 90, Accessibility > 95, SEO > 95
  • Fix issues before cutover

  • [ ] 2.7 Schema.org validation

  • Google Rich Results Test on: homepage (Dentist/LocalBusiness), service page (FAQPage), team member (Dentist)
  • Fix invalid/missing structured data

  • [ ] 2.8 Set up analytics

  • Create site in Umami for this practice domain
  • Set NEXT_PUBLIC_UMAMI_WEBSITE_ID in env files
  • Verify tracking script loads on staging

Phase 3 — DNS Cutover (D-day)

Owner: infra + manual verification.

  • [ ] 3.1 Deploy to prod
  • ./deploy.sh prod {tag} — includes redirect map, domain config, all content
  • Verify Aletheia pages are published (not draft)

  • [ ] 3.2 Update DNS

  • Point production domain A record → 54.36.99.184
  • Add CNAME www → apex domain
  • (At domain registrar, not OVH)

  • [ ] 3.3 SSL certificate

  • Expand Helios cert: certbot --expand -d {domain} -d www.{domain}
  • Via nginx container on VPS

  • [ ] 3.4 Enable indexing

  • Add domain to PRODUCTION_DOMAINS in src/app/robots.ts + src/app/layout.tsx
  • Deploy. Until this step, new site has noindex.

  • [ ] 3.5 Test redirects

  • Run: scripts/test-redirects.sh migrations/{code}/redirects.json https://{domain}
  • Verify all old URLs return 301 → correct new URL
  • Check no redirect loops

  • [ ] 3.6 Submit sitemap

  • Google Search Console → Add property → Submit https://{domain}/sitemap.xml
  • Request indexing for homepage + key service pages

  • [ ] 3.7 Verify live site

  • Quick smoke test: homepage, nav links, contact form, team, services, mobile
  • Not full QA (done in Phase 2)

Phase 4 — Post-Migration Monitoring (2 weeks)

Owner: manual monitoring.

Task How Frequency
Monitor 404s Sentry alerts + Search Console crawl errors Daily (week 1), weekly (week 2)
Check rankings Search Console: impressions + clicks for key terms Weekly
Verify redirects Search Console Coverage: redirect issues Weekly
Core Web Vitals Search Console CWV report Weekly
Keep old site running Don't cancel old hosting for 30 days. DNS revert < 5 min. Rollback safety net

Quick Reference — Practice Migration Files

File Purpose
migrations/{code}/crawl.json Crawl output (all pages with metadata)
migrations/{code}/redirects.json Old URL → new URL redirect map
migrations/{code}/content-assessment.md Per-page content verdict (reuse/rewrite/skip)
proxy.ts Redirect map loaded here
docs/adding-a-practice.md Infrastructure setup steps (domain mapping, nginx, SSL)