Skip to content

Project structure

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
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!)
└── Dockerfile

Plugin runtime contract summary:

  • Dev: ${ABCNORIO_FUNC_HOST_DIR} is bind-mounted to abcwpdev:/app/web/app/plugins/abcnorio-func for live source edits.
  • Staging: plugin path is Composer-managed in Bedrock and must not be bind-mounted.