Docs / Web Hosting

Web hosting guide

Create your first site, connect a domain with free SSL, manage databases and SFTP, and run WordPress, PHP, Node.js, Python or static sites — plus email hosting.

Web Hosting Overview

Piedmont Hosting provides managed hosting for websites and web applications. Pick a site type — WordPress, PHP, Node.js, Static HTML or Python — and create the site from your dashboard. Every site gets free SSL and SSH/SFTP access, and every plan includes email on your own domain.

Plans

PlanSitesStorageEmailMonthlyAnnual
Starter1 site5 GB1 mailbox (1 GB)$3.00/mo$32.40/yr
Business5 sites25 GB5 mailboxes (2 GB each)$8.00/mo$86.40/yr
Pro25 sites50 GB25 mailboxes (5 GB each)$15.00/mo$162.00/yr

Supported Site Types

TypeBest ForIncludes
WordPressBlogs, CMS, e-commerce, portfoliosMySQL database, WP admin panel, PHP 8.3
PHPLaravel, CodeIgniter, custom PHP appsPHP 8.3 runtime, web root access
Node.jsExpress, Next.js, API serversNode.js 22, auto-assigned port, reverse proxy
Static HTMLLanding pages, docs sites, SPAsDirect file serving, no runtime needed
PythonDjango, Flask, FastAPI appsPython 3.12, auto-assigned port, reverse proxy

