| Document Reference | TRACK-HVU24K-2026-V2 |
|---|---|
| Core Platform | Ubuntu Production VM Node (hvu24k) |
| External Gatekeeper | Bare-Metal Nginx SNI Edge Router Proxy |
| Runtime Engines | Isolated Dual-Socket PHP 8.3 & PHP 8.1 FPM Pipelines |
This manual serves as a production-grade infrastructure deployment record and a comprehensive operational guide for your homelab cluster setup on hvu24k. It documents the exact configuration matrix used to successfully orchestrate your flat-file ecosystem, eliminating any future reliance on multi-VPS platforms.
Unlike standard web server blocks, Nginx's Layer 4 stream {} map feature does not natively understand leading-dot shortcuts (.ffcms.stream) or classic asterisks (*.ffcms.stream) unless the map is explicitly formatted for hostnames.
When Nginx encountered a leading dot in the map file, it treated it as a literal string instead of a wildcard evaluation, causing it to fail back to your default 1Panel route. To force Nginx's stream map tool to handle wildcard lookups correctly, you must use a leading asterisk format (*) without a leading dot.
# --- FLAT-FILE CMS FLIGHT TRACKER --- ffcms.stream 192.168.0.172:443; *.ffcms.stream 192.168.0.172:443;
Apply changes by running:
sudo nginx -t && sudo systemctl reload nginx
To achieve optimal performance and strict platform isolation, the fleet is split dynamically into two standalone FastCGI process pools.
These modern frameworks utilize advanced Symfony or Laravel core architectures, operating on your fast PHP 8.3 pipeline:
These robust engines operate seamlessly under your primary PHP 8.1 web processing layer:
Note: Baun CMS, Flextype, Typesetter, Monstra, Batflat, and Parvula have been cleanly unlinked, deleted, and purged to maintain strict system hygiene.
Used for heavy frameworks that separate core configuration logic from the public web entry hub. This ensures the master app files sit safely outside public reach, while public traffic is funneled exclusively into the public or web subfolder.
<VirtualHost *:80>
ServerAdmin clytn50@gmail.com
DocumentRoot /var/www/html/statamic/public/
ServerName statamic.ffcms.stream
ServerAlias www.statamic.ffcms.stream
# 🚀 FORCE PHP 8.3 SOCKET FOR LARAVEL CORE REQUIREMENTS
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
<Directory /var/www/html/statamic/public/>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/statamic_error.log
CustomLog ${APACHE_LOG_DIR}/statamic_access.log combined
</VirtualHost>
Used to enforce strict Apache Basic Authentication at the proxy URL request layer before third-party .htaccess files load or rewrite rules process. This keeps Kirby invisible to public crawlers and fulfills free evaluation tier guidelines.
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin clytn50@gmail.com
DocumentRoot /var/www/html/kirby/
ServerName kirby.ffcms.stream
ServerAlias www.kirby.ffcms.stream
# 🚀 ROUTE TRAFFIC TO THE HIGH-PERFORMANCE PHP 8.3 FPM SOCKET
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
<Directory /var/www/html/kirby/>
Options +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 🔐 FORCE LOCATION AUTHENTICATION GATES PRIOR TO DIRECTORY PROCESSING
<Location />
AuthType Basic
AuthName "Kirby Private Staging Cluster"
AuthUserFile /etc/apache2/.kirby.htpasswd
Require valid-user
</Location>
ErrorLog ${APACHE_LOG_DIR}/kirby_error.log
CustomLog ${APACHE_LOG_DIR}/kirby_access.log combined
</VirtualHost>
</IfModule>
To renew or create certificates for a precise subdomain without altering your cluster's broader mappings:
sudo certbot --apache -d htmly.ffcms.stream -d www.htmly.ffcms.stream
Always select option 2 to enforce permanent, automated HTTPS secure redirection mapping passes.
When flat-file engines like Pulse CMS expect safe hashed credentials inside their configuration arrays rather than plain text, compute them natively using the target CLI binary:
/usr/bin/php8.1 -r 'echo password_hash("YOUR_TARGET_PASSWORD", PASSWORD_BCRYPT) . "\n";'
If an engine throws infinite rejection loops (such as Pulse CMS displaying “Too many login failures” even after a complete reinstallation pass), the browser cache is passing stale session metrics.
1. Open Browser DevTools (**F12**). 2. Navigate to **Application** -> **Storage** / **Session Storage** / **Cookies**. 3. Clear all tracking keys bound to the subdomain domain string. 4. Force-purge backend temporary paths: ''sudo rm -rf /var/www/html/pulse/data/cache/*'' 5. Close all windows, open a brand-new **Incognito Tab**, and run a raw curl check: ''curl -I https://ffcms.stream'' to verify the ''HTTP/1.1 200 OK'' clean entry profile.
| Subdomain Hub | Architecture | Primary Strategy / Script Blueprint |
|---|
| statamic | PHP 8.3 FPM | sudo -u www-data /usr/bin/php8.3 /usr/bin/composer create-project statamic/statamic statamic –prefer-dist –no-interaction <br> Create user via: sudo -u www-data /usr/bin/php8.3 artisan statamic:make:user |
| grav | PHP 8.3 FPM | Extracted official Admin package, linked to PHP 8.3 via FilesMatch. Core asset dependencies fully pre-built. |
| kirby | PHP 8.3 FPM | Extracted Starterkit main branch. Panel enabled remotely via site/config/config.php return array parameter: “panel” ⇒ [“install” ⇒ true]. Locked behind custom .kirby.htpasswd file. |
| dokuwiki | PHP 8.3 FPM | Unpacked stable tarball. Configured custom permissions using native Access Control List manager. Removed install.php after onboarding profile build. |
| herbie | PHP 8.3 FPM | Created via composer create-project getherbie/start-website. DocumentRoot funneled to secure public /web/ directory. Rebuilt vendor tree via PHP 8.3 binary manually. |
| boidcms | PHP 8.1 FPM | Self-contained environment layer. Generic deployment credentials map cleanly to user admin and password password. |
| flatpress | PHP 8.1 FPM | Extracted github master branch array. Fully self-contained engine that relies on native PHP rendering engines without requiring Composer arrays. |
| htmly | PHP 8.1 FPM | Extracted stable release zip. Resolved internal template compiler crash ([views.root] is not set) by enforcing direct traffic to /install.php initialization hook script. |
| mecha | PHP 8.1 FPM | Extracted release bundle, collapsed inner repository paths. Permissions recursively set to Apache user pool. |
| mozilo | PHP 8.1 FPM | Extracted source zip, flattened inner master folders. Preserved baseline entry code by safely renaming index.php to index.php.bak for staging operations. |
| pulse | PHP 8.1 FPM | Clean reinstallation path. Initialized folder arrays via /admin/install.php call. Core logins verified as encrypted bcrypt structures rather than obsolete plain text scripts. |
| Permissions Enforcement Blueprint |
|---|
sudo chown -R www-data:www-data /var/www/html/
sudo find /var/www/html/ -type d -exec chmod 755 {} \;
sudo find /var/www/html/ -type f -exec chmod 644 {} \;
sudo systemctl restart apache2