Deploiement ERP sur Coolify (prod)
Ce guide production est detaille, commande par commande. Tous les exemples utilisent oben-services.com.
Resume rapide
- Prepare DNS (app, docs, supabase, studio optionnel, www optionnel).
- Cree la ressource Supabase (Coolify) et note
ANON_KEY. - Configure manuellement les variables Supabase pour aligner les domaines.
- Cree la ressource Frontend/Docs (Docker Compose).
- Configure les variables frontend + domaines + HTTPS.
- Deploie, puis verifie DNS/TLS + health checks.
- Pousse le schema + Edge Functions.
- Cree le premier Admin.
Avant de commencer
- VPS avec Coolify installe
- Acces DNS pour les sous-domaines
- Acces au repo Git prive
- Liste des URLs centralisee: voir
urls.md
Etape 1 - DNS (A records)
1.1 Creer les A records
Renseigne les A records vers l IP du VPS.
| Domaine | Type | Cible | Usage |
|---|---|---|---|
| oben-services.com | A | <IP_VPS> | Application |
| doc.oben-services.com | A | <IP_VPS> | Documentation |
| supabase.oben-services.com | A | <IP_VPS> | Supabase (Kong) |
| studio.supabase.oben-services.com | A | <IP_VPS> | Supabase Studio (optionnel) |
| www.oben-services.com | A | <IP_VPS> | Optionnel si --www |
1.2 Verifier la propagation DNS
dig +short oben-services.com
dig +short doc.oben-services.com
dig +short supabase.oben-services.com
dig +short studio.supabase.oben-services.com
dig +short www.oben-services.com
Attends la propagation si l IP ne remonte pas.
Etape 2 - Creer la ressource Supabase (Coolify)
- Projects -> ton projet -> Add Resource -> Supabase
- Domains:
kong->supabase.oben-services.com(port 8000)- (optionnel)
studio->studio.supabase.oben-services.com(port 3000)
- Note la cle
ANON_KEY
Etape 3 - Configurer les variables Supabase (manuel)
Coolify ne genere pas ces variables pour ton domaine. Ajoute-les dans la ressource Supabase.
3.1 Variables de domaine et CORS
Dans Coolify -> ressource Supabase -> Environment Variables:
SITE_URL=https://oben-services.com
GOTRUE_SITE_URL=https://oben-services.com
ALLOWED_ORIGINS=https://oben-services.com,https://www.oben-services.com
ALLOWED_REDIRECT_ORIGINS=https://oben-services.com,https://www.oben-services.com
ADDITIONAL_REDIRECT_URLS=https://oben-services.com/auth/set-password,https://www.oben-services.com/auth/set-password
URI_ALLOW_LIST=https://oben-services.com/auth/set-password,https://www.oben-services.com/auth/set-password
API_EXTERNAL_URL=https://supabase.oben-services.com
Si tu utilises www:
ALLOWED_ORIGINS=https://oben-services.com,https://www.oben-services.com
ADDITIONAL_REDIRECT_URLS=https://www.oben-services.com
GOTRUE_URI_ALLOW_LIST=https://www.oben-services.com
3.2 Variables SMTP (emails d invitation)
Renseigne tes credentials SMTP:
SMTP_ADMIN_EMAIL=admin@oben-services.com
SMTP_SENDER_NAME= OBEN SERVICES
SMTP_HOST=mail.infomaniak.com
SMTP_PORT=587
SMTP_USER=change-me
SMTP_PASS= <mot de passe d'application cree dans infomaniak manager>
Etape 4 - Creer la ressource Frontend/Docs
- Projects -> ton projet -> Add Resource -> Private Repository
- Build Pack = Docker Compose
- Compose file =
docker-compose.yml - Branche =
main(ou ta branche) - Save
Etape 5 - Configurer les variables Frontend/Docs
Dans Coolify -> ressource Frontend/Docs -> Environment Variables:
SUPABASE_PUBLIC_URL=https://supabase.oben-services.com
ANON_KEY=<TA_ANON_KEY>
Etape 6 - Configurer les domaines et HTTPS
- Service
erp_frontend->oben-services.com(port 80) - Service
erp_docs->doc.oben-services.com(port 80) - (Optionnel) ajoute
www.oben-services.comsurerp_frontend - Active HTTPS/Lets Encrypt pour chaque domaine
Etape 7 - Deployer
Clique Deploy sur les deux ressources.
Etape 8 - Verifs DNS, TLS et health checks
8.1 DNS
dig +short oben-services.com
dig +short doc.oben-services.com
dig +short supabase.oben-services.com
8.2 TLS
curl -Iv https://oben-services.com
curl -Iv https://doc.oben-services.com
curl -Iv https://supabase.oben-services.com
Tu dois voir un certificat valide (pas d erreur SSL).
8.3 Health checks HTTP
Frontend:
curl -I https://oben-services.com
curl -s https://oben-services.com/erp-config.js
Docs:
curl -I https://doc.oben-services.com
Etape 9 - Deployer le schema (migrations)
- Genere les bundles SQL (init clean + patch prod):
./scripts/build-supabase-sql-bundles.sh --prod-from 20260217000000
- Ouvre Supabase Studio -> SQL Editor.
- Pour une prod existante, colle
supabase/sql/prod-current/prod_patch_from_20260217000000.sqlpuis execute. - Pour une nouvelle instance, colle
supabase/sql/init/init_clean_all_patches.sqlpuis execute. - Verifie qu il n y a pas d erreur.
Etape 10 - Deployer les Edge Functions
- Depuis ta machine locale, copie tout le dossier
supabase/functions(tous les sous-dossiers +_shared) vers/root/supabase/functionsvia FileZilla (SFTP).
- Transformes les fichiers en directories dans Coolify.
- Depuis le terminal localhost dans Coolify:
mkdir -p /data/coolify/services/yowg4gg448oocsw0cgsc4cko/volumes/functions
rsync -avh --delete /root/supabase/functions/ /data/coolify/services/yowg4gg448oocsw0cgsc4cko/volumes/functions/
- Verifie qu au moins une fonction est presente (ex:
supabase/functions/main/index.ts):
test -f /root/supabase/functions/main/index.ts
ls -la /root/supabase/functions
- Coolify -> ressource Supabase -> service
functions:- Image/command par defaut (edge-runtime)
- Volumes -> Add volume:
- Host/Source:
/root/supabase/functions - Container/Destination:
/home/deno/functions - Mode:
read-only
- Host/Source:
Variable requise dans le service functions (sinon CORS/403 dans l app):
ALLOWED_ORIGINS=https://oben-services.com,https://www.oben-services.com
- Important: ne pas activer "Build from Git" sur ce service.
- Redeploie uniquement le service
functions. - Re-teste le endpoint
/hello:
ANON_KEY="<TA_ANON_KEY>"
curl -i https://supabase.oben-services.com/functions/v1/hello \
-H "Authorization: Bearer $ANON_KEY" \
-H "apikey: $ANON_KEY"
Etape 11 - Creer le premier Admin
L application est en acces par invitation. Il faut un premier compte Admin.
Option A - Acces a KONG via dashboard
- Connecte-toi au dashboard.
- Cree un user.
- Donne les droits admin via SQL Editor (source RBAC: table
public.access):- Ouvre Supabase Studio -> SQL Editor.
- Execute la commande suivante (remplace l email):
with target as (
select id, lower(trim(email)) as email
from auth.users
where lower(trim(email)) = lower(trim('user@exemple.com'))
limit 1
)
insert into public.access (email, user_id, role)
select target.email, target.id, 'Admin'
from target
on conflict (email)
do update set
user_id = excluded.user_id,
role = excluded.role,
updated_at = now();
Etape 12 - Initialisation des donnees de test locales
- Ouvre Supabase Studio -> SQL Editor.
- Colle le contenu de
supabase/seed_test_init.sqlpuis execute. - Verifie qu il n y a pas d erreur.
Ne pas executer cette initialisation en prod.
En prod, les donnees de demo sont gerees par migration:
- Client demo:
LamborghiRUN - Technicien demo:
John Doe - Perimetre: mois precedent complet + mois courant jusqu a aujourd hui
- Planification: job
pg_cronquotidien viapublic.refresh_demo_lamborghirun_data() - Compte client demo initial:
rapport.lamborghirun.demo@oben-services.test - Compte technicien demo initial:
john.doe.demo@oben-services.test - Aucun mot de passe de prod n est versionne dans le repo; si un acces interactif est necessaire, genere un lien de recuperation dans Supabase
Comptes de tests (tous avec le mot de passe admintest!):
| Role | |
|---|---|
| Admin | admin@test.com |
| Technicien | camille.soto@test.com |
| Manager | lucas.riviere@test.com |
| Technicien | nicolas.gerard@test.com |
| Technicien | sara.benali@test.com |
| Client | contact.garage-martin@test.com |
| Client | operations.mobilite-nova@test.com |
| Client | contact.atelier-horizon@test.com |
| Client | ops.flotte-atlas@test.com |
| Client | atelier.carrosserie-lumiere@test.com |