All Plans Include

  • Free SSL certificates (Let's Encrypt, installed automatically once your domain points to us)
  • SSH and SFTP access for file management
  • Email on your own domain (see Email Hosting)
  • Disk usage shown in your dashboard (new sites can't be added once your plan's storage is full)
  • Custom domain support
  • One-click site creation from your dashboard

To switch between Starter, Business and Pro, use Change Plan in your web hosting service's sidebar — to move to a smaller plan, first remove any sites or mailboxes over its limits. Plan changes are prorated on your next invoice. Cancel Plan is just below it.

Creating Your First Site

This walkthrough applies to all site types. You'll configure DNS, create the site from your dashboard, and get your credentials.

Step 1 — Point Your DNS

Before creating a site, point your domain to the hosting server. Log in to your domain registrar (Cloudflare, Namecheap, GoDaddy, etc.) and add these DNS records:

TypeNameValueTTL
A@ (root domain)130.250.176.36Auto
CNAMEwwwyourdomain.comAuto
Tip
DNS typically propagates in 5-30 minutes. You can verify it with dig yourdomain.com or an online tool like whatsmydns.net.

Step 2 — Add the Site

  1. 1
    Open your web hosting service page from the dashboard.
  2. 2
    On the Websites tab, click + Add Site.
  3. 3
    Choose a site type: WordPress, PHP, Node.js, Static or Python.
  4. 4
    Enter your domain name (e.g., example.com). For WordPress, you can also enter a site title.
  5. 5
    Click Create WordPress — the button is named after the type you chose (Create PHP, Create Node.js, Create Static or Create Python). It shows Creating... until the site is ready, then the site opens with its credentials.
Info
If your domain doesn't point to 130.250.176.36 yet, the site is still created, but you'll see a warning and SSL can't be installed until DNS is fixed (see Step 4).

Step 3 — Get Your Credentials

Click a site in the list to expand it. Its credentials are grouped like this:

SectionWordPressPHPNode.jsStaticPython
Your Site (site URL)—YesYesYesYes
WordPress Admin (URL, username, password)Yes————
SFTP / SSH (host, port, username, password, path)YesYesYesYesYes
Database (MySQL)Yes————

Node.js and Python sites also get an app port. It isn't listed with the credentials — it's written into the starter app.js or app.py we create (see Node.js Apps and Python Apps).

Tip
Your credentials stay with the site — expand it on the Websites tab and click Show passwords whenever you need them.

Step 4 — SSL Certificate

If your DNS was configured before creating the site, SSL is installed automatically. If not, click the Install SSL button next to your site after DNS has propagated. Your site will then be accessible via https://.

Domains & SSL

DNS Configuration

Every site requires a domain with an A record pointing to 130.250.176.36. If you want www to work, add a CNAME as well:

Example DNS records
A     @     130.250.176.36
CNAME www   yourdomain.com

SSL Certificates

SSL certificates are provided free via Let's Encrypt and installed automatically when your site is created — as long as DNS is already pointing to the server. If SSL wasn't installed during provisioning:

  1. 1
    Verify your DNS A record points to 130.250.176.36.
  2. 2
    Go to your Websites tab and find the site.
  3. 3
    Click the Install SSL button.
  4. 4
    The certificate is issued and installed in a few seconds. Your site is now available over HTTPS.
Info
SSL certificates renew automatically. When a certificate has 30 days or less left, a Renew SSL button also appears next to the site if you'd rather renew it yourself.

SFTP File Management

Upload and manage your site files using any SFTP client — FileZilla, WinSCP, Cyberduck, or your IDE's built-in SFTP. The same login also works for SSH.

Connection Details

SettingValue
ProtocolSFTP (SSH File Transfer Protocol)
Host130.250.176.36
Port22
UsernameShown in your site credentials (e.g., examplecom)
PasswordShown in your site credentials

File Structure

Your web root is located at:

/home/YOUR_USERNAME/htdocs/yourdomain.com/

This is where you upload your site files. For WordPress, the entire WordPress installation lives here. For other types, upload your application code to this directory.

Quick Start with FileZilla

  1. 1
    Download and install FileZilla from filezilla-project.org.
  2. 2
    Open FileZilla and go to File > Site Manager > New Site.
  3. 3
    Set Protocol to SFTP, Host to 130.250.176.36, Port to 22.
  4. 4
    Set Logon Type to Normal. Enter your username and password from the dashboard.
  5. 5
    Click Connect. On the remote side, open /home/YOUR_USERNAME/htdocs/yourdomain.com/ (the Path in your credentials).
  6. 6
    Drag and drop files from your local machine to the remote panel to upload.

Databases

WordPress sites automatically receive a MySQL database during provisioning. Credentials are displayed in your site's connection info in the dashboard.

WordPress Database Credentials

FieldValue
Hostlocalhost
Database NameShown in credentials (e.g., examplecom-wp)
UsernameSame as database name
PasswordAuto-generated (20 characters)

Connecting to Your Database

You can connect to your MySQL database using any database management tool. Since the database is accessible via localhost, you'll need to SSH tunnel into the server:

SSH tunnel (run on your local machine)
ssh -L 3306:localhost:3306 [email protected]

Then connect your database client (TablePlus, DBeaver, MySQL Workbench, etc.) to localhost:3306 using your database credentials from the dashboard.

Info
WordPress's wp-config.php is pre-configured with your database credentials. You don't need to edit it unless you're migrating an existing database.

WordPress Sites

When you create a WordPress site, we automatically install the latest WordPress release, create a MySQL database, configure wp-config.php, and harden PHP (each site is limited to its own folder, and shell functions such as exec and shell_exec are disabled).

Creating a WordPress Site

  1. 1
    Point your domain's DNS A record to 130.250.176.36.
  2. 2
    In your dashboard, go to your web hosting service and click the Websites tab.
  3. 3
    Click + Add Site and select WordPress as the site type.
  4. 4
    Enter your domain name, and optionally a site title (this becomes your WordPress site name).
  5. 5
    Click Create WordPress and wait while WordPress installs.

Your WordPress Credentials

After creation, expand the site in your dashboard to see:

CredentialDetails
WordPress Admin URLhttps://yourdomain.com/wp-admin
Admin Usernameadmin
Admin PasswordAuto-generated (shown in dashboard)
SFTP Host / Port130.250.176.36 / 22
SFTP UsernameYour site-specific username
SFTP PasswordAuto-generated
Database Hostlocalhost
Database NameAuto-created (e.g., examplecom-wp)
Database PasswordAuto-generated

First Steps After Installation

  1. 1
    Visit https://yourdomain.com/wp-admin and log in with your admin credentials.
  2. 2
    Go to Settings > General and verify your Site Title and Tagline.
  3. 3
    Go to Settings > Permalinks and select "Post name" for clean URLs.
  4. 4
    Install a theme under Appearance > Themes > Add New.
  5. 5
    Install essential plugins: a caching plugin (e.g., WP Super Cache), a security plugin (e.g., Wordfence), and an SEO plugin (e.g., Yoast SEO).

Installing Themes & Plugins

You can install themes and plugins two ways:

  • WordPress Admin: Go to Plugins > Add New or Appearance > Themes and search the directory.
  • SFTP Upload: Upload theme/plugin ZIP files (extracted) to /wp-content/themes/ or /wp-content/plugins/, then activate from the admin panel.

Migrating an Existing WordPress Site

  1. 1
    Install the All-in-One WP Migration plugin on both your old and new sites.
  2. 2
    On your old site, go to All-in-One WP Migration > Export and download the export file.
  3. 3
    On your new Piedmont site, go to All-in-One WP Migration > Import and upload the file.
  4. 4
    After import, go to Settings > Permalinks and click Save (this refreshes rewrite rules).

Performance Tips

  • Install a caching plugin (WP Super Cache or W3 Total Cache)
  • Optimize images before uploading (use ShortPixel or Imagify)
  • Minimize active plugins — only keep what you use
  • Keep WordPress core, themes, and plugins updated
  • Use a CDN like Cloudflare for static assets

PHP Sites

PHP sites provide a blank PHP 8.3 environment for custom applications. No framework is pre-installed — upload your own Laravel, CodeIgniter, Symfony, or vanilla PHP project.

Creating a PHP Site

  1. 1
    Point your domain's DNS A record to 130.250.176.36.
  2. 2
    In your dashboard, go to your web hosting service and click the Websites tab.
  3. 3
    Click + Add Site, select PHP, and enter your domain.
  4. 4
    Click Create PHP.

Deploying Your PHP Application

  1. 1
    Connect to the server via SFTP using the credentials from your dashboard.
  2. 2
    Navigate to your web root: /home/YOUR_USERNAME/htdocs/yourdomain.com/.
  3. 3
    Upload your PHP application files. The server will serve index.php (or index.html) as the entry point.
  4. 4
    If your application uses Composer dependencies, upload the vendor/ directory along with your code.
  5. 5
    Visit https://yourdomain.com to verify your site is working.

PHP Configuration

SettingValue
PHP Version8.3
Web Root/home/USERNAME/htdocs/yourdomain.com/
Entry Pointindex.php (or index.html)
Error LoggingEnabled (check /home/USERNAME/logs/)
RestrictionsPHP is limited to your site’s folder (open_basedir), and exec, shell_exec, system and similar functions are disabled

Laravel Deployment Example

Laravel serves from its public/ folder, but a PHP site's document root is the domain folder itself, and sites run on Nginx, so .htaccess files are ignored. Don't put your whole project in the web root as-is — that can expose your .env file.

  1. 1
    Upload your Laravel project (including vendor/) via SFTP, but leave out your .env file for now.
  2. 2
    Open a support ticket and we'll point the site's document root at the project's public/ folder.
  3. 3
    Once that's done, create the .env file in the project root with your settings, including APP_URL=https://yourdomain.com.
  4. 4
    Visit your domain to verify the application loads correctly.
Tip
PHP sites don't include a database by default. If your application needs MySQL, open a support ticket and we'll provision one for you.

Node.js Apps

Node.js sites run your JavaScript application on Node.js 22 with an auto-assigned port. The platform reverse-proxies your domain (ports 80/443) to your app's port, so visitors reach your site normally over HTTPS. You start the app yourself and keep it running — nothing starts or restarts it for you.

Creating a Node.js Site

  1. 1
    Point your domain's DNS A record to 130.250.176.36.
  2. 2
    In your dashboard, go to your web hosting service and click the Websites tab.
  3. 3
    Click + Add Site, select Node.js, and enter your domain.
  4. 4
    Click Create Node.js.
  5. 5
    Note your app's port: open the starter app.js we created — it's the number after process.env.PORT ||. Your app must listen on that port.

Deploying Your Application

  1. 1
    Connect via SFTP and navigate to /home/YOUR_USERNAME/htdocs/yourdomain.com/.
  2. 2
    Upload your application files (app.js or index.js, package.json, etc.). Note your port from the starter app.js before you replace it with your code.
  3. 3
    Upload your node_modules/ directory, or SSH in and run npm install.
  4. 4
    Make sure your app listens on your site's port (see the examples below).
  5. 5
    Start the app over SSH and keep it running (see Keeping Your App Running below), then visit https://yourdomain.com to verify.

Listening on the Correct Port

Your app must listen on your site's port — the one in the starter app.js. The PORT environment variable isn't set for you, so put your port number in your code:

Express.js example (app.js)
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3005; // replace 3005 with your site's port (from the starter app.js)

app.get('/', (req, res) => {
  res.send('Hello from Piedmont Hosting!');
});

app.listen(PORT, '127.0.0.1', () => {
  console.log(`Server running on port ${PORT}`);
});
Next.js
# Next.js listens on port 3000 unless told otherwise. Build, then start it on your site's port:
npm run build
npx next start -H 127.0.0.1 -p 3005   # replace 3005 with your site's port

Installing Dependencies via SSH

Instead of uploading node_modules/, you can SSH into the server and install directly:

ssh [email protected]
cd htdocs/yourdomain.com
npm install

Keeping Your App Running

Nothing starts your app for you, and nothing restarts it if it stops. Start it over SSH and keep it running with a process manager such as PM2:

cd htdocs/yourdomain.com
npm install -g pm2
pm2 start app.js --name app
pm2 save

After uploading new code, restart your app yourself (for example pm2 restart app) — nothing restarts it automatically. If your site stops responding after server maintenance, SSH in and start the app again (with PM2, pm2 resurrect brings back the apps you saved).

How the Reverse Proxy Works

The platform automatically configures a reverse proxy so that incoming requests on ports 80 (HTTP) and 443 (HTTPS) are forwarded to your app's port while your app is running. You don't need to configure SSL or port forwarding — it's all handled for you.

Python Apps

Python sites run your application on Python 3.12 with an auto-assigned port and automatic reverse proxy. Deploy Django, Flask, FastAPI, or any WSGI/ASGI app. You start the app yourself and keep it running — nothing starts or restarts it for you.

Creating a Python Site

  1. 1
    Point your domain's DNS A record to 130.250.176.36.
  2. 2
    In your dashboard, go to your web hosting service and click the Websites tab.
  3. 3
    Click + Add Site, select Python, and enter your domain.
  4. 4
    Click Create Python.
  5. 5
    Note your app's port: open the starter app.py we created — it's the number in os.environ.get('PORT', …). Your app must bind to that port.

Deploying Your Application

  1. 1
    Connect via SFTP and navigate to /home/YOUR_USERNAME/htdocs/yourdomain.com/.
  2. 2
    Upload your application files (app.py, requirements.txt, etc.). Note your port from the starter app.py before you replace it with your code.
  3. 3
    SSH in and install dependencies in a virtual environment (see below).
  4. 4
    Start your app over SSH, bound to 127.0.0.1 and your site's port (see the examples below).
  5. 5
    Visit https://yourdomain.com to verify your site is working.

Installing Dependencies

SSH in and set up your environment
ssh [email protected]
cd htdocs/yourdomain.com
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

Flask Example

app.py
from flask import Flask
import os

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello from Piedmont Hosting!'

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 3005))  # replace 3005 with your site's port (from the starter app.py)
    app.run(host='127.0.0.1', port=port)
