Skip to content

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 (replaces wp-content/). Plugins and themes are installed here via Composer.
  • config/application.php — Single source of truth for wp-config.php equivalents; reads from environment variables.
  • config/environments/ — Per-environment overrides loaded automatically based on WP_ENV.

Environment Variable Strategy

The project uses Dotenv Vault for encrypted, version-controlled environment variables:

  1. .env is loaded first to pick up DOTENV_KEY
  2. Dotenv Vault decrypts .env.vault using DOTENV_KEY
  3. .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).