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
| Plan | Sites | Storage | Monthly | Annual | |
|---|---|---|---|---|---|
| Starter | 1 site | 5 GB | 1 mailbox (1 GB) | $3.00/mo | $32.40/yr |
| Business | 5 sites | 25 GB | 5 mailboxes (2 GB each) | $8.00/mo | $86.40/yr |
| Pro | 25 sites | 50 GB | 25 mailboxes (5 GB each) | $15.00/mo | $162.00/yr |
Supported Site Types
| Type | Best For | Includes |
|---|---|---|
| WordPress | Blogs, CMS, e-commerce, portfolios | MySQL database, WP admin panel, PHP 8.3 |
| PHP | Laravel, CodeIgniter, custom PHP apps | PHP 8.3 runtime, web root access |
| Node.js | Express, Next.js, API servers | Node.js 22, auto-assigned port, reverse proxy |
| Static HTML | Landing pages, docs sites, SPAs | Direct file serving, no runtime needed |
| Python | Django, Flask, FastAPI apps | Python 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:
| Type | Name | Value | TTL |
|---|---|---|---|
| A | @ (root domain) | 130.250.176.36 | Auto |
| CNAME | www | yourdomain.com | Auto |
dig yourdomain.com or an online tool like whatsmydns.net.Step 2 — Add the Site
- 1Open your web hosting service page from the dashboard.
- 2On the Websites tab, click + Add Site.
- 3Choose a site type: WordPress, PHP, Node.js, Static or Python.
- 4Enter your domain name (e.g.,
example.com). For WordPress, you can also enter a site title. - 5Click 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.
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:
| Section | WordPress | PHP | Node.js | Static | Python |
|---|---|---|---|---|---|
| Your Site (site URL) | — | Yes | Yes | Yes | Yes |
| WordPress Admin (URL, username, password) | Yes | — | — | — | — |
| SFTP / SSH (host, port, username, password, path) | Yes | Yes | Yes | Yes | Yes |
| 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).
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:
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:
- 1Verify your DNS A record points to
130.250.176.36. - 2Go to your Websites tab and find the site.
- 3Click the Install SSL button.
- 4The certificate is issued and installed in a few seconds. Your site is now available over HTTPS.
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
| Setting | Value |
|---|---|
| Protocol | SFTP (SSH File Transfer Protocol) |
| Host | 130.250.176.36 |
| Port | 22 |
| Username | Shown in your site credentials (e.g., examplecom) |
| Password | Shown 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
- 1Download and install FileZilla from filezilla-project.org.
- 2Open FileZilla and go to File > Site Manager > New Site.
- 3Set Protocol to SFTP, Host to
130.250.176.36, Port to22. - 4Set Logon Type to Normal. Enter your username and password from the dashboard.
- 5Click Connect. On the remote side, open
/home/YOUR_USERNAME/htdocs/yourdomain.com/(the Path in your credentials). - 6Drag 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
| Field | Value |
|---|---|
| Host | localhost |
| Database Name | Shown in credentials (e.g., examplecom-wp) |
| Username | Same as database name |
| Password | Auto-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 -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.
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
- 1Point your domain's DNS A record to
130.250.176.36. - 2In your dashboard, go to your web hosting service and click the Websites tab.
- 3Click + Add Site and select WordPress as the site type.
- 4Enter your domain name, and optionally a site title (this becomes your WordPress site name).
- 5Click Create WordPress and wait while WordPress installs.
Your WordPress Credentials
After creation, expand the site in your dashboard to see:
| Credential | Details |
|---|---|
| WordPress Admin URL | https://yourdomain.com/wp-admin |
| Admin Username | admin |
| Admin Password | Auto-generated (shown in dashboard) |
| SFTP Host / Port | 130.250.176.36 / 22 |
| SFTP Username | Your site-specific username |
| SFTP Password | Auto-generated |
| Database Host | localhost |
| Database Name | Auto-created (e.g., examplecom-wp) |
| Database Password | Auto-generated |
First Steps After Installation
- 1Visit
https://yourdomain.com/wp-adminand log in with your admin credentials. - 2Go to Settings > General and verify your Site Title and Tagline.
- 3Go to Settings > Permalinks and select "Post name" for clean URLs.
- 4Install a theme under Appearance > Themes > Add New.
- 5Install 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
- 1Install the All-in-One WP Migration plugin on both your old and new sites.
- 2On your old site, go to All-in-One WP Migration > Export and download the export file.
- 3On your new Piedmont site, go to All-in-One WP Migration > Import and upload the file.
- 4After 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
- 1Point your domain's DNS A record to
130.250.176.36. - 2In your dashboard, go to your web hosting service and click the Websites tab.
- 3Click + Add Site, select PHP, and enter your domain.
- 4Click Create PHP.
Deploying Your PHP Application
- 1Connect to the server via SFTP using the credentials from your dashboard.
- 2Navigate to your web root:
/home/YOUR_USERNAME/htdocs/yourdomain.com/. - 3Upload your PHP application files. The server will serve
index.php(orindex.html) as the entry point. - 4If your application uses Composer dependencies, upload the
vendor/directory along with your code. - 5Visit
https://yourdomain.comto verify your site is working.
PHP Configuration
| Setting | Value |
|---|---|
| PHP Version | 8.3 |
| Web Root | /home/USERNAME/htdocs/yourdomain.com/ |
| Entry Point | index.php (or index.html) |
| Error Logging | Enabled (check /home/USERNAME/logs/) |
| Restrictions | PHP 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.
- 1Upload your Laravel project (including
vendor/) via SFTP, but leave out your.envfile for now. - 2Open a support ticket and we'll point the site's document root at the project's
public/folder. - 3Once that's done, create the
.envfile in the project root with your settings, includingAPP_URL=https://yourdomain.com. - 4Visit your domain to verify the application loads correctly.
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
- 1Point your domain's DNS A record to
130.250.176.36. - 2In your dashboard, go to your web hosting service and click the Websites tab.
- 3Click + Add Site, select Node.js, and enter your domain.
- 4Click Create Node.js.
- 5Note your app's port: open the starter
app.jswe created — it's the number afterprocess.env.PORT ||. Your app must listen on that port.
Deploying Your Application
- 1Connect via SFTP and navigate to
/home/YOUR_USERNAME/htdocs/yourdomain.com/. - 2Upload your application files (
app.jsorindex.js,package.json, etc.). Note your port from the starterapp.jsbefore you replace it with your code. - 3Upload your
node_modules/directory, or SSH in and runnpm install. - 4Make sure your app listens on your site's port (see the examples below).
- 5Start the app over SSH and keep it running (see Keeping Your App Running below), then visit
https://yourdomain.comto 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:
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 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
- 1Point your domain's DNS A record to
130.250.176.36. - 2In your dashboard, go to your web hosting service and click the Websites tab.
- 3Click + Add Site, select Python, and enter your domain.
- 4Click Create Python.
- 5Note your app's port: open the starter
app.pywe created — it's the number inos.environ.get('PORT', …). Your app must bind to that port.
Deploying Your Application
- 1Connect via SFTP and navigate to
/home/YOUR_USERNAME/htdocs/yourdomain.com/. - 2Upload your application files (
app.py,requirements.txt, etc.). Note your port from the starterapp.pybefore you replace it with your code. - 3SSH in and install dependencies in a virtual environment (see below).
- 4Start your app over SSH, bound to
127.0.0.1and your site's port (see the examples below). - 5Visit
https://yourdomain.comto verify your site is working.
Installing Dependencies
ssh [email protected] cd htdocs/yourdomain.com python3 -m venv venv source venv/bin/activate pip install -r requirements.txt
Flask Example
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)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
# 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
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)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
- 1Point your domain's DNS A record to
130.250.176.36. - 2In your dashboard, go to your web hosting service and click the Websites tab.
- 3Click + Add Site, select Static, and enter your domain.
- 4Click Create Static.
Deploying Your Files
- 1Connect via SFTP using the credentials from your dashboard.
- 2Navigate to
/home/YOUR_USERNAME/htdocs/yourdomain.com/. - 3Upload your
index.htmland all supporting files (CSS, JS, images). - 4Visit
https://yourdomain.com— your site is live.
File Structure Example
yourdomain.com/
index.html ← Entry point
about.html
css/
style.css
js/
main.js
images/
logo.pngDeploying a React / Vue / SPA Build
For single-page applications built with React, Vue, Svelte, or similar frameworks:
- 1Build your project locally (e.g.,
npm run build). - 2Upload the contents of the build output directory (
dist/orbuild/) to the web root via SFTP. - 3The
index.htmlfrom your build becomes the entry point.
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
| Plan | Mailboxes | Storage per Mailbox |
|---|---|---|
| Starter | 1 mailbox | 1 GB |
| Business | 5 mailboxes | 2 GB each |
| Pro | 25 mailboxes | 5 GB each |
Creating a Mailbox
- 1Add the domain as a site on the Websites tab first — mailboxes can only use domains that are sites on this service.
- 2Open the Email tab and click + New Mailbox.
- 3Enter the username (e.g.,
info) and the domain. Set a password, or leave it blank to have one generated. - 4Click 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:
| Method | Details |
|---|---|
| Webmail | Log in at mail.piedmonthosting.com with your full email address and password |
| IMAP Server | mail.piedmonthosting.com — Port 993 (SSL/TLS) |
| SMTP Server | mail.piedmonthosting.com — Port 587 (STARTTLS) |
| Username | Your 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:
| Type | Name | Value |
|---|---|---|
| MX | @ (root domain) | mail.piedmonthosting.com (priority 10) |
| TXT (SPF) | @ (root domain) | v=spf1 mx a:mail.piedmonthosting.com ~all |
| TXT (DKIM) | dkim._domainkey | Your domain’s DKIM key — copy it from the DNS records on the Email tab |
| TXT (DMARC) | _dmarc | v=DMARC1; p=quarantine; rua=mailto:[email protected] |
| CNAME | autodiscover | mail.piedmonthosting.com |
| CNAME | autoconfig | mail.piedmonthosting.com |
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