requirements.txt
flask

Flask's built-in server is meant for development. For a live site, install Gunicorn (pip install gunicorn) and run the app with it instead: gunicorn app:app --bind 127.0.0.1:3005 --daemon (with your site's port).

Django Example

Start with Gunicorn (recommended)
# Install gunicorn
pip install gunicorn

# Run (replace myproject.wsgi with your WSGI module, and 3005 with your site's port)
gunicorn myproject.wsgi:application --bind 127.0.0.1:3005 --daemon

FastAPI Example

app.py
from fastapi import FastAPI
import os

app = FastAPI()

@app.get('/')
def read_root():
    return {'message': 'Hello from Piedmont Hosting!'}

# Run with: uvicorn app:app --host 127.0.0.1 --port 3005   (replace 3005 with your site's port)
Tip
Bind your app to 127.0.0.1 and your site's port. The reverse proxy runs on the same server, so your app doesn't need to listen on any other address. The PORT variable isn't set for you, so use your site's port number. Run the app in the background (for example with Gunicorn's --daemon, or nohup) so it keeps running after you log out — and start it again yourself if it stops or after server maintenance.

Static HTML Sites

Static sites serve HTML, CSS, JavaScript, and other assets directly — no server-side processing. Ideal for landing pages, portfolios, documentation sites, and single-page applications (SPAs).

Creating a Static Site

  1. 1
    Point your domain's DNS A record to 130.250.176.36.
  2. 2
    In your dashboard, go to your web hosting service and click the Websites tab.
  3. 3
    Click + Add Site, select Static, and enter your domain.
  4. 4
    Click Create Static.

Deploying Your Files

  1. 1
    Connect via SFTP using the credentials from your dashboard.
  2. 2
    Navigate to /home/YOUR_USERNAME/htdocs/yourdomain.com/.
  3. 3
    Upload your index.html and all supporting files (CSS, JS, images).
  4. 4
    Visit https://yourdomain.com — your site is live.

File Structure Example

Typical static site layout
yourdomain.com/
  index.html        ← Entry point
  about.html
  css/
    style.css
  js/
    main.js
  images/
    logo.png

Deploying a React / Vue / SPA Build

For single-page applications built with React, Vue, Svelte, or similar frameworks:

  1. 1
    Build your project locally (e.g., npm run build).
  2. 2
    Upload the contents of the build output directory (dist/ or build/) to the web root via SFTP.
  3. 3
    The index.html from your build becomes the entry point.
Info
Static sites have no server-side runtime. If you need API endpoints or server-side logic, use the Node.js or Python site type instead.

Email Hosting

Every web hosting plan includes email on your own domain, powered by mailcow — 1 mailbox on Starter, 5 on Business and 25 on Pro. Create addresses like [email protected] from the Email tab of your service.

Plan Limits

PlanMailboxesStorage per Mailbox
Starter1 mailbox1 GB
Business5 mailboxes2 GB each
Pro25 mailboxes5 GB each

Creating a Mailbox

  1. 1
    Add the domain as a site on the Websites tab first — mailboxes can only use domains that are sites on this service.
  2. 2
    Open the Email tab and click + New Mailbox.
  3. 3
    Enter the username (e.g., info) and the domain. Set a password, or leave it blank to have one generated.
  4. 4
    Click Create Mailbox. The password is shown once on screen and emailed to you — save it.

You can also create forwarding addresses on the Aliases tab (+ New Alias) once the domain has a mailbox.

Accessing Your Email

You can access email via webmail or any standard email client:

MethodDetails
WebmailLog in at mail.piedmonthosting.com with your full email address and password
IMAP Servermail.piedmonthosting.com — Port 993 (SSL/TLS)
SMTP Servermail.piedmonthosting.com — Port 587 (STARTTLS)
UsernameYour full email address (e.g., [email protected])

Required DNS Records

For email to work correctly, add these DNS records at your domain registrar. The Email tab shows the exact records for your domain — click DNS next to a mailbox:

TypeNameValue
MX@ (root domain)mail.piedmonthosting.com (priority 10)
TXT (SPF)@ (root domain)v=spf1 mx a:mail.piedmonthosting.com ~all
TXT (DKIM)dkim._domainkeyYour domain’s DKIM key — copy it from the DNS records on the Email tab
TXT (DMARC)_dmarcv=DMARC1; p=quarantine; rua=mailto:[email protected]
CNAMEautodiscovermail.piedmonthosting.com
CNAMEautoconfigmail.piedmonthosting.com
Warning
Mail sent to your domain isn't delivered until the MX record is in place, and mail you send is more likely to land in spam without the SPF, DKIM and DMARC records. DNS changes typically propagate within a few minutes to a few hours.

Email Clients

Compatible with all major email clients including:

  • Desktop: Outlook, Thunderbird, Apple Mail
  • Mobile: iOS Mail, Gmail app, Outlook app
  • Web: Webmail at mail.piedmonthosting.com
Tip
With the two CNAME records above in place, most email clients can set themselves up from just your email address and password.