# Swansea Airport Website

Production-ready airfield website stack built with Astro, Directus, PostgreSQL, and Docker Compose.

## Local setup

1. Copy `.env.example` to `.env` and fill in the values.
2. Start the stack with Docker Compose.
3. 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`.
- `PUBLIC_PPR_API_BASE` controls the browser-side PPR API base URL; PPR and drone request endpoints are derived from it at build/dev-server startup.
- `DIRECTUS_HOMEPAGE_BANNER_FOLDER` names the Directus file folder used for rotating homepage banner images. If the folder is missing or empty, the site falls back to `/images/banner.png`.
- The frontend service bind-mounts the project into `/app`, keeps `node_modules` and `.astro` in named volumes, and serves the site with `astro dev` on 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:

```bash
docker compose up --build -d web
```

You can still run the script manually if needed:

```bash
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_EMAIL` and `DIRECTUS_ADMIN_PASSWORD` are only used when Directus initializes a new database.
- For stable bootstrap auth across restarts, set `DIRECTUS_ADMIN_TOKEN` in `.env` and keep it constant.

To start from a clean Directus state (development only):

```bash
docker compose down -v
docker compose up -d
```
