Builds and Buildpacks
How repositories without a Dockerfile are detected and built.
Every Git deployment ends up as a Docker image tagged with its commit. If the repository has a Dockerfile at the configured path, VPSPilot builds it as-is. Otherwise it inspects the checkout and writes a Dockerfile for the stack it finds.
Detection order
package.json: Node.js, or Bun when it is the package manager.requirements.txt,pyproject.toml,Pipfile,setup.py,uv.lockorpoetry.lock: Python.go.mod: Go.Cargo.toml: Rust.index.html: a static site.main.pyorapp.py: Python without a manifest.
If nothing matches, the deploy fails and asks you to add a Dockerfile or deploy a container image.
Node.js and Bun
Recognised frameworks: Next.js, Nuxt, Remix, SvelteKit, Astro, NestJS, Angular, Create React App, Vite, Fastify, Hono, Express and Koa.
Python
Go, Rust and static sites
- Go builds the main package in the root or
cmd/<name>into a static binary (Go 1.23 by default). - Rust builds with Cargo in release mode.
- Static sites are served by a tiny busybox web server on
$PORT.
Overriding commands
Set a build or start command on the app when detection gets it wrong. Both are single-line shell commands run inside the container:
build_command: pnpm turbo run build --filter=webstart_command: node apps/web/server.jsBuild-time variables
Non-secret environment variables are passed to the build as Docker build arguments, so values like NEXT_PUBLIC_API_URL are available while building. Secret variables are only given to the running container.
Repository content is untrusted. Files are read with size limits and only inside the checkout, and anything copied from them into the generated Dockerfile must match strict patterns.