# Create a site

Choose the right site type for your project and put a static website or a PHP or Laravel site online from a GitHub repository or a ZIP file, with its own domain and HTTPS.

## Before you start

- An active server. If you don't have one yet, follow [Create a server](https://app.nuvlo.dev/docs/create-a-server).
- Room for another site on your plan. See [Usage and limits](https://app.nuvlo.dev/docs/usage-and-limits).
- Your code in a GitHub repository, or as a folder or `.zip` file on your computer.
- A domain you can point at the server, such as `example.com` or `www.example.com`.

## Which site type to choose

Nuvlo deploys five kinds of sites. The type decides how the code is built and served, and which servers can run it. Static and PHP sites run on any server; the others need a server set up for them.

| Site type | Use it for | Runs on |
| --- | --- | --- |
| **WordPress** | A managed WordPress site with its own database and Redis cache. See [Install WordPress](https://app.nuvlo.dev/docs/install-wordpress). | Docker host or general-purpose servers |
| **Node.js app** | Nuxt, Next.js, Express and other Node apps from GitHub, built and kept running. See [Deploy a Node.js app](https://app.nuvlo.dev/docs/deploy-an-application). | Application or general-purpose servers |
| **Headless** | An Astro, Next.js or Nuxt frontend that loads its content from one of your WordPress sites. See [Headless WordPress](https://app.nuvlo.dev/docs/headless-wordpress). | Application or general-purpose servers |
| **PHP & Laravel** | Laravel, Symfony or plain PHP, including HTML sites with a PHP contact form. | Any server |
| **Static website** | Plain HTML, or a Vite, Astro or Eleventy build, served straight from Nginx. | Any server |

This guide walks through **PHP & Laravel** and **Static website**. The first PHP site on a server installs PHP-FPM and Composer on it.

Already have the site somewhere else? Use **Move an existing site** instead, described in [Move a WordPress site](https://app.nuvlo.dev/docs/move-a-wordpress-site). It works for WordPress, PHP and HTML sites and keeps the old site online while Nuvlo copies it.

## Step 1: Open the create page

Go to [Sites](https://app.nuvlo.dev/dashboard/sites), click **Create** and choose **Site**. The page **Create site** opens with the question **What would you like to deploy?**

If your plan has no room for another site, the **Site** item shows your usage and links to Billing instead.

![The Sites page with the Create menu open, showing Site, 1-Click app, Move an existing site, Server and Database](https://app.nuvlo.dev/docs/shots/create-a-site--create-menu.webp)

## Step 2: Choose the server

Under **Server**, click the server the site should run on. Each card shows the provider, the number of vCPUs and the memory. If you have many servers, use the page numbers below the list.

If you opened the page from a server, that server is already chosen. Click **Change server** to pick another one.

With a server selected, site types that can't run on it are greyed out and show what they need, for example **Requires an application or general-purpose server**.

![The Create site page with a server selected under Server and the five site type cards below it](https://app.nuvlo.dev/docs/shots/create-a-site--server-and-type.webp)

## Step 3: Pick the site type

Under **Site type**, click **PHP & Laravel** or **Static website**. The setup continues on the **Choose your project** step.

You can also drop a project folder or a `.zip` file on the box **Drop a folder or .zip**. Nuvlo detects the type and fills in the settings. That path is described in [Upload a site from your computer](https://app.nuvlo.dev/docs/upload-a-site).

## Step 4: Choose the framework and source

Under **Framework**, pick what the project is built with. The choice fills in sensible folders and build steps, which you can change on the next step.

| Site type | Frameworks |
| --- | --- |
| **PHP & Laravel** | **Laravel**, **Symfony**, **PHP** |
| **Static website** | **HTML**, **Vite**, **Astro**, **Eleventy**, **Other** |

Under **Source**, choose where the code comes from:

- **GitHub repository** deploys again on every push.
- **ZIP upload** deploys a `.zip` file you upload. To update the site later, you upload a new `.zip`.

If you skipped the server on the first step, pick it here from the **Server** list.

![The Choose your project step with the Framework buttons and the Source choice between GitHub repository and ZIP upload](https://app.nuvlo.dev/docs/shots/create-a-site--project.webp)

## Step 5: Pick the repository or upload the ZIP

For **GitHub repository**: if GitHub isn't connected yet, click **Connect GitHub** and authorize Nuvlo in the window that opens. See [Connect GitHub](https://app.nuvlo.dev/docs/connect-git). Then search your repositories with **Search repositories** and click the one to deploy.

Nuvlo reads the repository and selects the matching framework, marked **Detected**. If the code looks like a different site type, a note says so, for example that the repository contains PHP code or looks like a Node.js application.

For **ZIP upload**: drop the `.zip` on **Upload your site** or click it to browse. The archive can be up to 100 MB. If it has a single top-level folder, Nuvlo unwraps it.

Click **Next: configure site**.

![The repository grid with one repository selected and the framework button marked Detected](https://app.nuvlo.dev/docs/shots/create-a-site--repository.webp)

## Step 6: Set the domain and folders

Enter the **Domain** the site answers on, for example `example.com`. Below it, choose how the www address behaves. Nuvlo picks the usual choice for the domain you typed; click an option to change it.

- **No redirect** serves both the www and the non-www address.
- **www → root** redirects `www.example.com` to `example.com`.
- **root → www** redirects `example.com` to `www.example.com`.

Then check the folders:

- **Branch** (Git only): the branch that is deployed. It defaults to the repository's default branch.
- **Root directory**: for monorepos, the folder that holds the site. Leave `/` otherwise.
- **Web directory** (PHP): the folder Nginx serves. Laravel and Symfony use `public`.
- **Publish directory** (static): the folder that is published. Leave it empty to publish the root directory.
- **PHP version** (PHP): the PHP version for this site.
- **Build command** (static): leave it empty to publish the files as they are. When you enter one, **Package manager** and **Node.js** appear so you can choose how it builds.

![The Configure your site step with the Domain field, the www redirect options and the folder fields](https://app.nuvlo.dev/docs/shots/create-a-site--configure.webp)

## Step 7: Choose the options

Under **Options**, switch on what the site needs. Which options appear depends on the site type and framework.

| Option | What it does |
| --- | --- |
| **Single-page app** | Static sites. For React, Vue or Svelte apps that handle their own page links: every address loads `index.html`. |
| **Links without .html** | Visitors can open `/about` instead of `/about.html`. Old links with `.html` keep working. |
| **Create a database** | PHP sites, only when the server has MySQL, MariaDB or PostgreSQL. Creates a database and user on the server and adds the credentials as `DB_*` variables. |
| **Update the database on deploy** | Laravel. Runs `php artisan migrate` before the new version goes live. |
| **Scheduled tasks** | Laravel. Runs `php artisan schedule:run` every minute. |
| **Build CSS and JavaScript** | PHP sites that compile their styles and scripts first, for example with Vite. Plain HTML and PHP sites leave this off. |
| **Send every page through index.php** | Plain PHP. Needed for most CMSes; leave it off for sites made of separate `.html` or `.php` files. |
| **Deploy on push** | Git only. Every push to the branch updates the live site. |

![The Options list of a Laravel site with its switches](https://app.nuvlo.dev/docs/shots/create-a-site--options.webp)

## Step 8: Add environment variables

Optional. Under **Environment variables**, drop a `.env` file to import it, or click **Add variable** and enter a name and value. Names may contain only letters, numbers and underscores, and each name can appear once.

You can change variables any time later. See [Environment variables](https://app.nuvlo.dev/docs/environment-variables).

![The Environment variables section of the Configure your site step with the .env drop area and the Add variable button](https://app.nuvlo.dev/docs/shots/create-a-site--environment.webp)

## Step 9: Deploy the site

Click **Deploy site**. The **Deploy** step shows each stage as it runs: creating the site, preparing the server, fetching the code, installing dependencies, building, creating the release, going live, configuring Nginx and checking the site.

When it finishes, click **Open site** to go to the site's page.

If the deploy stops, the failed stage is marked. Click **View deploy log** to see the full output, or **Back to settings** if the site wasn't created.

## What happens next

Point your domain at the server if you haven't yet: add an A record for the domain with the server's IP address at your DNS provider. If the domain is in a Cloudflare account you connected, Nuvlo can create the record for you; otherwise the deploy screen tells you what to add. HTTPS is issued automatically once the domain points at the server. See [Add a domain](https://app.nuvlo.dev/docs/add-a-domain) and [SSL certificates](https://app.nuvlo.dev/docs/ssl-certificates).

From the site's page you can follow deployments, change [build settings](https://app.nuvlo.dev/docs/build-settings) and [environment variables](https://app.nuvlo.dev/docs/environment-variables), and adjust [PHP and routing settings](https://app.nuvlo.dev/docs/site-runtime-settings).

## Troubleshooting

- **A site type is greyed out**: the selected server can't run it. Pick another server, or [create a server](https://app.nuvlo.dev/docs/create-a-server) of the needed type.
- **Another site on this server already uses this domain**: delete the old site first, or redeploy that site instead of creating a new one.
- **This server has no MySQL, MariaDB or PostgreSQL installed**: create the site without **Create a database**, or choose a server with a database. See [Create a database](https://app.nuvlo.dev/docs/create-a-database).
- **Repositories could not be loaded** or **No repositories found**: reconnect GitHub under [Git providers](https://app.nuvlo.dev/dashboard/integrations/git) and make sure Nuvlo has access to the repository.

---
Source: https://app.nuvlo.dev/docs/create-a-site
