Unterstützte Frameworks
Unterstützte Frameworks
Bei jedem Deployment von GitHub klont der Builder Ihren Branch und analysiert das Repository, um das Framework zu identifizieren: daraus leitet er den Build-Befehl, die in das Produktions-Image einzubindenden Artefakte und den passenden Startbefehl ab. Das gewählte Framework und der generierte Befehl werden in den Build-Logs beim Schritt „Framework-Erkennung" angezeigt.
Diese Seite ist die vollständige Referenz: Erkennungssignale, generierte Befehle, Hinweise je Framework und Methoden zum Überschreiben.
Wie die Erkennung funktioniert
Die Erkennung folgt einer strikten Reihenfolge, vom spezifischsten zum allgemeinsten:
- Der Dockerfile-Modus, wenn er in den Einstellungen des Dienstes gewählt ist: Ihr Dockerfile ist maßgeblich, und keine Erkennung wird angewendet (siehe Erkennung überschreiben).
- Meta-Frameworks (Next.js, Nuxt, SvelteKit, Remix, Astro…), erkannt vor ihren Bausteinen: ein Blitz-Projekt wird nicht mit dem darin enthaltenen Next.js verwechselt, ein Qwik- oder Vike-Projekt wird nicht auf seine Vite-Konfiguration reduziert.
- Python-Frameworks (Django, FastAPI, Flask) und statische Pipelines (Gulp).
- Node.js-Backend-Frameworks (NestJS, Fastify, Koa…). Express wird zuletzt geprüft, da es als direkte Abhängigkeit vieler anderer Frameworks erscheint.
- Generisch nach Sprache: Node.js mit
start-Skript, Laravel, Go, Ruby on Rails, Rust.
Zwei Arten von Signalen werden verwendet, in dieser Vertrauensreihenfolge:
- Die Abhängigkeiten von
package.json(dependencies+devDependencies). Das zuverlässigste Signal: viele Frameworks funktionieren ohne Konfigurationsdatei. - Konventionelle Dateien:
next.config.*,astro.config.*,go.mod,Cargo.toml,manage.py,artisan…
Auflösung des Startbefehls (Node.js)
Für „rohe" Node-Frameworks (Express, Koa, Fastify…) wird der Startbefehl in dieser Präferenzreihenfolge aufgelöst:
- Das
start-Skript Ihrerpackage.json→npm start. Sie wissen besser als wir, wie Ihre Anwendung zu starten ist. - Das Feld
main, wenn es auf eine vorhandene Datei zeigt →node <main>. - Die konventionellen Einstiegspunkte des Frameworks, die im Repository vorhanden sind (z. B.
app.jsfür Koa,server.jsfür Fastify). - Die erwartete Build-Ausgabe als letztes Mittel (z. B.
dist/main.jsfür NestJS: die Datei existiert beim Klonen nicht, wird aber vom Build erzeugt).
Kompilierte Frameworks (NestJS, AdonisJS, FoalTS, Marble.js) starten direkt von ihrer Build-Ausgabe statt von ihrer Entwicklungs-CLI: schnellerer Boot, kein Dev-Tooling im Image erforderlich.
Fullstack & SSR
| Framework | Erkennung | Build | Generierter Start |
|---|---|---|---|
| Next.js | next oder next.config.* | next build | npm start (next start) |
| Next.js standalone | output: 'standalone' in der Konfiguration | next build | node .next/standalone/server.js |
| Blitz.js | blitz | blitz build | npx blitz start |
| Nuxt | nuxt oder nuxt.config.* | nuxt build | node .output/server/index.mjs |
| SvelteKit | @sveltejs/kit oder svelte.config.* | vite build | node build/index.js |
| Remix (klassisch) | remix.config.* | remix build | npx remix-serve build |
| Remix (Vite) | @remix-run/* ohne remix.config | vite build | npx remix-serve build/server/index.js |
| Astro (SSR) | astro + ein adapter in der Konfiguration | astro build | node ./dist/server/entry.mjs |
| Astro (statisch) | astro ohne Adapter | astro build | npx serve dist |
| RedwoodJS | @redwoodjs/* oder redwood.toml | npx rw build | npx rw serve --port $PORT |
| SolidStart | @solidjs/start | vinxi build | node .output/server/index.mjs |
| Qwik City (SSR) | @builder.io/qwik-city + src/entry.express.tsx | qwik build | node server/entry.express.js |
| Qwik City (statisch) | @builder.io/qwik-city ohne Express-Adapter | qwik build | npx serve dist |
| Gatsby | gatsby oder gatsby-config.* | gatsby build | npx serve public |
| Vike | vike | vite build | benutzerdefinierter Server (npm start bevorzugt) |
| Fresh (Deno) | deno.json | Keine | deno run -A main.ts |
Hinweise je Framework
- Next.js: der Standalone-Modus wird automatisch erkannt (
output: 'standalone'innext.config.*): das finale Image enthält nur.next/standalone,.next/staticundpublic. Siehe auch die Anleitung Next.js. - Nuxt / SolidStart: beide erzeugen eine Nitro-Ausgabe, und nur der Ordner
.outputwird im finalen Image behalten. - SvelteKit: der generierte Befehl setzt adapter-node voraus (
@sveltejs/adapter-node), derbuild/index.jserzeugt. Serverless-Adapter (Vercel, Netlify…) erzeugen keinen eigenständigen Server. - Remix: beide Ären werden unterstützt: klassischer Compiler (
remix.config.*vorhanden) und Vite-Plugin (nur@remix-run/*-Abhängigkeit). - Astro: SSR, wenn ein
adapterinastro.config.*erscheint (verwenden Sie@astrojs/node), sonst wird die Seite statisch ausdist/bereitgestellt. - Qwik City: führen Sie
npx qwik add expressfür SSR aus. Das Vorhandensein vonsrc/entry.express.tsxlöst den Server-Modus aus; sonst wird diedist/-Ausgabe statisch bereitgestellt. - RedwoodJS: Build und Serve laufen über die
rw-CLI, die das api + web Monorepo verwaltet. - Vike: Vike setzt einen benutzerdefinierten Server voraus. Definieren Sie ein
start-Skript in Ihrerpackage.json; andernfalls sucht der Builder nachserver/index.js,server.jsund dannindex.js. - Fresh / Deno: andere Runtime. Der Auto-Builder verwendet das offizielle Deno-Image: Er startet den Task
startaus Ihrerdeno.json, falls vorhanden, sonst die erste gefundene Einstiegsdatei (main.ts,server.ts…).
Node.js-Backend
| Framework | package.json-Schlüssel | Generierter Start |
|---|---|---|
| Express | express | npm start › main › index.js, server.js, app.js, src/* |
| Fastify | fastify | npm start › main › server.js, app.js, index.js, src/* |
| NestJS | @nestjs/core | node dist/main.js |
| Koa | koa | npm start › main › app.js, index.js, server.js, src/* |
| Hapi | @hapi/hapi (oder hapi) | npm start › main › server.js, index.js, src/* |
| Sails | sails | npm start › main › app.js |
| AdonisJS v6 | @adonisjs/core + adonisrc.ts | node build/bin/server.js |
| AdonisJS v5 | @adonisjs/core | node build/server.js |
| LoopBack 4 | @loopback/core | npm start, sonst node . |
| FeathersJS | @feathersjs/* | npm start › main › src/index.js, lib/index.js, dist/index.js |
| Restify | restify | npm start › main › server.js, index.js, src/* |
| Egg.js | egg | npx egg-scripts start --port $PORT |
| Total.js | total.js (oder total4/total5) | npm start › main › index.js, debug.js |
| FoalTS | @foal/core | npm start, sonst node build/index.js |
| Marble.js | @marblejs/core | npm start, sonst node dist/main.js |
| Moleculer | moleculer | npm start, sonst npx moleculer-runner services |
| Seneca | seneca | npm start › main › index.js, server.js, app.js |
| Generisches Node.js | start-Skript vorhanden | npm start |
Die Notation npm start › main › Dateien… bezeichnet die oben beschriebene Auflösungsreihenfolge.
Hinweise je Framework
- NestJS:
nest startkompiliert beim Boot neu und erfordert die Nest-CLI. Der Builder startet direktdist/main.js, erzeugt vonnpm run build(nest build). Prüfen Sie, ob Ihrbuild-Skript existiert. - AdonisJS: die Version wird aus dem Vorhandensein von
adonisrc.ts(v6) abgeleitet. Die Ausgabepfade unterscheiden sich zwischen v5 und v6. - Egg.js:
egg-scriptsläuft im Vordergrund (kein--daemon). In einem Container ist der Hauptprozess die Anwendung. - Moleculer: ohne
start-Skript lädt der Runner die Dienste aus dem Ordnerservices/. - LoopBack 4:
node .folgt dem Feldmain(normalerweisedist/index.js, erzeugt vom TypeScript-Build).
Statisches Frontend
| Tool | Erkennung | Build | Generierter Start |
|---|---|---|---|
| Vite (React, Vue, vanilla…) | vite.config.* | vite build | npx serve dist -p $PORT |
| Gulp | gulpfile.* | npx gulp | npx serve <ausgabe> -p $PORT |
| Gatsby | gatsby | gatsby build | npx serve public -p $PORT |
Für Gulp wird der Ausgabeordner aus dem ersten dest()-Aufruf des Gulpfiles extrahiert; andernfalls werden dist/, www/ und dann build/ versucht. Nur der Ausgabeordner wird im finalen Image eingebettet.
Die Art »Statische Website«
Die Tabelle oben beschreibt die automatische Erkennung, die ein Node-Projekt voraussetzt. Wenn Sie beim Anlegen des Dienstes (oder später in dessen Einstellungen) die Art Statische Website wählen, läuft der Build gar nicht mehr über die automatische Erkennung: Das erzeugte Image ist ein Nginx, das Ihre Dateien ausliefert.
- Repository aus HTML/CSS/JS-Dateien: Der Ordner mit
index.htmlwird unverändert veröffentlicht (Wurzel, dannpublic,dist,build,site,_site,www). - Repository mit
build-Skript: Es wird ausgeführt, und nur dessen Ausgabe landet im Image (dist,build,out,_site,.output/public,public,www). - Nginx lauscht auf dem Port des Dienstes, liefert URLs ohne Endung (
/ueber-uns→ueber-uns.html) und fällt für clientseitige Router aufindex.htmlzurück. - Kein Repository zur Hand? Die Vorlage Statische Website deployt dasselbe Nginx mit einem persistenten Ordner, bearbeitbar über den Tab Dateien.
Andere Runtimes
| Framework | Erkennung | Generierter Start |
|---|---|---|
| Django | manage.py + django in den requirements | gunicorn <app>.wsgi:application --bind 0.0.0.0:$PORT |
| FastAPI | fastapi in requirements.txt | uvicorn main:app --host 0.0.0.0 --port $PORT |
| Flask | flask in requirements.txt | gunicorn app:app --bind 0.0.0.0:$PORT |
| Laravel | artisan | php artisan serve --host=0.0.0.0 --port=$PORT |
| Ruby on Rails | rails im Gemfile | bundle exec rails server -b 0.0.0.0 -p $PORT |
| Go | go.mod | ./<binary> (Modulname) |
| Rust | Cargo.toml | ./target/release/<binary> (Crate-Name) |
| Deno | deno.json / deno.jsonc | deno run -A main.ts |
Die dedizierten Anleitungen Python, PHP und Go beschreiben im Detail die runtime-spezifischen Umgebungsvariablen.
Der Port: die einzig erforderliche Konvention
Unabhängig vom Framework muss Ihre Anwendung die Umgebungsvariable PORT lesen und auf 0.0.0.0 lauschen, niemals auf localhost oder einem fest codierten Port. Das ist die häufigste Ursache Nr. 1 für Deployments, die bauen, aber nicht antworten.
// Node.js — gültig für alle Frameworks
const port = process.env.PORT || 3000;
app.listen(port, "0.0.0.0");
Erkennung überschreiben
Drei Mechanismen, vom leichtesten zum vollständigsten:
1. Benutzerdefinierter Startbefehl
Ersetzen Sie vom Dashboard aus den generierten Befehl, ohne das Repository anzufassen (siehe Benutzerdefinierter Startbefehl).
2. Procfile
Eine Zeile web: <Befehl> in einem Procfile im Wurzelverzeichnis Ihres Repositories ersetzt den erkannten Startbefehl. Sie gilt für alle Sprachen außer Node-Projekten, die stattdessen den Startbefehl aus dem Dashboard verwenden.
web: gunicorn meineapp.wsgi --bind 0.0.0.0:$PORT
3. Dockerfile-Modus
Ändern Sie in den Einstellungen des Dienstes den Build-Typ:
- Dockerfile: Ihr Repository steuert den Build vollständig, ohne Erkennung und nach Ihren Regeln (siehe Docker).
Paketmanager
Der Builder normalisiert jedes Node-Projekt auf npm zum Build-Zeitpunkt: npm ist der einzige Paketmanager, der in allen Basis-Images garantiert vorhanden ist. In der geklonten Kopie des Repositories gilt:
- die Lockfiles
bun.lock,bun.lockb,pnpm-lock.yaml,yarn.lockundpackage-lock.jsonwerden gelöscht: die Abhängigkeiten werden sauber übernpm installneu installiert; - das Feld
packageManager(corepack) sowie die Einträgeengines.pnpm/engines.yarn/engines.bunwerden aus derpackage.jsonentfernt; - Konfigurationsdateien anderer Paketmanager (
pnpm-workspace.yaml,.yarnrc.yml,.yarn/,bunfig.toml…) werden gelöscht; - Skripte, die einen anderen Paketmanager aufrufen, werden umgeschrieben (
pnpm run build→npm run build,bunx prisma→npx prisma,yarn dlx→npx…), und dieonly-allow-Sperre, deren einziger Zweck es ist,npm installscheitern zu lassen, wird entfernt.
Ihr Repository bleibt unverändert: nur die zum Bauen des Images verwendete Kopie wird angepasst. Ein desynchronisiertes Lockfile kann daher niemals ein Deployment zum Scheitern bringen.
Was kein npm-Äquivalent hat (pnpm --filter, yarn workspace, bun run app.ts), bleibt unangetastet und wird in den Build-Logs im Schritt „Paketmanager" gemeldet. Diese Befehle werden fehlschlagen: passen Sie das Skript im Repository an oder wechseln Sie in den Dockerfile-Modus, um die Installation selbst zu steuern.
Fehlerbehebung
- Falsches Framework erkannt: prüfen Sie die Build-Logs (Schritt „Framework-Erkennung"). Der typische Fall ist eine übrig gebliebene Abhängigkeit in
package.json(z. B.expressin einem migrierten Projekt). Entfernen Sie die Abhängigkeit oder wechseln Sie in den Dockerfile-Modus. - Build OK, aber der Dienst antwortet nicht: fast immer der Port. Prüfen Sie auch, dass Ihr Startbefehl nicht auf
localhostlauscht. Cannot find module 'dist/main.js'beim Boot eines kompilierten Frameworks: Ihrbuild-Skript erzeugt nicht die erwartete Ausgabe. Richten Sie die Build-Ausgabe aus oder definieren Sie einstart-Skript.- Framework fehlt in dieser Liste: Der Auto-Builder versucht eine generische Erkennung nach Sprache. Wenn das fehlschlägt, fügen Sie ein
Procfilehinzu oder wechseln Sie in den Dockerfile-Modus, und teilen Sie uns mit, welches Framework Ihnen fehlt, auf Discord (neues Fenster).