Saleor Store
우리 컬렉션을 쇼핑하세요
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Plateforme d'exploration des ventes immobilières aux enchères judiciaires en France. L'application aide l'investisseur à décider jusqu'à combien enchérir : pour chaque bien, un assistant calcule une mise plafond à partir du marché local (DVF), des frais, des travaux et d'une marge de sécurité, avec la localisation Mapbox et les documents officiels.README 전문 보기 ↗
Plateforme d'exploration des ventes immobilières aux enchères judiciaires en France. L'application aide l'investisseur à décider jusqu'à combien enchérir : pour chaque bien, un assistant calcule une mise plafond à partir du marché local (DVF), des frais, des travaux et d'une marge de sécurité, avec la localisation Mapbox et les documents officiels.
Le dépôt réunit deux briques :
| Brique | Dossier | Stack | Rôle |
|---|---|---|---|
| Application web | racine (src/) | Next.js App Router · React 19 | Front + API serveur consommés par l'investisseur |
| Pipeline de données | services/data-pipeline/ | Python 3.12 | Scraping → normalisation → déduplication → Supabase |
>=24.15.0 <25, voir .nvmrc — nvm use) et npm 11 (>=11.18.0 <12) :
.npmrc active engine-strict=true, donc npm install / npm ci refusent une autre version de Node.
Le npm livré avec Node peut être plus ancien : npm install --global [email protected] (version épinglée par la CI
et par vercel.json). npm run check:versions vérifie que .nvmrc, .node-version, engines, la CI,
vercel.json et l'image Playwright de la CI concordent.npm install
cp .env.example .env.local # puis renseigner les variables (voir ci-dessous)
npm run dev # http://localhost:3000
npm run dev:ready est une alternative qui attend que Next.js et les routes SSR
répondent réellement avant d'afficher l'URL. Pour préchauffer une annonce :
npm run dev:ready -- --warm-path /sales/<uuid>
Le circuit commun de lecture est src/lib/env.ts (validé par zod : valeurs nettoyées, une
valeur vide vaut « non définie »), mais plusieurs modules lisent encore process.env directement. La liste des
variables facultatives, de leurs valeurs par défaut et des constantes qui n'en sont pas (pépites, inondation,
loyers, essai) est dans docs/reference/variables-environnement.md.
| Variable | Requis | Description |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | ✅ | Nom canonique. URL du projet Supabase (https://xxx.supabase.co) |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | ✅ | Nom canonique. Clé anon / publishable (publique, côté client). Repli historique : NEXT_PUBLIC_SUPABASE_ANON_KEY |
SUPABASE_SECRET_KEY | ✅ | Clé serveur Supabase pour les API routes, ou SUPABASE_SERVICE_ROLE_KEY sur les projets legacy |
SUPABASE_DB_URL | ✅ | URL Postgres directe pour les migrations. Replis acceptés : POSTGRES_URL_NON_POOLING, POSTGRES_URL |
CRON_SECRET | ✅ | Secret des routes Vercel Cron et de POST /api/pipeline/revalidate-sale (invalidation du cache d'une fiche par le pipeline) |
SITE_URL | ✅ | Nom canonique. Origine canonique publique (https://immojudis.com). Replis : NEXT_PUBLIC_SITE_URL, NEXT_PUBLIC_APP_URL, APP_URL. VERCEL_URL n'est plus acceptée seule en production (garde-fou de build) |
RESEND_API_KEY | ✅ | Clé serveur Resend pour envoyer les alertes email consenties et les emails aux avocats référencés |
ALERT_EMAIL_FROM | ✅ | Expéditeur vérifié Resend, par exemple Immojudis <[email protected]> |
NEXT_PUBLIC_LEGAL_* | ✅ | Mentions légales : ENTITY_NAME, ENTITY_FORM, ENTITY_ADDRESS, REGISTRATION, PUBLICATION_DIRECTOR, CONTACT_EMAIL, CONTACT_PHONE, MEDIATOR_NAME, MEDIATOR_ADDRESS, MEDIATOR_WEBSITE. Le build de production échoue si l'une manque |
ADMIN_MFA_REQUIRED |
Les variables
NEXT_PUBLIC_*sont inlinées au moment du build (et lesVITE_SUPABASE_*encore présentes y sont recopiées parnext.config.ts). En production (Vercel) elles doivent être présentes dans Project Settings → Environment Variables et suivies d'un redéploiement. Ne retirez lesVITE_*qu'après ce redéploiement : tant qu'elles sont la seule source en production, les supprimer coupe la connexion à la base. Voirdocs/vercel_setup.mdpour la configuration complète (Auth, secrets CI, runner admin).
npm run env:check:prodvérifie les groupes de variables nécessaires aux API serveur et aux migrations avant un déploiement complet. Si Vercel marque des variables comme sensibles, leurs valeurs peuvent rester illisibles localement : le check valide alors leur présence déclarée, maisnpm run db:migrateexige toujours une URL Postgres réellement disponible.⚠️ Ne jamais exposer
SUPABASE_SECRET_KEYouSUPABASE_SERVICE_ROLE_KEYcôté front : elles contournent la RLS.
La page /sales utilise Mapbox GL JS pour la carte interactive : source
GeoJSON, clusters natifs, marqueurs de prix, popups enrichies et synchronisation
de la bbox avec la liste de biens. Les mini-cartes affichées ailleurs dans le
site utilisent Mapbox Static Images pour rester rapides et économes en JavaScript.
Le filtre "autour d'une adresse" utilise Mapbox Geocoding v6 en priorité
(country=fr, language=fr, types=address,street,postcode,place,locality,neighborhood),
puis l'API adresse française en secours.
Configurez NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN et, si besoin,
NEXT_PUBLIC_MAPBOX_STYLE. Le style par défaut est mapbox/streets-v12.
Les vues cartographiques et leurs replis utilisent exclusivement les services
Mapbox configurés pour l'application.
| Script | Effet |
|---|---|
npm run dev | Serveur de dev Next.js (HMR) |
npm run dev:ready | Dev + attente que le client et le SSR répondent |
npm run build | Build de production pur (validation des variables puis compilation Next.js) |
npm run preview | Smoke-test du build |
npm run test | Tests unitaires Vitest |
npm run lint | ESLint (flat config) |
npm run env:check:prod | Vérifie les variables nécessaires aux API prod + migrations |
npm run db:migrate | Applique les migrations Supabase en attente (SUPABASE_DB_URL, POSTGRES_URL_NON_POOLING ou POSTGRES_URL) |
npm run check:schema-drift | Vérifie que le schéma Supabase correspond exactement aux migrations versionnées |
npm run check:versions | Vérifie la cohérence des versions de Node, de npm et de l'image Playwright (CI) |
npm run ops:health-scheduler:configure | Chiffre dans Vault l'URL et le secret du contrôle de santé toutes les 15 minutes |
npm run valuation:publish | Publie explicitement les modèles de valorisation |
npm run release:prepare | ÉCRIT EN PRODUCTION : applique les migrations, reconfigure Vault, publie les modèles (confirmation requise) |
npm run format | Prettier (écriture) |
immojudis/
├─ src/ # Application web (Next.js App Router)
│ ├─ app/ # Routes Next.js (/, /sales, /sales/[id], /publish, /admin…)
│ ├─ routes/ # Reste : les 3 documents juridiques (empreinte SHA-256 à ré-ancrer, voir P6-01)
│ ├─ components/ # Composants UI + localisation (SaleLocationHero, MapThumbnail…)
│ ├─ lib/ # Métier : queries Supabase, format, géo, surface, tiles
│ ├─ hooks/ # Hooks React
│ ├─ integrations/ # Client Supabase et intégrations
│ └─ types/ # Types partagés
├─ services/data-pipeline/ # Pipeline Python (scraping → Supabase) — voir son README
├─ supabase/migrations/ # Migrations SQL versionnées
├─ sql/ # Scripts d'amorçage à exécuter dans Supabase (vercel_app_setup.sql)
├─ docs/ # Documentation (index : docs/README.md) : déploiement, ops, runbooks, référence
├─ scripts/ # Outils de dev (dev-ready)
└─ .github/workflows/ # CI (ci.yml) et workflows d'exploitation, de collecte et de migrations
Le front lit public.v_auction_sales_app_preview pour l'aperçu public limité,
puis public.v_auction_sales_app pour les comptes connectés. Les détails
d'annonce, documents, risques, cartes et tables user_favorites / user_alerts
sont protégés par RLS. L'amorçage d'un nouveau projet se fait via
sql/vercel_app_setup.sql ; l'historique des
évolutions vit dans supabase/migrations/ et s'applique
avec le workflow GitHub Apply Supabase Migrations ou npm run db:migrate.
Les droits admin reposent sur auth.users.raw_app_meta_data.role = admin.
Le scraper Python collecte les ventes judiciaires publiques (Avoventes en source
prioritaire, sources publiques complémentaires en croisement), normalise,
dédoublonne, géocode, enrichit puis insère dans Supabase. Il tourne via GitHub Actions
(data-pipeline.yml) et peut être déclenché depuis /admin. Détails et
installation : services/data-pipeline/README.md.
Cible : Vercel (preset Next.js). Renseigner les variables
d'environnement dans le projet Vercel puis déployer. Procédure complète (Auth
Supabase, secrets CI, runner de scroll admin) : docs/vercel_setup.md.
Les SLO, dashboards et runbooks d'exploitation sont dans
docs/operations-phase-3.md. La corrélation, la télémétrie Vercel et
la sonde de production sont détaillées dans docs/operations-phase-5.md.
La gouvernance Phase 6 est décrite dans
docs/compliance-phase-6.md, avec le
registre RGPD et la
matrice de conservation.
Le build ne modifie plus la base et ne publie plus de modèle. Exécuter
npm run release:prepare dans une étape de release explicitement autorisée,
puis npm run build dans l'étape de compilation.
⚠️
npm run release:prepareécrit en production : il enchaînedb:migrate(migrations Supabase),ops:health-scheduler:configure(Vault) etvaluation:publish(modèles de valorisation) sur la base désignée parSUPABASE_DB_URL,POSTGRES_URL_NON_POOLINGouPOSTGRES_URL. Il n'est pas réversible et ne se lance ni pour « essayer » ni depuis un poste de développement. Il affiche la base ciblée et demande de taperproduction; sans terminal interactif, il fautRELEASE_PREPARE_CONFIRM=production. Une migration et le code qui en dépend partent ensemble : voirsupabase/README.md.
À chaque push / PR sur main (.github/workflows/ci.yml) :
Les travaux tournent en parallèle ; le travail agrégé « Web (typecheck + lint) » échoue si l'un des travaux web échoue ou est annulé.
npm run check:manual-collection (aucune planification concurrente de la collecte)tsc --noEmit ;npm run lint + npm run knip ;npm run test + npm run test:security-invariants ;npm audit --omit=dev --audit-level=high + npm run check:secrets ;npm run build + npm run build:budgets (budgets de rendu serveur, de JavaScript et de médias)ruff check + pytest + pip-audit des fichiers de
dépendances ; le travail nommé « Data pipeline (Python 3.11) » n'est plus qu'une porte historique de la
protection de branchemain (npm run check:migrations -- --base-ref=origin/main en local, après
git fetch origin main), rejeu depuis zéro, types générés à jour (non bloquant), dérive de schéma, test de
concurrence des quotas, tests pgTAP (supabase test db), catalogue public en HTTP, intégration de l'agent
d'informationnpm run test:e2e (Playwright, image officielle du conteneur)Les vérifications avant de livrer du code sont dans CLAUDE.md.
| ✅ |
Doit valoir true en production (second facteur obligatoire pour l'administration). Le build de production échoue sinon |
ALLOW_INCOMPLETE_LAUNCH_CONFIG | ➖ | Échappatoire temporaire. true transforme en avertissements très visibles les erreurs du build de production sur les mentions légales et ADMIN_MFA_REQUIRED (jamais l'absence d'origine canonique, toujours bloquante). Le déploiement n'est alors pas conforme : à retirer dès que les valeurs sont fournies |
EMAIL_UNSUBSCRIBE_SECRET | ➖ | Secret de signature des liens de désinscription. Repli, dans l'ordre : SUPABASE_SERVICE_ROLE_KEY, puis SUPABASE_SECRET_KEY (ne pas changer la clé retenue : cela invaliderait les liens déjà envoyés) |
SALE_REMINDERS_MODE | ➖ | Rappels d'audience (J-7, J-1) et avertissements graves par email : off (défaut, rien n'est envoyé), internal (administrateurs seulement, pour mesurer les fausses alertes) ou on. Voir docs/operations/planification.md |
WEEKLY_DIGEST_MODE | ➖ | Récapitulatif hebdomadaire « Ma semaine » par email : off (défaut), internal (administrateurs seulement) ou on. À n'ouvrir qu'après mise à jour de la politique de confidentialité et du registre |
SALE_RESULTS_MODE | ➖ | Alerte de résultat ou de remise en vente d'une vente suivie par email (jamais de prix) : off (défaut), internal ou on. Mêmes conditions d'ouverture que WEEKLY_DIGEST_MODE |
NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN | ➖ | Token public Mapbox utilisé par Mapbox GL JS et les mini-cartes statiques. |
NEXT_PUBLIC_MAPBOX_STYLE | ➖ | Style Mapbox, par exemple mapbox/streets-v12 ou mapbox://styles/<user>/<style>. |
GITHUB_SCROLL_TOKEN | ➖ | PAT GitHub fine-grained pour déclencher le workflow data-pipeline.yml depuis /admin. |
OPERATIONS_ALERT_WEBHOOK_URL | ➖ | Webhook HTTPS externe prioritaire pour les incidents opérationnels. |