A repeatable framework for launching WordPress sites on my infrastructure
๐งญ Overview
Setting up a new site should not feel like starting from scratch every time.
This guide defines a repeatable, structured process for launching new websites across the ecosystem โ from idea โ domain โ infrastructure โ live site.
The goal is simple:
- Reduce friction
- Capture decisions
- Enable reuse
- Prepare for future automation
๐งฑ High-Level Flow
0. Site Definition
1. Domain & DNS
2. Edge (Reverse Proxy)
3. Application (WordPress)
4. Cloudflare
5. Media Pipeline
6. Site Build
7. Security
8. Backup & Recovery
9. Monitoring
10. Automation Readiness
Each step builds on the previous.
โก Quick Start
For experienced setup:
1. Define site (name, purpose, WP vs Woo)
2. Allocate domain + DNS
3. Create reverse proxy + SSL
4. Deploy WordPress + DB
5. Enable Cloudflare
6. Configure media pipeline
7. Build site
Then return to sections below for detail.
๐ง Site Definition
Before touching infrastructure โ define the site.
Purpose & Positioning
- What is the site for?
- Who is it for?
- Content type:
- Blog
- Store
- Hybrid
- Project hub
Monetisation Strategy
- Affiliate links
- Ads
- Products (WooCommerce?)
- Lead generation
Platform Decision
- WordPress only โ content-first
- WordPress + WooCommerce โ commerce-enabled
๐ Default to WordPress only, add Woo later.
Identity & Secrets
Record and store securely (KeePass):
- Domain registrar access
- Cloudflare credentials / API tokens
- DB credentials
- WordPress admin bootstrap
- SSH access
Environment Model (Optional but recommended)
dev.site.comtest.site.comwww.site.com
Ecosystem Integration
- How does this site connect to:
- at-the-bach
- a-way
- evalue-it
- at-the-mall
Think in terms of:
- content reuse
- cross-linking
- funnels
๐ Domain & DNS
Domain Allocation
- Register or assign domain
- Decide canonical URL:
wwwvs root
DNS Setup
- Route53 (or equivalent)
- Create records:
- A / CNAME โ reverse proxy
- Optional:
- Delegate subdomain to Cloudflare
๐ Edge Layer (Reverse Proxy)
Host Selection
- Choose target hosting infrastructure (AWS, Cloudflare, Azure, Home)
- Choose target host (e.g. wordpress-01)
AWS
Reverse Proxy Config
- Apache or …
- Define:
- server_name
- upstream target
- logging
WIP Site
- Basic placeholder page
/etc/apache2/sites-available# cp 001-default.conf me.ensite.FOO.conf
Update configuration
<VirtualHost *:80>
ServerName FOO.ensite.me
DocumentRoot /var/www/in-the-making
<Directory "/var/www/in-the-making">
allow from all
Options None
Require all granted
</Directory>
</VirtualHost>
- Confirm routing works before proceeding
SSL Enablement
- Certbot
# sudo certbot --apache -d foo.ensite.me
- Validate HTTPS access
โ๏ธ Application Layer (WordPress)
Database Setup
DB Host
- Current:
test-mariadb-01
Naming Convention
[p|t|d]_{4 chars}
Example:
p_foob โ Foo Bah production
Create DB + User
Create database with least priveledge
MariaDB [(none)]>
create database p_foob;
Query OK, 1 row affected (0.002 sec)
create user 'p_foob'@'%' identified by 'strongpassword';
Query OK, 0 rows affected (0.010 sec)
grant all privileges on p_foob.* to 'p_foob'@'%';
Query OK, 0 rows affected (0.005 sec)
flush privileges;
Query OK, 0 rows affected (0.001 sec)
Store in KeePass
- Host
- DB name
- Username
- Password
WordPress Deployment (guide …)
Obtain WordPress
- Download latest OR reuse stable version
Deploy Files
- Copy into:
/var/www/me.ensite.foo
Configure wp-config.php
- DB connection
- Keys / salts
- Debug settings (off for prod)
Connect to Reverse Proxy
Within the site configuration file for that site, eg. /etc/apache2/sites-available/com.evalue-it.www-le-ssl.conf replace:
old sites-available conf file
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName foo.ensite.me
DocumentRoot /var/www/in-the-making
<Directory "/var/www/in-the-making">
allow from all
Options None
Require all granted
</Directory>
SSLCertificateFile /etc/letsencrypt/live/foo.ensite.me/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/foo.ensite.me/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
… with:
new sites-available conf file
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName foo.ensite.me
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/foo.ensite.me/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/foo.ensite.me/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
ProxyRequests Off
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
ProxyPass / http://10.3.6.210/
ProxyPassReverse / http://10.3.6.210/
ErrorLog ${APACHE_LOG_DIR}/me.ensite.foo-error.log
CustomLog ${APACHE_LOG_DIR}/me.ensite.foo-access.log combined
</VirtualHost>
</IfModule>
Restart apache2: # systemctl restart apache2.service
(Future)
- Ensure PHP handler works
- Validate routing
Run Installer
/wp-admin/install.php
Set:
- Site name
- Admin user
- Password
Baseline Setup
- Permalinks โ โPost nameโ
- Remove default plugins/themes
- Install essentials (minimal)
โ๏ธ Cloudflare Setup
DNS Integration
- Proxy traffic via Cloudflare
SSL Mode
- Full (strict preferred)
Caching Rules
- Cache static assets
- Bypass admin paths
Basic WAF
- Enable protections
- Rate limiting (optional)
๐ผ๏ธ Media / Asset Pipeline
R2 Bucket Setup
- Example:
media-public
URL Strategy
- Avoid tight coupling to:
/wp-content/uploads
Sync Process
- Use
rclone/wget
Test Delivery
- Confirm assets served via:
media.ensite.me
๐จ Site Build
Theme Selection
- Lightweight (e.g. GeneratePress)
Structure
- Pages
- Categories
- Navigation
Content
- Initial posts
- Images via pipeline
SEO & AI Readiness
- Sitemap
- OpenGraph
- Schema (where relevant)
- Internal linking
๐ Security Hardening
- Disable XML-RPC (if unused)
- Strong admin credentials
- Limit login attempts
- File permissions
- Hide unnecessary endpoints
๐พ Backup & Recovery
Database Backup
- Daily dump
File Backup
- WP files + uploads
Offsite Storage
- Prefer R2 or external disk
Restore Test
- Verify recovery works
๐ Monitoring & Ops
- HTTP uptime checks
- Log review:
- nginx
- php
- Error tracking
โ Refrence Runbooks and Completion Checklist
- [ ] Domain live
- [ ] SSL working
- [ ] WordPress installed
- [ ] Admin access secured
- [ ] Cloudflare active
- [ ] Media pipeline tested
- [ ] First post published
- [ ] Backup configured
-
Site Setup – WordPress Deployment
-
Site Setup – WooCommerce Runbook
๐ Automation Readiness
This is where the system evolves.
Standardisation
- Naming conventions
- Directory structures
- Config templates
Script Opportunities
- DB creation
- WP deployment
- Apache config generation
Future State
- One-command site creation
- Internal hosting platform
- Potential external service