Containers and static sites

Apps that don't run as Workers are built with the unmodified upstream Paketo buildpacks (Ubuntu Noble builder, pinned by digest) and run as containers on Scaleway Serverless Containers. A repository of plain HTML files is published as a static site without a build.

Before any build, Eurobase reads your repository, shows what it detected, and prefills the settings you confirm with Save and Deploy.

Supported languages

Node.js, Python, Go, Java, Ruby, PHP and .NET. When a root directory has files of several languages, the first in this order wins: Ruby, .NET, Go, Python, PHP, Java, Node.js. A root directory with both requirements.txt and package.json builds as Python.

For Node.js:

  • npm or Yarn 1. pnpm, Bun, Deno and Yarn 2 or later (a .yarnrc.yml, or packageManager set to yarn@2 or later) are refused before the build.
  • Commit one lockfile: package-lock.json and yarn.lock together are refused.
  • Node.js 20, 22 or 24. A version range that allows only Node.js 25 or later is refused.
  • The build runs with NODE_ENV=production and installs devDependencies.

In a monorepo, pick the root directory of the app you want to deploy; Eurobase finds candidates up to 6 levels deep. Only that directory is sent to the build, so packages elsewhere in the repository aren't available. Detection reads up to 1,000 files and folders in a root directory; choose a narrower one if it has more. Dockerfiles aren't used.

Build and start

  • Build command (Node.js only) runs one script from your package.json, written as npm run <script>, yarn <script> or yarn run <script>. It defaults to your build script; leave it empty to skip the build. Other languages build automatically.
  • Start command: a single web: line in a Procfile always wins. Otherwise a Node.js app is prefilled with your start script when it isn't a development server, then the framework's own server (SvelteKit with adapter-node, Astro with @astrojs/node, Nuxt), then a development start script, which is flagged, then node server.js, app.js, main.js or index.js. Without a start script or one of those files, the command must be node <file>. Python apps are prefilled with a uvicorn or gunicorn command when Eurobase finds a FastAPI, Flask or Django entry point and you depend on that server. Node.js and Python need a start command; it is one line of up to 1,024 characters.
  • Today secrets aren't available during the build, only when the app runs.
  • A build gets 4 vCPU, 6 GB of memory, 10 GB of disk and 45 minutes. The built image can be up to 4 GB.

Port and health path

Listen on 0.0.0.0 at the port set in Port (3000 unless you change it; 1024 to 65535). Scaleway also passes it in the PORT environment variable. Uvicorn is configured for it automatically.

A deployment goes live only after your Health path (/ unless you change it) answers a GET with 2xx or 3xx. First Scaleway's startup check tries it up to 10 times, 5 s apart; then Eurobase requests it through your project's address up to 60 times, 2 s apart, with a 5 s timeout each, and never follows redirects. If it doesn't pass, the deployment fails and the previous one keeps serving. While an instance runs, the platform requests the health path every 30 s and stops sending it traffic after 3 failures in a row.

Built static sites

In a project that doesn't run on Workers, a Node.js app can be a Static site instead of a Web service: Eurobase runs the build script and serves the Output directory with NGINX in a container, sending unknown paths to index.html for single-page apps. Eurobase suggests this for Vite and Create React App apps (dist, build), static Astro sites and SvelteKit with adapter-static.

Running and scaling

Container apps scale to zero when they receive no traffic. The next request starts an instance again, and waits for your app to start. The number of instances and the CPU and memory sizes your plan allows are in Plans and limits; new apps start on the smallest size.

Container limits

  • A response must start within 55 s of the request arriving, or the visitor gets 504. Once it has started, a response, an event stream or a WebSocket has no time limit, but it is closed after 60 s without data from your app, so send data or a keepalive more often. A Eurobase update can also end an open stream; clients should reconnect.
  • Your app's own output (standard output and error) isn't shown yet. The Logs page shows the build, deployment and HTTP request logs.
  • A changed secret reaches the app with its next deployment; the Secrets page marks the app Redeploy required until then.

Plain static sites

A root directory with an index.html and only web files (.html, .css, .js, images, fonts, media, .json, .txt, .xml and similar) is published as-is, without a build or a container. The list is strict today: a README.md, a LICENSE or CNAME file without an extension, a hidden file other than .well-known, or a build or server file such as package.json or a Dockerfile means the directory isn't treated as a plain static site.

  • Up to 1,000 files and folders (what detection reads) and 512 MB, nested at most 32 levels.
  • /about serves about/index.html; about.html is served only at /about.html. Missing files answer 404; custom 404 pages and single-page-app fallback aren't supported.
  • Files are sent with Cache-Control: public, max-age=300.

Not available yet

  • Preview deployments for branches other than the project's branch.
  • Dockerfile builds.
  • Your container app's runtime output in the logs.