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:
35
docker/apache/000-default.conf
Normal file
35
docker/apache/000-default.conf
Normal 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
23
docker/mysql/init.sql
Normal 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
22
docker/php/php.ini
Normal 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
|
||||
Reference in New Issue
Block a user