- Caddy: custom image with caddy-ratelimit plugin, security headers (X-Frame-Options, HSTS, CSP-adjacent, etc.), per-IP rate limiting on auth/scrape/global zones, static error pages (502/503/504), fix routing to remove /api/scrape/* and /api/chapter-text-preview/* direct-to-backend (were bypassing SvelteKit auth middleware) - docker-compose: Caddy build context + error volume, Watchtower service (label-enable mode, 5 min poll), watchtower labels on backend/runner/ui - Scraper: ScrapeChapterList uses retryGet (9 attempts, Retry-After backoff) to fix 429-induced chapter list failures; upTo param stops pagination early for range scrapes - UI: Browse→Catalogue rename (routes, API, links), admin scrape page Continue/Retry buttons, +error.svelte branded error page, type cleanup (removed dead exports, added BookPreviewMeta/BookPreviewResponse to scraper.ts) - Meilisearch: meta_updated field, sort=update fix, facet distribution - Docs: reorganise into docs/d2/ and docs/mermaid/ subdirectories, update all diagrams to reflect Caddy/Watchtower/routing changes, add api-routing.d2 ownership map with auth-level colour coding, regenerate SVGs
147 lines
4.4 KiB
YAML
147 lines
4.4 KiB
YAML
name: CI / v3
|
|
|
|
on:
|
|
push:
|
|
branches: ["main", "master"]
|
|
paths:
|
|
- "v3/**"
|
|
- ".gitea/workflows/ci-v3.yaml"
|
|
pull_request:
|
|
branches: ["main", "master"]
|
|
paths:
|
|
- "v3/**"
|
|
- ".gitea/workflows/ci-v3.yaml"
|
|
|
|
concurrency:
|
|
group: ${{ gitea.workflow }}-${{ gitea.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
# ── backend: lint & test ─────────────────────────────────────────────────────
|
|
test-backend:
|
|
name: Test backend
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version-file: v3/backend/go.mod
|
|
cache-dependency-path: v3/backend/go.sum
|
|
|
|
- name: go vet
|
|
working-directory: v3/backend
|
|
run: go vet ./...
|
|
|
|
- name: Run tests
|
|
working-directory: v3/backend
|
|
run: go test -short -race -count=1 -timeout=60s ./...
|
|
|
|
# ── ui: type-check ───────────────────────────────────────────────────────────
|
|
check-ui:
|
|
name: Check ui
|
|
runs-on: ubuntu-latest
|
|
defaults:
|
|
run:
|
|
working-directory: v3/ui
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: "22"
|
|
cache: npm
|
|
cache-dependency-path: v3/ui/package-lock.json
|
|
|
|
- name: Install dependencies
|
|
run: npm ci
|
|
|
|
- name: Type check
|
|
run: npm run check
|
|
|
|
- name: Build
|
|
run: npm run build
|
|
|
|
# ── docker: backend (push to Docker Hub on branch push only) ─────────────────
|
|
docker-backend:
|
|
name: Docker / backend
|
|
runs-on: ubuntu-latest
|
|
needs: [test-backend]
|
|
if: gitea.event_name == 'push'
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Log in to Docker Hub
|
|
uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ secrets.DOCKER_USER }}
|
|
password: ${{ secrets.DOCKER_TOKEN }}
|
|
|
|
- name: Build and push
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
context: v3/backend
|
|
target: backend
|
|
push: true
|
|
tags: |
|
|
${{ secrets.DOCKER_USER }}/libnovel-v3-backend:latest
|
|
${{ secrets.DOCKER_USER }}/libnovel-v3-backend:${{ gitea.sha }}
|
|
build-args: |
|
|
VERSION=${{ gitea.sha }}
|
|
COMMIT=${{ gitea.sha }}
|
|
|
|
# ── docker: runner ────────────────────────────────────────────────────────────
|
|
docker-runner:
|
|
name: Docker / runner
|
|
runs-on: ubuntu-latest
|
|
needs: [test-backend]
|
|
if: gitea.event_name == 'push'
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Log in to Docker Hub
|
|
uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ secrets.DOCKER_USER }}
|
|
password: ${{ secrets.DOCKER_TOKEN }}
|
|
|
|
- name: Build and push
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
context: v3/backend
|
|
target: runner
|
|
push: true
|
|
tags: |
|
|
${{ secrets.DOCKER_USER }}/libnovel-v3-runner:latest
|
|
${{ secrets.DOCKER_USER }}/libnovel-v3-runner:${{ gitea.sha }}
|
|
build-args: |
|
|
VERSION=${{ gitea.sha }}
|
|
COMMIT=${{ gitea.sha }}
|
|
|
|
# ── docker: ui ────────────────────────────────────────────────────────────────
|
|
docker-ui:
|
|
name: Docker / ui
|
|
runs-on: ubuntu-latest
|
|
needs: [check-ui]
|
|
if: gitea.event_name == 'push'
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Log in to Docker Hub
|
|
uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ secrets.DOCKER_USER }}
|
|
password: ${{ secrets.DOCKER_TOKEN }}
|
|
|
|
- name: Build and push
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
context: v3/ui
|
|
push: true
|
|
tags: |
|
|
${{ secrets.DOCKER_USER }}/libnovel-v3-ui:latest
|
|
${{ secrets.DOCKER_USER }}/libnovel-v3-ui:${{ gitea.sha }}
|
|
build-args: |
|
|
BUILD_VERSION=${{ gitea.sha }}
|
|
BUILD_COMMIT=${{ gitea.sha }}
|