100 lines
3.6 KiB
Markdown
100 lines
3.6 KiB
Markdown
# Filesystem & Directory Structure
|
|
|
|
```mermaid
|
|
graph TD
|
|
Root["/server/websites/"]
|
|
|
|
%% Root Configuration & State Files
|
|
StateFile[".engine-settings\n(Persisted: RUNTIME, PROXY_TYPE, SSH_PORT, GRAFANA_PASS)"]
|
|
ScriptExec["/usr/local/bin/wp-engine.sh\n(Self-contained installer & provisioner)"]
|
|
Root --- StateFile
|
|
Root --- ScriptExec
|
|
|
|
%% Core Shared Stack
|
|
subgraph CoreDir["/server/websites/core/"]
|
|
CoreEnv[".env (DB_ROOT_PASSWORD, REDIS_PASSWORD, NEXT_REDIS_INDEX)"]
|
|
CoreCompose["docker-compose.yml (core_mariadb + core_redis)"]
|
|
CoreConfig["config/mariadb/99-performance.cnf"]
|
|
CoreDataMariaDB[("data/mariadb/ (Persistent MySQL data)")]
|
|
CoreDataRedis[("data/redis/ (Persistent Redis dump)")]
|
|
|
|
CoreEnv --- CoreCompose
|
|
CoreCompose --- CoreConfig
|
|
CoreCompose --- CoreDataMariaDB
|
|
CoreCompose --- CoreDataRedis
|
|
end
|
|
Root --> CoreDir
|
|
|
|
%% Proxy Stack
|
|
subgraph ProxyDir["/server/websites/proxy/"]
|
|
ProxyCompose["docker-compose.yml (ingress_proxy)"]
|
|
ProxyData["data/ (NPM state / Caddy data)"]
|
|
ProxyLE["letsencrypt/ (acme.json / certs)"]
|
|
ProxyLogs["logs/access.log (Scanned by bare-host Fail2ban)"]
|
|
ProxyCaddy["Caddyfile (If Caddy selected; dynamically updated)"]
|
|
|
|
ProxyCompose --- ProxyData
|
|
ProxyCompose --- ProxyLE
|
|
ProxyCompose --- ProxyLogs
|
|
ProxyCompose --- ProxyCaddy
|
|
end
|
|
Root --> ProxyDir
|
|
|
|
%% Monitoring Stack
|
|
subgraph MonDir["/server/websites/monitoring/"]
|
|
MonCompose["docker-compose.yml (Prometheus, Node Exp, cAdvisor, Grafana)"]
|
|
PromConfig["prometheus/prometheus.yml"]
|
|
GrafanaProv["grafana/provisioning/datasources/prometheus.yaml"]
|
|
MonData["prometheus_data / grafana_data (Named Volumes)"]
|
|
|
|
MonCompose --- PromConfig
|
|
MonCompose --- GrafanaProv
|
|
MonCompose --- MonData
|
|
end
|
|
Root --> MonDir
|
|
|
|
%% Template Stack
|
|
subgraph TemplateDir["/server/websites/template/"]
|
|
SiteTemplate["docker-compose.site.yml (Standard WP Compose definition)"]
|
|
end
|
|
Root --> TemplateDir
|
|
|
|
%% Tenant Sites
|
|
subgraph SitesDir["/server/websites/sites/"]
|
|
subgraph SiteA["mysite/"]
|
|
SiteAEnv[".env (Scoped DB user, password, Redis DB index)"]
|
|
SiteACompose["docker-compose.yml"]
|
|
SiteAConfig["config/wordpress.ini (OPcache, upload limits)"]
|
|
SiteAData[("data/wp/ (Full WordPress document root)")]
|
|
|
|
SiteAEnv --- SiteACompose
|
|
SiteACompose --- SiteAConfig
|
|
SiteACompose --- SiteAData
|
|
end
|
|
|
|
subgraph SiteB["teetimeprints/"]
|
|
SiteBCompose["... (Identical isolated structure)"]
|
|
end
|
|
end
|
|
Root --> SitesDir
|
|
|
|
%% Host-level configurations
|
|
subgraph HostConfig["Host-Level Configs (/etc/)"]
|
|
F2BJail["/etc/fail2ban/jail.d/ingress-wordpress.local"]
|
|
F2BFilter["/etc/fail2ban/filter.d/ingress-wordpress.conf"]
|
|
UFWChain["/etc/ufw/after.rules (DOCKER-USER isolation chain)"]
|
|
SSHDDropin["/etc/ssh/sshd_config.d/99-hardened.conf"]
|
|
end
|
|
|
|
ScriptExec -.->|Deploys & Controls| HostConfig
|
|
|
|
%% Styling
|
|
classDef dir fill:#eceff1,stroke:#455a64,stroke-width:2px,color:#263238;
|
|
classDef compose fill:#e1f5fe,stroke:#0288d1,stroke-width:1px,color:#01579b;
|
|
classDef data fill:#fff8e1,stroke:#ffa000,stroke-width:1px,color:#ff6f00;
|
|
|
|
class Root,CoreDir,ProxyDir,MonDir,TemplateDir,SitesDir,SiteA,SiteB dir;
|
|
class CoreCompose,ProxyCompose,MonCompose,SiteTemplate,SiteACompose compose;
|
|
class CoreDataMariaDB,CoreDataRedis,SiteAData,MonData data;
|
|
```
|