Project structure
Meta Repo Layout
Section titled “Meta Repo Layout”Four repos + an infrastructure notes folder all live under one workspace root:
- abcnorio-meta
- Project structure, docker bits, installation scripts and glue
- abcnorio-astro
- Astro frontend, https://astro.build/
- abcnorio-func
- Wordpress functionality, post types, taxonomies, overrides for editor experience in a headless site, and other sundry.
- abcnorio-orchestrator
- Node.js deployment worker — HTTP API for queuing Astro builds, managing build archives, and dev/staging data sync ops
Project structure
Section titled “Project structure”abcnorio.org/├── abcnorio-astro/ # Astro frontend (SSR dev + static prod builds)│ ├── site-dev/ # Live dev source (mounted by `astro-dev` container)│ │ ├── .env # Astro dev env vars (gitignored)│ │ ├── astro.config.mjs│ │ ├── src/│ │ │ ├── pages/ # Route files: [slug].astro, about/, events/, …│ │ │ ├── components/ # Reusable UI components│ │ │ ├── layouts/ # Page layout wrappers│ │ │ ├── lib/ # Fetch helpers (events, blocks, navigation)│ │ │ ├── util/ # Path constants, env helpers│ │ │ └── styles/│ │ └── build-archives/ # deployment-status.json + build zips│ └── site-staging/ # Staging snapshot (mounted by `astro-staging`; synced from site-dev branch `staging`)│ └── .env # Astro staging env vars (gitignored)│├── abcnorio-func/ # WordPress plugin│ ├── custom-func.php # Plugin entry point│ ├── src/│ │ ├── Plugin.php # Bootstraps all modules│ │ ├── AdminExperience/ # WP admin UI tweaks, term editors, bits for headless UX│ │ ├── ContentModel/ # CPTs, taxonomies, ACF field groups│ │ ├── Deployment/ # Deployment dashboard + trigger + status│ │ ├── ImageStyles/ # Image style registration and block enrichment│ │ ├── Navigation/ # Menu registration│ │ ├── RestApi/ # Custom REST endpoints (events filter, iCal)│ │ ├── Search/ # WP search endpoint│ │ └── Security/ # User Capability management│ ├── resources/ # JS/CSS source (built via npm)│ └── build/ # Compiled admin JS/CSS assets - built on composer update│├── abcnorio-orchestrator/ # Node.js deployment worker│ ├── .env # Orchestrator env vars (gitignored)│ ├── index.mjs # HTTP server (port 4011), build queue│ ├── status.mjs # Status file read/write helpers│ ├── files.mjs # Archive listing, cleanup, script spawning│ ├── http.mjs # Auth token parsing, JSON body reading│ └── scripts/│ ├── deploy.sh # Builds site, copies dist, writes .deploy-version (triggers astro-prod restart)│ ├── backup-build.sh # Zips current build to build-archives/│ └── warm-cache.sh # Pre-seeds production SSR endpoints after deploy│├── abcnorio-meta/ # Docker Compose infrastructure│ ├── compose.yml # All service definitions│ ├── .env # Compose-level env vars (gitignored)│ ├── .env.sample # Compose-level env template│ ├── justfile # Task runner (just --list for all recipes)│ ├── scripts/ # Admin shell scripts│ │ ├── bedrock-bootstrap.sh # One-time Bedrock scaffolding│ │ ├── wp.sh # WP-CLI passthrough (dev/staging)│ │ ├── wp-admin.sh # Interactive WP admin helpers (usercreate, chpass, …)│ │ ├── trigger-build.sh # POST build trigger to orchestrator│ │ ├── copy-media.sh # Media sync via orchestrator│ │ ├── sync-db.sh # DB+media sync via orchestrator│ │ ├── dump-db.sh # Direct DB dump to backups/mariadb/│ │ └── warm-cache.sh # Warm production SSR endpoints after deploy│ ├── proxy/Caddyfile # Public-facing reverse proxy rules│ ├── web/Caddyfile # Static file server rules (production/preview)│ └── wp/│ ├── Dockerfile # FrankenPHP/Bedrock WP image│ ├── runtime.env # Shared WP env base (gitignored)│ ├── runtime.env.sample # Shared WP env template│ ├── dev.env # Dev-specific WP overrides (gitignored)│ ├── dev.env.sample # Dev env template (committed)│ ├── staging.env # Staging-specific WP overrides (gitignored)│ └── staging.env.sample # Staging env template│└── abcnorio-docs/ # Astro Starlight documentation site (this site!) └── DockerfilePlugin runtime contract summary:
- Dev:
${ABCNORIO_FUNC_HOST_DIR}is bind-mounted toabcwpdev:/app/web/app/plugins/abcnorio-funcfor live source edits. - Staging: plugin path is Composer-managed in Bedrock and must not be bind-mounted.