From 9c9b69c733e8f810c72b6fc7cf1bedc9a7842ac7 Mon Sep 17 00:00:00 2001 From: Ryan Malloy Date: Fri, 13 Feb 2026 15:12:54 -0700 Subject: [PATCH] Add deployment infrastructure and TUI showcase guide Dockerfile (multi-stage: base/dev/build/prod with caddy:2-alpine), docker-compose.yml with caddy-docker-proxy labels for birdcage.warehack.ing, Caddyfile, Makefile (up/down/dev/prod/clean), and .env. TUI guide page with 4 screenshots (F1 position, F2 signal, F4 system, F5 console), demo mode docs, and project backstory crediting Gabe Emerson (KL1FI) and Chris Davidson. --- .env | 5 + Caddyfile | 11 ++ Dockerfile | 25 ++++ Makefile | 27 +++++ docker-compose.yml | 31 +++++ public/screenshots/tui-console.png | Bin 0 -> 78013 bytes public/screenshots/tui-position.png | Bin 0 -> 78286 bytes public/screenshots/tui-signal.png | Bin 0 -> 82919 bytes public/screenshots/tui-system.png | Bin 0 -> 131605 bytes src/content/docs/guides/tui.mdx | 176 ++++++++++++++++++++++++++++ 10 files changed, 275 insertions(+) create mode 100644 .env create mode 100644 Caddyfile create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 docker-compose.yml create mode 100644 public/screenshots/tui-console.png create mode 100644 public/screenshots/tui-position.png create mode 100644 public/screenshots/tui-signal.png create mode 100644 public/screenshots/tui-system.png create mode 100644 src/content/docs/guides/tui.mdx diff --git a/.env b/.env new file mode 100644 index 0000000..5cee167 --- /dev/null +++ b/.env @@ -0,0 +1,5 @@ +COMPOSE_PROJECT_NAME=birdcage-docs +APP_ENV=prod +APP_PORT=80 +PUBLIC_DOMAIN=birdcage.warehack.ing +VITE_HMR_HOST=birdcage.warehack.ing diff --git a/Caddyfile b/Caddyfile new file mode 100644 index 0000000..49b66df --- /dev/null +++ b/Caddyfile @@ -0,0 +1,11 @@ +:80 { + root * /srv + encode gzip + + handle /health { + respond "ok" 200 + } + + try_files {path} {path}/index.html {path}/ /index.html + file_server +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d899cbd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,25 @@ +# ── base: shared dependency install ────────────────────────────── +FROM node:20-slim AS base +WORKDIR /app +ENV ASTRO_TELEMETRY_DISABLED=1 +COPY package.json package-lock.json ./ +RUN npm ci +COPY . . + +# ── dev: Astro dev server with HMR ───────────────────────────── +FROM base AS dev +ENV HOST=0.0.0.0 +EXPOSE 4321 +CMD ["npx", "astro", "dev", "--host", "0.0.0.0", "--port", "4321"] + +# ── build: static site generation ─────────────────────────────── +FROM base AS build +RUN npx astro build + +# ── prod: Caddy serving static files ─────────────────────────── +FROM caddy:2-alpine AS prod +COPY Caddyfile /etc/caddy/Caddyfile +COPY --from=build /app/dist /srv +EXPOSE 80 +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD wget -qO- http://127.0.0.1:80/health || exit 1 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bb64530 --- /dev/null +++ b/Makefile @@ -0,0 +1,27 @@ +.PHONY: up down logs rebuild dev prod clean + +up: + docker compose up -d --build + +down: + docker compose down + +logs: + docker compose logs -f + +rebuild: + docker compose down + docker compose up -d --build + +dev: + @sed -i 's/^APP_ENV=.*/APP_ENV=dev/' .env + @sed -i 's/^APP_PORT=.*/APP_PORT=4321/' .env + $(MAKE) rebuild + +prod: + @sed -i 's/^APP_ENV=.*/APP_ENV=prod/' .env + @sed -i 's/^APP_PORT=.*/APP_PORT=80/' .env + $(MAKE) rebuild + +clean: + docker compose down --rmi local -v diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..b5f999f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +services: + docs: + build: + context: . + target: ${APP_ENV:-dev} + container_name: birdcage-docs + restart: unless-stopped + environment: + - PUBLIC_DOMAIN=${PUBLIC_DOMAIN} + - VITE_HMR_HOST=${VITE_HMR_HOST} + networks: + - caddy + labels: + caddy: ${PUBLIC_DOMAIN} + caddy.reverse_proxy: "{{upstreams ${APP_PORT:-4321}}}" + caddy.reverse_proxy.flush_interval: "-1" + caddy.reverse_proxy.transport: http + caddy.reverse_proxy.transport.read_timeout: "0" + caddy.reverse_proxy.transport.write_timeout: "0" + caddy.reverse_proxy.transport.keepalive: 5m + caddy.reverse_proxy.transport.keepalive_idle_conns: "10" + caddy.reverse_proxy.stream_timeout: 24h + caddy.reverse_proxy.stream_close_delay: 5s + volumes: + - ./src:/app/src + - ./public:/app/public + - ./astro.config.mjs:/app/astro.config.mjs + +networks: + caddy: + external: true diff --git a/public/screenshots/tui-console.png b/public/screenshots/tui-console.png new file mode 100644 index 0000000000000000000000000000000000000000..37302a1b6e8643a2865368365b6bda0f9e972d06 GIT binary patch literal 78013 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