Consolidate gateway-gamers sites, dedupe shared header/footer/images

Merge the four independent gateway-gamers.net site repos (40k-rankings,
aos-rankings, kingmaker, scouting) into one monorepo under sites/,
preserving each site's full commit history via a manual subtree-style
merge (git-subtree isn't available in this environment).

- shared/: header.template.html (nav swapped in per site), footer.html,
  and images/ — previously byte-identical copies duplicated 4x (~100MB).
- Each site's public/footer.html and public/images are now symlinks into
  shared/; public/header.html is generated at predev/prebuild time from
  shared/header.template.html + the site's own nav.html, so nav bars stay
  individual while everything else about the header is shared.
- Single root .gitlab-ci.yml with path-scoped build/deploy jobs per site
  plus a deploy:shared job, replacing the 4 separate per-repo pipelines.
- nginx confs (kept per-site as reference, same as before) gain
  location /images/ and location = /footer.html alias blocks pointing at
  a shared webserver directory, so the deployed site no longer duplicates
  the images either — see README.md for the full layout and the runbook
  for applying this on the webserver.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SBzcNkW7JcYipnAX6HfgmK
This commit is contained in:
2026-09-04 14:59:06 -05:00
co-authored by Claude Sonnet 5
parent 60076ac885
commit 0ab611b6fc
60 changed files with 350 additions and 323 deletions
+178
View File
@@ -0,0 +1,178 @@
stages:
- build
- deploy
- refresh
.build_script: &build_script
- cd sites/${SITE}
- npm ci
- npm run build
# ---------------------------------------------------------------------------
# shared assets (images + footer.html) — deployed once to a shared dir that
# every site's nginx server block points at via `alias`, so a photo/logo
# update only has to land in one place instead of four.
# ---------------------------------------------------------------------------
deploy:shared:
stage: deploy
script:
- rsync -avz --delete shared/images/ /var/www/domains/gateway-gamers.net/shared/images/
- rsync -avz shared/footer.html /var/www/domains/gateway-gamers.net/shared/footer.html
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
changes:
- shared/**/*
environment:
name: production/shared
# ---------------------------------------------------------------------------
# 40k-rankings
# ---------------------------------------------------------------------------
build:40k-rankings:
stage: build
variables:
SITE: 40k-rankings
script: *build_script
artifacts:
paths:
- sites/40k-rankings/dist/
expire_in: 1 hour
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
changes:
- sites/40k-rankings/**/*
- shared/**/*
deploy:40k-rankings:
stage: deploy
needs: ["build:40k-rankings"]
script:
- rsync -avz --delete --exclude images --exclude footer.html sites/40k-rankings/dist/ /var/www/domains/gateway-gamers.net/40k-rankings/
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
changes:
- sites/40k-rankings/**/*
- shared/**/*
environment:
name: production
url: https://40k-rankings.gateway-gamers.net
refresh-elo:
stage: refresh
image: python:3.12-slim
variables:
GIT_STRATEGY: clone
script:
- cd sites/40k-rankings/statcheck-elo-scraper && python refresh_elo.py && cd ../../..
- git config user.email "gitlab-ci@gateway-gamers.net"
- git config user.name "GitLab CI"
- git remote set-url origin "https://oauth2:${GITLAB_ACCESS_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git"
- git add sites/40k-rankings/public/elo-data.json
- |
if ! git diff --cached --quiet; then
git commit -m "data: refresh stat-check ELO rankings"
git push origin HEAD:main
fi
only:
- schedules
# ---------------------------------------------------------------------------
# aos-rankings
# ---------------------------------------------------------------------------
build:aos-rankings:
stage: build
variables:
SITE: aos-rankings
script: *build_script
artifacts:
paths:
- sites/aos-rankings/dist/
expire_in: 1 hour
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
changes:
- sites/aos-rankings/**/*
- shared/**/*
deploy:aos-rankings:
stage: deploy
needs: ["build:aos-rankings"]
script:
- rsync -avz --delete --exclude images --exclude footer.html sites/aos-rankings/dist/ /var/www/domains/gateway-gamers.net/aos-rankings/
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
changes:
- sites/aos-rankings/**/*
- shared/**/*
environment:
name: production
url: https://aos-rankings.gateway-gamers.net
# ---------------------------------------------------------------------------
# kingmaker
# ---------------------------------------------------------------------------
build:kingmaker:
stage: build
variables:
SITE: kingmaker
script: *build_script
artifacts:
paths:
- sites/kingmaker/dist/
expire_in: 1 hour
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
changes:
- sites/kingmaker/**/*
- shared/**/*
deploy:kingmaker:
stage: deploy
needs: ["build:kingmaker"]
script:
- rsync -avz --delete --exclude images --exclude footer.html sites/kingmaker/dist/ /var/www/domains/gateway-gamers.net/kingmaker/
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
changes:
- sites/kingmaker/**/*
- shared/**/*
environment:
name: production
url: https://kingmaker.gateway-gamers.net
# ---------------------------------------------------------------------------
# scouting
# ---------------------------------------------------------------------------
build:scouting:
stage: build
variables:
SITE: scouting
script: *build_script
artifacts:
paths:
- sites/scouting/dist/
expire_in: 1 hour
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
changes:
- sites/scouting/**/*
- shared/**/*
deploy:scouting:
stage: deploy
needs: ["build:scouting"]
script:
- rsync -avz --delete --exclude images --exclude footer.html sites/scouting/dist/ /var/www/domains/gateway-gamers.net/scouting/
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
changes:
- sites/scouting/**/*
- shared/**/*
environment:
name: production
url: https://scouting.gateway-gamers.net