ServerAvatarDocs
Applications

Deploy from Git

Create an application from a GitHub, GitLab or Bitbucket repository — choosing a rendering type, build command and deploy script.

From Git repo clones your own code onto the server and serves it. It is the only type where the panel does not know what it is installing, so the form asks the two questions it cannot guess: where the code comes from, and how it should be served.

1. Choose the source

The Git source choice — Use a connected account, with Git account, Repository and Branch pickers — above Rendering type and PHP version

Use a connected account lists the repositories a connected GitHub, GitLab or Bitbucket account can see, including private ones, and fills Branch from the repository. Connect an account first under Integrations → Git; until you do, the picker shows "No Git account connected yet" with a link to it.

Use a public repository URL takes any clone URL and needs no credentials.

The same section with Use a public repository URL selected, showing a Repository URL field and Branch

Private repositories need an account

A public URL is cloned anonymously. A private repository has to come through a connected account — the panel will not take a token pasted into the URL.

2. Choose a rendering type

This is the field that decides everything below it, and it has no default on purpose:

OptionWhat the server does
PHP application (Laravel, Symfony, plain PHP)Serves the repository through PHP-FPM, like any other PHP site.
Server-side rendering (runs a process)Starts your app as a long-running process and proxies to it.
Client-side rendering (built to files)Runs a build, then serves the output directory as static files.
Static site (built to files)Serves the repository as static files, with an optional build.

As the form puts it: "Server-side rendering runs your app and proxies to it. The other two build to files the web server hands out directly — faster, and nothing to keep running."

Getting it wrong is not cosmetic. A Node app served as a directory publishes its source; a PHP app served by proxy is a permanent 502.

3. Fill in what that choice reveals

Picking server-side or client-side rendering adds the Node fields:

The Git form with Server-side rendering selected, revealing Node.js version, Package manager, Start command and App port

FieldNotes
Node.js versionOptional. Left unset, the build and the process run on whatever node resolves to on the server.
Package managernpm, yarn, pnpm or bun. Choosing one fills in the build command below — "edit it freely afterward".
Start commandServer-side rendering only, and required. The entry file, e.g. node server.js.
App portServer-side rendering only. Left empty, the panel picks a free one.

Not `npm start`

The form is explicit about this: "The entry file, for example 'node server.js'. Not 'npm start' — a package manager forks the real process, so shutdown signals never reach it." A process started through a package manager will not stop or restart cleanly.

A PHP application gets the PHP version picker instead, and no Node fields at all.

4. Build and deploy commands

Advanced settings holds the two commands that run on every deploy, plus Web root:

FieldNotes
Build commandRuns after the code is fetched — composer install --no-dev, or whatever your package manager filled in such as npm ci && npm run build.
Deploy scriptRuns after the code is fetched, as your site user and on this site's own PHP version. Leave it empty to use the build command.

Both are offered at creation rather than only on the Deployment screen afterwards, because the first deploy runs automatically as soon as provisioning finishes — and for anything with migrations, that first deploy is the one that decides whether the site works at all.

Web root matters more here than for packaged applications. A framework that serves out of a subdirectory needs it set — /public for Laravel, the build output directory for a client-side rendered app.

After it is created

The first deploy runs on its own. Everything afterwards lives on the application's Deployment screen: deploying again, the deploy history, deploy settings, the runtime, and a webhook so a push redeploys the site.

Limits and caveats

  • Node applications are deployable on a PHP stack, but packaged Node apps are not. Rendering type belongs to this type, not to the server's stack — see what your server can host.
  • The rendering type cannot be guessed and has no default. You have to answer it.
  • A connected Git account is per panel, not per application. Connect it once under Integrations → Git.

On this page