# Deploying the course site The site (`site/`, Astro Starlight) is built into static files and served by `nginx:alpine`. It is meant to run behind a `jwilder/nginx-proxy` container with `acme-companion` (Let's Encrypt), which routes by the `VIRTUAL_HOST` variable. ## Deploy ```sh git clone https://gitea.lucaswinther.info/lucasw89/systemic-game-design-course.git cd systemic-game-design-course/deploy cp .env.example .env # set COURSE_HOST (and PROXY_NETWORK if yours differs) docker compose up -d --build ``` - `COURSE_HOST` is the public hostname; point its DNS record at the server first. It is used as the site URL at build time, as `VIRTUAL_HOST`, and as `LETSENCRYPT_HOST`. - The build fails if `COURSE_HOST` is unset, so the placeholder URL never ships. - The container joins the external Docker network `${PROXY_NETWORK:-nginx-proxy}`; it must be the network your nginx-proxy container is on. - To update: `git pull && docker compose up -d --build`. Manual build: `docker build -f deploy/Dockerfile --build-arg COURSE_HOST=course.example.com .` (run from the repository root). ## CI `.gitea/workflows/ci.yml` runs on Gitea Actions (needs a runner with the `ubuntu-latest` label): | Job | Runs | | --- | --- | | `tools` | `npm run test:tools`, `npm run check` (sync-check), `npm run test:site` | | `verify-references` | `node tools/verify-references.mjs`: every module's reference, Rust and TS, with cumulative tests (needs network for `npm install`; Rust pinned to 1.85.1) | | `coupling-audit` | `tools/coupling-audit.mjs` on every `course/*/reference/*` | | `site` | `npm --prefix site ci && npm --prefix site run build` with a dummy `COURSE_HOST` | | `naive-engine` | Module 0's engine: `cargo test`, `npm test`, `npm run typecheck`. The whirlwind-order test is expected to fail and is marked `should_panic` / `test.fails`, so the suite passes | There is no clippy step.