Wenlan
Wenlan은 소스 기반 AI 지식베이스·LLM 위키로, 문서·결정을 페이지화해 검색·검토·리뷰 가능
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Site statique + fonctions serverless Vercel (/api) + Supabase. Node.js 22+ est nécessaire.
| Fichier | Rôle |
|---|---|
index.html | Pages (connexion, liste, formulaire) |
style.css | Styles |
app.js | Logique client, appelle les endpoints /api/* |
api/bootstrap.js | Démarrage : devs, tâches non terminées et terminées des 30 derniers jours, en un appel |
api/login.js, api/logout.js | Connexion (limitée à 5 échecs par IP sur 15 min) et déconnexion |
api/tasks.js, api/tasks/[id].js | Création, modification (avec détection des modifications concurrentes), suppression ; pages de terminées anciennes |
api/devs.js, api/devs/[id].js | Devs : liste, ajout, renommage, suppression |
api/comments.js | Commentaires d'une tâche |
api/keepalive.js | Requête quotidienne (Vercel Cron) pour éviter la mise en pause du projet Supabase |
api/_lib/*.js | Client Supabase admin, session signée, retry, validation des tâches, erreurs |
build-config.mjs | Valide au build que les variables d'environnement requises sont présentes |
schema.sql | Tables, migrations, index et sécurité (RLS sans policy) — idempotent |
vercel.json | Build, région des fonctions, en-têtes de sécurité |
L'accès n'utilise plus Supabase Auth. La connexion se fait avec APP_LOGIN / APP_PASSWORD, vérifiés côté serveur uniquement par api/login.js. Une fois validés, un cookie de session signé (HttpOnly, Secure, SameSite=Strict, 8 h) autorise l'accès aux endpoints /api/tasks, /api/devs, etc. Toutes les requêtes vers Supabase passent par ces fonctions serverless, qui utilisent la clé secrète (SUPABASE_SECRET_KEY) — jamais exposée au navigateur.
/api/login répond 429 (« Trop de tentatives ») ; une connexion réussie remet le compteur à zéro (table LoginAttempt).schema.sql (voir « Migrations »).service_role / sb_secret_...).SUPABASE_URLSUPABASE_SECRET_KEYAPP_LOGINAPP_PASSWORDSESSION_SECRET (chaîne aléatoire longue, ex. générée avec openssl rand -base64 32)CRON_SECRET (autre chaîne aléatoire longue) : protège /api/keepalive, voir « Mise en pause de Supabase »node build-config.mjs) et le répertoire de sortie (.) sont déjà définis dans vercel.json.schema.sql contient tout le schéma et toutes les migrations, et il est idempotent : on le ré-exécute en entier (Supabase → SQL Editor) à chaque évolution, sans risque pour les données.
Toujours exécuter schema.sql AVANT de déployer une version qui en dépend : le code lit des colonnes et des tables (notes, TaskComment, LoginAttempt, updatedAt mis à jour par trigger…) qui doivent exister. Dans le cas contraire, /api/bootstrap ou /api/login échouent et l'application ne se charge plus.
Ce que le fichier met en place :
Task, Dev, TaskComment, LoginAttempt ;Dev(name) : Task.assignedTo (renommage répercuté, suppression → non assigné) et TaskComment.author (renommage répercuté, suppression → « Ancien dev ») ;Task.updatedAt à chaque modification (utilisé pour détecter les modifications concurrentes et charger les terminées récentes) ;notify pgrst).Chaque action passe par une fonction /api qui interroge Supabase : les fonctions doivent tourner dans la même région que la base, sinon chaque requête traverse l'Europe (ou l'Atlantique) en plus.
vercel.json ("regions") :| Région Supabase | Région Vercel |
|---|---|
West EU (Ireland) — eu-west-1 | dub1 |
West EU (London) — eu-west-2 | lhr1 |
West EU (Paris) — eu-west-3 | cdg1 |
Central EU (Frankfurt) — eu-central-1 | fra1 |
East US (North Virginia) — us-east-1 | iad1 |
Le projet actuel est en eu-west-1 (Irlande) : vercel.json utilise donc dub1. Après déploiement, la région est visible dans Vercel → Deployments → (déploiement) → Functions.
npm install
node build-config.mjs
npx vercel dev
Copier .env.example vers .env et renseigner les variables avant de lancer. npx vercel dev est nécessaire (au lieu de npx serve .) pour exécuter les fonctions /api localement.
여기까지가 README 앞부분입니다. 나머지는 원문에서 읽을 수 있습니다. README 전문 보기 ↗