Add Dockerized LAMP stack and website skeleton for ALWISP

- Docker Compose orchestrating PHP 8.2/Apache web container and MySQL 8.0
- Dockerfile with GD, PDO, MySQLi extensions and security hardening
- Apache vhost with mod_rewrite, deflate, expires, and security headers
- PHP config with OPcache enabled and display_errors off
- MySQL init schema (contacts, coverage_zones tables)
- Front-controller PHP router (index.php → pages/)
- Responsive homepage: hero, stats bar, services cards, why section, coverage CTA
- Stub pages: services, coverage, about, contact (with working form skeleton), 404
- CSS design system using brand palette from logo (navy #0d1b3e → teal #00bcd4 + orange #f57c00 accents)
- JS: nav scroll/mobile toggle, IntersectionObserver counter animation, scroll reveal

https://claude.ai/code/session_015wpwmheufcxkBuXivrSHhd
This commit is contained in:
Claude
2026-02-28 21:39:21 +00:00
parent 69b567cf72
commit 3e26125afa
18 changed files with 1469 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
<VirtualHost *:80>
ServerAdmin webmaster@alwisp.net
DocumentRoot /var/www/html
<Directory /var/www/html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Security headers
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Compression
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css text/javascript application/javascript application/json
</IfModule>
# Cache static assets
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/webp "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
</IfModule>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

23
docker/mysql/init.sql Normal file
View File

@@ -0,0 +1,23 @@
-- ALWISP Database Schema (skeleton)
CREATE DATABASE IF NOT EXISTS `alwisp` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `alwisp`;
-- Contact form submissions
CREATE TABLE IF NOT EXISTS `contacts` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(120) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`phone` VARCHAR(30),
`subject` VARCHAR(255),
`message` TEXT NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- Service availability zones (placeholder)
CREATE TABLE IF NOT EXISTS `coverage_zones` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`zone_name` VARCHAR(120) NOT NULL,
`description` TEXT,
`active` TINYINT(1) DEFAULT 1,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

22
docker/php/php.ini Normal file
View File

@@ -0,0 +1,22 @@
; Performance
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
; Security
expose_php = Off
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
; Limits
upload_max_filesize = 32M
post_max_size = 32M
max_execution_time = 60
memory_limit = 256M
; Session
session.cookie_httponly = 1
session.cookie_secure = 1
session.use_strict_mode = 1