Architecture¶
Stack¶
| Layer | Technology |
|---|---|
| CMS | WordPress 6.8 (via Bedrock) |
| Language | PHP >= 7.4 |
| E-commerce | WooCommerce |
| Web server | Nginx |
| Application | PHP-FPM |
| Database | MariaDB |
| Cache | Redis (object cache via redis-cache plugin) |
| Package manager | Composer |
| Dependency registry | packagist.subscribed.build (private) + wpackagist.org |
| Error tracking | Sentry |
| Environment vars | Dotenv Vault |
| Headless API | WP-GraphQL + WooCommerce extension |
| Deployment | GitHub Actions |
Folder Structure¶
elome-com-bedrock/
├── .github/
│ └── workflows/ # CI/CD pipelines
├── devops/
│ ├── dev/ # Dev environment Docker configs (php, nginx, mysql)
│ ├── prod/ # Production Docker configs
│ └── local.example/ # Example local overrides
├── docs/ # This documentation
├── site/ # Bedrock WordPress root
│ ├── config/
│ │ ├── application.php # Main WP config (env-loaded)
│ │ └── environments/ # Per-env overrides (development, staging, production)
│ ├── customizations/
│ │ ├── plugin/ # Custom `barberklingen` plugin (path repo)
│ │ ├── headless/ # Headless WooCommerce customization (path repo)
│ │ └── multi-language/ # Multi-language customization (path repo)
│ ├── docker/ # Docker setup for local site dev
│ ├── scripts/ # Composer scripts
│ ├── tests/ # PHPUnit tests
│ ├── vendor/ # Composer dependencies (gitignored)
│ ├── vendor-plugins/ # Vendored plugin sources (path repos)
│ ├── web/
│ │ ├── app/ # WordPress content dir (plugins, themes, uploads)
│ │ ├── wp/ # WordPress core (gitignored, managed by Composer)
│ │ ├── index.php
│ │ └── wp-config.php
│ ├── composer.json
│ └── wp-cli.yml
├── system/
│ ├── cronjobs/ # Server-side cron shell scripts
│ ├── releases/ # Deployment releases (volume-mounted)
│ └── wp-uploads/ # Persistent uploads (volume-mounted)
├── docker-compose.yml # Root compose file for local Docker setup
└── .env.example # Root env template
Bedrock Concepts¶
Bedrock restructures WordPress to follow modern PHP project conventions:
web/wp/— WordPress core, installed and updated via Composer (roots/wordpress)web/app/— Content directory (replaceswp-content/). Plugins and themes are installed here via Composer.config/application.php— Single source of truth forwp-config.phpequivalents; reads from environment variables.config/environments/— Per-environment overrides loaded automatically based onWP_ENV.
Environment Variable Strategy¶
The project uses Dotenv Vault for encrypted, version-controlled environment variables:
.envis loaded first to pick upDOTENV_KEY- Dotenv Vault decrypts
.env.vaultusingDOTENV_KEY .env.override(gitignored) can override any value locally
WP_ENV controls which config/environments/*.php file is loaded (development, staging, or production).
Custom Packages¶
Private packages are hosted on packagist.subscribed.build. Key namespaces:
barberklingen/*— Core custom plugins (base-plugin, audit-log, pixel-tracker, etc.)barberklingen-premium/*— Premium WooCommerce extensions (subscriptions, bundles, etc.)subscribed/*— Shared platform packages (headless WooCommerce, multi-language, OTP, testing kit)
Local path repositories in customizations/ allow in-repo development of: - barberklingen/barberklingen — Main site plugin - subscribed/headless-woocommerce — Headless layer - subscribed/multi-language — Language handling
Cron Jobs¶
Server-side cron jobs live in system/cronjobs/ as shell scripts. They are bootstrapped via _bootstrap.sh and run on the server independently of WordPress's built-in cron (which is disabled via DISABLE_WP_CRON).