---
title: Create a site
description: Spin up a containerized site on a domain you've added to WHP.
sidebar:
  order: 3
---

import { Steps, Aside } from '@astrojs/starlight/components';
import SignIn from '~/content/partials/signing-in.mdx';
import Hostnames from '~/content/partials/service-hostnames.mdx';
import Support from '~/content/partials/support-link.mdx';

Every site on WHP runs in one or more containers. The Sites page lets you pick a container type (PHP, Node, static HTML, or one of the other options on the dropdown), bind one or more domains, and set how much CPU and RAM each container gets.

## Before you start

- A **domain already added** to your account ([Add a domain](/whp/how-to/add-a-domain/) covers that).
- Decide what kind of site you're building. Common container types: **PHP** (WordPress, Laravel, most CMSes), **Node** (custom apps), **Static HTML** (prebuilt bundles from Astro, Hugo, Eleventy, etc.).
- About 5 minutes.

## Sign in to WHP

<SignIn />

## Steps

<Steps>

1. In the sidebar, click **Sites**.
   ![WHP Sites page with Create New Site form](~/assets/screenshots/whp/whp-sites.png)

2. Fill in the **Create New Site** form on the right:
   - **Site Name** — a friendly label for you to recognise the site later.
   - **Primary Domain or Subdomain** — pick from the dropdown of domains you've already added.
   - **Container Type** — PHP, Node, static HTML, etc.
   - **Number of Containers** — `1` is the right answer for most sites. Bump this up (1–10) if you need to scale a busy site horizontally; WHP load-balances traffic across the replicas.
   - **Additional Domains/Subdomains (Optional)** — bind extra domains to the same site if you want them to serve the same content.
   - **CPU per Container (cores)** — defaults to `0.25`. Raise this only if you need to.
   - **Memory per Container (MB)** — defaults to `256`. Raise this if your app needs more RAM.

3. Scroll down to **SSL/HAProxy Configuration**. Before you enable HTTPS, make sure your domain's DNS already points to our server's IP — SSL certificates can't be issued for domains that aren't pointed correctly. Then check **Enable HTTPS** to have us request a Let's Encrypt certificate.

4. Click **Create Site**. WHP provisions the container(s) — usually under a minute. The new site shows up in the **Manage Sites** list on the left of the page.

</Steps>

## Where your files go

When you connect via SFTP, your account home (`/docker/users/<your-user>/`) shows one folder per domain. Inside each domain folder, the layout depends on the container type:

| Container type | Layout inside the domain folder            | Docroot is...                                            |
| -------------- | ------------------------------------------ | -------------------------------------------------------- |
| PHP            | `public_html/`, `logs/`, `crontab`         | `public_html/`                                           |
| Node           | `app/`, `logs/`                            | Whatever your start command serves; we run it from `app/`|
| Static HTML    | files directly (e.g., `index.html`, `assets/`) | The domain folder itself                             |

Upload your files to the right place and the site picks them up immediately.

Logging in with your account password works out of the box. If you'd rather use an SSH key instead — or need to let a teammate connect without sharing your password — see [Manage SFTP SSH keys](/whp/how-to/manage-sftp-ssh-keys/).

## Connect to databases and caches

<Hostnames />

## Verify it worked

Open your domain in a browser. You should see your site, or the default "no content yet" placeholder if you haven't uploaded files. For Node sites, give it 15–30 seconds after creation for the process to start.

<Aside type="tip">
  Static HTML is the fastest path if your toolchain produces a bundle (Astro, Hugo, Eleventy, etc.) — you skip the runtime entirely.
</Aside>

## Troubleshooting

**You see a default "no content" page.** Upload your files via SFTP — for PHP into `public_html/`, for Node into `app/`, for static directly into the domain folder.

**Node site returns 502.** Check that your start command runs successfully locally, and that it binds to the port WHP exposes via env var to your container.

**PHP site shows a blank page or 500.** Check **Sites → your site → Logs** (or the `logs/` folder in SFTP). Common cause: a syntax error in `index.php` or a missing PHP extension — open a [support ticket](https://secure.anhonesthost.com/submitticket.php) if you need a non-default extension enabled.

**SSL won't issue.** The "Important: ensure your domain is pointed to our server" warning means DNS hasn't propagated yet, or it's pointed somewhere else. Re-check with `dig` and retry.

## Related

- [Add a domain](/whp/how-to/add-a-domain/)
- [Service hostnames](/whp/reference/service-hostnames/)
- [Manage SFTP SSH keys](/whp/how-to/manage-sftp-ssh-keys/)

## Still stuck?

<Support />
