Migrer depuis Vercel
Chaque fonctionnalité Vercel possède un équivalent bext, soit intégré, soit via le système de plugins. Ce guide décrit le processus de mappage des fonctionnalités, de traduction de la configuration et de basculement DNS.
Cartographie des fonctionnalités#
| Caractéristique Vercel | Équivalent bext | Niveau de licence |
|---|---|---|
| Fonctions de bord | Plugins bext (QuickJS / WASM) | Communauté |
| ISR | Cache ISR bext ( [cache.isr] ) |
Communauté |
| Optimisation des images | Image bext ( [image] ) |
Communauté |
Intergiciel ( middleware.ts ) |
Plugins bext ou middleware natif | Communauté |
| Fonctions sans serveur | bext Routes SSR / Routes API | Communauté |
| Analytique | Métriques Prometheus + Grafana | Communauté |
| Informations sur la vitesse | Intégration OpenTelemetry | Pro |
| Variables d'environnement | Section bext.config.toml [env] |
Communauté |
| Aperçu des déploiements | bext deploy avec routage basé sur les branches |
Communauté |
| Emplois Cron | Planificateur de tâches bext ( [[tasks]] ) |
Communauté |
| Règles de pare-feu | bext WAF ( [waf] ) |
Pro |
| Protection contre les attaques DDoS | Limitation de débit bext + WAF | Communauté/Pro |
| Domaines personnalisés | bext Auto-TLS ( [tls] ) |
Communauté |
| Prise en charge des monorepo | Mode multi-applications bext | Communauté |
vercel.json à bext.config.toml#
Réécritures#
vercel.json :
{
"rewrites": [
{ "source": "/blog/:slug", "destination": "/posts/:slug" },
{ "source": "/api/:path*", "destination": "https://api.backend.com/:path*" }
]
}
bext.config.toml :
[[route_rules]]
pattern = "/blog/:slug"
rewrite = "/posts/:slug"
[[route_rules]]
pattern = "/api/**"
upstream = "https://api.backend.com"
strip_prefix = "/api"
Redirections#
vercel.json :
{
"redirects": [
{ "source": "/old", "destination": "/new", "permanent": true }
]
}
bext.config.toml :
[[route_rules]]
pattern = "/old"
action = "redirect"
redirect = "/new"
redirect_status = 301
En-têtes#
vercel.json :
{
"headers": [
{
"source": "/api/(.*)",
"headers": [
{ "key": "Access-Control-Allow-Origin", "value": "*" }
]
}
]
}
bext.config.toml :
[[route_rules]]
pattern = "/api/**"
headers = { "access-control-allow-origin" = "*" }
Variables d'environnement#
Vercel Tableau de bord :
DATABASE_URL = postgres://...
NEXT_PUBLIC_API_URL = https://api.example.com
bext.config.toml :
[env]
DATABASE_URL = "postgres://..."
NEXT_PUBLIC_API_URL = "https://api.example.com"
Ou utilisez un fichier .env (chargé automatiquement) ou des variables d'environnement du système d'exploitation. Priorité : environnement du système d'exploitation > bext.config.toml [env] > fichier .env.
Emplois Cron#
vercel.json :
{
"crons": [
{ "path": "/api/cleanup", "schedule": "0 3 * * *" }
]
}
bext.config.toml :
[[tasks]]
name = "cleanup"
schedule = "0 3 * * *"
handler = "http::GET /api/cleanup"
enabled = true
Fonctions Edge vers les plugins bext#
Les fonctions Edge Vercel s’exécutent au niveau de la périphérie CDN. Dans bext, l'équivalent est un plugin QuickJS ou WASM qui s'exécute en ligne avec la requête :
Fonction Edge Vercel (app/api/geo/route.ts) :
export const runtime = 'edge';
export function GET(request: Request) {
const country = request.headers.get('x-vercel-ip-country');
return new Response(JSON.stringify({ country }));
}
bext Plugin QuickJS (plugins/geo.js) :
export default {
name: "geo",
hooks: {
onRequest(ctx) {
if (ctx.path === "/api/geo") {
const country = ctx.headers["x-real-country"] || "unknown";
return { status: 200, body: JSON.stringify({ country }) };
}
}
}
};
Enregistrez le plugin :
[plugins]
directory = "plugins"
Aperçu des déploiements#
Vercel crée une URL unique pour chaque push git. Avec bext, utilisez le routage multi-applications basé sur les branches :
# Deploy a preview for a feature branch
bext-server deploy ./my-app --app preview-feature-xyz
Configurez l'aperçu pour qu'il soit accessible sur un sous-domaine :
# platform.toml
[[apps]]
name = "preview-feature-xyz"
hostname = "preview-feature-xyz.app.example.com"
source = "/var/bext/apps/preview-feature-xyz"
Combinez avec le DNS générique ( *.app.example.com ) et Auto-TLS pour les URL de prévisualisation automatique.
Liste de contrôle du basculement DNS#
Lorsque vous êtes prêt à faire passer le trafic de production de Vercel à bext :
1. Préparez le serveur bext#
# Verify config is valid
bext-server check
# Build and start
bext-server build
bext-server run
2. Testez avec un remplacement de fichier hosts#
# /etc/hosts (your machine only)
<bext-server-ip> app.example.com
Visitez https://app.example.com et vérifiez que toutes les pages, routes API et actifs se chargent correctement.
3. Réduire la durée de vie du DNS#
24 heures avant le basculement, réduisez le DNS TTL à 60 secondes pour que le commutateur se propage rapidement :
app.example.com. 60 IN A <bext-server-ip>
4. Mettre à jour les enregistrements DNS#
Supprimez le CNAME Vercel et ajoutez un enregistrement A pointant vers votre serveur bext :
# Before (Vercel)
app.example.com. CNAME cname.vercel-dns.com.
# After (bext)
app.example.com. 60 IN A 203.0.113.10
Si vous utilisez Auto-TLS de bext, le certificat est émis automatiquement à la première demande après la propagation du DNS.
5. Vérifiez#
# Confirm DNS points to bext
dig +short app.example.com
# Confirm TLS is working
curl -I https://app.example.com
# Check health
curl https://app.example.com/__bext/health
6. Restaurer le DNS TTL#
Après 24 heures de fonctionnement stable, remontez le TTL à une valeur normale (3 600 ou plus).
7. Supprimer le projet Vercel#
Une fois que vous avez confirmé que tout fonctionne, supprimez le projet Vercel pour arrêter la facturation.
Ce que vous gagnez#
Passer de Vercel à bext vous offre :
- Pas de tarification par demande - coût d'infrastructure fixe quel que soit le trafic
- Aucun démarrage à froid -- bext garde les ouvriers de rendu au chaud, SSR est toujours rapide
- Contrôle total : les journaux, les métriques, le comportement de mise en cache et la configuration réseau vous appartiennent
- Pas de dépendance vis-à-vis d'un fournisseur -- bext est open source ; votre déploiement est portable
- Redis Cache L2 : le cache survit aux déploiements et est partagé entre les instances
- Système de plugin -- étendez le serveur avec du code en bac à sable WASM, QuickJS ou nsjail
Réduisez votre DNS TTL à 60 secondes au moins 24 heures avant le basculement afin que le commutateur se propage rapidement. Après 24 heures de fonctionnement stable, remontez-le à une valeur normale (3 600 ou plus) pour réduire la charge du résolveur DNS.
Les fonctions Edge Vercel exécutent JavaScript au niveau Edge CDN. Les plugins bext QuickJS s'exécutent en ligne avec chaque requête sur votre serveur : ils ont accès au RequestContext complet (y compris les en-têtes géographiques injectés par votre CDN), mais ne sont pas distribués globalement, sauf si vous déployez bext dans plusieurs régions.
En rapport#
- Mise en cache — Cache ISR avec invalidation basée sur des balises remplaçant l'ISR de Vercel
- Extensions — portage des fonctions Edge vers des plugins QuickJS ou WASM
- Modes de déploiement — modes autonome, mascarade et multi-applications
- Multi-application — déploiements d'aperçu basés sur des branches remplaçant les URL d'aperçu Vercel
- Tâches planifiées — tâches cron remplaçant les crons
vercel.json - Référence de configuration — schéma
bext.config.tomlcomplet