Adding a New Practice Website¶
Step-by-step guide for adding a new dental practice to the Helios platform.
Estimated time: 2-3 hours (infrastructure + configuration) + content creation time.
Prerequisites¶
- Practice exists in Aletheia (Practice model with address, phone, hours, team)
- Practice internal code chosen (3-letter code, e.g.,
cda,vsm,pds) - Production domain decided (e.g.,
cabinet-dentaire-aubagne.fr) - Brand colors chosen (primary hue/chroma, accent hue/chroma)
1. Aletheia — Create SiteConfig¶
In Aletheia's /websites/config/:
- Create SiteConfig for the practice:
- Domain: the production domain (e.g.,
nouveau-cabinet.fr) - City name: for SEO URL generation
- Primary hue/chroma + accent hue/chroma
- Enabled locales (default:
["fr"]) - Enabled services (e.g.,
["implantologie", "esthetique", "parodontologie"]) -
Meta title template + default description
-
Add core model data (if not already in Aletheia):
- Dentist photos (
photofield) - Dentist slugs (auto-generated)
- Dentist display_order on DentistContract
- Practice logo
- WhatsApp number (if applicable)
2. Aletheia — Create Pages & Content¶
In Aletheia's /websites/pages/:
Required pages (minimum for launch)¶
| Page | Template | Slug | Notes |
|---|---|---|---|
| Homepage | homepage |
accueil |
Hero + text + stats blocks minimum |
| Contact | contact |
contact |
Hero + contact_form block |
| Mentions légales | legal |
mentions-legales |
Legal text |
| Politique de confidentialité | legal |
politique-confidentialite |
Privacy policy |
Service pages (per enabled service)¶
| Page | Template | Slug pattern |
|---|---|---|
| Service hub (L1) | service_hub |
{service}-{ville}/ (e.g., implant-dentaire-aubagne) |
| Service detail (L2) | service_detail |
{service}-{ville}/{treatment}/ |
Recommended pages¶
| Page | Template | Slug |
|---|---|---|
| Notre philosophie | cabinet |
cabinet/notre-philosophie |
| Nos technologies | cabinet |
cabinet/nos-technologies |
| Tarifs | cabinet |
cabinet/tarifs |
| Accès & informations | cabinet |
cabinet/acces-informations |
| Résultats | results |
resultats |
"Votre Besoin" pages¶
Create PatientNeed entries and corresponding pages with M2M links to service pages.
3. Aletheia — Create Navigation¶
The navigation tree is auto-generated from:
- ServiceCategory entries (for "Nos Soins" dropdown)
- PatientNeed entries (for "Votre Besoin" dropdown)
- Published pages with specific templates (for "Le Cabinet" dropdown)
Verify navigation at: GET /api/v1/websites/sites/{domain}/nav/
4. Helios — Add Domain Mapping¶
src/lib/practices.ts — Single source of truth¶
Add one entry to the PRACTICES array:
export const PRACTICES: PracticeConfig[] = [
// ...existing...
{ code: "nvc", slug: "nouveau-cabinet", domain: "nouveau-cabinet.fr" },
];
This automatically registers the practice in both proxy.ts (domain routing + redirects) and api.ts (API domain resolution). All hostname variants (nvc.groupe-suffren.com, nvc-staging, nvc-dev, nvc.local, www.nouveau-cabinet.fr) are derived from the code and domain.
src/app/robots.ts + src/app/layout.tsx — PRODUCTION_DOMAINS¶
Add the production domain to the whitelist (when going live):
const PRODUCTION_DOMAINS = [
"cabinet-dentaire-aubagne.fr",
// ...existing...
"nouveau-cabinet.fr", // ← ADD
];
5. Infrastructure — DNS¶
OVH DNS (groupe-suffren.com zone)¶
If using wildcard *.groupe-suffren.com → no action needed.
If not, add A records:
| Type | Name | Value |
|---|---|---|
| A | nvc |
54.36.99.184 |
| A | nvc-staging |
54.36.99.184 |
| A | nvc-dev |
54.36.99.184 |
Production domain DNS (at domain registrar)¶
When ready to go live:
| Type | Name | Value |
|---|---|---|
| A | @ |
54.36.99.184 |
| CNAME | www |
nouveau-cabinet.fr |
6. Infrastructure — Nginx¶
Aether nginx/conf.d/ (/opt/docker/aether/repo/)¶
Add the new domains to the Helios nginx vhost server_name directives:
helios-prod.conf.full: add nouveau-cabinet.fr www.nouveau-cabinet.fr nvc.groupe-suffren.com
helios-staging.conf.full: add nvc-staging.groupe-suffren.com
helios-dev.conf.full: add nvc-dev.groupe-suffren.com
Then deploy nginx configs:
SSL certificate¶
Add the new domains to the Helios cert:
docker exec nginx-proxy certbot certonly --webroot -w /var/www/certbot \
--cert-name helios \
--expand \
-d nouveau-cabinet.fr \
-d www.nouveau-cabinet.fr \
-d nvc.groupe-suffren.com \
-d nvc-staging.groupe-suffren.com \
-d nvc-dev.groupe-suffren.com
Or if using wildcard *.groupe-suffren.com, only add the production domain.
7. Deploy¶
# Commit Helios changes
cd ~/coding/helios/helios_test2
git add -A && git commit -m "Add [practice name] practice" && git push
# Deploy to server
# Dev first:
ssh server "cd /opt/docker/helios/repo && git pull && ./deploy.sh dev"
# Then staging, then prod
8. Verify¶
Pre-launch checklist¶
- [ ] Homepage loads at
https://nvc-dev.groupe-suffren.com/ - [ ] All nav links work (no 404s)
- [ ] Contact form submits successfully
- [ ] Team page shows correct practitioners
- [ ] Service pages have content
- [ ] Footer shows correct hours, address, phone
- [ ] SEO: meta titles correct on all pages
- [ ] SEO:
robots.txtallows crawling on production domain - [ ] SEO:
sitemap.xmllists all published pages - [ ] Schema.org: test with Google Rich Results Test
- [ ] Mobile: nav works, bottom dock shows, responsive layout
- [ ] Performance: Lighthouse > 90
DNS cutover (go live)¶
- [ ] Point production domain DNS to server
- [ ] SSL cert covers production domain
- [ ] Add production domain to nginx
server_name - [ ] Add to
PRODUCTION_DOMAINSin robots.ts + layout.tsx - [ ] Verify
robots.txtallows crawling - [ ] Submit sitemap to Google Search Console
- [ ] Set up 301 redirects from old site URLs (if migrating)
- [ ] Monitor for 2 weeks post-launch
Quick Reference — Files to Edit¶
| File | What to add |
|---|---|
src/lib/practices.ts |
Practice entry (code, slug, domain) — drives both proxy.ts and api.ts |
src/app/robots.ts |
PRODUCTION_DOMAINS (when going live) |
src/app/layout.tsx |
PRODUCTION_DOMAINS (when going live) |
Aether nginx/conf.d/helios-*.conf.full |
server_name domains |