dd55c1edc65a4e8046984c1fe5fe573091c031cd
Swansea Airport Website
Production-ready airfield website stack built with Astro, Directus, PostgreSQL, and Docker Compose.
Local setup
- Copy
.env.exampleto.envand fill in the values. - Start the stack with Docker Compose.
- Point your external Caddy instance at the frontend and Directus ports defined in
.env.
Services
- Frontend: Astro dev server running in a bind-mounted container for live preview
- CMS: Directus
- Database: PostgreSQL
- CMS bootstrap: one-shot schema initializer (
directus-bootstrap)
Notes
- All deploy-time variables live in
.env. - The frontend service bind-mounts the project into
/app, keepsnode_modulesand.astroin named volumes, and serves the site withastro devon the published frontend port. - Layout and page structure are controlled entirely by Astro.
- Frontend source edits should appear without rebuilding the container image.
Programmatic Directus schema bootstrap
The schema bootstrap is automatic on docker compose up via the directus-bootstrap service.
It creates collections, fields, and core tag relations idempotently.
If the frontend dependency graph changes, restart the frontend container to rerun npm install inside the container volume:
docker compose up --build -d web
You can still run the script manually if needed:
docker compose run --rm directus-bootstrap
The bootstrap script is idempotent, so reruns are safe.
Troubleshooting bootstrap permissions
If you see 403 FORBIDDEN during bootstrap:
- Most commonly, the Directus database volume was initialized earlier with different admin credentials.
DIRECTUS_ADMIN_EMAILandDIRECTUS_ADMIN_PASSWORDare only used when Directus initializes a new database.- For stable bootstrap auth across restarts, set
DIRECTUS_ADMIN_TOKENin.envand keep it constant.
To start from a clean Directus state (development only):
docker compose down -v
docker compose up -d
Description
Languages
Astro
78.3%
TypeScript
10.7%
CSS
9.4%
JavaScript
1.5%